mas01cr@420: template class PerTrackAccumulator : public Accumulator { mas01cr@420: public: mas01cr@420: PerTrackAccumulator(unsigned int pointNN, unsigned int trackNN); mas01cr@420: ~PerTrackAccumulator(); mas01cr@420: void add_point(adb_result_t *r); mas01cr@420: adb_query_results_t *get_points(); mas01cr@420: private: mas01cr@420: unsigned int pointNN; mas01cr@420: unsigned int trackNN; mas01cr@420: std::map, T > *, adb_result_key_lt> *queues; mas01cr@420: std::set< adb_result_t, adb_result_triple_lt > *set; mas01cr@420: }; mas01cr@420: mas01cr@420: template PerTrackAccumulator::PerTrackAccumulator(unsigned int pointNN, unsigned int trackNN) mas01cr@420: : pointNN(pointNN), trackNN(trackNN), queues(0), set(0) { mas01cr@420: queues = new std::map, T > *, adb_result_key_lt>; mas01cr@420: set = new std::set< adb_result_t, adb_result_triple_lt >; mas01cr@420: } mas01cr@420: mas01cr@420: template PerTrackAccumulator::~PerTrackAccumulator() { mas01cr@420: if(queues) { mas01cr@420: typename std::map< adb_result_t, std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *, adb_result_key_lt>::iterator it; mas01cr@420: for(it = queues->begin(); it != queues->end(); it++) { mas01cr@420: delete (*it).second; mas01cr@420: } mas01cr@420: delete queues; mas01cr@420: } mas01cr@420: if(set) { mas01cr@420: delete set; mas01cr@420: } mas01cr@420: } mas01cr@420: mas01cr@420: template void PerTrackAccumulator::add_point(adb_result_t *r) { mas01cr@420: if(!isnan(r->dist)) { mas01cr@420: if(set->find(*r) == set->end()) { mas01cr@420: set->insert(*r); mas01cr@420: mas01cr@420: typename std::map< adb_result_t, std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *, adb_result_key_lt>::iterator it; mas01cr@420: std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *queue; mas01cr@420: it = queues->find(*r); mas01cr@420: if(it == queues->end()) { mas01cr@420: queue = new std::priority_queue< adb_result_t, std::vector< adb_result_t >, T >; mas01cr@420: (*queues)[*r] = queue; mas01cr@420: } else { mas01cr@420: queue = (*it).second; mas01cr@420: } mas01cr@420: mas01cr@420: queue->push(*r); mas01cr@420: if(queue->size() > pointNN) { mas01cr@420: queue->pop(); mas01cr@420: } mas01cr@420: } mas01cr@420: } mas01cr@420: } mas01cr@420: mas01cr@420: template adb_query_results_t *PerTrackAccumulator::get_points() { mas01cr@420: typename std::map< adb_result_t, std::vector< adb_result_t >, adb_result_key_lt> points; mas01cr@420: typename std::priority_queue< adb_result_t, std::vector< adb_result_t >, T> queue; mas01cr@420: typename std::map< adb_result_t, std::priority_queue< adb_result_t, std::vector< adb_result_t >, T > *, adb_result_key_lt>::iterator it; mas01cr@420: mas01cr@420: unsigned int size = 0; mas01cr@420: for(it = queues->begin(); it != queues->end(); it++) { mas01cr@420: unsigned int n = ((*it).second)->size(); mas01cr@420: std::vector v; mas01cr@420: adb_result_t r; mas01cr@420: double dist = 0; mas01cr@420: for(unsigned int k = 0; k < n; k++) { mas01cr@420: r = ((*it).second)->top(); mas01cr@420: dist += r.dist; mas01cr@420: v.push_back(r); mas01cr@420: ((*it).second)->pop(); mas01cr@420: } mas01cr@420: points[r] = v; mas01cr@420: dist /= n; mas01cr@420: size += n; mas01cr@420: r.dist = dist; mas01cr@420: /* I will burn in hell */ mas01cr@420: r.ipos = n; mas01cr@420: queue.push(r); mas01cr@420: if(queue.size() > trackNN) { mas01cr@420: size -= queue.top().ipos; mas01cr@420: queue.pop(); mas01cr@420: } mas01cr@420: } mas01cr@420: mas01cr@420: adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t)); mas01cr@420: adb_result_t *rs = (adb_result_t *) calloc(size, sizeof(adb_result_t)); mas01cr@420: r->nresults = size; mas01cr@420: r->results = rs; mas01cr@420: mas01cr@420: unsigned int k = 0; mas01cr@420: while(queue.size() > 0) { mas01cr@420: std::vector v = points[queue.top()]; mas01cr@420: queue.pop(); mas01cr@420: while(v.size() > 0) { mas01cr@420: rs[k++] = v.back(); mas01cr@420: v.pop_back(); mas01cr@420: } mas01cr@420: } mas01cr@420: return r; mas01cr@420: } mas01cr@420: