nrl-tracker 1.7.3__tar.gz → 1.7.5__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 (227) hide show
  1. {nrl_tracker-1.7.3/nrl_tracker.egg-info → nrl_tracker-1.7.5}/PKG-INFO +1 -1
  2. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5/nrl_tracker.egg-info}/PKG-INFO +1 -1
  3. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/SOURCES.txt +2 -3
  4. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pyproject.toml +1 -1
  5. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/__init__.py +3 -2
  6. nrl_tracker-1.7.5/tests/test_jpda.py +236 -0
  7. nrl_tracker-1.7.3/tests/test_special_functions_phase12.py → nrl_tracker-1.7.5/tests/test_special_functions.py +1 -1
  8. nrl_tracker-1.7.3/tests/test_v030_comprehensive.py +0 -866
  9. nrl_tracker-1.7.3/tests/test_v030_features.py +0 -447
  10. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/CONTRIBUTING.md +0 -0
  11. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/LICENSE +0 -0
  12. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/MANIFEST.in +0 -0
  13. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/README.md +0 -0
  14. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/dependency_links.txt +0 -0
  15. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/requires.txt +0 -0
  16. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/top_level.txt +0 -0
  17. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/__init__.py +0 -0
  18. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/data_association.py +0 -0
  19. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/gating.py +0 -0
  20. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/jpda.py +0 -0
  21. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/nd_assignment.py +0 -0
  22. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/network_flow.py +0 -0
  23. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
  24. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/three_dimensional/assignment.py +0 -0
  25. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
  26. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/two_dimensional/assignment.py +0 -0
  27. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
  28. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/__init__.py +0 -0
  29. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/ephemerides.py +0 -0
  30. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/lambert.py +0 -0
  31. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/orbital_mechanics.py +0 -0
  32. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/reference_frames.py +0 -0
  33. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/relativity.py +0 -0
  34. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/sgp4.py +0 -0
  35. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/special_orbits.py +0 -0
  36. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/time_systems.py +0 -0
  37. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/tle.py +0 -0
  38. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/__init__.py +0 -0
  39. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/ionosphere.py +0 -0
  40. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/models.py +0 -0
  41. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/nrlmsise00.py +0 -0
  42. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/__init__.py +0 -0
  43. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/dbscan.py +0 -0
  44. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/gaussian_mixture.py +0 -0
  45. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/hierarchical.py +0 -0
  46. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/kmeans.py +0 -0
  47. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/__init__.py +0 -0
  48. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/base.py +0 -0
  49. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/cluster_set.py +0 -0
  50. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/covertree.py +0 -0
  51. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/kd_tree.py +0 -0
  52. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/measurement_set.py +0 -0
  53. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/rtree.py +0 -0
  54. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/track_list.py +0 -0
  55. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/vptree.py +0 -0
  56. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/__init__.py +0 -0
  57. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
  58. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/conversions/geodetic.py +0 -0
  59. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
  60. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
  61. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/jacobians/jacobians.py +0 -0
  62. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/projections/__init__.py +0 -0
  63. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/projections/projections.py +0 -0
  64. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
  65. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/rotations/rotations.py +0 -0
  66. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/__init__.py +0 -0
  67. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/array_utils.py +0 -0
  68. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/constants.py +0 -0
  69. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/validation.py +0 -0
  70. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/__init__.py +0 -0
  71. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
  72. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/gaussian_sum_filter.py +0 -0
  73. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/imm.py +0 -0
  74. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/information_filter.py +0 -0
  75. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/__init__.py +0 -0
  76. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/constrained.py +0 -0
  77. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/extended.py +0 -0
  78. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/h_infinity.py +0 -0
  79. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/linear.py +0 -0
  80. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/square_root.py +0 -0
  81. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/sr_ukf.py +0 -0
  82. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/ud_filter.py +0 -0
  83. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/unscented.py +0 -0
  84. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
  85. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
  86. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +0 -0
  87. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/rbpf.py +0 -0
  88. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/smoothers.py +0 -0
  89. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/__init__.py +0 -0
  90. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
  91. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
  92. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/__init__.py +0 -0
  93. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
  94. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
  95. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
  96. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/__init__.py +0 -0
  97. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
  98. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
  99. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/singer.py +0 -0
  100. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/__init__.py +0 -0
  101. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/clenshaw.py +0 -0
  102. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/egm.py +0 -0
  103. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/models.py +0 -0
  104. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/spherical_harmonics.py +0 -0
  105. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/tides.py +0 -0
  106. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/logging_config.py +0 -0
  107. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/__init__.py +0 -0
  108. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/emm.py +0 -0
  109. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/igrf.py +0 -0
  110. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/wmm.py +0 -0
  111. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/__init__.py +0 -0
  112. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
  113. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
  114. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
  115. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
  116. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/combinatorics/combinatorics.py +0 -0
  117. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
  118. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
  119. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/geometry/geometry.py +0 -0
  120. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/interpolation/__init__.py +0 -0
  121. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
  122. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
  123. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/numerical_integration/quadrature.py +0 -0
  124. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
  125. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
  126. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/detection.py +0 -0
  127. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/filters.py +0 -0
  128. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/matched_filter.py +0 -0
  129. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/__init__.py +0 -0
  130. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/bessel.py +0 -0
  131. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/debye.py +0 -0
  132. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
  133. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/error_functions.py +0 -0
  134. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/gamma_functions.py +0 -0
  135. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/hypergeometric.py +0 -0
  136. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/lambert_w.py +0 -0
  137. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/marcum_q.py +0 -0
  138. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
  139. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
  140. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
  141. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
  142. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/fourier.py +0 -0
  143. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/stft.py +0 -0
  144. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/wavelets.py +0 -0
  145. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/misc/__init__.py +0 -0
  146. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/__init__.py +0 -0
  147. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/geodesy.py +0 -0
  148. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/great_circle.py +0 -0
  149. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/ins.py +0 -0
  150. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/ins_gnss.py +0 -0
  151. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/rhumb.py +0 -0
  152. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/performance_evaluation/__init__.py +0 -0
  153. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
  154. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/performance_evaluation/track_metrics.py +0 -0
  155. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/physical_values/__init__.py +0 -0
  156. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/__init__.py +0 -0
  157. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/coordinates.py +0 -0
  158. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/ellipses.py +0 -0
  159. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/metrics.py +0 -0
  160. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/tracks.py +0 -0
  161. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/scheduling/__init__.py +0 -0
  162. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/__init__.py +0 -0
  163. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/least_squares.py +0 -0
  164. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/maximum_likelihood.py +0 -0
  165. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/robust.py +0 -0
  166. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/__init__.py +0 -0
  167. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/dem.py +0 -0
  168. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/loaders.py +0 -0
  169. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/visibility.py +0 -0
  170. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/__init__.py +0 -0
  171. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/hypothesis.py +0 -0
  172. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/mht.py +0 -0
  173. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/multi_target.py +0 -0
  174. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/single_target.py +0 -0
  175. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/transponders/__init__.py +0 -0
  176. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/setup.cfg +0 -0
  177. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/__init__.py +0 -0
  178. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/conftest.py +0 -0
  179. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_additional_trees.py +0 -0
  180. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_assignment_algorithms.py +0 -0
  181. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_astronomical.py +0 -0
  182. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_clustering.py +0 -0
  183. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_constrained_ekf.py +0 -0
  184. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_coordinate_systems.py +0 -0
  185. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_coverage_boost.py +0 -0
  186. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_coverage_boost_2.py +0 -0
  187. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_dynamic_models.py +0 -0
  188. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_egm.py +0 -0
  189. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_emm.py +0 -0
  190. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_ephemerides.py +0 -0
  191. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_gaussian_mixtures.py +0 -0
  192. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_gaussian_sum_filter.py +0 -0
  193. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_geophysical.py +0 -0
  194. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_great_circle.py +0 -0
  195. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_h_infinity.py +0 -0
  196. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_ins.py +0 -0
  197. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_ins_gnss.py +0 -0
  198. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_kalman_filters.py +0 -0
  199. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_mathematical_functions.py +0 -0
  200. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_maximum_likelihood.py +0 -0
  201. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_mht.py +0 -0
  202. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_nd_assignment.py +0 -0
  203. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_network_flow.py +0 -0
  204. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_nrlmsise00.py +0 -0
  205. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_performance_evaluation.py +0 -0
  206. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_phase6_specialized.py +0 -0
  207. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_plotting.py +0 -0
  208. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_projections.py +0 -0
  209. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_rbpf.py +0 -0
  210. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_relativity.py +0 -0
  211. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_rhumb.py +0 -0
  212. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_sgp4.py +0 -0
  213. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_signal_processing.py +0 -0
  214. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_smoothers.py +0 -0
  215. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_spatial_containers_parametrized.py +0 -0
  216. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_spatial_structures.py +0 -0
  217. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_special_orbits.py +0 -0
  218. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_static_estimation.py +0 -0
  219. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_terrain.py +0 -0
  220. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_terrain_loaders.py +0 -0
  221. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_tides.py +0 -0
  222. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_tod_mod.py +0 -0
  223. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_trackers.py +0 -0
  224. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_tracking_containers.py +0 -0
  225. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_transforms.py +0 -0
  226. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_validation.py +0 -0
  227. {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/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.3
3
+ Version: 1.7.5
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 1.7.3
3
+ Version: 1.7.5
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
@@ -189,6 +189,7 @@ tests/test_great_circle.py
189
189
  tests/test_h_infinity.py
190
190
  tests/test_ins.py
191
191
  tests/test_ins_gnss.py
192
+ tests/test_jpda.py
192
193
  tests/test_kalman_filters.py
193
194
  tests/test_mathematical_functions.py
194
195
  tests/test_maximum_likelihood.py
@@ -208,7 +209,7 @@ tests/test_signal_processing.py
208
209
  tests/test_smoothers.py
209
210
  tests/test_spatial_containers_parametrized.py
210
211
  tests/test_spatial_structures.py
211
- tests/test_special_functions_phase12.py
212
+ tests/test_special_functions.py
212
213
  tests/test_special_orbits.py
213
214
  tests/test_static_estimation.py
214
215
  tests/test_terrain.py
@@ -218,7 +219,5 @@ tests/test_tod_mod.py
218
219
  tests/test_trackers.py
219
220
  tests/test_tracking_containers.py
220
221
  tests/test_transforms.py
221
- tests/test_v030_comprehensive.py
222
- tests/test_v030_features.py
223
222
  tests/test_validation.py
224
223
  tests/unit/test_core.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "nrl-tracker"
7
- version = "1.7.3"
7
+ version = "1.7.5"
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 = [
@@ -6,7 +6,8 @@ systems, dynamic models, estimation algorithms, and mathematical functions.
6
6
 
7
7
  This is a Python port of the U.S. Naval Research Laboratory's Tracker Component
8
8
  Library originally written in MATLAB.
9
-
9
+ **Current Version:** 1.7.4 (January 4, 2026)
10
+ **Status:** Production-ready, 2,057 tests passing, 76% line coverage
10
11
  Examples
11
12
  --------
12
13
  >>> import pytcl as pytcl
@@ -20,7 +21,7 @@ References
20
21
  no. 5, pp. 18-27, May 2017.
21
22
  """
22
23
 
23
- __version__ = "1.7.3"
24
+ __version__ = "1.7.5"
24
25
  __author__ = "Python Port Contributors"
25
26
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
27
 
@@ -0,0 +1,236 @@
1
+ """
2
+ Tests for Joint Probabilistic Data Association (JPDA) algorithms.
3
+
4
+ This module contains tests for JPDA-based multi-target association and tracking.
5
+ Tests are migrated from v0.3.0 comprehensive test suite.
6
+ """
7
+
8
+ import numpy as np
9
+ import pytest
10
+ from numpy.testing import assert_allclose
11
+
12
+ # =============================================================================
13
+ # JPDA Basic Tests
14
+ # =============================================================================
15
+
16
+
17
+ class TestJPDA:
18
+ """Tests for Joint Probabilistic Data Association."""
19
+
20
+ def test_jpda_probabilities_single_track(self):
21
+ """Test JPDA with single track."""
22
+ from pytcl.assignment_algorithms.jpda import jpda_probabilities
23
+
24
+ # Single track, two measurements
25
+ likelihood = np.array([[0.8, 0.1]])
26
+ gated = np.array([[True, True]])
27
+
28
+ beta = jpda_probabilities(
29
+ likelihood, gated, detection_prob=0.9, clutter_density=0.01
30
+ )
31
+
32
+ assert beta.shape == (1, 3) # 1 track, 2 meas + 1 for no-meas
33
+ # Probabilities should sum to 1 for each track
34
+ assert_allclose(np.sum(beta[0, :]), 1.0, rtol=1e-6)
35
+ # Higher likelihood measurement should have higher probability
36
+ assert beta[0, 0] > beta[0, 1]
37
+
38
+ def test_jpda_update_basic(self):
39
+ """Test basic JPDA update."""
40
+ from pytcl.assignment_algorithms.jpda import jpda_update
41
+
42
+ x1 = np.array([0.0, 1.0])
43
+ x2 = np.array([5.0, -1.0])
44
+ P = np.eye(2) * 0.5
45
+
46
+ measurements = np.array([[0.1], [5.2], [10.0]])
47
+ H = np.array([[1.0, 0.0]])
48
+ R = np.array([[0.1]])
49
+
50
+ result = jpda_update([x1, x2], [P, P], measurements, H, R)
51
+
52
+ assert len(result.states) == 2
53
+ assert len(result.covariances) == 2
54
+ assert result.association_probs.shape == (2, 4) # 2 tracks, 3 meas + no-meas
55
+
56
+ def test_jpda_no_measurements(self):
57
+ """Test JPDA with no measurements."""
58
+ from pytcl.assignment_algorithms.jpda import jpda_update
59
+
60
+ x = np.array([0.0, 1.0])
61
+ P = np.eye(2) * 0.5
62
+
63
+ measurements = np.array([]).reshape(0, 1)
64
+ H = np.array([[1.0, 0.0]])
65
+ R = np.array([[0.1]])
66
+
67
+ result = jpda_update([x], [P], measurements, H, R)
68
+
69
+ # With no measurements, state should be unchanged
70
+ assert_allclose(result.states[0], x)
71
+
72
+ def test_jpda_result_convenience(self):
73
+ """Test JPDA convenience function."""
74
+ from pytcl.assignment_algorithms import jpda
75
+
76
+ x1 = np.array([0.0, 1.0])
77
+ x2 = np.array([5.0, -1.0])
78
+ P = np.eye(2) * 0.5
79
+
80
+ measurements = np.array([[0.1], [5.2]])
81
+ H = np.array([[1.0, 0.0]])
82
+ R = np.array([[0.1]])
83
+
84
+ result = jpda([x1, x2], [P, P], measurements, H, R)
85
+
86
+ assert result.association_probs.shape == (2, 3)
87
+ assert len(result.marginal_probs) == 2
88
+ assert result.likelihood_matrix.shape == (2, 2)
89
+
90
+
91
+ # =============================================================================
92
+ # JPDA Comprehensive Tests (v0.3.0)
93
+ # =============================================================================
94
+
95
+
96
+ class TestJPDAComprehensive:
97
+ """Comprehensive tests for JPDA algorithm robustness and edge cases."""
98
+
99
+ def test_jpda_probabilities_normalization(self):
100
+ """Test JPDA probabilities sum to 1."""
101
+ from pytcl.assignment_algorithms.jpda import jpda_probabilities
102
+
103
+ # Multiple tracks, multiple measurements
104
+ likelihood = np.array([[0.8, 0.1, 0.05], [0.1, 0.7, 0.1], [0.05, 0.1, 0.6]])
105
+ gated = np.ones_like(likelihood, dtype=bool)
106
+
107
+ beta = jpda_probabilities(likelihood, gated, detection_prob=0.9)
108
+
109
+ # Each track's probabilities should sum to 1
110
+ for i in range(3):
111
+ assert_allclose(np.sum(beta[i, :]), 1.0, rtol=1e-6)
112
+
113
+ def test_jpda_high_clutter(self):
114
+ """Test JPDA behavior with high clutter density."""
115
+ from pytcl.assignment_algorithms.jpda import jpda_probabilities
116
+
117
+ likelihood = np.array([[0.5, 0.3]])
118
+ gated = np.array([[True, True]])
119
+
120
+ # High clutter should increase miss probability
121
+ beta_low_clutter = jpda_probabilities(
122
+ likelihood, gated, detection_prob=0.9, clutter_density=0.001
123
+ )
124
+ beta_high_clutter = jpda_probabilities(
125
+ likelihood, gated, detection_prob=0.9, clutter_density=0.1
126
+ )
127
+
128
+ # With high clutter, more probability goes to "no measurement"
129
+ assert beta_high_clutter[0, -1] > beta_low_clutter[0, -1]
130
+
131
+ def test_jpda_low_detection_probability(self):
132
+ """Test JPDA with low detection probability."""
133
+ from pytcl.assignment_algorithms.jpda import jpda_probabilities
134
+
135
+ likelihood = np.array([[0.8, 0.1]])
136
+ gated = np.array([[True, True]])
137
+
138
+ beta_high_pd = jpda_probabilities(
139
+ likelihood, gated, detection_prob=0.99, clutter_density=0.01
140
+ )
141
+ beta_low_pd = jpda_probabilities(
142
+ likelihood, gated, detection_prob=0.5, clutter_density=0.01
143
+ )
144
+
145
+ # Low detection prob should increase miss probability
146
+ assert beta_low_pd[0, -1] > beta_high_pd[0, -1]
147
+
148
+ def test_jpda_gating_effect(self):
149
+ """Test that gating correctly excludes measurements."""
150
+ from pytcl.assignment_algorithms.jpda import jpda_probabilities
151
+
152
+ likelihood = np.array([[0.8, 0.7, 0.1]])
153
+ gated = np.array([[True, False, True]]) # Middle measurement not gated
154
+
155
+ beta = jpda_probabilities(likelihood, gated, detection_prob=0.9)
156
+
157
+ # Gated-out measurement should have zero probability
158
+ assert_allclose(beta[0, 1], 0.0)
159
+
160
+ def test_jpda_update_with_ambiguous_measurements(self):
161
+ """Test JPDA update handles ambiguous measurements."""
162
+ from pytcl.assignment_algorithms.jpda import jpda_update
163
+
164
+ x = np.array([0.0, 1.0])
165
+ P = np.eye(2) * 0.1
166
+
167
+ # Two measurements, both plausible
168
+ measurements = np.array([[0.1], [-0.1]])
169
+ H = np.array([[1.0, 0.0]])
170
+ R = np.array([[0.1]])
171
+
172
+ result = jpda_update([x], [P], measurements, H, R)
173
+
174
+ # JPDA should produce valid state and covariance
175
+ assert result.states[0].shape == (2,)
176
+ assert result.covariances[0].shape == (2, 2)
177
+ # Covariance should remain positive definite
178
+ eigvals = np.linalg.eigvalsh(result.covariances[0])
179
+ assert np.all(eigvals > 0)
180
+
181
+ def test_jpda_multiple_tracks(self):
182
+ """Test JPDA with multiple tracks."""
183
+ from pytcl.assignment_algorithms.jpda import jpda_update
184
+
185
+ # 3 tracks at different positions
186
+ tracks = [
187
+ np.array([0.0, 1.0]),
188
+ np.array([5.0, 0.0]),
189
+ np.array([10.0, -1.0]),
190
+ ]
191
+ covs = [np.eye(2) * 0.1 for _ in range(3)]
192
+
193
+ # 3 measurements near each track
194
+ measurements = np.array([[0.1], [5.1], [9.9]])
195
+ H = np.array([[1.0, 0.0]])
196
+ R = np.array([[0.1]])
197
+
198
+ result = jpda_update(tracks, covs, measurements, H, R)
199
+
200
+ assert len(result.states) == 3
201
+ assert result.association_probs.shape == (3, 4) # 3 tracks, 3+1 columns
202
+
203
+ def test_jpda_empty_tracks(self):
204
+ """Test JPDA handles empty track list."""
205
+ from pytcl.assignment_algorithms.jpda import jpda_update
206
+
207
+ measurements = np.array([[0.1], [0.2]])
208
+ H = np.array([[1.0, 0.0]])
209
+ R = np.array([[0.1]])
210
+
211
+ result = jpda_update([], [], measurements, H, R)
212
+
213
+ assert len(result.states) == 0
214
+ assert len(result.covariances) == 0
215
+
216
+ def test_jpda_single_measurement_per_track(self):
217
+ """Test JPDA when each track has exactly one measurement."""
218
+ from pytcl.assignment_algorithms.jpda import jpda_update
219
+
220
+ tracks = [np.array([0.0, 1.0]), np.array([10.0, -1.0])]
221
+ covs = [np.eye(2) * 0.01, np.eye(2) * 0.01] # Very small covariance
222
+
223
+ # Measurements clearly associated with each track
224
+ measurements = np.array([[0.01], [10.01]])
225
+ H = np.array([[1.0, 0.0]])
226
+ R = np.array([[0.001]])
227
+
228
+ result = jpda_update(tracks, covs, measurements, H, R)
229
+
230
+ # Each track should strongly associate with its measurement
231
+ assert result.association_probs[0, 0] > 0.9
232
+ assert result.association_probs[1, 1] > 0.9
233
+
234
+
235
+ if __name__ == "__main__":
236
+ pytest.main([__file__, "-v"])
@@ -1,5 +1,5 @@
1
1
  """
2
- Tests for Phase 12 Special Mathematical Functions.
2
+ Tests for Special Mathematical Functions.
3
3
 
4
4
  Tests cover:
5
5
  - Marcum Q function