Mercurial > hg > audiodb
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 |