annotate reporter.h @ 248:5682c7d7444b

Added new query type: nsequence : this reports the n-nearest neighbours for each track in a sequence averaging query. Next up is the same for the radius search (still accessed via nsequence but with -R set non zero)
author mas01mc
date Sun, 17 Feb 2008 14:56:02 +0000
parents 5ac5c23de715
children 1da9a9ed55a3
rev   line source
mas01cr@239 1 #include <utility>
mas01cr@239 2 #include <queue>
mas01cr@239 3 #include <set>
mas01cr@239 4 #include <functional>
mas01cr@239 5
mas01cr@239 6 typedef struct nnresult {
mas01cr@239 7 unsigned int trackID;
mas01cr@239 8 double dist;
mas01cr@239 9 unsigned int qpos;
mas01cr@239 10 unsigned int spos;
mas01cr@239 11 } NNresult;
mas01cr@239 12
mas01cr@239 13 typedef struct radresult {
mas01cr@239 14 unsigned int trackID;
mas01cr@239 15 unsigned int count;
mas01cr@239 16 } Radresult;
mas01cr@239 17
mas01cr@239 18 bool operator< (const NNresult &a, const NNresult &b) {
mas01cr@239 19 return a.dist < b.dist;
mas01cr@239 20 }
mas01cr@239 21
mas01cr@239 22 bool operator> (const NNresult &a, const NNresult &b) {
mas01cr@239 23 return a.dist > b.dist;
mas01cr@239 24 }
mas01cr@239 25
mas01cr@239 26 bool operator< (const Radresult &a, const Radresult &b) {
mas01cr@239 27 return a.count < b.count;
mas01cr@239 28 }
mas01cr@239 29
mas01cr@239 30 class Reporter {
mas01cr@239 31 public:
mas01cr@239 32 virtual ~Reporter() {};
mas01cr@239 33 virtual void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) = 0;
mas01cr@239 34 // FIXME: this interface is a bit wacky: a relic of previous, more
mas01cr@239 35 // confused times. Really it might make sense to have separate
mas01cr@239 36 // reporter classes for WS and for stdout, rather than passing this
mas01cr@239 37 // adbQueryResponse thing everywhere; the fileTable argument is
mas01cr@239 38 // there solely for convertion trackIDs into names. -- CSR,
mas01cr@239 39 // 2007-12-10.
mas01cr@239 40 virtual void report(char *fileTable, adb__queryResponse *adbQueryResponse) = 0;
mas01cr@239 41 };
mas01cr@239 42
mas01cr@239 43 template <class T> class pointQueryReporter : public Reporter {
mas01cr@239 44 public:
mas01cr@239 45 pointQueryReporter(unsigned int pointNN);
mas01cr@239 46 ~pointQueryReporter();
mas01cr@239 47 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 48 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01cr@239 49 private:
mas01cr@239 50 unsigned int pointNN;
mas01cr@239 51 std::priority_queue< NNresult, std::vector< NNresult >, T> *queue;
mas01cr@239 52 };
mas01cr@239 53
mas01cr@239 54 template <class T> pointQueryReporter<T>::pointQueryReporter(unsigned int pointNN)
mas01cr@239 55 : pointNN(pointNN) {
mas01cr@239 56 queue = new std::priority_queue< NNresult, std::vector< NNresult >, T>;
mas01cr@239 57 }
mas01cr@239 58
mas01cr@239 59 template <class T> pointQueryReporter<T>::~pointQueryReporter() {
mas01cr@239 60 delete queue;
mas01cr@239 61 }
mas01cr@239 62
mas01cr@239 63 template <class T> void pointQueryReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@242 64 if (!isnan(dist)) {
mas01cr@242 65 NNresult r;
mas01cr@242 66 r.trackID = trackID;
mas01cr@242 67 r.qpos = qpos;
mas01cr@242 68 r.spos = spos;
mas01cr@242 69 r.dist = dist;
mas01cr@242 70 queue->push(r);
mas01cr@242 71 if(queue->size() > pointNN) {
mas01cr@242 72 queue->pop();
mas01cr@242 73 }
mas01cr@239 74 }
mas01cr@239 75 }
mas01cr@239 76
mas01cr@239 77 template <class T> void pointQueryReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 78 NNresult r;
mas01cr@239 79 std::vector<NNresult> v;
mas01cr@239 80 unsigned int size = queue->size();
mas01cr@239 81 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 82 r = queue->top();
mas01cr@239 83 v.push_back(r);
mas01cr@239 84 queue->pop();
mas01cr@239 85 }
mas01cr@239 86 std::vector<NNresult>::reverse_iterator rit;
mas01cr@239 87
mas01cr@239 88 if(adbQueryResponse==0) {
mas01cr@239 89 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 90 r = *rit;
mas01cr@239 91 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " ";
mas01cr@239 92 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
mas01cr@239 93 }
mas01cr@239 94 } else {
mas01cr@239 95 adbQueryResponse->result.__sizeRlist=size;
mas01cr@239 96 adbQueryResponse->result.__sizeDist=size;
mas01cr@239 97 adbQueryResponse->result.__sizeQpos=size;
mas01cr@239 98 adbQueryResponse->result.__sizeSpos=size;
mas01cr@239 99 adbQueryResponse->result.Rlist= new char*[size];
mas01cr@239 100 adbQueryResponse->result.Dist = new double[size];
mas01cr@239 101 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01cr@239 102 adbQueryResponse->result.Spos = new unsigned int[size];
mas01cr@239 103 unsigned int k = 0;
mas01cr@239 104 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01cr@239 105 r = *rit;
mas01cr@239 106 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01cr@239 107 adbQueryResponse->result.Dist[k] = r.dist;
mas01cr@239 108 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01cr@239 109 adbQueryResponse->result.Spos[k] = r.spos;
mas01cr@239 110 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
mas01cr@239 111 }
mas01cr@239 112 }
mas01cr@239 113 }
mas01cr@239 114
mas01cr@239 115 template <class T> class trackAveragingReporter : public Reporter {
mas01cr@239 116 public:
mas01cr@239 117 trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
mas01cr@239 118 ~trackAveragingReporter();
mas01cr@239 119 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 120 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01cr@239 121 private:
mas01cr@239 122 unsigned int pointNN;
mas01cr@239 123 unsigned int trackNN;
mas01cr@239 124 unsigned int numFiles;
mas01cr@239 125 std::priority_queue< NNresult, std::vector< NNresult>, T > *queues;
mas01cr@239 126 };
mas01cr@239 127
mas01cr@239 128 template <class T> trackAveragingReporter<T>::trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
mas01cr@239 129 : pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
mas01cr@239 130 queues = new std::priority_queue< NNresult, std::vector< NNresult>, T >[numFiles];
mas01cr@239 131 }
mas01cr@239 132
mas01cr@239 133 template <class T> trackAveragingReporter<T>::~trackAveragingReporter() {
mas01cr@239 134 delete [] queues;
mas01cr@239 135 }
mas01cr@239 136
mas01cr@239 137 template <class T> void trackAveragingReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@242 138 if (!isnan(dist)) {
mas01cr@242 139 NNresult r;
mas01cr@242 140 r.trackID = trackID;
mas01cr@242 141 r.qpos = qpos;
mas01cr@242 142 r.spos = spos;
mas01cr@242 143 r.dist = dist;
mas01cr@242 144 queues[trackID].push(r);
mas01cr@242 145 if(queues[trackID].size() > pointNN) {
mas01cr@242 146 queues[trackID].pop();
mas01cr@242 147 }
mas01cr@239 148 }
mas01cr@239 149 }
mas01cr@239 150
mas01cr@239 151 template <class T> void trackAveragingReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 152 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
mas01cr@239 153 for (int i = numFiles-1; i >= 0; i--) {
mas01cr@239 154 unsigned int size = queues[i].size();
mas01cr@239 155 if (size > 0) {
mas01cr@239 156 NNresult r;
mas01cr@239 157 double dist = 0;
mas01cr@239 158 NNresult oldr = queues[i].top();
mas01cr@239 159 for (unsigned int j = 0; j < size; j++) {
mas01cr@239 160 r = queues[i].top();
mas01cr@239 161 dist += r.dist;
mas01cr@239 162 queues[i].pop();
mas01cr@239 163 if (r.dist == oldr.dist) {
mas01cr@239 164 r.qpos = oldr.qpos;
mas01cr@239 165 r.spos = oldr.spos;
mas01cr@239 166 } else {
mas01cr@239 167 oldr = r;
mas01cr@239 168 }
mas01cr@239 169 }
mas01cr@239 170 dist /= size;
mas01cr@239 171 r.dist = dist; // trackID, qpos and spos are magically right already.
mas01cr@239 172 result.push(r);
mas01cr@239 173 if (result.size() > trackNN) {
mas01cr@239 174 result.pop();
mas01cr@239 175 }
mas01cr@239 176 }
mas01cr@239 177 }
mas01cr@239 178
mas01cr@239 179 NNresult r;
mas01cr@239 180 std::vector<NNresult> v;
mas01cr@239 181 unsigned int size = result.size();
mas01cr@239 182 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 183 r = result.top();
mas01cr@239 184 v.push_back(r);
mas01cr@239 185 result.pop();
mas01cr@239 186 }
mas01cr@239 187 std::vector<NNresult>::reverse_iterator rit;
mas01cr@239 188
mas01cr@239 189 if(adbQueryResponse==0) {
mas01cr@239 190 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 191 r = *rit;
mas01cr@239 192 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " ";
mas01cr@239 193 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
mas01cr@239 194 }
mas01cr@239 195 } else {
mas01cr@239 196 adbQueryResponse->result.__sizeRlist=size;
mas01cr@239 197 adbQueryResponse->result.__sizeDist=size;
mas01cr@239 198 adbQueryResponse->result.__sizeQpos=size;
mas01cr@239 199 adbQueryResponse->result.__sizeSpos=size;
mas01cr@239 200 adbQueryResponse->result.Rlist= new char*[size];
mas01cr@239 201 adbQueryResponse->result.Dist = new double[size];
mas01cr@239 202 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01cr@239 203 adbQueryResponse->result.Spos = new unsigned int[size];
mas01cr@239 204 unsigned int k = 0;
mas01cr@239 205 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01cr@239 206 r = *rit;
mas01cr@239 207 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01cr@239 208 adbQueryResponse->result.Dist[k] = r.dist;
mas01cr@239 209 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01cr@239 210 adbQueryResponse->result.Spos[k] = r.spos;
mas01cr@239 211 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
mas01cr@239 212 }
mas01cr@239 213 }
mas01cr@239 214 }
mas01cr@239 215
mas01cr@239 216 class trackSequenceQueryRadReporter : public Reporter {
mas01cr@239 217 public:
mas01cr@239 218 trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles);
mas01cr@239 219 ~trackSequenceQueryRadReporter();
mas01cr@239 220 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 221 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01cr@239 222 private:
mas01cr@239 223 unsigned int trackNN;
mas01cr@239 224 unsigned int numFiles;
mas01cr@239 225 std::set<std::pair<unsigned int, unsigned int> > *set;
mas01cr@239 226 unsigned int *count;
mas01cr@239 227 };
mas01cr@239 228
mas01cr@239 229 trackSequenceQueryRadReporter::trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles):
mas01cr@239 230 trackNN(trackNN), numFiles(numFiles) {
mas01cr@239 231 set = new std::set<std::pair<unsigned int, unsigned int> >;
mas01cr@239 232 count = new unsigned int[numFiles];
mas01cr@239 233 for (unsigned i = 0; i < numFiles; i++) {
mas01cr@239 234 count[i] = 0;
mas01cr@239 235 }
mas01cr@239 236 }
mas01cr@239 237
mas01cr@239 238 trackSequenceQueryRadReporter::~trackSequenceQueryRadReporter() {
mas01cr@239 239 delete set;
mas01cr@239 240 delete [] count;
mas01cr@239 241 }
mas01cr@239 242
mas01cr@239 243 void trackSequenceQueryRadReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@239 244 std::set<std::pair<unsigned int, unsigned int> >::iterator it;
mas01cr@239 245 std::pair<unsigned int, unsigned int> pair = std::make_pair(trackID, qpos);
mas01cr@239 246 it = set->find(pair);
mas01cr@239 247 if (it == set->end()) {
mas01cr@239 248 set->insert(pair);
mas01cr@239 249 count[trackID]++;
mas01cr@239 250 }
mas01cr@239 251 }
mas01cr@239 252
mas01cr@239 253 void trackSequenceQueryRadReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 254 std::priority_queue < Radresult > result;
mas01cr@239 255 // KLUDGE: doing this backwards in an attempt to get the same
mas01cr@239 256 // tiebreak behaviour as before.
mas01cr@239 257 for (int i = numFiles-1; i >= 0; i--) {
mas01cr@239 258 Radresult r;
mas01cr@239 259 r.trackID = i;
mas01cr@239 260 r.count = count[i];
mas01cr@239 261 if(r.count > 0) {
mas01cr@239 262 result.push(r);
mas01cr@239 263 if (result.size() > trackNN) {
mas01cr@239 264 result.pop();
mas01cr@239 265 }
mas01cr@239 266 }
mas01cr@239 267 }
mas01cr@239 268
mas01cr@239 269 Radresult r;
mas01cr@239 270 std::vector<Radresult> v;
mas01cr@239 271 unsigned int size = result.size();
mas01cr@239 272 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 273 r = result.top();
mas01cr@239 274 v.push_back(r);
mas01cr@239 275 result.pop();
mas01cr@239 276 }
mas01cr@239 277 std::vector<Radresult>::reverse_iterator rit;
mas01cr@239 278
mas01cr@239 279 if(adbQueryResponse==0) {
mas01cr@239 280 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 281 r = *rit;
mas01cr@239 282 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " " << r.count << std::endl;
mas01cr@239 283 }
mas01cr@239 284 } else {
mas01cr@239 285 // FIXME
mas01cr@239 286 }
mas01cr@239 287 }
mas01mc@248 288
mas01mc@248 289
mas01mc@248 290 template <class T> class trackSequenceQueryNNReporter : public Reporter {
mas01mc@248 291 public:
mas01mc@248 292 trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
mas01mc@248 293 ~trackSequenceQueryNNReporter();
mas01mc@248 294 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01mc@248 295 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01mc@248 296 private:
mas01mc@248 297 unsigned int pointNN;
mas01mc@248 298 unsigned int trackNN;
mas01mc@248 299 unsigned int numFiles;
mas01mc@248 300 std::priority_queue< NNresult, std::vector< NNresult>, T > *queues;
mas01mc@248 301 };
mas01mc@248 302
mas01mc@248 303 template <class T> trackSequenceQueryNNReporter<T>::trackSequenceQueryNNReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
mas01mc@248 304 : pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
mas01mc@248 305 queues = new std::priority_queue< NNresult, std::vector< NNresult>, T >[numFiles];
mas01mc@248 306 }
mas01mc@248 307
mas01mc@248 308 template <class T> trackSequenceQueryNNReporter<T>::~trackSequenceQueryNNReporter() {
mas01mc@248 309 delete [] queues;
mas01mc@248 310 }
mas01mc@248 311
mas01mc@248 312 template <class T> void trackSequenceQueryNNReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01mc@248 313 if (!isnan(dist)) {
mas01mc@248 314 NNresult r;
mas01mc@248 315 r.trackID = trackID;
mas01mc@248 316 r.qpos = qpos;
mas01mc@248 317 r.spos = spos;
mas01mc@248 318 r.dist = dist;
mas01mc@248 319 queues[trackID].push(r);
mas01mc@248 320 if(queues[trackID].size() > pointNN) {
mas01mc@248 321 queues[trackID].pop();
mas01mc@248 322 }
mas01mc@248 323 }
mas01mc@248 324 }
mas01mc@248 325
mas01mc@248 326 template <class T> void trackSequenceQueryNNReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01mc@248 327 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
mas01mc@248 328 std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> > *point_queues = new std::priority_queue< NNresult, std::vector< NNresult>, std::greater<NNresult> >[numFiles];
mas01mc@248 329
mas01mc@248 330 for (int i = numFiles-1; i >= 0; i--) {
mas01mc@248 331 unsigned int size = queues[i].size();
mas01mc@248 332 if (size > 0) {
mas01mc@248 333 NNresult r;
mas01mc@248 334 double dist = 0;
mas01mc@248 335 NNresult oldr = queues[i].top();
mas01mc@248 336 for (unsigned int j = 0; j < size; j++) {
mas01mc@248 337 r = queues[i].top();
mas01mc@248 338 dist += r.dist;
mas01mc@248 339 point_queues[i].push(r);
mas01mc@248 340 queues[i].pop();
mas01mc@248 341 if (r.dist == oldr.dist) {
mas01mc@248 342 r.qpos = oldr.qpos;
mas01mc@248 343 r.spos = oldr.spos;
mas01mc@248 344 } else {
mas01mc@248 345 oldr = r;
mas01mc@248 346 }
mas01mc@248 347 }
mas01mc@248 348 dist /= size;
mas01mc@248 349 r.dist = dist; // trackID, qpos and spos are magically right already.
mas01mc@248 350 result.push(r);
mas01mc@248 351 if (result.size() > trackNN) {
mas01mc@248 352 result.pop();
mas01mc@248 353 }
mas01mc@248 354 }
mas01mc@248 355 }
mas01mc@248 356
mas01mc@248 357 NNresult r;
mas01mc@248 358 std::vector<NNresult> v;
mas01mc@248 359 unsigned int size = result.size();
mas01mc@248 360 for(unsigned int k = 0; k < size; k++) {
mas01mc@248 361 r = result.top();
mas01mc@248 362 v.push_back(r);
mas01mc@248 363 result.pop();
mas01mc@248 364 }
mas01mc@248 365 std::vector<NNresult>::reverse_iterator rit;
mas01mc@248 366
mas01mc@248 367 if(adbQueryResponse==0) {
mas01mc@248 368 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01mc@248 369 r = *rit;
mas01mc@248 370 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << std::endl;
mas01mc@248 371 for(int k=0; k < (int)pointNN; k++){
mas01mc@248 372 NNresult rk = point_queues[r.trackID].top();
mas01mc@248 373 std::cout << rk.dist << " " << rk.qpos << " " << rk.spos << std::endl;
mas01mc@248 374 point_queues[r.trackID].pop();
mas01mc@248 375 }
mas01mc@248 376 }
mas01mc@248 377 } else {
mas01mc@248 378 adbQueryResponse->result.__sizeRlist=size;
mas01mc@248 379 adbQueryResponse->result.__sizeDist=size;
mas01mc@248 380 adbQueryResponse->result.__sizeQpos=size;
mas01mc@248 381 adbQueryResponse->result.__sizeSpos=size;
mas01mc@248 382 adbQueryResponse->result.Rlist= new char*[size];
mas01mc@248 383 adbQueryResponse->result.Dist = new double[size];
mas01mc@248 384 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01mc@248 385 adbQueryResponse->result.Spos = new unsigned int[size];
mas01mc@248 386 unsigned int k = 0;
mas01mc@248 387 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01mc@248 388 r = *rit;
mas01mc@248 389 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01mc@248 390 adbQueryResponse->result.Dist[k] = r.dist;
mas01mc@248 391 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01mc@248 392 adbQueryResponse->result.Spos[k] = r.spos;
mas01mc@248 393 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
mas01mc@248 394 }
mas01mc@248 395 }
mas01mc@248 396 // clean up
mas01mc@248 397 delete[] point_queues;
mas01mc@248 398 }