comparison reporter.h @ 292:d9a88cfd4ab6

Completed merge of lshlib back to current version of the trunk.
author mas01mc
date Tue, 29 Jul 2008 22:01:17 +0000
parents d209e8470a60
children d1b8b2dec37e
comparison
equal deleted inserted replaced
291:63ae0dfc1767 292:d9a88cfd4ab6
1 #ifndef __REPORTER_H
2 #define __REPORTER_H
3
1 #include <utility> 4 #include <utility>
2 #include <queue> 5 #include <queue>
3 #include <deque>
4 #include <set> 6 #include <set>
5 #include <functional> 7 #include <functional>
8 #include <iostream>
9 #include "ReporterBase.h"
10 #include "audioDB.h"
6 11
7 typedef struct nnresult { 12 typedef struct nnresult {
8 unsigned int trackID; 13 unsigned int trackID;
9 double dist; 14 double dist;
10 unsigned int qpos; 15 unsigned int qpos;
30 35
31 bool operator> (const Radresult &a, const Radresult &b) { 36 bool operator> (const Radresult &a, const Radresult &b) {
32 return a.count > b.count; 37 return a.count > b.count;
33 } 38 }
34 39
35 class Reporter { 40 class Reporter : public ReporterBase {
36 public: 41 public:
37 virtual ~Reporter() {}; 42 virtual ~Reporter() {};
38 virtual void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) = 0; 43 virtual void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) = 0;
39 // FIXME: this interface is a bit wacky: a relic of previous, more 44 // FIXME: this interface is a bit wacky: a relic of previous, more
40 // confused times. Really it might make sense to have separate 45 // confused times. Really it might make sense to have separate
41 // reporter classes for WS and for stdout, rather than passing this 46 // reporter classes for WS and for stdout, rather than passing this
42 // adbQueryResponse thing everywhere; the fileTable argument is 47 // adbQueryResponse thing everywhere; the fileTable argument is
43 // there solely for convertion trackIDs into names. -- CSR, 48 // there solely for convertion trackIDs into names. -- CSR,
44 // 2007-12-10. 49 // 2007-12-10.
45 virtual void report(char *fileTable, adb__queryResponse *adbQueryResponse) = 0; 50 virtual void report(char *fileTable, void* adbQueryResponse) = 0;
46 }; 51 };
47 52
48 template <class T> class pointQueryReporter : public Reporter { 53 template <class T> class pointQueryReporter : public Reporter {
49 public: 54 public:
50 pointQueryReporter(unsigned int pointNN); 55 pointQueryReporter(unsigned int pointNN);
51 ~pointQueryReporter(); 56 ~pointQueryReporter();
52 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist); 57 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
53 void report(char *fileTable, adb__queryResponse *adbQueryResponse); 58 void report(char *fileTable, void* adbQueryResponse);
54 private: 59 private:
55 unsigned int pointNN; 60 unsigned int pointNN;
56 std::priority_queue< NNresult, std::vector< NNresult >, T> *queue; 61 std::priority_queue< NNresult, std::vector< NNresult >, T> *queue;
57 }; 62 };
58 63
77 queue->pop(); 82 queue->pop();
78 } 83 }
79 } 84 }
80 } 85 }
81 86
82 template <class T> void pointQueryReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) { 87 template <class T> void pointQueryReporter<T>::report(char *fileTable, void *adbQueryResponse) {
83 NNresult r; 88 NNresult r;
84 std::vector<NNresult> v; 89 std::vector<NNresult> v;
85 unsigned int size = queue->size(); 90 unsigned int size = queue->size();
86 for(unsigned int k = 0; k < size; k++) { 91 for(unsigned int k = 0; k < size; k++) {
87 r = queue->top(); 92 r = queue->top();
91 std::vector<NNresult>::reverse_iterator rit; 96 std::vector<NNresult>::reverse_iterator rit;
92 97
93 if(adbQueryResponse==0) { 98 if(adbQueryResponse==0) {
94 for(rit = v.rbegin(); rit < v.rend(); rit++) { 99 for(rit = v.rbegin(); rit < v.rend(); rit++) {
95 r = *rit; 100 r = *rit;
96 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " "; 101 if(fileTable)
102 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
103 else
104 std::cout << r.trackID << " ";
97 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl; 105 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
98 } 106 }
99 } else { 107 } else {
100 adbQueryResponse->result.__sizeRlist=size; 108 ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size;
101 adbQueryResponse->result.__sizeDist=size; 109 ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size;
102 adbQueryResponse->result.__sizeQpos=size; 110 ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size;
103 adbQueryResponse->result.__sizeSpos=size; 111 ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size;
104 adbQueryResponse->result.Rlist= new char*[size]; 112 ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size];
105 adbQueryResponse->result.Dist = new double[size]; 113 ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size];
106 adbQueryResponse->result.Qpos = new unsigned int[size]; 114 ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size];
107 adbQueryResponse->result.Spos = new unsigned int[size]; 115 ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size];
108 unsigned int k = 0; 116 unsigned int k = 0;
109 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) { 117 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
110 r = *rit; 118 r = *rit;
111 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR]; 119 ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR];
112 adbQueryResponse->result.Dist[k] = r.dist; 120 ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = r.dist;
113 adbQueryResponse->result.Qpos[k] = r.qpos; 121 ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = r.qpos;
114 adbQueryResponse->result.Spos[k] = r.spos; 122 ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = r.spos;
115 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE); 123 if(fileTable)
124 snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
125 else
126 snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID);
116 } 127 }
117 } 128 }
118 } 129 }
119 130
120 template <class T> class trackAveragingReporter : public Reporter { 131 template <class T> class trackAveragingReporter : public Reporter {
121 public: 132 public:
122 trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles); 133 trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
123 ~trackAveragingReporter(); 134 ~trackAveragingReporter();
124 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist); 135 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
125 void report(char *fileTable, adb__queryResponse *adbQueryResponse); 136 void report(char *fileTable, void *adbQueryResponse);
126 protected: 137 protected:
127 unsigned int pointNN; 138 unsigned int pointNN;
128 unsigned int trackNN; 139 unsigned int trackNN;
129 unsigned int numFiles; 140 unsigned int numFiles;
130 std::priority_queue< NNresult, std::vector< NNresult>, T > *queues; 141 std::priority_queue< NNresult, std::vector< NNresult>, T > *queues;
151 queues[trackID].pop(); 162 queues[trackID].pop();
152 } 163 }
153 } 164 }
154 } 165 }
155 166
156 template <class T> void trackAveragingReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) { 167 template <class T> void trackAveragingReporter<T>::report(char *fileTable, void *adbQueryResponse) {
157 std::priority_queue < NNresult, std::vector< NNresult>, T> result; 168 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
158 for (int i = numFiles-1; i >= 0; i--) { 169 for (int i = numFiles-1; i >= 0; i--) {
159 unsigned int size = queues[i].size(); 170 unsigned int size = queues[i].size();
160 if (size > 0) { 171 if (size > 0) {
161 NNresult r; 172 NNresult r;
192 std::vector<NNresult>::reverse_iterator rit; 203 std::vector<NNresult>::reverse_iterator rit;
193 204
194 if(adbQueryResponse==0) { 205 if(adbQueryResponse==0) {
195 for(rit = v.rbegin(); rit < v.rend(); rit++) { 206 for(rit = v.rbegin(); rit < v.rend(); rit++) {
196 r = *rit; 207 r = *rit;
197 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " "; 208 if(fileTable)
209 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
210 else
211 std::cout << r.trackID << " ";
198 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl; 212 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
199 } 213 }
200 } else { 214 } else {
201 adbQueryResponse->result.__sizeRlist=size; 215 ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size;
202 adbQueryResponse->result.__sizeDist=size; 216 ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size;
203 adbQueryResponse->result.__sizeQpos=size; 217 ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size;
204 adbQueryResponse->result.__sizeSpos=size; 218 ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size;
205 adbQueryResponse->result.Rlist= new char*[size]; 219 ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size];
206 adbQueryResponse->result.Dist = new double[size]; 220 ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size];
207 adbQueryResponse->result.Qpos = new unsigned int[size]; 221 ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size];
208 adbQueryResponse->result.Spos = new unsigned int[size]; 222 ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size];
209 unsigned int k = 0; 223 unsigned int k = 0;
210 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) { 224 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
211 r = *rit; 225 r = *rit;
212 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR]; 226 ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR];
213 adbQueryResponse->result.Dist[k] = r.dist; 227 ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = r.dist;
214 adbQueryResponse->result.Qpos[k] = r.qpos; 228 ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = r.qpos;
215 adbQueryResponse->result.Spos[k] = r.spos; 229 ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = r.spos;
216 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE); 230 if(fileTable)
217 } 231 snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
218 } 232 else
219 } 233 snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID);
220 234 }
221 // track Sequence Query Radius Reporter
222 // only return tracks and retrieved point counts
223 class trackSequenceQueryRadReporter : public Reporter {
224 public:
225 trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles);
226 ~trackSequenceQueryRadReporter();
227 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
228 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
229 protected:
230 unsigned int trackNN;
231 unsigned int numFiles;
232 std::set<std::pair<unsigned int, unsigned int> > *set;
233 unsigned int *count;
234 };
235
236 trackSequenceQueryRadReporter::trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles):
237 trackNN(trackNN), numFiles(numFiles) {
238 set = new std::set<std::pair<unsigned int, unsigned int> >;
239 count = new unsigned int[numFiles];
240 for (unsigned i = 0; i < numFiles; i++) {
241 count[i] = 0;
242 }
243 }
244
245 trackSequenceQueryRadReporter::~trackSequenceQueryRadReporter() {
246 delete set;
247 delete [] count;
248 }
249
250 void trackSequenceQueryRadReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
251 std::set<std::pair<unsigned int, unsigned int> >::iterator it;
252 std::pair<unsigned int, unsigned int> pair = std::make_pair(trackID, qpos); // only count this once
253 it = set->find(pair);
254 if (it == set->end()) {
255 set->insert(pair);
256 count[trackID]++; // only count if <tackID,qpos> pair is unique
257 }
258 }
259
260 void trackSequenceQueryRadReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
261 std::priority_queue < Radresult, std::vector<Radresult>, std::greater<Radresult> > result;
262 // KLUDGE: doing this backwards in an attempt to get the same
263 // tiebreak behaviour as before.
264 for (int i = numFiles-1; i >= 0; i--) {
265 Radresult r;
266 r.trackID = i;
267 r.count = count[i];
268 if(r.count > 0) {
269 result.push(r);
270 if (result.size() > trackNN) {
271 result.pop();
272 }
273 }
274 }
275
276 Radresult r;
277 std::vector<Radresult> v;
278 unsigned int size = result.size();
279 for(unsigned int k = 0; k < size; k++) {
280 r = result.top();
281 v.push_back(r);
282 result.pop();
283 }
284 std::vector<Radresult>::reverse_iterator rit;
285
286 if(adbQueryResponse==0) {
287 for(rit = v.rbegin(); rit < v.rend(); rit++) {
288 r = *rit;
289 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.count << std::endl;
290 }
291 } else {
292 // FIXME
293 } 235 }
294 } 236 }
295 237
296 // Another type of trackAveragingReporter that reports all pointNN nearest neighbours 238 // Another type of trackAveragingReporter that reports all pointNN nearest neighbours
297 template <class T> class trackSequenceQueryNNReporter : public trackAveragingReporter<T> { 239 template <class T> class trackSequenceQueryNNReporter : public trackAveragingReporter<T> {
300 using trackAveragingReporter<T>::queues; 242 using trackAveragingReporter<T>::queues;
301 using trackAveragingReporter<T>::trackNN; 243 using trackAveragingReporter<T>::trackNN;
302 using trackAveragingReporter<T>::pointNN; 244 using trackAveragingReporter<T>::pointNN;
303 public: 245 public:
304 trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles); 246 trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
305 void report(char *fileTable, adb__queryResponse *adbQueryResponse); 247 void report(char *fileTable, void *adbQueryResponse);
306 }; 248 };
307 249
308 template <class T> trackSequenceQueryNNReporter<T>::trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles) 250 template <class T> trackSequenceQueryNNReporter<T>::trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
309 :trackAveragingReporter<T>(pointNN, trackNN, numFiles){} 251 :trackAveragingReporter<T>(pointNN, trackNN, numFiles){}
310 252
311 template <class T> void trackSequenceQueryNNReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) { 253 template <class T> void trackSequenceQueryNNReporter<T>::report(char *fileTable, void *adbQueryResponse) {
312 std::priority_queue < NNresult, std::vector< NNresult>, T> result; 254 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
313 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles]; 255 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues
256 = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles];
314 257
315 for (int i = numFiles-1; i >= 0; i--) { 258 for (int i = numFiles-1; i >= 0; i--) {
316 unsigned int size = queues[i].size(); 259 unsigned int size = queues[i].size();
317 if (size > 0) { 260 if (size > 0) {
318 NNresult r; 261 NNresult r;
351 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue; 294 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue;
352 295
353 if(adbQueryResponse==0) { 296 if(adbQueryResponse==0) {
354 for(rit = v.rbegin(); rit < v.rend(); rit++) { 297 for(rit = v.rbegin(); rit < v.rend(); rit++) {
355 r = *rit; 298 r = *rit;
356 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.dist << std::endl; 299 if(fileTable)
300 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
301 else
302 std::cout << r.trackID << " ";
303 std::cout << r.dist << std::endl;
357 unsigned int qsize = point_queues[r.trackID].size(); 304 unsigned int qsize = point_queues[r.trackID].size();
358 // Reverse the order of the points stored in point_queues 305 // Reverse the order of the points stored in point_queues
359 for(unsigned int k=0; k < qsize; k++){ 306 for(unsigned int k=0; k < qsize; k++){
360 point_queue.push( point_queues[r.trackID].top() ); 307 point_queue.push( point_queues[r.trackID].top() );
361 point_queues[r.trackID].pop(); 308 point_queues[r.trackID].pop();
366 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl; 313 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl;
367 point_queue.pop(); 314 point_queue.pop();
368 } 315 }
369 } 316 }
370 } else { 317 } else {
371 adbQueryResponse->result.__sizeRlist=size; 318 ((adb__queryResponse*)adbQueryResponse)->result.__sizeRlist=size;
372 adbQueryResponse->result.__sizeDist=size; 319 ((adb__queryResponse*)adbQueryResponse)->result.__sizeDist=size;
373 adbQueryResponse->result.__sizeQpos=size; 320 ((adb__queryResponse*)adbQueryResponse)->result.__sizeQpos=size;
374 adbQueryResponse->result.__sizeSpos=size; 321 ((adb__queryResponse*)adbQueryResponse)->result.__sizeSpos=size;
375 adbQueryResponse->result.Rlist= new char*[size]; 322 ((adb__queryResponse*)adbQueryResponse)->result.Rlist= new char*[size];
376 adbQueryResponse->result.Dist = new double[size]; 323 ((adb__queryResponse*)adbQueryResponse)->result.Dist = new double[size];
377 adbQueryResponse->result.Qpos = new unsigned int[size]; 324 ((adb__queryResponse*)adbQueryResponse)->result.Qpos = new unsigned int[size];
378 adbQueryResponse->result.Spos = new unsigned int[size]; 325 ((adb__queryResponse*)adbQueryResponse)->result.Spos = new unsigned int[size];
379 unsigned int k = 0; 326 unsigned int k = 0;
380 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) { 327 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
381 r = *rit; 328 r = *rit;
382 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR]; 329 ((adb__queryResponse*)adbQueryResponse)->result.Rlist[k] = new char[O2_MAXFILESTR];
383 adbQueryResponse->result.Dist[k] = r.dist; 330 ((adb__queryResponse*)adbQueryResponse)->result.Dist[k] = r.dist;
384 adbQueryResponse->result.Qpos[k] = r.qpos; 331 ((adb__queryResponse*)adbQueryResponse)->result.Qpos[k] = r.qpos;
385 adbQueryResponse->result.Spos[k] = r.spos; 332 ((adb__queryResponse*)adbQueryResponse)->result.Spos[k] = r.spos;
386 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE); 333 if(fileTable)
334 snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
335 else
336 snprintf(((adb__queryResponse*)adbQueryResponse)->result.Rlist[k], O2_MAXFILESTR, "%d", r.trackID);
387 } 337 }
388 } 338 }
389 // clean up 339 // clean up
390 delete[] point_queues; 340 delete[] point_queues;
391 } 341 }
392 342
393 343 /********************** Radius Reporters **************************/
394 // track Sequence Query Radius NN Reporter 344
395 // retrieve tracks ordered by query-point matches (one per track per query point) 345 class triple{
396 // 346 public:
397 // as well as sorted n-NN points per retrieved track 347 unsigned int a;
398 class trackSequenceQueryRadNNReporter : public Reporter { 348 unsigned int b;
349 unsigned int c;
350
351 triple(void);
352 triple(unsigned int, unsigned int, unsigned int);
353 unsigned int first();
354 unsigned int second();
355 unsigned int third();
356 };
357
358 triple& make_triple(unsigned int, unsigned int, unsigned int);
359
360 triple::triple(unsigned int a, unsigned int b, unsigned int c):a(a),b(b),c(c){}
361
362 unsigned int triple::first(){return a;}
363 unsigned int triple::second(){return b;}
364 unsigned int triple::third(){return c;}
365
366 triple::triple():a(0),b(0),c(0){}
367
368 bool operator< (const triple &t1, const triple &t2) {
369 return ((t1.a < t2.a) ||
370 ((t1.a == t2.a) && ((t1.b < t2.b) ||
371 ((t1.b == t2.b) && (t1.c < t2.c)))));
372 }
373 bool operator== (const triple &t1, const triple &t2) {
374 return ((t1.a == t2.a) && (t1.b == t2.b) && (t1.c == t2.c));
375 }
376
377 triple& make_triple(unsigned int a, unsigned int b, unsigned int c){
378 triple* t = new triple(a,b,c);
379 return *t;
380 }
381
382
383 // track Sequence Query Radius Reporter
384 // only return tracks and retrieved point counts
385 class trackSequenceQueryRadReporter : public Reporter {
399 public: 386 public:
400 trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles); 387 trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles);
401 ~trackSequenceQueryRadNNReporter(); 388 ~trackSequenceQueryRadReporter();
402 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist); 389 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
403 void report(char *fileTable, adb__queryResponse *adbQueryResponse); 390 void report(char *fileTable, void *adbQueryResponse);
404 protected: 391 protected:
405 unsigned int pointNN;
406 unsigned int trackNN; 392 unsigned int trackNN;
407 unsigned int numFiles; 393 unsigned int numFiles;
408 std::set< NNresult > *set; 394 std::set<std::pair<unsigned int, unsigned int> > *set;
409 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues; 395 std::set< triple > *set_triple;
410 unsigned int *count; 396 unsigned int *count;
411 }; 397 };
412 398
413 trackSequenceQueryRadNNReporter::trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles): 399 trackSequenceQueryRadReporter::trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles):
414 pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) { 400 trackNN(trackNN), numFiles(numFiles) {
415 // Where to count Radius track matches (one-to-one) 401 set = new std::set<std::pair<unsigned int, unsigned int> >;
416 set = new std::set< NNresult >; 402 set_triple = new std::set<triple, std::less<triple> >;
417 // Where to insert individual point matches (one-to-many)
418 point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles];
419
420 count = new unsigned int[numFiles]; 403 count = new unsigned int[numFiles];
421 for (unsigned i = 0; i < numFiles; i++) { 404 for (unsigned i = 0; i < numFiles; i++) {
422 count[i] = 0; 405 count[i] = 0;
423 } 406 }
424 } 407 }
425 408
426 trackSequenceQueryRadNNReporter::~trackSequenceQueryRadNNReporter() { 409 trackSequenceQueryRadReporter::~trackSequenceQueryRadReporter() {
427 delete set; 410 delete set;
411 delete set_triple;
428 delete [] count; 412 delete [] count;
429 } 413 }
430 414
431 void trackSequenceQueryRadNNReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) { 415 void trackSequenceQueryRadReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
432 std::set< NNresult >::iterator it; 416 std::set<std::pair<unsigned int, unsigned int> >::iterator it;
433 NNresult r; 417 std::pair<unsigned int, unsigned int> pair = std::make_pair(trackID, qpos); // only count this once
434 r.trackID = trackID; 418 std::set<triple>::iterator it2;
435 r.qpos = qpos; 419 triple triple;
436 r.dist = dist; 420
437 r.spos = spos; 421 triple = make_triple(trackID, qpos, spos); // only count this once
438 422
439 // Record all matching points (within radius) 423 // Record unique <trackID,qpos,spos> triples (record one collision from all hash tables)
440 if (!isnan(dist)) { 424 it2 = set_triple->find(triple);
441 point_queues[trackID].push(r); 425
442 if(point_queues[trackID].size() > pointNN) 426 if(it2 == set_triple->end()){
443 point_queues[trackID].pop(); 427 set_triple->insert(triple);
444 } 428
445 429 it = set->find(pair);
446 // Record counts of <trackID,qpos> pairs 430 if (it == set->end()) {
447 it = set->find(r); 431 set->insert(pair);
448 if (it == set->end()) { 432 count[trackID]++; // only count if <tackID,qpos> pair is unique
449 set->insert(r); 433 }
450 count[trackID]++; 434 }
451 } 435 }
452 } 436
453 437 void trackSequenceQueryRadReporter::report(char *fileTable, void *adbQueryResponse) {
454 void trackSequenceQueryRadNNReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
455 std::priority_queue < Radresult, std::vector<Radresult>, std::greater<Radresult> > result; 438 std::priority_queue < Radresult, std::vector<Radresult>, std::greater<Radresult> > result;
456 // KLUDGE: doing this backwards in an attempt to get the same 439 // KLUDGE: doing this backwards in an attempt to get the same
457 // tiebreak behaviour as before. 440 // tiebreak behaviour as before.
458 for (int i = numFiles-1; i >= 0; i--) { 441 for (int i = numFiles-1; i >= 0; i--) {
459 Radresult r; 442 Radresult r;
473 for(unsigned int k = 0; k < size; k++) { 456 for(unsigned int k = 0; k < size; k++) {
474 r = result.top(); 457 r = result.top();
475 v.push_back(r); 458 v.push_back(r);
476 result.pop(); 459 result.pop();
477 } 460 }
461 std::vector<Radresult>::reverse_iterator rit;
462
463 if(adbQueryResponse==0) {
464 for(rit = v.rbegin(); rit < v.rend(); rit++) {
465 r = *rit;
466 if(fileTable)
467 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
468 else
469 std::cout << r.trackID << " ";
470 std::cout << r.count << std::endl;
471 }
472 } else {
473 // FIXME
474 }
475 }
476
477 // track Sequence Query Radius NN Reporter
478 // retrieve tracks ordered by query-point matches (one per track per query point)
479 //
480 // as well as sorted n-NN points per retrieved track
481 class trackSequenceQueryRadNNReporter : public Reporter {
482 public:
483 trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
484 ~trackSequenceQueryRadNNReporter();
485 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
486 void report(char *fileTable, void *adbQueryResponse);
487 protected:
488 unsigned int pointNN;
489 unsigned int trackNN;
490 unsigned int numFiles;
491 std::set<std::pair<unsigned int, unsigned int> > *set;
492 std::set< triple > *set_triple;
493 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues;
494 unsigned int *count;
495 };
496
497 trackSequenceQueryRadNNReporter::trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles):
498 pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
499 // Where to count Radius track matches (one-to-one)
500 set = new std::set<std::pair<unsigned int, unsigned int> >;
501 set_triple = new std::set<triple, std::less<triple> >;
502 // Where to insert individual point matches (one-to-many)
503 point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles];
504
505 count = new unsigned int[numFiles];
506 for (unsigned i = 0; i < numFiles; i++) {
507 count[i] = 0;
508 }
509 }
510
511 trackSequenceQueryRadNNReporter::~trackSequenceQueryRadNNReporter() {
512 delete set;
513 delete set_triple;
514 delete [] count;
515 }
516
517 void trackSequenceQueryRadNNReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
518 std::set<std::pair<unsigned int, unsigned int> >::iterator it;
519 std::set<triple>::iterator it2;
520 std::pair<unsigned int, unsigned int> pair;
521 triple triple;
522 NNresult r;
523
524 pair = std::make_pair(trackID, qpos); // only count this once
525 triple = make_triple(trackID, qpos, spos); // only count this once
526 // Record unique <trackID,qpos,spos> triples (record one collision from all hash tables)
527 it2 = set_triple->find(triple);
528 if(it2 == set_triple->end()){
529 set_triple->insert(triple);
530 // Record all matching points (within radius)
531 // Record counts of <trackID,qpos> pairs
532 it = set->find(pair);
533 if (it == set->end()) {
534 set->insert(pair);
535 count[trackID]++;
536 if (!isnan(dist)) {
537 r.trackID = trackID;
538 r.qpos = qpos;
539 r.dist = dist;
540 r.spos = spos;
541 point_queues[trackID].push(r);
542 if(point_queues[trackID].size() > pointNN)
543 point_queues[trackID].pop();
544 }
545 }
546 }
547 }
548
549 void trackSequenceQueryRadNNReporter::report(char *fileTable, void *adbQueryResponse) {
550 std::priority_queue < Radresult, std::vector<Radresult>, std::greater<Radresult> > result;
551 // KLUDGE: doing this backwards in an attempt to get the same
552 // tiebreak behaviour as before.
553 Radresult r;
554 NNresult rk;
555
556 for (int i = numFiles-1; i >= 0; i--) {
557 r.trackID = i;
558 r.count = count[i];
559 if(r.count > 0) {
560 cout.flush();
561 result.push(r);
562 if (result.size() > trackNN) {
563 result.pop();
564 }
565 }
566 }
567
568 std::vector<Radresult> v;
569 unsigned int size = result.size();
570 for(unsigned int k = 0; k < size; k++) {
571 r = result.top();
572 v.push_back(r);
573 result.pop();
574 }
478 575
479 576
480 // Traverse tracks in descending order of count cardinality 577 // Traverse tracks in descending order of count cardinality
481 std::vector<Radresult>::reverse_iterator rit; 578 std::vector<Radresult>::reverse_iterator rit;
482 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue; 579 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue;
483 580
484 if(adbQueryResponse==0) { 581 if(adbQueryResponse==0) {
485 for(rit = v.rbegin(); rit < v.rend(); rit++) { 582 for(rit = v.rbegin(); rit < v.rend(); rit++) {
486 r = *rit; 583 r = *rit;
487 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.count << std::endl; 584 if(fileTable)
585 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
586 else
587 std::cout << r.trackID << " ";
588 std::cout << r.count << std::endl;
488 589
489 // Reverse the order of the points stored in point_queues 590 // Reverse the order of the points stored in point_queues
490 unsigned int qsize=point_queues[r.trackID].size(); 591 unsigned int qsize=point_queues[r.trackID].size();
491 for(unsigned int k=0; k < qsize; k++){ 592 for(unsigned int k=0; k < qsize; k++){
492 point_queue.push(point_queues[r.trackID].top()); 593 point_queue.push(point_queues[r.trackID].top());
493 point_queues[r.trackID].pop(); 594 point_queues[r.trackID].pop();
494 } 595 }
495
496 for(unsigned int k=0; k < qsize; k++){ 596 for(unsigned int k=0; k < qsize; k++){
497 NNresult rk = point_queue.top(); 597 rk = point_queue.top();
498 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl; 598 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl;
499 point_queue.pop(); 599 point_queue.pop();
500 } 600 }
501 } 601 }
502 } else { 602 } else {
503 // FIXME 603 // FIXME
504 } 604 }
505 delete[] point_queues; 605 delete[] point_queues;
506 } 606 }
507
508 607
509 /********** ONE-TO-ONE REPORTERS *****************/ 608 /********** ONE-TO-ONE REPORTERS *****************/
510 609
511 // track Sequence Query Radius NN Reporter One-to-One 610 // track Sequence Query Radius NN Reporter One-to-One
512 // for each query point find the single best matching target point in all database 611 // for each query point find the single best matching target point in all database
514 class trackSequenceQueryRadNNReporterOneToOne : public Reporter { 613 class trackSequenceQueryRadNNReporterOneToOne : public Reporter {
515 public: 614 public:
516 trackSequenceQueryRadNNReporterOneToOne(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles); 615 trackSequenceQueryRadNNReporterOneToOne(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
517 ~trackSequenceQueryRadNNReporterOneToOne(); 616 ~trackSequenceQueryRadNNReporterOneToOne();
518 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist); 617 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
519 void report(char *fileTable, adb__queryResponse *adbQueryResponse); 618 void report(char *fileTable, void *adbQueryResponse);
520 protected: 619 protected:
521 unsigned int pointNN; 620 unsigned int pointNN;
522 unsigned int trackNN; 621 unsigned int trackNN;
523 unsigned int numFiles; 622 unsigned int numFiles;
524 std::set< NNresult > *set; 623 std::set< NNresult > *set;
562 if (r.dist < (*point_queue)[r.qpos].dist) 661 if (r.dist < (*point_queue)[r.qpos].dist)
563 (*point_queue)[r.qpos] = r; 662 (*point_queue)[r.qpos] = r;
564 663
565 } 664 }
566 665
567 void trackSequenceQueryRadNNReporterOneToOne::report(char *fileTable, adb__queryResponse *adbQueryResponse) { 666 void trackSequenceQueryRadNNReporterOneToOne::report(char *fileTable, void *adbQueryResponse) {
568 if(adbQueryResponse==0) { 667 if(adbQueryResponse==0) {
569 std::vector< NNresult >::iterator vit; 668 std::vector< NNresult >::iterator vit;
570 NNresult rk; 669 NNresult rk;
571 for( vit = point_queue->begin() ; vit < point_queue->end() ; vit++ ){ 670 for( vit = point_queue->begin() ; vit < point_queue->end() ; vit++ ){
572 rk = *vit; 671 rk = *vit;
573 std::cout << rk.dist << " " 672 std::cout << rk.dist << " "
574 << rk.qpos << " " 673 << rk.qpos << " "
575 << rk.spos << " " 674 << rk.spos << " ";
576 << fileTable + rk.trackID*O2_FILETABLE_ENTRY_SIZE 675 if(fileTable)
577 << std::endl; 676 std::cout << fileTable + rk.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
677 else
678 std::cout << rk.trackID << " ";
679 std::cout << std::endl;
578 } 680 }
579 } else { 681 } else {
580 // FIXME 682 // FIXME
581 } 683 }
582 } 684 }
685
686 #endif