nrl-tracker 0.19.1__tar.gz → 1.6.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 (215) hide show
  1. {nrl_tracker-0.19.1/nrl_tracker.egg-info → nrl_tracker-1.6.0}/PKG-INFO +11 -3
  2. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/README.md +7 -2
  3. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0/nrl_tracker.egg-info}/PKG-INFO +11 -3
  4. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/nrl_tracker.egg-info/SOURCES.txt +27 -0
  5. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/nrl_tracker.egg-info/requires.txt +4 -0
  6. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pyproject.toml +8 -1
  7. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/__init__.py +1 -1
  8. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/data_association.py +2 -7
  9. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/jpda.py +43 -29
  10. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/two_dimensional/assignment.py +14 -7
  11. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/astronomical/__init__.py +126 -7
  12. nrl_tracker-1.6.0/pytcl/astronomical/ephemerides.py +530 -0
  13. nrl_tracker-1.6.0/pytcl/astronomical/reference_frames.py +1380 -0
  14. nrl_tracker-1.6.0/pytcl/astronomical/relativity.py +472 -0
  15. nrl_tracker-1.6.0/pytcl/astronomical/sgp4.py +710 -0
  16. nrl_tracker-1.6.0/pytcl/astronomical/tle.py +558 -0
  17. nrl_tracker-1.6.0/pytcl/atmosphere/__init__.py +68 -0
  18. nrl_tracker-1.6.0/pytcl/atmosphere/ionosphere.py +512 -0
  19. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/clustering/dbscan.py +23 -5
  20. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/clustering/hierarchical.py +23 -10
  21. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/clustering/kmeans.py +5 -10
  22. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/__init__.py +28 -21
  23. nrl_tracker-1.6.0/pytcl/containers/base.py +219 -0
  24. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/cluster_set.py +1 -10
  25. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/covertree.py +21 -26
  26. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/kd_tree.py +94 -29
  27. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/measurement_set.py +1 -9
  28. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/rtree.py +199 -0
  29. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/vptree.py +17 -26
  30. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/projections/__init__.py +4 -2
  31. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/core/__init__.py +18 -0
  32. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/core/validation.py +331 -0
  33. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/imm.py +42 -36
  34. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/kalman/__init__.py +18 -0
  35. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/kalman/extended.py +1 -4
  36. nrl_tracker-1.6.0/pytcl/dynamic_estimation/kalman/h_infinity.py +613 -0
  37. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/kalman/linear.py +17 -13
  38. nrl_tracker-1.6.0/pytcl/dynamic_estimation/kalman/square_root.py +484 -0
  39. nrl_tracker-1.6.0/pytcl/dynamic_estimation/kalman/sr_ukf.py +302 -0
  40. nrl_tracker-1.6.0/pytcl/dynamic_estimation/kalman/ud_filter.py +404 -0
  41. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/kalman/unscented.py +27 -27
  42. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +57 -19
  43. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/smoothers.py +1 -5
  44. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/discrete_time/__init__.py +1 -5
  45. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/process_noise/__init__.py +1 -5
  46. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/gravity/egm.py +13 -0
  47. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/gravity/spherical_harmonics.py +97 -36
  48. nrl_tracker-1.6.0/pytcl/logging_config.py +328 -0
  49. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/magnetism/__init__.py +10 -14
  50. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/magnetism/wmm.py +260 -23
  51. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/interpolation/__init__.py +2 -2
  52. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/numerical_integration/quadrature.py +36 -7
  53. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/special_functions/__init__.py +84 -2
  54. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/special_functions/bessel.py +260 -0
  55. nrl_tracker-1.6.0/pytcl/mathematical_functions/special_functions/debye.py +394 -0
  56. nrl_tracker-1.6.0/pytcl/mathematical_functions/special_functions/hypergeometric.py +484 -0
  57. nrl_tracker-1.6.0/pytcl/mathematical_functions/special_functions/lambert_w.py +294 -0
  58. nrl_tracker-1.6.0/pytcl/mathematical_functions/special_functions/marcum_q.py +370 -0
  59. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/navigation/__init__.py +80 -6
  60. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/navigation/geodesy.py +245 -159
  61. nrl_tracker-1.6.0/pytcl/navigation/great_circle.py +881 -0
  62. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/navigation/ins.py +1 -5
  63. nrl_tracker-1.6.0/pytcl/navigation/rhumb.py +722 -0
  64. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/trackers/__init__.py +3 -14
  65. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/trackers/multi_target.py +1 -4
  66. nrl_tracker-1.6.0/tests/test_coverage_boost_2.py +1027 -0
  67. nrl_tracker-1.6.0/tests/test_ephemerides.py +343 -0
  68. nrl_tracker-1.6.0/tests/test_great_circle.py +361 -0
  69. nrl_tracker-1.6.0/tests/test_h_infinity.py +391 -0
  70. nrl_tracker-1.6.0/tests/test_relativity.py +463 -0
  71. nrl_tracker-1.6.0/tests/test_rhumb.py +373 -0
  72. nrl_tracker-1.6.0/tests/test_sgp4.py +388 -0
  73. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_smoothers.py +1 -2
  74. nrl_tracker-1.6.0/tests/test_spatial_containers_parametrized.py +467 -0
  75. nrl_tracker-1.6.0/tests/test_special_functions_phase12.py +543 -0
  76. nrl_tracker-1.6.0/tests/test_tod_mod.py +308 -0
  77. nrl_tracker-1.6.0/tests/test_validation.py +482 -0
  78. nrl_tracker-0.19.1/pytcl/astronomical/reference_frames.py +0 -677
  79. nrl_tracker-0.19.1/pytcl/atmosphere/__init__.py +0 -37
  80. nrl_tracker-0.19.1/pytcl/dynamic_estimation/kalman/square_root.py +0 -1003
  81. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/CONTRIBUTING.md +0 -0
  82. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/LICENSE +0 -0
  83. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/MANIFEST.in +0 -0
  84. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/nrl_tracker.egg-info/dependency_links.txt +0 -0
  85. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/nrl_tracker.egg-info/top_level.txt +0 -0
  86. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/__init__.py +0 -0
  87. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/gating.py +0 -0
  88. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
  89. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/three_dimensional/assignment.py +0 -0
  90. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
  91. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
  92. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/astronomical/lambert.py +0 -0
  93. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/astronomical/orbital_mechanics.py +0 -0
  94. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/astronomical/time_systems.py +0 -0
  95. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/atmosphere/models.py +0 -0
  96. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/clustering/__init__.py +0 -0
  97. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/clustering/gaussian_mixture.py +0 -0
  98. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/containers/track_list.py +0 -0
  99. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/__init__.py +0 -0
  100. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
  101. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/conversions/geodetic.py +0 -0
  102. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
  103. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
  104. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/jacobians/jacobians.py +0 -0
  105. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/projections/projections.py +0 -0
  106. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
  107. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/coordinate_systems/rotations/rotations.py +0 -0
  108. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/core/array_utils.py +0 -0
  109. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/core/constants.py +0 -0
  110. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/__init__.py +0 -0
  111. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
  112. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/information_filter.py +0 -0
  113. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
  114. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
  115. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/__init__.py +0 -0
  116. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
  117. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
  118. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
  119. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
  120. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
  121. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
  122. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
  123. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/dynamic_models/process_noise/singer.py +0 -0
  124. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/gravity/__init__.py +0 -0
  125. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/gravity/clenshaw.py +0 -0
  126. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/gravity/models.py +0 -0
  127. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/gravity/tides.py +0 -0
  128. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/magnetism/emm.py +0 -0
  129. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/magnetism/igrf.py +0 -0
  130. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/__init__.py +0 -0
  131. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
  132. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
  133. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
  134. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
  135. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/combinatorics/combinatorics.py +0 -0
  136. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
  137. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
  138. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/geometry/geometry.py +0 -0
  139. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
  140. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
  141. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
  142. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
  143. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/signal_processing/detection.py +0 -0
  144. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/signal_processing/filters.py +0 -0
  145. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/signal_processing/matched_filter.py +0 -0
  146. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
  147. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/special_functions/error_functions.py +0 -0
  148. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/special_functions/gamma_functions.py +0 -0
  149. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
  150. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
  151. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
  152. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
  153. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/transforms/fourier.py +0 -0
  154. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/transforms/stft.py +0 -0
  155. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/mathematical_functions/transforms/wavelets.py +0 -0
  156. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/misc/__init__.py +0 -0
  157. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/navigation/ins_gnss.py +0 -0
  158. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/performance_evaluation/__init__.py +0 -0
  159. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
  160. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/performance_evaluation/track_metrics.py +0 -0
  161. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/physical_values/__init__.py +0 -0
  162. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/plotting/__init__.py +0 -0
  163. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/plotting/coordinates.py +0 -0
  164. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/plotting/ellipses.py +0 -0
  165. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/plotting/metrics.py +0 -0
  166. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/plotting/tracks.py +0 -0
  167. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/scheduling/__init__.py +0 -0
  168. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/static_estimation/__init__.py +0 -0
  169. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/static_estimation/least_squares.py +0 -0
  170. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/static_estimation/maximum_likelihood.py +0 -0
  171. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/static_estimation/robust.py +0 -0
  172. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/terrain/__init__.py +0 -0
  173. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/terrain/dem.py +0 -0
  174. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/terrain/loaders.py +0 -0
  175. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/terrain/visibility.py +0 -0
  176. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/trackers/hypothesis.py +0 -0
  177. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/trackers/mht.py +0 -0
  178. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/trackers/single_target.py +0 -0
  179. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/pytcl/transponders/__init__.py +0 -0
  180. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/setup.cfg +0 -0
  181. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/__init__.py +0 -0
  182. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/conftest.py +0 -0
  183. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_additional_trees.py +0 -0
  184. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_assignment_algorithms.py +0 -0
  185. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_astronomical.py +0 -0
  186. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_clustering.py +0 -0
  187. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_coordinate_systems.py +0 -0
  188. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_coverage_boost.py +0 -0
  189. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_dynamic_models.py +0 -0
  190. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_egm.py +0 -0
  191. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_emm.py +0 -0
  192. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_gaussian_mixtures.py +0 -0
  193. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_geophysical.py +0 -0
  194. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_ins.py +0 -0
  195. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_ins_gnss.py +0 -0
  196. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_kalman_filters.py +0 -0
  197. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_mathematical_functions.py +0 -0
  198. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_maximum_likelihood.py +0 -0
  199. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_mht.py +0 -0
  200. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_performance_evaluation.py +0 -0
  201. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_phase6_specialized.py +0 -0
  202. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_plotting.py +0 -0
  203. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_projections.py +0 -0
  204. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_signal_processing.py +0 -0
  205. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_spatial_structures.py +0 -0
  206. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_static_estimation.py +0 -0
  207. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_terrain.py +0 -0
  208. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_terrain_loaders.py +0 -0
  209. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_tides.py +0 -0
  210. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_trackers.py +0 -0
  211. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_tracking_containers.py +0 -0
  212. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_transforms.py +0 -0
  213. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_v030_comprehensive.py +0 -0
  214. {nrl_tracker-0.19.1 → nrl_tracker-1.6.0}/tests/test_v030_features.py +0 -0
  215. {nrl_tracker-0.19.1 → nrl_tracker-1.6.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.19.1
3
+ Version: 1.6.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
@@ -45,6 +45,7 @@ Provides-Extra: dev
45
45
  Requires-Dist: pytest>=7.0.0; extra == "dev"
46
46
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
47
47
  Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
48
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == "dev"
48
49
  Requires-Dist: hypothesis>=6.0.0; extra == "dev"
49
50
  Requires-Dist: black>=23.0.0; extra == "dev"
50
51
  Requires-Dist: isort>=5.12.0; extra == "dev"
@@ -55,27 +56,34 @@ Requires-Dist: sphinx>=6.0.0; extra == "dev"
55
56
  Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "dev"
56
57
  Requires-Dist: myst-parser>=1.0.0; extra == "dev"
57
58
  Requires-Dist: nbsphinx>=0.9.0; extra == "dev"
59
+ Provides-Extra: benchmark
60
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == "benchmark"
58
61
  Provides-Extra: all
59
62
  Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualization]; extra == "all"
