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