* INTRODUCTION This is a very simple implementation of a variant of KSP applied to multi-target tracking dubbed "Multi-Tracked Paths" (MTP). It works with negative edge length and stops when it can not find any path of negative total length, instead of fixing the total number of paths to a constant K. * INSTALLATION This source code should compile with any C++ compiler. Just execute make ./mtp_example It will create a synthetic dummy example, save its description in tracker.dat, and print the optimal detected trajectories. If you now execute ./mtp tracker.dat It will load the tracker.dat example, run the detection, save the detected trajectories in result.trj, and the underlying graph with occupied edges in graph.dot. You can produce a pdf from the latter with the dot command from graphviz: dot < graph.dot -T pdf -o graph.pdf * IMPLEMENTATION The two main classes are MTPGraph and Tracker. The MTPGraph class stores a directed acyclic graph (DAG), with a length for each edge -- which can be negative -- and can compute the family of paths in this graph that minimizes the sum of edge lengths. This means that it will iteratively add paths as long as it can find some with negative length. If there are no such path, it will compute no path at all. Note that the solution it finds is globally optimal. Note that the procedure is similar to that of KSP, in the sense that the family it computes eventually is globally optimal, even if the procedure is iterative. The Tracker class allows (1) to define a spatial topology composed of - a number of locations - the allowed motions between them (i.e. a Boolean flag for each pair of locations) - the entrances (a Boolean flag for each location) - the exits (a Boolean flag for each location) (2) to define a number of time steps (3) to set for every location and time a detection score, which should be equal to log(P(Y = 1 | X)/P(Y = 0 | X)) where Y stands for the location occupancy and X for the observations. From this setting, it computes the best set of disjoint trajectories consistent with the topology, which maximizes the overall detection score (i.e. the sum of the detection scores of the nodes visited by the trajectories) The Tracker class uses the MTPGraph. From the definition of the spatial topology, it builds a graph with one source, one sink, and two nodes per location and time. This structure ensures the trajectories computed by the tracker to be node-disjoint by forcing the paths computed by the MTPGraph to be edge-disjoint. The edges from the source or to the sink, or between these pairs, are of length zero, and the edge between the two nodes of such a pair has a length equal to the opposite of the detection score. The file mtp.cc gives a very simple usage example of the Tracker class. -- François Fleuret August 2012