Mercurial > hg > audiodb
changeset 214:3254b15472f3 refactoring
set_up_query()
Sets up the query data (from mmap()ed file).
author | mas01cr |
---|---|
date | Tue, 04 Dec 2007 09:40:55 +0000 |
parents | 78a144448bda |
children | 241bc55a1a4e |
files | audioDB.h query.cpp |
diffstat | 2 files changed, 37 insertions(+), 45 deletions(-) [+] |
line wrap: on
line diff
--- a/audioDB.h Tue Dec 04 09:16:48 2007 +0000 +++ b/audioDB.h Tue Dec 04 09:40:55 2007 +0000 @@ -149,8 +149,6 @@ double* dataBuf; double* inBuf; double* l2normTable; - double* qNorm; - double* sNorm; double* timesTable; double* powerTable; @@ -198,6 +196,7 @@ void initialize_arrays(int track, unsigned int numVectors, double *query, double *data_buffer, double **D, double **DD); void delete_arrays(int track, unsigned int numVectors, double **D, double **DD); void read_data(int track, double **data_buffer_p, size_t *data_buffer_size_p); + void set_up_query(double **qp, double **qnp, unsigned int *nvp); void trackSequenceQueryNN(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse=0); void trackSequenceQueryRad(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse=0); @@ -263,7 +262,6 @@ trackTable(0), \ dataBuf(0), \ l2normTable(0), \ - qNorm(0), \ timesTable(0), \ fileTableLength(0), \ trackTableLength(0), \
--- a/query.cpp Tue Dec 04 09:16:48 2007 +0000 +++ b/query.cpp Tue Dec 04 09:40:55 2007 +0000 @@ -165,35 +165,41 @@ read(dbfid, *data_buffer_p, trackTable[track] * sizeof(double) * dbH->dim); } +void audioDB::set_up_query(double **qp, double **qnp, unsigned *nvp) { + *nvp = (statbuf.st_size - sizeof(int)) / (dbH->dim * sizeof(double)); + + if(!(dbH->flags & O2_FLAG_L2NORM)) { + error("Database must be L2 normed for sequence query","use -L2NORM"); + } + + if(*nvp < sequenceLength) { + error("Query shorter than requested sequence length", "maybe use -l"); + } + + if(verbosity>1) { + std::cerr << "performing norms ... "; std::cerr.flush(); + } + + *qp = new double[*nvp * dbH->dim]; + memcpy(*qp, indata+sizeof(int), *nvp * dbH->dim * sizeof(double)); + *qnp = new double[*nvp]; + unitNorm(*qp, dbH->dim, *nvp, *qnp); +} + void audioDB::trackSequenceQueryNN(const char* dbName, const char* inFile, adb__queryResponse *adbQueryResponse){ initTables(dbName, inFile); - // For each input vector, find the closest pointNN matching output vectors and report - // we use stdout in this stub version - unsigned numVectors = (statbuf.st_size-sizeof(int))/(sizeof(double)*dbH->dim); - double* query = (double*)(indata+sizeof(int)); - double* queryCopy = 0; + unsigned int numVectors; + double *query, *query_data; + double *qNorm, *sNorm; - if(!(dbH->flags & O2_FLAG_L2NORM) ) - error("Database must be L2 normed for sequence query","use -L2NORM"); + set_up_query(&query, &qNorm, &numVectors); + query_data = query; - if(numVectors<sequenceLength) - error("Query shorter than requested sequence length", "maybe use -l"); - - if(verbosity>1) { - std::cerr << "performing norms ... "; std::cerr.flush(); - } unsigned dbVectors = dbH->length/(sizeof(double)*dbH->dim); - // Make a copy of the query - queryCopy = new double[numVectors*dbH->dim]; - memcpy(queryCopy, query, numVectors*dbH->dim*sizeof(double)); - qNorm = new double[numVectors]; sNorm = new double[dbVectors]; - assert(qNorm&&sNorm&&queryCopy&&sequenceLength); - unitNorm(queryCopy, dbH->dim, numVectors, qNorm); - query = queryCopy; // Make norm measurements relative to sequenceLength unsigned i,j; @@ -556,8 +562,8 @@ // Clean up if(trackOffsetTable) delete[] trackOffsetTable; - if(queryCopy) - delete[] queryCopy; + if(query_data) + delete[] query_data; if(qNorm) delete[] qNorm; if(sNorm) @@ -582,28 +588,16 @@ initTables(dbName, inFile); - // For each input vector, find the closest pointNN matching output vectors and report - // we use stdout in this stub version - unsigned numVectors = (statbuf.st_size-sizeof(int))/(sizeof(double)*dbH->dim); - double* query = (double*)(indata+sizeof(int)); - double* queryCopy = 0; + unsigned int numVectors; + double *query, *query_data; + double *qNorm, *sNorm; - if(!(dbH->flags & O2_FLAG_L2NORM) ) - error("Database must be L2 normed for sequence query","use -l2norm"); - - if(verbosity>1) { - std::cerr << "performing norms ... "; std::cerr.flush(); - } + set_up_query(&query, &qNorm, &numVectors); + query_data = query; + unsigned dbVectors = dbH->length/(sizeof(double)*dbH->dim); - // Make a copy of the query - queryCopy = new double[numVectors*dbH->dim]; - memcpy(queryCopy, query, numVectors*dbH->dim*sizeof(double)); - qNorm = new double[numVectors]; sNorm = new double[dbVectors]; - assert(qNorm&&sNorm&&queryCopy&&sequenceLength); - unitNorm(queryCopy, dbH->dim, numVectors, qNorm); - query = queryCopy; // Make norm measurements relative to sequenceLength unsigned i,j; @@ -945,8 +939,8 @@ // Clean up if(trackOffsetTable) delete[] trackOffsetTable; - if(queryCopy) - delete[] queryCopy; + if(query_data) + delete[] query_data; if(qNorm) delete[] qNorm; if(sNorm)