nrl-tracker 0.13.2__py3-none-any.whl → 0.21.4__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 (37) hide show
  1. {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/METADATA +8 -3
  2. {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/RECORD +37 -23
  3. pytcl/__init__.py +1 -1
  4. pytcl/assignment_algorithms/__init__.py +27 -1
  5. pytcl/assignment_algorithms/jpda.py +43 -29
  6. pytcl/assignment_algorithms/three_dimensional/__init__.py +24 -0
  7. pytcl/assignment_algorithms/three_dimensional/assignment.py +659 -0
  8. pytcl/assignment_algorithms/two_dimensional/__init__.py +14 -1
  9. pytcl/assignment_algorithms/two_dimensional/assignment.py +14 -7
  10. pytcl/assignment_algorithms/two_dimensional/kbest.py +568 -0
  11. pytcl/clustering/dbscan.py +23 -5
  12. pytcl/clustering/hierarchical.py +23 -10
  13. pytcl/clustering/kmeans.py +5 -10
  14. pytcl/containers/__init__.py +34 -1
  15. pytcl/containers/cluster_set.py +784 -0
  16. pytcl/containers/measurement_set.py +461 -0
  17. pytcl/containers/track_list.py +477 -0
  18. pytcl/dynamic_estimation/__init__.py +50 -0
  19. pytcl/dynamic_estimation/imm.py +41 -32
  20. pytcl/dynamic_estimation/information_filter.py +647 -0
  21. pytcl/dynamic_estimation/kalman/linear.py +17 -13
  22. pytcl/dynamic_estimation/kalman/unscented.py +26 -23
  23. pytcl/dynamic_estimation/particle_filters/bootstrap.py +57 -19
  24. pytcl/dynamic_estimation/smoothers.py +668 -0
  25. pytcl/mathematical_functions/numerical_integration/quadrature.py +36 -7
  26. pytcl/mathematical_functions/special_functions/__init__.py +82 -0
  27. pytcl/mathematical_functions/special_functions/bessel.py +260 -0
  28. pytcl/mathematical_functions/special_functions/debye.py +288 -0
  29. pytcl/mathematical_functions/special_functions/hypergeometric.py +420 -0
  30. pytcl/mathematical_functions/special_functions/lambert_w.py +294 -0
  31. pytcl/mathematical_functions/special_functions/marcum_q.py +370 -0
  32. pytcl/navigation/__init__.py +70 -0
  33. pytcl/navigation/great_circle.py +799 -0
  34. pytcl/navigation/rhumb.py +722 -0
  35. {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/LICENSE +0 -0
  36. {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/WHEEL +0 -0
  37. {nrl_tracker-0.13.2.dist-info → nrl_tracker-0.21.4.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 0.13.2
3
+ Version: 0.21.4
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
7
- Project-URL: Homepage, https://github.com/nedonatelli/TCL
7
+ Project-URL: Homepage, https://pytcl.readthedocs.io/en
8
+ Project-URL: Documentation, https://pytcl.readthedocs.io/en/latest/docs.html
9
+ Project-URL: Repository, https://github.com/nedonatelli/TCL
8
10
  Project-URL: Bug Tracker, https://github.com/nedonatelli/TCL/issues
9
- Project-URL: Documentation, https://github.com/nedonatelli/TCL#readme
10
11
  Project-URL: Original MATLAB Library, https://github.com/USNavalResearchLaboratory/TrackerComponentLibrary
11
12
  Keywords: tracking,kalman-filter,target-tracking,data-association,estimation,navigation,coordinate-systems,signal-processing
12
13
  Classifier: Development Status :: 3 - Alpha
@@ -59,12 +60,16 @@ Requires-Dist: plotly>=5.15.0; extra == "visualization"
59
60
 
60
61
  # Tracker Component Library (Python)
61
62
 
63
+ [![PyPI version](https://img.shields.io/badge/pypi-v0.21.4-blue.svg)](https://pypi.org/project/nrl-tracker/)
62
64
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
63
65
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
64
66
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
67
+ [![Tests](https://img.shields.io/badge/tests-1530%20passing-success.svg)](https://github.com/nedonatelli/TCL)
65
68
 
66
69
  A Python port of the [U.S. Naval Research Laboratory's Tracker Component Library](https://github.com/USNavalResearchLaboratory/TrackerComponentLibrary), a comprehensive collection of algorithms for target tracking, estimation, coordinate systems, and related mathematical functions.
67
70
 
71
+ **800+ functions** | **144 modules** | **1,530 tests** | **15+ algorithm categories**
72
+
68
73
  ## Overview
69
74
 
70
75
  The Tracker Component Library provides building blocks for developing target tracking algorithms, including:
@@ -1,10 +1,13 @@
1
- pytcl/__init__.py,sha256=A0iqbLxyssFtQNJaxa2KHk75aYeMaZvmMcG7ITwtMRA,1894
2
- pytcl/assignment_algorithms/__init__.py,sha256=Un6EytXOx2TNr8wk8w26oV0Hc8RUiTeYMo6XSSCnzkc,1523
1
+ pytcl/__init__.py,sha256=gskiDd7_BZ-aWQ3h_uxnX6oGP3ylOmb69Mws0xLnEAQ,1894
2
+ pytcl/assignment_algorithms/__init__.py,sha256=f9V-TkEVmiKYYyth4PTpDfJvA7yYV_ys6Zix-QwWIYY,2136
3
3
  pytcl/assignment_algorithms/data_association.py,sha256=X6Kww9-J2WLxU1790w7dRvAFdM90RSXHvs7IF26zweQ,11427
4
4
  pytcl/assignment_algorithms/gating.py,sha256=fN_oAOkv7nYYOWE1oPOLrcCn3xEpKdMVlFSbRMAURxY,10815
5
- pytcl/assignment_algorithms/jpda.py,sha256=hvZGkSrStuw9iQg7gPuIV7_bOinX3Xix5vLrVLMnEMM,19288
6
- pytcl/assignment_algorithms/two_dimensional/__init__.py,sha256=kdO7IGm_Y37g-R7r145yLyqdc0JCqR4sDafY8mQ3GHk,442
7
- pytcl/assignment_algorithms/two_dimensional/assignment.py,sha256=IRwbv-82dEbbm3KwjyUjuUWM3wP9s6oUtzX2mZffMjA,11419
5
+ pytcl/assignment_algorithms/jpda.py,sha256=Hv55j3J9qVwzlUfWdXdSasodTyB1ZKdgEpo5dBh95O8,19582
6
+ pytcl/assignment_algorithms/three_dimensional/__init__.py,sha256=1Q40OUlUQoo7YKEucwdrSNo3D4A0Zibvkr8z4TpueBg,526
7
+ pytcl/assignment_algorithms/three_dimensional/assignment.py,sha256=9BJhwlYu3JJ0kZ9sRyKKfpdvQdL4WYYHCtLbvaWycBw,19212
8
+ pytcl/assignment_algorithms/two_dimensional/__init__.py,sha256=4Evsn__9hTfI2i8m8Ngl-Zy0Fa2OydKmDKlZlH6jaao,778
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
8
11
  pytcl/astronomical/__init__.py,sha256=SKELDaDhxpvCo1dMswBQYOQr_Th3ShuzZTzxZMdhE-U,5650
9
12
  pytcl/astronomical/lambert.py,sha256=Lc8FT1JmpI9WSXsG2s5vIRkSoBSV7r5hd3o2bGh2Ojo,15607
10
13
  pytcl/astronomical/orbital_mechanics.py,sha256=8GssRanwTowCl6PJYqmB_SDnNznLUq5gkPa3j6iEo3U,19965
@@ -13,14 +16,17 @@ pytcl/astronomical/time_systems.py,sha256=Jg0Zaq60hc4Ts1aQtb5bK4KSZhz-uQse8gYC89
13
16
  pytcl/atmosphere/__init__.py,sha256=QAYgJYzgs0kreRV8fByii4p477LCxBDfrXB_cL7SYkM,706
14
17
  pytcl/atmosphere/models.py,sha256=pMLv8D7qoFqLZrlbTHLJJULOdDdhPskJ1m7KVKLV63E,9584
15
18
  pytcl/clustering/__init__.py,sha256=bYdhC_XJEt6KUUni9bIPxaddXNEGmIJQvGkA14rK4J8,1697
16
- pytcl/clustering/dbscan.py,sha256=cjBi5b0gcBgFqUtkLm1G0JMJLQYALahyYuoSI4G0zAY,6903
19
+ pytcl/clustering/dbscan.py,sha256=PS6QlOwHFerbZNEb3zcNhN4oNQpgOOw5y0WskQzyKIo,7364
17
20
  pytcl/clustering/gaussian_mixture.py,sha256=U5U0Z46tZWdTLNdNNNJenoeviwZRAOvexVFYVLt4QMc,22865
18
- pytcl/clustering/hierarchical.py,sha256=PEkIGqAQ33InUGIcCRevv0rko4R1HqIwfejNhHsbnKQ,13794
19
- pytcl/clustering/kmeans.py,sha256=fmUIQdQLKCocwmMabdReQ0cKqMNKNFI_DyTCivPmAtw,10842
20
- pytcl/containers/__init__.py,sha256=RV0-7l97cc3iE_pwzt9zWzY-wymiUoIvL8qU1P2XWYU,966
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
21
25
  pytcl/containers/covertree.py,sha256=1JWqXxoUFLxuMnjwj2qf0iz2uPzdujQYdwJW3l5qsOs,13282
22
26
  pytcl/containers/kd_tree.py,sha256=pxRC62RYkqz9zXPz6c1fubmtPPBDLYA5I9AXMAoGanw,16348
27
+ pytcl/containers/measurement_set.py,sha256=Kr29mlJOCyGMYhMnE89f-W72aunlv4p04QAdfCZcm-0,12687
23
28
  pytcl/containers/rtree.py,sha256=gv2EztvPnaAXEa6OoFnOYBY1MfTwjNMYh_BCiIomHJk,15450
29
+ pytcl/containers/track_list.py,sha256=6q9Qgcwm-8H_JqtOCsMssF27av4XaSkhfDl-MWb1ABc,12520
24
30
  pytcl/containers/vptree.py,sha256=6fBNHrezkmj7L2nH0-2bONRN92f5cZAhS-5vaI1JZnA,8814
25
31
  pytcl/coordinate_systems/__init__.py,sha256=jwYhu_-9AvOeP9WLG9PYtyDwfe0GjxNZ9-xCqiLymW4,3909
26
32
  pytcl/coordinate_systems/conversions/__init__.py,sha256=PkNevB78vBw0BkalydJBbQO91AyiMJxKRrgJNt4HsYc,1100
@@ -36,17 +42,19 @@ pytcl/core/__init__.py,sha256=H5JJPS-43DfF1UG7fSgV-VMTcZFBO8GuzDW1lM_1sm4,1152
36
42
  pytcl/core/array_utils.py,sha256=SsgEiAoRCWxAVKq1aa5-nPdOi-2AB6XNObu0IaGClUk,13983
37
43
  pytcl/core/constants.py,sha256=lZVDK5zsSR02_4b2Nqx9KDtZT9QaYhkZ9wuoODbifd4,8693
38
44
  pytcl/core/validation.py,sha256=WRlzMlUihtqc3XZoWOTFK0sBAZVDIwTMGCiWcX5OZVY,13093
39
- pytcl/dynamic_estimation/__init__.py,sha256=ASAfa2wrenjqRIKnvesXwfdwECvA2PODJXWN9yQNhq0,3427
40
- pytcl/dynamic_estimation/imm.py,sha256=CoOwJJv0DMrNKRkP-OqWbSxZO_-GAgNLaQ4KiBhjvEg,21313
45
+ pytcl/dynamic_estimation/__init__.py,sha256=jA5FF6kHYklY5LMOfZaKcCeiPTpVe8vHIMp3ECDOmsc,4582
46
+ pytcl/dynamic_estimation/imm.py,sha256=t4dlutWeCLtAMl-ylNbxMUC3gbRBF_sXI3bX4PAk-OQ,22080
47
+ pytcl/dynamic_estimation/information_filter.py,sha256=x7iQwO_iJT1dCSvDws5LqD3yAtjw9QVGUfMPcXn1IA4,17349
48
+ pytcl/dynamic_estimation/smoothers.py,sha256=qC_g0YG0U4L_7rGBpcZzYcb11A--Hc8tb0fxWXIJdxM,18931
41
49
  pytcl/dynamic_estimation/batch_estimation/__init__.py,sha256=JQ0s76Enov5a7plA4EnUua4t-7etikQrwr5z4WIjUeo,46
42
50
  pytcl/dynamic_estimation/kalman/__init__.py,sha256=yoFLj0n-NRkdZnRVL-BkHBlATk8pfZEVlsY3BhSYgKc,2387
43
51
  pytcl/dynamic_estimation/kalman/extended.py,sha256=_deQTnUGOp_BlhP-FDEY0LOjgUMN32FQn0V12unCM4A,10397
44
- pytcl/dynamic_estimation/kalman/linear.py,sha256=sTfWt_yDxyQCA0SMjOx4xfhVnq3nReOVUObXuUuZRv8,11844
52
+ pytcl/dynamic_estimation/kalman/linear.py,sha256=1Zgg9gZya0Vxs9im7sPUqLj0Luo463vS-RSa6GCReFI,12248
45
53
  pytcl/dynamic_estimation/kalman/square_root.py,sha256=Hw1F4_Zc7IA6Mt1WCkjx1UuLAUmNhM5vPLvueb7oRSA,26931
46
- pytcl/dynamic_estimation/kalman/unscented.py,sha256=NXPBTAf6814Yw5HTFpX21w_Y0eSC6q1gZSRUHHYEQjI,14943
54
+ pytcl/dynamic_estimation/kalman/unscented.py,sha256=VmYE8LuM1nWpFTmD39iXdEZ3m41IsurCCbXJ19-ERFs,15440
47
55
  pytcl/dynamic_estimation/measurement_update/__init__.py,sha256=8rlyJwVpxf0fZj-AFo1hlewvryZRhUzcy3F8uMe6I8c,48
48
56
  pytcl/dynamic_estimation/particle_filters/__init__.py,sha256=-DRF5rVF2749suLlArmkTvVkqeMcV_mIx0eLeTj6wNU,906
49
- pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=EfF9w0xqyBIYOHIwoYRt7D8aCgdPoGpvaFINu8gCZ80,12396
57
+ pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=FcF4W_NM5ZqJnw5fq4rq6fLY9X1r4uFJOiAX9a-NGG8,13371
50
58
  pytcl/dynamic_models/__init__.py,sha256=Cd8MyyYuB8gMnepkPA-HSwTaKFPThnqoKOhdjVOsXWg,2783
51
59
  pytcl/dynamic_models/continuous_time/__init__.py,sha256=dAkfEddLkfMvDalK9v2GRBvaZV1KgqYpFBLOnoiFClw,1023
52
60
  pytcl/dynamic_models/continuous_time/dynamics.py,sha256=CDwqn-66eUwXA5xfIjaG6A4EDBqtOyQ3aWarJr9QH4g,12858
@@ -80,17 +88,21 @@ pytcl/mathematical_functions/geometry/geometry.py,sha256=l63wQnhCtJwVHZOJeONX1qy
80
88
  pytcl/mathematical_functions/interpolation/__init__.py,sha256=HDhP7ZsgUrXFBNJ_eCZEdp5gizWJ-BxvkQSCMnvBg3A,677
81
89
  pytcl/mathematical_functions/interpolation/interpolation.py,sha256=2cXMDgWBjWDGHnK1K_lawFlJL8oPl5AQGf9MNgsESfo,12610
82
90
  pytcl/mathematical_functions/numerical_integration/__init__.py,sha256=iXiHzyV_KIhCv7tXErXlN1_fUEACN6yN3CYDHRA7esw,974
83
- pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=ErxG_HLfM2LjKStguK_2wEhodln63v1FVubetAS5GL0,14748
91
+ pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=ZRMKs0vbcgFDe1Sr8sjyEOkALLmJU4zKRJjoPEcXrUc,15670
84
92
  pytcl/mathematical_functions/polynomials/__init__.py,sha256=WJWZcoQhnvy5f59-kncMTgD9mCtgwfDgULvDYYHS5ys,43
85
93
  pytcl/mathematical_functions/signal_processing/__init__.py,sha256=_SzzBVtxmSvP8FKeogRdNmFo8FOVDDoexVOqd-lE7do,2325
86
94
  pytcl/mathematical_functions/signal_processing/detection.py,sha256=9F0xdy3hMat1czSWAQYMExn0kY5DBRpyBneAfjjHUVI,30377
87
95
  pytcl/mathematical_functions/signal_processing/filters.py,sha256=8Ojf4h4rfiucBXqUmB1odvHH41Gf3rPwmWCMKb-qzWk,23435
88
96
  pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=AahJZRZk2IIXzRL7www0n8bc0XoKabaLOe8yYNSjuDY,22893
89
- pytcl/mathematical_functions/special_functions/__init__.py,sha256=fXACpf-y1Jdq7UmVjwETUVhN_mkATT1I4tKbT1FW-C0,2017
90
- pytcl/mathematical_functions/special_functions/bessel.py,sha256=0sVwL1pPqNYiVkjXqacnkHoPBkiomk0D7IDu6-bKtEs,8139
97
+ pytcl/mathematical_functions/special_functions/__init__.py,sha256=qDPGfee1i1NkVi9LXJKnsWXL3CWHkPQINrkwqLqB8YU,3796
98
+ pytcl/mathematical_functions/special_functions/bessel.py,sha256=M0mwLQBaUXEHA8wyKReJ2D66I1v1XR7y-txAipd-WDs,14377
99
+ pytcl/mathematical_functions/special_functions/debye.py,sha256=Nchjwkl1vzSL1L7nQpslb-lvT49LgTfdTIQMeSNn4vQ,6689
91
100
  pytcl/mathematical_functions/special_functions/elliptic.py,sha256=WyzBkrfZufIR5dUmCKGcxp6KNpVDrU89NGLDyRrZOqQ,7418
92
101
  pytcl/mathematical_functions/special_functions/error_functions.py,sha256=a3SS8FYAMRv1KdCmebOZL95yjvVt9gZRF2XOjHvQ9M8,6253
93
102
  pytcl/mathematical_functions/special_functions/gamma_functions.py,sha256=xXN_9SCokH10HjE8PpaPKHYVK_RZRHRAbZgR2mZYIAA,10191
103
+ 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
105
+ pytcl/mathematical_functions/special_functions/marcum_q.py,sha256=OZ5QjIB1e_XvRG8A-3dbZ13YXHtdk2EYVEPaqtgVr14,9580
94
106
  pytcl/mathematical_functions/statistics/__init__.py,sha256=dfypStgmnFmOrnWcm-3CEvLinONHraFgx9O66_37bqw,1278
95
107
  pytcl/mathematical_functions/statistics/distributions.py,sha256=icfFIIKCEFzkpFHuYGWL197nm8wvS7UPJlr9kd_uEgw,19373
96
108
  pytcl/mathematical_functions/statistics/estimators.py,sha256=TLnYXSwk5MzBakZrzDBupbOB3ONmJI7q1-oB2xuSVQM,10831
@@ -99,10 +111,12 @@ pytcl/mathematical_functions/transforms/fourier.py,sha256=QH6OaTzw4kN6M-DuSmwB_5
99
111
  pytcl/mathematical_functions/transforms/stft.py,sha256=zQapXl-v69_RDPwMqci83jah17GyAfnr3gx0budv2Cg,18619
100
112
  pytcl/mathematical_functions/transforms/wavelets.py,sha256=dm273Z_t13BlEVSlHTaGE7jR1ocugL7lEkcO499U7bY,21656
101
113
  pytcl/misc/__init__.py,sha256=SCHf_lQVfdl2gwUluHBiIloTF8HRH8EkgYfbNr7zOug,33
102
- pytcl/navigation/__init__.py,sha256=NHlld_i1lTTO6Q18Ozm_yUj--d3kbu_nmL2cJCGlDLY,4027
114
+ pytcl/navigation/__init__.py,sha256=9tUhEgPVugA8nmZ9rvOaAntCd7rDPgW2RBLHqaDAXSc,5864
103
115
  pytcl/navigation/geodesy.py,sha256=M9XXfBTMCRdaWMV2-ViDSTEt94WZnMtxMeJQ1FAgQHY,17227
116
+ pytcl/navigation/great_circle.py,sha256=TtlkWZbzr-HzSt4ultG_h137ZnX0pJZx_87kr3uvpjI,20923
104
117
  pytcl/navigation/ins.py,sha256=V3ZA4z8y5E6PBCd1FhifR5VaCU7DRAn2fb7W0LilByo,31168
105
118
  pytcl/navigation/ins_gnss.py,sha256=euKF5JGgwmVBsw3jBf7_wa2z1BpZeVbSNmBuwzhGS6c,30157
119
+ pytcl/navigation/rhumb.py,sha256=lr1c3iEXfoOSfIyyXSRWv6He5TlaxEHbJy-dhqM1gRw,18224
106
120
  pytcl/performance_evaluation/__init__.py,sha256=tM2pnBfDb2XbnLt4Y5MQ6w6XBwFy_5bf_y0toZmxx88,1859
107
121
  pytcl/performance_evaluation/estimation_metrics.py,sha256=X1ZCpp8m6DV14N2wbMvlRwfORRKga8DgKmG3dROyJqA,12351
108
122
  pytcl/performance_evaluation/track_metrics.py,sha256=Nd3royJkAelZV-Qggl8i72e7WocCxWomgliArvVAEkc,13342
@@ -127,8 +141,8 @@ pytcl/trackers/mht.py,sha256=7mwhMmja3ri2wnx7W1wueDGn2r3ArwAxJDPUJ7IZAkQ,20617
127
141
  pytcl/trackers/multi_target.py,sha256=7ZL8V25TO_rEMtQm2eYkScesDQHC9qXZVHLHyVbxy3M,10529
128
142
  pytcl/trackers/single_target.py,sha256=Yy3FwaNTArMWcaod-0HVeiioNV4xLWxNDn_7ZPVqQYs,6562
129
143
  pytcl/transponders/__init__.py,sha256=5fL4u3lKCYgPLo5uFeuZbtRZkJPABntuKYGUvVgMMEI,41
130
- nrl_tracker-0.13.2.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
131
- nrl_tracker-0.13.2.dist-info/METADATA,sha256=QoDNSjw-OHiQWt4inyMiCxuHJ9r587u1P-1yEnxc6Go,9635
132
- nrl_tracker-0.13.2.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
133
- nrl_tracker-0.13.2.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
134
- nrl_tracker-0.13.2.dist-info/RECORD,,
144
+ nrl_tracker-0.21.4.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
145
+ nrl_tracker-0.21.4.dist-info/METADATA,sha256=kfdnUMvBqNlpI3skCRZZQIQF8gYBLHSGcgSZ5gGwDXw,10005
146
+ nrl_tracker-0.21.4.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
147
+ nrl_tracker-0.21.4.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
148
+ nrl_tracker-0.21.4.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.13.2"
23
+ __version__ = "0.21.4"
24
24
  __author__ = "Python Port Contributors"
25
25
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
26
 
@@ -2,7 +2,9 @@
2
2
  Assignment algorithms for data association in target tracking.
3
3
 
4
4
  This module provides:
5
- - 2D assignment algorithms (Hungarian, Auction, JVC)
5
+ - 2D assignment algorithms (Hungarian, Auction)
6
+ - K-best 2D assignment (Murty's algorithm)
7
+ - 3D assignment algorithms (Lagrangian relaxation, Auction)
6
8
  - Gating methods (ellipsoidal, rectangular)
7
9
  - Data association algorithms (GNN, JPDA)
8
10
  """
@@ -30,12 +32,24 @@ from pytcl.assignment_algorithms.jpda import (
30
32
  jpda_probabilities,
31
33
  jpda_update,
32
34
  )
35
+ from pytcl.assignment_algorithms.three_dimensional import (
36
+ Assignment3DResult,
37
+ assign3d,
38
+ assign3d_auction,
39
+ assign3d_lagrangian,
40
+ decompose_to_2d,
41
+ greedy_3d,
42
+ )
33
43
  from pytcl.assignment_algorithms.two_dimensional import (
34
44
  AssignmentResult,
45
+ KBestResult,
35
46
  assign2d,
36
47
  auction,
37
48
  hungarian,
49
+ kbest_assign2d,
38
50
  linear_sum_assignment,
51
+ murty,
52
+ ranked_assignments,
39
53
  )
40
54
 
41
55
  __all__ = [
@@ -45,6 +59,18 @@ __all__ = [
45
59
  "linear_sum_assignment",
46
60
  "assign2d",
47
61
  "AssignmentResult",
62
+ # K-Best 2D Assignment
63
+ "KBestResult",
64
+ "murty",
65
+ "kbest_assign2d",
66
+ "ranked_assignments",
67
+ # 3D Assignment
68
+ "Assignment3DResult",
69
+ "assign3d",
70
+ "assign3d_lagrangian",
71
+ "assign3d_auction",
72
+ "greedy_3d",
73
+ "decompose_to_2d",
48
74
  # Gating
49
75
  "ellipsoidal_gate",
50
76
  "rectangular_gate",
@@ -12,6 +12,7 @@ as JPDA can handle measurement origin uncertainty in cluttered environments.
12
12
  from typing import List, NamedTuple, Optional, Tuple
13
13
 
14
14
  import numpy as np
15
+ from numba import njit
15
16
  from numpy.typing import ArrayLike, NDArray
16
17
  from scipy.stats import chi2
17
18
 
@@ -314,45 +315,34 @@ def _jpda_exact(
314
315
  return beta
315
316
 
316
317
 
317
- def _jpda_approximate(
318
- likelihood_matrix: NDArray,
319
- gated: NDArray,
318
+ @njit(cache=True)
319
+ def _jpda_approximate_core(
320
+ likelihood_matrix: np.ndarray,
321
+ gated: np.ndarray,
320
322
  detection_prob: float,
321
323
  clutter_density: float,
322
- ) -> NDArray:
323
- """
324
- Approximate JPDA using parametric approach.
325
-
326
- Uses the approach from [1] which is O(n_tracks * n_meas^2).
327
-
328
- References
329
- ----------
330
- .. [1] Fitzgerald, R.J., "Development of Practical PDA Logic for
331
- Multitarget Tracking by Microprocessor", American Control
332
- Conference, 1986.
333
- """
334
- n_tracks, n_meas = likelihood_matrix.shape
335
- beta = np.zeros((n_tracks, n_meas + 1))
336
-
337
- # For each track, compute association probabilities independently
338
- # then apply correction for shared measurements
324
+ ) -> np.ndarray:
325
+ """JIT-compiled core of approximate JPDA computation."""
326
+ n_tracks = likelihood_matrix.shape[0]
327
+ n_meas = likelihood_matrix.shape[1]
328
+ beta = np.zeros((n_tracks, n_meas + 1), dtype=np.float64)
339
329
 
340
330
  # Likelihood ratio for each measurement given each track
341
- # L[i,j] = likelihood(z_j | track i) / clutter_density
342
- L = np.zeros((n_tracks, n_meas))
331
+ L = np.zeros((n_tracks, n_meas), dtype=np.float64)
343
332
  for i in range(n_tracks):
344
333
  for j in range(n_meas):
345
334
  if gated[i, j] and clutter_density > 0:
346
335
  L[i, j] = likelihood_matrix[i, j] / clutter_density
347
336
  elif gated[i, j]:
348
- L[i, j] = likelihood_matrix[i, j] * 1e10 # Large value
337
+ L[i, j] = likelihood_matrix[i, j] * 1e10
349
338
 
350
339
  # Compute delta factors (accounts for other tracks)
351
- delta = np.ones((n_tracks, n_meas))
340
+ delta = np.ones((n_tracks, n_meas), dtype=np.float64)
352
341
 
353
342
  for j in range(n_meas):
354
- # Sum of likelihood ratios for measurement j
355
- sum_L = np.sum(L[:, j])
343
+ sum_L = 0.0
344
+ for i in range(n_tracks):
345
+ sum_L += L[i, j]
356
346
  for i in range(n_tracks):
357
347
  if sum_L > 0:
358
348
  delta[i, j] = 1.0 / (1.0 + sum_L - L[i, j])
@@ -361,7 +351,6 @@ def _jpda_approximate(
361
351
 
362
352
  # Compute association probabilities
363
353
  for i in range(n_tracks):
364
- # Denominator for normalization
365
354
  denom = 1.0 - detection_prob
366
355
 
367
356
  for j in range(n_meas):
@@ -369,9 +358,9 @@ def _jpda_approximate(
369
358
  beta[i, j] = detection_prob * L[i, j] * delta[i, j]
370
359
  denom += beta[i, j]
371
360
 
372
- # Normalize
373
361
  if denom > 0:
374
- beta[i, :n_meas] /= denom
362
+ for j in range(n_meas):
363
+ beta[i, j] /= denom
375
364
  beta[i, n_meas] = (1.0 - detection_prob) / denom
376
365
  else:
377
366
  beta[i, n_meas] = 1.0
@@ -379,6 +368,31 @@ def _jpda_approximate(
379
368
  return beta
380
369
 
381
370
 
371
+ def _jpda_approximate(
372
+ likelihood_matrix: NDArray,
373
+ gated: NDArray,
374
+ detection_prob: float,
375
+ clutter_density: float,
376
+ ) -> NDArray:
377
+ """
378
+ Approximate JPDA using parametric approach.
379
+
380
+ Uses the approach from [1] which is O(n_tracks * n_meas^2).
381
+
382
+ References
383
+ ----------
384
+ .. [1] Fitzgerald, R.J., "Development of Practical PDA Logic for
385
+ Multitarget Tracking by Microprocessor", American Control
386
+ Conference, 1986.
387
+ """
388
+ return _jpda_approximate_core(
389
+ likelihood_matrix.astype(np.float64),
390
+ gated.astype(np.bool_),
391
+ detection_prob,
392
+ clutter_density,
393
+ )
394
+
395
+
382
396
  def jpda_update(
383
397
  track_states: List[ArrayLike],
384
398
  track_covariances: List[ArrayLike],
@@ -0,0 +1,24 @@
1
+ """
2
+ Three-dimensional assignment algorithms.
3
+
4
+ This module provides algorithms for solving 3D assignment problems,
5
+ which arise in multi-sensor data fusion and multi-scan tracking.
6
+ """
7
+
8
+ from pytcl.assignment_algorithms.three_dimensional.assignment import (
9
+ Assignment3DResult,
10
+ assign3d,
11
+ assign3d_auction,
12
+ assign3d_lagrangian,
13
+ decompose_to_2d,
14
+ greedy_3d,
15
+ )
16
+
17
+ __all__ = [
18
+ "Assignment3DResult",
19
+ "assign3d",
20
+ "assign3d_lagrangian",
21
+ "assign3d_auction",
22
+ "greedy_3d",
23
+ "decompose_to_2d",
24
+ ]