Mercurial > hg > audiodb
changeset 529:e532666226bc multiprobeLSH
Fixed a problem with inserting into exact_evaluation_queue, duplicate pairs were being inserted when querying multiple hashtables. That is now fixed by adding a unique constraint using set<PointPair> inserts and testing. This should speed things up quite a bit (like, 10-fold with default num tables).
author | mas01mc |
---|---|
date | Fri, 30 Jan 2009 14:58:35 +0000 |
parents | 561339c7fd26 |
children | aa715b3e18db |
files | Makefile audioDB-internals.h query-indexed.cpp query.cpp |
diffstat | 4 files changed, 22 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Thu Jan 29 13:44:47 2009 +0000 +++ b/Makefile Fri Jan 30 14:58:35 2009 +0000 @@ -17,15 +17,15 @@ MINORVERSION=0 LIBRARY=lib$(EXECUTABLE).so.$(SOVERSION).$(MINORVERSION) -override CFLAGS+=-O3 -fPIC -pg +override CFLAGS+=-O3 -fPIC # set to DUMP hashtables on QUERY load #override CFLAGS+=-DLSH_DUMP_CORE_TABLES # set to turn on debugging information for LSH hashtables -#override CFLAGS+=-D_LSH_DEBUG_ +# override CFLAGS+=-D_LSH_DEBUG_ -# set to increase multiple probes in LSH QUERY (allowable range = 1 ... lsh_k*2) +# set multiple probes in LSH QUERY (allowable range = 0 ... lsh_k*2) 0=multiprobe off #override CFLAGS+=-DLSH_MULTI_PROBE_COUNT=10 ifeq ($(shell uname),Linux)
--- a/audioDB-internals.h Thu Jan 29 13:44:47 2009 +0000 +++ b/audioDB-internals.h Fri Jan 30 14:58:35 2009 +0000 @@ -51,6 +51,7 @@ typedef struct adb_qstate_internal { Accumulator *accumulator; std::set<std::string> *allowed_keys; + std::set<PointPair> * set; std::priority_queue<PointPair> *exact_evaluation_queue; LSH *lsh; } adb_qstate_internal_t;
--- a/query-indexed.cpp Thu Jan 29 13:44:47 2009 +0000 +++ b/query-indexed.cpp Fri Jan 30 14:58:35 2009 +0000 @@ -70,7 +70,10 @@ std::set<std::string>::iterator keys_end = qstate->allowed_keys->end(); if(qstate->allowed_keys->find((*adb->keys)[trackID]) != keys_end) { PointPair p(trackID, qpos, spos); - qstate->exact_evaluation_queue->push(p); + if(qstate->set->find(p)==qstate->set->end()){ + qstate->set->insert(p); + qstate->exact_evaluation_queue->push(p); + } } } @@ -98,6 +101,7 @@ add_point_func = &audiodb_index_add_point_approximate; } else { qstate->exact_evaluation_queue = new std::priority_queue<PointPair>; + qstate->set = new std::set<PointPair, less<PointPair> >; add_point_func = &audiodb_index_add_point_exact; }
--- a/query.cpp Thu Jan 29 13:44:47 2009 +0000 +++ b/query.cpp Fri Jan 30 14:58:35 2009 +0000 @@ -293,17 +293,21 @@ if(d->power) qpointers->power_data = new double[vector_size / d->dim]; - uint32_t seq_len_dbl = sequence_length*d->dim*sizeof(double); + 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); - memcpy(*vector_data+spos_dim, d->data+spos_dim, seq_len_dbl); - - audiodb_l2norm_buffer(*vector_data+spos_dim, d->dim, 1, qpointers->l2norm_data+spos); + 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); @@ -516,10 +520,13 @@ adb_datum_t d = {0}; 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_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; } @@ -561,6 +568,7 @@ maybe_delete_array(dbpointers.power_data); maybe_delete_array(dbpointers.mean_duration); delete qstate->exact_evaluation_queue; + delete qstate->set; return 0; }