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;