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 */ |