nrl-tracker 1.7.0__tar.gz → 1.7.3__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 (226) hide show
  1. {nrl_tracker-1.7.0/nrl_tracker.egg-info → nrl_tracker-1.7.3}/PKG-INFO +43 -3
  2. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/README.md +42 -2
  3. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3/nrl_tracker.egg-info}/PKG-INFO +43 -3
  4. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pyproject.toml +1 -1
  5. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/__init__.py +2 -2
  6. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/gating.py +10 -10
  7. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/jpda.py +40 -40
  8. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/nd_assignment.py +5 -4
  9. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/network_flow.py +18 -8
  10. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
  11. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/__init__.py +9 -9
  12. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/ephemerides.py +14 -11
  13. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/reference_frames.py +8 -4
  14. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/relativity.py +6 -5
  15. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/special_orbits.py +9 -13
  16. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/nrlmsise00.py +153 -152
  17. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/dbscan.py +2 -2
  18. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/gaussian_mixture.py +3 -3
  19. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/hierarchical.py +15 -15
  20. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/kmeans.py +4 -4
  21. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/base.py +3 -3
  22. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/cluster_set.py +12 -2
  23. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/covertree.py +5 -3
  24. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/rtree.py +1 -1
  25. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/vptree.py +4 -2
  26. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/conversions/geodetic.py +31 -7
  27. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
  28. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/projections/__init__.py +1 -1
  29. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/projections/projections.py +2 -2
  30. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/rotations/rotations.py +10 -6
  31. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/validation.py +3 -3
  32. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/gaussian_sum_filter.py +20 -38
  33. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/imm.py +14 -14
  34. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/constrained.py +35 -23
  35. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/extended.py +8 -8
  36. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/h_infinity.py +2 -2
  37. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/square_root.py +8 -2
  38. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/sr_ukf.py +3 -3
  39. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/ud_filter.py +11 -5
  40. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/unscented.py +8 -6
  41. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
  42. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/rbpf.py +36 -40
  43. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/spherical_harmonics.py +3 -3
  44. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/tides.py +6 -6
  45. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/logging_config.py +3 -3
  46. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/emm.py +10 -3
  47. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/wmm.py +4 -4
  48. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
  49. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/geometry/geometry.py +5 -5
  50. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
  51. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/detection.py +24 -24
  52. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/filters.py +14 -14
  53. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
  54. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/bessel.py +15 -3
  55. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/debye.py +5 -1
  56. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
  57. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
  58. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/hypergeometric.py +6 -4
  59. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/fourier.py +8 -8
  60. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/stft.py +12 -12
  61. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/wavelets.py +9 -9
  62. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/geodesy.py +3 -3
  63. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/great_circle.py +5 -5
  64. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/coordinates.py +7 -7
  65. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/tracks.py +2 -2
  66. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/maximum_likelihood.py +16 -14
  67. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/robust.py +5 -5
  68. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/loaders.py +5 -5
  69. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/hypothesis.py +1 -1
  70. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/mht.py +9 -9
  71. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/multi_target.py +1 -1
  72. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_assignment_algorithms.py +1 -1
  73. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_constrained_ekf.py +142 -143
  74. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_coordinate_systems.py +8 -8
  75. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_gaussian_sum_filter.py +8 -12
  76. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_nd_assignment.py +2 -6
  77. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_network_flow.py +2 -4
  78. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_nrlmsise00.py +382 -199
  79. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_rbpf.py +55 -24
  80. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_sgp4.py +3 -2
  81. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_special_functions_phase12.py +1 -1
  82. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/CONTRIBUTING.md +0 -0
  83. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/LICENSE +0 -0
  84. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/MANIFEST.in +0 -0
  85. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/SOURCES.txt +0 -0
  86. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/dependency_links.txt +0 -0
  87. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/requires.txt +0 -0
  88. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/top_level.txt +0 -0
  89. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/__init__.py +15 -15
  90. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/data_association.py +0 -0
  91. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
  92. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
  93. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/two_dimensional/assignment.py +0 -0
  94. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
  95. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/lambert.py +0 -0
  96. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/orbital_mechanics.py +0 -0
  97. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/sgp4.py +0 -0
  98. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/time_systems.py +0 -0
  99. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/tle.py +0 -0
  100. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/__init__.py +6 -6
  101. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/ionosphere.py +0 -0
  102. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/models.py +0 -0
  103. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/__init__.py +0 -0
  104. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/__init__.py +0 -0
  105. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/kd_tree.py +0 -0
  106. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/measurement_set.py +0 -0
  107. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/track_list.py +0 -0
  108. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/__init__.py +0 -0
  109. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
  110. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
  111. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
  112. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
  113. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/__init__.py +0 -0
  114. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/array_utils.py +0 -0
  115. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/constants.py +0 -0
  116. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/__init__.py +16 -16
  117. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
  118. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/information_filter.py +0 -0
  119. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/__init__.py +1 -1
  120. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/linear.py +0 -0
  121. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
  122. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
  123. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/smoothers.py +0 -0
  124. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/__init__.py +0 -0
  125. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
  126. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
  127. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/__init__.py +0 -0
  128. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
  129. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
  130. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
  131. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/__init__.py +0 -0
  132. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
  133. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
  134. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/singer.py +0 -0
  135. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/__init__.py +0 -0
  136. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/clenshaw.py +0 -0
  137. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/egm.py +0 -0
  138. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/models.py +0 -0
  139. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/__init__.py +0 -0
  140. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/igrf.py +0 -0
  141. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/__init__.py +0 -0
  142. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
  143. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
  144. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
  145. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
  146. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
  147. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
  148. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/interpolation/__init__.py +0 -0
  149. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
  150. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
  151. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
  152. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
  153. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/__init__.py +0 -0
  154. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
  155. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/lambert_w.py +0 -0
  156. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/marcum_q.py +0 -0
  157. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
  158. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
  159. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
  160. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
  161. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/misc/__init__.py +0 -0
  162. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/__init__.py +0 -0
  163. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/ins.py +0 -0
  164. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/ins_gnss.py +0 -0
  165. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/rhumb.py +0 -0
  166. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/performance_evaluation/__init__.py +0 -0
  167. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
  168. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/performance_evaluation/track_metrics.py +0 -0
  169. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/physical_values/__init__.py +0 -0
  170. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/__init__.py +0 -0
  171. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/ellipses.py +0 -0
  172. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/metrics.py +0 -0
  173. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/scheduling/__init__.py +0 -0
  174. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/__init__.py +0 -0
  175. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/least_squares.py +0 -0
  176. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/__init__.py +0 -0
  177. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/dem.py +0 -0
  178. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/visibility.py +0 -0
  179. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/__init__.py +0 -0
  180. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/single_target.py +0 -0
  181. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/transponders/__init__.py +0 -0
  182. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/setup.cfg +0 -0
  183. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/__init__.py +0 -0
  184. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/conftest.py +0 -0
  185. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_additional_trees.py +0 -0
  186. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_astronomical.py +0 -0
  187. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_clustering.py +0 -0
  188. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_coverage_boost.py +0 -0
  189. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_coverage_boost_2.py +0 -0
  190. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_dynamic_models.py +0 -0
  191. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_egm.py +0 -0
  192. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_emm.py +0 -0
  193. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_ephemerides.py +0 -0
  194. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_gaussian_mixtures.py +0 -0
  195. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_geophysical.py +0 -0
  196. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_great_circle.py +0 -0
  197. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_h_infinity.py +0 -0
  198. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_ins.py +0 -0
  199. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_ins_gnss.py +0 -0
  200. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_kalman_filters.py +0 -0
  201. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_mathematical_functions.py +0 -0
  202. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_maximum_likelihood.py +0 -0
  203. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_mht.py +0 -0
  204. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_performance_evaluation.py +0 -0
  205. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_phase6_specialized.py +0 -0
  206. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_plotting.py +0 -0
  207. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_projections.py +0 -0
  208. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_relativity.py +0 -0
  209. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_rhumb.py +0 -0
  210. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_signal_processing.py +0 -0
  211. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_smoothers.py +0 -0
  212. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_spatial_containers_parametrized.py +0 -0
  213. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_spatial_structures.py +0 -0
  214. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_special_orbits.py +0 -0
  215. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_static_estimation.py +0 -0
  216. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_terrain.py +0 -0
  217. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_terrain_loaders.py +0 -0
  218. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_tides.py +0 -0
  219. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_tod_mod.py +0 -0
  220. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_trackers.py +0 -0
  221. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_tracking_containers.py +0 -0
  222. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_transforms.py +0 -0
  223. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_v030_comprehensive.py +0 -0
  224. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_v030_features.py +0 -0
  225. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_validation.py +0 -0
  226. {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/unit/test_core.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 1.7.0
3
+ Version: 1.7.3
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
@@ -63,12 +63,13 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
63
63
 
64
64
  # Tracker Component Library (Python)
65
65
 
66
- [![PyPI version](https://img.shields.io/badge/pypi-v1.7.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
66
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.7.2-blue.svg)](https://pypi.org/project/nrl-tracker/)
67
67
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
68
68
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
69
69
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
70
70
  [![Tests](https://img.shields.io/badge/tests-1988%20passing-success.svg)](https://github.com/nedonatelli/TCL)
71
71
  [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-100%25-brightgreen.svg)](docs/gap_analysis.rst)
72
+ [![Type Checking](https://img.shields.io/badge/mypy--strict-passing-brightgreen.svg)](mypy.ini)
72
73
 
73
74
  A Python port of the [U.S. Naval Research Laboratory's Tracker Component Library](https://github.com/USNavalResearchLaboratory/TrackerComponentLibrary), a comprehensive collection of algorithms for target tracking, estimation, coordinate systems, and related mathematical functions.
74
75
 
@@ -208,7 +209,46 @@ pytcl/
208
209
 
209
210
  - [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
210
211
  - [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
211
- - [Examples](examples/)
212
+ - [Examples](examples/) - 29 validated example scripts
213
+ - [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
214
+
215
+ ## Examples & Tutorials
216
+
217
+ The library includes 39 runnable code examples demonstrating all major features:
218
+
219
+ ### Examples (29 files in `/examples/`)
220
+
221
+ Comprehensive demonstrations of library functionality:
222
+ - **Tracking & Estimation**: Kalman filters, particle filters, smoothers
223
+ - **Assignment**: Hungarian algorithm, k-best assignments, 3D assignment
224
+ - **Coordinates**: Frame conversions, transformations, geodetic calculations
225
+ - **Dynamics**: State models, motion models, dynamic systems
226
+ - **Filtering**: Uncertainty visualization, multi-target tracking
227
+ - **Astronomy**: Ephemerides, orbital mechanics, relativistic corrections
228
+ - **Navigation**: INS/GNSS integration, geophysical modeling
229
+ - **Signal Processing**: Detection, filtering, transforms
230
+ - **Terrain & Atmosphere**: Elevation models, atmospheric properties
231
+
232
+ **Status**: ✅ All 29 examples validated and passing (100% execution success)
233
+
234
+ ### Tutorials (10 modules in `/docs/tutorials/`)
235
+
236
+ Interactive learning modules with visualizations:
237
+ - Assignment algorithms and 3D assignment problems
238
+ - Atmospheric and geophysical models
239
+ - Dynamical systems and reference frames
240
+ - Filtering and smoothing techniques
241
+ - Sensor fusion and advanced filtering
242
+ - Special functions and mathematical tools
243
+
244
+ **Status**: ✅ All 10 tutorials validated and passing (100% execution success)
245
+
246
+ ## Documentation
247
+
248
+ - [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
249
+ - [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
250
+ - [Examples](examples/) - 29 validated example scripts
251
+ - [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
212
252
 
213
253
  ## Comparison with Original MATLAB Library
214
254
 
@@ -1,11 +1,12 @@
1
1
  # Tracker Component Library (Python)
2
2
 
3
- [![PyPI version](https://img.shields.io/badge/pypi-v1.7.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
3
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.7.2-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)
7
7
  [![Tests](https://img.shields.io/badge/tests-1988%20passing-success.svg)](https://github.com/nedonatelli/TCL)
8
8
  [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-100%25-brightgreen.svg)](docs/gap_analysis.rst)
9
+ [![Type Checking](https://img.shields.io/badge/mypy--strict-passing-brightgreen.svg)](mypy.ini)
9
10
 
10
11
  A Python port of the [U.S. Naval Research Laboratory's Tracker Component Library](https://github.com/USNavalResearchLaboratory/TrackerComponentLibrary), a comprehensive collection of algorithms for target tracking, estimation, coordinate systems, and related mathematical functions.
11
12
 
@@ -145,7 +146,46 @@ pytcl/
145
146
 
146
147
  - [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
147
148
  - [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
148
- - [Examples](examples/)
149
+ - [Examples](examples/) - 29 validated example scripts
150
+ - [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
151
+
152
+ ## Examples & Tutorials
153
+
154
+ The library includes 39 runnable code examples demonstrating all major features:
155
+
156
+ ### Examples (29 files in `/examples/`)
157
+
158
+ Comprehensive demonstrations of library functionality:
159
+ - **Tracking & Estimation**: Kalman filters, particle filters, smoothers
160
+ - **Assignment**: Hungarian algorithm, k-best assignments, 3D assignment
161
+ - **Coordinates**: Frame conversions, transformations, geodetic calculations
162
+ - **Dynamics**: State models, motion models, dynamic systems
163
+ - **Filtering**: Uncertainty visualization, multi-target tracking
164
+ - **Astronomy**: Ephemerides, orbital mechanics, relativistic corrections
165
+ - **Navigation**: INS/GNSS integration, geophysical modeling
166
+ - **Signal Processing**: Detection, filtering, transforms
167
+ - **Terrain & Atmosphere**: Elevation models, atmospheric properties
168
+
169
+ **Status**: ✅ All 29 examples validated and passing (100% execution success)
170
+
171
+ ### Tutorials (10 modules in `/docs/tutorials/`)
172
+
173
+ Interactive learning modules with visualizations:
174
+ - Assignment algorithms and 3D assignment problems
175
+ - Atmospheric and geophysical models
176
+ - Dynamical systems and reference frames
177
+ - Filtering and smoothing techniques
178
+ - Sensor fusion and advanced filtering
179
+ - Special functions and mathematical tools
180
+
181
+ **Status**: ✅ All 10 tutorials validated and passing (100% execution success)
182
+
183
+ ## Documentation
184
+
185
+ - [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
186
+ - [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
187
+ - [Examples](examples/) - 29 validated example scripts
188
+ - [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
149
189
 
150
190
  ## Comparison with Original MATLAB Library
151
191
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 1.7.0
3
+ Version: 1.7.3
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
@@ -63,12 +63,13 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
63
63
 
64
64
  # Tracker Component Library (Python)
65
65
 
66
- [![PyPI version](https://img.shields.io/badge/pypi-v1.7.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
66
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.7.2-blue.svg)](https://pypi.org/project/nrl-tracker/)
67
67
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
68
68
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
69
69
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
70
70
  [![Tests](https://img.shields.io/badge/tests-1988%20passing-success.svg)](https://github.com/nedonatelli/TCL)
71
71
  [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-100%25-brightgreen.svg)](docs/gap_analysis.rst)
72
+ [![Type Checking](https://img.shields.io/badge/mypy--strict-passing-brightgreen.svg)](mypy.ini)
72
73
 
73
74
  A Python port of the [U.S. Naval Research Laboratory's Tracker Component Library](https://github.com/USNavalResearchLaboratory/TrackerComponentLibrary), a comprehensive collection of algorithms for target tracking, estimation, coordinate systems, and related mathematical functions.
74
75
 
@@ -208,7 +209,46 @@ pytcl/
208
209
 
209
210
  - [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
210
211
  - [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
211
- - [Examples](examples/)
212
+ - [Examples](examples/) - 29 validated example scripts
213
+ - [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
214
+
215
+ ## Examples & Tutorials
216
+
217
+ The library includes 39 runnable code examples demonstrating all major features:
218
+
219
+ ### Examples (29 files in `/examples/`)
220
+
221
+ Comprehensive demonstrations of library functionality:
222
+ - **Tracking & Estimation**: Kalman filters, particle filters, smoothers
223
+ - **Assignment**: Hungarian algorithm, k-best assignments, 3D assignment
224
+ - **Coordinates**: Frame conversions, transformations, geodetic calculations
225
+ - **Dynamics**: State models, motion models, dynamic systems
226
+ - **Filtering**: Uncertainty visualization, multi-target tracking
227
+ - **Astronomy**: Ephemerides, orbital mechanics, relativistic corrections
228
+ - **Navigation**: INS/GNSS integration, geophysical modeling
229
+ - **Signal Processing**: Detection, filtering, transforms
230
+ - **Terrain & Atmosphere**: Elevation models, atmospheric properties
231
+
232
+ **Status**: ✅ All 29 examples validated and passing (100% execution success)
233
+
234
+ ### Tutorials (10 modules in `/docs/tutorials/`)
235
+
236
+ Interactive learning modules with visualizations:
237
+ - Assignment algorithms and 3D assignment problems
238
+ - Atmospheric and geophysical models
239
+ - Dynamical systems and reference frames
240
+ - Filtering and smoothing techniques
241
+ - Sensor fusion and advanced filtering
242
+ - Special functions and mathematical tools
243
+
244
+ **Status**: ✅ All 10 tutorials validated and passing (100% execution success)
245
+
246
+ ## Documentation
247
+
248
+ - [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
249
+ - [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
250
+ - [Examples](examples/) - 29 validated example scripts
251
+ - [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
212
252
 
213
253
  ## Comparison with Original MATLAB Library
214
254
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "nrl-tracker"
7
- version = "1.7.0"
7
+ version = "1.7.3"
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__ = "1.6.0"
23
+ __version__ = "1.7.3"
24
24
  __author__ = "Python Port Contributors"
25
25
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
26
 
@@ -44,7 +44,7 @@ from pytcl import (
44
44
 
45
45
  # Version tuple for programmatic access
46
46
  # Handle dev/alpha/beta/rc suffixes by extracting only numeric parts
47
- def _parse_version(version_str):
47
+ def _parse_version(version_str: str) -> tuple[int, ...]:
48
48
  """Parse version string into tuple of integers."""
49
49
  import re
50
50
 
@@ -5,7 +5,7 @@ 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 Any, List, Tuple
9
9
 
10
10
  import numpy as np
11
11
  from numba import njit
@@ -15,8 +15,8 @@ from scipy.stats import chi2
15
15
 
16
16
  @njit(cache=True, fastmath=True)
17
17
  def _mahalanobis_distance_2d(
18
- innovation: np.ndarray,
19
- S_inv: np.ndarray,
18
+ innovation: np.ndarray[Any, Any],
19
+ S_inv: np.ndarray[Any, Any],
20
20
  ) -> float:
21
21
  """JIT-compiled Mahalanobis distance for 2D innovations."""
22
22
  return innovation[0] * (
@@ -26,8 +26,8 @@ def _mahalanobis_distance_2d(
26
26
 
27
27
  @njit(cache=True, fastmath=True)
28
28
  def _mahalanobis_distance_3d(
29
- innovation: np.ndarray,
30
- S_inv: np.ndarray,
29
+ innovation: np.ndarray[Any, Any],
30
+ S_inv: np.ndarray[Any, Any],
31
31
  ) -> float:
32
32
  """JIT-compiled Mahalanobis distance for 3D innovations."""
33
33
  result = 0.0
@@ -39,8 +39,8 @@ def _mahalanobis_distance_3d(
39
39
 
40
40
  @njit(cache=True, fastmath=True)
41
41
  def _mahalanobis_distance_general(
42
- innovation: np.ndarray,
43
- S_inv: np.ndarray,
42
+ innovation: np.ndarray[Any, Any],
43
+ S_inv: np.ndarray[Any, Any],
44
44
  ) -> float:
45
45
  """JIT-compiled Mahalanobis distance for general dimension."""
46
46
  n = len(innovation)
@@ -341,9 +341,9 @@ def compute_gate_volume(
341
341
 
342
342
  @njit(cache=True, fastmath=True, parallel=False)
343
343
  def mahalanobis_batch(
344
- innovations: np.ndarray,
345
- S_inv: np.ndarray,
346
- output: np.ndarray,
344
+ innovations: np.ndarray[Any, Any],
345
+ S_inv: np.ndarray[Any, Any],
346
+ output: np.ndarray[Any, Any],
347
347
  ) -> None:
348
348
  """
349
349
  Compute Mahalanobis distances for a batch of innovations.
@@ -9,7 +9,7 @@ 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 Any, List, NamedTuple, Optional
13
13
 
14
14
  import numpy as np
15
15
  from numba import njit
@@ -24,7 +24,7 @@ class JPDAResult(NamedTuple):
24
24
 
25
25
  Attributes
26
26
  ----------
27
- association_probs : ndarray
27
+ association_probs : ndarray[Any]
28
28
  Association probability matrix of shape (n_tracks, n_measurements + 1).
29
29
  association_probs[i, j] is the probability that track i is associated
30
30
  with measurement j. The last column (j = n_measurements) represents
@@ -32,9 +32,9 @@ class JPDAResult(NamedTuple):
32
32
  marginal_probs : list of ndarray
33
33
  List of marginal association probabilities for each track.
34
34
  marginal_probs[i][j] = P(measurement j originated from track i).
35
- likelihood_matrix : ndarray
35
+ likelihood_matrix : ndarray[Any]
36
36
  Measurement likelihood matrix of shape (n_tracks, n_measurements).
37
- gated : ndarray
37
+ gated : ndarray[Any]
38
38
  Boolean matrix indicating which track-measurement pairs passed gating.
39
39
  """
40
40
 
@@ -53,7 +53,7 @@ class JPDAUpdate(NamedTuple):
53
53
  Updated state estimates for each track.
54
54
  covariances : list of ndarray
55
55
  Updated covariances for each track (includes spread of means).
56
- association_probs : ndarray
56
+ association_probs : ndarray[Any]
57
57
  Association probability matrix.
58
58
  innovations : list of ndarray
59
59
  Combined weighted innovations for each track.
@@ -66,8 +66,8 @@ class JPDAUpdate(NamedTuple):
66
66
 
67
67
 
68
68
  def compute_measurement_likelihood(
69
- innovation: NDArray,
70
- innovation_cov: NDArray,
69
+ innovation: NDArray[Any],
70
+ innovation_cov: NDArray[Any],
71
71
  detection_prob: float = 1.0,
72
72
  ) -> float:
73
73
  """
@@ -75,9 +75,9 @@ def compute_measurement_likelihood(
75
75
 
76
76
  Parameters
77
77
  ----------
78
- innovation : ndarray
78
+ innovation : ndarray[Any]
79
79
  Measurement innovation (residual), shape (m,).
80
- innovation_cov : ndarray
80
+ innovation_cov : ndarray[Any]
81
81
  Innovation covariance, shape (m, m).
82
82
  detection_prob : float
83
83
  Probability of detection (Pd).
@@ -102,14 +102,14 @@ def compute_measurement_likelihood(
102
102
 
103
103
 
104
104
  def compute_likelihood_matrix(
105
- track_states: List[NDArray],
106
- track_covariances: List[NDArray],
107
- measurements: NDArray,
108
- H: NDArray,
109
- R: NDArray,
105
+ track_states: list[NDArray[Any]],
106
+ track_covariances: list[NDArray[Any]],
107
+ measurements: NDArray[Any],
108
+ H: NDArray[Any],
109
+ R: NDArray[Any],
110
110
  detection_prob: float = 1.0,
111
111
  gate_threshold: Optional[float] = None,
112
- ) -> Tuple[NDArray, NDArray]:
112
+ ) -> tuple[NDArray[Any], NDArray[Any]]:
113
113
  """
114
114
  Compute likelihood matrix for all track-measurement pairs.
115
115
 
@@ -119,11 +119,11 @@ def compute_likelihood_matrix(
119
119
  State estimates for each track.
120
120
  track_covariances : list of ndarray
121
121
  Covariances for each track.
122
- measurements : ndarray
122
+ measurements : ndarray[Any]
123
123
  Measurements, shape (n_meas, m).
124
- H : ndarray
124
+ H : ndarray[Any]
125
125
  Measurement matrix, shape (m, n).
126
- R : ndarray
126
+ R : ndarray[Any]
127
127
  Measurement noise covariance, shape (m, m).
128
128
  detection_prob : float
129
129
  Probability of detection.
@@ -132,9 +132,9 @@ def compute_likelihood_matrix(
132
132
 
133
133
  Returns
134
134
  -------
135
- likelihood_matrix : ndarray
135
+ likelihood_matrix : ndarray[Any]
136
136
  Likelihood values, shape (n_tracks, n_meas).
137
- gated : ndarray
137
+ gated : ndarray[Any]
138
138
  Boolean gating matrix, shape (n_tracks, n_meas).
139
139
  """
140
140
  n_tracks = len(track_states)
@@ -163,11 +163,11 @@ def compute_likelihood_matrix(
163
163
 
164
164
 
165
165
  def jpda_probabilities(
166
- likelihood_matrix: NDArray,
167
- gated: NDArray,
166
+ likelihood_matrix: NDArray[Any],
167
+ gated: NDArray[Any],
168
168
  detection_prob: float = 1.0,
169
169
  clutter_density: float = 1e-6,
170
- ) -> NDArray:
170
+ ) -> NDArray[Any]:
171
171
  """
172
172
  Compute JPDA association probabilities.
173
173
 
@@ -176,9 +176,9 @@ def jpda_probabilities(
176
176
 
177
177
  Parameters
178
178
  ----------
179
- likelihood_matrix : ndarray
179
+ likelihood_matrix : ndarray[Any]
180
180
  Likelihood values, shape (n_tracks, n_meas).
181
- gated : ndarray
181
+ gated : ndarray[Any]
182
182
  Boolean gating matrix, shape (n_tracks, n_meas).
183
183
  detection_prob : float
184
184
  Probability of detection (Pd).
@@ -187,7 +187,7 @@ def jpda_probabilities(
187
187
 
188
188
  Returns
189
189
  -------
190
- beta : ndarray
190
+ beta : ndarray[Any]
191
191
  Association probability matrix, shape (n_tracks, n_meas + 1).
192
192
  beta[i, j] = P(measurement j is from track i) for j < n_meas.
193
193
  beta[i, n_meas] = P(track i has no measurement).
@@ -218,11 +218,11 @@ def jpda_probabilities(
218
218
 
219
219
 
220
220
  def _jpda_exact(
221
- likelihood_matrix: NDArray,
222
- gated: NDArray,
221
+ likelihood_matrix: NDArray[Any],
222
+ gated: NDArray[Any],
223
223
  detection_prob: float,
224
224
  clutter_density: float,
225
- ) -> NDArray:
225
+ ) -> NDArray[Any]:
226
226
  """
227
227
  Exact JPDA computation via hypothesis enumeration.
228
228
 
@@ -241,8 +241,8 @@ def _jpda_exact(
241
241
  def generate_hypotheses(
242
242
  meas_idx: int,
243
243
  current_assignment: List[int],
244
- used_tracks: set,
245
- ):
244
+ used_tracks: set[Any],
245
+ ) -> Any:
246
246
  """Recursively generate valid hypotheses."""
247
247
  if meas_idx == n_meas:
248
248
  yield current_assignment.copy()
@@ -268,11 +268,11 @@ def _jpda_exact(
268
268
  hypothesis_probs = []
269
269
  hypothesis_assignments = []
270
270
 
271
- for assignment in generate_hypotheses(0, [], set()):
271
+ for assignment in generate_hypotheses(0, [], set[Any]()):
272
272
  # Compute probability of this hypothesis
273
273
  prob = 1.0
274
274
 
275
- detected_tracks = set()
275
+ detected_tracks = set[Any]()
276
276
  for j, track_idx in enumerate(assignment):
277
277
  if track_idx == -1:
278
278
  # Measurement j is clutter
@@ -301,7 +301,7 @@ def _jpda_exact(
301
301
  for h_idx, (assignment, prob) in enumerate(
302
302
  zip(hypothesis_assignments, hypothesis_probs)
303
303
  ):
304
- detected_tracks = set()
304
+ detected_tracks = set[Any]()
305
305
  for j, track_idx in enumerate(assignment):
306
306
  if track_idx >= 0:
307
307
  beta[track_idx, j] += prob
@@ -317,11 +317,11 @@ def _jpda_exact(
317
317
 
318
318
  @njit(cache=True)
319
319
  def _jpda_approximate_core(
320
- likelihood_matrix: np.ndarray,
321
- gated: np.ndarray,
320
+ likelihood_matrix: np.ndarray[Any, Any],
321
+ gated: np.ndarray[Any, Any],
322
322
  detection_prob: float,
323
323
  clutter_density: float,
324
- ) -> np.ndarray:
324
+ ) -> np.ndarray[Any, Any]:
325
325
  """JIT-compiled core of approximate JPDA computation."""
326
326
  n_tracks = likelihood_matrix.shape[0]
327
327
  n_meas = likelihood_matrix.shape[1]
@@ -369,11 +369,11 @@ def _jpda_approximate_core(
369
369
 
370
370
 
371
371
  def _jpda_approximate(
372
- likelihood_matrix: NDArray,
373
- gated: NDArray,
372
+ likelihood_matrix: NDArray[Any],
373
+ gated: NDArray[Any],
374
374
  detection_prob: float,
375
375
  clutter_density: float,
376
- ) -> NDArray:
376
+ ) -> NDArray[Any]:
377
377
  """
378
378
  Approximate JPDA using parametric approach.
379
379
 
@@ -212,14 +212,15 @@ def relaxation_assignment_nd(
212
212
  result_relaxed = greedy_assignment_nd(relaxed_cost)
213
213
 
214
214
  # Compute lower bound from relaxed solution
215
- lower_bound = (
216
- result_relaxed.cost
217
- + sum(np.sum(lambdas[d]) for d in range(n_dims))
215
+ lower_bound = result_relaxed.cost + sum(
216
+ np.sum(lambdas[d]) for d in range(n_dims)
218
217
  )
219
218
 
220
219
  # Extract solution from relaxed problem
221
220
  if len(result_relaxed.assignments) > 0:
222
- actual_cost = float(np.sum(cost_tensor[tuple(result_relaxed.assignments.T)]))
221
+ actual_cost = float(
222
+ np.sum(cost_tensor[tuple(result_relaxed.assignments.T)])
223
+ )
223
224
 
224
225
  if actual_cost < best_cost:
225
226
  best_cost = actual_cost
@@ -20,7 +20,7 @@ References
20
20
  """
21
21
 
22
22
  from enum import Enum
23
- from typing import NamedTuple, Tuple
23
+ from typing import Any, NamedTuple, Tuple
24
24
 
25
25
  import numpy as np
26
26
  from numpy.typing import NDArray
@@ -79,7 +79,7 @@ class FlowEdge(NamedTuple):
79
79
 
80
80
  def assignment_to_flow_network(
81
81
  cost_matrix: NDArray[np.float64],
82
- ) -> Tuple[list, NDArray, NDArray]:
82
+ ) -> Tuple[list[FlowEdge], NDArray[np.floating], NDArray[Any]]:
83
83
  """
84
84
  Convert 2D assignment problem to min-cost flow network.
85
85
 
@@ -140,7 +140,9 @@ def assignment_to_flow_network(
140
140
  # Tasks to sink: capacity 1, cost 0
141
141
  for j in range(1, n + 1):
142
142
  task_node = m + j
143
- edges.append(FlowEdge(from_node=task_node, to_node=sink, capacity=1.0, cost=0.0))
143
+ edges.append(
144
+ FlowEdge(from_node=task_node, to_node=sink, capacity=1.0, cost=0.0)
145
+ )
144
146
 
145
147
  # Supply/demand: source supplies m units, sink demands m units
146
148
  supplies = np.zeros(n_nodes)
@@ -158,7 +160,7 @@ def assignment_to_flow_network(
158
160
 
159
161
 
160
162
  def min_cost_flow_successive_shortest_paths(
161
- edges: list,
163
+ edges: list[FlowEdge],
162
164
  supplies: NDArray[np.float64],
163
165
  max_iterations: int = 1000,
164
166
  ) -> MinCostFlowResult:
@@ -260,7 +262,9 @@ def min_cost_flow_successive_shortest_paths(
260
262
 
261
263
  # Find minimum capacity along path
262
264
  min_flow = min(residual_capacity[e] for e in path_edges)
263
- min_flow = min(min_flow, current_supplies[excess_node], -current_supplies[deficit_node])
265
+ min_flow = min(
266
+ min_flow, current_supplies[excess_node], -current_supplies[deficit_node]
267
+ )
264
268
 
265
269
  # Push flow along path
266
270
  total_cost = 0.0
@@ -295,7 +299,7 @@ def min_cost_flow_successive_shortest_paths(
295
299
 
296
300
  def assignment_from_flow_solution(
297
301
  flow: NDArray[np.float64],
298
- edges: list,
302
+ edges: list[FlowEdge],
299
303
  cost_matrix_shape: Tuple[int, int],
300
304
  ) -> Tuple[NDArray[np.intp], float]:
301
305
  """
@@ -331,7 +335,11 @@ def assignment_from_flow_solution(
331
335
  assignment = np.array(assignment, dtype=np.intp)
332
336
  cost = 0.0
333
337
  if len(assignment) > 0:
334
- cost = float(np.sum(flow[edge_idx] * edges[edge_idx].cost for edge_idx in range(len(edges))))
338
+ cost = float(
339
+ np.sum(
340
+ flow[edge_idx] * edges[edge_idx].cost for edge_idx in range(len(edges))
341
+ )
342
+ )
335
343
 
336
344
  return assignment, cost
337
345
 
@@ -356,6 +364,8 @@ def min_cost_assignment_via_flow(
356
364
  """
357
365
  edges, supplies, _ = assignment_to_flow_network(cost_matrix)
358
366
  result = min_cost_flow_successive_shortest_paths(edges, supplies)
359
- assignment, cost = assignment_from_flow_solution(result.flow, edges, cost_matrix.shape)
367
+ assignment, cost = assignment_from_flow_solution(
368
+ result.flow, edges, cost_matrix.shape
369
+ )
360
370
 
361
371
  return assignment, cost
@@ -11,7 +11,7 @@ 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 Any, List, NamedTuple, Optional, Tuple
15
15
 
16
16
  import numpy as np
17
17
  from numpy.typing import ArrayLike, NDArray
@@ -511,7 +511,7 @@ def assign3d_auction(
511
511
  assign_i: List[Optional[Tuple[int, int]]] = [None] * n1
512
512
 
513
513
  # Reverse: which i is assigned to (j, k)
514
- reverse: dict = {}
514
+ reverse: dict[tuple[int, int], int] = {}
515
515
 
516
516
  converged = False
517
517
 
@@ -585,7 +585,7 @@ def assign3d(
585
585
  cost_tensor: ArrayLike,
586
586
  method: str = "lagrangian",
587
587
  maximize: bool = False,
588
- **kwargs,
588
+ **kwargs: Any,
589
589
  ) -> Assignment3DResult:
590
590
  """
591
591
  Solve 3D assignment problem.