changeset 208:cb126d467344 refactoring

New initialize_arrays() helper routine for remaining queries. And so it begins...
author mas01cr
date Wed, 28 Nov 2007 17:46:02 +0000
parents 861e4bc95547
children c9722e12acae
files audioDB.h query.cpp
diffstat 2 files changed, 61 insertions(+), 115 deletions(-) [+]
line wrap: on
line diff
--- a/audioDB.h	Wed Nov 28 17:22:42 2007 +0000
+++ b/audioDB.h	Wed Nov 28 17:46:02 2007 +0000
@@ -195,6 +195,7 @@
   void sequence_sqrt(double *buffer, int length, int seqlen);
   void sequence_average(double *buffer, int length, int seqlen);
 
+  void initialize_arrays(int track, unsigned int numVectors, double *query, double *data_buffer, double **D, double **DD);
   void trackSequenceQueryNN(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse=0);
   void trackSequenceQueryRad(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse=0);
 
--- a/query.cpp	Wed Nov 28 17:22:42 2007 +0000
+++ b/query.cpp	Wed Nov 28 17:46:02 2007 +0000
@@ -77,6 +77,61 @@
   }
 }
 
+void audioDB::initialize_arrays(int track, unsigned int numVectors, double *query, double *data_buffer, double **D, double **DD) {
+  unsigned int j, k, l, w;
+  double *dp, *qp, *sp;
+
+  const unsigned HOP_SIZE = sequenceHop;
+  const unsigned wL = sequenceLength;
+
+  for(j = 0; j < numVectors; j++) {
+    // Sum products matrix
+    D[j] = new double[trackTable[track]]; 
+    assert(D[j]);
+    // Matched filter matrix
+    DD[j]=new double[trackTable[track]];
+    assert(DD[j]);
+  }
+
+  // Dot product
+  for(j = 0; j < numVectors; j++)
+    for(k = 0; k < trackTable[track]; k++){
+      qp = query + j * dbH->dim;
+      sp = data_buffer + k * dbH->dim;
+      DD[j][k] = 0.0; // Initialize matched filter array
+      dp = &D[j][k];  // point to correlation cell j,k
+      *dp = 0.0;      // initialize correlation cell
+      l = dbH->dim;         // size of vectors
+      while(l--)
+        *dp += *qp++ * *sp++;
+    }
+  
+  // Matched Filter
+  // HOP SIZE == 1
+  double* spd;
+  if(HOP_SIZE == 1) { // HOP_SIZE = shingleHop
+    for(w = 0; w < wL; w++)
+      for(j = 0; j < numVectors - w; j++) { 
+        sp = DD[j];
+        spd = D[j+w] + w;
+        k = trackTable[track] - w;
+        while(k--)
+          *sp++ += *spd++;
+      }
+  } else { // HOP_SIZE != 1
+    for(w = 0; w < wL; w++)
+      for(j = 0; j < numVectors - w; j += HOP_SIZE) {
+        sp = DD[j];
+        spd = D[j+w]+w;
+        for(k = 0; k < trackTable[track] - w; k += HOP_SIZE) {
+          *sp += *spd;
+          sp += HOP_SIZE;
+          spd += HOP_SIZE;
+        }
+      }
+  }
+}
+
 void audioDB::trackSequenceQueryNN(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse){
   
   initTables(dbName, inFile);
@@ -108,7 +163,6 @@
   query = queryCopy;
 
   // Make norm measurements relative to sequenceLength
-  unsigned w = sequenceLength-1;
   unsigned i,j;
 
   // Copy the L2 norm values to core to avoid disk random access later on
@@ -269,10 +323,6 @@
   unsigned processedTracks = 0;
   unsigned successfulTracks=0;
 
-  double* qp;
-  double* sp;
-  double* dp;
-
   // build track offset table
   off_t *trackOffsetTable = new off_t[dbH->numFiles];
   unsigned cumTrack=0;
@@ -336,59 +386,8 @@
 
       read(dbfid, data_buffer, trackTable[track] * sizeof(double) * dbH->dim);
 
-      // Sum products matrix
-      for(j=0; j<numVectors;j++){
-	D[j]=new double[trackTable[track]]; 
-	assert(D[j]);
+      initialize_arrays(track, numVectors, query, data_buffer, D, DD);
 
-      }
-
-      // Matched filter matrix
-      for(j=0; j<numVectors;j++){
-	DD[j]=new double[trackTable[track]];
-	assert(DD[j]);
-      }
-
-      // Dot product
-      for(j=0; j<numVectors; j++)
-	for(k=0; k<trackTable[track]; k++){
-	  qp=query+j*dbH->dim;
-	  sp=data_buffer+k*dbH->dim;
-	  DD[j][k]=0.0; // Initialize matched filter array
-	  dp=&D[j][k];  // point to correlation cell j,k
-	  *dp=0.0;      // initialize correlation cell
-	  l=dbH->dim;         // size of vectors
-	  while(l--)
-	    *dp+=*qp++**sp++;
-	}
-  
-      // Matched Filter
-      // HOP SIZE == 1
-      double* spd;
-      if(HOP_SIZE==1){ // HOP_SIZE = shingleHop
-	for(w=0; w<wL; w++)
-	  for(j=0; j<numVectors-w; j++){ 
-	    sp=DD[j];
-	    spd=D[j+w]+w;
-	    k=trackTable[track]-w;
-	    while(k--)
-	      *sp+++=*spd++;
-	  }
-      }
-
-      else{ // HOP_SIZE != 1
-	for(w=0; w<wL; w++)
-	  for(j=0; j<numVectors-w; j+=HOP_SIZE){
-	    sp=DD[j];
-	    spd=D[j+w]+w;
-	    for(k=0; k<trackTable[track]-w; k+=HOP_SIZE){
-	      *sp+=*spd;
-	      sp+=HOP_SIZE;
-	      spd+=HOP_SIZE;
-	    }
-	  }
-      }
-      
       if(verbosity>3 && usingTimes) {
 	std::cerr << "meanQdur=" << meanQdur << " meanDBdur=" << meanDBdur[track] << std::endl;
 	std::cerr.flush();
@@ -599,7 +598,6 @@
   query = queryCopy;
 
   // Make norm measurements relative to sequenceLength
-  unsigned w = sequenceLength-1;
   unsigned i,j;
 
   // Copy the L2 norm values to core to avoid disk random access later on
@@ -677,7 +675,9 @@
   unsigned sIndexes[pointNN];
   
 
-  unsigned k,l,n,track,trackOffset=0, HOP_SIZE=sequenceHop, wL=sequenceLength;
+  unsigned k,l,n,track,trackOffset=0;
+  unsigned const HOP_SIZE=sequenceHop;
+  unsigned const wL=sequenceLength;
   double thisDist;
   
   for(k=0; k<pointNN; k++){
@@ -759,10 +759,6 @@
   unsigned processedTracks = 0;
   unsigned successfulTracks=0;
 
-  double* qp;
-  double* sp;
-  double* dp;
-
   // build track offset table
   off_t *trackOffsetTable = new off_t[dbH->numFiles];
   unsigned cumTrack=0;
@@ -826,59 +822,8 @@
 
       read(dbfid, data_buffer, trackTable[track] * sizeof(double) * dbH->dim);
 
-      // Sum products matrix
-      for(j=0; j<numVectors;j++){
-	D[j]=new double[trackTable[track]]; 
-	assert(D[j]);
+      initialize_arrays(track, numVectors, query, data_buffer, D, DD);
 
-      }
-
-      // Matched filter matrix
-      for(j=0; j<numVectors;j++){
-	DD[j]=new double[trackTable[track]];
-	assert(DD[j]);
-      }
-
-      // Dot product
-      for(j=0; j<numVectors; j++)
-	for(k=0; k<trackTable[track]; k++){
-	  qp=query+j*dbH->dim;
-	  sp=data_buffer+k*dbH->dim;
-	  DD[j][k]=0.0; // Initialize matched filter array
-	  dp=&D[j][k];  // point to correlation cell j,k
-	  *dp=0.0;      // initialize correlation cell
-	  l=dbH->dim;         // size of vectors
-	  while(l--)
-	    *dp+=*qp++**sp++;
-	}
-
-      // Matched Filter
-      // HOP SIZE == 1
-      double* spd;
-      if(HOP_SIZE==1){ // HOP_SIZE = shingleHop
-	for(w=0; w<wL; w++)
-	  for(j=0; j<numVectors-w; j++){ 
-	    sp=DD[j];
-	    spd=D[j+w]+w;
-	    k=trackTable[track]-w;
-	    while(k--)
-	      *sp+++=*spd++;
-	  }
-      }
-
-      else{ // HOP_SIZE != 1
-	for(w=0; w<wL; w++)
-	  for(j=0; j<numVectors-w; j+=HOP_SIZE){
-	    sp=DD[j];
-	    spd=D[j+w]+w;
-	    for(k=0; k<trackTable[track]-w; k+=HOP_SIZE){
-	      *sp+=*spd;
-	      sp+=HOP_SIZE;
-	      spd+=HOP_SIZE;
-	    }
-	  }
-      }
-      
       if(verbosity>3 && usingTimes) {
 	std::cerr << "meanQdur=" << meanQdur << " meanDBdur=" << meanDBdur[track] << std::endl;
 	std::cerr.flush();