nrl-tracker 0.21.4__tar.gz → 0.22.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. {nrl_tracker-0.21.4/nrl_tracker.egg-info → nrl_tracker-0.22.0}/PKG-INFO +2 -2
  2. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/README.md +1 -1
  3. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0/nrl_tracker.egg-info}/PKG-INFO +2 -2
  4. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/nrl_tracker.egg-info/SOURCES.txt +4 -0
  5. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pyproject.toml +1 -1
  6. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/__init__.py +9 -11
  7. nrl_tracker-0.22.0/pytcl/assignment_algorithms/__init__.py +84 -0
  8. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/assignment_algorithms/data_association.py +9 -10
  9. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/assignment_algorithms/gating.py +7 -5
  10. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/assignment_algorithms/jpda.py +10 -14
  11. nrl_tracker-0.22.0/pytcl/assignment_algorithms/three_dimensional/__init__.py +22 -0
  12. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/assignment_algorithms/three_dimensional/assignment.py +6 -2
  13. nrl_tracker-0.22.0/pytcl/assignment_algorithms/two_dimensional/__init__.py +31 -0
  14. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/assignment_algorithms/two_dimensional/assignment.py +5 -2
  15. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/assignment_algorithms/two_dimensional/kbest.py +9 -9
  16. nrl_tracker-0.22.0/pytcl/astronomical/__init__.py +262 -0
  17. nrl_tracker-0.22.0/pytcl/astronomical/ephemerides.py +524 -0
  18. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/astronomical/lambert.py +6 -15
  19. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/astronomical/orbital_mechanics.py +1 -3
  20. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/astronomical/reference_frames.py +1 -3
  21. nrl_tracker-0.22.0/pytcl/astronomical/relativity.py +466 -0
  22. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/astronomical/time_systems.py +2 -1
  23. nrl_tracker-0.22.0/pytcl/atmosphere/__init__.py +35 -0
  24. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/atmosphere/models.py +5 -5
  25. nrl_tracker-0.22.0/pytcl/clustering/__init__.py +71 -0
  26. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/clustering/dbscan.py +5 -2
  27. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/clustering/gaussian_mixture.py +10 -10
  28. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/clustering/hierarchical.py +7 -7
  29. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/clustering/kmeans.py +7 -5
  30. nrl_tracker-0.22.0/pytcl/containers/__init__.py +75 -0
  31. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/containers/cluster_set.py +13 -20
  32. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/containers/covertree.py +8 -2
  33. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/containers/kd_tree.py +6 -2
  34. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/containers/measurement_set.py +11 -16
  35. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/containers/rtree.py +8 -7
  36. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/containers/track_list.py +13 -13
  37. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/containers/vptree.py +7 -2
  38. nrl_tracker-0.22.0/pytcl/coordinate_systems/__init__.py +176 -0
  39. nrl_tracker-0.22.0/pytcl/coordinate_systems/conversions/__init__.py +55 -0
  40. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/coordinate_systems/conversions/geodetic.py +7 -17
  41. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/coordinate_systems/conversions/spherical.py +4 -2
  42. nrl_tracker-0.22.0/pytcl/coordinate_systems/jacobians/__init__.py +35 -0
  43. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/coordinate_systems/jacobians/jacobians.py +2 -1
  44. nrl_tracker-0.22.0/pytcl/coordinate_systems/projections/__init__.py +93 -0
  45. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/coordinate_systems/projections/projections.py +14 -39
  46. nrl_tracker-0.22.0/pytcl/coordinate_systems/rotations/__init__.py +54 -0
  47. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/coordinate_systems/rotations/rotations.py +3 -4
  48. nrl_tracker-0.22.0/pytcl/core/__init__.py +47 -0
  49. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/core/array_utils.py +7 -7
  50. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/core/constants.py +1 -3
  51. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/core/validation.py +13 -19
  52. nrl_tracker-0.22.0/pytcl/dynamic_estimation/__init__.py +198 -0
  53. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/imm.py +10 -15
  54. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/information_filter.py +8 -6
  55. nrl_tracker-0.22.0/pytcl/dynamic_estimation/kalman/__init__.py +103 -0
  56. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/kalman/extended.py +4 -5
  57. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/kalman/linear.py +7 -3
  58. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/kalman/square_root.py +7 -8
  59. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/kalman/unscented.py +8 -6
  60. nrl_tracker-0.22.0/pytcl/dynamic_estimation/particle_filters/__init__.py +36 -0
  61. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +8 -8
  62. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/smoothers.py +9 -10
  63. nrl_tracker-0.22.0/pytcl/dynamic_models/__init__.py +106 -0
  64. nrl_tracker-0.22.0/pytcl/dynamic_models/continuous_time/__init__.py +40 -0
  65. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_models/continuous_time/dynamics.py +4 -2
  66. nrl_tracker-0.22.0/pytcl/dynamic_models/discrete_time/__init__.py +35 -0
  67. nrl_tracker-0.22.0/pytcl/dynamic_models/process_noise/__init__.py +35 -0
  68. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_models/process_noise/polynomial.py +2 -6
  69. nrl_tracker-0.22.0/pytcl/gravity/__init__.py +140 -0
  70. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/gravity/clenshaw.py +4 -7
  71. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/gravity/egm.py +9 -6
  72. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/gravity/models.py +1 -3
  73. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/gravity/spherical_harmonics.py +6 -11
  74. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/gravity/tides.py +9 -17
  75. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/magnetism/__init__.py +26 -36
  76. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/magnetism/emm.py +7 -13
  77. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/magnetism/igrf.py +5 -6
  78. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/magnetism/wmm.py +4 -10
  79. nrl_tracker-0.22.0/pytcl/mathematical_functions/__init__.py +190 -0
  80. nrl_tracker-0.22.0/pytcl/mathematical_functions/basic_matrix/__init__.py +72 -0
  81. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/basic_matrix/decompositions.py +6 -5
  82. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +2 -1
  83. nrl_tracker-0.22.0/pytcl/mathematical_functions/combinatorics/__init__.py +53 -0
  84. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -4
  85. nrl_tracker-0.22.0/pytcl/mathematical_functions/geometry/__init__.py +48 -0
  86. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/geometry/geometry.py +10 -15
  87. nrl_tracker-0.22.0/pytcl/mathematical_functions/interpolation/__init__.py +35 -0
  88. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/interpolation/interpolation.py +8 -5
  89. nrl_tracker-0.22.0/pytcl/mathematical_functions/numerical_integration/__init__.py +51 -0
  90. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -2
  91. nrl_tracker-0.22.0/pytcl/mathematical_functions/signal_processing/__init__.py +117 -0
  92. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/signal_processing/detection.py +9 -9
  93. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/signal_processing/filters.py +7 -8
  94. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/signal_processing/matched_filter.py +8 -7
  95. nrl_tracker-0.22.0/pytcl/mathematical_functions/special_functions/__init__.py +196 -0
  96. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/bessel.py +2 -1
  97. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/debye.py +4 -2
  98. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/elliptic.py +3 -4
  99. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/error_functions.py +2 -1
  100. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/gamma_functions.py +3 -4
  101. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/hypergeometric.py +2 -1
  102. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/lambert_w.py +3 -4
  103. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/special_functions/marcum_q.py +2 -1
  104. nrl_tracker-0.22.0/pytcl/mathematical_functions/statistics/__init__.py +69 -0
  105. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/statistics/distributions.py +21 -40
  106. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/statistics/estimators.py +3 -4
  107. nrl_tracker-0.22.0/pytcl/mathematical_functions/transforms/__init__.py +114 -0
  108. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/transforms/fourier.py +5 -2
  109. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/transforms/stft.py +8 -11
  110. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/transforms/wavelets.py +13 -20
  111. nrl_tracker-0.22.0/pytcl/navigation/__init__.py +227 -0
  112. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/navigation/geodesy.py +13 -33
  113. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/navigation/great_circle.py +7 -13
  114. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/navigation/ins.py +12 -16
  115. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/navigation/ins_gnss.py +24 -37
  116. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/navigation/rhumb.py +7 -12
  117. nrl_tracker-0.22.0/pytcl/performance_evaluation/__init__.py +78 -0
  118. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/performance_evaluation/estimation_metrics.py +3 -1
  119. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/performance_evaluation/track_metrics.py +4 -4
  120. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/plotting/__init__.py +30 -38
  121. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/plotting/coordinates.py +8 -18
  122. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/plotting/ellipses.py +5 -2
  123. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/plotting/metrics.py +5 -10
  124. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/plotting/tracks.py +7 -12
  125. nrl_tracker-0.22.0/pytcl/static_estimation/__init__.py +99 -0
  126. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/static_estimation/least_squares.py +5 -4
  127. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/static_estimation/maximum_likelihood.py +8 -5
  128. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/static_estimation/robust.py +5 -2
  129. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/terrain/__init__.py +28 -34
  130. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/terrain/dem.py +6 -9
  131. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/terrain/loaders.py +9 -14
  132. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/terrain/visibility.py +4 -8
  133. nrl_tracker-0.22.0/pytcl/trackers/__init__.py +48 -0
  134. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/trackers/hypothesis.py +8 -8
  135. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/trackers/mht.py +18 -24
  136. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/trackers/multi_target.py +8 -6
  137. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/trackers/single_target.py +5 -2
  138. nrl_tracker-0.22.0/tests/test_ephemerides.py +340 -0
  139. nrl_tracker-0.22.0/tests/test_relativity.py +453 -0
  140. nrl_tracker-0.21.4/pytcl/assignment_algorithms/__init__.py +0 -94
  141. nrl_tracker-0.21.4/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -24
  142. nrl_tracker-0.21.4/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -35
  143. nrl_tracker-0.21.4/pytcl/astronomical/__init__.py +0 -221
  144. nrl_tracker-0.21.4/pytcl/atmosphere/__init__.py +0 -37
  145. nrl_tracker-0.21.4/pytcl/clustering/__init__.py +0 -79
  146. nrl_tracker-0.21.4/pytcl/containers/__init__.py +0 -89
  147. nrl_tracker-0.21.4/pytcl/coordinate_systems/__init__.py +0 -181
  148. nrl_tracker-0.21.4/pytcl/coordinate_systems/conversions/__init__.py +0 -59
  149. nrl_tracker-0.21.4/pytcl/coordinate_systems/jacobians/__init__.py +0 -37
  150. nrl_tracker-0.21.4/pytcl/coordinate_systems/projections/__init__.py +0 -89
  151. nrl_tracker-0.21.4/pytcl/coordinate_systems/rotations/__init__.py +0 -56
  152. nrl_tracker-0.21.4/pytcl/core/__init__.py +0 -53
  153. nrl_tracker-0.21.4/pytcl/dynamic_estimation/__init__.py +0 -207
  154. nrl_tracker-0.21.4/pytcl/dynamic_estimation/kalman/__init__.py +0 -111
  155. nrl_tracker-0.21.4/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -38
  156. nrl_tracker-0.21.4/pytcl/dynamic_models/__init__.py +0 -110
  157. nrl_tracker-0.21.4/pytcl/dynamic_models/continuous_time/__init__.py +0 -40
  158. nrl_tracker-0.21.4/pytcl/dynamic_models/discrete_time/__init__.py +0 -41
  159. nrl_tracker-0.21.4/pytcl/dynamic_models/process_noise/__init__.py +0 -41
  160. nrl_tracker-0.21.4/pytcl/gravity/__init__.py +0 -150
  161. nrl_tracker-0.21.4/pytcl/mathematical_functions/__init__.py +0 -208
  162. nrl_tracker-0.21.4/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -66
  163. nrl_tracker-0.21.4/pytcl/mathematical_functions/combinatorics/__init__.py +0 -49
  164. nrl_tracker-0.21.4/pytcl/mathematical_functions/geometry/__init__.py +0 -48
  165. nrl_tracker-0.21.4/pytcl/mathematical_functions/interpolation/__init__.py +0 -37
  166. nrl_tracker-0.21.4/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -45
  167. nrl_tracker-0.21.4/pytcl/mathematical_functions/signal_processing/__init__.py +0 -105
  168. nrl_tracker-0.21.4/pytcl/mathematical_functions/special_functions/__init__.py +0 -198
  169. nrl_tracker-0.21.4/pytcl/mathematical_functions/statistics/__init__.py +0 -73
  170. nrl_tracker-0.21.4/pytcl/mathematical_functions/transforms/__init__.py +0 -120
  171. nrl_tracker-0.21.4/pytcl/navigation/__init__.py +0 -233
  172. nrl_tracker-0.21.4/pytcl/performance_evaluation/__init__.py +0 -82
  173. nrl_tracker-0.21.4/pytcl/static_estimation/__init__.py +0 -103
  174. nrl_tracker-0.21.4/pytcl/trackers/__init__.py +0 -56
  175. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/CONTRIBUTING.md +0 -0
  176. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/LICENSE +0 -0
  177. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/MANIFEST.in +0 -0
  178. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/nrl_tracker.egg-info/dependency_links.txt +0 -0
  179. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/nrl_tracker.egg-info/requires.txt +0 -0
  180. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/nrl_tracker.egg-info/top_level.txt +0 -0
  181. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
  182. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
  183. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
  184. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
  185. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
  186. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
  187. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/dynamic_models/process_noise/singer.py +0 -0
  188. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
  189. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
  190. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/misc/__init__.py +0 -0
  191. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/physical_values/__init__.py +0 -0
  192. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/scheduling/__init__.py +0 -0
  193. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/pytcl/transponders/__init__.py +0 -0
  194. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/setup.cfg +0 -0
  195. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/__init__.py +0 -0
  196. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/conftest.py +0 -0
  197. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_additional_trees.py +0 -0
  198. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_assignment_algorithms.py +0 -0
  199. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_astronomical.py +0 -0
  200. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_clustering.py +0 -0
  201. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_coordinate_systems.py +0 -0
  202. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_coverage_boost.py +0 -0
  203. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_coverage_boost_2.py +0 -0
  204. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_dynamic_models.py +0 -0
  205. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_egm.py +0 -0
  206. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_emm.py +0 -0
  207. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_gaussian_mixtures.py +0 -0
  208. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_geophysical.py +0 -0
  209. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_great_circle.py +0 -0
  210. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_ins.py +0 -0
  211. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_ins_gnss.py +0 -0
  212. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_kalman_filters.py +0 -0
  213. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_mathematical_functions.py +0 -0
  214. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_maximum_likelihood.py +0 -0
  215. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_mht.py +0 -0
  216. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_performance_evaluation.py +0 -0
  217. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_phase6_specialized.py +0 -0
  218. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_plotting.py +0 -0
  219. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_projections.py +0 -0
  220. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_rhumb.py +0 -0
  221. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_signal_processing.py +0 -0
  222. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_smoothers.py +0 -0
  223. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_spatial_structures.py +0 -0
  224. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_special_functions_phase12.py +0 -0
  225. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_static_estimation.py +0 -0
  226. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_terrain.py +0 -0
  227. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_terrain_loaders.py +0 -0
  228. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_tides.py +0 -0
  229. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_trackers.py +0 -0
  230. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_tracking_containers.py +0 -0
  231. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_transforms.py +0 -0
  232. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_v030_comprehensive.py +0 -0
  233. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/test_v030_features.py +0 -0
  234. {nrl_tracker-0.21.4 → nrl_tracker-0.22.0}/tests/unit/test_core.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 0.21.4
