annotate reporter.h @ 279:dee55886eca0 sampling

make the RNG a part of the audioDB object. Easier to deal with memory discipline and initialization (though note the FIXME comment in audioDB::initTables()). Also initialize the RNG from the current time. A mature implementation would use a proper source of entropy...
author mas01cr
date Wed, 02 Jul 2008 13:53:23 +0000
parents 1cec738101a8
children d209e8470a60
rev   line source
mas01cr@239 1 #include <utility>
mas01cr@239 2 #include <queue>
mas01mc@264 3 #include <deque>
mas01cr@239 4 #include <set>
mas01cr@239 5 #include <functional>
mas01cr@239 6
mas01cr@239 7 typedef struct nnresult {
mas01cr@239 8 unsigned int trackID;
mas01cr@239 9 double dist;
mas01cr@239 10 unsigned int qpos;
mas01cr@239 11 unsigned int spos;
mas01cr@239 12 } NNresult;
mas01cr@239 13
mas01cr@239 14 typedef struct radresult {
mas01cr@239 15 unsigned int trackID;
mas01cr@239 16 unsigned int count;
mas01cr@239 17 } Radresult;
mas01cr@239 18
mas01cr@239 19 bool operator< (const NNresult &a, const NNresult &b) {
mas01cr@239 20 return a.dist < b.dist;
mas01cr@239 21 }
mas01cr@239 22
mas01cr@239 23 bool operator> (const NNresult &a, const NNresult &b) {
mas01cr@239 24 return a.dist > b.dist;
mas01cr@239 25 }
mas01cr@239 26
mas01cr@239 27 bool operator< (const Radresult &a, const Radresult &b) {
mas01cr@239 28 return a.count < b.count;
mas01cr@239 29 }
mas01cr@239 30
mas01cr@239 31 class Reporter {
mas01cr@239 32 public:
mas01cr@239 33 virtual ~Reporter() {};
mas01cr@239 34 virtual void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) = 0;
mas01cr@239 35 // FIXME: this interface is a bit wacky: a relic of previous, more
mas01cr@239 36 // confused times. Really it might make sense to have separate
mas01cr@239 37 // reporter classes for WS and for stdout, rather than passing this
mas01cr@239 38 // adbQueryResponse thing everywhere; the fileTable argument is
mas01cr@239 39 // there solely for convertion trackIDs into names. -- CSR,
mas01cr@239 40 // 2007-12-10.
mas01cr@239 41 virtual void report(char *fileTable, adb__queryResponse *adbQueryResponse) = 0;
mas01cr@239 42 };
mas01cr@239 43
mas01cr@239 44 template <class T> class pointQueryReporter : public Reporter {
mas01cr@239 45 public:
mas01cr@239 46 pointQueryReporter(unsigned int pointNN);
mas01cr@239 47 ~pointQueryReporter();
mas01cr@239 48 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 49 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01cr@239 50 private:
mas01cr@239 51 unsigned int pointNN;
mas01cr@239 52 std::priority_queue< NNresult, std::vector< NNresult >, T> *queue;
mas01cr@239 53 };
mas01cr@239 54
mas01cr@239 55 template <class T> pointQueryReporter<T>::pointQueryReporter(unsigned int pointNN)
mas01cr@239 56 : pointNN(pointNN) {
mas01cr@239 57 queue = new std::priority_queue< NNresult, std::vector< NNresult >, T>;
mas01cr@239 58 }
mas01cr@239 59
mas01cr@239 60 template <class T> pointQueryReporter<T>::~pointQueryReporter() {
mas01cr@239 61 delete queue;
mas01cr@239 62 }
mas01cr@239 63
mas01cr@239 64 template <class T> void pointQueryReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@242 65 if (!isnan(dist)) {
mas01cr@242 66 NNresult r;
mas01cr@242 67 r.trackID = trackID;
mas01cr@242 68 r.qpos = qpos;
mas01cr@242 69 r.spos = spos;
mas01cr@242 70 r.dist = dist;
mas01cr@242 71 queue->push(r);
mas01cr@242 72 if(queue->size() > pointNN) {
mas01cr@242 73 queue->pop();
mas01cr@242 74 }
mas01cr@239 75 }
mas01cr@239 76 }
mas01cr@239 77
mas01cr@239 78 template <class T> void pointQueryReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 79 NNresult r;
mas01cr@239 80 std::vector<NNresult> v;
mas01cr@239 81 unsigned int size = queue->size();
mas01cr@239 82 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 83 r = queue->top();
mas01cr@239 84 v.push_back(r);
mas01cr@239 85 queue->pop();
mas01cr@239 86 }
mas01cr@239 87 std::vector<NNresult>::reverse_iterator rit;
mas01cr@239 88
mas01cr@239 89 if(adbQueryResponse==0) {
mas01cr@239 90 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 91 r = *rit;
mas01cr@256 92 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
mas01cr@239 93 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
mas01cr@239 94 }
mas01cr@239 95 } else {
mas01cr@239 96 adbQueryResponse->result.__sizeRlist=size;
mas01cr@239 97 adbQueryResponse->result.__sizeDist=size;
mas01cr@239 98 adbQueryResponse->result.__sizeQpos=size;
mas01cr@239 99 adbQueryResponse->result.__sizeSpos=size;
mas01cr@239 100 adbQueryResponse->result.Rlist= new char*[size];
mas01cr@239 101 adbQueryResponse->result.Dist = new double[size];
mas01cr@239 102 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01cr@239 103 adbQueryResponse->result.Spos = new unsigned int[size];
mas01cr@239 104 unsigned int k = 0;
mas01cr@239 105 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01cr@239 106 r = *rit;
mas01cr@239 107 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01cr@239 108 adbQueryResponse->result.Dist[k] = r.dist;
mas01cr@239 109 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01cr@239 110 adbQueryResponse->result.Spos[k] = r.spos;
mas01cr@256 111 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
mas01cr@239 112 }
mas01cr@239 113 }
mas01cr@239 114 }
mas01cr@239 115
mas01cr@239 116 template <class T> class trackAveragingReporter : public Reporter {
mas01cr@239 117 public:
mas01cr@239 118 trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
mas01cr@239 119 ~trackAveragingReporter();
mas01cr@239 120 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 121 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01mc@249 122 protected:
mas01cr@239 123 unsigned int pointNN;
mas01cr@239 124 unsigned int trackNN;
mas01cr@239 125 unsigned int numFiles;
mas01cr@239 126 std::priority_queue< NNresult, std::vector< NNresult>, T > *queues;
mas01cr@239 127 };
mas01cr@239 128
mas01cr@239 129 template <class T> trackAveragingReporter<T>::trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
mas01cr@239 130 : pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
mas01cr@239 131 queues = new std::priority_queue< NNresult, std::vector< NNresult>, T >[numFiles];
mas01cr@239 132 }
mas01cr@239 133
mas01cr@239 134 template <class T> trackAveragingReporter<T>::~trackAveragingReporter() {
mas01cr@239 135 delete [] queues;
mas01cr@239 136 }
mas01cr@239 137
mas01cr@239 138 template <class T> void trackAveragingReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@242 139 if (!isnan(dist)) {
mas01cr@242 140 NNresult r;
mas01cr@242 141 r.trackID = trackID;
mas01cr@242 142 r.qpos = qpos;
mas01cr@242 143 r.spos = spos;
mas01cr@242 144 r.dist = dist;
mas01cr@242 145 queues[trackID].push(r);
mas01cr@242 146 if(queues[trackID].size() > pointNN) {
mas01cr@242 147 queues[trackID].pop();
mas01cr@242 148 }
mas01cr@239 149 }
mas01cr@239 150 }
mas01cr@239 151
mas01cr@239 152 template <class T> void trackAveragingReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 153 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
mas01cr@239 154 for (int i = numFiles-1; i >= 0; i--) {
mas01cr@239 155 unsigned int size = queues[i].size();
mas01cr@239 156 if (size > 0) {
mas01cr@239 157 NNresult r;
mas01cr@239 158 double dist = 0;
mas01cr@239 159 NNresult oldr = queues[i].top();
mas01cr@239 160 for (unsigned int j = 0; j < size; j++) {
mas01cr@239 161 r = queues[i].top();
mas01cr@239 162 dist += r.dist;
mas01cr@239 163 queues[i].pop();
mas01cr@239 164 if (r.dist == oldr.dist) {
mas01cr@239 165 r.qpos = oldr.qpos;
mas01cr@239 166 r.spos = oldr.spos;
mas01cr@239 167 } else {
mas01cr@239 168 oldr = r;
mas01cr@239 169 }
mas01cr@239 170 }
mas01cr@239 171 dist /= size;
mas01cr@239 172 r.dist = dist; // trackID, qpos and spos are magically right already.
mas01cr@239 173 result.push(r);
mas01cr@239 174 if (result.size() > trackNN) {
mas01cr@239 175 result.pop();
mas01cr@239 176 }
mas01cr@239 177 }
mas01cr@239 178 }
mas01cr@239 179
mas01cr@239 180 NNresult r;
mas01cr@239 181 std::vector<NNresult> v;
mas01cr@239 182 unsigned int size = result.size();
mas01cr@239 183 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 184 r = result.top();
mas01cr@239 185 v.push_back(r);
mas01cr@239 186 result.pop();
mas01cr@239 187 }
mas01cr@239 188 std::vector<NNresult>::reverse_iterator rit;
mas01cr@239 189
mas01cr@239 190 if(adbQueryResponse==0) {
mas01cr@239 191 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 192 r = *rit;
mas01cr@256 193 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " ";
mas01cr@239 194 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
mas01cr@239 195 }
mas01cr@239 196 } else {
mas01cr@239 197 adbQueryResponse->result.__sizeRlist=size;
mas01cr@239 198 adbQueryResponse->result.__sizeDist=size;
mas01cr@239 199 adbQueryResponse->result.__sizeQpos=size;
mas01cr@239 200 adbQueryResponse->result.__sizeSpos=size;
mas01cr@239 201 adbQueryResponse->result.Rlist= new char*[size];
mas01cr@239 202 adbQueryResponse->result.Dist = new double[size];
mas01cr@239 203 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01cr@239 204 adbQueryResponse->result.Spos = new unsigned int[size];
mas01cr@239 205 unsigned int k = 0;
mas01cr@239 206 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01cr@239 207 r = *rit;
mas01cr@239 208 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01cr@239 209 adbQueryResponse->result.Dist[k] = r.dist;
mas01cr@239 210 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01cr@239 211 adbQueryResponse->result.Spos[k] = r.spos;
mas01cr@256 212 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
mas01cr@239 213 }
mas01cr@239 214 }
mas01cr@239 215 }
mas01cr@239 216
mas01mc@250 217 // track Sequence Query Radius Reporter
mas01mc@250 218 // only return tracks and retrieved point counts
mas01cr@239 219 class trackSequenceQueryRadReporter : public Reporter {
mas01cr@239 220 public:
mas01cr@239 221 trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles);
mas01cr@239 222 ~trackSequenceQueryRadReporter();
mas01cr@239 223 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 224 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01mc@249 225 protected:
mas01cr@239 226 unsigned int trackNN;
mas01cr@239 227 unsigned int numFiles;
mas01cr@239 228 std::set<std::pair<unsigned int, unsigned int> > *set;
mas01cr@239 229 unsigned int *count;
mas01cr@239 230 };
mas01cr@239 231
mas01cr@239 232 trackSequenceQueryRadReporter::trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles):
mas01cr@239 233 trackNN(trackNN), numFiles(numFiles) {
mas01cr@239 234 set = new std::set<std::pair<unsigned int, unsigned int> >;
mas01cr@239 235 count = new unsigned int[numFiles];
mas01cr@239 236 for (unsigned i = 0; i < numFiles; i++) {
mas01cr@239 237 count[i] = 0;
mas01cr@239 238 }
mas01cr@239 239 }
mas01cr@239 240
mas01cr@239 241 trackSequenceQueryRadReporter::~trackSequenceQueryRadReporter() {
mas01cr@239 242 delete set;
mas01cr@239 243 delete [] count;
mas01cr@239 244 }
mas01cr@239 245
mas01cr@239 246 void trackSequenceQueryRadReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@239 247 std::set<std::pair<unsigned int, unsigned int> >::iterator it;
mas01mc@250 248 std::pair<unsigned int, unsigned int> pair = std::make_pair(trackID, qpos); // only count this once
mas01cr@239 249 it = set->find(pair);
mas01cr@239 250 if (it == set->end()) {
mas01cr@239 251 set->insert(pair);
mas01mc@250 252 count[trackID]++; // only count if <tackID,qpos> pair is unique
mas01cr@239 253 }
mas01cr@239 254 }
mas01cr@239 255
mas01cr@239 256 void trackSequenceQueryRadReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 257 std::priority_queue < Radresult > result;
mas01cr@239 258 // KLUDGE: doing this backwards in an attempt to get the same
mas01cr@239 259 // tiebreak behaviour as before.
mas01cr@239 260 for (int i = numFiles-1; i >= 0; i--) {
mas01cr@239 261 Radresult r;
mas01cr@239 262 r.trackID = i;
mas01cr@239 263 r.count = count[i];
mas01cr@239 264 if(r.count > 0) {
mas01cr@239 265 result.push(r);
mas01cr@239 266 if (result.size() > trackNN) {
mas01cr@239 267 result.pop();
mas01cr@239 268 }
mas01cr@239 269 }
mas01cr@239 270 }
mas01cr@239 271
mas01cr@239 272 Radresult r;
mas01cr@239 273 std::vector<Radresult> v;
mas01cr@239 274 unsigned int size = result.size();
mas01cr@239 275 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 276 r = result.top();
mas01cr@239 277 v.push_back(r);
mas01cr@239 278 result.pop();
mas01cr@239 279 }
mas01cr@239 280 std::vector<Radresult>::reverse_iterator rit;
mas01cr@239 281
mas01cr@239 282 if(adbQueryResponse==0) {
mas01cr@239 283 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 284 r = *rit;
mas01cr@256 285 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.count << std::endl;
mas01cr@239 286 }
mas01cr@239 287 } else {
mas01cr@239 288 // FIXME
mas01cr@239 289 }
mas01cr@239 290 }
mas01mc@248 291
mas01mc@249 292 // Another type of trackAveragingReporter that reports all pointNN nearest neighbours
mas01mc@249 293 template <class T> class trackSequenceQueryNNReporter : public trackAveragingReporter<T> {
mas01mc@249 294 protected:
mas01mc@249 295 using trackAveragingReporter<T>::numFiles;
mas01mc@249 296 using trackAveragingReporter<T>::queues;
mas01mc@249 297 using trackAveragingReporter<T>::trackNN;
mas01mc@249 298 using trackAveragingReporter<T>::pointNN;
mas01mc@248 299 public:
mas01mc@248 300 trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
mas01mc@248 301 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01mc@248 302 };
mas01mc@248 303
mas01mc@249 304 template <class T> trackSequenceQueryNNReporter<T>::trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
mas01mc@249 305 :trackAveragingReporter<T>(pointNN, trackNN, numFiles){}
mas01mc@248 306
mas01mc@248 307 template <class T> void trackSequenceQueryNNReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01mc@248 308 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
mas01mc@250 309 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles];
mas01mc@249 310
mas01mc@248 311 for (int i = numFiles-1; i >= 0; i--) {
mas01mc@248 312 unsigned int size = queues[i].size();
mas01mc@248 313 if (size > 0) {
mas01mc@248 314 NNresult r;
mas01mc@248 315 double dist = 0;
mas01mc@248 316 NNresult oldr = queues[i].top();
mas01mc@248 317 for (unsigned int j = 0; j < size; j++) {
mas01mc@248 318 r = queues[i].top();
mas01mc@248 319 dist += r.dist;
mas01mc@248 320 point_queues[i].push(r);
mas01mc@249 321 queues[i].pop();
mas01mc@248 322 if (r.dist == oldr.dist) {
mas01mc@248 323 r.qpos = oldr.qpos;
mas01mc@248 324 r.spos = oldr.spos;
mas01mc@248 325 } else {
mas01mc@248 326 oldr = r;
mas01mc@248 327 }
mas01mc@248 328 }
mas01mc@248 329 dist /= size;
mas01mc@248 330 r.dist = dist; // trackID, qpos and spos are magically right already.
mas01mc@248 331 result.push(r);
mas01mc@248 332 if (result.size() > trackNN) {
mas01mc@248 333 result.pop();
mas01mc@248 334 }
mas01mc@248 335 }
mas01mc@248 336 }
mas01mc@248 337
mas01mc@248 338 NNresult r;
mas01mc@248 339 std::vector<NNresult> v;
mas01mc@248 340 unsigned int size = result.size();
mas01mc@248 341 for(unsigned int k = 0; k < size; k++) {
mas01mc@248 342 r = result.top();
mas01mc@248 343 v.push_back(r);
mas01mc@248 344 result.pop();
mas01mc@248 345 }
mas01mc@248 346 std::vector<NNresult>::reverse_iterator rit;
mas01mc@264 347 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue;
mas01mc@264 348
mas01mc@248 349 if(adbQueryResponse==0) {
mas01mc@248 350 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01mc@248 351 r = *rit;
mas01cr@256 352 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.dist << std::endl;
mas01mc@264 353 unsigned int qsize = point_queues[r.trackID].size();
mas01mc@264 354 // Reverse the order of the points stored in point_queues
mas01mc@264 355 for(unsigned int k=0; k < qsize; k++){
mas01mc@264 356 point_queue.push( point_queues[r.trackID].top() );
mas01mc@264 357 point_queues[r.trackID].pop();
mas01mc@264 358 }
mas01mc@264 359
mas01mc@264 360 for(unsigned int k = 0; k < qsize; k++) {
mas01mc@264 361 NNresult rk = point_queue.top();
mas01mc@248 362 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl;
mas01mc@264 363 point_queue.pop();
mas01mc@248 364 }
mas01mc@248 365 }
mas01mc@248 366 } else {
mas01mc@248 367 adbQueryResponse->result.__sizeRlist=size;
mas01mc@248 368 adbQueryResponse->result.__sizeDist=size;
mas01mc@248 369 adbQueryResponse->result.__sizeQpos=size;
mas01mc@248 370 adbQueryResponse->result.__sizeSpos=size;
mas01mc@248 371 adbQueryResponse->result.Rlist= new char*[size];
mas01mc@248 372 adbQueryResponse->result.Dist = new double[size];
mas01mc@248 373 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01mc@248 374 adbQueryResponse->result.Spos = new unsigned int[size];
mas01mc@248 375 unsigned int k = 0;
mas01mc@248 376 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01mc@248 377 r = *rit;
mas01mc@248 378 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01mc@248 379 adbQueryResponse->result.Dist[k] = r.dist;
mas01mc@248 380 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01mc@248 381 adbQueryResponse->result.Spos[k] = r.spos;
mas01cr@256 382 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLE_ENTRY_SIZE);
mas01mc@248 383 }
mas01mc@248 384 }
mas01mc@248 385 // clean up
mas01mc@248 386 delete[] point_queues;
mas01mc@248 387 }
mas01mc@250 388
mas01mc@250 389
mas01mc@250 390 // track Sequence Query Radius NN Reporter
mas01mc@250 391 // retrieve tracks ordered by query-point matches (one per track per query point)
mas01mc@250 392 //
mas01mc@250 393 // as well as sorted n-NN points per retrieved track
mas01mc@250 394 class trackSequenceQueryRadNNReporter : public Reporter {
mas01mc@250 395 public:
mas01mc@250 396 trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
mas01mc@250 397 ~trackSequenceQueryRadNNReporter();
mas01mc@250 398 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01mc@250 399 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01mc@250 400 protected:
mas01mc@250 401 unsigned int pointNN;
mas01mc@250 402 unsigned int trackNN;
mas01mc@250 403 unsigned int numFiles;
mas01mc@250 404 std::set< NNresult > *set;
mas01mc@250 405 std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> > *point_queues;
mas01mc@250 406 unsigned int *count;
mas01mc@250 407 };
mas01mc@250 408
mas01mc@250 409 trackSequenceQueryRadNNReporter::trackSequenceQueryRadNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles):
mas01mc@250 410 pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
mas01mc@250 411 // Where to count Radius track matches (one-to-one)
mas01mc@250 412 set = new std::set< NNresult >;
mas01mc@250 413 // Where to insert individual point matches (one-to-many)
mas01mc@250 414 point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::less<NNresult> >[numFiles];
mas01mc@250 415
mas01mc@250 416 count = new unsigned int[numFiles];
mas01mc@250 417 for (unsigned i = 0; i < numFiles; i++) {
mas01mc@250 418 count[i] = 0;
mas01mc@250 419 }
mas01mc@250 420 }
mas01mc@250 421
mas01mc@250 422 trackSequenceQueryRadNNReporter::~trackSequenceQueryRadNNReporter() {
mas01mc@250 423 delete set;
mas01mc@250 424 delete [] count;
mas01mc@250 425 }
mas01mc@250 426
mas01mc@250 427 void trackSequenceQueryRadNNReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01mc@250 428 std::set< NNresult >::iterator it;
mas01mc@250 429 NNresult r;
mas01mc@250 430 r.trackID = trackID;
mas01mc@250 431 r.qpos = qpos;
mas01mc@250 432 r.dist = dist;
mas01mc@250 433 r.spos = spos;
mas01mc@250 434
mas01mc@250 435 // Record all matching points (within radius)
mas01mc@250 436 if (!isnan(dist)) {
mas01mc@250 437 point_queues[trackID].push(r);
mas01mc@250 438 if(point_queues[trackID].size() > pointNN)
mas01mc@250 439 point_queues[trackID].pop();
mas01mc@250 440 }
mas01mc@250 441
mas01mc@250 442 // Record counts of <trackID,qpos> pairs
mas01mc@250 443 it = set->find(r);
mas01mc@250 444 if (it == set->end()) {
mas01mc@250 445 set->insert(r);
mas01mc@250 446 count[trackID]++;
mas01mc@250 447 }
mas01mc@250 448 }
mas01mc@250 449
mas01mc@250 450 void trackSequenceQueryRadNNReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01mc@250 451 std::priority_queue < Radresult > result;
mas01mc@250 452 // KLUDGE: doing this backwards in an attempt to get the same
mas01mc@250 453 // tiebreak behaviour as before.
mas01mc@250 454 for (int i = numFiles-1; i >= 0; i--) {
mas01mc@250 455 Radresult r;
mas01mc@250 456 r.trackID = i;
mas01mc@250 457 r.count = count[i];
mas01mc@250 458 if(r.count > 0) {
mas01mc@250 459 result.push(r);
mas01mc@250 460 if (result.size() > trackNN) {
mas01mc@250 461 result.pop();
mas01mc@250 462 }
mas01mc@250 463 }
mas01mc@250 464 }
mas01mc@250 465
mas01mc@250 466 Radresult r;
mas01mc@250 467 std::vector<Radresult> v;
mas01mc@250 468 unsigned int size = result.size();
mas01mc@250 469 for(unsigned int k = 0; k < size; k++) {
mas01mc@250 470 r = result.top();
mas01mc@250 471 v.push_back(r);
mas01mc@250 472 result.pop();
mas01mc@250 473 }
mas01mc@264 474
mas01mc@264 475
mas01mc@264 476 // Traverse tracks in descending order of count cardinality
mas01mc@250 477 std::vector<Radresult>::reverse_iterator rit;
mas01mc@264 478 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > point_queue;
mas01mc@264 479
mas01mc@250 480 if(adbQueryResponse==0) {
mas01mc@250 481 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01mc@250 482 r = *rit;
mas01cr@256 483 std::cout << fileTable + r.trackID*O2_FILETABLE_ENTRY_SIZE << " " << r.count << std::endl;
mas01mc@264 484
mas01mc@264 485 // Reverse the order of the points stored in point_queues
mas01mc@264 486 unsigned int qsize=point_queues[r.trackID].size();
mas01mc@264 487 for(unsigned int k=0; k < qsize; k++){
mas01mc@264 488 point_queue.push(point_queues[r.trackID].top());
mas01mc@264 489 point_queues[r.trackID].pop();
mas01mc@264 490 }
mas01mc@264 491
mas01mc@264 492 for(unsigned int k=0; k < qsize; k++){
mas01mc@264 493 NNresult rk = point_queue.top();
mas01mc@250 494 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl;
mas01mc@264 495 point_queue.pop();
mas01mc@250 496 }
mas01mc@250 497 }
mas01mc@250 498 } else {
mas01mc@250 499 // FIXME
mas01mc@250 500 }
mas01mc@264 501 delete[] point_queues;
mas01mc@250 502 }
mas01mc@263 503
mas01mc@263 504
mas01mc@264 505 /********** ONE-TO-ONE REPORTERS *****************/
mas01mc@263 506
mas01mc@264 507 // track Sequence Query Radius NN Reporter One-to-One
mas01mc@264 508 // for each query point find the single best matching target point in all database
mas01mc@264 509 // report qpos, spos and trackID
mas01mc@263 510 class trackSequenceQueryRadNNReporterOneToOne : public Reporter {
mas01mc@263 511 public:
mas01mc@263 512 trackSequenceQueryRadNNReporterOneToOne(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
mas01mc@263 513 ~trackSequenceQueryRadNNReporterOneToOne();
mas01mc@263 514 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01mc@263 515 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01mc@263 516 protected:
mas01mc@263 517 unsigned int pointNN;
mas01mc@263 518 unsigned int trackNN;
mas01mc@263 519 unsigned int numFiles;
mas01mc@263 520 std::set< NNresult > *set;
mas01mc@263 521 std::vector< NNresult> *point_queue;
mas01mc@263 522 unsigned int *count;
mas01mc@263 523
mas01mc@263 524 };
mas01mc@263 525
mas01mc@263 526 trackSequenceQueryRadNNReporterOneToOne::trackSequenceQueryRadNNReporterOneToOne(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles):
mas01mc@263 527 pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
mas01mc@263 528 // Where to count Radius track matches (one-to-one)
mas01mc@263 529 set = new std::set< NNresult >;
mas01mc@263 530 // Where to insert individual point matches (one-to-many)
mas01mc@263 531 point_queue = new std::vector< NNresult >;
mas01mc@263 532
mas01mc@263 533 count = new unsigned int[numFiles];
mas01mc@263 534 for (unsigned i = 0; i < numFiles; i++) {
mas01mc@263 535 count[i] = 0;
mas01mc@263 536 }
mas01mc@263 537 }
mas01mc@263 538
mas01mc@263 539 trackSequenceQueryRadNNReporterOneToOne::~trackSequenceQueryRadNNReporterOneToOne() {
mas01mc@263 540 delete set;
mas01mc@263 541 delete [] count;
mas01mc@263 542 }
mas01mc@263 543
mas01mc@263 544 void trackSequenceQueryRadNNReporterOneToOne::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01mc@263 545 std::set< NNresult >::iterator it;
mas01mc@263 546 NNresult r;
mas01mc@264 547
mas01mc@263 548 r.qpos = qpos;
mas01mc@263 549 r.trackID = trackID;
mas01mc@263 550 r.spos = spos;
mas01mc@263 551 r.dist = dist;
mas01mc@263 552
mas01mc@263 553 if(point_queue->size() < r.qpos + 1){
mas01mc@263 554 point_queue->resize( r.qpos + 1 );
mas01mc@263 555 (*point_queue)[r.qpos].dist = 1e6;
mas01mc@263 556 }
mas01mc@263 557
mas01mc@263 558 if (r.dist < (*point_queue)[r.qpos].dist)
mas01mc@263 559 (*point_queue)[r.qpos] = r;
mas01mc@263 560
mas01mc@263 561 }
mas01mc@263 562
mas01mc@263 563 void trackSequenceQueryRadNNReporterOneToOne::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01mc@263 564 if(adbQueryResponse==0) {
mas01mc@263 565 std::vector< NNresult >::iterator vit;
mas01mc@263 566 NNresult rk;
mas01mc@263 567 for( vit = point_queue->begin() ; vit < point_queue->end() ; vit++ ){
mas01mc@263 568 rk = *vit;
mas01mc@263 569 std::cout << rk.dist << " "
mas01mc@263 570 << rk.qpos << " "
mas01mc@263 571 << rk.spos << " "
mas01mc@263 572 << fileTable + rk.trackID*O2_FILETABLE_ENTRY_SIZE
mas01mc@263 573 << std::endl;
mas01mc@263 574 }
mas01mc@263 575 } else {
mas01mc@263 576 // FIXME
mas01mc@263 577 }
mas01mc@263 578 }