changeset 462:f689510baaf4 api-inversion

Simplify audioDB::query_loop_points. Using the new functions audiodb_track_id_datum() and audiodb_datum_qpointers(), much of the body of the method disappears. Of course, we've probably introduced some inefficiencies and extra memory copies, but I'm fairly sure that this method is going to be dominated by disk i/o time anyway, so it doesn't matter.
author mas01cr
date Tue, 30 Dec 2008 15:38:55 +0000
parents 2b8cfec91ed7
children 35bb388d0eac
files query.cpp
diffstat 1 files changed, 30 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/query.cpp	Tue Dec 30 15:38:50 2008 +0000
+++ b/query.cpp	Tue Dec 30 15:38:55 2008 +0000
@@ -652,77 +652,40 @@
     return;
   }
 
-  // Compute database info.  FIXME: we more than likely don't need
-  // very much of the database so write a new function to build these
-  // values per-track or, even better, per-point
-  if(!(adb->header->flags & O2_FLAG_LARGE_ADB)) {
-    if(audiodb_set_up_dbpointers(adb, spec, &dbpointers)) {
-      error("failed to set up dbpointers");
+  /* We are guaranteed that the order of points is sorted by:
+   * {trackID, spos, qpos} so we can be relatively efficient in
+   * initialization of track data.  We assume that points usually
+   * don't overlap, so we will use exhaustive dot product evaluation
+   * (instead of memoization of partial sums, as in query_loop()). */
+  double dist;
+  double *dbdata = 0, *dbdata_pointer;
+  Uns32T currentTrack = 0x80000000; // KLUDGE: Initialize with a value outside of track index range
+  Uns32T npairs = qstate->exact_evaluation_queue->size();
+  while(npairs--) {
+    PointPair pp = qstate->exact_evaluation_queue->top();
+    if(currentTrack != pp.trackID) {
+      SAFE_DELETE_ARRAY(dbdata);
+      SAFE_DELETE_ARRAY(dbpointers.l2norm_data);
+      SAFE_DELETE_ARRAY(dbpointers.power_data);
+      SAFE_DELETE_ARRAY(dbpointers.mean_duration);
+      currentTrack = pp.trackID;
+      adb_datum_t d = {0};
+      if(audiodb_track_id_datum(adb, pp.trackID, &d)) {
+        error("failed to get datum");
+      }
+      if(audiodb_datum_qpointers(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers)) {
+        audiodb_free_datum(&d);
+        error("failed to get dbpointers");
+      }
+      audiodb_free_datum(&d);
     }
-  }
-
-  // We are guaranteed that the order of points is sorted by:
-  // {trackID, spos, qpos} so we can be relatively efficient in
-  // initialization of track data.  We assume that points usually
-  // don't overlap, so we will use exhaustive dot product evaluation
-  // instead of memoization of partial sums which is used for
-  // exhaustive brute-force evaluation from smaller databases in
-  // query_loop()
-  double dist;
-  size_t data_buffer_size = 0;
-  double *data_buffer = 0;
-  Uns32T trackOffset = 0;
-  Uns32T trackIndexOffset = 0;
-  Uns32T currentTrack = 0x80000000; // Initialize with a value outside of track index range
-  Uns32T npairs = qstate->exact_evaluation_queue->size();
-  while(npairs--){
-    PointPair pp = qstate->exact_evaluation_queue->top();
-    // Large ADB track data must be loaded here for sPower
-    if(adb->header->flags & O2_FLAG_LARGE_ADB) {
-      trackOffset=0;
-      trackIndexOffset=0;
-      if(currentTrack!=pp.trackID){
-	char* prefixedString = new char[O2_MAXFILESTR];
-	char* tmpStr = prefixedString;
-	// On currentTrack change, allocate and load track data
-	currentTrack=pp.trackID;
-	SAFE_DELETE_ARRAY(dbpointers.l2norm_data);
-	SAFE_DELETE_ARRAY(dbpointers.power_data);
-	if(infid>0)
-	  close(infid);
-	// Open and check dimensions of feature file
-	strncpy(prefixedString, featureFileNameTable+pp.trackID*O2_FILETABLE_ENTRY_SIZE, O2_MAXFILESTR);
-	prefix_name((char ** const) &prefixedString, adb_feature_root);
-	if (prefixedString!=tmpStr)
-	  delete[] tmpStr;
-	initInputFile(prefixedString);
-	// Load the feature vector data for current track into data_buffer
-	if(audiodb_read_data(adb, infid, pp.trackID, &data_buffer, &data_buffer_size))
-          error("failed to read data");
-	// Load power and calculate power and l2norm sequence sums
-	init_track_aux_data(pp.trackID, data_buffer, &dbpointers.l2norm_data, &dbpointers.l2norm, &dbpointers.power_data, &dbpointers.power);
-      }
-    }
-    else{
-      // These offsets are w.r.t. the entire database of feature vectors and auxillary variables
-      trackOffset = (*adb->track_offsets)[pp.trackID];
-      trackIndexOffset = trackOffset/(adb->header->dim * sizeof(double)); // num vectors offset
-    }    
     Uns32T qPos = usingQueryPoint?0:pp.qpos;// index for query point
-    Uns32T sPos = trackIndexOffset+pp.spos; // index into l2norm table
+    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 && pp.spos<(*adb->track_lengths)[pp.trackID]-sequence_length+1 ) ){
-      // Non-large ADB track data is loaded inside power test for efficiency
-      if(!(adb->header->flags & O2_FLAG_LARGE_ADB) && (currentTrack!=pp.trackID) ){
-	// On currentTrack change, allocate and load track data
-	currentTrack=pp.trackID;
-	lseek(dbfid, adb->header->dataOffset + trackOffset, SEEK_SET);
-	if(audiodb_read_data(adb, dbfid, currentTrack, &data_buffer, &data_buffer_size))
-          error("failed to read data");
-      }
+	( qPos<qpointers->nvectors-sequence_length+1 && sPos<(*adb->track_lengths)[pp.trackID]-sequence_length+1 ) ){
       // Compute distance
-      dist = audiodb_dot_product(query + qPos*adb->header->dim, data_buffer + pp.spos*adb->header->dim, adb->header->dim*sequence_length);
+      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];
       switch(spec->params.distance) {
@@ -745,6 +708,7 @@
     qstate->exact_evaluation_queue->pop();
   }
   // Cleanup
+  SAFE_DELETE_ARRAY(dbdata);
   SAFE_DELETE_ARRAY(dbpointers.l2norm_data);
   SAFE_DELETE_ARRAY(dbpointers.power_data);
   SAFE_DELETE_ARRAY(dbpointers.mean_duration);