X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=tracker.cc;h=d3397cf4736a9c14c5aaa1b3d8bf5335f267a1ed;hb=852417aae1e0f64716fa49499176e300ab84d66f;hp=f5dffd88e521373036cd147060d6bf3353ccc6ac;hpb=535b8ede7d6646ea17135da10c8a16416524f6e9;p=mtp.git diff --git a/tracker.cc b/tracker.cc index f5dffd8..d3397cf 100644 --- a/tracker.cc +++ b/tracker.cc @@ -59,8 +59,16 @@ Tracker::~Tracker() { delete[] entrances; } +int Tracker::early_pair_node(int t, int l) { + return 1 + (2 * (t + 0) + 0) * _nb_locations + l; +} + +int Tracker::late_pair_node(int t, int l) { + return 1 + (2 * (t + 0) + 1) * _nb_locations + l; +} + void Tracker::build_graph() { - // Delete existing graph if there was one + // Delete the existing graph if there was one delete[] _edge_lengths; delete _graph; @@ -81,11 +89,10 @@ void Tracker::build_graph() { // frame to the sink _nb_locations * 2 + // The edges from the source to the entrances and from the exists - // to the sink (in every time frames but the first for the source, - // and last for the exits) + // to the sink (in every time frames but the first for the + // entrances, and last for the exits) (_nb_time_steps - 1) * (nb_exits + nb_entrances) + - // The edges for the motions, between every pair of successive - // frames + // The edges for the motions, between every successive frames (_nb_time_steps - 1) * nb_motions + // The edges inside the duplicated nodes _nb_locations * _nb_time_steps; @@ -99,13 +106,13 @@ void Tracker::build_graph() { _edge_lengths = new scalar_t[nb_edges]; // We put the in-node edges first, since these are the ones whose - // lengths we will have to set later, according to the detection - // scores + // lengths we will have to change before tracking, according to the + // detection scores for(int t = 0; t < _nb_time_steps; t++) { for(int l = 0; l < _nb_locations; l++) { - node_from[e] = 1 + (2 * (t + 0) + 0) * _nb_locations + l; - node_to[e] = 1 + (2 * (t + 0) + 1) * _nb_locations + l; + node_from[e] = early_pair_node(t, l); + node_to[e] = late_pair_node(t, l); e++; } } @@ -120,15 +127,15 @@ void Tracker::build_graph() { for(int t = 0; t < _nb_time_steps; t++) { for(int l = 0; l < _nb_locations; l++) { if(t == _nb_time_steps - 1) { - node_from[e] = 1 + (2 * (t + 0) + 1) * _nb_locations + l; + node_from[e] = late_pair_node(t, l); node_to[e] = sink; _edge_lengths[e] = 0.0; e++; } else { for(int k = 0; k < _nb_locations; k++) { if(allowed_motion[l][k]) { - node_from[e] = 1 + (2 * (t + 0) + 1) * _nb_locations + l; - node_to[e] = 1 + (2 * (t + 1) + 0) * _nb_locations + k; + node_from[e] = late_pair_node(t, l); + node_to[e] = early_pair_node(t+1, k); _edge_lengths[e] = 0.0; e++; } @@ -141,12 +148,12 @@ void Tracker::build_graph() { for(int l = 0; l < _nb_locations; l++) { if(t > 0 && entrances[l]) { node_from[e] = source; - node_to[e] = 1 + (2 * (t + 0) + 0) * _nb_locations + l; + node_to[e] = early_pair_node(t, l); _edge_lengths[e] = 0.0; e++; } if(t < _nb_time_steps - 1 && exits[l]) { - node_from[e] = 1 + (2 * (t + 0) + 1) * _nb_locations + l; + node_from[e] = late_pair_node(t, l); node_to[e] = sink; _edge_lengths[e] = 0.0; e++; @@ -186,8 +193,8 @@ void Tracker::track() { #ifdef VERBOSE for(int p = 0; p < _graph->nb_paths; p++) { Path *path = _graph->paths[p]; - cout << "PATH " << p << " [length " << path->length << "] " << path->nodes[0]; - for(int n = 1; n < path->length; n++) { + cout << "PATH " << p << " [length " << path->nb_nodes << "] " << path->nodes[0]; + for(int n = 1; n < path->nb_nodes; n++) { cout << " -> " << path->nodes[n]; } cout << endl; @@ -199,14 +206,18 @@ int Tracker::nb_trajectories() { return _graph->nb_paths; } +scalar_t Tracker::trajectory_score(int k) { + return -_graph->paths[k]->length; +} + int Tracker::trajectory_entrance_time(int k) { return (_graph->paths[k]->nodes[1] - 1) / (2 * _nb_locations); } int Tracker::trajectory_duration(int k) { - return (_graph->paths[k]->length - 2) / 2; + return (_graph->paths[k]->nb_nodes - 2) / 2; } -int Tracker::trajectory_location(int k, int time) { - return (_graph->paths[k]->nodes[2 * time + 1] - 1) % _nb_locations; +int Tracker::trajectory_location(int k, int time_from_entry) { + return (_graph->paths[k]->nodes[2 * time_from_entry + 1] - 1) % _nb_locations; }