Mercurial > hg > audiodb
comparison query.cpp @ 528:561339c7fd26 multiprobeLSH
Added audiodb_datum_qpointers_partial() to make exact evaluation of LSH results more efficient. This routine calculates partial sums only for those vectors needed.
author | mas01mc |
---|---|
date | Thu, 29 Jan 2009 13:44:47 +0000 |
parents | 7ee6a2701d90 |
children | e532666226bc |
comparison
equal
deleted
inserted
replaced
527:7ee6a2701d90 | 528:561339c7fd26 |
---|---|
271 for(unsigned int k = 0; k < nvectors; k++) { | 271 for(unsigned int k = 0; k < nvectors; k++) { |
272 *qpointers->mean_duration += d->times[2*k+1] - d->times[2*k]; | 272 *qpointers->mean_duration += d->times[2*k+1] - d->times[2*k]; |
273 } | 273 } |
274 *qpointers->mean_duration /= nvectors; | 274 *qpointers->mean_duration /= nvectors; |
275 } | 275 } |
276 | |
277 *vector = *vector_data; | |
278 qpointers->l2norm = qpointers->l2norm_data; | |
279 qpointers->power = qpointers->power_data; | |
280 return 0; | |
281 } | |
282 | |
283 int audiodb_datum_qpointers_partial(adb_datum_t *d, uint32_t sequence_length, double **vector_data, | |
284 double **vector, adb_qpointers_internal_t *qpointers, | |
285 adb_qstate_internal_t *qstate){ | |
286 uint32_t nvectors = d->nvectors; | |
287 qpointers->nvectors = nvectors; | |
288 std::priority_queue<PointPair> ppairs(*qstate->exact_evaluation_queue); | |
289 | |
290 size_t vector_size = nvectors * sizeof(double) * d->dim; | |
291 *vector_data = new double[vector_size]; | |
292 qpointers->l2norm_data = new double[vector_size / d->dim]; | |
293 if(d->power) | |
294 qpointers->power_data = new double[vector_size / d->dim]; | |
295 | |
296 uint32_t seq_len_dbl = sequence_length*d->dim*sizeof(double); | |
297 PointPair pp = ppairs.top(); | |
298 uint32_t tid = pp.trackID; | |
299 | |
300 while( !ppairs.empty() && pp.trackID==tid){ | |
301 uint32_t spos = pp.spos; | |
302 uint32_t spos_dim = spos*d->dim; | |
303 | |
304 memcpy(*vector_data+spos_dim, d->data+spos_dim, seq_len_dbl); | |
305 | |
306 audiodb_l2norm_buffer(*vector_data+spos_dim, d->dim, 1, qpointers->l2norm_data+spos); | |
307 audiodb_sequence_sum(qpointers->l2norm_data+spos, sequence_length, sequence_length); | |
308 audiodb_sequence_sqrt(qpointers->l2norm_data+spos, sequence_length, sequence_length); | |
309 | |
310 if(d->power) { | |
311 memcpy(qpointers->power_data+spos, d->power+spos, seq_len_dbl); | |
312 audiodb_sequence_sum(qpointers->power_data+spos, sequence_length, sequence_length); | |
313 audiodb_sequence_average(qpointers->power_data+spos, sequence_length, sequence_length); | |
314 } | |
315 ppairs.pop(); | |
316 if(!ppairs.empty()) | |
317 pp = ppairs.top(); | |
318 } | |
319 | |
320 if(d->times) { | |
321 qpointers->mean_duration = new double[1]; | |
322 *qpointers->mean_duration = 0; | |
323 for(unsigned int k = 0; k < nvectors; k++) { | |
324 *qpointers->mean_duration += d->times[2*k+1] - d->times[2*k]; | |
325 } | |
326 *qpointers->mean_duration /= nvectors; | |
327 } | |
276 | 328 |
277 *vector = *vector_data; | 329 *vector = *vector_data; |
278 qpointers->l2norm = qpointers->l2norm_data; | 330 qpointers->l2norm = qpointers->l2norm_data; |
279 qpointers->power = qpointers->power_data; | 331 qpointers->power = qpointers->power_data; |
280 return 0; | 332 return 0; |
464 adb_datum_t d = {0}; | 516 adb_datum_t d = {0}; |
465 if(audiodb_track_id_datum(adb, pp.trackID, &d)) { | 517 if(audiodb_track_id_datum(adb, pp.trackID, &d)) { |
466 delete qstate->exact_evaluation_queue; | 518 delete qstate->exact_evaluation_queue; |
467 return 1; | 519 return 1; |
468 } | 520 } |
469 if(audiodb_datum_qpointers(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers)) { | 521 if(audiodb_datum_qpointers_partial(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers, qstate)) { |
470 delete qstate->exact_evaluation_queue; | 522 delete qstate->exact_evaluation_queue; |
471 audiodb_free_datum(&d); | 523 audiodb_free_datum(&d); |
472 return 1; | 524 return 1; |
473 } | 525 } |
474 audiodb_free_datum(&d); | 526 audiodb_free_datum(&d); |