X-Git-Url: https://www.fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=mtp.git;a=blobdiff_plain;f=mtp_tracker.cc;h=8cc45179fbd9217b58aa2336e777d5aee8cd451d;hp=b4e70abd6dad1e01362eb4a47cb16e0ba1016f56;hb=HEAD;hpb=c7d5cdf1982dacc5451f79599041b2e95524d3f7 diff --git a/mtp_tracker.cc b/mtp_tracker.cc index b4e70ab..8cc4517 100644 --- a/mtp_tracker.cc +++ b/mtp_tracker.cc @@ -32,9 +32,9 @@ void MTPTracker::free() { delete[] _edge_lengths; delete _graph; deallocate_array(detection_scores); - deallocate_array(allowed_motion); - delete[] exits; - delete[] entrances; + deallocate_array(allowed_motions); + deallocate_array(exits); + deallocate_array(entrances); } void MTPTracker::allocate(int t, int l) { @@ -44,28 +44,25 @@ void MTPTracker::allocate(int t, int l) { nb_time_steps = t; detection_scores = allocate_array(nb_time_steps, nb_locations); - allowed_motion = allocate_array(nb_locations, nb_locations); + allowed_motions = allocate_array(nb_locations, nb_locations); - entrances = new int[nb_locations]; - exits = new int[nb_locations]; + entrances = allocate_array(nb_time_steps, nb_locations); + exits = allocate_array(nb_time_steps, nb_locations); for(int l = 0; l < nb_locations; l++) { - entrances[l] = 0; - exits[l] = 0; for(int m = 0; m < nb_locations; m++) { - allowed_motion[l][m] = 0; + allowed_motions[l][m] = 0; } } for(int t = 0; t < nb_time_steps; t++) { for(int l = 0; l < nb_locations; l++) { detection_scores[t][l] = 0.0; + entrances[t][l] = 0; + exits[t][l] = 0; } } - force_empty_first_frame = 0; - force_empty_last_frame = 0; - _edge_lengths = 0; _graph = 0; } @@ -77,27 +74,27 @@ void MTPTracker::write(ostream *os) { for(int l = 0; l < nb_locations; l++) { for(int m = 0; m < nb_locations; m++) { - (*os) << allowed_motion[l][m]; + (*os) << allowed_motions[l][m]; if(m < nb_locations - 1) (*os) << " "; else (*os) << endl; } } (*os) << endl; - (*os) << force_empty_first_frame << " " << force_empty_last_frame << endl; - - (*os) << endl; - - for(int l = 0; l < nb_locations; l++) { - (*os) << entrances[l]; - if(l < nb_locations - 1) (*os) << " "; else (*os) << endl; + for(int t = 0; t < nb_time_steps; t++) { + for(int l = 0; l < nb_locations; l++) { + (*os) << entrances[t][l]; + if(l < nb_locations - 1) (*os) << " "; else (*os) << endl; + } } (*os) << endl; - for(int l = 0; l < nb_locations; l++) { - (*os) << exits[l]; - if(l < nb_locations - 1) (*os) << " "; else (*os) << endl; + for(int t = 0; t < nb_time_steps; t++) { + for(int l = 0; l < nb_locations; l++) { + (*os) << exits[t][l]; + if(l < nb_locations - 1) (*os) << " "; else (*os) << endl; + } } (*os) << endl; @@ -111,7 +108,7 @@ void MTPTracker::write(ostream *os) { } void MTPTracker::read(istream *is) { - int l, t; + int l = 0, t = 0; (*is) >> l >> t; @@ -119,18 +116,20 @@ void MTPTracker::read(istream *is) { for(int l = 0; l < nb_locations; l++) { for(int m = 0; m < nb_locations; m++) { - (*is) >> allowed_motion[l][m]; + (*is) >> allowed_motions[l][m]; } } - (*is) >> force_empty_first_frame >> force_empty_last_frame; - - for(int l = 0; l < nb_locations; l++) { - (*is) >> entrances[l]; + for(int t = 0; t < nb_time_steps; t++) { + for(int l = 0; l < nb_locations; l++) { + (*is) >> entrances[t][l]; + } } - for(int l = 0; l < nb_locations; l++) { - (*is) >> exits[l]; + for(int t = 0; t < nb_time_steps; t++) { + for(int l = 0; l < nb_locations; l++) { + (*is) >> exits[t][l]; + } } for(int t = 0; t < nb_time_steps; t++) { @@ -159,7 +158,7 @@ MTPTracker::MTPTracker() { nb_time_steps = 0; detection_scores = 0; - allowed_motion = 0; + allowed_motions = 0; entrances = 0; exits = 0; @@ -169,12 +168,7 @@ MTPTracker::MTPTracker() { } MTPTracker::~MTPTracker() { - delete[] _edge_lengths; - delete _graph; - deallocate_array(detection_scores); - deallocate_array(allowed_motion); - delete[] exits; - delete[] entrances; + free(); } int MTPTracker::early_pair_node(int t, int l) { @@ -193,10 +187,12 @@ void MTPTracker::build_graph() { int nb_motions = 0, nb_exits = 0, nb_entrances = 0; for(int l = 0; l < nb_locations; l++) { - if(exits[l]) nb_exits++; - if(entrances[l]) nb_entrances++; + for(int t = 0; t < nb_time_steps; t++) { + if(exits[t][l]) nb_exits++; + if(entrances[t][l]) nb_entrances++; + } for(int m = 0; m < nb_locations; m++) { - if(allowed_motion[l][m]) nb_motions++; + if(allowed_motions[l][m]) nb_motions++; } } @@ -204,28 +200,13 @@ void MTPTracker::build_graph() { int nb_edges = // The edges from the source to the entrances and from 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) + + // to the sink + nb_exits + nb_entrances + // 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; - // Edges from the source to the first frame - if(force_empty_first_frame) { - nb_edges += nb_entrances; - } else { - nb_edges += nb_locations; - } - - // Edges from the last frame to the sink - if(force_empty_last_frame) { - nb_edges += nb_exits; - } else { - nb_edges += nb_locations; - } - int *node_from = new int[nb_edges]; int *node_to = new int[nb_edges]; @@ -246,34 +227,12 @@ void MTPTracker::build_graph() { } } - // The edges from the source to the first time frame - - for(int l = 0; l < nb_locations; l++) { - if(!force_empty_first_frame || entrances[l]) { - node_from[e] = source; - node_to[e] = 1 + l + 0 * nb_locations; - _edge_lengths[e] = 0.0; - e++; - } - } - - // The edges from the last frame to the sink - - for(int l = 0; l < nb_locations; l++) { - if(!force_empty_last_frame || exits[l]) { - node_from[e] = late_pair_node(nb_time_steps - 1, l); - node_to[e] = sink; - _edge_lengths[e] = 0.0; - e++; - } - } - // The edges between frames, corresponding to allowed motions for(int t = 0; t < nb_time_steps - 1; t++) { for(int l = 0; l < nb_locations; l++) { for(int k = 0; k < nb_locations; k++) { - if(allowed_motion[l][k]) { + if(allowed_motions[l][k]) { node_from[e] = late_pair_node(t, l); node_to[e] = early_pair_node(t+1, k); _edge_lengths[e] = 0.0; @@ -288,13 +247,13 @@ void MTPTracker::build_graph() { for(int t = 0; t < nb_time_steps; t++) { for(int l = 0; l < nb_locations; l++) { - if(t > 0 && entrances[l]) { + if(entrances[t][l]) { node_from[e] = source; node_to[e] = early_pair_node(t, l); _edge_lengths[e] = 0.0; e++; } - if(t < nb_time_steps - 1 && exits[l]) { + if(exits[t][l]) { node_from[e] = late_pair_node(t, l); node_to[e] = sink; _edge_lengths[e] = 0.0;