annotate bayesianArraySrc/BayesianArrayStructure.cpp @ 0:c4f9e49226eb

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