mas01cr@498
|
1 template <class T> class PerTrackAccumulator : public Accumulator {
|
mas01cr@498
|
2 public:
|
mas01cr@498
|
3 PerTrackAccumulator(unsigned int pointNN, unsigned int trackNN);
|
mas01cr@498
|
4 ~PerTrackAccumulator();
|
mas01cr@498
|
5 void add_point(adb_result_t *r);
|
mas01cr@498
|
6 adb_query_results_t *get_points();
|
mas01cr@498
|
7 private:
|
mas01cr@498
|
8 unsigned int pointNN;
|
mas01cr@498
|
9 unsigned int trackNN;
|
mas01cr@672
|
10 std::map<adb_result_t, std::priority_queue< adb_result_t, std::vector<adb_result_t>, T > *, adb_result_ikey_lt> *queues;
|
mas01cr@498
|
11 };
|
mas01cr@498
|
12
|
mas01cr@498
|
13 template <class T> PerTrackAccumulator<T>::PerTrackAccumulator(unsigned int pointNN, unsigned int trackNN)
|
mas01cr@610
|
14 : pointNN(pointNN), trackNN(trackNN), queues(0) {
|
mas01cr@672
|
15 queues = new std::map<adb_result_t, std::priority_queue< adb_result_t, std::vector<adb_result_t>, T > *, adb_result_ikey_lt>;
|
mas01cr@498
|
16 }
|
mas01cr@498
|
17
|
mas01cr@498
|
18 template <class T> PerTrackAccumulator<T>::~PerTrackAccumulator() {
|
mas01cr@498
|
19 if(queues) {
|
mas01cr@672
|
20 typename std::map< adb_result_t, std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *, adb_result_ikey_lt>::iterator it;
|
mas01cr@498
|
21 for(it = queues->begin(); it != queues->end(); it++) {
|
mas01cr@498
|
22 delete (*it).second;
|
mas01cr@498
|
23 }
|
mas01cr@498
|
24 delete queues;
|
mas01cr@498
|
25 }
|
mas01cr@498
|
26 }
|
mas01cr@498
|
27
|
mas01cr@498
|
28 template <class T> void PerTrackAccumulator<T>::add_point(adb_result_t *r) {
|
mas01cr@498
|
29 if(!isnan(r->dist)) {
|
mas01cr@672
|
30 typename std::map< adb_result_t, std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *, adb_result_ikey_lt>::iterator it;
|
mas01cr@610
|
31 std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *queue;
|
mas01cr@610
|
32 it = queues->find(*r);
|
mas01cr@610
|
33 if(it == queues->end()) {
|
mas01cr@610
|
34 queue = new std::priority_queue< adb_result_t, std::vector< adb_result_t >, T >;
|
mas01cr@610
|
35 (*queues)[*r] = queue;
|
mas01cr@610
|
36 } else {
|
mas01cr@610
|
37 queue = (*it).second;
|
mas01cr@610
|
38 }
|
mas01cr@610
|
39
|
mas01cr@610
|
40 queue->push(*r);
|
mas01cr@610
|
41 if(queue->size() > pointNN) {
|
mas01cr@610
|
42 queue->pop();
|
mas01cr@498
|
43 }
|
mas01cr@498
|
44 }
|
mas01cr@498
|
45 }
|
mas01cr@498
|
46
|
mas01cr@498
|
47 template <class T> adb_query_results_t *PerTrackAccumulator<T>::get_points() {
|
mas01cr@672
|
48 typename std::map< adb_result_t, std::vector< adb_result_t >, adb_result_ikey_lt> points;
|
mas01cr@498
|
49 typename std::priority_queue< adb_result_t, std::vector< adb_result_t >, T> queue;
|
mas01cr@672
|
50 typename std::map< adb_result_t, std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *, adb_result_ikey_lt>::iterator it;
|
mas01cr@498
|
51
|
mas01cr@498
|
52 unsigned int size = 0;
|
mas01cr@498
|
53 for(it = queues->begin(); it != queues->end(); it++) {
|
mas01cr@498
|
54 unsigned int n = ((*it).second)->size();
|
mas01cr@498
|
55 std::vector<adb_result_t> v;
|
mas01cr@498
|
56 adb_result_t r;
|
mas01cr@498
|
57 double dist = 0;
|
mas01cr@498
|
58 for(unsigned int k = 0; k < n; k++) {
|
mas01cr@498
|
59 r = ((*it).second)->top();
|
mas01cr@498
|
60 dist += r.dist;
|
mas01cr@498
|
61 v.push_back(r);
|
mas01cr@498
|
62 ((*it).second)->pop();
|
mas01cr@498
|
63 }
|
mas01cr@498
|
64 points[r] = v;
|
mas01cr@498
|
65 dist /= n;
|
mas01cr@498
|
66 size += n;
|
mas01cr@498
|
67 r.dist = dist;
|
mas01cr@498
|
68 /* I will burn in hell */
|
mas01cr@498
|
69 r.ipos = n;
|
mas01cr@498
|
70 queue.push(r);
|
mas01cr@498
|
71 if(queue.size() > trackNN) {
|
mas01cr@498
|
72 size -= queue.top().ipos;
|
mas01cr@498
|
73 queue.pop();
|
mas01cr@498
|
74 }
|
mas01cr@498
|
75 }
|
mas01cr@498
|
76
|
mas01cr@498
|
77 adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t));
|
mas01cr@498
|
78 adb_result_t *rs = (adb_result_t *) calloc(size, sizeof(adb_result_t));
|
mas01cr@498
|
79 r->nresults = size;
|
mas01cr@498
|
80 r->results = rs;
|
mas01cr@498
|
81
|
mas01cr@498
|
82 unsigned int k = 0;
|
mas01cr@498
|
83 while(queue.size() > 0) {
|
mas01cr@498
|
84 std::vector<adb_result_t> v = points[queue.top()];
|
mas01cr@498
|
85 queue.pop();
|
mas01cr@498
|
86 while(v.size() > 0) {
|
mas01cr@498
|
87 rs[k++] = v.back();
|
mas01cr@498
|
88 v.pop_back();
|
mas01cr@498
|
89 }
|
mas01cr@498
|
90 }
|
mas01cr@498
|
91 return r;
|
mas01cr@498
|
92 }
|
mas01cr@498
|
93
|