annotate src/BayesianArrayStructure.cpp @ 14:3f103cf78148

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