annotate src/BayesianArrayStructure.cpp @ 5:195907bb8bb7

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