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