annotate src/BayesianArrayStructure.cpp @ 18:c7107e5c8f03

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