annotate src/BayesianArrayStructure.cpp @ 22:9860abc92a30

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