annotate src/BayesianArrayStructure.cpp @ 4:4a8e6a6cd224

optimised draw function in dynamic vector class. Added Gaussian lookup but not yet used.
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Fri, 19 Aug 2011 15:53:04 +0100
parents de86d77f2612
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 }