nrl-tracker 1.6.0__py3-none-any.whl → 1.7.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 (75) hide show
  1. {nrl_tracker-1.6.0.dist-info → nrl_tracker-1.7.1.dist-info}/METADATA +14 -10
  2. {nrl_tracker-1.6.0.dist-info → nrl_tracker-1.7.1.dist-info}/RECORD +75 -68
  3. pytcl/__init__.py +2 -2
  4. pytcl/assignment_algorithms/__init__.py +28 -0
  5. pytcl/assignment_algorithms/gating.py +10 -10
  6. pytcl/assignment_algorithms/jpda.py +40 -40
  7. pytcl/assignment_algorithms/nd_assignment.py +379 -0
  8. pytcl/assignment_algorithms/network_flow.py +371 -0
  9. pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
  10. pytcl/astronomical/__init__.py +35 -0
  11. pytcl/astronomical/ephemerides.py +14 -11
  12. pytcl/astronomical/reference_frames.py +110 -4
  13. pytcl/astronomical/relativity.py +6 -5
  14. pytcl/astronomical/special_orbits.py +532 -0
  15. pytcl/atmosphere/__init__.py +11 -0
  16. pytcl/atmosphere/nrlmsise00.py +809 -0
  17. pytcl/clustering/dbscan.py +2 -2
  18. pytcl/clustering/gaussian_mixture.py +3 -3
  19. pytcl/clustering/hierarchical.py +15 -15
  20. pytcl/clustering/kmeans.py +4 -4
  21. pytcl/containers/base.py +3 -3
  22. pytcl/containers/cluster_set.py +12 -2
  23. pytcl/containers/covertree.py +5 -3
  24. pytcl/containers/rtree.py +1 -1
  25. pytcl/containers/vptree.py +4 -2
  26. pytcl/coordinate_systems/conversions/geodetic.py +272 -5
  27. pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
  28. pytcl/coordinate_systems/projections/projections.py +2 -2
  29. pytcl/coordinate_systems/rotations/rotations.py +10 -6
  30. pytcl/core/validation.py +3 -3
  31. pytcl/dynamic_estimation/__init__.py +26 -0
  32. pytcl/dynamic_estimation/gaussian_sum_filter.py +434 -0
  33. pytcl/dynamic_estimation/imm.py +14 -14
  34. pytcl/dynamic_estimation/kalman/__init__.py +12 -0
  35. pytcl/dynamic_estimation/kalman/constrained.py +382 -0
  36. pytcl/dynamic_estimation/kalman/extended.py +8 -8
  37. pytcl/dynamic_estimation/kalman/h_infinity.py +2 -2
  38. pytcl/dynamic_estimation/kalman/square_root.py +8 -2
  39. pytcl/dynamic_estimation/kalman/sr_ukf.py +3 -3
  40. pytcl/dynamic_estimation/kalman/ud_filter.py +11 -5
  41. pytcl/dynamic_estimation/kalman/unscented.py +8 -6
  42. pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
  43. pytcl/dynamic_estimation/rbpf.py +589 -0
  44. pytcl/gravity/spherical_harmonics.py +3 -3
  45. pytcl/gravity/tides.py +6 -6
  46. pytcl/logging_config.py +3 -3
  47. pytcl/magnetism/emm.py +10 -3
  48. pytcl/magnetism/wmm.py +4 -4
  49. pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
  50. pytcl/mathematical_functions/geometry/geometry.py +5 -5
  51. pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
  52. pytcl/mathematical_functions/signal_processing/detection.py +24 -24
  53. pytcl/mathematical_functions/signal_processing/filters.py +14 -14
  54. pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
  55. pytcl/mathematical_functions/special_functions/bessel.py +15 -3
  56. pytcl/mathematical_functions/special_functions/debye.py +5 -1
  57. pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
  58. pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
  59. pytcl/mathematical_functions/special_functions/hypergeometric.py +6 -4
  60. pytcl/mathematical_functions/transforms/fourier.py +8 -8
  61. pytcl/mathematical_functions/transforms/stft.py +12 -12
  62. pytcl/mathematical_functions/transforms/wavelets.py +9 -9
  63. pytcl/navigation/geodesy.py +3 -3
  64. pytcl/navigation/great_circle.py +5 -5
  65. pytcl/plotting/coordinates.py +7 -7
  66. pytcl/plotting/tracks.py +2 -2
  67. pytcl/static_estimation/maximum_likelihood.py +16 -14
  68. pytcl/static_estimation/robust.py +5 -5
  69. pytcl/terrain/loaders.py +5 -5
  70. pytcl/trackers/hypothesis.py +1 -1
  71. pytcl/trackers/mht.py +9 -9
  72. pytcl/trackers/multi_target.py +1 -1
  73. {nrl_tracker-1.6.0.dist-info → nrl_tracker-1.7.1.dist-info}/LICENSE +0 -0
  74. {nrl_tracker-1.6.0.dist-info → nrl_tracker-1.7.1.dist-info}/WHEEL +0 -0
  75. {nrl_tracker-1.6.0.dist-info → nrl_tracker-1.7.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.6.0
3
+ Version: 1.7.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,16 +63,17 @@ 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.6.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
66
+ [![PyPI version](https://img.shields.io/badge/pypi-v1.7.1-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)
70
- [![Tests](https://img.shields.io/badge/tests-1922%20passing-success.svg)](https://github.com/nedonatelli/TCL)
71
- [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-99%25-brightgreen.svg)](docs/gap_analysis.rst)
70
+ [![Tests](https://img.shields.io/badge/tests-1988%20passing-success.svg)](https://github.com/nedonatelli/TCL)
71
+ [![MATLAB Parity](https://img.shields.io/badge/MATLAB%20Parity-100%25-brightgreen.svg)](docs/gap_analysis.rst)
72
+ [![Type Checking](https://img.shields.io/badge/mypy--strict-passing-brightgreen.svg)](mypy.ini)
72
73
 
73
74
  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.
74
75
 
75
- **1,070+ functions** | **150+ modules** | **1,922 tests** | **99% MATLAB parity**
76
+ **1,070+ functions** | **153 modules** | **1,988 tests** | **100% MATLAB parity**
76
77
 
77
78
  ## Overview
78
79
 
@@ -80,12 +81,15 @@ The Tracker Component Library provides building blocks for developing target tra
80
81
 
81
82
  - **Coordinate Systems**: Conversions between Cartesian, spherical, geodetic, and other coordinate systems
82
83
  - **Dynamic Models**: State transition matrices for constant velocity, coordinated turn, and other motion models
83
- - **Estimation Algorithms**: Kalman filters (EKF, UKF, CKF, H-infinity), particle filters, and batch estimation
84
- - **Assignment Algorithms**: Hungarian algorithm, auction algorithms, and multi-dimensional assignment
84
+ - **Estimation Algorithms**: Kalman filters (EKF, UKF, CKF, H-infinity), particle filters, smoothers, and batch estimation
85
+ - **Assignment Algorithms**: Hungarian algorithm, auction algorithms, 3D/ND assignment, k-best assignments
86
+ - **Data Association**: Global Nearest Neighbor, JPDA, MHT for multi-target tracking
85
87
  - **Mathematical Functions**: Special functions, statistics, numerical integration, and more
86
- - **Astronomical Code**: SGP4/SDP4 propagation, TLE parsing, reference frames (GCRF, ITRF, TEME, TOD, MOD), ephemerides
87
- - **Navigation**: Geodetic calculations, INS algorithms, GNSS utilities
88
- - **Geophysical Models**: Gravity, magnetism, atmosphere, and terrain models
88
+ - **Astronomical Code**: SGP4/SDP4 propagation, TLE parsing, special orbits (parabolic/hyperbolic), ephemerides, relativistic corrections
89
+ - **Reference Frames**: GCRF, ITRF, TEME, TOD, MOD with full transformation chains
90
+ - **Navigation**: Geodetic calculations, INS mechanization, GNSS utilities, INS/GNSS integration
91
+ - **Geophysical Models**: Gravity (WGS84, EGM96/2008), magnetism (WMM, IGRF), atmosphere, tides, terrain
92
+ - **Signal Processing**: Digital filters, matched filtering, CFAR detection, transforms (FFT, STFT, wavelets)
89
93
 
90
94
  ## Installation
91
95
 
@@ -1,70 +1,77 @@
1
- pytcl/__init__.py,sha256=MzvSIKPmRaoieVDhHJbYHqNeZpQbRSj8sVclDiW8wbY,1893
2
- pytcl/logging_config.py,sha256=j7Zrkal5LwUIos-_Dm3cGKUR-jMkFdSZZikJTtzTeoE,8883
3
- pytcl/assignment_algorithms/__init__.py,sha256=f9V-TkEVmiKYYyth4PTpDfJvA7yYV_ys6Zix-QwWIYY,2136
1
+ pytcl/__init__.py,sha256=D_1fbPoeFtHLuB6SNcd93hfT0L4rTW4zn1UY1YlIcxE,1917
2
+ pytcl/logging_config.py,sha256=UJaYufQgNuIjpsOMTPo3ewz1XCHPk8a08jTHyP7uoI4,8956
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/gating.py,sha256=fN_oAOkv7nYYOWE1oPOLrcCn3xEpKdMVlFSbRMAURxY,10815
6
- pytcl/assignment_algorithms/jpda.py,sha256=Hv55j3J9qVwzlUfWdXdSasodTyB1ZKdgEpo5dBh95O8,19582
5
+ pytcl/assignment_algorithms/gating.py,sha256=AXWn-F_EOGI6qrBc4PN5eFM-ZZGu1WOMi5b5ZsxValU,10910
6
+ pytcl/assignment_algorithms/jpda.py,sha256=8-HoO2VygxJ8FFSCCOIOfbhMAn87jU7PqVvd7lQ3GEY,19797
7
+ pytcl/assignment_algorithms/nd_assignment.py,sha256=RBRoXoJnUY0lB9Vb_dwvQtwh6oI31KfeDqpaNrTNXzk,11344
8
+ pytcl/assignment_algorithms/network_flow.py,sha256=tmNOHdrRfo30T8UXZ0A_icDdVDgQCShdbXEt9HY0p1w,10325
7
9
  pytcl/assignment_algorithms/three_dimensional/__init__.py,sha256=1Q40OUlUQoo7YKEucwdrSNo3D4A0Zibvkr8z4TpueBg,526
8
- pytcl/assignment_algorithms/three_dimensional/assignment.py,sha256=9BJhwlYu3JJ0kZ9sRyKKfpdvQdL4WYYHCtLbvaWycBw,19212
10
+ pytcl/assignment_algorithms/three_dimensional/assignment.py,sha256=OGcjg3Yr1tYriWYBJ5k6jiRMpOHDISK8FJDY0nTQxxw,19244
9
11
  pytcl/assignment_algorithms/two_dimensional/__init__.py,sha256=4Evsn__9hTfI2i8m8Ngl-Zy0Fa2OydKmDKlZlH6jaao,778
10
12
  pytcl/assignment_algorithms/two_dimensional/assignment.py,sha256=eh87MBb-uiUSI1MXj4HrreRKB6Z8rxAyDkNQ8-u4SbM,11848
11
13
  pytcl/assignment_algorithms/two_dimensional/kbest.py,sha256=yiTToLuP7xWxQlQ8E-fpgXg-5iu0nnXcJXStjUB0nOE,17284
12
- pytcl/astronomical/__init__.py,sha256=UhEIWbTaP0VbdTfnazzbG3kgDmBzoMjfGtVVowV7frE,8623
13
- pytcl/astronomical/ephemerides.py,sha256=x2500S0rF1D2h0dMR_2BnZaChbBZTooHLdrevttxlAc,16471
14
+ pytcl/astronomical/__init__.py,sha256=-uPsKb4kWMs_16i_Yurmh8JLpcBLGfw-QyM2eMJRRAQ,9737
15
+ pytcl/astronomical/ephemerides.py,sha256=nQSbcipQ_IhPv1R-Q0-iPlfTCb4x2KdfVjwc0c_YeeE,16705
14
16
  pytcl/astronomical/lambert.py,sha256=Lc8FT1JmpI9WSXsG2s5vIRkSoBSV7r5hd3o2bGh2Ojo,15607
15
17
  pytcl/astronomical/orbital_mechanics.py,sha256=8GssRanwTowCl6PJYqmB_SDnNznLUq5gkPa3j6iEo3U,19965
16
- pytcl/astronomical/reference_frames.py,sha256=T1hXefW68r2Fh7QW4HhGYeXo_B6VMYMhi4jl-s3sG0U,33168
17
- pytcl/astronomical/relativity.py,sha256=YPsXLD-VRh-nqs1laC-wKpRO00fflm4GkyLhojPydbo,15441
18
+ pytcl/astronomical/reference_frames.py,sha256=MBqprzBpEvdq3ngRL-_pp-Vnj7AqbuXhjUfGQ98znfc,35616
19
+ pytcl/astronomical/relativity.py,sha256=deuzBIINS4HimCwNU0_mzlHiB2nJ3AW8PnqtpzTw5_I,15534
18
20
  pytcl/astronomical/sgp4.py,sha256=iNZrqMRUzR-LFeZiluzlNmkwxeYbIyF2F1cygyeEZVE,21546
21
+ pytcl/astronomical/special_orbits.py,sha256=N54c_wAD7XKk_diDOw2QjUSkmYECMyWQDq2P6EeEBEI,12745
19
22
  pytcl/astronomical/time_systems.py,sha256=Jg0Zaq60hc4Ts1aQtb5bK4KSZhz-uQse8gYC89Y0-TA,15243
20
23
  pytcl/astronomical/tle.py,sha256=t3e2-0f3Wiz77q-pC2jfpohkrDfoYOEHacpNgWMNLAk,14638
21
- pytcl/atmosphere/__init__.py,sha256=swugW8rY2Jof-z_kPQ2P9vInBYjr1M69C1Q8AgN3RVo,1457
24
+ pytcl/atmosphere/__init__.py,sha256=Joa6PBEfKun0Moii6BOzyVYG8AOFyvucKdVuY62ArQc,1685
22
25
  pytcl/atmosphere/ionosphere.py,sha256=1qC3hY-27pD0XcLBjU735deKYmmi6qnj2fDG1zNbTqg,14681
23
26
  pytcl/atmosphere/models.py,sha256=pMLv8D7qoFqLZrlbTHLJJULOdDdhPskJ1m7KVKLV63E,9584
27
+ pytcl/atmosphere/nrlmsise00.py,sha256=jcmAC00G3X0CzfK4eWkvq2tPxHXzMqC8GBHNbFZRq4w,25868
24
28
  pytcl/clustering/__init__.py,sha256=bYdhC_XJEt6KUUni9bIPxaddXNEGmIJQvGkA14rK4J8,1697
25
- pytcl/clustering/dbscan.py,sha256=PS6QlOwHFerbZNEb3zcNhN4oNQpgOOw5y0WskQzyKIo,7364
26
- pytcl/clustering/gaussian_mixture.py,sha256=U5U0Z46tZWdTLNdNNNJenoeviwZRAOvexVFYVLt4QMc,22865
27
- pytcl/clustering/hierarchical.py,sha256=Hw9BFCn5df_ATpJX63R3B31MHz27ztCw9ihMDIlI688,14202
28
- pytcl/clustering/kmeans.py,sha256=250FQyDol5S_Y4TznNn9cEuE96UDp7wvEkPZJ1DLul8,10697
29
+ pytcl/clustering/dbscan.py,sha256=WgzYz_f5nDh0T1RPClX9b3xSvFPmLxY6QaI2NCtxJg4,7389
30
+ pytcl/clustering/gaussian_mixture.py,sha256=UAI2_WG2RASA0N2PIZ0EZgqYZ3yly7oJBSJWSJnm_bE,22904
31
+ pytcl/clustering/hierarchical.py,sha256=K7z6bZR4QSDMva9kaqEOjdktl8unMK1wyCJm3cFN8pQ,14292
32
+ pytcl/clustering/kmeans.py,sha256=GNvgaGP53LKr4-fh-UajxbjCi0jWCCLJba23EGcQq4I,10712
29
33
  pytcl/containers/__init__.py,sha256=jZAZb0VUft5gjQghfg2S9PD-LsA5xgtXkc0mAS_Gnmk,2428
30
- pytcl/containers/base.py,sha256=h3h5mJfSn8yTy1waFZRUxJQ9eHQ5npbimadFbFZuuV4,5520
31
- pytcl/containers/cluster_set.py,sha256=y36D5TNzvCN6xjg6taP2SD_MC-O5iLq9ncBlHsQ5IBs,22723
32
- pytcl/containers/covertree.py,sha256=ePIqH1-0CxSFqCwmQ_G6MXPlXs4xH0gsmoZXF8QxhDk,13271
34
+ pytcl/containers/base.py,sha256=UL-RXobVlZCZ5H3Xdo_TzcJQANNsIVQeynKHhLGxRVE,5545
35
+ pytcl/containers/cluster_set.py,sha256=uhfOIpXlYoI1U75TWcLMHjezVavnIZhVEGQHKCDmKo4,22774
36
+ pytcl/containers/covertree.py,sha256=SKiosZnJ9bvAaANDKQSbDUqL2BnIno-1D8TbOWDM3m0,13337
33
37
  pytcl/containers/kd_tree.py,sha256=9CKHAzid0DZ879hut8M4dyW_976pIWNLX3uWzELPIu4,18563
34
38
  pytcl/containers/measurement_set.py,sha256=87AbdoZIUspn1yJsiMpyQ5LoEVcerUnXefXGGPtFTJg,12654
35
- pytcl/containers/rtree.py,sha256=Ss1ks6xlLnNeRlKpHoWxMcgQTPhVwjT5agMeq5DaH5A,21844
39
+ pytcl/containers/rtree.py,sha256=SGlnEG6q670qxO9P_jDT7yocjYmdal8f22SvEXdvw9E,21857
36
40
  pytcl/containers/track_list.py,sha256=6q9Qgcwm-8H_JqtOCsMssF27av4XaSkhfDl-MWb1ABc,12520
37
- pytcl/containers/vptree.py,sha256=4tUq0ktafusU1PILZkQxi27CZryKlsHtFbym-vZYQWk,8747
41
+ pytcl/containers/vptree.py,sha256=eFBX2-sm_lgqON18uM4MEk4I4_sRgoPla29cTJFy_Xo,8800
38
42
  pytcl/coordinate_systems/__init__.py,sha256=jwYhu_-9AvOeP9WLG9PYtyDwfe0GjxNZ9-xCqiLymW4,3909
39
43
  pytcl/coordinate_systems/conversions/__init__.py,sha256=PkNevB78vBw0BkalydJBbQO91AyiMJxKRrgJNt4HsYc,1100
40
- pytcl/coordinate_systems/conversions/geodetic.py,sha256=qQSnJRt3jg5KiostvzyslPIbfn-1xBluo1r12oavWTQ,15737
44
+ pytcl/coordinate_systems/conversions/geodetic.py,sha256=rRRf4MWBkGj3VTN1WRW3lrlw4Yf9a4HH3UCgNOGjbJ0,23460
41
45
  pytcl/coordinate_systems/conversions/spherical.py,sha256=q7k9l5mJbVzVdNj9Gcq4ibFxax8z_mVpJfITRBzx630,10812
42
46
  pytcl/coordinate_systems/jacobians/__init__.py,sha256=CRGB8GzvGT_sr4Ynm51S7gSX8grqt1pO1Pq1MWmHPTs,890
43
- pytcl/coordinate_systems/jacobians/jacobians.py,sha256=1KufIoktm9mXLO34X9KjysdMpu7itGwfssRyAdkTTN8,11703
47
+ pytcl/coordinate_systems/jacobians/jacobians.py,sha256=0gpbelZPN4HDtvS1ymc3RIhOfxCVTKpRc-jDJXdM6pQ,11747
44
48
  pytcl/coordinate_systems/projections/__init__.py,sha256=eWNtezPO62IUWxv7jymenIXsWS1MC66Q12u5KRUnqNE,2503
45
- pytcl/coordinate_systems/projections/projections.py,sha256=yODS7n1gA4jsCJcU8EaeclHrbUBsZI9O2M_XJs2HOXs,33169
49
+ pytcl/coordinate_systems/projections/projections.py,sha256=y_kwcu_zp0HHiKR-wp3v3AvRcY61bleDi1SxwbrnWB0,33179
46
50
  pytcl/coordinate_systems/rotations/__init__.py,sha256=nqAz4iJd2hEOX_r7Tz4cE524sShyxdbtcQ5m56RrDLg,1047
47
- pytcl/coordinate_systems/rotations/rotations.py,sha256=FAYHkShQcpOlWJjtvLfNvtCx-a56pr-cbpo0QjC5W9U,18227
51
+ pytcl/coordinate_systems/rotations/rotations.py,sha256=2KK6Lgpfmjac3qfOMvHku_BcwGOgkRC13BZbSCUvfwQ,18314
48
52
  pytcl/core/__init__.py,sha256=3GFQX_Q9f7fhmWlA6OQiS6OpM7HWhyT9iQhB8Mhi_kk,1580
49
53
  pytcl/core/array_utils.py,sha256=SsgEiAoRCWxAVKq1aa5-nPdOi-2AB6XNObu0IaGClUk,13983
50
54
  pytcl/core/constants.py,sha256=lZVDK5zsSR02_4b2Nqx9KDtZT9QaYhkZ9wuoODbifd4,8693
51
- pytcl/core/validation.py,sha256=nUmG8UmUk85dQ4CxJRipACb8zjsrAJPiyK8ADZN_KvU,23426
52
- pytcl/dynamic_estimation/__init__.py,sha256=jA5FF6kHYklY5LMOfZaKcCeiPTpVe8vHIMp3ECDOmsc,4582
53
- pytcl/dynamic_estimation/imm.py,sha256=IbKmouUiyzaYJbhWty63r3n_xV8thD-wd0qgZP1SxOI,22067
55
+ pytcl/core/validation.py,sha256=9Pjn2wOYmGLJDSA8eS2aGTCGO16o5l2xioOHamNXuIg,23441
56
+ pytcl/dynamic_estimation/__init__.py,sha256=zxmkZIXVfHPv5AHYpQV5nwsI0PA3m-Vw7W0gkJE7j98,5191
57
+ pytcl/dynamic_estimation/gaussian_sum_filter.py,sha256=rxUy_WapTL_pkGimD01DqYE7fElLS_DljnX2yg95Uts,13620
58
+ pytcl/dynamic_estimation/imm.py,sha256=RLSFPTMDsudxSf9Mh6Q5qD852tq9lRoCTvFCGphezhs,22152
54
59
  pytcl/dynamic_estimation/information_filter.py,sha256=x7iQwO_iJT1dCSvDws5LqD3yAtjw9QVGUfMPcXn1IA4,17349
60
+ pytcl/dynamic_estimation/rbpf.py,sha256=CaKSD2TC1sxICnHuN1W2v2S7P-Kxi4lxdy4KRq2We3w,17898
55
61
  pytcl/dynamic_estimation/smoothers.py,sha256=x2j-nR--EI5JNZvMywPeDHcrfW8b5PYK0DCU4Rmig_g,18914
56
62
  pytcl/dynamic_estimation/batch_estimation/__init__.py,sha256=JQ0s76Enov5a7plA4EnUua4t-7etikQrwr5z4WIjUeo,46
57
- pytcl/dynamic_estimation/kalman/__init__.py,sha256=z4y3nsk-AaQXq8YkFdNYePz11lMi-81l-zYYLSq37s0,2827
58
- pytcl/dynamic_estimation/kalman/extended.py,sha256=51uhCqkZmErCx6MBfMq8eIQW8bD7n34zCe4v4dxNiMQ,10384
59
- pytcl/dynamic_estimation/kalman/h_infinity.py,sha256=ZfVuhMd4wtd6GDYdyECkm2y_PhPOKSHWn6X4vuoLGqY,16502
63
+ pytcl/dynamic_estimation/kalman/__init__.py,sha256=lR-OacfZ5mqnAboEbOel5w_WS_Gmz-1q0l4meKfQsGs,3163
64
+ pytcl/dynamic_estimation/kalman/constrained.py,sha256=Zidzz6_9OvwUyQppEltdmYTMvEeqRKFRkVMwx1TASuw,10960
65
+ pytcl/dynamic_estimation/kalman/extended.py,sha256=fxi2-oq8qxnxZqPmjB8-Am03z6_F_R90wwFcOIEk_dg,10459
66
+ pytcl/dynamic_estimation/kalman/h_infinity.py,sha256=rtbYiryJbxzko-CIdNJSHuWXU2wI9T52YGBYq3o92sE,16563
60
67
  pytcl/dynamic_estimation/kalman/linear.py,sha256=1Zgg9gZya0Vxs9im7sPUqLj0Luo463vS-RSa6GCReFI,12248
61
- pytcl/dynamic_estimation/kalman/square_root.py,sha256=N7-lDml7Nw5HM5b5D11WOwG7rY1JlVoyis0ho-vk0H4,13345
62
- pytcl/dynamic_estimation/kalman/sr_ukf.py,sha256=LeRGBSDpvSP9CyTZjEroz2Z2uueb6YpmzYricba0PDk,8640
63
- pytcl/dynamic_estimation/kalman/ud_filter.py,sha256=fzSdcVO_P8-E2oXc32n79Rn56GI2VUmOoMDYBHw7keM,10077
64
- pytcl/dynamic_estimation/kalman/unscented.py,sha256=RDK6USkko9lj1K4-WYydh3_8GMZNng_PJVjfc-c_OwM,15427
68
+ pytcl/dynamic_estimation/kalman/square_root.py,sha256=pDEDstYIQht5e7ahD6x13UfSVIUWMe4jRR4z6j687vw,13457
69
+ pytcl/dynamic_estimation/kalman/sr_ukf.py,sha256=xlKRML6QOHD99P-urIeBZsBDc_DY1_U73W3eDkiqRRY,8737
70
+ pytcl/dynamic_estimation/kalman/ud_filter.py,sha256=j56gw-piKJaMtoHWRkr2MiBjOC9tGSguIgFregOMJOs,10269
71
+ pytcl/dynamic_estimation/kalman/unscented.py,sha256=G3Ks6fa_Z-MxUdOEiiHqQ1wYJzOgfuipiP32at6Mv8o,15505
65
72
  pytcl/dynamic_estimation/measurement_update/__init__.py,sha256=8rlyJwVpxf0fZj-AFo1hlewvryZRhUzcy3F8uMe6I8c,48
66
73
  pytcl/dynamic_estimation/particle_filters/__init__.py,sha256=-DRF5rVF2749suLlArmkTvVkqeMcV_mIx0eLeTj6wNU,906
67
- pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=FcF4W_NM5ZqJnw5fq4rq6fLY9X1r4uFJOiAX9a-NGG8,13371
74
+ pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=6KSLZROxfrldExpDL1GaGhd75IXO5KA8iC-kmhuUBkg,13531
68
75
  pytcl/dynamic_models/__init__.py,sha256=Cd8MyyYuB8gMnepkPA-HSwTaKFPThnqoKOhdjVOsXWg,2783
69
76
  pytcl/dynamic_models/continuous_time/__init__.py,sha256=dAkfEddLkfMvDalK9v2GRBvaZV1KgqYpFBLOnoiFClw,1023
70
77
  pytcl/dynamic_models/continuous_time/dynamics.py,sha256=CDwqn-66eUwXA5xfIjaG6A4EDBqtOyQ3aWarJr9QH4g,12858
@@ -80,50 +87,50 @@ pytcl/gravity/__init__.py,sha256=5xNdQSrrkt7-1-JPOYqR38CqvNJ7qKlPyMK36DGm6-I,369
80
87
  pytcl/gravity/clenshaw.py,sha256=1BdxzU8IfGGd68H_U35soIJkiOHphY35e9mLElhPTOg,15364
81
88
  pytcl/gravity/egm.py,sha256=47I8nyXNhXUKPkufXahs4JGsBcqhM-9z2xGz0X4JPmU,18422
82
89
  pytcl/gravity/models.py,sha256=rdY3Do4M1eRFO74gu3xy-bBn7tox3zM49wYbfnsIQWw,11159
83
- pytcl/gravity/spherical_harmonics.py,sha256=IpBh0LW4BQMzJck9Li6yveGlvYigCuXaoApRWDPsWtc,16498
84
- pytcl/gravity/tides.py,sha256=hef_BGewFGD7dJwg0t09Z6tfWLco_avATLuu66rnTpI,27733
90
+ pytcl/gravity/spherical_harmonics.py,sha256=FV_cFp0lx6uGw-dxNFRpehaAn28QImX9z7PFdyRbEJI,16549
91
+ pytcl/gravity/tides.py,sha256=nu9_L12aBd2EpmTMh3UulmYCUxQ9wC4kOpdSIn7f0Z8,27785
85
92
  pytcl/magnetism/__init__.py,sha256=pBASOzCPHNnYqUH_XDEblhGtjz50vY9uW2KS25A0zQQ,2701
86
- pytcl/magnetism/emm.py,sha256=5Jwl99wvdKYtx1-3LBB7x-w5KT-fqLiRg7uBW0Ai_Gw,22292
93
+ pytcl/magnetism/emm.py,sha256=iIdxSL0uGGIf8nfA-c_SmHvg9_J7HwRA2-qbQIUW6IE,22380
87
94
  pytcl/magnetism/igrf.py,sha256=3g0PsH8IdbwQQS28OR5XWD-g-QxvfUva7jOkKToxndQ,13384
88
- pytcl/magnetism/wmm.py,sha256=q7AJrpOrn1EBbWNjltPxhGEwg3P44ay1pc4dI5OIyUY,23444
95
+ pytcl/magnetism/wmm.py,sha256=7YsxnBmxeH5WnTTZ3VE91gr55Qq-OvVmBRAMbqlhGVg,23479
89
96
  pytcl/mathematical_functions/__init__.py,sha256=zeJ1ffRRl83k2NHn3HTn-fgtFoWNPq6LCALc3xRo4Do,3767
90
97
  pytcl/mathematical_functions/basic_matrix/__init__.py,sha256=kZv3kMAEHBdVxhbyMxTyM0s-4XJP1tK6po82UsIE4tc,1318
91
98
  pytcl/mathematical_functions/basic_matrix/decompositions.py,sha256=PWJsFDiXM2T78RHdxBJZPFnl8kFbNZQpHrbpw0mhE00,12268
92
99
  pytcl/mathematical_functions/basic_matrix/special_matrices.py,sha256=kOozwP2CHAj4qyO7Z9ct6GwDMkmHkk1bQa0e9G98FgA,13499
93
100
  pytcl/mathematical_functions/combinatorics/__init__.py,sha256=byuHI0WkxOkQF8egrfjEr-awB2visWDXlGMnDux5IBg,1043
94
- pytcl/mathematical_functions/combinatorics/combinatorics.py,sha256=3EgkWdBqQ9e6JU34bec9EeCEmB-46tUSXXTAJrckSO4,12314
101
+ pytcl/mathematical_functions/combinatorics/combinatorics.py,sha256=LzVxY3E5_pnpVl9XlcRdQjWhSSY8Fa1JUVYA6J25fro,12354
95
102
  pytcl/mathematical_functions/continuous_optimization/__init__.py,sha256=lck60eeCUOsRpEzPHBY3kiLKwNz_fhmYoUGP3lTmTwk,55
96
103
  pytcl/mathematical_functions/geometry/__init__.py,sha256=DhCmux9-6zxYRzlhQ9du18kvUL-leiiZwdd3Cmb5WX0,1092
97
- pytcl/mathematical_functions/geometry/geometry.py,sha256=l63wQnhCtJwVHZOJeONX1qyJ5Sedji8etgxwJCFtH8Y,16403
104
+ pytcl/mathematical_functions/geometry/geometry.py,sha256=iLKqTlLEGm8IScEDHEWOBQz5xfj-fflzIOzZaJ8fPtE,16522
98
105
  pytcl/mathematical_functions/interpolation/__init__.py,sha256=lK4Rs0Ds_fzf9q0n6id5epdN0U8V7yD87dS-w1hvN8I,741
99
106
  pytcl/mathematical_functions/interpolation/interpolation.py,sha256=2cXMDgWBjWDGHnK1K_lawFlJL8oPl5AQGf9MNgsESfo,12610
100
107
  pytcl/mathematical_functions/numerical_integration/__init__.py,sha256=iXiHzyV_KIhCv7tXErXlN1_fUEACN6yN3CYDHRA7esw,974
101
- pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=ZRMKs0vbcgFDe1Sr8sjyEOkALLmJU4zKRJjoPEcXrUc,15670
108
+ pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=3MwNCjdMfopgtJjXWxn-q9VyawI1IArkNBXqa_kRMj4,15716
102
109
  pytcl/mathematical_functions/polynomials/__init__.py,sha256=WJWZcoQhnvy5f59-kncMTgD9mCtgwfDgULvDYYHS5ys,43
103
110
  pytcl/mathematical_functions/signal_processing/__init__.py,sha256=_SzzBVtxmSvP8FKeogRdNmFo8FOVDDoexVOqd-lE7do,2325
104
- pytcl/mathematical_functions/signal_processing/detection.py,sha256=9F0xdy3hMat1czSWAQYMExn0kY5DBRpyBneAfjjHUVI,30377
105
- pytcl/mathematical_functions/signal_processing/filters.py,sha256=8Ojf4h4rfiucBXqUmB1odvHH41Gf3rPwmWCMKb-qzWk,23435
106
- pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=AahJZRZk2IIXzRL7www0n8bc0XoKabaLOe8yYNSjuDY,22893
111
+ pytcl/mathematical_functions/signal_processing/detection.py,sha256=1Uok0p82t2zB7BWZB6GEkUCwuoM3WB8SRykTrVRdsIo,30612
112
+ pytcl/mathematical_functions/signal_processing/filters.py,sha256=xiB8VSFqTFkBCAom0yIWw7pK3Zjm6l-VZ_DAtwJMxFA,23676
113
+ pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=El7XcUbunmXA7s-btXX_R4fgNx8d6QNa86GJETg4zAQ,23134
107
114
  pytcl/mathematical_functions/special_functions/__init__.py,sha256=AJBCKj32daQxdahUQckW0bWowzOoapxni2eZnVXERdg,3859
108
- pytcl/mathematical_functions/special_functions/bessel.py,sha256=M0mwLQBaUXEHA8wyKReJ2D66I1v1XR7y-txAipd-WDs,14377
109
- pytcl/mathematical_functions/special_functions/debye.py,sha256=5u-2KIQniwoVlqGSQguYhO7RcFQXtvY0aetiDiMYtQ0,9576
115
+ pytcl/mathematical_functions/special_functions/bessel.py,sha256=Xe62y2vrDwdJy3fR4U8_e8TAgisXIWJ94J7wu_xk0kI,14603
116
+ pytcl/mathematical_functions/special_functions/debye.py,sha256=eH7Y5qq5j-AMKKx7y8uMS_l_pb6z9_3SG6Igvnc1Fdg,9626
110
117
  pytcl/mathematical_functions/special_functions/elliptic.py,sha256=WyzBkrfZufIR5dUmCKGcxp6KNpVDrU89NGLDyRrZOqQ,7418
111
- pytcl/mathematical_functions/special_functions/error_functions.py,sha256=a3SS8FYAMRv1KdCmebOZL95yjvVt9gZRF2XOjHvQ9M8,6253
112
- pytcl/mathematical_functions/special_functions/gamma_functions.py,sha256=xXN_9SCokH10HjE8PpaPKHYVK_RZRHRAbZgR2mZYIAA,10191
113
- pytcl/mathematical_functions/special_functions/hypergeometric.py,sha256=5C4dXv3XxjyeGGVH-0i22NSLbAqkcPTR3kZ2J_GTles,11364
118
+ pytcl/mathematical_functions/special_functions/error_functions.py,sha256=24-XRcAW-KF6ixEU5V7iB7brD8UVPPQ0b4Zz8gscRdw,6321
119
+ pytcl/mathematical_functions/special_functions/gamma_functions.py,sha256=XB7NHVgKzOEVKpUScqvG3L220bvwIRuUnm_ayO7lJRk,10243
120
+ pytcl/mathematical_functions/special_functions/hypergeometric.py,sha256=mCBf5NPl0mOkwvIwAUp-sbXshin5HyGsdqEeGbYt3wQ,11428
114
121
  pytcl/mathematical_functions/special_functions/lambert_w.py,sha256=ivRc4KH5Lwoxb_yijrJEwG0ITa0hhcYF7_gCfVBBNW4,6855
115
122
  pytcl/mathematical_functions/special_functions/marcum_q.py,sha256=OZ5QjIB1e_XvRG8A-3dbZ13YXHtdk2EYVEPaqtgVr14,9580
116
123
  pytcl/mathematical_functions/statistics/__init__.py,sha256=dfypStgmnFmOrnWcm-3CEvLinONHraFgx9O66_37bqw,1278
117
124
  pytcl/mathematical_functions/statistics/distributions.py,sha256=icfFIIKCEFzkpFHuYGWL197nm8wvS7UPJlr9kd_uEgw,19373
118
125
  pytcl/mathematical_functions/statistics/estimators.py,sha256=TLnYXSwk5MzBakZrzDBupbOB3ONmJI7q1-oB2xuSVQM,10831
119
126
  pytcl/mathematical_functions/transforms/__init__.py,sha256=SPXSKHjqR6B_8pvgtbtOnEiCpU-u0JF2s7hAlhb0BbI,2343
120
- pytcl/mathematical_functions/transforms/fourier.py,sha256=QH6OaTzw4kN6M-DuSmwB_5b-wu_4yP5I2CUmNEyLORM,20737
121
- pytcl/mathematical_functions/transforms/stft.py,sha256=zQapXl-v69_RDPwMqci83jah17GyAfnr3gx0budv2Cg,18619
122
- pytcl/mathematical_functions/transforms/wavelets.py,sha256=dm273Z_t13BlEVSlHTaGE7jR1ocugL7lEkcO499U7bY,21656
127
+ pytcl/mathematical_functions/transforms/fourier.py,sha256=yD1CcH7sdPlrOmBgL7JoMiPNgN8ee7bTwvblgRRf7l4,20823
128
+ pytcl/mathematical_functions/transforms/stft.py,sha256=olDzNH02Nta5GoeEdsdX1tTVKODr6OxLEYt_h3ZtMgA,18878
129
+ pytcl/mathematical_functions/transforms/wavelets.py,sha256=g7ra-uk-HnQmJRCj1VvJuuz8t8FW55kCENUkx0vPrP4,21807
123
130
  pytcl/misc/__init__.py,sha256=SCHf_lQVfdl2gwUluHBiIloTF8HRH8EkgYfbNr7zOug,33
124
131
  pytcl/navigation/__init__.py,sha256=k1_x_FnnPrIzGeNu7zejPtPubIhweBgCfwqlZJEMw0I,6042
125
- pytcl/navigation/geodesy.py,sha256=KXRQqOrJGbxWQ4yrZI9jfMDvaoUx_4RL8mTWUHhBJX0,19694
126
- pytcl/navigation/great_circle.py,sha256=y5YHBie21j1a1ac7OziEgg_jgUT1FpltgkTA5AGFGsk,23251
132
+ pytcl/navigation/geodesy.py,sha256=zrpFhPFLr3N1byeE1pxXh-SmPixjuuoGK3_izEnAAdw,19719
133
+ pytcl/navigation/great_circle.py,sha256=u8iqMV6RNsAyzATzjJU11QFGA2pGEaiFJRakQwxTTs0,23326
127
134
  pytcl/navigation/ins.py,sha256=OIi8_RjrgEYl0MFpJEFMjIlpgX8DYGTEhdLEvqG-ABU,31151
128
135
  pytcl/navigation/ins_gnss.py,sha256=euKF5JGgwmVBsw3jBf7_wa2z1BpZeVbSNmBuwzhGS6c,30157
129
136
  pytcl/navigation/rhumb.py,sha256=lr1c3iEXfoOSfIyyXSRWv6He5TlaxEHbJy-dhqM1gRw,18224
@@ -132,27 +139,27 @@ pytcl/performance_evaluation/estimation_metrics.py,sha256=X1ZCpp8m6DV14N2wbMvlRw
132
139
  pytcl/performance_evaluation/track_metrics.py,sha256=Nd3royJkAelZV-Qggl8i72e7WocCxWomgliArvVAEkc,13342
133
140
  pytcl/physical_values/__init__.py,sha256=SGbg6b0d4dWebE3baW4OlJshL00grG5E4wABw6jxl20,44
134
141
  pytcl/plotting/__init__.py,sha256=YtYnKYHL5lN6EaT_bwwR3h89NW0HSMToIWHhHBxcidY,3126
135
- pytcl/plotting/coordinates.py,sha256=h39H855Qjqtcly62m09demaOFpfMs_8EF_nXhoLBSBs,17198
142
+ pytcl/plotting/coordinates.py,sha256=lTNBwlq_4hnQx_w6RIX6X35Ke3YMFvqV_huJrcFCvNs,17362
136
143
  pytcl/plotting/ellipses.py,sha256=bcns6dfNK4bwA_QBshscYhbAz_5wegwyqjDzzoUdWsQ,12465
137
144
  pytcl/plotting/metrics.py,sha256=zbJr5P2kQg7-rGpGHsN7rC02S0JLOpPUZeoscQem7uQ,18148
138
- pytcl/plotting/tracks.py,sha256=cqZG71ZHM-wDSzjH4I4kCESORIiZjmGesQtADmAi4gc,23034
145
+ pytcl/plotting/tracks.py,sha256=3V_78oPEGi7lsTNk-lhYRffXWNHH0-Lj2oNw2HIKRJQ,23054
139
146
  pytcl/scheduling/__init__.py,sha256=jTqMSKcsCrWU_Fh6WaT6BW5WatNHyyEYjFbsv6X18Oc,39
140
147
  pytcl/static_estimation/__init__.py,sha256=sSEhqq35jq_MpRLnBtWjKXwGZ9dqIw71iwji-TNwXmc,2222
141
148
  pytcl/static_estimation/least_squares.py,sha256=8ouOyRGC7K-W8fynZMWlc2-KAFojvTbuzcqi5uS_sVA,13432
142
- pytcl/static_estimation/maximum_likelihood.py,sha256=P6BKMcuzzDu_Qc6mX9KLI-zPWFX_NabbA6AKYjkNBcY,21581
143
- pytcl/static_estimation/robust.py,sha256=egBLKWmo6d9PzP6LDh0J7ee4j6hYZh8kAb9TR5uC2so,18527
149
+ pytcl/static_estimation/maximum_likelihood.py,sha256=nt1WShfZ0PlT_eA4gu2WcLiz9zZO9r90m_1PhWqDDgY,21821
150
+ pytcl/static_estimation/robust.py,sha256=mpDUcc3-8F42SVGxXMv20huzekoGWattAa4px9tAZNM,18623
144
151
  pytcl/terrain/__init__.py,sha256=e7plNQI5Y_jpZ24r82AgqdX0ChmmyYoeT7HReclnGXc,3228
145
152
  pytcl/terrain/dem.py,sha256=rg2o0h0ZDrfxvtYhnE2A5tdzRnCmqcihu4w1uNJdH3Y,20814
146
- pytcl/terrain/loaders.py,sha256=KBs1vdYUYW-0ETIujRv4-WxO-bExZk-FvPLY5l6gyTc,27028
153
+ pytcl/terrain/loaders.py,sha256=FGRnyzKh03LrpXICocbIK3MhTW7o9nsVvsm3iuIUqK4,27066
147
154
  pytcl/terrain/visibility.py,sha256=nIJr9AVk7C8GCpJV4UDvUjhmAieycWD8BLepAMUBMIQ,22739
148
155
  pytcl/trackers/__init__.py,sha256=Gw79xlSIUzdPV8bN1slNWUlGxE3d-NsVmbMygkYVV20,1151
149
- pytcl/trackers/hypothesis.py,sha256=RApWfji-f0-a68KnAJela0BvPdIlOY_FV_cYJFmVUoE,17353
150
- pytcl/trackers/mht.py,sha256=7mwhMmja3ri2wnx7W1wueDGn2r3ArwAxJDPUJ7IZAkQ,20617
151
- pytcl/trackers/multi_target.py,sha256=hvt89ERhMwpcHcIJeKHnkQSKdE3_LoRiX-gbaGoo300,10516
156
+ pytcl/trackers/hypothesis.py,sha256=ubK-q89cYayahSHIw5sVYD1fpRUEB0XvC6rQnI1WACA,17361
157
+ pytcl/trackers/mht.py,sha256=osEOXMaCeTt1eVn_E08dLRhEvBroVmf8b81zO5Zp1lU,20720
158
+ pytcl/trackers/multi_target.py,sha256=RDITa0xnbgtVYAMj5XXp4lljo5lZ2zAAc02KZlOjxbQ,10526
152
159
  pytcl/trackers/single_target.py,sha256=Yy3FwaNTArMWcaod-0HVeiioNV4xLWxNDn_7ZPVqQYs,6562
153
160
  pytcl/transponders/__init__.py,sha256=5fL4u3lKCYgPLo5uFeuZbtRZkJPABntuKYGUvVgMMEI,41
154
- nrl_tracker-1.6.0.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
155
- nrl_tracker-1.6.0.dist-info/METADATA,sha256=i2-7x8Vz0pQuxltOgA7u8LEMTfTTUpJfM0Ru_wx6x_E,10299
156
- nrl_tracker-1.6.0.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
157
- nrl_tracker-1.6.0.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
158
- nrl_tracker-1.6.0.dist-info/RECORD,,
161
+ nrl_tracker-1.7.1.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
162
+ nrl_tracker-1.7.1.dist-info/METADATA,sha256=kzRylzn5xpwFm-Lj6DqrEYgMBMoAkzb7qWmGBaswGNA,10760
163
+ nrl_tracker-1.7.1.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
164
+ nrl_tracker-1.7.1.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
165
+ nrl_tracker-1.7.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__ = "1.6.0"
23
+ __version__ = "1.7.1"
24
24
  __author__ = "Python Port Contributors"
25
25
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
26
 
@@ -44,7 +44,7 @@ from pytcl import (
44
44
 
45
45
  # Version tuple for programmatic access
46
46
  # Handle dev/alpha/beta/rc suffixes by extracting only numeric parts
47
- def _parse_version(version_str):
47
+ def _parse_version(version_str: str) -> tuple[int, ...]:
48
48
  """Parse version string into tuple of integers."""
49
49
  import re
50
50
 
@@ -32,6 +32,21 @@ from pytcl.assignment_algorithms.jpda import (
32
32
  jpda_probabilities,
33
33
  jpda_update,
34
34
  )
35
+ from pytcl.assignment_algorithms.nd_assignment import (
36
+ AssignmentNDResult,
37
+ auction_assignment_nd,
38
+ detect_dimension_conflicts,
39
+ greedy_assignment_nd,
40
+ relaxation_assignment_nd,
41
+ validate_cost_tensor,
42
+ )
43
+ from pytcl.assignment_algorithms.network_flow import (
44
+ FlowStatus,
45
+ MinCostFlowResult,
46
+ assignment_to_flow_network,
47
+ min_cost_assignment_via_flow,
48
+ min_cost_flow_successive_shortest_paths,
49
+ )
35
50
  from pytcl.assignment_algorithms.three_dimensional import (
36
51
  Assignment3DResult,
37
52
  assign3d,
@@ -91,4 +106,17 @@ __all__ = [
91
106
  "jpda_update",
92
107
  "jpda_probabilities",
93
108
  "compute_likelihood_matrix",
109
+ # N-Dimensional Assignment (4D+)
110
+ "AssignmentNDResult",
111
+ "validate_cost_tensor",
112
+ "greedy_assignment_nd",
113
+ "relaxation_assignment_nd",
114
+ "auction_assignment_nd",
115
+ "detect_dimension_conflicts",
116
+ # Network Flow-Based Assignment
117
+ "FlowStatus",
118
+ "MinCostFlowResult",
119
+ "assignment_to_flow_network",
120
+ "min_cost_flow_successive_shortest_paths",
121
+ "min_cost_assignment_via_flow",
94
122
  ]
@@ -5,7 +5,7 @@ This module provides gating methods to determine which measurements
5
5
  fall within a validation region around predicted track states.
6
6
  """
7
7
 
8
- from typing import List, Tuple
8
+ from typing import Any, List, Tuple
9
9
 
10
10
  import numpy as np
11
11
  from numba import njit
@@ -15,8 +15,8 @@ from scipy.stats import chi2
15
15
 
16
16
  @njit(cache=True, fastmath=True)
17
17
  def _mahalanobis_distance_2d(
18
- innovation: np.ndarray,
19
- S_inv: np.ndarray,
18
+ innovation: np.ndarray[Any, Any],
19
+ S_inv: np.ndarray[Any, Any],
20
20
  ) -> float:
21
21
  """JIT-compiled Mahalanobis distance for 2D innovations."""
22
22
  return innovation[0] * (
@@ -26,8 +26,8 @@ def _mahalanobis_distance_2d(
26
26
 
27
27
  @njit(cache=True, fastmath=True)
28
28
  def _mahalanobis_distance_3d(
29
- innovation: np.ndarray,
30
- S_inv: np.ndarray,
29
+ innovation: np.ndarray[Any, Any],
30
+ S_inv: np.ndarray[Any, Any],
31
31
  ) -> float:
32
32
  """JIT-compiled Mahalanobis distance for 3D innovations."""
33
33
  result = 0.0
@@ -39,8 +39,8 @@ def _mahalanobis_distance_3d(
39
39
 
40
40
  @njit(cache=True, fastmath=True)
41
41
  def _mahalanobis_distance_general(
42
- innovation: np.ndarray,
43
- S_inv: np.ndarray,
42
+ innovation: np.ndarray[Any, Any],
43
+ S_inv: np.ndarray[Any, Any],
44
44
  ) -> float:
45
45
  """JIT-compiled Mahalanobis distance for general dimension."""
46
46
  n = len(innovation)
@@ -341,9 +341,9 @@ def compute_gate_volume(
341
341
 
342
342
  @njit(cache=True, fastmath=True, parallel=False)
343
343
  def mahalanobis_batch(
344
- innovations: np.ndarray,
345
- S_inv: np.ndarray,
346
- output: np.ndarray,
344
+ innovations: np.ndarray[Any, Any],
345
+ S_inv: np.ndarray[Any, Any],
346
+ output: np.ndarray[Any, Any],
347
347
  ) -> None:
348
348
  """
349
349
  Compute Mahalanobis distances for a batch of innovations.
@@ -9,7 +9,7 @@ This is more sophisticated than GNN which makes hard assignment decisions,
9
9
  as JPDA can handle measurement origin uncertainty in cluttered environments.
10
10
  """
11
11
 
12
- from typing import List, NamedTuple, Optional, Tuple
12
+ from typing import Any, List, NamedTuple, Optional
13
13
 
14
14
  import numpy as np
15
15
  from numba import njit
@@ -24,7 +24,7 @@ class JPDAResult(NamedTuple):
24
24
 
25
25
  Attributes
26
26
  ----------
27
- association_probs : ndarray
27
+ association_probs : ndarray[Any]
28
28
  Association probability matrix of shape (n_tracks, n_measurements + 1).
29
29
  association_probs[i, j] is the probability that track i is associated
30
30
  with measurement j. The last column (j = n_measurements) represents
@@ -32,9 +32,9 @@ class JPDAResult(NamedTuple):
32
32
  marginal_probs : list of ndarray
33
33
  List of marginal association probabilities for each track.
34
34
  marginal_probs[i][j] = P(measurement j originated from track i).
35
- likelihood_matrix : ndarray
35
+ likelihood_matrix : ndarray[Any]
36
36
  Measurement likelihood matrix of shape (n_tracks, n_measurements).
37
- gated : ndarray
37
+ gated : ndarray[Any]
38
38
  Boolean matrix indicating which track-measurement pairs passed gating.
39
39
  """
40
40
 
@@ -53,7 +53,7 @@ class JPDAUpdate(NamedTuple):
53
53
  Updated state estimates for each track.
54
54
  covariances : list of ndarray
55
55
  Updated covariances for each track (includes spread of means).
56
- association_probs : ndarray
56
+ association_probs : ndarray[Any]
57
57
  Association probability matrix.
58
58
  innovations : list of ndarray
59
59
  Combined weighted innovations for each track.
@@ -66,8 +66,8 @@ class JPDAUpdate(NamedTuple):
66
66
 
67
67
 
68
68
  def compute_measurement_likelihood(
69
- innovation: NDArray,
70
- innovation_cov: NDArray,
69
+ innovation: NDArray[Any],
70
+ innovation_cov: NDArray[Any],
71
71
  detection_prob: float = 1.0,
72
72
  ) -> float:
73
73
  """
@@ -75,9 +75,9 @@ def compute_measurement_likelihood(
75
75
 
76
76
  Parameters
77
77
  ----------
78
- innovation : ndarray
78
+ innovation : ndarray[Any]
79
79
  Measurement innovation (residual), shape (m,).
80
- innovation_cov : ndarray
80
+ innovation_cov : ndarray[Any]
81
81
  Innovation covariance, shape (m, m).
82
82
  detection_prob : float
83
83
  Probability of detection (Pd).
@@ -102,14 +102,14 @@ def compute_measurement_likelihood(
102
102
 
103
103
 
104
104
  def compute_likelihood_matrix(
105
- track_states: List[NDArray],
106
- track_covariances: List[NDArray],
107
- measurements: NDArray,
108
- H: NDArray,
109
- R: NDArray,
105
+ track_states: list[NDArray[Any]],
106
+ track_covariances: list[NDArray[Any]],
107
+ measurements: NDArray[Any],
108
+ H: NDArray[Any],
109
+ R: NDArray[Any],
110
110
  detection_prob: float = 1.0,
111
111
  gate_threshold: Optional[float] = None,
112
- ) -> Tuple[NDArray, NDArray]:
112
+ ) -> tuple[NDArray[Any], NDArray[Any]]:
113
113
  """
114
114
  Compute likelihood matrix for all track-measurement pairs.
115
115
 
@@ -119,11 +119,11 @@ def compute_likelihood_matrix(
119
119
  State estimates for each track.
120
120
  track_covariances : list of ndarray
121
121
  Covariances for each track.
122
- measurements : ndarray
122
+ measurements : ndarray[Any]
123
123
  Measurements, shape (n_meas, m).
124
- H : ndarray
124
+ H : ndarray[Any]
125
125
  Measurement matrix, shape (m, n).
126
- R : ndarray
126
+ R : ndarray[Any]
127
127
  Measurement noise covariance, shape (m, m).
128
128
  detection_prob : float
129
129
  Probability of detection.
@@ -132,9 +132,9 @@ def compute_likelihood_matrix(
132
132
 
133
133
  Returns
134
134
  -------
135
- likelihood_matrix : ndarray
135
+ likelihood_matrix : ndarray[Any]
136
136
  Likelihood values, shape (n_tracks, n_meas).
137
- gated : ndarray
137
+ gated : ndarray[Any]
138
138
  Boolean gating matrix, shape (n_tracks, n_meas).
139
139
  """
140
140
  n_tracks = len(track_states)
@@ -163,11 +163,11 @@ def compute_likelihood_matrix(
163
163
 
164
164
 
165
165
  def jpda_probabilities(
166
- likelihood_matrix: NDArray,
167
- gated: NDArray,
166
+ likelihood_matrix: NDArray[Any],
167
+ gated: NDArray[Any],
168
168
  detection_prob: float = 1.0,
169
169
  clutter_density: float = 1e-6,
170
- ) -> NDArray:
170
+ ) -> NDArray[Any]:
171
171
  """
172
172
  Compute JPDA association probabilities.
173
173
 
@@ -176,9 +176,9 @@ def jpda_probabilities(
176
176
 
177
177
  Parameters
178
178
  ----------
179
- likelihood_matrix : ndarray
179
+ likelihood_matrix : ndarray[Any]
180
180
  Likelihood values, shape (n_tracks, n_meas).
181
- gated : ndarray
181
+ gated : ndarray[Any]
182
182
  Boolean gating matrix, shape (n_tracks, n_meas).
183
183
  detection_prob : float
184
184
  Probability of detection (Pd).
@@ -187,7 +187,7 @@ def jpda_probabilities(
187
187
 
188
188
  Returns
189
189
  -------
190
- beta : ndarray
190
+ beta : ndarray[Any]
191
191
  Association probability matrix, shape (n_tracks, n_meas + 1).
192
192
  beta[i, j] = P(measurement j is from track i) for j < n_meas.
193
193
  beta[i, n_meas] = P(track i has no measurement).
@@ -218,11 +218,11 @@ def jpda_probabilities(
218
218
 
219
219
 
220
220
  def _jpda_exact(
221
- likelihood_matrix: NDArray,
222
- gated: NDArray,
221
+ likelihood_matrix: NDArray[Any],
222
+ gated: NDArray[Any],
223
223
  detection_prob: float,
224
224
  clutter_density: float,
225
- ) -> NDArray:
225
+ ) -> NDArray[Any]:
226
226
  """
227
227
  Exact JPDA computation via hypothesis enumeration.
228
228
 
@@ -241,8 +241,8 @@ def _jpda_exact(
241
241
  def generate_hypotheses(
242
242
  meas_idx: int,
243
243
  current_assignment: List[int],
244
- used_tracks: set,
245
- ):
244
+ used_tracks: set[Any],
245
+ ) -> Any:
246
246
  """Recursively generate valid hypotheses."""
247
247
  if meas_idx == n_meas:
248
248
  yield current_assignment.copy()
@@ -268,11 +268,11 @@ def _jpda_exact(
268
268
  hypothesis_probs = []
269
269
  hypothesis_assignments = []
270
270
 
271
- for assignment in generate_hypotheses(0, [], set()):
271
+ for assignment in generate_hypotheses(0, [], set[Any]()):
272
272
  # Compute probability of this hypothesis
273
273
  prob = 1.0
274
274
 
275
- detected_tracks = set()
275
+ detected_tracks = set[Any]()
276
276
  for j, track_idx in enumerate(assignment):
277
277
  if track_idx == -1:
278
278
  # Measurement j is clutter
@@ -301,7 +301,7 @@ def _jpda_exact(
301
301
  for h_idx, (assignment, prob) in enumerate(
302
302
  zip(hypothesis_assignments, hypothesis_probs)
303
303
  ):
304
- detected_tracks = set()
304
+ detected_tracks = set[Any]()
305
305
  for j, track_idx in enumerate(assignment):
306
306
  if track_idx >= 0:
307
307
  beta[track_idx, j] += prob
@@ -317,11 +317,11 @@ def _jpda_exact(
317
317
 
318
318
  @njit(cache=True)
319
319
  def _jpda_approximate_core(
320
- likelihood_matrix: np.ndarray,
321
- gated: np.ndarray,
320
+ likelihood_matrix: np.ndarray[Any, Any],
321
+ gated: np.ndarray[Any, Any],
322
322
  detection_prob: float,
323
323
  clutter_density: float,
324
- ) -> np.ndarray:
324
+ ) -> np.ndarray[Any, Any]:
325
325
  """JIT-compiled core of approximate JPDA computation."""
326
326
  n_tracks = likelihood_matrix.shape[0]
327
327
  n_meas = likelihood_matrix.shape[1]
@@ -369,11 +369,11 @@ def _jpda_approximate_core(
369
369
 
370
370
 
371
371
  def _jpda_approximate(
372
- likelihood_matrix: NDArray,
373
- gated: NDArray,
372
+ likelihood_matrix: NDArray[Any],
373
+ gated: NDArray[Any],
374
374
  detection_prob: float,
375
375
  clutter_density: float,
376
- ) -> NDArray:
376
+ ) -> NDArray[Any]:
377
377
  """
378
378
  Approximate JPDA using parametric approach.
379
379