1 #ifndef MCMCDA_ASSOCIATION_H_INCLUDED
2 #define MCMCDA_ASSOCIATION_H_INCLUDED
15 #include <boost/bind.hpp>
16 #include <boost/foreach.hpp>
17 #include <boost/lexical_cast.hpp>
18 #include <boost/lambda/lambda.hpp>
19 #include <boost/algorithm/string.hpp>
38 return std::lexicographical_compare(t1.begin(), t1.end(),
39 t2.begin(), t2.end(), boost::bind(
46 const typename Track::value_type& p1,
47 const typename Track::value_type& p2
50 if(p1.first < p2.first)
return true;
51 if(p2.first < p1.first)
return false;
52 return *p1.second < *p2.second;
66 class Association :
private std::set<Track, Compare_tracks<Track> >
72 typedef std::set<Track, Compare_tracks<Track> > Parent;
73 typedef std::set<const Element*> Elementp_set;
100 template<
class Iterator>
107 Parent(first, last), Y(&data)
114 using Parent::rbegin;
117 using Parent::insert;
148 vector<int> time(Y->size());
150 transform(time.begin(), time.end(), a_data.begin(), boost::bind(
174 Elementp_set dead_data_t;
176 Elementp_set data_t_addrs;
177 transform((*Y)[t - 1].begin(), (*Y)[t - 1].end(),
178 inserter(data_t_addrs, data_t_addrs.begin()), &boost::lambda::_1);
180 set_difference(data_t_addrs.begin(), data_t_addrs.end(),
181 live_data_t.begin(), live_data_t.end(),
182 inserter(dead_data_t, dead_data_t.begin()));
193 int cdt = (*Y)[t - 1].size();
214 "valid_starting_points: t and d must be positive");
217 "valid_starting_points: d (%d) cannot be greater than d^bar (%d)",
229 BOOST_FOREACH(
const Element* elem_p, dead_pts_t)
231 if(Y->neighborhood_size(*elem_p, t, d, d_bar,
232 v_bar, sg, to_vector) != 0)
257 "valid_starting_points: t and d must be positive");
260 "valid_starting_points: d (%d) cannot be greater than d^bar (%d)",
269 BOOST_FOREACH(
const Element* elem_p, dead_pts_t)
271 if(Y->neighborhood_size(*elem_p, t, d, d_bar,
272 v_bar, sg, to_vector) != 0)
296 Elementp_set d_neighbors;
297 Elementp_set
neighbors = Y->neighborhood(y, t, d, d_bar,
298 v_bar, sg, to_vector);
300 if(!neighbors.empty())
303 std::set_difference(neighbors.begin(), neighbors.end(),
304 live_points.begin(), live_points.end(),
305 std::inserter(d_neighbors, d_neighbors.begin()));
326 return dead_neighbors(y, t, d, d_bar, v_bar, sg, to_vector).size();
332 void read(
const std::string& filename,
const Track& def = Track());
337 void write(
const std::string& filename)
const;
359 std::set<Track, Compare_tracks<Track> >& s1 = a1;
360 std::set<Track, Compare_tracks<Track> >& s2 = a2;
369 template<
class Track>
370 typename Association<Track>::Elementp_set
377 typedef typename Track::const_iterator Tr_it;
378 std::pair<Tr_it, Tr_it> erp = p->equal_range(t);
379 for(Tr_it q = erp.first; q != erp.second; q++)
381 lp.insert(q->second);
390 template<
class Track>
397 typename Track::const_iterator q = p->find(t);
409 template<
class Track>
416 ifstream ifs(filename.c_str());
417 IFTD(ifs,
IO_error,
"Cannot read association; could not open file %s",
420 size_t T = Y->size();
424 if(line.empty() || line[0] ==
'#')
429 istringstream istr(line);
431 copy(istream_iterator<string>(istr),
432 istream_iterator<string>(),
433 back_inserter(strs));
437 "Cannot read association; file %s has incorrect format.",
440 for(
int t = 0; t < strs.size(); t++)
443 boost::split(idxs, strs[t], boost::is_any_of(
","));
445 for(
size_t i = 0;
i < idxs.size();
i++)
447 int idx = boost::lexical_cast<
int>(idxs[
i]);
448 IFTD(idx >= -1 && idx < static_cast<int>((*Y)[t].size()),
450 "Cannot read association; file %s has bad format.",
462 IFTD(idx != -1, Illegal_argument,
463 "Cannot read association; file %s has bad format.",
467 typename std::set<Element>::const_iterator vec_p
470 track.insert(make_pair(t + 1, &(*vec_p)));
482 template<
class Track>
485 std::ofstream ofs(filename.c_str());
489 "Cannot write association; could not open file %s",
493 typedef typename Track::const_iterator Tr_it;
494 typedef std::set<Element> E_set;
495 BOOST_FOREACH(
const Track& track, *
this)
497 for(Tr_it pair_p = track.begin(); pair_p != track.end(); pair_p++)
499 int t = pair_p->first;
500 const Element& elem = *pair_p->second;
502 if(pair_p == track.begin())
504 for(
int s = 1; s < t; s++)
510 const E_set& data_t = (*Y)[t - 1];
511 typename E_set::const_iterator elem_p = data_t.find(elem);
513 ofs << std::distance(data_t.begin(), elem_p);
515 Tr_it pair_q = pair_p;
517 if(pair_q == track.end())
519 for(
int s = t + 1; s <= Y->size(); s++)
526 if(pair_q->first == t)
533 for(
int s = t + 1; s < pair_q->first; s++)
549 template<
class Track>
562 if(invalid_track_p != end())
569 for(
const_iterator track_p = begin(); track_p != end(); track_p++)
571 for(
typename Track::const_iterator pair_p = track_p->begin();
572 pair_p != track_p->end();
575 if(pair_p->second == NULL)
581 const std::set<Element>& data_t = (*Y)[pair_p->first - 1];
582 if(std::count_if(data_t.begin(), data_t.end(),
589 if(!used_data[pair_p->first - 1].insert(pair_p->second).second)
603 template<
class Track>
619 const size_t T = w.
get_data().size();
620 BOOST_FOREACH(
const Track& track, w)
622 int sf = track.get_start_time();
623 int ef = track.get_end_time();
624 assert(sf != -1 && ef != -1);
635 for(
size_t t = 1; t <= T; t++)
Functor to compare two tracks. If this were not defined, an association would order its tracks using ...
Definition: mcmcda_association.h:33
bool compare_elements(const typename Track::value_type &p1, const typename Track::value_type &p2) const
Compare two track elements.
Definition: mcmcda_association.h:45
Available_data get_available_data() const
Computes "available data".
Definition: mcmcda_association.h:143
Elementp_set get_dead_points_at_time(int t) const
Computes points at time t that do not belong to any track.
Definition: mcmcda_association.h:170
Parent::const_iterator const_iterator
Definition: mcmcda_association.h:122
void write(const std::string &filename) const
Writes association to file.
Definition: mcmcda_association.h:483
friend void swap(Association &a1, Association &a2)
Efficiently swap two associations.
Definition: mcmcda_association.h:354
A class that holds data for the tracking problem.
Definition: mcmcda_data.h:50
Parent::iterator iterator
Definition: mcmcda_association.h:121
A class that represents a MCMCDA association.
Definition: mcmcda_association.h:66
Elementp_set get_live_points_at_time(int t) const
Computes points at time t that belong to some track.
Definition: mcmcda_association.h:371
Elementp_set valid_starting_points(int t, int d, int d_bar, double v_bar, double sg, const typename Data< Element >::Convert &to_vector) const
Computes points at time t that are valid starting points for a track.
Definition: mcmcda_association.h:204
Association()
Default constructor – meaningless association. Use with care!!
Definition: mcmcda_association.h:85
int is_valid(const Doubly_connected_edge_list &dcel)
slowly test invariants on the structure, return ERROR or NO_ERROR
Definition: dcel.cpp:1530
Generator that increments (++) its state everytime it is called. Useful for creating sequences of con...
Definition: l_functors.h:39
bool is_valid(double v_bar, int d_bar, double sg, const typename Data< Element >::Convert &convert) const
Determines whether this association is valid.
Definition: mcmcda_association.h:551
int neighbors
Definition: triangle.c:718
#define IFT(a, ex, msg)
Definition: l_exception.h:101
int count_valid_starting_points(int t, int d, int d_bar, double v_bar, double sg, const typename Data< Element >::Convert &to_vector) const
Counts points at time t that are valid starting track points. This is usually faster than finding the...
Definition: mcmcda_association.h:247
Track::Element Element
Definition: mcmcda_association.h:69
Predicate that returns true if address of element equals given.
Definition: l_functors.h:197
boost::function1< Vector, const Element & > Convert
Definition: mcmcda_data.h:53
Parent::const_reference const_reference
Definition: mcmcda_association.h:123
const Data< Element > & get_data() const
Returns data set const-ref.
Definition: mcmcda_association.h:126
count
Definition: APPgetLargeConnectedEdges.m:71
void set_data(const Data< Element > &data)
Set data.
Definition: mcmcda_association.h:132
void swap(kjb::Gsl_Multimin_fdf &m1, kjb::Gsl_Multimin_fdf &m2)
Swap two wrapped multimin objects.
Definition: gsl_multimin.h:693
#define KJB_THROW_3(ex, fmt, params)
Definition: l_exception.h:56
int count_live_points_at_time(int t) const
Counts points at time t that belong to some track. This is usually faster than computing the points a...
Definition: mcmcda_association.h:391
int count_dead_points_at_time(int t) const
Counts points at time t that do not belong to any track. This is usually faster than computing the po...
Definition: mcmcda_association.h:191
void get_association_totals(const Association< Track > &w, size_t &m, size_t &e, size_t &d, size_t &a, size_t &n, size_t &l)
Get total tracks, entrances, exits, true detections, noisy detections, and track lengths of a given a...
Definition: mcmcda_association.h:605
Elementp_set dead_neighbors(const Element &y, int t, int d, int d_bar, double v_bar, double sg, const typename Data< Element >::Convert &to_vector) const
Computes neighbors of vector that are available.
Definition: mcmcda_association.h:286
int getline(FILE *fp, std::string *line, char EOL= '\n')
Like C's fgets but with std::string, or C++'s getline but with FILE*.
Object thrown when an argument to a function is not acceptable.
Definition: l_exception.h:377
void read(const std::string &filename, const Track &def=Track())
Read association from file.
Definition: mcmcda_association.h:410
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
Object thrown when input or output fails.
Definition: l_exception.h:496
int count_dead_neighbors(const Element &y, int t, int d, int d_bar, double v_bar, double sg, const typename Data< Element >::Convert &to_vector) const
Computes neighbors of vector that are available. This is usually faster than computing the points and...
Definition: mcmcda_association.h:316
for m
Definition: APPgetLargeConnectedEdges.m:64
Support for error handling exception classes in libKJB.
#define IFTD(a, ex, msg, params)
Definition: l_exception.h:112
std::vector< Elementp_set > Available_data
Definition: mcmcda_association.h:79
Definition for the Vector class, a thin wrapper on the KJB Vector struct and its related functionalit...
Association(const Data< Element > &data)
Constructor.
Definition: mcmcda_association.h:91
bool operator()(const Track &t1, const Track &t2) const
Compare two tracks.
Definition: mcmcda_association.h:36