Mercurial > hg > audiodb
comparison query.cpp @ 531:ddf763553175 multiprobeLSH
Removed redundant memcpy calls from query_loop_queue(). This changed the order of some memory allocation and de-allocation calls for loaded database data.
author | mas01mc |
---|---|
date | Sat, 31 Jan 2009 16:25:30 +0000 |
parents | aa715b3e18db |
children | 06ed85832c3b |
comparison
equal
deleted
inserted
replaced
530:aa715b3e18db | 531:ddf763553175 |
---|---|
286 uint32_t nvectors = d->nvectors; | 286 uint32_t nvectors = d->nvectors; |
287 qpointers->nvectors = nvectors; | 287 qpointers->nvectors = nvectors; |
288 std::priority_queue<PointPair, std::vector<PointPair>, greater<PointPair> > ppairs(*qstate->exact_evaluation_queue); | 288 std::priority_queue<PointPair, std::vector<PointPair>, greater<PointPair> > ppairs(*qstate->exact_evaluation_queue); |
289 | 289 |
290 size_t vector_size = nvectors * sizeof(double) * d->dim; | 290 size_t vector_size = nvectors * sizeof(double) * d->dim; |
291 *vector_data = new double[vector_size]; | 291 |
292 qpointers->l2norm_data = new double[vector_size / d->dim]; | |
293 if(d->power) | 292 if(d->power) |
294 qpointers->power_data = new double[vector_size / d->dim]; | 293 qpointers->power_data = new double[vector_size / d->dim]; |
295 | 294 |
296 uint32_t seq_len_dim_dbl = sequence_length*d->dim*sizeof(double); | |
297 uint32_t seq_len_dbl = sequence_length*sizeof(double); | 295 uint32_t seq_len_dbl = sequence_length*sizeof(double); |
298 PointPair pp = ppairs.top(); | 296 PointPair pp = ppairs.top(); |
299 uint32_t tid = pp.trackID; | 297 uint32_t tid = pp.trackID; |
300 | 298 |
301 while( !ppairs.empty() && pp.trackID==tid){ | 299 while( !ppairs.empty() && pp.trackID==tid){ |
302 uint32_t spos = pp.spos; | 300 uint32_t spos = pp.spos; |
303 uint32_t spos_dim = spos*d->dim; | |
304 #ifdef _LSH_DEBUG_ | 301 #ifdef _LSH_DEBUG_ |
305 cout << "tid=" << pp.trackID << " qpos=" << pp.qpos << " spos=" << pp.spos << endl; | 302 cout << "tid=" << pp.trackID << " qpos=" << pp.qpos << " spos=" << pp.spos << endl; |
306 cout.flush(); | 303 cout.flush(); |
307 #endif | 304 #endif |
308 memcpy((void*)(*vector_data+spos_dim), (void*)(d->data+spos_dim), seq_len_dim_dbl); | |
309 | |
310 audiodb_l2norm_buffer(*vector_data+spos_dim, d->dim, sequence_length, qpointers->l2norm_data+spos); | |
311 audiodb_sequence_sum(qpointers->l2norm_data+spos, sequence_length, sequence_length); | |
312 audiodb_sequence_sqrt(qpointers->l2norm_data+spos, sequence_length, sequence_length); | |
313 | 305 |
314 if(d->power) { | 306 if(d->power) { |
315 memcpy(qpointers->power_data+spos, d->power+spos, seq_len_dbl); | 307 memcpy(qpointers->power_data+spos, d->power+spos, seq_len_dbl); |
316 audiodb_sequence_sum(qpointers->power_data+spos, sequence_length, sequence_length); | 308 audiodb_sequence_sum(qpointers->power_data+spos, sequence_length, sequence_length); |
317 audiodb_sequence_average(qpointers->power_data+spos, sequence_length, sequence_length); | 309 audiodb_sequence_average(qpointers->power_data+spos, sequence_length, sequence_length); |
328 *qpointers->mean_duration += d->times[2*k+1] - d->times[2*k]; | 320 *qpointers->mean_duration += d->times[2*k+1] - d->times[2*k]; |
329 } | 321 } |
330 *qpointers->mean_duration /= nvectors; | 322 *qpointers->mean_duration /= nvectors; |
331 } | 323 } |
332 | 324 |
333 *vector = *vector_data; | 325 *vector = d->data; |
334 qpointers->l2norm = qpointers->l2norm_data; | 326 *vector_data = d->data; |
327 qpointers->l2norm = 0 ; | |
335 qpointers->power = qpointers->power_data; | 328 qpointers->power = qpointers->power_data; |
336 return 0; | 329 return 0; |
337 } | 330 } |
338 | 331 |
339 int audiodb_query_spec_qpointers(adb_t *adb, const adb_query_spec_t *spec, double **vector_data, double **vector, adb_qpointers_internal_t *qpointers) { | 332 int audiodb_query_spec_qpointers(adb_t *adb, const adb_query_spec_t *spec, double **vector_data, double **vector, adb_qpointers_internal_t *qpointers) { |
507 Uns32T npairs = qstate->exact_evaluation_queue->size(); | 500 Uns32T npairs = qstate->exact_evaluation_queue->size(); |
508 #ifdef _LSH_DEBUG_ | 501 #ifdef _LSH_DEBUG_ |
509 cout << "Num vector pairs to evaluate: " << npairs << "..." << endl; | 502 cout << "Num vector pairs to evaluate: " << npairs << "..." << endl; |
510 cout.flush(); | 503 cout.flush(); |
511 #endif | 504 #endif |
505 adb_datum_t d = {0}; | |
512 while(npairs--) { | 506 while(npairs--) { |
513 PointPair pp = qstate->exact_evaluation_queue->top(); | 507 PointPair pp = qstate->exact_evaluation_queue->top(); |
514 if(currentTrack != pp.trackID) { | 508 if(currentTrack != pp.trackID) { |
515 maybe_delete_array(dbdata); | |
516 maybe_delete_array(dbpointers.l2norm_data); | |
517 maybe_delete_array(dbpointers.power_data); | 509 maybe_delete_array(dbpointers.power_data); |
518 maybe_delete_array(dbpointers.mean_duration); | 510 maybe_delete_array(dbpointers.mean_duration); |
519 currentTrack = pp.trackID; | 511 currentTrack = pp.trackID; |
520 adb_datum_t d = {0}; | 512 audiodb_free_datum(&d); |
521 if(audiodb_track_id_datum(adb, pp.trackID, &d)) { | 513 if(audiodb_track_id_datum(adb, pp.trackID, &d)) { |
522 delete qstate->exact_evaluation_queue; | 514 delete qstate->exact_evaluation_queue; |
523 delete qstate->set; | 515 delete qstate->set; |
524 return 1; | 516 return 1; |
525 } | 517 } |
518 | |
526 if(audiodb_datum_qpointers_partial(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers, qstate)) { | 519 if(audiodb_datum_qpointers_partial(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers, qstate)) { |
527 //if(audiodb_datum_qpointers(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers)) { | |
528 delete qstate->exact_evaluation_queue; | 520 delete qstate->exact_evaluation_queue; |
529 delete qstate->set; | 521 delete qstate->set; |
530 audiodb_free_datum(&d); | 522 audiodb_free_datum(&d); |
531 return 1; | 523 return 1; |
532 } | 524 } |
533 audiodb_free_datum(&d); | |
534 } | 525 } |
535 Uns32T qPos = (spec->qid.flags & ADB_QID_FLAG_EXHAUSTIVE) ? pp.qpos : 0; | 526 Uns32T qPos = (spec->qid.flags & ADB_QID_FLAG_EXHAUSTIVE) ? pp.qpos : 0; |
536 Uns32T sPos = pp.spos; // index into l2norm table | 527 Uns32T sPos = pp.spos; // index into l2norm table |
537 // Test power thresholds before computing distance | 528 // Test power thresholds before computing distance |
538 if( ( (!power_refine) || audiodb_powers_acceptable(&spec->refine, qpointers->power[qPos], dbpointers.power[sPos])) && | 529 if( ( (!power_refine) || audiodb_powers_acceptable(&spec->refine, qpointers->power[qPos], dbpointers.power[sPos])) && |
539 ( qPos<qpointers->nvectors-sequence_length+1 && sPos<(*adb->track_lengths)[pp.trackID]-sequence_length+1 ) ){ | 530 ( qPos<qpointers->nvectors-sequence_length+1 && sPos<(*adb->track_lengths)[pp.trackID]-sequence_length+1 ) ){ |
540 // Compute distance | 531 // Compute distance |
541 dist = audiodb_dot_product(query + qPos*adb->header->dim, dbdata + sPos*adb->header->dim, adb->header->dim*sequence_length); | 532 dist = audiodb_dot_product(query + qPos*adb->header->dim, dbdata + sPos*adb->header->dim, adb->header->dim*sequence_length); |
542 double qn = qpointers->l2norm[qPos]; | 533 double qn = audiodb_dot_product(query + qPos*adb->header->dim, query + qPos*adb->header->dim, adb->header->dim*sequence_length); |
543 double sn = dbpointers.l2norm[sPos]; | 534 double sn = audiodb_dot_product(dbdata + sPos*adb->header->dim, dbdata + sPos*adb->header->dim, adb->header->dim*sequence_length); |
535 qn = sqrt(qn); | |
536 sn = sqrt(sn); | |
544 switch(spec->params.distance) { | 537 switch(spec->params.distance) { |
545 case ADB_DISTANCE_EUCLIDEAN_NORMED: | 538 case ADB_DISTANCE_EUCLIDEAN_NORMED: |
546 dist = 2 - (2/(qn*sn))*dist; | 539 dist = 2 - (2/(qn*sn))*dist; |
547 break; | 540 break; |
548 case ADB_DISTANCE_EUCLIDEAN: | 541 case ADB_DISTANCE_EUCLIDEAN: |
561 } | 554 } |
562 qstate->exact_evaluation_queue->pop(); | 555 qstate->exact_evaluation_queue->pop(); |
563 } | 556 } |
564 | 557 |
565 // Cleanup | 558 // Cleanup |
566 maybe_delete_array(dbdata); | 559 audiodb_free_datum(&d); |
567 maybe_delete_array(dbpointers.l2norm_data); | 560 // maybe_delete_array(dbdata); |
561 //maybe_delete_array(dbpointers.l2norm_data); | |
568 maybe_delete_array(dbpointers.power_data); | 562 maybe_delete_array(dbpointers.power_data); |
569 maybe_delete_array(dbpointers.mean_duration); | 563 maybe_delete_array(dbpointers.mean_duration); |
570 delete qstate->exact_evaluation_queue; | 564 delete qstate->exact_evaluation_queue; |
571 delete qstate->set; | 565 delete qstate->set; |
572 return 0; | 566 return 0; |