annotate pertrackaccumulator.h @ 770:c54bc2ffbf92 tip

update tags
author convert-repo
date Fri, 16 Dec 2011 11:34:01 +0000
parents a35ca2d5f238
children
rev   line source
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