Mercurial > hg > audiodb
diff query.cpp @ 528:561339c7fd26 multiprobeLSH
Added audiodb_datum_qpointers_partial() to make exact evaluation of LSH results more efficient. This routine calculates partial sums only for those vectors needed.
author | mas01mc |
---|---|
date | Thu, 29 Jan 2009 13:44:47 +0000 |
parents | 7ee6a2701d90 |
children | e532666226bc |
line wrap: on
line diff
--- a/query.cpp Wed Jan 28 18:55:46 2009 +0000 +++ b/query.cpp Thu Jan 29 13:44:47 2009 +0000 @@ -280,6 +280,58 @@ return 0; } +int audiodb_datum_qpointers_partial(adb_datum_t *d, uint32_t sequence_length, double **vector_data, + double **vector, adb_qpointers_internal_t *qpointers, + adb_qstate_internal_t *qstate){ + uint32_t nvectors = d->nvectors; + qpointers->nvectors = nvectors; + std::priority_queue<PointPair> ppairs(*qstate->exact_evaluation_queue); + + size_t vector_size = nvectors * sizeof(double) * d->dim; + *vector_data = new double[vector_size]; + qpointers->l2norm_data = new double[vector_size / d->dim]; + if(d->power) + qpointers->power_data = new double[vector_size / d->dim]; + + uint32_t seq_len_dbl = sequence_length*d->dim*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; + + 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_sequence_sum(qpointers->l2norm_data+spos, sequence_length, sequence_length); + audiodb_sequence_sqrt(qpointers->l2norm_data+spos, sequence_length, sequence_length); + + if(d->power) { + memcpy(qpointers->power_data+spos, d->power+spos, seq_len_dbl); + audiodb_sequence_sum(qpointers->power_data+spos, sequence_length, sequence_length); + audiodb_sequence_average(qpointers->power_data+spos, sequence_length, sequence_length); + } + ppairs.pop(); + if(!ppairs.empty()) + pp = ppairs.top(); + } + + if(d->times) { + qpointers->mean_duration = new double[1]; + *qpointers->mean_duration = 0; + for(unsigned int k = 0; k < nvectors; k++) { + *qpointers->mean_duration += d->times[2*k+1] - d->times[2*k]; + } + *qpointers->mean_duration /= nvectors; + } + + *vector = *vector_data; + qpointers->l2norm = qpointers->l2norm_data; + qpointers->power = qpointers->power_data; + return 0; +} + int audiodb_query_spec_qpointers(adb_t *adb, const adb_query_spec_t *spec, double **vector_data, double **vector, adb_qpointers_internal_t *qpointers) { adb_datum_t *datum; adb_datum_t d = {0}; @@ -466,7 +518,7 @@ delete qstate->exact_evaluation_queue; return 1; } - if(audiodb_datum_qpointers(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers)) { + if(audiodb_datum_qpointers_partial(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers, qstate)) { delete qstate->exact_evaluation_queue; audiodb_free_datum(&d); return 1;