annotate src/BayesianArrayStructure.cpp @ 2:5581023e0de4

Added separate CannamMidiFileLoader class to handle the loading in.
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Fri, 19 Aug 2011 01:26:40 +0100
parents 1a32ce016bb9
children de86d77f2612
rev   line source
andrew@0 1 /*
andrew@0 2 * BayesianArrayStructure.cpp
andrew@0 3 * midiCannamReader
andrew@0 4 *
andrew@0 5 * Created by Andrew on 17/07/2011.
andrew@0 6 * Copyright 2011 QMUL. All rights reserved.
andrew@0 7 *
andrew@0 8 */
andrew@0 9
andrew@0 10 #include "BayesianArrayStructure.h"
andrew@0 11
andrew@0 12 BayesianArrayStructure::BayesianArrayStructure(){
andrew@0 13 printf("Bayesian structure: DeFault constructor called");
andrew@0 14
andrew@0 15 prior.createVector(1);
andrew@0 16 likelihood.createVector(1);
andrew@0 17 posterior.createVector(1);
andrew@0 18
andrew@2 19
andrew@0 20 lastEventTime = ofGetElapsedTimeMillis();
andrew@0 21
andrew@2 22 /*
andrew@2 23 tmpPrior.createVector(240);
andrew@2 24 tmpPrior.addGaussianShape(100, 40, 1);
andrew@2 25 tmpPrior.addGaussianShape(200, 10, 0.2);
andrew@2 26 tmpPrior.translateDistribution(20);
andrew@2 27 */
andrew@2 28 tmpBestEstimate = 0;
andrew@0 29 }
andrew@0 30
andrew@0 31 BayesianArrayStructure::BayesianArrayStructure(int length){
andrew@0 32 printf("BAYESIAN STURTUCRE CREATED LENGTH: %i\n", length);
andrew@0 33 //this constructor isnt called it seems
andrew@0 34 prior.createVector(length);
andrew@0 35 likelihood.createVector(length);
andrew@0 36 posterior.createVector(length);
andrew@2 37
andrew@2 38 lastEventTime = 0;
andrew@0 39
andrew@0 40 }
andrew@0 41
andrew@0 42
andrew@0 43
andrew@0 44 void BayesianArrayStructure::resetSize(int length){
andrew@0 45 printf("BAYESIAN STRUCTURE size is : %i\n", length);
andrew@0 46
andrew@0 47 prior.createVector(length);
andrew@0 48 likelihood.createVector(length);
andrew@0 49 posterior.createVector(length);
andrew@0 50
andrew@2 51
andrew@0 52 acceleration.createVector(length);
andrew@0 53
andrew@0 54 }
andrew@0 55
andrew@0 56
andrew@0 57
andrew@0 58 void BayesianArrayStructure::resetSpeedToOne(){
andrew@0 59 relativeSpeedPrior.zero();
andrew@0 60 relativeSpeedPosterior.zero();
andrew@0 61 relativeSpeedLikelihood.zero();
andrew@0 62
andrew@2 63 //relativeSpeedPosterior.addGaussianShape(40, 5, 0.6);
andrew@0 64
andrew@2 65 relativeSpeedPosterior.addGaussianShape(100, 20, 0.8);
andrew@2 66 // relativeSpeedPosterior.addGaussianShape(50, 1, 0.8);
andrew@2 67
andrew@2 68 // relativeSpeedPosterior.addToIndex(100, 1);
andrew@2 69 //relativeSpeedPosterior.addToIndex(50, 1);
andrew@0 70 relativeSpeedPosterior.renormalise();
andrew@0 71 relativeSpeedPosterior.getMaximum();
andrew@0 72
andrew@2 73 prior.zero();
andrew@2 74 posterior.zero();
andrew@2 75 // posterior.offset = - 200;
andrew@2 76 // posterior.addGaussianShape(200, 40, 1);
andrew@2 77 posterior.addToIndex(0, 1);
andrew@2 78 posterior.renormalise();
andrew@2 79
andrew@2 80 //acceleration.addGaussianShape(2000, 20, 0.8);
andrew@0 81
andrew@0 82 }
andrew@0 83
andrew@0 84 void BayesianArrayStructure::resetSpeedSize(int length){
andrew@0 85 printf("BAYESIAN SPEED size is : %i\n", length);
andrew@0 86
andrew@0 87 relativeSpeedPrior.createVector(length);
andrew@0 88 relativeSpeedLikelihood.createVector(length);
andrew@0 89 relativeSpeedPosterior.createVector(length);
andrew@2 90 tmpPosteriorForStorage.createVector(length);
andrew@0 91
andrew@0 92
andrew@0 93 }
andrew@2 94
andrew@0 95 void BayesianArrayStructure::setRelativeSpeedScalar(double f){
andrew@0 96 relativeSpeedPrior.scalar = f;
andrew@0 97 relativeSpeedPosterior.scalar = f;
andrew@0 98 relativeSpeedLikelihood.scalar = f;
andrew@0 99 }
andrew@0 100
andrew@2 101
andrew@2 102 void BayesianArrayStructure::setPositionDistributionScalar(double f){
andrew@2 103 if (f > 0){
andrew@2 104 prior.scalar = f;
andrew@2 105 posterior.scalar = f;
andrew@2 106 likelihood.scalar = f;
andrew@2 107 }
andrew@2 108 }
andrew@2 109
andrew@0 110 void BayesianArrayStructure::simpleExample(){
andrew@0 111 //simple example
andrew@0 112
andrew@2 113 // prior.addGaussianShape(50, 10, 1);
andrew@2 114 // prior.addGaussianShape(150, 30, 0.3);
andrew@2 115 // prior.addGaussianShape(250, 30, 0.2);
andrew@2 116
andrew@2 117 // likelihood.addGaussianShape(90, 20, 0.6);
andrew@2 118 // likelihood.addConstant(0.02);
andrew@2 119 // posterior.doProduct(prior, likelihood);
andrew@0 120
andrew@0 121 // relativeSpeedPosterior.addToIndex(100, 1);
andrew@0 122 // relativeSpeedPosterior.addToIndex(40, 0.7);
andrew@2 123
andrew@2 124 // relativeSpeedPosterior.addGaussianShape(100, 2, 1);
andrew@2 125 // relativeSpeedPosterior.addGaussianShape(40, 2, 0.5);
andrew@0 126 relativeSpeedPosterior.getMaximum();
andrew@2 127 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
andrew@0 128 }
andrew@0 129
andrew@0 130 void BayesianArrayStructure::copyPriorToPosterior(){
andrew@0 131
andrew@0 132 for (int i = 0;i < prior.arraySize;i++){
andrew@0 133 posterior.array[i] = prior.array[i];
andrew@0 134 }
andrew@0 135 }
andrew@0 136
andrew@2 137 void BayesianArrayStructure::setStartPlaying(){
andrew@2 138 lastEventTime = 0;//ofGetElapsedTimeMillis();
andrew@2 139 bestEstimate = 0;
andrew@2 140 lastBestEstimateUpdateTime = ofGetElapsedTimeMillis();
andrew@2 141
andrew@2 142 resetArrays();
andrew@2 143 }
andrew@2 144
andrew@0 145 void BayesianArrayStructure::resetArrays(){
andrew@2 146 //called when we start playing
andrew@2 147
andrew@0 148 prior.zero();
andrew@0 149 likelihood.zero();
andrew@2 150 posterior.zero();
andrew@2 151
andrew@2 152 updateCounter = 0;
andrew@2 153
andrew@2 154 posterior.offset = 0;
andrew@2 155 setNewDistributionOffsets(0);
andrew@2 156
andrew@2 157 int zeroIndex = posterior.getRealTermsAsIndex(0);
andrew@2 158
andrew@2 159 posterior.addGaussianShape(zeroIndex, 500, 1);
andrew@2 160 // posterior.addToIndex(0, 1);
andrew@0 161 likelihood.addConstant(1);
andrew@2 162
andrew@2 163 updateCounter = 0;
andrew@2 164
andrew@0 165 bestEstimate = 0;
andrew@0 166 // lastBestEstimateUpdateTime = ofGetElapsedTimeMillis();
andrew@0 167
andrew@0 168 }
andrew@0 169
andrew@2 170 void BayesianArrayStructure::zeroArrays(){
andrew@2 171 prior.zero();
andrew@2 172 likelihood.zero();
andrew@2 173 posterior.zero();
andrew@2 174
andrew@2 175 relativeSpeedPrior.zero();
andrew@2 176 relativeSpeedPosterior.zero();
andrew@2 177 relativeSpeedLikelihood.zero();
andrew@2 178
andrew@2 179 }
andrew@2 180
andrew@2 181
andrew@2 182 void BayesianArrayStructure::updateTmpBestEstimate(const double& timeDifference){
andrew@2 183 //input is the time since the start of playing
andrew@2 184
andrew@2 185 // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//lastBestEstimateUpdateTime;
andrew@2 186
andrew@2 187 tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDifference*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate);
andrew@2 188 //
andrew@2 189 printf("tmp best %f and best %f time diff %f posterior MAP %f\n", tmpBestEstimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate));
andrew@2 190 //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis();
andrew@2 191 }
andrew@2 192
andrew@0 193 void BayesianArrayStructure::updateBestEstimate(){
andrew@2 194 // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//
andrew@2 195 double timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime;
andrew@2 196 bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate);
andrew@0 197
andrew@2 198 // bestEstimate = tmpBestEstimate;
andrew@0 199 }
andrew@0 200
andrew@0 201 void BayesianArrayStructure::calculatePosterior(){
andrew@2 202 //posterior.doProduct(prior, likelihood);
andrew@2 203
andrew@2 204 int i;
andrew@2 205 for (i = 0;i < posterior.length;i++){
andrew@2 206 posterior.array[i] = likelihood.array[i] * prior.array[i];
andrew@2 207 }
andrew@2 208
andrew@2 209
andrew@0 210 posterior.renormalise();
andrew@0 211
andrew@2 212
andrew@0 213
andrew@0 214
andrew@0 215 }
andrew@0 216
andrew@0 217
andrew@0 218
andrew@0 219
andrew@0 220 void BayesianArrayStructure::setNewDistributionOffsets(const double& newOffset){
andrew@0 221 prior.offset = newOffset;
andrew@0 222 likelihood.offset = newOffset;
andrew@2 223 //posterior.offset = newOffset;
andrew@0 224 }
andrew@0 225
andrew@0 226
andrew@0 227 void BayesianArrayStructure::crossUpdateArrays(DynamicVector& position, DynamicVector& speed, double timeDifference){
andrew@0 228 //set the cutoff for offset of position first! XXX
andrew@0 229
andrew@0 230 // printf("time difference %f, ", timeDifference);
andrew@0 231
andrew@0 232 double timeDifferenceInPositionVectorUnits = timeDifference / prior.scalar;
andrew@0 233
andrew@0 234 prior.zero();//kill prior
andrew@0 235 calculateNewPriorOffset(timeDifference);//set new prior offset here
andrew@0 236
andrew@0 237 for (int i = 0;i < speed.arraySize;i++){
andrew@0 238 // printf("[%i] %f\n", i, speed.array[i]);
andrew@0 239 //set speed
andrew@0 240 double speedValue = speed.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5
andrew@0 241
andrew@0 242 //so we have moved
andrew@0 243 int distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value
andrew@0 244
andrew@0 245 if (speed.array[i] != 0){
andrew@0 246
andrew@2 247 // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits);
andrew@0 248
andrew@0 249 for (int postIndex = 0;postIndex < position.arraySize;postIndex++){
andrew@2 250 //old posterior contributing to new prior
andrew@0 251 int newPriorIndex = postIndex + position.offset - prior.offset + distanceMoved;
andrew@0 252 if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){
andrew@0 253 prior.addToIndex(newPriorIndex, position.array[postIndex]*speed.array[i]);
andrew@0 254 // printf("adding [%i] : %f\n", newPriorIndex, posterior.array[postIndex]*speed.array[i]);
andrew@0 255 }
andrew@0 256
andrew@0 257 }
andrew@0 258
andrew@0 259 }//if not zero
andrew@0 260 }//end speed
andrew@2 261 updateCounter++;
andrew@0 262 prior.renormalise();
andrew@0 263
andrew@0 264 }
andrew@0 265
andrew@2 266
andrew@2 267 void BayesianArrayStructure::addGaussianNoiseToSpeedPosterior(const double& std_dev){
andrew@2 268 tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior);
andrew@2 269
andrew@2 270 for (int i = 0;i < relativeSpeedPosterior.length;i++){
andrew@2 271 tmpPosteriorForStorage.addGaussianShape(i, std_dev, relativeSpeedPosterior.array[i]);
andrew@2 272 }
andrew@2 273
andrew@2 274 tmpPosteriorForStorage.renormalise();
andrew@2 275
andrew@2 276 relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage);
andrew@2 277 }
andrew@2 278
andrew@2 279
andrew@2 280 void BayesianArrayStructure::addTriangularNoiseToSpeedPosterior(const double& std_dev){
andrew@2 281 tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior);
andrew@2 282
andrew@2 283 for (int i = 0;i < relativeSpeedPosterior.length;i++){
andrew@2 284 //adding a linear amount depending on distance
andrew@2 285 tmpPosteriorForStorage.addTriangularShape(i, std_dev*2.0, relativeSpeedPosterior.array[i]);
andrew@2 286 }
andrew@2 287
andrew@2 288 tmpPosteriorForStorage.renormalise();
andrew@2 289
andrew@2 290 relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage);
andrew@2 291 }
andrew@2 292
andrew@0 293 void BayesianArrayStructure::calculateNewPriorOffset(const double& timeDifference){
andrew@0 294
andrew@0 295 double maxSpeed = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate);
andrew@0 296 // printf("Maxspeed is %f\n", maxSpeed);
andrew@0 297
andrew@0 298 double priorMax = posterior.getMaximum();
andrew@0 299 double distanceTravelled = maxSpeed * (timeDifference / prior.scalar);
andrew@0 300 double newMaxLocation = posterior.MAPestimate + distanceTravelled;
andrew@0 301 // printf("MAP: %i, tim df %f, distance %f, new location %f\n", posterior.MAPestimate, timeDifference, distanceTravelled, newMaxLocation);
andrew@0 302
andrew@0 303 }
andrew@0 304
andrew@0 305
andrew@0 306 void BayesianArrayStructure::decaySpeedDistribution(double timeDifference){
andrew@0 307
andrew@0 308 // commented for the moment
andrew@0 309 double relativeAmount = max(1.0, timeDifference/1000.);
andrew@0 310 // printf("decay %f around %i \n", timeDifference, relativeSpeedPosterior.MAPestimate);
andrew@0 311 relativeAmount *= speedDecayAmount;
andrew@0 312 relativeSpeedPosterior.renormalise();
andrew@0 313 relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, relativeAmount);
andrew@0 314
andrew@0 315 relativeSpeedPosterior.renormalise();
andrew@0 316 double newMax = relativeSpeedPosterior.getMaximum();
andrew@0 317
andrew@0 318 //old code
andrew@0 319 // relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, 10);
andrew@0 320 //relativeSpeedPosterior.addConstant(1);
andrew@0 321
andrew@0 322 /*
andrew@0 323 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
andrew@0 324 relativeSpeedLikelihood.zero();
andrew@0 325 relativeSpeedLikelihood.addConstant(0.2);
andrew@0 326 relativeSpeedLikelihood.addGaussianShape(relativeSpeedPosterior.maximumValue, speedDecayWidth, relativeAmount);
andrew@0 327 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
andrew@0 328 relativeSpeedPosterior.renormalise();
andrew@0 329 */
andrew@0 330
andrew@0 331
andrew@0 332
andrew@0 333 }
andrew@0 334
andrew@0 335 void BayesianArrayStructure::updateTempoDistribution(const double& speedRatio, const double& matchFactor){
andrew@0 336 //speedratio is speed of played relative to the recording
andrew@0 337
andrew@0 338 double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio);
andrew@0 339 // printf("\nindex of likelihood would be %f\n", index);
andrew@0 340 if (index >= 0 && index < relativeSpeedPrior.length){
andrew@0 341 //then we can do update
andrew@0 342
andrew@0 343 //set new likelihood
andrew@0 344 relativeSpeedLikelihood.zero();
andrew@2 345 relativeSpeedLikelihood.addConstant(speedLikelihoodNoise);
andrew@0 346
andrew@0 347 relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5*matchFactor);
andrew@0 348
andrew@0 349
andrew@0 350 //copy posterior to prior
andrew@0 351 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
andrew@0 352
andrew@0 353 //update
andrew@0 354 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
andrew@0 355
andrew@0 356 //normalise
andrew@0 357 relativeSpeedPosterior.renormalise();
andrew@0 358
andrew@0 359 relativeSpeedPosterior.getMaximum();
andrew@0 360 }//end if within range
andrew@0 361
andrew@0 362
andrew@0 363 }
andrew@0 364
andrew@0 365
andrew@0 366 void BayesianArrayStructure::setFlatTempoLikelihood(){ //set new likelihood
andrew@0 367 relativeSpeedLikelihood.zero();
andrew@0 368 relativeSpeedLikelihood.addConstant(0.3);
andrew@0 369 }
andrew@0 370
andrew@0 371 void BayesianArrayStructure::updateTempoLikelihood(const double& speedRatio, const double& matchFactor){
andrew@0 372
andrew@0 373 double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio);
andrew@0 374
andrew@0 375 if (index >= 0 && index < relativeSpeedPrior.length){
andrew@0 376 relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5);//*matchFactor);
andrew@0 377 }
andrew@0 378 }
andrew@0 379
andrew@0 380
andrew@0 381 void BayesianArrayStructure::calculateTempoUpdate(){
andrew@0 382 //copy posterior to prior
andrew@0 383 relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior);
andrew@0 384
andrew@0 385 //update
andrew@0 386 relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood);
andrew@0 387
andrew@0 388 //normalise
andrew@0 389 relativeSpeedPosterior.renormalise();
andrew@0 390
andrew@0 391 relativeSpeedPosterior.getMaximum();
andrew@0 392
andrew@0 393 }
andrew@0 394
andrew@0 395
andrew@0 396 void BayesianArrayStructure::drawArrays(){
andrew@0 397
andrew@0 398 //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200);
andrew@0 399 //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200);
andrew@0 400
andrew@0 401 int displaySize = prior.arraySize;
andrew@2 402 ofSetColor(0,0,255);
andrew@0 403 prior.drawVector(0, displaySize);
andrew@0 404 ofSetColor(0,255,0);
andrew@0 405 likelihood.drawVector(0, displaySize);
andrew@2 406 ofSetColor(255,0,255);
andrew@0 407 posterior.drawVector(0, displaySize);
andrew@2 408
andrew@0 409
andrew@0 410 // ofSetColor(255,255,255);
andrew@0 411 // tmpPrior.drawVector(0,300);
andrew@0 412
andrew@0 413 }
andrew@0 414
andrew@0 415
andrew@0 416 void BayesianArrayStructure::drawTempoArrays(){
andrew@0 417 ofSetColor(0,255,255);
andrew@0 418 relativeSpeedPrior.drawVector(0, relativeSpeedPrior.arraySize);
andrew@0 419
andrew@0 420 ofSetColor(255,0,255);
andrew@0 421 relativeSpeedLikelihood.drawVector(0, relativeSpeedLikelihood.arraySize);
andrew@0 422
andrew@0 423 ofSetColor(255,255,0);
andrew@0 424 relativeSpeedPosterior.drawVector(0, relativeSpeedPosterior.arraySize);
andrew@0 425
andrew@2 426 ofSetColor(0,0,255);
andrew@2 427 tmpPosteriorForStorage.drawVector(0, tmpPosteriorForStorage.arraySize);
andrew@2 428
andrew@0 429 ofSetColor(255,255, 255);
andrew@0 430 ofLine(screenWidth/2, 0, screenWidth/2, ofGetHeight());//middle of screen
andrew@0 431
andrew@0 432 ofSetColor(0, 255, 0);
andrew@0 433 double fractionOfScreen = ((double)relativeSpeedPosterior.MAPestimate / relativeSpeedPosterior.length);
andrew@0 434 ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight());
andrew@0 435 }
andrew@0 436
andrew@0 437
andrew@0 438 void BayesianArrayStructure::drawArraysRelativeToTimeframe(const double& startTimeMillis, const double& endTimeMillis){
andrew@0 439
andrew@0 440 screenWidth = ofGetWidth();
andrew@0 441
andrew@0 442 int startArrayIndex = 0;
andrew@0 443
andrew@0 444 if (prior.getIndexInRealTerms(prior.arraySize-1) > startTimeMillis){
andrew@0 445 //i.e. the array is on the page
andrew@0 446
andrew@0 447 while (prior.getIndexInRealTerms(startArrayIndex) < startTimeMillis){
andrew@0 448 startArrayIndex++;
andrew@0 449 }
andrew@0 450 int endArrayIndex = prior.arraySize-1;
andrew@0 451 //could find constraints here
andrew@0 452 if (prior.getIndexInRealTerms(prior.arraySize-1) > endTimeMillis)
andrew@0 453 endArrayIndex = (floor)((endTimeMillis - prior.offset)/prior.scalar);
andrew@0 454
andrew@0 455 //so we need to figure where start and end array are on screen
andrew@0 456 int startScreenPosition, endScreenPosition;
andrew@0 457 double screenWidthMillis = endTimeMillis - startTimeMillis;
andrew@0 458
andrew@0 459 startScreenPosition = (prior.getIndexInRealTerms(startArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis;
andrew@0 460 endScreenPosition = (double)(prior.getIndexInRealTerms(endArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis;
andrew@0 461
andrew@0 462 ofSetColor(0,0,100);
andrew@0 463 string relativeString = " offset "+ofToString(prior.offset, 1);//starttimes("+ofToString(startTimeMillis)+", "+ofToString(endTimeMillis);
andrew@0 464 relativeString += ": index "+ofToString(startArrayIndex)+" , "+ofToString(endArrayIndex)+" [";
andrew@0 465 // relativeString += ofToString(prior.getIndexInRealTerms(endArrayIndex), 3)+"] (sc-width:"+ofToString(screenWidthMillis, 1)+") ";
andrew@0 466 relativeString += " mapped to screen "+ofToString(startScreenPosition)+" , "+ofToString(endScreenPosition);
andrew@0 467 ofDrawBitmapString(relativeString, 100, 180);
andrew@0 468
andrew@1 469 ofSetColor(255, 255, 0);
andrew@0 470 likelihood.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
andrew@0 471
andrew@0 472 ofSetColor(0,0,200);
andrew@0 473 prior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
andrew@0 474
andrew@0 475 ofSetColor(200, 0, 0);
andrew@0 476 posterior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
andrew@0 477
andrew@1 478
andrew@0 479 // ofSetColor(0, 200, 255);
andrew@0 480 // acceleration.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition);
andrew@0 481
andrew@0 482
andrew@0 483 }
andrew@0 484
andrew@0 485 }