Mercurial > hg > audiodb
diff reporter.h @ 324:c93be2f3a674
Merge of branches/large_adb -r 514:524 onto the trunk. No conflicts. Added LARGE_ADB support. Turn on with --ntracks 20001 or greater. Use --adb_feature_root to locate feature files at QUERY time. A bug fix in LSH indexing that was incorrectly thresholding large numbers of shingles.
author | mas01mc |
---|---|
date | Thu, 21 Aug 2008 21:28:33 +0000 |
parents | d1b8b2dec37e |
children | cc3f9d1ca2cd |
line wrap: on
line diff
--- a/reporter.h Tue Aug 12 14:25:51 2008 +0000 +++ b/reporter.h Thu Aug 21 21:28:33 2008 +0000 @@ -292,6 +292,7 @@ } std::vector<NNresult>::reverse_iterator rit; std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue; + NNresult rk; if(adbQueryResponse==0) { for(rit = v.rbegin(); rit < v.rend(); rit++) { @@ -309,31 +310,57 @@ } for(unsigned int k = 0; k < qsize; k++) { - NNresult rk = point_queue.top(); + rk = point_queue.top(); std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl; point_queue.pop(); } } } else { - ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size; - ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size; - ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size; - ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size; - ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size]; - ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size]; - ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size]; - ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size]; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size*pointNN]; + ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size*pointNN]; + ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size*pointNN]; + ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size*pointNN]; unsigned int k = 0; - for(rit = v.rbegin(); rit < v.rend(); rit++, k++) { + // Loop over returned tracks + for(rit = v.rbegin(); rit < v.rend(); rit++) { r = *rit; - ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR]; - ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = r.dist; - ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = r.qpos; - ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = r.spos; - if(fileTable) - snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE); - else - snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID); + // Reverse the order of the points stored in point_queues + unsigned int qsize=point_queues[r.trackID].size(); + while(qsize--){ + point_queue.push(point_queues[r.trackID].top()); + point_queues[r.trackID].pop(); + } + qsize=point_queue.size(); + unsigned int numReports = pointNN; + while(numReports--){ // pop the rest of the points + if(qsize) + rk = point_queue.top(); // Take one point from the top of the queue + else{ + rk.dist = 1000000000.0; + rk.qpos = 0xFFFFFFFF; + rk.spos = 0xFFFFFFFF; + } + + ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR]; + ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = rk.dist; + ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = rk.qpos; + ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = rk.spos; + if(qsize){ + if(fileTable) + snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE); + else + snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID); + point_queue.pop(); + qsize--; + } + else + snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "NULL"); + k++; + } } } // clean up @@ -641,17 +668,17 @@ } } else { - ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size; - ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size; - ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size; - ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size; - ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size]; - ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size]; - ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size]; - ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size]; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size*pointNN; + ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size*pointNN]; + ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size*pointNN]; + ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size*pointNN]; + ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size*pointNN]; unsigned int k = 0; // Loop over returned tracks - for(rit = v.rbegin(); rit < v.rend(); rit++, k++) { + for(rit = v.rbegin(); rit < v.rend(); rit++) { r = *rit; // Reverse the order of the points stored in point_queues unsigned int qsize=point_queues[r.trackID].size(); @@ -660,17 +687,32 @@ point_queues[r.trackID].pop(); } qsize=point_queue.size(); - rk = point_queue.top(); // Take one point from the top of the queue - ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR]; - ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = rk.dist; - ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = rk.qpos; - ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = rk.spos; - if(fileTable) - snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE); - else - snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID); - while(qsize--) // pop the rest of the points - point_queue.pop(); + unsigned int numReports = pointNN; + while(numReports--){ // pop the rest of the points + if(qsize) + rk = point_queue.top(); // Take one point from the top of the queue + else{ + rk.dist = 1000000000.0; + rk.qpos = 0xFFFFFFFF; + rk.spos = 0xFFFFFFFF; + } + + ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR]; + ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = rk.dist; + ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = rk.qpos; + ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = rk.spos; + if(qsize){ + if(fileTable) + snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE); + else + snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID); + point_queue.pop(); + qsize--; + } + else + snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "NULL"); + k++; + } } } delete[] point_queues;