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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 1.8.0
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
- [![PyPI version](https://img.shields.io/badge/pypi-v1.8.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
66
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.9.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
67
67
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
68
68
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
69
69
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -1,24 +1,24 @@
1
- pytcl/__init__.py,sha256=3t-mCxNkSHPSfruZYNJIS1xadBMD0EI4PONE6SAEa-Q,2030
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=S7ObVivB2J_qv2mGtFuchYYueJeDKkiqT49r-v0VquE,5466
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=z2Of_oW_RRUv5GGoagzCYt5BLHk8-izoWz31_dKe42Y,5590
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=nQSbcipQ_IhPv1R-Q0-iPlfTCb4x2KdfVjwc0c_YeeE,16705
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=deuzBIINS4HimCwNU0_mzlHiB2nJ3AW8PnqtpzTw5_I,15534
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=jZAZb0VUft5gjQghfg2S9PD-LsA5xgtXkc0mAS_Gnmk,2428
36
- pytcl/containers/base.py,sha256=UL-RXobVlZCZ5H3Xdo_TzcJQANNsIVQeynKHhLGxRVE,5545
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=SKiosZnJ9bvAaANDKQSbDUqL2BnIno-1D8TbOWDM3m0,13337
39
- pytcl/containers/kd_tree.py,sha256=9CKHAzid0DZ879hut8M4dyW_976pIWNLX3uWzELPIu4,18563
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=SGlnEG6q670qxO9P_jDT7yocjYmdal8f22SvEXdvw9E,21857
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=eFBX2-sm_lgqON18uM4MEk4I4_sRgoPla29cTJFy_Xo,8800
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=3GFQX_Q9f7fhmWlA6OQiS6OpM7HWhyT9iQhB8Mhi_kk,1580
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=lZVDK5zsSR02_4b2Nqx9KDtZT9QaYhkZ9wuoODbifd4,8693
57
- pytcl/core/validation.py,sha256=9Pjn2wOYmGLJDSA8eS2aGTCGO16o5l2xioOHamNXuIg,23441
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/square_root.py,sha256=pDEDstYIQht5e7ahD6x13UfSVIUWMe4jRR4z6j687vw,13457
71
- pytcl/dynamic_estimation/kalman/sr_ukf.py,sha256=xlKRML6QOHD99P-urIeBZsBDc_DY1_U73W3eDkiqRRY,8737
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=1Uok0p82t2zB7BWZB6GEkUCwuoM3WB8SRykTrVRdsIo,30612
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=g7ra-uk-HnQmJRCj1VvJuuz8t8FW55kCENUkx0vPrP4,21807
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=lTNBwlq_4hnQx_w6RIX6X35Ke3YMFvqV_huJrcFCvNs,17362
145
- pytcl/plotting/ellipses.py,sha256=bcns6dfNK4bwA_QBshscYhbAz_5wegwyqjDzzoUdWsQ,12465
146
- pytcl/plotting/metrics.py,sha256=zbJr5P2kQg7-rGpGHsN7rC02S0JLOpPUZeoscQem7uQ,18148
147
- pytcl/plotting/tracks.py,sha256=3V_78oPEGi7lsTNk-lhYRffXWNHH0-Lj2oNw2HIKRJQ,23054
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=FGRnyzKh03LrpXICocbIK3MhTW7o9nsVvsm3iuIUqK4,27066
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.8.0.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
164
- nrl_tracker-1.8.0.dist-info/METADATA,sha256=qyEmcKaGMIx76rpG0X9g5wV_XKNFkCKwPkMvXtF6Wb8,12452
165
- nrl_tracker-1.8.0.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
166
- nrl_tracker-1.8.0.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
167
- nrl_tracker-1.8.0.dist-info/RECORD,,
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.8.0 (January 4, 2026)
10
- **Status:** Production-ready, 2,070 tests passing, 76% line coverage
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.8.0"
24
+ __version__ = "1.9.1"
25
25
  __author__ = "Python Port Contributors"
26
26
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
27
27
 
@@ -21,7 +21,6 @@ This is based on:
21
21
  """
22
22
 
23
23
  import heapq
24
- from collections.abc import Sequence
25
24
  from typing import Any
26
25
 
27
26
  import numpy as np
@@ -21,8 +21,6 @@ This is empirically faster than pure successive shortest paths because:
21
21
  - Better cache locality
22
22
  """
23
23
 
24
- from typing import Any
25
-
26
24
  import numpy as np
27
25
  from numpy.typing import NDArray
28
26
 
@@ -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
- ImportError
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 ImportError(
149
- "jplephem is required for ephemeris access. "
150
- "Install with: pip install jplephem"
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
@@ -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
+ ]
@@ -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, CoverTreeResult
36
- from pytcl.containers.kd_tree import BallTree, KDNode, KDTree, NearestNeighborResult
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, VPTreeResult
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
- "SpatialQueryResult",
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 SpatialQueryResult(NamedTuple):
21
- """Result of a spatial query.
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 matching points in the original data.
27
- distances : ndarray
28
- Distances to matching points.
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
- ) -> SpatialQueryResult:
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 : SpatialQueryResult
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
- "SpatialQueryResult",
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
  ]
@@ -12,32 +12,22 @@ References
12
12
  """
13
13
 
14
14
  import logging
15
- from typing import Any, Callable, List, NamedTuple, Optional, Set, Tuple
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 MetricSpatialIndex, validate_query_input
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
- ) -> CoverTreeResult:
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 : CoverTreeResult
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 CoverTreeResult(indices=all_indices, distances=all_distances)
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
- "CoverTreeResult",
405
+ "NeighborResult",
406
+ "CoverTreeResult", # Backward compatibility alias
414
407
  "CoverTreeNode",
415
408
  "CoverTree",
416
409
  ]