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);