Mercurial > hg > audiodb
diff query.cpp @ 531:ddf763553175 multiprobeLSH
Removed redundant memcpy calls from query_loop_queue(). This changed the order of some memory allocation and de-allocation calls for loaded database data.
author | mas01mc |
---|---|
date | Sat, 31 Jan 2009 16:25:30 +0000 |
parents | aa715b3e18db |
children | 06ed85832c3b |
line wrap: on
line diff
--- a/query.cpp Fri Jan 30 19:44:51 2009 +0000 +++ b/query.cpp Sat Jan 31 16:25:30 2009 +0000 @@ -288,28 +288,20 @@ std::priority_queue<PointPair, std::vector<PointPair>, greater<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_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); - - 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); if(d->power) { memcpy(qpointers->power_data+spos, d->power+spos, seq_len_dbl); @@ -330,8 +322,9 @@ *qpointers->mean_duration /= nvectors; } - *vector = *vector_data; - qpointers->l2norm = qpointers->l2norm_data; + *vector = d->data; + *vector_data = d->data; + qpointers->l2norm = 0 ; qpointers->power = qpointers->power_data; return 0; } @@ -509,38 +502,38 @@ cout << "Num vector pairs to evaluate: " << npairs << "..." << endl; cout.flush(); #endif + adb_datum_t d = {0}; while(npairs--) { PointPair pp = qstate->exact_evaluation_queue->top(); if(currentTrack != pp.trackID) { - maybe_delete_array(dbdata); - maybe_delete_array(dbpointers.l2norm_data); maybe_delete_array(dbpointers.power_data); maybe_delete_array(dbpointers.mean_duration); currentTrack = pp.trackID; - adb_datum_t d = {0}; + audiodb_free_datum(&d); 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(&d, sequence_length, &dbdata, &dbdata_pointer, &dbpointers)) { delete qstate->exact_evaluation_queue; delete qstate->set; audiodb_free_datum(&d); return 1; - } - audiodb_free_datum(&d); + } } Uns32T qPos = (spec->qid.flags & ADB_QID_FLAG_EXHAUSTIVE) ? pp.qpos : 0; Uns32T sPos = pp.spos; // index into l2norm table // Test power thresholds before computing distance if( ( (!power_refine) || audiodb_powers_acceptable(&spec->refine, qpointers->power[qPos], dbpointers.power[sPos])) && ( qPos<qpointers->nvectors-sequence_length+1 && sPos<(*adb->track_lengths)[pp.trackID]-sequence_length+1 ) ){ - // Compute distance + // Compute distance dist = audiodb_dot_product(query + qPos*adb->header->dim, dbdata + sPos*adb->header->dim, adb->header->dim*sequence_length); - double qn = qpointers->l2norm[qPos]; - double sn = dbpointers.l2norm[sPos]; + double qn = audiodb_dot_product(query + qPos*adb->header->dim, query + qPos*adb->header->dim, adb->header->dim*sequence_length); + double sn = audiodb_dot_product(dbdata + sPos*adb->header->dim, dbdata + sPos*adb->header->dim, adb->header->dim*sequence_length); + qn = sqrt(qn); + sn = sqrt(sn); switch(spec->params.distance) { case ADB_DISTANCE_EUCLIDEAN_NORMED: dist = 2 - (2/(qn*sn))*dist; @@ -563,8 +556,9 @@ } // Cleanup - maybe_delete_array(dbdata); - maybe_delete_array(dbpointers.l2norm_data); + audiodb_free_datum(&d); + // maybe_delete_array(dbdata); + //maybe_delete_array(dbpointers.l2norm_data); maybe_delete_array(dbpointers.power_data); maybe_delete_array(dbpointers.mean_duration); delete qstate->exact_evaluation_queue;