3
+ Version: 0.22.0
4
4
  Summary: Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms
5
5
  Author: Original: David F. Crouse, Naval Research Laboratory
6
6
  Maintainer: Python Port Contributors
@@ -60,7 +60,7 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
60
60
 
61
61
  # Tracker Component Library (Python)
62
62
 
63
- [![PyPI version](https://img.shields.io/badge/pypi-v0.21.4-blue.svg)](https://pypi.org/project/nrl-tracker/)
63
+ [![PyPI version](https://img.shields.io/badge/pypi-v0.22.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
64
64
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
65
65
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
66
66
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -1,6 +1,6 @@
1
1
  # Tracker Component Library (Python)
2
2
 
3
- [![PyPI version](https://img.shields.io/badge/pypi-v0.21.4-blue.svg)](https://pypi.org/project/nrl-tracker/)
3
+ [![PyPI version](https://img.shields.io/badge/pypi-v0.22.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
4
4
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
5
5
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
6
6
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 0.21.4
3
+ Version: 0.22.0
4
4
  Summary: Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms
5
5
  Author: Original: David F. Crouse, Naval Research Laboratory
6
6
  Maintainer: Python Port Contributors
@@ -60,7 +60,7 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
60
60
 
61
61
  # Tracker Component Library (Python)
62
62
 
63
- [![PyPI version](https://img.shields.io/badge/pypi-v0.21.4-blue.svg)](https://pypi.org/project/nrl-tracker/)
63
+ [![PyPI version](https://img.shields.io/badge/pypi-v0.22.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
64
64
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
65
65
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
66
66
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -19,9 +19,11 @@ pytcl/assignment_algorithms/two_dimensional/__init__.py
19
19
  pytcl/assignment_algorithms/two_dimensional/assignment.py
20
20
  pytcl/assignment_algorithms/two_dimensional/kbest.py
21
21
  pytcl/astronomical/__init__.py
22
+ pytcl/astronomical/ephemerides.py
22
23
  pytcl/astronomical/lambert.py
23
24
  pytcl/astronomical/orbital_mechanics.py
24
25
  pytcl/astronomical/reference_frames.py
26
+ pytcl/astronomical/relativity.py
25
27
  pytcl/astronomical/time_systems.py
26
28
  pytcl/atmosphere/__init__.py
27
29
  pytcl/atmosphere/models.py
@@ -163,6 +165,7 @@ tests/test_coverage_boost_2.py
163
165
  tests/test_dynamic_models.py
164
166
  tests/test_egm.py
165
167
  tests/test_emm.py
168
+ tests/test_ephemerides.py
166
169
  tests/test_gaussian_mixtures.py
167
170
  tests/test_geophysical.py
168
171
  tests/test_great_circle.py
@@ -176,6 +179,7 @@ tests/test_performance_evaluation.py
176
179
  tests/test_phase6_specialized.py
177
180
  tests/test_plotting.py
178
181
  tests/test_projections.py
182
+ tests/test_relativity.py
179
183
  tests/test_rhumb.py
180
184
  tests/test_signal_processing.py
181
185
  tests/test_smoothers.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "nrl-tracker"
7
- version = "0.21.4"
7
+ version = "0.22.0"
8
8
  description = "Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms"
9
9
  readme = "README.md"
10
10
  authors = [
@@ -20,7 +20,7 @@ References
20
20
  no. 5, pp. 18-27, May 2017.
21
21
  """
22
22
 
23
- __version__ = "0.21.4"
23
+ __version__ = "0.22.0"
24
24
  __author__ = "Python Port Contributors"
25
25
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
26
 
@@ -30,16 +30,14 @@ __original_author__ = "David F. Crouse, Naval Research Laboratory"
30
30
  # Specialized domains (Phase 6)
31
31
  # Assignment algorithms (Phase 5)
32
32
  # Core utilities
33
- from pytcl import (
34
- assignment_algorithms,
35
- astronomical,
36
- atmosphere,
37
- core,
38
- navigation,
39
- performance_evaluation,
40
- plotting,
41
- trackers,
42
- )
33
+ from pytcl import assignment_algorithms
34
+ from pytcl import astronomical
35
+ from pytcl import atmosphere
36
+ from pytcl import core
37
+ from pytcl import navigation
38
+ from pytcl import performance_evaluation
39
+ from pytcl import plotting
40
+ from pytcl import trackers
43
41
 
44
42
 
45
43
  # Version tuple for programmatic access
@@ -0,0 +1,84 @@
1
+ """
2
+ Assignment algorithms for data association in target tracking.
3
+
4
+ This module provides:
5
+ - 2D assignment algorithms (Hungarian, Auction)
6
+ - K-best 2D assignment (Murty's algorithm)
7
+ - 3D assignment algorithms (Lagrangian relaxation, Auction)
8
+ - Gating methods (ellipsoidal, rectangular)
9
+ - Data association algorithms (GNN, JPDA)
10
+ """
11
+
12
+ from pytcl.assignment_algorithms.data_association import AssociationResult
13
+ from pytcl.assignment_algorithms.data_association import compute_association_cost
14
+ from pytcl.assignment_algorithms.data_association import gated_gnn_association
15
+ from pytcl.assignment_algorithms.data_association import gnn_association
16
+ from pytcl.assignment_algorithms.data_association import nearest_neighbor
17
+ from pytcl.assignment_algorithms.gating import chi2_gate_threshold
18
+ from pytcl.assignment_algorithms.gating import compute_gate_volume
19
+ from pytcl.assignment_algorithms.gating import ellipsoidal_gate
20
+ from pytcl.assignment_algorithms.gating import gate_measurements
21
+ from pytcl.assignment_algorithms.gating import mahalanobis_distance
22
+ from pytcl.assignment_algorithms.gating import rectangular_gate
23
+ from pytcl.assignment_algorithms.jpda import JPDAResult
24
+ from pytcl.assignment_algorithms.jpda import JPDAUpdate
25
+ from pytcl.assignment_algorithms.jpda import compute_likelihood_matrix
26
+ from pytcl.assignment_algorithms.jpda import jpda
27
+ from pytcl.assignment_algorithms.jpda import jpda_probabilities
28
+ from pytcl.assignment_algorithms.jpda import jpda_update
29
+ from pytcl.assignment_algorithms.three_dimensional import Assignment3DResult
30
+ from pytcl.assignment_algorithms.three_dimensional import assign3d
31
+ from pytcl.assignment_algorithms.three_dimensional import assign3d_auction
32
+ from pytcl.assignment_algorithms.three_dimensional import assign3d_lagrangian
33
+ from pytcl.assignment_algorithms.three_dimensional import decompose_to_2d
34
+ from pytcl.assignment_algorithms.three_dimensional import greedy_3d
35
+ from pytcl.assignment_algorithms.two_dimensional import AssignmentResult
36
+ from pytcl.assignment_algorithms.two_dimensional import KBestResult
37
+ from pytcl.assignment_algorithms.two_dimensional import assign2d
38
+ from pytcl.assignment_algorithms.two_dimensional import auction
39
+ from pytcl.assignment_algorithms.two_dimensional import hungarian
40
+ from pytcl.assignment_algorithms.two_dimensional import kbest_assign2d
41
+ from pytcl.assignment_algorithms.two_dimensional import linear_sum_assignment
42
+ from pytcl.assignment_algorithms.two_dimensional import murty
43
+ from pytcl.assignment_algorithms.two_dimensional import ranked_assignments
44
+
45
+ __all__ = [
46
+ # 2D Assignment
47
+ "hungarian",
48
+ "auction",
49
+ "linear_sum_assignment",
50
+ "assign2d",
51
+ "AssignmentResult",
52
+ # K-Best 2D Assignment
53
+ "KBestResult",
54
+ "murty",
55
+ "kbest_assign2d",
56
+ "ranked_assignments",
57
+ # 3D Assignment
58
+ "Assignment3DResult",
59
+ "assign3d",
60
+ "assign3d_lagrangian",
61
+ "assign3d_auction",
62
+ "greedy_3d",
63
+ "decompose_to_2d",
64
+ # Gating
65
+ "ellipsoidal_gate",
66
+ "rectangular_gate",
67
+ "gate_measurements",
68
+ "mahalanobis_distance",
69
+ "chi2_gate_threshold",
70
+ "compute_gate_volume",
71
+ # Data Association
72
+ "gnn_association",
73
+ "nearest_neighbor",
74
+ "compute_association_cost",
75
+ "gated_gnn_association",
76
+ "AssociationResult",
77
+ # JPDA
78
+ "JPDAResult",
79
+ "JPDAUpdate",
80
+ "jpda",
81
+ "jpda_update",
82
+ "jpda_probabilities",
83
+ "compute_likelihood_matrix",
84
+ ]
@@ -5,18 +5,17 @@ This module provides algorithms for associating measurements to tracks,
5
5
  including Global Nearest Neighbor (GNN) and related methods.
6
6
  """
7
7
 
8
- from typing import List, NamedTuple, Optional
8
+ from typing import List
9
+ from typing import NamedTuple
10
+ from typing import Optional
9
11
 
10
12
  import numpy as np
11
- from numpy.typing import ArrayLike, NDArray
12
-
13
- from pytcl.assignment_algorithms.gating import (
14
- mahalanobis_batch,
15
- mahalanobis_distance,
16
- )
17
- from pytcl.assignment_algorithms.two_dimensional import (
18
- assign2d,
19
- )
13
+ from numpy.typing import ArrayLike
14
+ from numpy.typing import NDArray
15
+
16
+ from pytcl.assignment_algorithms.gating import mahalanobis_batch
17
+ from pytcl.assignment_algorithms.gating import mahalanobis_distance
18
+ from pytcl.assignment_algorithms.two_dimensional import assign2d
20
19
 
21
20
 
22
21
  class AssociationResult(NamedTuple):
@@ -5,11 +5,13 @@ This module provides gating methods to determine which measurements
5
5
  fall within a validation region around predicted track states.
6
6
  """
7
7
 
8
- from typing import List, Tuple
8
+ from typing import List
9
+ from typing import Tuple
9
10
 
10
11
  import numpy as np
11
12
  from numba import njit
12
- from numpy.typing import ArrayLike, NDArray
13
+ from numpy.typing import ArrayLike
14
+ from numpy.typing import NDArray
13
15
  from scipy.stats import chi2
14
16
 
15
17
 
@@ -19,9 +21,9 @@ def _mahalanobis_distance_2d(
19
21
  S_inv: np.ndarray,
20
22
  ) -> float:
21
23
  """JIT-compiled Mahalanobis distance for 2D innovations."""
22
- return innovation[0] * (
23
- S_inv[0, 0] * innovation[0] + S_inv[0, 1] * innovation[1]
24
- ) + innovation[1] * (S_inv[1, 0] * innovation[0] + S_inv[1, 1] * innovation[1])
24
+ return innovation[0] * (S_inv[0, 0] * innovation[0] + S_inv[0, 1] * innovation[1]) + innovation[
25
+ 1
26
+ ] * (S_inv[1, 0] * innovation[0] + S_inv[1, 1] * innovation[1])
25
27
 
26
28
 
27
29
  @njit(cache=True, fastmath=True)
@@ -9,11 +9,15 @@ This is more sophisticated than GNN which makes hard assignment decisions,
9
9
  as JPDA can handle measurement origin uncertainty in cluttered environments.
10
10
  """
11
11
 
12
- from typing import List, NamedTuple, Optional, Tuple
12
+ from typing import List
13
+ from typing import NamedTuple
14
+ from typing import Optional
15
+ from typing import Tuple
13
16
 
14
17
  import numpy as np
15
18
  from numba import njit
16
- from numpy.typing import ArrayLike, NDArray
19
+ from numpy.typing import ArrayLike
20
+ from numpy.typing import NDArray
17
21
  from scipy.stats import chi2
18
22
 
19
23
  from pytcl.assignment_algorithms.gating import mahalanobis_distance
@@ -94,9 +98,7 @@ def compute_measurement_likelihood(
94
98
  return 0.0
95
99
 
96
100
  mahal_sq = innovation @ np.linalg.solve(innovation_cov, innovation)
97
- likelihood = (
98
- detection_prob * np.exp(-0.5 * mahal_sq) / np.sqrt((2 * np.pi) ** m * det_S)
99
- )
101
+ likelihood = detection_prob * np.exp(-0.5 * mahal_sq) / np.sqrt((2 * np.pi) ** m * det_S)
100
102
 
101
103
  return likelihood
102
104
 
@@ -210,9 +212,7 @@ def jpda_probabilities(
210
212
  if n_tracks <= 5 and n_meas <= 5:
211
213
  beta = _jpda_exact(likelihood_matrix, gated, detection_prob, clutter_density)
212
214
  else:
213
- beta = _jpda_approximate(
214
- likelihood_matrix, gated, detection_prob, clutter_density
215
- )
215
+ beta = _jpda_approximate(likelihood_matrix, gated, detection_prob, clutter_density)
216
216
 
217
217
  return beta
218
218
 
@@ -258,9 +258,7 @@ def _jpda_exact(
258
258
  if gated[track_idx, meas_idx] and track_idx not in used_tracks:
259
259
  current_assignment.append(track_idx)
260
260
  used_tracks.add(track_idx)
261
- yield from generate_hypotheses(
262
- meas_idx + 1, current_assignment, used_tracks
263
- )
261
+ yield from generate_hypotheses(meas_idx + 1, current_assignment, used_tracks)
264
262
  used_tracks.remove(track_idx)
265
263
  current_assignment.pop()
266
264
 
@@ -298,9 +296,7 @@ def _jpda_exact(
298
296
  hypothesis_probs = [p / total_prob for p in hypothesis_probs]
299
297
 
300
298
  # Compute marginal association probabilities
301
- for h_idx, (assignment, prob) in enumerate(
302
- zip(hypothesis_assignments, hypothesis_probs)
303
- ):
299
+ for h_idx, (assignment, prob) in enumerate(zip(hypothesis_assignments, hypothesis_probs)):
304
300
  detected_tracks = set()
305
301
  for j, track_idx in enumerate(assignment):
306
302
  if track_idx >= 0:
@@ -0,0 +1,22 @@
1
+ """
2
+ Three-dimensional assignment algorithms.
3
+
4
+ This module provides algorithms for solving 3D assignment problems,
5
+ which arise in multi-sensor data fusion and multi-scan tracking.
6
+ """
7
+
8
+ from pytcl.assignment_algorithms.three_dimensional.assignment import Assignment3DResult
9
+ from pytcl.assignment_algorithms.three_dimensional.assignment import assign3d
10
+ from pytcl.assignment_algorithms.three_dimensional.assignment import assign3d_auction
11
+ from pytcl.assignment_algorithms.three_dimensional.assignment import assign3d_lagrangian
12
+ from pytcl.assignment_algorithms.three_dimensional.assignment import decompose_to_2d
13
+ from pytcl.assignment_algorithms.three_dimensional.assignment import greedy_3d
14
+
15
+ __all__ = [
16
+ "Assignment3DResult",
17
+ "assign3d",
18
+ "assign3d_lagrangian",
19
+ "assign3d_auction",
20
+ "greedy_3d",
21
+ "decompose_to_2d",
22
+ ]
@@ -11,10 +11,14 @@ cost subject to the constraint that each index appears in at most one
11
11
  selected tuple.
12
12
  """
13
13
 
14
- from typing import List, NamedTuple, Optional, Tuple
14
+ from typing import List
15
+ from typing import NamedTuple
16
+ from typing import Optional
17
+ from typing import Tuple
15
18
 
16
19
  import numpy as np
17
- from numpy.typing import ArrayLike, NDArray
20
+ from numpy.typing import ArrayLike
21
+ from numpy.typing import NDArray
18
22
  from scipy.optimize import linear_sum_assignment as scipy_lsa
19
23
 
20
24
 
@@ -0,0 +1,31 @@
1
+ """
2
+ Two-dimensional assignment algorithms.
3
+
4
+ This module provides optimal and suboptimal algorithms for solving
5
+ the 2D assignment problem (bipartite matching), as well as k-best
6
+ assignment algorithms for Multiple Hypothesis Tracking.
7
+ """
8
+
9
+ from pytcl.assignment_algorithms.two_dimensional.assignment import AssignmentResult
10
+ from pytcl.assignment_algorithms.two_dimensional.assignment import assign2d
11
+ from pytcl.assignment_algorithms.two_dimensional.assignment import auction
12
+ from pytcl.assignment_algorithms.two_dimensional.assignment import hungarian
13
+ from pytcl.assignment_algorithms.two_dimensional.assignment import linear_sum_assignment
14
+ from pytcl.assignment_algorithms.two_dimensional.kbest import KBestResult
15
+ from pytcl.assignment_algorithms.two_dimensional.kbest import kbest_assign2d
16
+ from pytcl.assignment_algorithms.two_dimensional.kbest import murty
17
+ from pytcl.assignment_algorithms.two_dimensional.kbest import ranked_assignments
18
+
19
+ __all__ = [
20
+ # 2D Assignment
21
+ "hungarian",
22
+ "auction",
23
+ "linear_sum_assignment",
24
+ "assign2d",
25
+ "AssignmentResult",
26
+ # K-Best Assignment
27
+ "KBestResult",
28
+ "murty",
29
+ "kbest_assign2d",
30
+ "ranked_assignments",
31
+ ]
@@ -5,10 +5,13 @@ This module provides algorithms for solving the 2D assignment (bipartite matchin
5
5
  problem, which is fundamental to data association in target tracking.
6
6
  """
7
7
 
8
- from typing import NamedTuple, Optional, Tuple
8
+ from typing import NamedTuple
9
+ from typing import Optional
10
+ from typing import Tuple
9
11
 
10
12
  import numpy as np
11
- from numpy.typing import ArrayLike, NDArray
13
+ from numpy.typing import ArrayLike
14
+ from numpy.typing import NDArray
12
15
  from scipy.optimize import linear_sum_assignment as scipy_lsa
13
16
 
14
17
 
@@ -6,16 +6,18 @@ This module provides algorithms for finding the k best solutions to the
6
6
  Multiple Hypothesis Tracking (MHT).
7
7
  """
8
8
 
9
- from typing import List, NamedTuple, Optional, Tuple
9
+ from typing import List
10
+ from typing import NamedTuple
11
+ from typing import Optional
12
+ from typing import Tuple
10
13
 
11
14
  import numpy as np
12
- from numpy.typing import ArrayLike, NDArray
15
+ from numpy.typing import ArrayLike
16
+ from numpy.typing import NDArray
13
17
  from scipy.optimize import linear_sum_assignment as scipy_lsa
14
18
 
15
- from pytcl.assignment_algorithms.two_dimensional.assignment import (
16
- AssignmentResult,
17
- assign2d,
18
- )
19
+ from pytcl.assignment_algorithms.two_dimensional.assignment import AssignmentResult
20
+ from pytcl.assignment_algorithms.two_dimensional.assignment import assign2d
19
21
 
20
22
 
21
23
  class KBestResult(NamedTuple):
@@ -335,9 +337,7 @@ def _partition_solution(
335
337
 
336
338
  for i in range(start_idx, n_assigned):
337
339
  # Require assignments 0..i-1, forbid assignment i
338
- new_required = required + [
339
- (row_ind[j], col_ind[j]) for j in range(start_idx, i)
340
- ]
340
+ new_required = required + [(row_ind[j], col_ind[j]) for j in range(start_idx, i)]
341
341
  new_forbidden = forbidden + [(row_ind[i], col_ind[i])]
342
342
 
343
343
  # Solve constrained problem