nrl-tracker 0.21.5__py3-none-any.whl → 0.22.1__py3-none-any.whl

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 (84) hide show
  1. {nrl_tracker-0.21.5.dist-info → nrl_tracker-0.22.1.dist-info}/METADATA +2 -2
  2. {nrl_tracker-0.21.5.dist-info → nrl_tracker-0.22.1.dist-info}/RECORD +84 -82
  3. pytcl/__init__.py +1 -1
  4. pytcl/assignment_algorithms/data_association.py +2 -7
  5. pytcl/assignment_algorithms/gating.py +3 -3
  6. pytcl/assignment_algorithms/jpda.py +4 -12
  7. pytcl/assignment_algorithms/two_dimensional/kbest.py +1 -3
  8. pytcl/astronomical/__init__.py +60 -7
  9. pytcl/astronomical/ephemerides.py +522 -0
  10. pytcl/astronomical/lambert.py +4 -14
  11. pytcl/astronomical/orbital_mechanics.py +1 -3
  12. pytcl/astronomical/reference_frames.py +1 -3
  13. pytcl/astronomical/relativity.py +466 -0
  14. pytcl/atmosphere/__init__.py +2 -2
  15. pytcl/atmosphere/models.py +1 -3
  16. pytcl/clustering/gaussian_mixture.py +4 -8
  17. pytcl/clustering/hierarchical.py +1 -5
  18. pytcl/clustering/kmeans.py +1 -3
  19. pytcl/containers/__init__.py +4 -21
  20. pytcl/containers/cluster_set.py +4 -19
  21. pytcl/containers/measurement_set.py +3 -15
  22. pytcl/containers/rtree.py +2 -5
  23. pytcl/coordinate_systems/conversions/geodetic.py +3 -15
  24. pytcl/coordinate_systems/projections/__init__.py +4 -2
  25. pytcl/coordinate_systems/projections/projections.py +11 -38
  26. pytcl/coordinate_systems/rotations/rotations.py +1 -3
  27. pytcl/core/array_utils.py +1 -4
  28. pytcl/core/constants.py +1 -3
  29. pytcl/core/validation.py +6 -17
  30. pytcl/dynamic_estimation/imm.py +4 -13
  31. pytcl/dynamic_estimation/kalman/extended.py +1 -4
  32. pytcl/dynamic_estimation/kalman/square_root.py +2 -6
  33. pytcl/dynamic_estimation/kalman/unscented.py +1 -4
  34. pytcl/dynamic_estimation/particle_filters/bootstrap.py +2 -6
  35. pytcl/dynamic_estimation/smoothers.py +2 -8
  36. pytcl/dynamic_models/discrete_time/__init__.py +1 -5
  37. pytcl/dynamic_models/process_noise/__init__.py +1 -5
  38. pytcl/dynamic_models/process_noise/polynomial.py +2 -6
  39. pytcl/gravity/clenshaw.py +2 -6
  40. pytcl/gravity/egm.py +1 -3
  41. pytcl/gravity/models.py +1 -3
  42. pytcl/gravity/spherical_harmonics.py +4 -10
  43. pytcl/gravity/tides.py +7 -16
  44. pytcl/magnetism/__init__.py +3 -14
  45. pytcl/magnetism/emm.py +3 -12
  46. pytcl/magnetism/wmm.py +2 -9
  47. pytcl/mathematical_functions/basic_matrix/decompositions.py +1 -3
  48. pytcl/mathematical_functions/combinatorics/combinatorics.py +1 -3
  49. pytcl/mathematical_functions/geometry/geometry.py +4 -12
  50. pytcl/mathematical_functions/interpolation/__init__.py +2 -2
  51. pytcl/mathematical_functions/interpolation/interpolation.py +1 -3
  52. pytcl/mathematical_functions/signal_processing/detection.py +3 -6
  53. pytcl/mathematical_functions/signal_processing/filters.py +2 -6
  54. pytcl/mathematical_functions/signal_processing/matched_filter.py +2 -4
  55. pytcl/mathematical_functions/special_functions/__init__.py +2 -2
  56. pytcl/mathematical_functions/special_functions/elliptic.py +1 -3
  57. pytcl/mathematical_functions/special_functions/gamma_functions.py +1 -3
  58. pytcl/mathematical_functions/special_functions/lambert_w.py +1 -3
  59. pytcl/mathematical_functions/statistics/distributions.py +12 -36
  60. pytcl/mathematical_functions/statistics/estimators.py +1 -3
  61. pytcl/mathematical_functions/transforms/stft.py +3 -9
  62. pytcl/mathematical_functions/transforms/wavelets.py +6 -18
  63. pytcl/navigation/__init__.py +14 -10
  64. pytcl/navigation/geodesy.py +9 -31
  65. pytcl/navigation/great_circle.py +4 -12
  66. pytcl/navigation/ins.py +3 -13
  67. pytcl/navigation/ins_gnss.py +7 -25
  68. pytcl/navigation/rhumb.py +3 -10
  69. pytcl/performance_evaluation/track_metrics.py +1 -3
  70. pytcl/plotting/coordinates.py +5 -17
  71. pytcl/plotting/metrics.py +3 -9
  72. pytcl/plotting/tracks.py +3 -11
  73. pytcl/static_estimation/least_squares.py +1 -2
  74. pytcl/static_estimation/maximum_likelihood.py +3 -3
  75. pytcl/terrain/dem.py +2 -8
  76. pytcl/terrain/loaders.py +5 -13
  77. pytcl/terrain/visibility.py +2 -7
  78. pytcl/trackers/__init__.py +3 -14
  79. pytcl/trackers/hypothesis.py +2 -7
  80. pytcl/trackers/mht.py +5 -15
  81. pytcl/trackers/multi_target.py +1 -4
  82. {nrl_tracker-0.21.5.dist-info → nrl_tracker-0.22.1.dist-info}/LICENSE +0 -0
  83. {nrl_tracker-0.21.5.dist-info → nrl_tracker-0.22.1.dist-info}/WHEEL +0 -0
  84. {nrl_tracker-0.21.5.dist-info → nrl_tracker-0.22.1.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 0.21.5
3
+ Version: 0.22.1
4
4
  Summary: Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms
5
5
  Author: Original: David F. Crouse, Naval Research Laboratory
6
6
  Maintainer: Python Port Contributors
@@ -60,7 +60,7 @@ Requires-Dist: plotly>=5.15.0; extra == "visualization"
60
60
 
61
61
  # Tracker Component Library (Python)
62
62
 
63
- [![PyPI version](https://img.shields.io/badge/pypi-v0.21.5-blue.svg)](https://pypi.org/project/nrl-tracker/)
63
+ [![PyPI version](https://img.shields.io/badge/pypi-v0.22.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
64
64
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
65
65
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
66
66
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -1,148 +1,150 @@
1
- pytcl/__init__.py,sha256=86iR1EH4MIBDqch9pt_t68jkez1Xm_JF3SLxf3yne9A,1894
1
+ pytcl/__init__.py,sha256=pMvIZSoR3GxNdW8Fxmfpf-WB5CbuxJe3HCBW6U7fNRc,1894
2
2
  pytcl/assignment_algorithms/__init__.py,sha256=f9V-TkEVmiKYYyth4PTpDfJvA7yYV_ys6Zix-QwWIYY,2136
3
- pytcl/assignment_algorithms/data_association.py,sha256=X6Kww9-J2WLxU1790w7dRvAFdM90RSXHvs7IF26zweQ,11427
4
- pytcl/assignment_algorithms/gating.py,sha256=fN_oAOkv7nYYOWE1oPOLrcCn3xEpKdMVlFSbRMAURxY,10815
5
- pytcl/assignment_algorithms/jpda.py,sha256=Hv55j3J9qVwzlUfWdXdSasodTyB1ZKdgEpo5dBh95O8,19582
3
+ pytcl/assignment_algorithms/data_association.py,sha256=tsRxWJZk9aAPmE99BKXGouEpFfZrjPjb4HXvgxFUHhU,11405
4
+ pytcl/assignment_algorithms/gating.py,sha256=wm4NO7hR7YPgaovX6eiJ2kHmXORHIpFqYGC0sTis_DU,10815
5
+ pytcl/assignment_algorithms/jpda.py,sha256=-hQNxCGYE5SmhVw0JAX81SFqB0ljO3RYdutmpkV00m4,19492
6
6
  pytcl/assignment_algorithms/three_dimensional/__init__.py,sha256=1Q40OUlUQoo7YKEucwdrSNo3D4A0Zibvkr8z4TpueBg,526
7
7
  pytcl/assignment_algorithms/three_dimensional/assignment.py,sha256=9BJhwlYu3JJ0kZ9sRyKKfpdvQdL4WYYHCtLbvaWycBw,19212
8
8
  pytcl/assignment_algorithms/two_dimensional/__init__.py,sha256=4Evsn__9hTfI2i8m8Ngl-Zy0Fa2OydKmDKlZlH6jaao,778
9
9
  pytcl/assignment_algorithms/two_dimensional/assignment.py,sha256=eh87MBb-uiUSI1MXj4HrreRKB6Z8rxAyDkNQ8-u4SbM,11848
10
- pytcl/assignment_algorithms/two_dimensional/kbest.py,sha256=yiTToLuP7xWxQlQ8E-fpgXg-5iu0nnXcJXStjUB0nOE,17284
11
- pytcl/astronomical/__init__.py,sha256=SKELDaDhxpvCo1dMswBQYOQr_Th3ShuzZTzxZMdhE-U,5650
12
- pytcl/astronomical/lambert.py,sha256=Lc8FT1JmpI9WSXsG2s5vIRkSoBSV7r5hd3o2bGh2Ojo,15607
13
- pytcl/astronomical/orbital_mechanics.py,sha256=8GssRanwTowCl6PJYqmB_SDnNznLUq5gkPa3j6iEo3U,19965
14
- pytcl/astronomical/reference_frames.py,sha256=GDak7af6BqOwGnCUxkvFoeqd_H2TMubdjG9lGPCoUB4,15799
10
+ pytcl/assignment_algorithms/two_dimensional/kbest.py,sha256=iDtLbKr0eh6Gd5wuyKrjBm2Qr3DeH2OOxtzf9eSR76E,17262
11
+ pytcl/astronomical/__init__.py,sha256=Dtf6hqXyKyFL5VP-sqI7m2QGK6l-rqRGxVIhgDuYHOg,7182
12
+ pytcl/astronomical/ephemerides.py,sha256=RU5Mk3tj10LoL1eOY3XiGsKwuPzHJdypORf3jU6eMZk,16397
13
+ pytcl/astronomical/lambert.py,sha256=iMxqG7cFdfcN5AOI-9FF6t1Qgj_443_c0BwAwlaPqm8,15493
14
+ pytcl/astronomical/orbital_mechanics.py,sha256=f3Vqn2bWzxbMQO60SlHXf3515j3LSA2fd_MHZE5z5h0,19951
15
+ pytcl/astronomical/reference_frames.py,sha256=R_bdfXYYoeNjgYU1deIynB0IBjpy4xc9Tlq8Q4W9FKc,15783
16
+ pytcl/astronomical/relativity.py,sha256=cqMR0oZJXNXYiEwnC8QrABkAAcu4c8MLoX74iNpZwfM,15418
15
17
  pytcl/astronomical/time_systems.py,sha256=Jg0Zaq60hc4Ts1aQtb5bK4KSZhz-uQse8gYC89Y0-TA,15243
16
- pytcl/atmosphere/__init__.py,sha256=QAYgJYzgs0kreRV8fByii4p477LCxBDfrXB_cL7SYkM,706
17
- pytcl/atmosphere/models.py,sha256=pMLv8D7qoFqLZrlbTHLJJULOdDdhPskJ1m7KVKLV63E,9584
18
+ pytcl/atmosphere/__init__.py,sha256=TTVz4hAM48Xd3jr6GKrR2GAABpx2z0aWvtzb9uIQiHk,737
19
+ pytcl/atmosphere/models.py,sha256=hOfUjM4jNLLfkzd_9J_utR04tkwyBT8KsyjVMrVQJ6k,9570
18
20
  pytcl/clustering/__init__.py,sha256=bYdhC_XJEt6KUUni9bIPxaddXNEGmIJQvGkA14rK4J8,1697
19
21
  pytcl/clustering/dbscan.py,sha256=PS6QlOwHFerbZNEb3zcNhN4oNQpgOOw5y0WskQzyKIo,7364
20
- pytcl/clustering/gaussian_mixture.py,sha256=U5U0Z46tZWdTLNdNNNJenoeviwZRAOvexVFYVLt4QMc,22865
21
- pytcl/clustering/hierarchical.py,sha256=Hw9BFCn5df_ATpJX63R3B31MHz27ztCw9ihMDIlI688,14202
22
- pytcl/clustering/kmeans.py,sha256=250FQyDol5S_Y4TznNn9cEuE96UDp7wvEkPZJ1DLul8,10697
23
- pytcl/containers/__init__.py,sha256=t8oRtusBrh6G2dEk2PcofmxrpLPQ9nOJwH19GyKnNcc,1699
24
- pytcl/containers/cluster_set.py,sha256=_lZ39PNHTL7fUEZAwBF2ICK6v0GjZKpeUOg0knEdPzo,22760
22
+ pytcl/clustering/gaussian_mixture.py,sha256=5ucepT-vNcs1cOimykOWGkhO1Q-UgfRbUJ19H585Qa0,22813
23
+ pytcl/clustering/hierarchical.py,sha256=-ZEEDSJ4RBMyXOgHD7CZJmIHS8DbS80pagoko9asBIo,14156
24
+ pytcl/clustering/kmeans.py,sha256=84n4v04m7PiRehdj3n0mPisou1eM6Z9-p8ztbDTyoWQ,10683
25
+ pytcl/containers/__init__.py,sha256=-hnqSMKlMugj2RRssx3p_48HWnfqLSrF6BCChsinCOg,1627
26
+ pytcl/containers/cluster_set.py,sha256=t-n5Fn7KnIMyeIA_xmYS-LisKvzG0e1SCyVLZIuKnIY,22657
25
27
  pytcl/containers/covertree.py,sha256=1JWqXxoUFLxuMnjwj2qf0iz2uPzdujQYdwJW3l5qsOs,13282
26
28
  pytcl/containers/kd_tree.py,sha256=pxRC62RYkqz9zXPz6c1fubmtPPBDLYA5I9AXMAoGanw,16348
27
- pytcl/containers/measurement_set.py,sha256=Kr29mlJOCyGMYhMnE89f-W72aunlv4p04QAdfCZcm-0,12687
28
- pytcl/containers/rtree.py,sha256=gv2EztvPnaAXEa6OoFnOYBY1MfTwjNMYh_BCiIomHJk,15450
29
+ pytcl/containers/measurement_set.py,sha256=EqijbnQZzF3fwNT9An7KVXJTvT4m_kjQDnQeEkxlLwM,12618
30
+ pytcl/containers/rtree.py,sha256=5jPy8NxZnmmpTgyRScwwj4L7U5Vq4NfChKotdzVcW6w,15400
29
31
  pytcl/containers/track_list.py,sha256=6q9Qgcwm-8H_JqtOCsMssF27av4XaSkhfDl-MWb1ABc,12520
30
32
  pytcl/containers/vptree.py,sha256=6fBNHrezkmj7L2nH0-2bONRN92f5cZAhS-5vaI1JZnA,8814
31
33
  pytcl/coordinate_systems/__init__.py,sha256=jwYhu_-9AvOeP9WLG9PYtyDwfe0GjxNZ9-xCqiLymW4,3909
32
34
  pytcl/coordinate_systems/conversions/__init__.py,sha256=PkNevB78vBw0BkalydJBbQO91AyiMJxKRrgJNt4HsYc,1100
33
- pytcl/coordinate_systems/conversions/geodetic.py,sha256=qQSnJRt3jg5KiostvzyslPIbfn-1xBluo1r12oavWTQ,15737
35
+ pytcl/coordinate_systems/conversions/geodetic.py,sha256=HrSacirnucwrviDjX5KuqxyFlFqgnGpFWFux2XBhdBM,15635
34
36
  pytcl/coordinate_systems/conversions/spherical.py,sha256=q7k9l5mJbVzVdNj9Gcq4ibFxax8z_mVpJfITRBzx630,10812
35
37
  pytcl/coordinate_systems/jacobians/__init__.py,sha256=CRGB8GzvGT_sr4Ynm51S7gSX8grqt1pO1Pq1MWmHPTs,890
36
38
  pytcl/coordinate_systems/jacobians/jacobians.py,sha256=1KufIoktm9mXLO34X9KjysdMpu7itGwfssRyAdkTTN8,11703
37
- pytcl/coordinate_systems/projections/__init__.py,sha256=-IaYuCO9EU3ytik2KqIbFLP2YZScdaLsNJOXZJev6s0,2438
38
- pytcl/coordinate_systems/projections/projections.py,sha256=yODS7n1gA4jsCJcU8EaeclHrbUBsZI9O2M_XJs2HOXs,33169
39
+ pytcl/coordinate_systems/projections/__init__.py,sha256=eWNtezPO62IUWxv7jymenIXsWS1MC66Q12u5KRUnqNE,2503
40
+ pytcl/coordinate_systems/projections/projections.py,sha256=cqYd0zb_6DZFQfGQ8IAzBoAhKpbkxw_1MLt5JiT8TEI,32877
39
41
  pytcl/coordinate_systems/rotations/__init__.py,sha256=nqAz4iJd2hEOX_r7Tz4cE524sShyxdbtcQ5m56RrDLg,1047
40
- pytcl/coordinate_systems/rotations/rotations.py,sha256=FAYHkShQcpOlWJjtvLfNvtCx-a56pr-cbpo0QjC5W9U,18227
42
+ pytcl/coordinate_systems/rotations/rotations.py,sha256=i5OtHxCLwq9k4gBIMb_n8HWq5EfMyyq3znlTenKjus0,18213
41
43
  pytcl/core/__init__.py,sha256=H5JJPS-43DfF1UG7fSgV-VMTcZFBO8GuzDW1lM_1sm4,1152
42
- pytcl/core/array_utils.py,sha256=SsgEiAoRCWxAVKq1aa5-nPdOi-2AB6XNObu0IaGClUk,13983
43
- pytcl/core/constants.py,sha256=lZVDK5zsSR02_4b2Nqx9KDtZT9QaYhkZ9wuoODbifd4,8693
44
- pytcl/core/validation.py,sha256=WRlzMlUihtqc3XZoWOTFK0sBAZVDIwTMGCiWcX5OZVY,13093
44
+ pytcl/core/array_utils.py,sha256=kLZII_6Yk2C4Gin6i_PFiklkJ_P_OyHDhVG7EN2iTLg,13971
45
+ pytcl/core/constants.py,sha256=v--FHNYH441t2tfZeNpPbTxZDqiyql6ehA9Z3iTsnxw,8687
46
+ pytcl/core/validation.py,sha256=9O7rs8bZP9gFT98AD8S-chPcx5uZOh7b_KTBeDGNzFg,12931
45
47
  pytcl/dynamic_estimation/__init__.py,sha256=jA5FF6kHYklY5LMOfZaKcCeiPTpVe8vHIMp3ECDOmsc,4582
46
- pytcl/dynamic_estimation/imm.py,sha256=t4dlutWeCLtAMl-ylNbxMUC3gbRBF_sXI3bX4PAk-OQ,22080
48
+ pytcl/dynamic_estimation/imm.py,sha256=6Skq7HOABQ9XCTM8lEHLqBp_OqDm7srl_hVuYCp4ZPw,22009
47
49
  pytcl/dynamic_estimation/information_filter.py,sha256=x7iQwO_iJT1dCSvDws5LqD3yAtjw9QVGUfMPcXn1IA4,17349
48
- pytcl/dynamic_estimation/smoothers.py,sha256=qC_g0YG0U4L_7rGBpcZzYcb11A--Hc8tb0fxWXIJdxM,18931
50
+ pytcl/dynamic_estimation/smoothers.py,sha256=NlQ3aCLRGZE5O_pJn0at6xyK1TNf8-KlSYYZhSrnWIw,18900
49
51
  pytcl/dynamic_estimation/batch_estimation/__init__.py,sha256=JQ0s76Enov5a7plA4EnUua4t-7etikQrwr5z4WIjUeo,46
50
52
  pytcl/dynamic_estimation/kalman/__init__.py,sha256=yoFLj0n-NRkdZnRVL-BkHBlATk8pfZEVlsY3BhSYgKc,2387
51
- pytcl/dynamic_estimation/kalman/extended.py,sha256=_deQTnUGOp_BlhP-FDEY0LOjgUMN32FQn0V12unCM4A,10397
53
+ pytcl/dynamic_estimation/kalman/extended.py,sha256=51uhCqkZmErCx6MBfMq8eIQW8bD7n34zCe4v4dxNiMQ,10384
52
54
  pytcl/dynamic_estimation/kalman/linear.py,sha256=1Zgg9gZya0Vxs9im7sPUqLj0Luo463vS-RSa6GCReFI,12248
53
- pytcl/dynamic_estimation/kalman/square_root.py,sha256=Hw1F4_Zc7IA6Mt1WCkjx1UuLAUmNhM5vPLvueb7oRSA,26931
54
- pytcl/dynamic_estimation/kalman/unscented.py,sha256=VmYE8LuM1nWpFTmD39iXdEZ3m41IsurCCbXJ19-ERFs,15440
55
+ pytcl/dynamic_estimation/kalman/square_root.py,sha256=jUsyfX9JGRUWiSZMt1JfSiIbnM37FB5kID0yMNnDJ_k,26871
56
+ pytcl/dynamic_estimation/kalman/unscented.py,sha256=RDK6USkko9lj1K4-WYydh3_8GMZNng_PJVjfc-c_OwM,15427
55
57
  pytcl/dynamic_estimation/measurement_update/__init__.py,sha256=8rlyJwVpxf0fZj-AFo1hlewvryZRhUzcy3F8uMe6I8c,48
56
58
  pytcl/dynamic_estimation/particle_filters/__init__.py,sha256=-DRF5rVF2749suLlArmkTvVkqeMcV_mIx0eLeTj6wNU,906
57
- pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=FcF4W_NM5ZqJnw5fq4rq6fLY9X1r4uFJOiAX9a-NGG8,13371
59
+ pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=QdqQME3ye5qCjoyJEbGfzI9r80GT_NLSj1pldZnmziw,13343
58
60
  pytcl/dynamic_models/__init__.py,sha256=Cd8MyyYuB8gMnepkPA-HSwTaKFPThnqoKOhdjVOsXWg,2783
59
61
  pytcl/dynamic_models/continuous_time/__init__.py,sha256=dAkfEddLkfMvDalK9v2GRBvaZV1KgqYpFBLOnoiFClw,1023
60
62
  pytcl/dynamic_models/continuous_time/dynamics.py,sha256=CDwqn-66eUwXA5xfIjaG6A4EDBqtOyQ3aWarJr9QH4g,12858
61
- pytcl/dynamic_models/discrete_time/__init__.py,sha256=pJ-VWMPkIdOcARM3CXlpYZcdUS5jWmqC6z2DXTd-b7c,966
63
+ pytcl/dynamic_models/discrete_time/__init__.py,sha256=1cdYeVIe-kgogiHzeCv1eYMctSimh8t1nIE6Z1N4im4,949
62
64
  pytcl/dynamic_models/discrete_time/coordinated_turn.py,sha256=jrSGCKiAdXaFIJBLzRyAv0xxxpOHOBnAtDHyu7VYsm8,7206
63
65
  pytcl/dynamic_models/discrete_time/polynomial.py,sha256=zv5V-AbuaXlIj36n-YkOEyC74jV2vczxpCW09P0kmi0,5529
64
66
  pytcl/dynamic_models/discrete_time/singer.py,sha256=wZS3Nad-YyPZp8Mle8Sf5GgW0-t4TxMRcnbc42HtQnA,3861
65
- pytcl/dynamic_models/process_noise/__init__.py,sha256=3KVpLzGaNaR36DloPG5R1yaZWcR5QpdUJp2hwh5KFnk,950
67
+ pytcl/dynamic_models/process_noise/__init__.py,sha256=ZRYgV40qmBkPwU3yTbIMvxorr4nVz0_FEP2oCeVjXoM,933
66
68
  pytcl/dynamic_models/process_noise/coordinated_turn.py,sha256=w7bHUImLPL5m3KYenfNgAnHPCRtAyYESbsFc6lQKXRg,4768
67
- pytcl/dynamic_models/process_noise/polynomial.py,sha256=natfpsdN3qM9VzPeXF_nBpsbRI74S1WkkRCaaem6EQo,7620
69
+ pytcl/dynamic_models/process_noise/polynomial.py,sha256=Rb7LITSZ1kbOnd0Q8TWRdUR_4sl9RCqfcsf0OawJl9U,7574
68
70
  pytcl/dynamic_models/process_noise/singer.py,sha256=lsJDT6xOvcS_qQKFtgHX0L7Ukpy4D7HgvPT8Q3I0ibU,3901
69
71
  pytcl/gravity/__init__.py,sha256=5xNdQSrrkt7-1-JPOYqR38CqvNJ7qKlPyMK36DGm6-I,3693
70
- pytcl/gravity/clenshaw.py,sha256=1BdxzU8IfGGd68H_U35soIJkiOHphY35e9mLElhPTOg,15364
71
- pytcl/gravity/egm.py,sha256=QTRuvCiMjuNQdZF163OGwjxuivpGu2dB6E0zQLbKPP8,18083
72
- pytcl/gravity/models.py,sha256=rdY3Do4M1eRFO74gu3xy-bBn7tox3zM49wYbfnsIQWw,11159
73
- pytcl/gravity/spherical_harmonics.py,sha256=uZasz-w2K16sWT6xrNIPyTEP6MSlMQSe_BCWpXhRkWY,14722
74
- pytcl/gravity/tides.py,sha256=hef_BGewFGD7dJwg0t09Z6tfWLco_avATLuu66rnTpI,27733
75
- pytcl/magnetism/__init__.py,sha256=FNggjh99tEybKM2RxuX_EJlgu3U3CrREBadXOvRguGA,2549
76
- pytcl/magnetism/emm.py,sha256=5Jwl99wvdKYtx1-3LBB7x-w5KT-fqLiRg7uBW0Ai_Gw,22292
72
+ pytcl/gravity/clenshaw.py,sha256=k201ZPG-sOgCnLFP3Phe-N45V9bUYgiAOUyxyJSrGQA,15320
73
+ pytcl/gravity/egm.py,sha256=uFRXsDAv_emZRs5dizbNTnyeW1cKiPag6iwISrbW57k,18061
74
+ pytcl/gravity/models.py,sha256=Vws1dZPt0lqXnF12Y1PZ-YUd3onXMHI8TLxSJrapxxw,11145
75
+ pytcl/gravity/spherical_harmonics.py,sha256=Q7I1w3gAcDM7rhdBO_4dG0Pnx9hiUQF-n65nsqWw5Ds,14588
76
+ pytcl/gravity/tides.py,sha256=RpDM5hyKe7S3sjwgxQpnVK4bYIL38Rsgo9EslZMuHSU,27663
77
+ pytcl/magnetism/__init__.py,sha256=hE2BvberFSmimYuuwCYJ0g7ByxJAdj844vZJNkEotws,2502
78
+ pytcl/magnetism/emm.py,sha256=NHTuHLwuMOp3Tw0RoizTa-F00WCZxT2BGYseTCisfFc,22130
77
79
  pytcl/magnetism/igrf.py,sha256=3g0PsH8IdbwQQS28OR5XWD-g-QxvfUva7jOkKToxndQ,13384
78
- pytcl/magnetism/wmm.py,sha256=p0H7Eo02iB6nEMvGyvjsrAWOSKrIye6PGwQtNKfHaNw,15999
80
+ pytcl/magnetism/wmm.py,sha256=6LgYkis-PaNVmgRQvYyCkK-VZT_yzs4hSdCHymRLndM,15851
79
81
  pytcl/mathematical_functions/__init__.py,sha256=zeJ1ffRRl83k2NHn3HTn-fgtFoWNPq6LCALc3xRo4Do,3767
80
82
  pytcl/mathematical_functions/basic_matrix/__init__.py,sha256=kZv3kMAEHBdVxhbyMxTyM0s-4XJP1tK6po82UsIE4tc,1318
81
- pytcl/mathematical_functions/basic_matrix/decompositions.py,sha256=PWJsFDiXM2T78RHdxBJZPFnl8kFbNZQpHrbpw0mhE00,12268
83
+ pytcl/mathematical_functions/basic_matrix/decompositions.py,sha256=GB8l54uOFEZ1uNvARFrSu6ISvE1c7HueBCy6wk8rBTU,12238
82
84
  pytcl/mathematical_functions/basic_matrix/special_matrices.py,sha256=kOozwP2CHAj4qyO7Z9ct6GwDMkmHkk1bQa0e9G98FgA,13499
83
85
  pytcl/mathematical_functions/combinatorics/__init__.py,sha256=byuHI0WkxOkQF8egrfjEr-awB2visWDXlGMnDux5IBg,1043
84
- pytcl/mathematical_functions/combinatorics/combinatorics.py,sha256=3EgkWdBqQ9e6JU34bec9EeCEmB-46tUSXXTAJrckSO4,12314
86
+ pytcl/mathematical_functions/combinatorics/combinatorics.py,sha256=U4wd_eNKpZNHNp4-wJLGtQCgaogoUJrrXyJ6gBnD0ls,12300
85
87
  pytcl/mathematical_functions/continuous_optimization/__init__.py,sha256=lck60eeCUOsRpEzPHBY3kiLKwNz_fhmYoUGP3lTmTwk,55
86
88
  pytcl/mathematical_functions/geometry/__init__.py,sha256=DhCmux9-6zxYRzlhQ9du18kvUL-leiiZwdd3Cmb5WX0,1092
87
- pytcl/mathematical_functions/geometry/geometry.py,sha256=l63wQnhCtJwVHZOJeONX1qyJ5Sedji8etgxwJCFtH8Y,16403
88
- pytcl/mathematical_functions/interpolation/__init__.py,sha256=HDhP7ZsgUrXFBNJ_eCZEdp5gizWJ-BxvkQSCMnvBg3A,677
89
- pytcl/mathematical_functions/interpolation/interpolation.py,sha256=2cXMDgWBjWDGHnK1K_lawFlJL8oPl5AQGf9MNgsESfo,12610
89
+ pytcl/mathematical_functions/geometry/geometry.py,sha256=niwXZyXQCA8Z4nhlEERvmR0wkEmr9LNIhYwW_rDbil8,16327
90
+ pytcl/mathematical_functions/interpolation/__init__.py,sha256=lK4Rs0Ds_fzf9q0n6id5epdN0U8V7yD87dS-w1hvN8I,741
91
+ pytcl/mathematical_functions/interpolation/interpolation.py,sha256=el_kw87Q7qngHomg8ZHBPOuFFN8k3paBV6AanSHd_V4,12596
90
92
  pytcl/mathematical_functions/numerical_integration/__init__.py,sha256=iXiHzyV_KIhCv7tXErXlN1_fUEACN6yN3CYDHRA7esw,974
91
93
  pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=ZRMKs0vbcgFDe1Sr8sjyEOkALLmJU4zKRJjoPEcXrUc,15670
92
94
  pytcl/mathematical_functions/polynomials/__init__.py,sha256=WJWZcoQhnvy5f59-kncMTgD9mCtgwfDgULvDYYHS5ys,43
93
95
  pytcl/mathematical_functions/signal_processing/__init__.py,sha256=_SzzBVtxmSvP8FKeogRdNmFo8FOVDDoexVOqd-lE7do,2325
94
- pytcl/mathematical_functions/signal_processing/detection.py,sha256=9F0xdy3hMat1czSWAQYMExn0kY5DBRpyBneAfjjHUVI,30377
95
- pytcl/mathematical_functions/signal_processing/filters.py,sha256=8Ojf4h4rfiucBXqUmB1odvHH41Gf3rPwmWCMKb-qzWk,23435
96
- pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=AahJZRZk2IIXzRL7www0n8bc0XoKabaLOe8yYNSjuDY,22893
97
- pytcl/mathematical_functions/special_functions/__init__.py,sha256=qDPGfee1i1NkVi9LXJKnsWXL3CWHkPQINrkwqLqB8YU,3796
96
+ pytcl/mathematical_functions/signal_processing/detection.py,sha256=RvnSl1-VM6lX7jmVaV40hH1zdS2Hh3Zvm0FsSLHDpic,30305
97
+ pytcl/mathematical_functions/signal_processing/filters.py,sha256=ellpwrdKHp3wuKDQeRa8htE6rzq2Kwc0RVPuXTJj5rM,23375
98
+ pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=bwWXKizv4ok-C6D7gMR9GGCj9CakqVdRS7di_kHwLmk,22837
99
+ pytcl/mathematical_functions/special_functions/__init__.py,sha256=AJBCKj32daQxdahUQckW0bWowzOoapxni2eZnVXERdg,3859
98
100
  pytcl/mathematical_functions/special_functions/bessel.py,sha256=M0mwLQBaUXEHA8wyKReJ2D66I1v1XR7y-txAipd-WDs,14377
99
101
  pytcl/mathematical_functions/special_functions/debye.py,sha256=Nchjwkl1vzSL1L7nQpslb-lvT49LgTfdTIQMeSNn4vQ,6689
100
- pytcl/mathematical_functions/special_functions/elliptic.py,sha256=WyzBkrfZufIR5dUmCKGcxp6KNpVDrU89NGLDyRrZOqQ,7418
102
+ pytcl/mathematical_functions/special_functions/elliptic.py,sha256=vRMIcvOOywH8xd2zPTeo3cJ3ckOEimFGWRr5gV-0L_o,7412
101
103
  pytcl/mathematical_functions/special_functions/error_functions.py,sha256=a3SS8FYAMRv1KdCmebOZL95yjvVt9gZRF2XOjHvQ9M8,6253
102
- pytcl/mathematical_functions/special_functions/gamma_functions.py,sha256=xXN_9SCokH10HjE8PpaPKHYVK_RZRHRAbZgR2mZYIAA,10191
104
+ pytcl/mathematical_functions/special_functions/gamma_functions.py,sha256=vbXaZTsVZDpbAM6aVbLab6Cq0QHjuDeawWxKuXcv38w,10177
103
105
  pytcl/mathematical_functions/special_functions/hypergeometric.py,sha256=gKn_tXboEst7pVDiW15IbKFAANM4XVqKtDc1dmWL-2A,9768
104
- pytcl/mathematical_functions/special_functions/lambert_w.py,sha256=ivRc4KH5Lwoxb_yijrJEwG0ITa0hhcYF7_gCfVBBNW4,6855
106
+ pytcl/mathematical_functions/special_functions/lambert_w.py,sha256=FToYtwoI14H7kuO-it8a8jJbpMDjuTWcL3Ff3Eg5OxI,6825
105
107
  pytcl/mathematical_functions/special_functions/marcum_q.py,sha256=OZ5QjIB1e_XvRG8A-3dbZ13YXHtdk2EYVEPaqtgVr14,9580
106
108
  pytcl/mathematical_functions/statistics/__init__.py,sha256=dfypStgmnFmOrnWcm-3CEvLinONHraFgx9O66_37bqw,1278
107
- pytcl/mathematical_functions/statistics/distributions.py,sha256=icfFIIKCEFzkpFHuYGWL197nm8wvS7UPJlr9kd_uEgw,19373
108
- pytcl/mathematical_functions/statistics/estimators.py,sha256=TLnYXSwk5MzBakZrzDBupbOB3ONmJI7q1-oB2xuSVQM,10831
109
+ pytcl/mathematical_functions/statistics/distributions.py,sha256=djSEnCZtUmfi9JIVo5gGdPtUF6JiBYBlgfbm3nOVB7k,19205
110
+ pytcl/mathematical_functions/statistics/estimators.py,sha256=73wt5uUuE4gfpEzqpAk4yHeqWZCQpg9pFqj0Dutey7M,10817
109
111
  pytcl/mathematical_functions/transforms/__init__.py,sha256=SPXSKHjqR6B_8pvgtbtOnEiCpU-u0JF2s7hAlhb0BbI,2343
110
112
  pytcl/mathematical_functions/transforms/fourier.py,sha256=QH6OaTzw4kN6M-DuSmwB_5b-wu_4yP5I2CUmNEyLORM,20737
111
- pytcl/mathematical_functions/transforms/stft.py,sha256=zQapXl-v69_RDPwMqci83jah17GyAfnr3gx0budv2Cg,18619
112
- pytcl/mathematical_functions/transforms/wavelets.py,sha256=dm273Z_t13BlEVSlHTaGE7jR1ocugL7lEkcO499U7bY,21656
113
+ pytcl/mathematical_functions/transforms/stft.py,sha256=NoCPEsQPBDf2it-uH-FKFeMV9pnqhVNFjGHTVj0bv4s,18577
114
+ pytcl/mathematical_functions/transforms/wavelets.py,sha256=rL7AiWLNoHreCbCL0v0oy_M_RbqUjys7KgS5jCLCSZ0,21524
113
115
  pytcl/misc/__init__.py,sha256=SCHf_lQVfdl2gwUluHBiIloTF8HRH8EkgYfbNr7zOug,33
114
- pytcl/navigation/__init__.py,sha256=9tUhEgPVugA8nmZ9rvOaAntCd7rDPgW2RBLHqaDAXSc,5864
115
- pytcl/navigation/geodesy.py,sha256=M9XXfBTMCRdaWMV2-ViDSTEt94WZnMtxMeJQ1FAgQHY,17227
116
- pytcl/navigation/great_circle.py,sha256=TtlkWZbzr-HzSt4ultG_h137ZnX0pJZx_87kr3uvpjI,20923
117
- pytcl/navigation/ins.py,sha256=V3ZA4z8y5E6PBCd1FhifR5VaCU7DRAn2fb7W0LilByo,31168
118
- pytcl/navigation/ins_gnss.py,sha256=euKF5JGgwmVBsw3jBf7_wa2z1BpZeVbSNmBuwzhGS6c,30157
119
- pytcl/navigation/rhumb.py,sha256=lr1c3iEXfoOSfIyyXSRWv6He5TlaxEHbJy-dhqM1gRw,18224
116
+ pytcl/navigation/__init__.py,sha256=k1_x_FnnPrIzGeNu7zejPtPubIhweBgCfwqlZJEMw0I,6042
117
+ pytcl/navigation/geodesy.py,sha256=1zSzWJUwjRjj8cUzbaXze9nr_nSqm-NQmXiCoN8dwQ4,16961
118
+ pytcl/navigation/great_circle.py,sha256=ZJ3anzmkmO-qvCTjq3gJlVnAnDK-CSEibShrlVyTJMc,20859
119
+ pytcl/navigation/ins.py,sha256=ZavoBknLiWXCTWrlTyaGmkJgaggkSxUanwwACPzrrTg,31097
120
+ pytcl/navigation/ins_gnss.py,sha256=t0LzQ3G80aqyRdESA8RF6Dv3blae0zF_ZUyw-uT15hw,29963
121
+ pytcl/navigation/rhumb.py,sha256=AJ9WfIh2OKw1ppZHAvRyfI6nkBrs3hQrYj6A1Cj7ZPg,18150
120
122
  pytcl/performance_evaluation/__init__.py,sha256=tM2pnBfDb2XbnLt4Y5MQ6w6XBwFy_5bf_y0toZmxx88,1859
121
123
  pytcl/performance_evaluation/estimation_metrics.py,sha256=X1ZCpp8m6DV14N2wbMvlRwfORRKga8DgKmG3dROyJqA,12351
122
- pytcl/performance_evaluation/track_metrics.py,sha256=Nd3royJkAelZV-Qggl8i72e7WocCxWomgliArvVAEkc,13342
124
+ pytcl/performance_evaluation/track_metrics.py,sha256=UuGapygdhHP22xkp-ep7k6icJgL3g0yazP5VIpe1e_8,13328
123
125
  pytcl/physical_values/__init__.py,sha256=SGbg6b0d4dWebE3baW4OlJshL00grG5E4wABw6jxl20,44
124
126
  pytcl/plotting/__init__.py,sha256=YtYnKYHL5lN6EaT_bwwR3h89NW0HSMToIWHhHBxcidY,3126
125
- pytcl/plotting/coordinates.py,sha256=h39H855Qjqtcly62m09demaOFpfMs_8EF_nXhoLBSBs,17198
127
+ pytcl/plotting/coordinates.py,sha256=KFMUEkrTk5yJ6ZVH7gLaWD9-YQHoGdHzJnO8jgJVYxE,17002
126
128
  pytcl/plotting/ellipses.py,sha256=bcns6dfNK4bwA_QBshscYhbAz_5wegwyqjDzzoUdWsQ,12465
127
- pytcl/plotting/metrics.py,sha256=zbJr5P2kQg7-rGpGHsN7rC02S0JLOpPUZeoscQem7uQ,18148
128
- pytcl/plotting/tracks.py,sha256=cqZG71ZHM-wDSzjH4I4kCESORIiZjmGesQtADmAi4gc,23034
129
+ pytcl/plotting/metrics.py,sha256=B-PTVPuZ2Rl8EtV53he8O1iYw6nWuw_gQ-qUUIX4V5Y,18050
130
+ pytcl/plotting/tracks.py,sha256=FsDpaWPsD5FCed6zUy_Kzhln4DEyfr7Kle_BfeDOrl8,22894
129
131
  pytcl/scheduling/__init__.py,sha256=jTqMSKcsCrWU_Fh6WaT6BW5WatNHyyEYjFbsv6X18Oc,39
130
132
  pytcl/static_estimation/__init__.py,sha256=sSEhqq35jq_MpRLnBtWjKXwGZ9dqIw71iwji-TNwXmc,2222
131
- pytcl/static_estimation/least_squares.py,sha256=8ouOyRGC7K-W8fynZMWlc2-KAFojvTbuzcqi5uS_sVA,13432
132
- pytcl/static_estimation/maximum_likelihood.py,sha256=P6BKMcuzzDu_Qc6mX9KLI-zPWFX_NabbA6AKYjkNBcY,21581
133
+ pytcl/static_estimation/least_squares.py,sha256=tZ10srMCvCWw1RwjJD6xtLxiN5XP7LIjOiBwJRf5v8M,13420
134
+ pytcl/static_estimation/maximum_likelihood.py,sha256=Y5kmef55FDIAEVY-Gc2eO7PUipcJGLhtGNEALTEtyh8,21581
133
135
  pytcl/static_estimation/robust.py,sha256=egBLKWmo6d9PzP6LDh0J7ee4j6hYZh8kAb9TR5uC2so,18527
134
136
  pytcl/terrain/__init__.py,sha256=e7plNQI5Y_jpZ24r82AgqdX0ChmmyYoeT7HReclnGXc,3228
135
- pytcl/terrain/dem.py,sha256=rg2o0h0ZDrfxvtYhnE2A5tdzRnCmqcihu4w1uNJdH3Y,20814
136
- pytcl/terrain/loaders.py,sha256=KBs1vdYUYW-0ETIujRv4-WxO-bExZk-FvPLY5l6gyTc,27028
137
- pytcl/terrain/visibility.py,sha256=nIJr9AVk7C8GCpJV4UDvUjhmAieycWD8BLepAMUBMIQ,22739
138
- pytcl/trackers/__init__.py,sha256=8-KpFtxS0n83B-dq4x0X4V1TQGHZnNSzdujAJUGcjxc,1198
139
- pytcl/trackers/hypothesis.py,sha256=RApWfji-f0-a68KnAJela0BvPdIlOY_FV_cYJFmVUoE,17353
140
- pytcl/trackers/mht.py,sha256=7mwhMmja3ri2wnx7W1wueDGn2r3ArwAxJDPUJ7IZAkQ,20617
141
- pytcl/trackers/multi_target.py,sha256=7ZL8V25TO_rEMtQm2eYkScesDQHC9qXZVHLHyVbxy3M,10529
137
+ pytcl/terrain/dem.py,sha256=1cOmjhKTr0isYXOw2O12YbjVq2MN0lns9-Sdza_lep4,20726
138
+ pytcl/terrain/loaders.py,sha256=1vbzd1F709QH3okjNhkaP9Hg0TUAUulwbgV-twONA5E,26946
139
+ pytcl/terrain/visibility.py,sha256=Ko5r7JnliIwraVKQLxBCALhdiejtXXVyC0iBILGvLH0,22701
140
+ pytcl/trackers/__init__.py,sha256=Gw79xlSIUzdPV8bN1slNWUlGxE3d-NsVmbMygkYVV20,1151
141
+ pytcl/trackers/hypothesis.py,sha256=Q50LcD63rGDv4RwEpbamw4Y2nOXBsZTlVCCkV34ZU4I,17287
142
+ pytcl/trackers/mht.py,sha256=kMomduNVkKbXoBEQmuLkX0xOMb8U52z2o1ezOmzqEpU,20489
143
+ pytcl/trackers/multi_target.py,sha256=hvt89ERhMwpcHcIJeKHnkQSKdE3_LoRiX-gbaGoo300,10516
142
144
  pytcl/trackers/single_target.py,sha256=Yy3FwaNTArMWcaod-0HVeiioNV4xLWxNDn_7ZPVqQYs,6562
143
145
  pytcl/transponders/__init__.py,sha256=5fL4u3lKCYgPLo5uFeuZbtRZkJPABntuKYGUvVgMMEI,41
144
- nrl_tracker-0.21.5.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
145
- nrl_tracker-0.21.5.dist-info/METADATA,sha256=cMioKijVBvSHMU9IA_0-PDxC-NTQU9A6O9-LxwaOBJ4,10005
146
- nrl_tracker-0.21.5.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
147
- nrl_tracker-0.21.5.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
148
- nrl_tracker-0.21.5.dist-info/RECORD,,
146
+ nrl_tracker-0.22.1.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
147
+ nrl_tracker-0.22.1.dist-info/METADATA,sha256=4UimB2u7UoSjr0iALLcGEOWOYSVKgVX-QCJFDCDg1nc,10005
148
+ nrl_tracker-0.22.1.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
149
+ nrl_tracker-0.22.1.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
150
+ nrl_tracker-0.22.1.dist-info/RECORD,,
pytcl/__init__.py CHANGED
@@ -20,7 +20,7 @@ References
20
20
  no. 5, pp. 18-27, May 2017.
21
21
  """
22
22
 
23
- __version__ = "0.21.5"
23
+ __version__ = "0.22.1"
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):
@@ -19,9 +19,9 @@ def _mahalanobis_distance_2d(
19
19
  S_inv: np.ndarray,
20
20
  ) -> float:
21
21
  """JIT-compiled Mahalanobis distance for 2D innovations."""
22
- return innovation[0] * (
23
- S_inv[0, 0] * innovation[0] + S_inv[0, 1] * innovation[1]
24
- ) + innovation[1] * (S_inv[1, 0] * innovation[0] + S_inv[1, 1] * innovation[1])
22
+ return innovation[0] * (S_inv[0, 0] * innovation[0] + S_inv[0, 1] * innovation[1]) + innovation[
23
+ 1
24
+ ] * (S_inv[1, 0] * innovation[0] + S_inv[1, 1] * innovation[1])
25
25
 
26
26
 
27
27
  @njit(cache=True, fastmath=True)
@@ -94,9 +94,7 @@ def compute_measurement_likelihood(
94
94
  return 0.0
95
95
 
96
96
  mahal_sq = innovation @ np.linalg.solve(innovation_cov, innovation)
97
- likelihood = (
98
- detection_prob * np.exp(-0.5 * mahal_sq) / np.sqrt((2 * np.pi) ** m * det_S)
99
- )
97
+ likelihood = detection_prob * np.exp(-0.5 * mahal_sq) / np.sqrt((2 * np.pi) ** m * det_S)
100
98
 
101
99
  return likelihood
102
100
 
@@ -210,9 +208,7 @@ def jpda_probabilities(
210
208
  if n_tracks <= 5 and n_meas <= 5:
211
209
  beta = _jpda_exact(likelihood_matrix, gated, detection_prob, clutter_density)
212
210
  else:
213
- beta = _jpda_approximate(
214
- likelihood_matrix, gated, detection_prob, clutter_density
215
- )
211
+ beta = _jpda_approximate(likelihood_matrix, gated, detection_prob, clutter_density)
216
212
 
217
213
  return beta
218
214
 
@@ -258,9 +254,7 @@ def _jpda_exact(
258
254
  if gated[track_idx, meas_idx] and track_idx not in used_tracks:
259
255
  current_assignment.append(track_idx)
260
256
  used_tracks.add(track_idx)
261
- yield from generate_hypotheses(
262
- meas_idx + 1, current_assignment, used_tracks
263
- )
257
+ yield from generate_hypotheses(meas_idx + 1, current_assignment, used_tracks)
264
258
  used_tracks.remove(track_idx)
265
259
  current_assignment.pop()
266
260
 
@@ -298,9 +292,7 @@ def _jpda_exact(
298
292
  hypothesis_probs = [p / total_prob for p in hypothesis_probs]
299
293
 
300
294
  # Compute marginal association probabilities
301
- for h_idx, (assignment, prob) in enumerate(
302
- zip(hypothesis_assignments, hypothesis_probs)
303
- ):
295
+ for h_idx, (assignment, prob) in enumerate(zip(hypothesis_assignments, hypothesis_probs)):
304
296
  detected_tracks = set()
305
297
  for j, track_idx in enumerate(assignment):
306
298
  if track_idx >= 0:
@@ -335,9 +335,7 @@ def _partition_solution(
335
335
 
336
336
  for i in range(start_idx, n_assigned):
337
337
  # Require assignments 0..i-1, forbid assignment i
338
- new_required = required + [
339
- (row_ind[j], col_ind[j]) for j in range(start_idx, i)
340
- ]
338
+ new_required = required + [(row_ind[j], col_ind[j]) for j in range(start_idx, i)]
341
339
  new_forbidden = forbidden + [(row_ind[i], col_ind[i])]
342
340
 
343
341
  # Solve constrained problem
@@ -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,
@@ -83,8 +99,25 @@ from pytcl.astronomical.reference_frames import ( # Time utilities; Precession;
83
99
  sidereal_rotation_matrix,
84
100
  true_obliquity,
85
101
  )
86
- from pytcl.astronomical.time_systems import ( # Julian dates; Time scales; Unix time; GPS week; Sidereal time; Leap seconds; Constants
87
- JD_GPS_EPOCH,
102
+ from pytcl.astronomical.relativity import (
103
+ C_LIGHT, # Physical constants; Schwarzschild metric; Time dilation; Shapiro delay; Precession; PN effects; Range corrections
104
+ )
105
+ from pytcl.astronomical.relativity import (
106
+ G_GRAV,
107
+ geodetic_precession,
108
+ gravitational_time_dilation,
109
+ lense_thirring_precession,
110
+ post_newtonian_acceleration,
111
+ proper_time_rate,
112
+ relativistic_range_correction,
113
+ schwarzschild_precession_per_orbit,
114
+ schwarzschild_radius,
115
+ shapiro_delay,
116
+ )
117
+ from pytcl.astronomical.time_systems import (
118
+ JD_GPS_EPOCH, # Julian dates; Time scales; Unix time; GPS week; Sidereal time; Leap seconds; Constants
119
+ )
120
+ from pytcl.astronomical.time_systems import (
88
121
  JD_J2000,
89
122
  JD_UNIX_EPOCH,
90
123
  MJD_OFFSET,
@@ -218,4 +251,24 @@ __all__ = [
218
251
  # Reference frames - Ecliptic/equatorial
219
252
  "ecliptic_to_equatorial",
220
253
  "equatorial_to_ecliptic",
254
+ # Ephemerides - Classes
255
+ "DEEphemeris",
256
+ # Ephemerides - Functions
257
+ "sun_position",
258
+ "moon_position",
259
+ "planet_position",
260
+ "barycenter_position",
261
+ # Relativity - Constants
262
+ "C_LIGHT",
263
+ "G_GRAV",
264
+ # Relativity - Functions
265
+ "schwarzschild_radius",
266
+ "gravitational_time_dilation",
267
+ "proper_time_rate",
268
+ "shapiro_delay",
269
+ "schwarzschild_precession_per_orbit",
270
+ "post_newtonian_acceleration",
271
+ "geodetic_precession",
272
+ "lense_thirring_precession",
273
+ "relativistic_range_correction",
221
274
  ]