diff 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
line wrap: on
line diff
--- a/query.cpp	Fri Jan 30 19:44:51 2009 +0000
+++ b/query.cpp	Sat Jan 31 16:25:30 2009 +0000
@@ -288,28 +288,20 @@
   std::priority_queue<PointPair, std::vector<PointPair>, greater<PointPair> > ppairs(*qstate->exact_evaluation_queue);
   
   size_t vector_size = nvectors * sizeof(double) * d->dim;
-  *vector_data = new double[vector_size];
-  qpointers->l2norm_data = new double[vector_size / d->dim];
+
   if(d->power)
     qpointers->power_data = new double[vector_size / d->dim];
 
-  uint32_t seq_len_dim_dbl = sequence_length*d->dim*sizeof(double);
   uint32_t seq_len_dbl = sequence_length*sizeof(double);
   PointPair pp = ppairs.top();
   uint32_t tid = pp.trackID;
 
   while( !ppairs.empty() && pp.trackID==tid){
     uint32_t spos = pp.spos;
-    uint32_t spos_dim = spos*d->dim;
 #ifdef _LSH_DEBUG_
     cout << "tid=" << pp.trackID << " qpos=" << pp.qpos << " spos=" << pp.spos << endl;
     cout.flush();
 #endif
-    memcpy((void*)(*vector_data+spos_dim), (void*)(d->data+spos_dim), seq_len_dim_dbl); 
-
-    audiodb_l2norm_buffer(*vector_data+spos_dim, d->dim, sequence_length, qpointers->l2norm_data+spos);
-    audiodb_sequence_sum(qpointers->l2norm_data+spos, sequence_length, sequence_length);
-    audiodb_sequence_sqrt(qpointers->l2norm_data+spos, sequence_length, sequence_length);
 
     if(d->power) {
       memcpy(qpointers->power_data+spos, d->power+spos, seq_len_dbl);
@@ -330,8 +322,9 @@
     *qpointers->mean_duration /= nvectors;
   }  
 
-  *vector = *vector_data;
-  qpointers->l2norm = qpointers->l2norm_data;
+  *vector = d->data;
+  *vector_data = d->data;
+  qpointers->l2norm = 0 ;
   qpointers->power = qpointers->power_data;
   return 0;
 }
@@ -509,38 +502,38 @@
   cout << "Num vector pairs to evaluate: " << npairs << "..." << endl;
   cout.flush();
 #endif  
+  adb_datum_t d = {0};
   while(npairs--) {
     PointPair pp = qstate->exact_evaluation_queue->top();
     if(currentTrack != pp.trackID) {
-      maybe_delete_array(dbdata);
-      maybe_delete_array(dbpointers.l2norm_data);
       maybe_delete_array(dbpointers.power_data);
       maybe_delete_array(dbpointers.mean_duration);
       currentTrack = pp.trackID;
-      adb_datum_t d = {0};
+      audiodb_free_datum(&d);
       if(audiodb_track_id_datum(adb, pp.trackID, &d)) {
         delete qstate->exact_evaluation_queue;
         delete qstate->set;
         return 1;
       }
+      
       if(audiodb_datum_qpointers_partial(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers, qstate)) {
-	//if(audiodb_datum_qpointers(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers)) {
         delete qstate->exact_evaluation_queue;
         delete qstate->set;
         audiodb_free_datum(&d);
         return 1;
-      }
-      audiodb_free_datum(&d);
+      }      
     }
     Uns32T qPos = (spec->qid.flags & ADB_QID_FLAG_EXHAUSTIVE) ? pp.qpos : 0;
     Uns32T sPos = pp.spos; // index into l2norm table
     // Test power thresholds before computing distance
     if( ( (!power_refine) || audiodb_powers_acceptable(&spec->refine, qpointers->power[qPos], dbpointers.power[sPos])) &&
 	( qPos<qpointers->nvectors-sequence_length+1 && sPos<(*adb->track_lengths)[pp.trackID]-sequence_length+1 ) ){
-      // Compute distance
+      // Compute distance    
       dist = audiodb_dot_product(query + qPos*adb->header->dim, dbdata + sPos*adb->header->dim, adb->header->dim*sequence_length);
-      double qn = qpointers->l2norm[qPos];
-      double sn = dbpointers.l2norm[sPos];
+      double qn = audiodb_dot_product(query + qPos*adb->header->dim, query + qPos*adb->header->dim, adb->header->dim*sequence_length);
+      double sn = audiodb_dot_product(dbdata + sPos*adb->header->dim, dbdata + sPos*adb->header->dim, adb->header->dim*sequence_length);
+      qn = sqrt(qn);
+      sn = sqrt(sn);
       switch(spec->params.distance) {
       case ADB_DISTANCE_EUCLIDEAN_NORMED:
 	dist = 2 - (2/(qn*sn))*dist;
@@ -563,8 +556,9 @@
   }
 
   // Cleanup
-  maybe_delete_array(dbdata);
-  maybe_delete_array(dbpointers.l2norm_data);
+  audiodb_free_datum(&d);
+  //  maybe_delete_array(dbdata);
+  //maybe_delete_array(dbpointers.l2norm_data);
   maybe_delete_array(dbpointers.power_data);
   maybe_delete_array(dbpointers.mean_duration);
   delete qstate->exact_evaluation_queue;