nrl-tracker 1.8.0__py3-none-any.whl → 1.9.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.
- {nrl_tracker-1.8.0.dist-info → nrl_tracker-1.9.1.dist-info}/METADATA +2 -2
- {nrl_tracker-1.8.0.dist-info → nrl_tracker-1.9.1.dist-info}/RECORD +32 -28
- pytcl/__init__.py +3 -3
- pytcl/assignment_algorithms/dijkstra_min_cost.py +0 -1
- pytcl/assignment_algorithms/network_simplex.py +0 -2
- pytcl/astronomical/ephemerides.py +8 -4
- pytcl/astronomical/relativity.py +20 -0
- pytcl/containers/__init__.py +19 -8
- pytcl/containers/base.py +82 -9
- pytcl/containers/covertree.py +14 -21
- pytcl/containers/kd_tree.py +18 -45
- pytcl/containers/rtree.py +43 -4
- pytcl/containers/vptree.py +14 -21
- pytcl/core/__init__.py +59 -2
- pytcl/core/constants.py +59 -0
- pytcl/core/exceptions.py +865 -0
- pytcl/core/optional_deps.py +531 -0
- pytcl/core/validation.py +4 -6
- pytcl/dynamic_estimation/kalman/matrix_utils.py +427 -0
- pytcl/dynamic_estimation/kalman/square_root.py +20 -213
- pytcl/dynamic_estimation/kalman/sr_ukf.py +5 -5
- pytcl/dynamic_estimation/kalman/types.py +98 -0
- pytcl/mathematical_functions/signal_processing/detection.py +19 -0
- pytcl/mathematical_functions/transforms/wavelets.py +7 -6
- pytcl/plotting/coordinates.py +25 -27
- pytcl/plotting/ellipses.py +14 -16
- pytcl/plotting/metrics.py +7 -5
- pytcl/plotting/tracks.py +8 -7
- pytcl/terrain/loaders.py +10 -6
- {nrl_tracker-1.8.0.dist-info → nrl_tracker-1.9.1.dist-info}/LICENSE +0 -0
- {nrl_tracker-1.8.0.dist-info → nrl_tracker-1.9.1.dist-info}/WHEEL +0 -0
- {nrl_tracker-1.8.0.dist-info → nrl_tracker-1.9.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: 1.
|
|
3
|
+
Version: 1.9.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
|
|
@@ -63,7 +63,7 @@ Requires-Dist: plotly>=5.15.0; extra == "visualization"
|
|
|
63
63
|
|
|
64
64
|
# Tracker Component Library (Python)
|
|
65
65
|
|
|
66
|
-
[](https://pypi.org/project/nrl-tracker/)
|
|
67
67
|
[](https://www.python.org/downloads/)
|
|
68
68
|
[](https://en.wikipedia.org/wiki/Public_domain)
|
|
69
69
|
[](https://github.com/psf/black)
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
pytcl/__init__.py,sha256=
|
|
1
|
+
pytcl/__init__.py,sha256=9dJwbOB9i-NLj_XEO6d0V6mq9jAl7dlgoNPL9NMR78s,2030
|
|
2
2
|
pytcl/logging_config.py,sha256=UJaYufQgNuIjpsOMTPo3ewz1XCHPk8a08jTHyP7uoI4,8956
|
|
3
3
|
pytcl/assignment_algorithms/__init__.py,sha256=kUWhmyLhZcs5GiUQA5_v7KA3qETGsvqV6wU8r7paO-k,2976
|
|
4
4
|
pytcl/assignment_algorithms/data_association.py,sha256=tsRxWJZk9aAPmE99BKXGouEpFfZrjPjb4HXvgxFUHhU,11405
|
|
5
|
-
pytcl/assignment_algorithms/dijkstra_min_cost.py,sha256=
|
|
5
|
+
pytcl/assignment_algorithms/dijkstra_min_cost.py,sha256=z-Wk1HXRNKieBsRFqR8_UB8QvG5QkK3evazr8wzTpl0,5429
|
|
6
6
|
pytcl/assignment_algorithms/gating.py,sha256=AXWn-F_EOGI6qrBc4PN5eFM-ZZGu1WOMi5b5ZsxValU,10910
|
|
7
7
|
pytcl/assignment_algorithms/jpda.py,sha256=8-HoO2VygxJ8FFSCCOIOfbhMAn87jU7PqVvd7lQ3GEY,19797
|
|
8
8
|
pytcl/assignment_algorithms/nd_assignment.py,sha256=RBRoXoJnUY0lB9Vb_dwvQtwh6oI31KfeDqpaNrTNXzk,11344
|
|
9
9
|
pytcl/assignment_algorithms/network_flow.py,sha256=yxEtoNe0-paXgNmeH2e3qcdRr_8ZvAg2L62QtqZZKMI,13221
|
|
10
|
-
pytcl/assignment_algorithms/network_simplex.py,sha256=
|
|
10
|
+
pytcl/assignment_algorithms/network_simplex.py,sha256=Qi10PsIYcTc6MZ-9GPl6ivaLaGA9F5-B7ltBbmasRNM,5566
|
|
11
11
|
pytcl/assignment_algorithms/three_dimensional/__init__.py,sha256=1Q40OUlUQoo7YKEucwdrSNo3D4A0Zibvkr8z4TpueBg,526
|
|
12
12
|
pytcl/assignment_algorithms/three_dimensional/assignment.py,sha256=OGcjg3Yr1tYriWYBJ5k6jiRMpOHDISK8FJDY0nTQxxw,19244
|
|
13
13
|
pytcl/assignment_algorithms/two_dimensional/__init__.py,sha256=4Evsn__9hTfI2i8m8Ngl-Zy0Fa2OydKmDKlZlH6jaao,778
|
|
14
14
|
pytcl/assignment_algorithms/two_dimensional/assignment.py,sha256=eh87MBb-uiUSI1MXj4HrreRKB6Z8rxAyDkNQ8-u4SbM,11848
|
|
15
15
|
pytcl/assignment_algorithms/two_dimensional/kbest.py,sha256=yiTToLuP7xWxQlQ8E-fpgXg-5iu0nnXcJXStjUB0nOE,17284
|
|
16
16
|
pytcl/astronomical/__init__.py,sha256=v0nUgEy5ReHXzpNb1JdwWXv4AtcFksotEOccQnOyVfI,9667
|
|
17
|
-
pytcl/astronomical/ephemerides.py,sha256=
|
|
17
|
+
pytcl/astronomical/ephemerides.py,sha256=dJNq2Z_qmgM4rpFbH2zZl5kXWtvPjwPLGkP_eDUF7KA,16859
|
|
18
18
|
pytcl/astronomical/lambert.py,sha256=Lc8FT1JmpI9WSXsG2s5vIRkSoBSV7r5hd3o2bGh2Ojo,15607
|
|
19
19
|
pytcl/astronomical/orbital_mechanics.py,sha256=8GssRanwTowCl6PJYqmB_SDnNznLUq5gkPa3j6iEo3U,19965
|
|
20
20
|
pytcl/astronomical/reference_frames.py,sha256=MBqprzBpEvdq3ngRL-_pp-Vnj7AqbuXhjUfGQ98znfc,35616
|
|
21
|
-
pytcl/astronomical/relativity.py,sha256=
|
|
21
|
+
pytcl/astronomical/relativity.py,sha256=vSay4am_ElkiGRwuu_4rwo5C10eN8hm86jy43xmaEt4,15933
|
|
22
22
|
pytcl/astronomical/sgp4.py,sha256=iNZrqMRUzR-LFeZiluzlNmkwxeYbIyF2F1cygyeEZVE,21546
|
|
23
23
|
pytcl/astronomical/special_orbits.py,sha256=N54c_wAD7XKk_diDOw2QjUSkmYECMyWQDq2P6EeEBEI,12745
|
|
24
24
|
pytcl/astronomical/time_systems.py,sha256=Jg0Zaq60hc4Ts1aQtb5bK4KSZhz-uQse8gYC89Y0-TA,15243
|
|
@@ -32,15 +32,15 @@ pytcl/clustering/dbscan.py,sha256=WgzYz_f5nDh0T1RPClX9b3xSvFPmLxY6QaI2NCtxJg4,73
|
|
|
32
32
|
pytcl/clustering/gaussian_mixture.py,sha256=UAI2_WG2RASA0N2PIZ0EZgqYZ3yly7oJBSJWSJnm_bE,22904
|
|
33
33
|
pytcl/clustering/hierarchical.py,sha256=K7z6bZR4QSDMva9kaqEOjdktl8unMK1wyCJm3cFN8pQ,14292
|
|
34
34
|
pytcl/clustering/kmeans.py,sha256=GNvgaGP53LKr4-fh-UajxbjCi0jWCCLJba23EGcQq4I,10712
|
|
35
|
-
pytcl/containers/__init__.py,sha256=
|
|
36
|
-
pytcl/containers/base.py,sha256=
|
|
35
|
+
pytcl/containers/__init__.py,sha256=i-o_KDjhbPWc9yAlgN1R5igmyWK3CVKIB-V7Qnr-fLg,2746
|
|
36
|
+
pytcl/containers/base.py,sha256=oKD8vAH09qAEOG3uhtoTgJ9UU_hQhl6keSIlGEVucrs,7762
|
|
37
37
|
pytcl/containers/cluster_set.py,sha256=uhfOIpXlYoI1U75TWcLMHjezVavnIZhVEGQHKCDmKo4,22774
|
|
38
|
-
pytcl/containers/covertree.py,sha256=
|
|
39
|
-
pytcl/containers/kd_tree.py,sha256=
|
|
38
|
+
pytcl/containers/covertree.py,sha256=oA09TAZYdxJbfkOUxAmXxqDn-l2XoQeUsnupjTF0Vo0,13245
|
|
39
|
+
pytcl/containers/kd_tree.py,sha256=01CsFsSmiKb0PGjdQ3z1apmvqjT2T8t-1bLwXzyJu3c,18016
|
|
40
40
|
pytcl/containers/measurement_set.py,sha256=87AbdoZIUspn1yJsiMpyQ5LoEVcerUnXefXGGPtFTJg,12654
|
|
41
|
-
pytcl/containers/rtree.py,sha256=
|
|
41
|
+
pytcl/containers/rtree.py,sha256=UquqVLZ-Frt6Z7OphI4XFAZqWws6v5oJCIJ6_gLfZ_s,22870
|
|
42
42
|
pytcl/containers/track_list.py,sha256=6q9Qgcwm-8H_JqtOCsMssF27av4XaSkhfDl-MWb1ABc,12520
|
|
43
|
-
pytcl/containers/vptree.py,sha256
|
|
43
|
+
pytcl/containers/vptree.py,sha256=-7znAilGCNpN7SN8TxVhNFIOyP-s9oJa9Vp4FJWehcg,8720
|
|
44
44
|
pytcl/coordinate_systems/__init__.py,sha256=jwYhu_-9AvOeP9WLG9PYtyDwfe0GjxNZ9-xCqiLymW4,3909
|
|
45
45
|
pytcl/coordinate_systems/conversions/__init__.py,sha256=PkNevB78vBw0BkalydJBbQO91AyiMJxKRrgJNt4HsYc,1100
|
|
46
46
|
pytcl/coordinate_systems/conversions/geodetic.py,sha256=rRRf4MWBkGj3VTN1WRW3lrlw4Yf9a4HH3UCgNOGjbJ0,23460
|
|
@@ -51,10 +51,12 @@ pytcl/coordinate_systems/projections/__init__.py,sha256=TmBiffO5cmazAhsfPIVBaaqn
|
|
|
51
51
|
pytcl/coordinate_systems/projections/projections.py,sha256=y_kwcu_zp0HHiKR-wp3v3AvRcY61bleDi1SxwbrnWB0,33179
|
|
52
52
|
pytcl/coordinate_systems/rotations/__init__.py,sha256=nqAz4iJd2hEOX_r7Tz4cE524sShyxdbtcQ5m56RrDLg,1047
|
|
53
53
|
pytcl/coordinate_systems/rotations/rotations.py,sha256=2KK6Lgpfmjac3qfOMvHku_BcwGOgkRC13BZbSCUvfwQ,18314
|
|
54
|
-
pytcl/core/__init__.py,sha256=
|
|
54
|
+
pytcl/core/__init__.py,sha256=RNsMJw_rydDqNaoxHunANCooxtdc_lclVVfsy7EIK1U,2854
|
|
55
55
|
pytcl/core/array_utils.py,sha256=SsgEiAoRCWxAVKq1aa5-nPdOi-2AB6XNObu0IaGClUk,13983
|
|
56
|
-
pytcl/core/constants.py,sha256=
|
|
57
|
-
pytcl/core/
|
|
56
|
+
pytcl/core/constants.py,sha256=cwkCjzCU7zG2ZsFcbqwslN632v7Lw50L85s-5q892mo,9988
|
|
57
|
+
pytcl/core/exceptions.py,sha256=6ImMiwL86BdmTt-Rc8fXLXxKUGQ-PcQQyxIvKKzw-n0,24324
|
|
58
|
+
pytcl/core/optional_deps.py,sha256=Xe7BG18SWsmzBD3zGa440U_QWKkfATBKhUfLOxhXZuU,15799
|
|
59
|
+
pytcl/core/validation.py,sha256=4ay21cZVAil8udymwej7QnVQfNyjzi_5A8O1y-d-Lyw,23492
|
|
58
60
|
pytcl/dynamic_estimation/__init__.py,sha256=zxmkZIXVfHPv5AHYpQV5nwsI0PA3m-Vw7W0gkJE7j98,5191
|
|
59
61
|
pytcl/dynamic_estimation/gaussian_sum_filter.py,sha256=rxUy_WapTL_pkGimD01DqYE7fElLS_DljnX2yg95Uts,13620
|
|
60
62
|
pytcl/dynamic_estimation/imm.py,sha256=RLSFPTMDsudxSf9Mh6Q5qD852tq9lRoCTvFCGphezhs,22152
|
|
@@ -67,8 +69,10 @@ pytcl/dynamic_estimation/kalman/constrained.py,sha256=Zidzz6_9OvwUyQppEltdmYTMvE
|
|
|
67
69
|
pytcl/dynamic_estimation/kalman/extended.py,sha256=fxi2-oq8qxnxZqPmjB8-Am03z6_F_R90wwFcOIEk_dg,10459
|
|
68
70
|
pytcl/dynamic_estimation/kalman/h_infinity.py,sha256=rtbYiryJbxzko-CIdNJSHuWXU2wI9T52YGBYq3o92sE,16563
|
|
69
71
|
pytcl/dynamic_estimation/kalman/linear.py,sha256=1Zgg9gZya0Vxs9im7sPUqLj0Luo463vS-RSa6GCReFI,12248
|
|
70
|
-
pytcl/dynamic_estimation/kalman/
|
|
71
|
-
pytcl/dynamic_estimation/kalman/
|
|
72
|
+
pytcl/dynamic_estimation/kalman/matrix_utils.py,sha256=couRVm0VKbhj9ctHcI-wcq8rj2MOapaSRVGuVdze3fQ,12426
|
|
73
|
+
pytcl/dynamic_estimation/kalman/square_root.py,sha256=RlDepNt7eJ1qbQkZElqfhcX2oJET09P9Q_P8Bv7LcJo,8199
|
|
74
|
+
pytcl/dynamic_estimation/kalman/sr_ukf.py,sha256=Vys5uC58HSZSTLc9xfmWCjw_XnZZfD4MpFBXBX0OVzU,8912
|
|
75
|
+
pytcl/dynamic_estimation/kalman/types.py,sha256=5sMEWAvd9kkE3EG9daYcG8uV70MBx_awC5u6KJkmiZw,2202
|
|
72
76
|
pytcl/dynamic_estimation/kalman/ud_filter.py,sha256=j56gw-piKJaMtoHWRkr2MiBjOC9tGSguIgFregOMJOs,10269
|
|
73
77
|
pytcl/dynamic_estimation/kalman/unscented.py,sha256=G3Ks6fa_Z-MxUdOEiiHqQ1wYJzOgfuipiP32at6Mv8o,15505
|
|
74
78
|
pytcl/dynamic_estimation/measurement_update/__init__.py,sha256=8rlyJwVpxf0fZj-AFo1hlewvryZRhUzcy3F8uMe6I8c,48
|
|
@@ -110,7 +114,7 @@ pytcl/mathematical_functions/numerical_integration/__init__.py,sha256=iXiHzyV_KI
|
|
|
110
114
|
pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=3MwNCjdMfopgtJjXWxn-q9VyawI1IArkNBXqa_kRMj4,15716
|
|
111
115
|
pytcl/mathematical_functions/polynomials/__init__.py,sha256=WJWZcoQhnvy5f59-kncMTgD9mCtgwfDgULvDYYHS5ys,43
|
|
112
116
|
pytcl/mathematical_functions/signal_processing/__init__.py,sha256=_SzzBVtxmSvP8FKeogRdNmFo8FOVDDoexVOqd-lE7do,2325
|
|
113
|
-
pytcl/mathematical_functions/signal_processing/detection.py,sha256=
|
|
117
|
+
pytcl/mathematical_functions/signal_processing/detection.py,sha256=vLToMHdPkhom6ouo1oN0QqBYjEGv7SQENqTD0DOv1XY,30934
|
|
114
118
|
pytcl/mathematical_functions/signal_processing/filters.py,sha256=xiB8VSFqTFkBCAom0yIWw7pK3Zjm6l-VZ_DAtwJMxFA,23676
|
|
115
119
|
pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=El7XcUbunmXA7s-btXX_R4fgNx8d6QNa86GJETg4zAQ,23134
|
|
116
120
|
pytcl/mathematical_functions/special_functions/__init__.py,sha256=AJBCKj32daQxdahUQckW0bWowzOoapxni2eZnVXERdg,3859
|
|
@@ -128,7 +132,7 @@ pytcl/mathematical_functions/statistics/estimators.py,sha256=TLnYXSwk5MzBakZrzDB
|
|
|
128
132
|
pytcl/mathematical_functions/transforms/__init__.py,sha256=SPXSKHjqR6B_8pvgtbtOnEiCpU-u0JF2s7hAlhb0BbI,2343
|
|
129
133
|
pytcl/mathematical_functions/transforms/fourier.py,sha256=yD1CcH7sdPlrOmBgL7JoMiPNgN8ee7bTwvblgRRf7l4,20823
|
|
130
134
|
pytcl/mathematical_functions/transforms/stft.py,sha256=olDzNH02Nta5GoeEdsdX1tTVKODr6OxLEYt_h3ZtMgA,18878
|
|
131
|
-
pytcl/mathematical_functions/transforms/wavelets.py,sha256=
|
|
135
|
+
pytcl/mathematical_functions/transforms/wavelets.py,sha256=lR71JX5vX_OXl1g9H89OGiimM_oqfU-WfGYJF3uD2z8,21887
|
|
132
136
|
pytcl/misc/__init__.py,sha256=SCHf_lQVfdl2gwUluHBiIloTF8HRH8EkgYfbNr7zOug,33
|
|
133
137
|
pytcl/navigation/__init__.py,sha256=k1_x_FnnPrIzGeNu7zejPtPubIhweBgCfwqlZJEMw0I,6042
|
|
134
138
|
pytcl/navigation/geodesy.py,sha256=zrpFhPFLr3N1byeE1pxXh-SmPixjuuoGK3_izEnAAdw,19719
|
|
@@ -141,10 +145,10 @@ pytcl/performance_evaluation/estimation_metrics.py,sha256=X1ZCpp8m6DV14N2wbMvlRw
|
|
|
141
145
|
pytcl/performance_evaluation/track_metrics.py,sha256=Nd3royJkAelZV-Qggl8i72e7WocCxWomgliArvVAEkc,13342
|
|
142
146
|
pytcl/physical_values/__init__.py,sha256=SGbg6b0d4dWebE3baW4OlJshL00grG5E4wABw6jxl20,44
|
|
143
147
|
pytcl/plotting/__init__.py,sha256=YtYnKYHL5lN6EaT_bwwR3h89NW0HSMToIWHhHBxcidY,3126
|
|
144
|
-
pytcl/plotting/coordinates.py,sha256=
|
|
145
|
-
pytcl/plotting/ellipses.py,sha256=
|
|
146
|
-
pytcl/plotting/metrics.py,sha256=
|
|
147
|
-
pytcl/plotting/tracks.py,sha256=
|
|
148
|
+
pytcl/plotting/coordinates.py,sha256=kk1UO5aRPCUt206QS4COgtaExZI1Mjhi4P6falQCQLI,17247
|
|
149
|
+
pytcl/plotting/ellipses.py,sha256=f4W5fZvunnIsgE_kvLxXo0CG5yoYW5qdczLJxaEHyZ8,12436
|
|
150
|
+
pytcl/plotting/metrics.py,sha256=gwha1JKn8LGx66LVqugP_4-RHQ0xvaANqsiDRN3WQ6s,18269
|
|
151
|
+
pytcl/plotting/tracks.py,sha256=RoQyjpMcPm16mQqj4RvDOzPgD6UpHCOid6hxAN3kGC0,23174
|
|
148
152
|
pytcl/scheduling/__init__.py,sha256=jTqMSKcsCrWU_Fh6WaT6BW5WatNHyyEYjFbsv6X18Oc,39
|
|
149
153
|
pytcl/static_estimation/__init__.py,sha256=sSEhqq35jq_MpRLnBtWjKXwGZ9dqIw71iwji-TNwXmc,2222
|
|
150
154
|
pytcl/static_estimation/least_squares.py,sha256=8ouOyRGC7K-W8fynZMWlc2-KAFojvTbuzcqi5uS_sVA,13432
|
|
@@ -152,7 +156,7 @@ pytcl/static_estimation/maximum_likelihood.py,sha256=nt1WShfZ0PlT_eA4gu2WcLiz9zZ
|
|
|
152
156
|
pytcl/static_estimation/robust.py,sha256=mpDUcc3-8F42SVGxXMv20huzekoGWattAa4px9tAZNM,18623
|
|
153
157
|
pytcl/terrain/__init__.py,sha256=e7plNQI5Y_jpZ24r82AgqdX0ChmmyYoeT7HReclnGXc,3228
|
|
154
158
|
pytcl/terrain/dem.py,sha256=rg2o0h0ZDrfxvtYhnE2A5tdzRnCmqcihu4w1uNJdH3Y,20814
|
|
155
|
-
pytcl/terrain/loaders.py,sha256=
|
|
159
|
+
pytcl/terrain/loaders.py,sha256=3BbeFTaZ0I5bOlRFUcnP2eGQn-JyR2QDaUbIorDWdsg,27220
|
|
156
160
|
pytcl/terrain/visibility.py,sha256=nIJr9AVk7C8GCpJV4UDvUjhmAieycWD8BLepAMUBMIQ,22739
|
|
157
161
|
pytcl/trackers/__init__.py,sha256=Gw79xlSIUzdPV8bN1slNWUlGxE3d-NsVmbMygkYVV20,1151
|
|
158
162
|
pytcl/trackers/hypothesis.py,sha256=ubK-q89cYayahSHIw5sVYD1fpRUEB0XvC6rQnI1WACA,17361
|
|
@@ -160,8 +164,8 @@ pytcl/trackers/mht.py,sha256=osEOXMaCeTt1eVn_E08dLRhEvBroVmf8b81zO5Zp1lU,20720
|
|
|
160
164
|
pytcl/trackers/multi_target.py,sha256=RDITa0xnbgtVYAMj5XXp4lljo5lZ2zAAc02KZlOjxbQ,10526
|
|
161
165
|
pytcl/trackers/single_target.py,sha256=Yy3FwaNTArMWcaod-0HVeiioNV4xLWxNDn_7ZPVqQYs,6562
|
|
162
166
|
pytcl/transponders/__init__.py,sha256=5fL4u3lKCYgPLo5uFeuZbtRZkJPABntuKYGUvVgMMEI,41
|
|
163
|
-
nrl_tracker-1.
|
|
164
|
-
nrl_tracker-1.
|
|
165
|
-
nrl_tracker-1.
|
|
166
|
-
nrl_tracker-1.
|
|
167
|
-
nrl_tracker-1.
|
|
167
|
+
nrl_tracker-1.9.1.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
|
|
168
|
+
nrl_tracker-1.9.1.dist-info/METADATA,sha256=DESL1GY4i_xV4n_gc4OdBfSMeCiNoh32058vSgQFu2M,12452
|
|
169
|
+
nrl_tracker-1.9.1.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
|
|
170
|
+
nrl_tracker-1.9.1.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
|
|
171
|
+
nrl_tracker-1.9.1.dist-info/RECORD,,
|
pytcl/__init__.py
CHANGED
|
@@ -6,8 +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
|
-
**Current Version:** 1.
|
|
10
|
-
**Status:** Production-ready, 2,
|
|
9
|
+
**Current Version:** 1.9.1 (January 4, 2026)
|
|
10
|
+
**Status:** Production-ready, 2,133 tests passing, 76% line coverage
|
|
11
11
|
Examples
|
|
12
12
|
--------
|
|
13
13
|
>>> import pytcl as pytcl
|
|
@@ -21,7 +21,7 @@ References
|
|
|
21
21
|
no. 5, pp. 18-27, May 2017.
|
|
22
22
|
"""
|
|
23
23
|
|
|
24
|
-
__version__ = "1.
|
|
24
|
+
__version__ = "1.9.1"
|
|
25
25
|
__author__ = "Python Port Contributors"
|
|
26
26
|
__original_author__ = "David F. Crouse, Naval Research Laboratory"
|
|
27
27
|
|
|
@@ -54,6 +54,8 @@ from typing import Any, Literal, Optional, Tuple
|
|
|
54
54
|
import numpy as np
|
|
55
55
|
from numpy.typing import NDArray
|
|
56
56
|
|
|
57
|
+
from pytcl.core.exceptions import DependencyError
|
|
58
|
+
|
|
57
59
|
# Constants for unit conversion
|
|
58
60
|
AU_PER_KM = 1.0 / 149597870.7 # 1 AU in km
|
|
59
61
|
KM_PER_DAY_TO_AU_PER_DAY = AU_PER_KM # velocity conversion factor
|
|
@@ -94,7 +96,7 @@ class DEEphemeris:
|
|
|
94
96
|
|
|
95
97
|
Raises
|
|
96
98
|
------
|
|
97
|
-
|
|
99
|
+
DependencyError
|
|
98
100
|
If jplephem is not installed
|
|
99
101
|
ValueError
|
|
100
102
|
If version is not recognized
|
|
@@ -145,9 +147,11 @@ class DEEphemeris:
|
|
|
145
147
|
try:
|
|
146
148
|
import jplephem
|
|
147
149
|
except ImportError as e:
|
|
148
|
-
raise
|
|
149
|
-
"jplephem is required for ephemeris access.
|
|
150
|
-
"
|
|
150
|
+
raise DependencyError(
|
|
151
|
+
"jplephem is required for ephemeris access.",
|
|
152
|
+
package="jplephem",
|
|
153
|
+
feature="JPL ephemeris access",
|
|
154
|
+
install_command="pip install pytcl[astronomy]",
|
|
151
155
|
) from e
|
|
152
156
|
|
|
153
157
|
self.version = version
|
pytcl/astronomical/relativity.py
CHANGED
|
@@ -471,3 +471,23 @@ def relativistic_range_correction(
|
|
|
471
471
|
doppler_correction = (relative_velocity**2) / (3.0 * C_LIGHT**2)
|
|
472
472
|
|
|
473
473
|
return grav_correction + doppler_correction
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
__all__ = [
|
|
477
|
+
# Constants
|
|
478
|
+
"C_LIGHT",
|
|
479
|
+
"G_GRAV",
|
|
480
|
+
"GM_EARTH",
|
|
481
|
+
"GM_SUN",
|
|
482
|
+
"AU",
|
|
483
|
+
# Functions
|
|
484
|
+
"schwarzschild_radius",
|
|
485
|
+
"gravitational_time_dilation",
|
|
486
|
+
"proper_time_rate",
|
|
487
|
+
"shapiro_delay",
|
|
488
|
+
"schwarzschild_precession_per_orbit",
|
|
489
|
+
"post_newtonian_acceleration",
|
|
490
|
+
"geodetic_precession",
|
|
491
|
+
"lense_thirring_precession",
|
|
492
|
+
"relativistic_range_correction",
|
|
493
|
+
]
|
pytcl/containers/__init__.py
CHANGED
|
@@ -20,8 +20,17 @@ a common interface for k-nearest neighbor and radius queries:
|
|
|
20
20
|
|
|
21
21
|
from pytcl.containers.base import (
|
|
22
22
|
BaseSpatialIndex,
|
|
23
|
+
CoverTreeResult,
|
|
23
24
|
MetricSpatialIndex,
|
|
25
|
+
NearestNeighborResult,
|
|
26
|
+
NeighborResult,
|
|
27
|
+
)
|
|
28
|
+
from pytcl.containers.base import (
|
|
29
|
+
RTreeResult as RTreeQueryResult, # Backward compatibility aliases; Avoid conflict with rtree.RTreeResult
|
|
30
|
+
)
|
|
31
|
+
from pytcl.containers.base import (
|
|
24
32
|
SpatialQueryResult,
|
|
33
|
+
VPTreeResult,
|
|
25
34
|
validate_query_input,
|
|
26
35
|
)
|
|
27
36
|
from pytcl.containers.cluster_set import (
|
|
@@ -32,8 +41,8 @@ from pytcl.containers.cluster_set import (
|
|
|
32
41
|
cluster_tracks_kmeans,
|
|
33
42
|
compute_cluster_centroid,
|
|
34
43
|
)
|
|
35
|
-
from pytcl.containers.covertree import CoverTree, CoverTreeNode
|
|
36
|
-
from pytcl.containers.kd_tree import BallTree, KDNode, KDTree
|
|
44
|
+
from pytcl.containers.covertree import CoverTree, CoverTreeNode
|
|
45
|
+
from pytcl.containers.kd_tree import BallTree, KDNode, KDTree
|
|
37
46
|
from pytcl.containers.measurement_set import (
|
|
38
47
|
Measurement,
|
|
39
48
|
MeasurementQuery,
|
|
@@ -49,17 +58,21 @@ from pytcl.containers.rtree import (
|
|
|
49
58
|
merge_boxes,
|
|
50
59
|
)
|
|
51
60
|
from pytcl.containers.track_list import TrackList, TrackListStats, TrackQuery
|
|
52
|
-
from pytcl.containers.vptree import VPNode, VPTree
|
|
61
|
+
from pytcl.containers.vptree import VPNode, VPTree
|
|
53
62
|
|
|
54
63
|
__all__ = [
|
|
55
|
-
# Base classes
|
|
64
|
+
# Base classes and unified result type
|
|
56
65
|
"BaseSpatialIndex",
|
|
57
66
|
"MetricSpatialIndex",
|
|
58
|
-
"
|
|
67
|
+
"NeighborResult",
|
|
59
68
|
"validate_query_input",
|
|
69
|
+
# Backward compatibility aliases for result types
|
|
70
|
+
"SpatialQueryResult",
|
|
71
|
+
"NearestNeighborResult",
|
|
72
|
+
"VPTreeResult",
|
|
73
|
+
"CoverTreeResult",
|
|
60
74
|
# K-D Tree
|
|
61
75
|
"KDNode",
|
|
62
|
-
"NearestNeighborResult",
|
|
63
76
|
"KDTree",
|
|
64
77
|
"BallTree",
|
|
65
78
|
# R-Tree
|
|
@@ -71,11 +84,9 @@ __all__ = [
|
|
|
71
84
|
"RTreeResult",
|
|
72
85
|
"RTree",
|
|
73
86
|
# VP-Tree
|
|
74
|
-
"VPTreeResult",
|
|
75
87
|
"VPNode",
|
|
76
88
|
"VPTree",
|
|
77
89
|
# Cover Tree
|
|
78
|
-
"CoverTreeResult",
|
|
79
90
|
"CoverTreeNode",
|
|
80
91
|
"CoverTree",
|
|
81
92
|
# Track List
|
pytcl/containers/base.py
CHANGED
|
@@ -4,6 +4,11 @@ Base classes for spatial data structures.
|
|
|
4
4
|
This module provides abstract base classes that define the common interface
|
|
5
5
|
for spatial indexing data structures like KD-trees, VP-trees, R-trees, and
|
|
6
6
|
Cover trees.
|
|
7
|
+
|
|
8
|
+
The unified interface ensures all spatial indices provide consistent:
|
|
9
|
+
- Constructor patterns (data, optional parameters)
|
|
10
|
+
- Query methods (query, query_radius, query_ball_point)
|
|
11
|
+
- Return types (NeighborResult)
|
|
7
12
|
"""
|
|
8
13
|
|
|
9
14
|
import logging
|
|
@@ -17,21 +22,52 @@ from numpy.typing import ArrayLike, NDArray
|
|
|
17
22
|
_logger = logging.getLogger("pytcl.containers")
|
|
18
23
|
|
|
19
24
|
|
|
20
|
-
class
|
|
21
|
-
"""
|
|
25
|
+
class NeighborResult(NamedTuple):
|
|
26
|
+
"""
|
|
27
|
+
Unified result type for spatial index queries.
|
|
28
|
+
|
|
29
|
+
All spatial index implementations (KDTree, BallTree, VPTree, CoverTree,
|
|
30
|
+
RTree) return this type from their query methods, ensuring a consistent
|
|
31
|
+
interface across the library.
|
|
22
32
|
|
|
23
33
|
Attributes
|
|
24
34
|
----------
|
|
25
|
-
indices : ndarray
|
|
26
|
-
Indices of
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
indices : ndarray of shape (n_queries, k) or (n_queries,)
|
|
36
|
+
Indices of the k nearest neighbors in the original data array.
|
|
37
|
+
For k=1, may be 1D. For k>1, shape is (n_queries, k).
|
|
38
|
+
distances : ndarray of shape (n_queries, k) or (n_queries,)
|
|
39
|
+
Distances to the k nearest neighbors.
|
|
40
|
+
Same shape as indices.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> from pytcl.containers import KDTree
|
|
45
|
+
>>> import numpy as np
|
|
46
|
+
>>> points = np.array([[0, 0], [1, 0], [0, 1], [1, 1]])
|
|
47
|
+
>>> tree = KDTree(points)
|
|
48
|
+
>>> result = tree.query([[0.1, 0.1]], k=2)
|
|
49
|
+
>>> result.indices
|
|
50
|
+
array([[0, 2]])
|
|
51
|
+
>>> result.distances
|
|
52
|
+
array([[0.14142136, 0.9 ]])
|
|
53
|
+
|
|
54
|
+
See Also
|
|
55
|
+
--------
|
|
56
|
+
BaseSpatialIndex : Abstract base class for spatial indices.
|
|
29
57
|
"""
|
|
30
58
|
|
|
31
59
|
indices: NDArray[np.intp]
|
|
32
60
|
distances: NDArray[np.floating]
|
|
33
61
|
|
|
34
62
|
|
|
63
|
+
# Backward compatibility aliases - all map to NeighborResult
|
|
64
|
+
SpatialQueryResult = NeighborResult
|
|
65
|
+
NearestNeighborResult = NeighborResult
|
|
66
|
+
VPTreeResult = NeighborResult
|
|
67
|
+
CoverTreeResult = NeighborResult
|
|
68
|
+
RTreeResult = NeighborResult
|
|
69
|
+
|
|
70
|
+
|
|
35
71
|
class BaseSpatialIndex(ABC):
|
|
36
72
|
"""
|
|
37
73
|
Abstract base class for spatial indexing data structures.
|
|
@@ -82,7 +118,7 @@ class BaseSpatialIndex(ABC):
|
|
|
82
118
|
self,
|
|
83
119
|
X: ArrayLike,
|
|
84
120
|
k: int = 1,
|
|
85
|
-
) ->
|
|
121
|
+
) -> NeighborResult:
|
|
86
122
|
"""
|
|
87
123
|
Query the index for k nearest neighbors.
|
|
88
124
|
|
|
@@ -95,7 +131,7 @@ class BaseSpatialIndex(ABC):
|
|
|
95
131
|
|
|
96
132
|
Returns
|
|
97
133
|
-------
|
|
98
|
-
result :
|
|
134
|
+
result : NeighborResult
|
|
99
135
|
Named tuple with indices and distances of k nearest neighbors
|
|
100
136
|
for each query point.
|
|
101
137
|
"""
|
|
@@ -125,6 +161,36 @@ class BaseSpatialIndex(ABC):
|
|
|
125
161
|
"""
|
|
126
162
|
pass
|
|
127
163
|
|
|
164
|
+
def query_ball_point(
|
|
165
|
+
self,
|
|
166
|
+
X: ArrayLike,
|
|
167
|
+
r: float,
|
|
168
|
+
) -> List[List[int]]:
|
|
169
|
+
"""
|
|
170
|
+
Query the index for all points within radius r.
|
|
171
|
+
|
|
172
|
+
This is an alias for :meth:`query_radius` provided for compatibility
|
|
173
|
+
with scipy.spatial.KDTree.
|
|
174
|
+
|
|
175
|
+
Parameters
|
|
176
|
+
----------
|
|
177
|
+
X : array_like
|
|
178
|
+
Query points of shape (n_queries, n_features) or (n_features,).
|
|
179
|
+
r : float
|
|
180
|
+
Search radius.
|
|
181
|
+
|
|
182
|
+
Returns
|
|
183
|
+
-------
|
|
184
|
+
indices : list of list of int
|
|
185
|
+
For each query point, a list of indices of data points
|
|
186
|
+
within distance r.
|
|
187
|
+
|
|
188
|
+
See Also
|
|
189
|
+
--------
|
|
190
|
+
query_radius : The underlying implementation.
|
|
191
|
+
"""
|
|
192
|
+
return self.query_radius(X, r)
|
|
193
|
+
|
|
128
194
|
def __len__(self) -> int:
|
|
129
195
|
"""Return number of indexed points."""
|
|
130
196
|
return self.n_samples
|
|
@@ -212,8 +278,15 @@ def validate_query_input(
|
|
|
212
278
|
|
|
213
279
|
|
|
214
280
|
__all__ = [
|
|
215
|
-
|
|
281
|
+
# Primary types
|
|
282
|
+
"NeighborResult",
|
|
216
283
|
"BaseSpatialIndex",
|
|
217
284
|
"MetricSpatialIndex",
|
|
218
285
|
"validate_query_input",
|
|
286
|
+
# Backward compatibility aliases
|
|
287
|
+
"SpatialQueryResult",
|
|
288
|
+
"NearestNeighborResult",
|
|
289
|
+
"VPTreeResult",
|
|
290
|
+
"CoverTreeResult",
|
|
291
|
+
"RTreeResult",
|
|
219
292
|
]
|
pytcl/containers/covertree.py
CHANGED
|
@@ -12,32 +12,22 @@ References
|
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
import logging
|
|
15
|
-
from typing import Any, Callable, List,
|
|
15
|
+
from typing import Any, Callable, List, Optional, Set, Tuple
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
from numpy.typing import ArrayLike, NDArray
|
|
19
19
|
|
|
20
|
-
from pytcl.containers.base import
|
|
20
|
+
from pytcl.containers.base import CoverTreeResult # Backward compatibility alias
|
|
21
|
+
from pytcl.containers.base import (
|
|
22
|
+
MetricSpatialIndex,
|
|
23
|
+
NeighborResult,
|
|
24
|
+
validate_query_input,
|
|
25
|
+
)
|
|
21
26
|
|
|
22
27
|
# Module logger
|
|
23
28
|
_logger = logging.getLogger("pytcl.containers.covertree")
|
|
24
29
|
|
|
25
30
|
|
|
26
|
-
class CoverTreeResult(NamedTuple):
|
|
27
|
-
"""Result of Cover tree query.
|
|
28
|
-
|
|
29
|
-
Attributes
|
|
30
|
-
----------
|
|
31
|
-
indices : ndarray
|
|
32
|
-
Indices of nearest neighbors.
|
|
33
|
-
distances : ndarray
|
|
34
|
-
Distances to nearest neighbors.
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
indices: NDArray[np.intp]
|
|
38
|
-
distances: NDArray[np.floating]
|
|
39
|
-
|
|
40
|
-
|
|
41
31
|
class CoverTreeNode:
|
|
42
32
|
"""Node in a Cover tree.
|
|
43
33
|
|
|
@@ -234,7 +224,7 @@ class CoverTree(MetricSpatialIndex):
|
|
|
234
224
|
self,
|
|
235
225
|
X: ArrayLike,
|
|
236
226
|
k: int = 1,
|
|
237
|
-
) ->
|
|
227
|
+
) -> NeighborResult:
|
|
238
228
|
"""
|
|
239
229
|
Query the tree for k nearest neighbors.
|
|
240
230
|
|
|
@@ -247,7 +237,7 @@ class CoverTree(MetricSpatialIndex):
|
|
|
247
237
|
|
|
248
238
|
Returns
|
|
249
239
|
-------
|
|
250
|
-
result :
|
|
240
|
+
result : NeighborResult
|
|
251
241
|
Indices and distances of k nearest neighbors.
|
|
252
242
|
"""
|
|
253
243
|
X = validate_query_input(X, self.n_features)
|
|
@@ -264,7 +254,9 @@ class CoverTree(MetricSpatialIndex):
|
|
|
264
254
|
all_indices[i, :n_found] = indices
|
|
265
255
|
all_distances[i, :n_found] = distances
|
|
266
256
|
|
|
267
|
-
return
|
|
257
|
+
return NeighborResult(indices=all_indices, distances=all_distances)
|
|
258
|
+
|
|
259
|
+
# query_ball_point inherited from BaseSpatialIndex
|
|
268
260
|
|
|
269
261
|
def _query_single(
|
|
270
262
|
self,
|
|
@@ -410,7 +402,8 @@ class CoverTree(MetricSpatialIndex):
|
|
|
410
402
|
|
|
411
403
|
|
|
412
404
|
__all__ = [
|
|
413
|
-
"
|
|
405
|
+
"NeighborResult",
|
|
406
|
+
"CoverTreeResult", # Backward compatibility alias
|
|
414
407
|
"CoverTreeNode",
|
|
415
408
|
"CoverTree",
|
|
416
409
|
]
|