annotate reporter.h @ 239:2cc06e5b05a5

Merge refactoring branch. Bug fixes: * 64-bit powertable bug; * -inf - -inf bug; * use new times information; * plus short track, O2_MAXFILES and structure padding ABI fixes (already backported) Major code changes: * split source into functional units, known as 'files'; * Reporter class for accumulating and reporting on query results; * much OAOOization, mostly from above: net 800 LOC (25%) shorter.
author mas01cr
date Thu, 13 Dec 2007 14:23:32 +0000
parents
children 5ac5c23de715
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@239 64 NNresult r;
mas01cr@239 65 r.trackID = trackID;
mas01cr@239 66 r.qpos = qpos;
mas01cr@239 67 r.spos = spos;
mas01cr@239 68 r.dist = dist;
mas01cr@239 69 queue->push(r);
mas01cr@239 70 if(queue->size() > pointNN) {
mas01cr@239 71 queue->pop();
mas01cr@239 72 }
mas01cr@239 73 }
mas01cr@239 74
mas01cr@239 75 template <class T> void pointQueryReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 76 NNresult r;
mas01cr@239 77 std::vector<NNresult> v;
mas01cr@239 78 unsigned int size = queue->size();
mas01cr@239 79 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 80 r = queue->top();
mas01cr@239 81 v.push_back(r);
mas01cr@239 82 queue->pop();
mas01cr@239 83 }
mas01cr@239 84 std::vector<NNresult>::reverse_iterator rit;
mas01cr@239 85
mas01cr@239 86 if(adbQueryResponse==0) {
mas01cr@239 87 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 88 r = *rit;
mas01cr@239 89 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " ";
mas01cr@239 90 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
mas01cr@239 91 }
mas01cr@239 92 } else {
mas01cr@239 93 adbQueryResponse->result.__sizeRlist=size;
mas01cr@239 94 adbQueryResponse->result.__sizeDist=size;
mas01cr@239 95 adbQueryResponse->result.__sizeQpos=size;
mas01cr@239 96 adbQueryResponse->result.__sizeSpos=size;
mas01cr@239 97 adbQueryResponse->result.Rlist= new char*[size];
mas01cr@239 98 adbQueryResponse->result.Dist = new double[size];
mas01cr@239 99 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01cr@239 100 adbQueryResponse->result.Spos = new unsigned int[size];
mas01cr@239 101 unsigned int k = 0;
mas01cr@239 102 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01cr@239 103 r = *rit;
mas01cr@239 104 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01cr@239 105 adbQueryResponse->result.Dist[k] = r.dist;
mas01cr@239 106 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01cr@239 107 adbQueryResponse->result.Spos[k] = r.spos;
mas01cr@239 108 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
mas01cr@239 109 }
mas01cr@239 110 }
mas01cr@239 111 }
mas01cr@239 112
mas01cr@239 113 template <class T> class trackAveragingReporter : public Reporter {
mas01cr@239 114 public:
mas01cr@239 115 trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles);
mas01cr@239 116 ~trackAveragingReporter();
mas01cr@239 117 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 118 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01cr@239 119 private:
mas01cr@239 120 unsigned int pointNN;
mas01cr@239 121 unsigned int trackNN;
mas01cr@239 122 unsigned int numFiles;
mas01cr@239 123 std::priority_queue< NNresult, std::vector< NNresult>, T > *queues;
mas01cr@239 124 };
mas01cr@239 125
mas01cr@239 126 template <class T> trackAveragingReporter<T>::trackAveragingReporter(unsigned int pointNN, unsigned int trackNN, unsigned int numFiles)
mas01cr@239 127 : pointNN(pointNN), trackNN(trackNN), numFiles(numFiles) {
mas01cr@239 128 queues = new std::priority_queue< NNresult, std::vector< NNresult>, T >[numFiles];
mas01cr@239 129 }
mas01cr@239 130
mas01cr@239 131 template <class T> trackAveragingReporter<T>::~trackAveragingReporter() {
mas01cr@239 132 delete [] queues;
mas01cr@239 133 }
mas01cr@239 134
mas01cr@239 135 template <class T> void trackAveragingReporter<T>::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@239 136 NNresult r;
mas01cr@239 137 r.trackID = trackID;
mas01cr@239 138 r.qpos = qpos;
mas01cr@239 139 r.spos = spos;
mas01cr@239 140 r.dist = dist;
mas01cr@239 141 queues[trackID].push(r);
mas01cr@239 142 if(queues[trackID].size() > pointNN) {
mas01cr@239 143 queues[trackID].pop();
mas01cr@239 144 }
mas01cr@239 145 }
mas01cr@239 146
mas01cr@239 147 template <class T> void trackAveragingReporter<T>::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 148 std::priority_queue < NNresult, std::vector< NNresult>, T> result;
mas01cr@239 149 for (int i = numFiles-1; i >= 0; i--) {
mas01cr@239 150 unsigned int size = queues[i].size();
mas01cr@239 151 if (size > 0) {
mas01cr@239 152 NNresult r;
mas01cr@239 153 double dist = 0;
mas01cr@239 154 NNresult oldr = queues[i].top();
mas01cr@239 155 for (unsigned int j = 0; j < size; j++) {
mas01cr@239 156 r = queues[i].top();
mas01cr@239 157 dist += r.dist;
mas01cr@239 158 queues[i].pop();
mas01cr@239 159 if (r.dist == oldr.dist) {
mas01cr@239 160 r.qpos = oldr.qpos;
mas01cr@239 161 r.spos = oldr.spos;
mas01cr@239 162 } else {
mas01cr@239 163 oldr = r;
mas01cr@239 164 }
mas01cr@239 165 }
mas01cr@239 166 dist /= size;
mas01cr@239 167 r.dist = dist; // trackID, qpos and spos are magically right already.
mas01cr@239 168 result.push(r);
mas01cr@239 169 if (result.size() > trackNN) {
mas01cr@239 170 result.pop();
mas01cr@239 171 }
mas01cr@239 172 }
mas01cr@239 173 }
mas01cr@239 174
mas01cr@239 175 NNresult r;
mas01cr@239 176 std::vector<NNresult> v;
mas01cr@239 177 unsigned int size = result.size();
mas01cr@239 178 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 179 r = result.top();
mas01cr@239 180 v.push_back(r);
mas01cr@239 181 result.pop();
mas01cr@239 182 }
mas01cr@239 183 std::vector<NNresult>::reverse_iterator rit;
mas01cr@239 184
mas01cr@239 185 if(adbQueryResponse==0) {
mas01cr@239 186 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 187 r = *rit;
mas01cr@239 188 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " ";
mas01cr@239 189 std::cout << r.dist << " " << r.qpos << " " << r.spos << std::endl;
mas01cr@239 190 }
mas01cr@239 191 } else {
mas01cr@239 192 adbQueryResponse->result.__sizeRlist=size;
mas01cr@239 193 adbQueryResponse->result.__sizeDist=size;
mas01cr@239 194 adbQueryResponse->result.__sizeQpos=size;
mas01cr@239 195 adbQueryResponse->result.__sizeSpos=size;
mas01cr@239 196 adbQueryResponse->result.Rlist= new char*[size];
mas01cr@239 197 adbQueryResponse->result.Dist = new double[size];
mas01cr@239 198 adbQueryResponse->result.Qpos = new unsigned int[size];
mas01cr@239 199 adbQueryResponse->result.Spos = new unsigned int[size];
mas01cr@239 200 unsigned int k = 0;
mas01cr@239 201 for(rit = v.rbegin(); rit < v.rend(); rit++, k++) {
mas01cr@239 202 r = *rit;
mas01cr@239 203 adbQueryResponse->result.Rlist[k] = new char[O2_MAXFILESTR];
mas01cr@239 204 adbQueryResponse->result.Dist[k] = r.dist;
mas01cr@239 205 adbQueryResponse->result.Qpos[k] = r.qpos;
mas01cr@239 206 adbQueryResponse->result.Spos[k] = r.spos;
mas01cr@239 207 snprintf(adbQueryResponse->result.Rlist[k], O2_MAXFILESTR, "%s", fileTable+r.trackID*O2_FILETABLESIZE);
mas01cr@239 208 }
mas01cr@239 209 }
mas01cr@239 210 }
mas01cr@239 211
mas01cr@239 212 class trackSequenceQueryRadReporter : public Reporter {
mas01cr@239 213 public:
mas01cr@239 214 trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles);
mas01cr@239 215 ~trackSequenceQueryRadReporter();
mas01cr@239 216 void add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist);
mas01cr@239 217 void report(char *fileTable, adb__queryResponse *adbQueryResponse);
mas01cr@239 218 private:
mas01cr@239 219 unsigned int trackNN;
mas01cr@239 220 unsigned int numFiles;
mas01cr@239 221 std::set<std::pair<unsigned int, unsigned int> > *set;
mas01cr@239 222 unsigned int *count;
mas01cr@239 223 };
mas01cr@239 224
mas01cr@239 225 trackSequenceQueryRadReporter::trackSequenceQueryRadReporter(unsigned int trackNN, unsigned int numFiles):
mas01cr@239 226 trackNN(trackNN), numFiles(numFiles) {
mas01cr@239 227 set = new std::set<std::pair<unsigned int, unsigned int> >;
mas01cr@239 228 count = new unsigned int[numFiles];
mas01cr@239 229 for (unsigned i = 0; i < numFiles; i++) {
mas01cr@239 230 count[i] = 0;
mas01cr@239 231 }
mas01cr@239 232 }
mas01cr@239 233
mas01cr@239 234 trackSequenceQueryRadReporter::~trackSequenceQueryRadReporter() {
mas01cr@239 235 delete set;
mas01cr@239 236 delete [] count;
mas01cr@239 237 }
mas01cr@239 238
mas01cr@239 239 void trackSequenceQueryRadReporter::add_point(unsigned int trackID, unsigned int qpos, unsigned int spos, double dist) {
mas01cr@239 240 std::set<std::pair<unsigned int, unsigned int> >::iterator it;
mas01cr@239 241 std::pair<unsigned int, unsigned int> pair = std::make_pair(trackID, qpos);
mas01cr@239 242 it = set->find(pair);
mas01cr@239 243 if (it == set->end()) {
mas01cr@239 244 set->insert(pair);
mas01cr@239 245 count[trackID]++;
mas01cr@239 246 }
mas01cr@239 247 }
mas01cr@239 248
mas01cr@239 249 void trackSequenceQueryRadReporter::report(char *fileTable, adb__queryResponse *adbQueryResponse) {
mas01cr@239 250 std::priority_queue < Radresult > result;
mas01cr@239 251 // KLUDGE: doing this backwards in an attempt to get the same
mas01cr@239 252 // tiebreak behaviour as before.
mas01cr@239 253 for (int i = numFiles-1; i >= 0; i--) {
mas01cr@239 254 Radresult r;
mas01cr@239 255 r.trackID = i;
mas01cr@239 256 r.count = count[i];
mas01cr@239 257 if(r.count > 0) {
mas01cr@239 258 result.push(r);
mas01cr@239 259 if (result.size() > trackNN) {
mas01cr@239 260 result.pop();
mas01cr@239 261 }
mas01cr@239 262 }
mas01cr@239 263 }
mas01cr@239 264
mas01cr@239 265 Radresult r;
mas01cr@239 266 std::vector<Radresult> v;
mas01cr@239 267 unsigned int size = result.size();
mas01cr@239 268 for(unsigned int k = 0; k < size; k++) {
mas01cr@239 269 r = result.top();
mas01cr@239 270 v.push_back(r);
mas01cr@239 271 result.pop();
mas01cr@239 272 }
mas01cr@239 273 std::vector<Radresult>::reverse_iterator rit;
mas01cr@239 274
mas01cr@239 275 if(adbQueryResponse==0) {
mas01cr@239 276 for(rit = v.rbegin(); rit < v.rend(); rit++) {
mas01cr@239 277 r = *rit;
mas01cr@239 278 std::cout << fileTable + r.trackID*O2_FILETABLESIZE << " " << r.count << std::endl;
mas01cr@239 279 }
mas01cr@239 280 } else {
mas01cr@239 281 // FIXME
mas01cr@239 282 }
mas01cr@239 283 }