Commit c1c34ef
committed
Match subnets in O(n^3) via linear_sum_assignment.
To solve subnets, instead of brute-forcing the n! combinations, use
scipy.optimize.linear_sum_assignment (commonly known as the
Hungarian/Munkres algorithm, although scipy actually uses a different
algorithm) which provides a solution in O(n^3). This is not an original
idea; see e.g.
https://imagej.net/imagej-wiki-static/TrackMate_Algorithms.html#Solving_LAP
Locally, this method solves the "slow" example in adaptive-search.ipynb
(`tracks_regular = trackpy.link_df(cg, 0.75)`) in ~50ms instead of 1min.
linear_sum_assignment ("lsa") was extensively benchmarked in scipy
PR#12541 (which was most about adding a *sparse* variant, but one can
just look at the performance of lsa), which shows sub-second runtimes
for thousands of inputs. This is also why this PR fully skips the use
of MAX_SUB_NET (at most, one may consider setting an alternate value in
the thousands for this strategy...).
(In fact, it may perhaps(?) be possible to get even better
performance via by completely dropping the subnet paradigm
and just passing the whole distance matrix (sparsified
by removing edges greater than the search range) to
scipy.sparse.csgraph.min_weight_full_bipartite_matching, but 1) one
needs to figure out how to handle unmatched points (maybe by adding
"dummy" points with a high but finite link cost), and 2) this would
require more massive code surgery anyways.)
The docs will need to be updated, but this PR is just to discuss the
implementation.1 parent 42e5315 commit c1c34ef
File tree
4 files changed
+51
-13
lines changed- trackpy
- linking
- tests
4 files changed
+51
-13
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
16 | 21 | | |
17 | 22 | | |
18 | 23 | | |
| |||
50 | 55 | | |
51 | 56 | | |
52 | 57 | | |
53 | | - | |
| 58 | + | |
54 | 59 | | |
55 | 60 | | |
56 | 61 | | |
| |||
143 | 148 | | |
144 | 149 | | |
145 | 150 | | |
146 | | - | |
| 151 | + | |
147 | 152 | | |
148 | 153 | | |
149 | 154 | | |
| |||
241 | 246 | | |
242 | 247 | | |
243 | 248 | | |
244 | | - | |
| 249 | + | |
245 | 250 | | |
246 | 251 | | |
247 | 252 | | |
| |||
391 | 396 | | |
392 | 397 | | |
393 | 398 | | |
394 | | - | |
| 399 | + | |
395 | 400 | | |
396 | | - | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
397 | 404 | | |
398 | 405 | | |
399 | 406 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
10 | 11 | | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
15 | 45 | | |
16 | 46 | | |
17 | 47 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
304 | 304 | | |
305 | 305 | | |
306 | 306 | | |
307 | | - | |
| 307 | + | |
308 | 308 | | |
309 | 309 | | |
310 | 310 | | |
311 | 311 | | |
312 | | - | |
| 312 | + | |
| 313 | + | |
313 | 314 | | |
314 | 315 | | |
315 | 316 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
102 | 102 | | |
103 | 103 | | |
104 | 104 | | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
109 | 109 | | |
110 | 110 | | |
111 | 111 | | |
| |||
0 commit comments