annotate src/BayesianArrayStructure.cpp @ 52:13194a9dca77 tip

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