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 }
|