changeset 675:c62041316a44

First implementation of separate query / instance hopsizes Builds and passes tests. Bindings not yet adjusted, and of course there are no existing tests of hopsize functionality anyway.
author mas01cr
date Fri, 05 Mar 2010 16:01:06 +0000
parents fb85aadab85d
children dd6cabd65327
files audioDB.cpp audioDB_API.h query.cpp
diffstat 3 files changed, 22 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/audioDB.cpp	Fri Mar 05 16:01:02 2010 +0000
+++ b/audioDB.cpp	Fri Mar 05 16:01:06 2010 +0000
@@ -833,9 +833,9 @@
     qspec.refine.flags |= ADB_REFINE_DURATION_RATIO;
     qspec.refine.duration_ratio = timesTol;
   }
-  /* FIXME: not sure about this any more; maybe it belongs in
-     query_id?  Or maybe we just don't need a flag for it? */
-  qspec.refine.hopsize = sequenceHop;
+
+  qspec.refine.qhopsize = sequenceHop;
+  qspec.refine.ihopsize = sequenceHop;
   if(sequenceHop != 1) {
     qspec.refine.flags |= ADB_REFINE_HOP_SIZE;
   }
--- a/audioDB_API.h	Fri Mar 05 16:01:02 2010 +0000
+++ b/audioDB_API.h	Fri Mar 05 16:01:06 2010 +0000
@@ -77,7 +77,8 @@
   double absolute_threshold;
   double relative_threshold;
   double duration_ratio; /* expandfactor */
-  uint32_t hopsize;
+  uint32_t qhopsize;
+  uint32_t ihopsize;
 } adb_query_refine_t;
 
 #define ADB_ACCUMULATION_DB 1
--- a/query.cpp	Fri Mar 05 16:01:02 2010 +0000
+++ b/query.cpp	Fri Mar 05 16:01:06 2010 +0000
@@ -109,7 +109,6 @@
   unsigned int j, k, l, w;
   double *dp, *qp, *sp;
 
-  const unsigned HOP_SIZE = spec->refine.hopsize;
   const unsigned wL = spec->qid.sequence_length;
 
   for(j = 0; j < numVectors; j++) {
@@ -132,8 +131,6 @@
         *dp += *qp++ * *sp++;
     }
   
-  // Matched Filter
-  // HOP SIZE == 1
   double* spd;
   if(!(spec->refine.flags & ADB_REFINE_HOP_SIZE)) {
     for(w = 0; w < wL; w++) {
@@ -146,14 +143,18 @@
       }
     }
   } else {
+    uint32_t qhop = spec->refine.qhopsize;
+    qhop = qhop ? qhop : 1;
+    uint32_t ihop = spec->refine.ihopsize;
+    ihop = ihop ? ihop : 1;
     for(w = 0; w < wL; w++) {
-      for(j = 0; j < numVectors - w; j += HOP_SIZE) {
+      for(j = 0; j < numVectors - w; j += qhop) {
         sp = DD[j];
         spd = D[j+w]+w;
-        for(k = 0; k < (*adb->track_lengths)[track] - w; k += HOP_SIZE) {
+        for(k = 0; k < (*adb->track_lengths)[track] - w; k += ihop) {
           *sp += *spd;
-          sp += HOP_SIZE;
-          spd += HOP_SIZE;
+          sp += ihop;
+          spd += ihop;
         }
       }
     }
@@ -526,12 +527,16 @@
   D = new double*[qpointers.nvectors]; // pre-allocate 
   DD = new double*[qpointers.nvectors];
 
-  unsigned HOP_SIZE;
+  unsigned qhop, ihop;
 
   if(spec->refine.flags & ADB_REFINE_HOP_SIZE) {
-    HOP_SIZE = spec->refine.hopsize;
+    qhop = spec->refine.qhopsize;
+    qhop = qhop ? qhop : 1;
+    ihop = spec->refine.ihopsize;
+    ihop = ihop ? ihop : 1;
   } else {
-    HOP_SIZE = 1;
+    qhop = 1;
+    ihop = 1;
   }
   off_t trackIndexOffset;
 
@@ -567,8 +572,8 @@
          fabs(dbpointers.mean_duration[track]-qpointers.mean_duration[0]) < qpointers.mean_duration[0]*spec->refine.duration_ratio) {
 
 	// Search for minimum distance by shingles (concatenated vectors)
-	for(j = 0; j <= qpointers.nvectors - wL; j += HOP_SIZE) {
-	  for(k = 0; k <= (*adb->track_lengths)[track] - wL; k += HOP_SIZE) {
+	for(j = 0; j <= qpointers.nvectors - wL; j += qhop) {
+	  for(k = 0; k <= (*adb->track_lengths)[track] - wL; k += ihop) {
             double thisDist = 0;
             double qn = qpointers.l2norm[j];
             double sn = dbpointers.l2norm[trackIndexOffset + k];