60
63
 
61
64
  # Tracker Component Library (Python)
62
65
 
66
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.6.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
63
67
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
64
68
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
65
69
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
70
+ [![Tests](https://img.shields.io/badge/tests-1922%20passing-success.svg)](https://github.com/nedonatelli/TCL)
71
+ [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-99%25-brightgreen.svg)](docs/gap_analysis.rst)
66
72
 
67
73
  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.
68
74
 
75
+ **1,070+ functions** | **150+ modules** | **1,922 tests** | **99% MATLAB parity**
76
+
69
77
  ## Overview
70
78
 
71
79
  The Tracker Component Library provides building blocks for developing target tracking algorithms, including:
72
80
 
73
81
  - **Coordinate Systems**: Conversions between Cartesian, spherical, geodetic, and other coordinate systems
74
82
  - **Dynamic Models**: State transition matrices for constant velocity, coordinated turn, and other motion models
75
- - **Estimation Algorithms**: Kalman filters (EKF, UKF, etc.), particle filters, and batch estimation
83
+ - **Estimation Algorithms**: Kalman filters (EKF, UKF, CKF, H-infinity), particle filters, and batch estimation
76
84
  - **Assignment Algorithms**: Hungarian algorithm, auction algorithms, and multi-dimensional assignment
77
85
  - **Mathematical Functions**: Special functions, statistics, numerical integration, and more
78
- - **Astronomical Code**: Ephemeris calculations, time systems, celestial mechanics
86
+ - **Astronomical Code**: SGP4/SDP4 propagation, TLE parsing, reference frames (GCRF, ITRF, TEME, TOD, MOD), ephemerides
79
87
  - **Navigation**: Geodetic calculations, INS algorithms, GNSS utilities
80
88
  - **Geophysical Models**: Gravity, magnetism, atmosphere, and terrain models
81
89
 
@@ -1,21 +1,26 @@
1
1
  # Tracker Component Library (Python)
2
2
 
3
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.6.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
3
4
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
4
5
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
5
6
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
7
+ [![Tests](https://img.shields.io/badge/tests-1922%20passing-success.svg)](https://github.com/nedonatelli/TCL)
8
+ [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-99%25-brightgreen.svg)](docs/gap_analysis.rst)
6
9
 
7
10
  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.
8
11
 
12
+ **1,070+ functions** | **150+ modules** | **1,922 tests** | **99% MATLAB parity**
13
+
9
14
  ## Overview
10
15
 
11
16
  The Tracker Component Library provides building blocks for developing target tracking algorithms, including:
12
17
 
13
18
  - **Coordinate Systems**: Conversions between Cartesian, spherical, geodetic, and other coordinate systems
14
19
  - **Dynamic Models**: State transition matrices for constant velocity, coordinated turn, and other motion models
15
- - **Estimation Algorithms**: Kalman filters (EKF, UKF, etc.), particle filters, and batch estimation
20
+ - **Estimation Algorithms**: Kalman filters (EKF, UKF, CKF, H-infinity), particle filters, and batch estimation
16
21
  - **Assignment Algorithms**: Hungarian algorithm, auction algorithms, and multi-dimensional assignment
17
22
  - **Mathematical Functions**: Special functions, statistics, numerical integration, and more
18
- - **Astronomical Code**: Ephemeris calculations, time systems, celestial mechanics
23
+ - **Astronomical Code**: SGP4/SDP4 propagation, TLE parsing, reference frames (GCRF, ITRF, TEME, TOD, MOD), ephemerides
19
24
  - **Navigation**: Geodetic calculations, INS algorithms, GNSS utilities
20
25
  - **Geophysical Models**: Gravity, magnetism, atmosphere, and terrain models
21
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 0.19.1
3
+ Version: 1.6.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
@@ -45,6 +45,7 @@ Provides-Extra: dev
45
45
  Requires-Dist: pytest>=7.0.0; extra == "dev"
46
46
  Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
47
47
  Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
48
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == "dev"
48
49
  Requires-Dist: hypothesis>=6.0.0; extra == "dev"
49
50
  Requires-Dist: black>=23.0.0; extra == "dev"
50
51
  Requires-Dist: isort>=5.12.0; extra == "dev"
@@ -55,27 +56,34 @@ Requires-Dist: sphinx>=6.0.0; extra == "dev"
55
56
  Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "dev"
56
57
  Requires-Dist: myst-parser>=1.0.0; extra == "dev"
57
58
  Requires-Dist: nbsphinx>=0.9.0; extra == "dev"
59
+ Provides-Extra: benchmark
60
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == "benchmark"
58
61
  Provides-Extra: all
59
62
  Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualization]; extra == "all"
60
63
 
61
64
  # Tracker Component Library (Python)
62
65
 
66
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.6.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
63
67
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
64
68
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
65
69
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
70
+ [![Tests](https://img.shields.io/badge/tests-1922%20passing-success.svg)](https://github.com/nedonatelli/TCL)
71
+ [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-99%25-brightgreen.svg)](docs/gap_analysis.rst)
66
72
 
67
73
  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.
68
74
 
75
+ **1,070+ functions** | **150+ modules** | **1,922 tests** | **99% MATLAB parity**
76
+
69
77
  ## Overview
70
78
 
71
79
  The Tracker Component Library provides building blocks for developing target tracking algorithms, including:
72
80
 
73
81
  - **Coordinate Systems**: Conversions between Cartesian, spherical, geodetic, and other coordinate systems
74
82
  - **Dynamic Models**: State transition matrices for constant velocity, coordinated turn, and other motion models
75
- - **Estimation Algorithms**: Kalman filters (EKF, UKF, etc.), particle filters, and batch estimation
83
+ - **Estimation Algorithms**: Kalman filters (EKF, UKF, CKF, H-infinity), particle filters, and batch estimation
76
84
  - **Assignment Algorithms**: Hungarian algorithm, auction algorithms, and multi-dimensional assignment
77
85
  - **Mathematical Functions**: Special functions, statistics, numerical integration, and more
78
- - **Astronomical Code**: Ephemeris calculations, time systems, celestial mechanics
86
+ - **Astronomical Code**: SGP4/SDP4 propagation, TLE parsing, reference frames (GCRF, ITRF, TEME, TOD, MOD), ephemerides
79
87
  - **Navigation**: Geodetic calculations, INS algorithms, GNSS utilities
80
88
  - **Geophysical Models**: Gravity, magnetism, atmosphere, and terrain models
81
89
 
@@ -9,6 +9,7 @@ nrl_tracker.egg-info/dependency_links.txt
9
9
  nrl_tracker.egg-info/requires.txt
10
10
  nrl_tracker.egg-info/top_level.txt
11
11
  pytcl/__init__.py
12
+ pytcl/logging_config.py
12
13
  pytcl/assignment_algorithms/__init__.py
13
14
  pytcl/assignment_algorithms/data_association.py
14
15
  pytcl/assignment_algorithms/gating.py
@@ -19,11 +20,16 @@ pytcl/assignment_algorithms/two_dimensional/__init__.py
19
20
  pytcl/assignment_algorithms/two_dimensional/assignment.py
20
21
  pytcl/assignment_algorithms/two_dimensional/kbest.py
21
22
  pytcl/astronomical/__init__.py
23
+ pytcl/astronomical/ephemerides.py
22
24
  pytcl/astronomical/lambert.py
23
25
  pytcl/astronomical/orbital_mechanics.py
24
26
  pytcl/astronomical/reference_frames.py
27
+ pytcl/astronomical/relativity.py
28
+ pytcl/astronomical/sgp4.py
25
29
  pytcl/astronomical/time_systems.py
30
+ pytcl/astronomical/tle.py
26
31
  pytcl/atmosphere/__init__.py
32
+ pytcl/atmosphere/ionosphere.py
27
33
  pytcl/atmosphere/models.py
28
34
  pytcl/clustering/__init__.py
29
35
  pytcl/clustering/dbscan.py
@@ -31,6 +37,7 @@ pytcl/clustering/gaussian_mixture.py
31
37
  pytcl/clustering/hierarchical.py
32
38
  pytcl/clustering/kmeans.py
33
39
  pytcl/containers/__init__.py
40
+ pytcl/containers/base.py
34
41
  pytcl/containers/cluster_set.py
35
42
  pytcl/containers/covertree.py
36
43
  pytcl/containers/kd_tree.py
@@ -59,8 +66,11 @@ pytcl/dynamic_estimation/smoothers.py
59
66
  pytcl/dynamic_estimation/batch_estimation/__init__.py
60
67
  pytcl/dynamic_estimation/kalman/__init__.py
61
68
  pytcl/dynamic_estimation/kalman/extended.py
69
+ pytcl/dynamic_estimation/kalman/h_infinity.py
62
70
  pytcl/dynamic_estimation/kalman/linear.py
63
71
  pytcl/dynamic_estimation/kalman/square_root.py
72
+ pytcl/dynamic_estimation/kalman/sr_ukf.py
73
+ pytcl/dynamic_estimation/kalman/ud_filter.py
64
74
  pytcl/dynamic_estimation/kalman/unscented.py
65
75
  pytcl/dynamic_estimation/measurement_update/__init__.py
66
76
  pytcl/dynamic_estimation/particle_filters/__init__.py
@@ -106,9 +116,13 @@ pytcl/mathematical_functions/signal_processing/filters.py
106
116
  pytcl/mathematical_functions/signal_processing/matched_filter.py
107
117
  pytcl/mathematical_functions/special_functions/__init__.py
108
118
  pytcl/mathematical_functions/special_functions/bessel.py
119
+ pytcl/mathematical_functions/special_functions/debye.py
109
120
  pytcl/mathematical_functions/special_functions/elliptic.py
110
121
  pytcl/mathematical_functions/special_functions/error_functions.py
111
122
  pytcl/mathematical_functions/special_functions/gamma_functions.py
123
+ pytcl/mathematical_functions/special_functions/hypergeometric.py
124
+ pytcl/mathematical_functions/special_functions/lambert_w.py
125
+ pytcl/mathematical_functions/special_functions/marcum_q.py
112
126
  pytcl/mathematical_functions/statistics/__init__.py
113
127
  pytcl/mathematical_functions/statistics/distributions.py
114
128
  pytcl/mathematical_functions/statistics/estimators.py
@@ -119,8 +133,10 @@ pytcl/mathematical_functions/transforms/wavelets.py
119
133
  pytcl/misc/__init__.py
120
134
  pytcl/navigation/__init__.py
121
135
  pytcl/navigation/geodesy.py
136
+ pytcl/navigation/great_circle.py
122
137
  pytcl/navigation/ins.py
123
138
  pytcl/navigation/ins_gnss.py
139
+ pytcl/navigation/rhumb.py
124
140
  pytcl/performance_evaluation/__init__.py
125
141
  pytcl/performance_evaluation/estimation_metrics.py
126
142
  pytcl/performance_evaluation/track_metrics.py
@@ -153,11 +169,15 @@ tests/test_astronomical.py
153
169
  tests/test_clustering.py
154
170
  tests/test_coordinate_systems.py
155
171
  tests/test_coverage_boost.py
172
+ tests/test_coverage_boost_2.py
156
173
  tests/test_dynamic_models.py
157
174
  tests/test_egm.py
158
175
  tests/test_emm.py
176
+ tests/test_ephemerides.py
159
177
  tests/test_gaussian_mixtures.py
160
178
  tests/test_geophysical.py
179
+ tests/test_great_circle.py
180
+ tests/test_h_infinity.py
161
181
  tests/test_ins.py
162
182
  tests/test_ins_gnss.py
163
183
  tests/test_kalman_filters.py
@@ -168,16 +188,23 @@ tests/test_performance_evaluation.py
168
188
  tests/test_phase6_specialized.py
169
189
  tests/test_plotting.py
170
190
  tests/test_projections.py
191
+ tests/test_relativity.py
192
+ tests/test_rhumb.py
193
+ tests/test_sgp4.py
171
194
  tests/test_signal_processing.py
172
195
  tests/test_smoothers.py
196
+ tests/test_spatial_containers_parametrized.py
173
197
  tests/test_spatial_structures.py
198
+ tests/test_special_functions_phase12.py
174
199
  tests/test_static_estimation.py
175
200
  tests/test_terrain.py
176
201
  tests/test_terrain_loaders.py
177
202
  tests/test_tides.py
203
+ tests/test_tod_mod.py
178
204
  tests/test_trackers.py
179
205
  tests/test_tracking_containers.py
180
206
  tests/test_transforms.py
181
207
  tests/test_v030_comprehensive.py
182
208
  tests/test_v030_features.py
209
+ tests/test_validation.py
183
210
  tests/unit/test_core.py
@@ -9,10 +9,14 @@ nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualization]
9
9
  astropy>=5.0
10
10
  jplephem>=2.18
11
11
 
12
+ [benchmark]
13
+ pytest-benchmark>=4.0.0
14
+
12
15
  [dev]
13
16
  pytest>=7.0.0
14
17
  pytest-cov>=4.0.0
15
18
  pytest-xdist>=3.0.0
19
+ pytest-benchmark>=4.0.0
16
20
  hypothesis>=6.0.0
17
21
  black>=23.0.0
18
22
  isort>=5.12.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "nrl-tracker"
7
- version = "0.19.1"
7
+ version = "1.6.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 = [
@@ -67,6 +67,7 @@ dev = [
67
67
  "pytest>=7.0.0",
68
68
  "pytest-cov>=4.0.0",
69
69
  "pytest-xdist>=3.0.0",
70
+ "pytest-benchmark>=4.0.0",
70
71
  "hypothesis>=6.0.0",
71
72
  "black>=23.0.0",
72
73
  "isort>=5.12.0",
@@ -78,6 +79,9 @@ dev = [
78
79
  "myst-parser>=1.0.0",
79
80
  "nbsphinx>=0.9.0",
80
81
  ]
82
+ benchmark = [
83
+ "pytest-benchmark>=4.0.0",
84
+ ]
81
85
  all = [
82
86
  "nrl-tracker[astronomy,geodesy,visualization,optimization,signal,dev]",
83
87
  ]
@@ -100,6 +104,9 @@ testpaths = ["tests"]
100
104
  markers = [
101
105
  "slow: marks tests as slow (deselect with '-m \"not slow\"')",
102
106
  "matlab_validated: tests validated against MATLAB reference output",
107
+ "benchmark: marks tests as benchmarks",
108
+ "light: marks benchmark as part of light (PR) suite",
109
+ "full: marks benchmark as part of full (main) suite",
103
110
  ]
104
111
  filterwarnings = [
105
112
  "ignore::DeprecationWarning",
@@ -20,7 +20,7 @@ References
20
20
  no. 5, pp. 18-27, May 2017.
21
21
  """
22
22
 
23
- __version__ = "0.18.0"
23
+ __version__ = "1.6.0"
24
24
  __author__ = "Python Port Contributors"
25
25
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
26
 
@@ -10,13 +10,8 @@ from typing import List, NamedTuple, Optional
10
10
  import numpy as np
11
11
  from numpy.typing import ArrayLike, NDArray
12
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 pytcl.assignment_algorithms.gating import mahalanobis_batch, mahalanobis_distance
14
+ from pytcl.assignment_algorithms.two_dimensional import assign2d
20
15
 
21
16
 
22
17
  class AssociationResult(NamedTuple):
@@ -12,6 +12,7 @@ as JPDA can handle measurement origin uncertainty in cluttered environments.
12
12
  from typing import List, NamedTuple, Optional, Tuple
13
13
 
14
14
  import numpy as np
15
+ from numba import njit
15
16
  from numpy.typing import ArrayLike, NDArray
16
17
  from scipy.stats import chi2
17
18
 
@@ -314,45 +315,34 @@ def _jpda_exact(
314
315
  return beta
315
316
 
316
317
 
317
- def _jpda_approximate(
318
- likelihood_matrix: NDArray,
319
- gated: NDArray,
318
+ @njit(cache=True)
319
+ def _jpda_approximate_core(
320
+ likelihood_matrix: np.ndarray,
321
+ gated: np.ndarray,
320
322
  detection_prob: float,
321
323
  clutter_density: float,
322
- ) -> NDArray:
323
- """
324
- Approximate JPDA using parametric approach.
325
-
326
- Uses the approach from [1] which is O(n_tracks * n_meas^2).
327
-
328
- References
329
- ----------
330
- .. [1] Fitzgerald, R.J., "Development of Practical PDA Logic for
331
- Multitarget Tracking by Microprocessor", American Control
332
- Conference, 1986.
333
- """
334
- n_tracks, n_meas = likelihood_matrix.shape
335
- beta = np.zeros((n_tracks, n_meas + 1))
336
-
337
- # For each track, compute association probabilities independently
338
- # then apply correction for shared measurements
324
+ ) -> np.ndarray:
325
+ """JIT-compiled core of approximate JPDA computation."""
326
+ n_tracks = likelihood_matrix.shape[0]
327
+ n_meas = likelihood_matrix.shape[1]
328
+ beta = np.zeros((n_tracks, n_meas + 1), dtype=np.float64)
339
329
 
340
330
  # Likelihood ratio for each measurement given each track
341
- # L[i,j] = likelihood(z_j | track i) / clutter_density
342
- L = np.zeros((n_tracks, n_meas))
331
+ L = np.zeros((n_tracks, n_meas), dtype=np.float64)
343
332
  for i in range(n_tracks):
344
333
  for j in range(n_meas):
345
334
  if gated[i, j] and clutter_density > 0:
346
335
  L[i, j] = likelihood_matrix[i, j] / clutter_density
347
336
  elif gated[i, j]:
348
- L[i, j] = likelihood_matrix[i, j] * 1e10 # Large value
337
+ L[i, j] = likelihood_matrix[i, j] * 1e10
349
338
 
350
339
  # Compute delta factors (accounts for other tracks)
351
- delta = np.ones((n_tracks, n_meas))
340
+ delta = np.ones((n_tracks, n_meas), dtype=np.float64)
352
341
 
353
342
  for j in range(n_meas):
354
- # Sum of likelihood ratios for measurement j
355
- sum_L = np.sum(L[:, j])
343
+ sum_L = 0.0
344
+ for i in range(n_tracks):
345
+ sum_L += L[i, j]
356
346
  for i in range(n_tracks):
357
347
  if sum_L > 0:
358
348
  delta[i, j] = 1.0 / (1.0 + sum_L - L[i, j])
@@ -361,7 +351,6 @@ def _jpda_approximate(
361
351
 
362
352
  # Compute association probabilities
363
353
  for i in range(n_tracks):
364
- # Denominator for normalization
365
354
  denom = 1.0 - detection_prob
366
355
 
367
356
  for j in range(n_meas):
@@ -369,9 +358,9 @@ def _jpda_approximate(
369
358
  beta[i, j] = detection_prob * L[i, j] * delta[i, j]
370
359
  denom += beta[i, j]
371
360
 
372
- # Normalize
373
361
  if denom > 0:
374
- beta[i, :n_meas] /= denom
362
+ for j in range(n_meas):
363
+ beta[i, j] /= denom
375
364
  beta[i, n_meas] = (1.0 - detection_prob) / denom
376
365
  else:
377
366
  beta[i, n_meas] = 1.0
@@ -379,6 +368,31 @@ def _jpda_approximate(
379
368
  return beta
380
369
 
381
370
 
371
+ def _jpda_approximate(
372
+ likelihood_matrix: NDArray,
373
+ gated: NDArray,
374
+ detection_prob: float,
375
+ clutter_density: float,
376
+ ) -> NDArray:
377
+ """
378
+ Approximate JPDA using parametric approach.
379
+
380
+ Uses the approach from [1] which is O(n_tracks * n_meas^2).
381
+
382
+ References
383
+ ----------
384
+ .. [1] Fitzgerald, R.J., "Development of Practical PDA Logic for
385
+ Multitarget Tracking by Microprocessor", American Control
386
+ Conference, 1986.
387
+ """
388
+ return _jpda_approximate_core(
389
+ likelihood_matrix.astype(np.float64),
390
+ gated.astype(np.bool_),
391
+ detection_prob,
392
+ clutter_density,
393
+ )
394
+
395
+
382
396
  def jpda_update(
383
397
  track_states: List[ArrayLike],
384
398
  track_covariances: List[ArrayLike],
@@ -211,14 +211,21 @@ def auction(
211
211
  # Compute values: value[j] = -cost[i,j] - prices[j]
212
212
  values = -cost[i, :] - prices
213
213
 
214
- # Find best and second best
215
- sorted_idx = np.argsort(values)[::-1]
216
- best_j = sorted_idx[0]
217
- best_value = values[best_j]
218
-
219
- if len(sorted_idx) > 1:
220
- second_value = values[sorted_idx[1]]
214
+ # Find best and second best using argpartition (O(n) vs O(n log n))
215
+ if len(values) >= 2:
216
+ # Get indices of top 2 values
217
+ top2_idx = np.argpartition(values, -2)[-2:]
218
+ # Determine which is best and second best
219
+ if values[top2_idx[0]] > values[top2_idx[1]]:
220
+ best_j = top2_idx[0]
221
+ second_value = values[top2_idx[1]]
222
+ else:
223
+ best_j = top2_idx[1]
224
+ second_value = values[top2_idx[0]]
225
+ best_value = values[best_j]
221
226
  else:
227
+ best_j = np.argmax(values)
228
+ best_value = values[best_j]
222
229
  second_value = -np.inf
223
230
 
224
231
  # Bid increment
@@ -2,7 +2,8 @@
2
2
  Astronomical calculations for target tracking.
3
3
 
4
4
  This module provides time system conversions, orbital mechanics,
5
- Lambert problem solvers, and reference frame transformations.
5
+ Lambert problem solvers, reference frame transformations, and high-precision
6
+ ephemerides for celestial bodies.
6
7
 
7
8
  Examples
8
9
  --------
@@ -18,8 +19,19 @@ Examples
18
19
  >>> r1 = np.array([5000, 10000, 2100])
19
20
  >>> r2 = np.array([-14600, 2500, 7000])
20
21
  >>> sol = lambert_universal(r1, r2, 3600)
22
+
23
+ >>> # Query Sun position with high precision
24
+ >>> from pytcl.astronomical import sun_position
25
+ >>> r_sun, v_sun = sun_position(2451545.0) # J2000.0
21
26
  """
22
27
 
28
+ from pytcl.astronomical.ephemerides import (
29
+ DEEphemeris,
30
+ barycenter_position,
31
+ moon_position,
32
+ planet_position,
33
+ sun_position,
34
+ )
23
35
  from pytcl.astronomical.lambert import (
24
36
  LambertSolution,
25
37
  bi_elliptic_transfer,
@@ -28,8 +40,10 @@ from pytcl.astronomical.lambert import (
28
40
  lambert_universal,
29
41
  minimum_energy_transfer,
30
42
  )
31
- from pytcl.astronomical.orbital_mechanics import ( # Constants; Types; Anomaly conversions; Element conversions; Propagation; Orbital quantities
32
- GM_EARTH,
43
+ from pytcl.astronomical.orbital_mechanics import (
44
+ GM_EARTH, # Constants; Types; Anomaly conversions; Element conversions; Propagation; Orbital quantities
45
+ )
46
+ from pytcl.astronomical.orbital_mechanics import (
33
47
  GM_JUPITER,
34
48
  GM_MARS,
35
49
  GM_MOON,
@@ -62,8 +76,10 @@ from pytcl.astronomical.orbital_mechanics import ( # Constants; Types; Anomaly
62
76
  true_to_mean_anomaly,
63
77
  vis_viva,
64
78
  )
65
- from pytcl.astronomical.reference_frames import ( # Time utilities; Precession; Nutation; Earth rotation; Polar motion; Full transformations; Ecliptic/equatorial
66
- earth_rotation_angle,
79
+ from pytcl.astronomical.reference_frames import (
80
+ earth_rotation_angle, # Time utilities; Precession; Nutation; Earth rotation; Polar motion; Full transformations; Ecliptic/equatorial
81
+ )
82
+ from pytcl.astronomical.reference_frames import (
67
83
  ecef_to_eci,
68
84
  eci_to_ecef,
69
85
  ecliptic_to_equatorial,
@@ -71,20 +87,59 @@ from pytcl.astronomical.reference_frames import ( # Time utilities; Precession;
71
87
  equatorial_to_ecliptic,
72
88
  gast_iau82,
73
89
  gcrf_to_itrf,
90
+ gcrf_to_mod,
91
+ gcrf_to_teme,
92
+ gcrf_to_tod,
74
93
  gmst_iau82,
75
94
  itrf_to_gcrf,
95
+ itrf_to_teme,
96
+ itrf_to_teme_with_velocity,
97
+ itrf_to_tod,
76
98
  julian_centuries_j2000,
77
99
  mean_obliquity_iau80,
100
+ mod_to_gcrf,
101
+ mod_to_tod,
78
102
  nutation_angles_iau80,
79
103
  nutation_matrix,
104
+ pef_to_teme,
80
105
  polar_motion_matrix,
81
106
  precession_angles_iau76,
82
107
  precession_matrix_iau76,
83
108
  sidereal_rotation_matrix,
109
+ teme_to_gcrf,
110
+ teme_to_itrf,
111
+ teme_to_itrf_with_velocity,
112
+ teme_to_pef,
113
+ tod_to_gcrf,
114
+ tod_to_itrf,
115
+ tod_to_mod,
84
116
  true_obliquity,
85
117
  )
86
- from pytcl.astronomical.time_systems import ( # Julian dates; Time scales; Unix time; GPS week; Sidereal time; Leap seconds; Constants
87
- JD_GPS_EPOCH,
118
+ from pytcl.astronomical.relativity import (
119
+ C_LIGHT, # Physical constants; Schwarzschild metric; Time dilation; Shapiro delay; Precession; PN effects; Range corrections
120
+ )
121
+ from pytcl.astronomical.relativity import (
122
+ G_GRAV,
123
+ geodetic_precession,
124
+ gravitational_time_dilation,
125
+ lense_thirring_precession,
126
+ post_newtonian_acceleration,
127
+ proper_time_rate,
128
+ relativistic_range_correction,
129
+ schwarzschild_precession_per_orbit,
130
+ schwarzschild_radius,
131
+ shapiro_delay,
132
+ )
133
+ from pytcl.astronomical.sgp4 import (
134
+ SGP4Satellite,
135
+ SGP4State,
136
+ sgp4_propagate,
137
+ sgp4_propagate_batch,
138
+ )
139
+ from pytcl.astronomical.time_systems import (
140
+ JD_GPS_EPOCH, # Julian dates; Time scales; Unix time; GPS week; Sidereal time; Leap seconds; Constants
141
+ )
142
+ from pytcl.astronomical.time_systems import (
88
143
  JD_J2000,
89
144
  JD_UNIX_EPOCH,
90
145
  MJD_OFFSET,
@@ -112,6 +167,17 @@ from pytcl.astronomical.time_systems import ( # Julian dates; Time scales; Unix
112
167
  utc_to_tai,
113
168
  utc_to_tt,
114
169
  )
170
+ from pytcl.astronomical.tle import (
171
+ TLE,
172
+ format_tle,
173
+ is_deep_space,
174
+ orbital_period_from_tle,
175
+ parse_tle,
176
+ parse_tle_3line,
177
+ semi_major_axis_from_mean_motion,
178
+ tle_epoch_to_datetime,
179
+ tle_epoch_to_jd,
180
+ )
115
181
 
116
182
  __all__ = [
117
183
  # Time systems - Julian dates
@@ -218,4 +284,57 @@ __all__ = [
218
284
  # Reference frames - Ecliptic/equatorial
219
285
  "ecliptic_to_equatorial",
220
286
  "equatorial_to_ecliptic",
287
+ # Reference frames - TEME (for SGP4/SDP4)
288
+ "teme_to_pef",
289
+ "pef_to_teme",
290
+ "teme_to_itrf",
291
+ "itrf_to_teme",
292
+ "teme_to_gcrf",
293
+ "gcrf_to_teme",
294
+ "teme_to_itrf_with_velocity",
295
+ "itrf_to_teme_with_velocity",
296
+ # Reference frames - TOD/MOD (legacy conventions)
297
+ "gcrf_to_mod",
298
+ "mod_to_gcrf",
299
+ "gcrf_to_tod",
300
+ "tod_to_gcrf",
301
+ "mod_to_tod",
302
+ "tod_to_mod",
303
+ "tod_to_itrf",
304
+ "itrf_to_tod",
305
+ # TLE parsing
306
+ "TLE",
307
+ "parse_tle",
308
+ "parse_tle_3line",
309
+ "tle_epoch_to_jd",
310
+ "tle_epoch_to_datetime",
311
+ "format_tle",
312
+ "is_deep_space",
313
+ "semi_major_axis_from_mean_motion",
314
+ "orbital_period_from_tle",
315
+ # SGP4/SDP4 propagation
316
+ "SGP4State",
317
+ "SGP4Satellite",
318
+ "sgp4_propagate",
319
+ "sgp4_propagate_batch",
320
+ # Ephemerides - Classes
321
+ "DEEphemeris",
322
+ # Ephemerides - Functions
323
+ "sun_position",
324
+ "moon_position",
325
+ "planet_position",
326
+ "barycenter_position",
327
+ # Relativity - Constants
328
+ "C_LIGHT",
329
+ "G_GRAV",
330
+ # Relativity - Functions
331
+ "schwarzschild_radius",
332
+ "gravitational_time_dilation",
333
+ "proper_time_rate",
334
+ "shapiro_delay",
335
+ "schwarzschild_precession_per_orbit",
336
+ "post_newtonian_acceleration",
337
+ "geodetic_precession",
338
+ "lense_thirring_precession",
339
+ "relativistic_range_correction",
221
340
  ]