nrl-tracker 0.21.4__py3-none-any.whl → 0.22.0__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 (138) hide show
  1. {nrl_tracker-0.21.4.dist-info → nrl_tracker-0.22.0.dist-info}/METADATA +2 -2
  2. nrl_tracker-0.22.0.dist-info/RECORD +150 -0
  3. pytcl/__init__.py +9 -11
  4. pytcl/assignment_algorithms/__init__.py +32 -42
  5. pytcl/assignment_algorithms/data_association.py +9 -10
  6. pytcl/assignment_algorithms/gating.py +7 -5
  7. pytcl/assignment_algorithms/jpda.py +10 -14
  8. pytcl/assignment_algorithms/three_dimensional/__init__.py +6 -8
  9. pytcl/assignment_algorithms/three_dimensional/assignment.py +6 -2
  10. pytcl/assignment_algorithms/two_dimensional/__init__.py +9 -13
  11. pytcl/assignment_algorithms/two_dimensional/assignment.py +5 -2
  12. pytcl/assignment_algorithms/two_dimensional/kbest.py +9 -9
  13. pytcl/astronomical/__init__.py +130 -89
  14. pytcl/astronomical/ephemerides.py +524 -0
  15. pytcl/astronomical/lambert.py +6 -15
  16. pytcl/astronomical/orbital_mechanics.py +1 -3
  17. pytcl/astronomical/reference_frames.py +1 -3
  18. pytcl/astronomical/relativity.py +466 -0
  19. pytcl/astronomical/time_systems.py +2 -1
  20. pytcl/atmosphere/__init__.py +12 -14
  21. pytcl/atmosphere/models.py +5 -5
  22. pytcl/clustering/__init__.py +28 -36
  23. pytcl/clustering/dbscan.py +5 -2
  24. pytcl/clustering/gaussian_mixture.py +10 -10
  25. pytcl/clustering/hierarchical.py +7 -7
  26. pytcl/clustering/kmeans.py +7 -5
  27. pytcl/containers/__init__.py +29 -43
  28. pytcl/containers/cluster_set.py +13 -20
  29. pytcl/containers/covertree.py +8 -2
  30. pytcl/containers/kd_tree.py +6 -2
  31. pytcl/containers/measurement_set.py +11 -16
  32. pytcl/containers/rtree.py +8 -7
  33. pytcl/containers/track_list.py +13 -13
  34. pytcl/containers/vptree.py +7 -2
  35. pytcl/coordinate_systems/__init__.py +69 -74
  36. pytcl/coordinate_systems/conversions/__init__.py +20 -24
  37. pytcl/coordinate_systems/conversions/geodetic.py +7 -17
  38. pytcl/coordinate_systems/conversions/spherical.py +4 -2
  39. pytcl/coordinate_systems/jacobians/__init__.py +10 -12
  40. pytcl/coordinate_systems/jacobians/jacobians.py +2 -1
  41. pytcl/coordinate_systems/projections/__init__.py +27 -23
  42. pytcl/coordinate_systems/projections/projections.py +14 -39
  43. pytcl/coordinate_systems/rotations/__init__.py +20 -22
  44. pytcl/coordinate_systems/rotations/rotations.py +3 -4
  45. pytcl/core/__init__.py +16 -22
  46. pytcl/core/array_utils.py +7 -7
  47. pytcl/core/constants.py +1 -3
  48. pytcl/core/validation.py +13 -19
  49. pytcl/dynamic_estimation/__init__.py +77 -86
  50. pytcl/dynamic_estimation/imm.py +10 -15
  51. pytcl/dynamic_estimation/information_filter.py +8 -6
  52. pytcl/dynamic_estimation/kalman/__init__.py +40 -48
  53. pytcl/dynamic_estimation/kalman/extended.py +4 -5
  54. pytcl/dynamic_estimation/kalman/linear.py +7 -3
  55. pytcl/dynamic_estimation/kalman/square_root.py +7 -8
  56. pytcl/dynamic_estimation/kalman/unscented.py +8 -6
  57. pytcl/dynamic_estimation/particle_filters/__init__.py +12 -14
  58. pytcl/dynamic_estimation/particle_filters/bootstrap.py +8 -8
  59. pytcl/dynamic_estimation/smoothers.py +9 -10
  60. pytcl/dynamic_models/__init__.py +37 -41
  61. pytcl/dynamic_models/continuous_time/__init__.py +11 -11
  62. pytcl/dynamic_models/continuous_time/dynamics.py +4 -2
  63. pytcl/dynamic_models/discrete_time/__init__.py +11 -17
  64. pytcl/dynamic_models/process_noise/__init__.py +11 -17
  65. pytcl/dynamic_models/process_noise/polynomial.py +2 -6
  66. pytcl/gravity/__init__.py +55 -65
  67. pytcl/gravity/clenshaw.py +4 -7
  68. pytcl/gravity/egm.py +9 -6
  69. pytcl/gravity/models.py +1 -3
  70. pytcl/gravity/spherical_harmonics.py +6 -11
  71. pytcl/gravity/tides.py +9 -17
  72. pytcl/magnetism/__init__.py +26 -36
  73. pytcl/magnetism/emm.py +7 -13
  74. pytcl/magnetism/igrf.py +5 -6
  75. pytcl/magnetism/wmm.py +4 -10
  76. pytcl/mathematical_functions/__init__.py +69 -87
  77. pytcl/mathematical_functions/basic_matrix/__init__.py +25 -19
  78. pytcl/mathematical_functions/basic_matrix/decompositions.py +6 -5
  79. pytcl/mathematical_functions/basic_matrix/special_matrices.py +2 -1
  80. pytcl/mathematical_functions/combinatorics/__init__.py +18 -14
  81. pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -4
  82. pytcl/mathematical_functions/geometry/__init__.py +15 -15
  83. pytcl/mathematical_functions/geometry/geometry.py +10 -15
  84. pytcl/mathematical_functions/interpolation/__init__.py +11 -13
  85. pytcl/mathematical_functions/interpolation/interpolation.py +8 -5
  86. pytcl/mathematical_functions/numerical_integration/__init__.py +16 -10
  87. pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -2
  88. pytcl/mathematical_functions/signal_processing/__init__.py +42 -30
  89. pytcl/mathematical_functions/signal_processing/detection.py +9 -9
  90. pytcl/mathematical_functions/signal_processing/filters.py +7 -8
  91. pytcl/mathematical_functions/signal_processing/matched_filter.py +8 -7
  92. pytcl/mathematical_functions/special_functions/__init__.py +75 -77
  93. pytcl/mathematical_functions/special_functions/bessel.py +2 -1
  94. pytcl/mathematical_functions/special_functions/debye.py +4 -2
  95. pytcl/mathematical_functions/special_functions/elliptic.py +3 -4
  96. pytcl/mathematical_functions/special_functions/error_functions.py +2 -1
  97. pytcl/mathematical_functions/special_functions/gamma_functions.py +3 -4
  98. pytcl/mathematical_functions/special_functions/hypergeometric.py +2 -1
  99. pytcl/mathematical_functions/special_functions/lambert_w.py +3 -4
  100. pytcl/mathematical_functions/special_functions/marcum_q.py +2 -1
  101. pytcl/mathematical_functions/statistics/__init__.py +27 -31
  102. pytcl/mathematical_functions/statistics/distributions.py +21 -40
  103. pytcl/mathematical_functions/statistics/estimators.py +3 -4
  104. pytcl/mathematical_functions/transforms/__init__.py +45 -51
  105. pytcl/mathematical_functions/transforms/fourier.py +5 -2
  106. pytcl/mathematical_functions/transforms/stft.py +8 -11
  107. pytcl/mathematical_functions/transforms/wavelets.py +13 -20
  108. pytcl/navigation/__init__.py +96 -102
  109. pytcl/navigation/geodesy.py +13 -33
  110. pytcl/navigation/great_circle.py +7 -13
  111. pytcl/navigation/ins.py +12 -16
  112. pytcl/navigation/ins_gnss.py +24 -37
  113. pytcl/navigation/rhumb.py +7 -12
  114. pytcl/performance_evaluation/__init__.py +21 -25
  115. pytcl/performance_evaluation/estimation_metrics.py +3 -1
  116. pytcl/performance_evaluation/track_metrics.py +4 -4
  117. pytcl/plotting/__init__.py +30 -38
  118. pytcl/plotting/coordinates.py +8 -18
  119. pytcl/plotting/ellipses.py +5 -2
  120. pytcl/plotting/metrics.py +5 -10
  121. pytcl/plotting/tracks.py +7 -12
  122. pytcl/static_estimation/__init__.py +37 -41
  123. pytcl/static_estimation/least_squares.py +5 -4
  124. pytcl/static_estimation/maximum_likelihood.py +8 -5
  125. pytcl/static_estimation/robust.py +5 -2
  126. pytcl/terrain/__init__.py +28 -34
  127. pytcl/terrain/dem.py +6 -9
  128. pytcl/terrain/loaders.py +9 -14
  129. pytcl/terrain/visibility.py +4 -8
  130. pytcl/trackers/__init__.py +17 -25
  131. pytcl/trackers/hypothesis.py +8 -8
  132. pytcl/trackers/mht.py +18 -24
  133. pytcl/trackers/multi_target.py +8 -6
  134. pytcl/trackers/single_target.py +5 -2
  135. nrl_tracker-0.21.4.dist-info/RECORD +0 -148
  136. {nrl_tracker-0.21.4.dist-info → nrl_tracker-0.22.0.dist-info}/LICENSE +0 -0
  137. {nrl_tracker-0.21.4.dist-info → nrl_tracker-0.22.0.dist-info}/WHEEL +0 -0
  138. {nrl_tracker-0.21.4.dist-info → nrl_tracker-0.22.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nrl-tracker
3
- Version: 0.21.4
3
+ Version: 0.22.0
4
4
  Summary: Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms
5
5
  Author: Original: David F. Crouse, Naval Research Laboratory
6
6
  Maintainer: Python Port Contributors
@@ -60,7 +60,7 @@ Requires-Dist: plotly>=5.15.0; extra == "visualization"
60
60
 
61
61
  # Tracker Component Library (Python)
62
62
 
63
- [![PyPI version](https://img.shields.io/badge/pypi-v0.21.4-blue.svg)](https://pypi.org/project/nrl-tracker/)
63
+ [![PyPI version](https://img.shields.io/badge/pypi-v0.22.0-blue.svg)](https://pypi.org/project/nrl-tracker/)
64
64
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
65
65
  [![License: Public Domain](https://img.shields.io/badge/License-Public%20Domain-brightgreen.svg)](https://en.wikipedia.org/wiki/Public_domain)
66
66
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -0,0 +1,150 @@
1
+ pytcl/__init__.py,sha256=jxw8skUqYrZAPbMTL0rb5eUCY2hVXundN2Yuo6vnHcs,1976
2
+ pytcl/assignment_algorithms/__init__.py,sha256=4du24kCRIaM8y1vfVK6WEg2jreYl2xfviXc3BLcoKeY,3382
3
+ pytcl/assignment_algorithms/data_association.py,sha256=3CxLPNibzDQroK7V9N0Qj-JhHlVu8q2Ple8BycBOCWY,11511
4
+ pytcl/assignment_algorithms/gating.py,sha256=saUFfHiiis5he6K9gLrqVNyj0bi9ggs4wXoyJaUyns0,10857
5
+ pytcl/assignment_algorithms/jpda.py,sha256=4GkLwMVG21w5-oBq0V0cXJgNY1ZbacoMfDm4JPTwgfg,19570
6
+ pytcl/assignment_algorithms/three_dimensional/__init__.py,sha256=tDnpdMGe-l-GnastUGaBKuFqcWZRPMsw29Tge5W2b00,837
7
+ pytcl/assignment_algorithms/three_dimensional/assignment.py,sha256=n5nqv-zA7ISwoYVpvdALftw797FXwXlanDRgracYY1M,19290
8
+ pytcl/assignment_algorithms/two_dimensional/__init__.py,sha256=3e__m1GaQRUqQ3sDonKmbcS0CmSjAZF0IkZ7cjIrmJc,1179
9
+ pytcl/assignment_algorithms/two_dimensional/assignment.py,sha256=z6_-i4zE4rmll2pvXYxJsyqzjLEeqRmJImCNhQuuVUY,11908
10
+ pytcl/assignment_algorithms/two_dimensional/kbest.py,sha256=AZvmixjrrNHyQYiOfrn7yDUA6k1SrREAWLU6AMlwREI,17393
11
+ pytcl/astronomical/__init__.py,sha256=fzrArytZ74sZmiu1PJYdjBzzxGI3HPf3ZW7_UNXmBh4,10809
12
+ pytcl/astronomical/ephemerides.py,sha256=ULUIN2bEP_XNSL3bI6GYYdQEmlX1Ac8W9TuonzEn_pA,16433
13
+ pytcl/astronomical/lambert.py,sha256=FWGI-qk8LEEOS5TLagex0VAodkgDce67gM-9JKgC0ew,15511
14
+ pytcl/astronomical/orbital_mechanics.py,sha256=f3Vqn2bWzxbMQO60SlHXf3515j3LSA2fd_MHZE5z5h0,19951
15
+ pytcl/astronomical/reference_frames.py,sha256=R_bdfXYYoeNjgYU1deIynB0IBjpy4xc9Tlq8Q4W9FKc,15783
16
+ pytcl/astronomical/relativity.py,sha256=cqMR0oZJXNXYiEwnC8QrABkAAcu4c8MLoX74iNpZwfM,15418
17
+ pytcl/astronomical/time_systems.py,sha256=l8WhVUnONcKHOUIvzIC_3F76saKSUD4k7NtKAd9AdFY,15261
18
+ pytcl/atmosphere/__init__.py,sha256=ISr8E7gZMOfVZTOMZxoC-T_xRWkm5DbVffcFdjt4yV4,1038
19
+ pytcl/atmosphere/models.py,sha256=oLrL7TkrBdYxiguZVQ3jN-F99H-cmDoNWhQsvA9syjc,9612
20
+ pytcl/clustering/__init__.py,sha256=zLbKiFHJ2Pp2ccby9akU7GPr4lprG-bMmoOQT8De4yg,2541
21
+ pytcl/clustering/dbscan.py,sha256=c8Lw4pN9T2UNsFFHKQGXJ-eEVhIhl5069H1hU1fJLnA,7424
22
+ pytcl/clustering/gaussian_mixture.py,sha256=qhIXgCJBRe_GyaT1n8SucOFkOqzE5yLXRAagNkbUVyA,22891
23
+ pytcl/clustering/hierarchical.py,sha256=2KdfE6uX5V86UCYM9J_dcPjgUTsRZDk08mewez-Y68k,14234
24
+ pytcl/clustering/kmeans.py,sha256=qHn9_CKP3Vs2-LX2ftNbto1yTpMcMaXazxkKGNKZsyk,10761
25
+ pytcl/containers/__init__.py,sha256=BI2OAOwcGNvIRn-qv3mA6v2eLIFV3_sQbZ8JUTs2zQo,2372
26
+ pytcl/containers/cluster_set.py,sha256=wXdo0MnOg1Csy0zvpZ8T_T4ykcxL-tHVK_8KDNaMikc,22807
27
+ pytcl/containers/covertree.py,sha256=XiwhrGdU1YvO7V9YQjPDFeBmcFZrLwUMI0XMc6G8pXg,13396
28
+ pytcl/containers/kd_tree.py,sha256=YHw6lGExvjboyW-FajVS8qooLytbPQt5-zknvPSTdD8,16426
29
+ pytcl/containers/measurement_set.py,sha256=69BbWYijPHALwaBTuhmO4Idcj3wPih-lCjUL3t6SJao,12750
30
+ pytcl/containers/rtree.py,sha256=hYnn0TNO0bkYopZKPX7nf1h1Zb9GMRdvyPUdri52E1s,15478
31
+ pytcl/containers/track_list.py,sha256=Ao9AsJeJoOH5FEZKJ8vinaXLHnOwPlBecFZnrqFoA-E,12686
32
+ pytcl/containers/vptree.py,sha256=ymq73Jh9cYB6l7XxQM1BUt6oSL-Q5LHw4KsKQA1VBAI,8910
33
+ pytcl/coordinate_systems/__init__.py,sha256=w7vxXkRfW0e2lyeWPaoMNKPX-wuaUKdAoCJODY6bq4g,6609
34
+ pytcl/coordinate_systems/conversions/__init__.py,sha256=adRmpmFqNWZ2HyRORyAL205u-U5SUO7fXlQbQoiGXQ8,2043
35
+ pytcl/coordinate_systems/conversions/geodetic.py,sha256=w18rqueuBHmf5WTdIvuT77BzU9xlAfW76LN1YN1Y5xI,15677
36
+ pytcl/coordinate_systems/conversions/spherical.py,sha256=eaNjXHSz_yRD8JzIA-EKWI4T5zxyAizJ6rjiDw7SdP0,10854
37
+ pytcl/coordinate_systems/jacobians/__init__.py,sha256=vo6vsr90KWCcNBxS4HBXPfD-__G7utqQWtEnZmxL78I,1349
38
+ pytcl/coordinate_systems/jacobians/jacobians.py,sha256=SK5WEzQBmZUvR8c5IFeRRbd_ob3xy7Ne3Tho2v87TZo,11727
39
+ pytcl/coordinate_systems/projections/__init__.py,sha256=esDFJDeqAIb6GZ_7F2sPGpHNMToJVFm0x-w5GggYi24,3744
40
+ pytcl/coordinate_systems/projections/projections.py,sha256=mb0ltQhY-nFaLvl4zkv9AAgLgnMpJGyx2-9cHoBeKw4,32913
41
+ pytcl/coordinate_systems/rotations/__init__.py,sha256=ExgTknD2D8J6Qo2ax5DVJIBJoeQTczFpj6l06JZ7-B0,2026
42
+ pytcl/coordinate_systems/rotations/rotations.py,sha256=6ubSDTMOUKkPdL6gYQ3u-u5T-4XHTO2GScs83gnR0AI,18237
43
+ pytcl/core/__init__.py,sha256=ZInNpPhdQq1ZH82CWfzPCpWMMyy2qIV2OYWw6LqvP6A,1500
44
+ pytcl/core/array_utils.py,sha256=BE2Bi_dWyB-0nMX8n0K_agL3hHfsFgtG5YnQ_5OMV_w,14045
45
+ pytcl/core/constants.py,sha256=v--FHNYH441t2tfZeNpPbTxZDqiyql6ehA9Z3iTsnxw,8687
46
+ pytcl/core/validation.py,sha256=aT-77KuB-7UoTbGnSDsY1yfqKlwnLpSvc7auEMHwXPY,13027
47
+ pytcl/dynamic_estimation/__init__.py,sha256=ji_HhdIy_fTdgsb-meEkRzJxa5Es80OWizsMaFYX3Uo,7536
48
+ pytcl/dynamic_estimation/imm.py,sha256=nhVMSAxce7ZGr7LnGdgutBIIeMIPZEtQgWuFII_BCzo,22119
49
+ pytcl/dynamic_estimation/information_filter.py,sha256=zNzn9JtGU8gR_V5-QFK1MaOy0ei1zYdZ3mmU2kDVZM0,17464
50
+ pytcl/dynamic_estimation/smoothers.py,sha256=0agwW-bQoQkrl2tT_kdxNLY44hmpK_j9ekfjauw8Qco,19060
51
+ pytcl/dynamic_estimation/batch_estimation/__init__.py,sha256=JQ0s76Enov5a7plA4EnUua4t-7etikQrwr5z4WIjUeo,46
52
+ pytcl/dynamic_estimation/kalman/__init__.py,sha256=IXBXQhBx1FjbPKEHb4yEL4Zm9Xix8LIkKU92NIoBCf8,4116
53
+ pytcl/dynamic_estimation/kalman/extended.py,sha256=sXKZBA6tHhBOt7m0Di3bdn1zNIrHb82TH79rWyNS05U,10458
54
+ pytcl/dynamic_estimation/kalman/linear.py,sha256=NCxnPivNuibHK-gGmoleY9H3TxJjIwzkkGqADeh5mGI,12332
55
+ pytcl/dynamic_estimation/kalman/square_root.py,sha256=yw6YCVFqCaJGjra9U6xq53VPJAaVI-iz9d41hVQoJOQ,26931
56
+ pytcl/dynamic_estimation/kalman/unscented.py,sha256=xkEGWkg78h4z5z4SwOXtSF_-AuHFmjIPBU00W-LLPVE,15555
57
+ pytcl/dynamic_estimation/measurement_update/__init__.py,sha256=8rlyJwVpxf0fZj-AFo1hlewvryZRhUzcy3F8uMe6I8c,48
58
+ pytcl/dynamic_estimation/particle_filters/__init__.py,sha256=HyPGYNfs0olYN2gvynGt4PMBiOkhQ2wdTUfdxDur6uw,1546
59
+ pytcl/dynamic_estimation/particle_filters/bootstrap.py,sha256=GXRGwFXY18W_HLWKAA_ZkHl_TR33_2FztmfF4ZqzR7A,13421
60
+ pytcl/dynamic_models/__init__.py,sha256=f_8ZvuwrRM518Ei8LRZt8ttYpZIZVL5njfVVp_FCp2s,4144
61
+ pytcl/dynamic_models/continuous_time/__init__.py,sha256=B3QDkSERVPZAfBK_ozH6oJt4_B81l4IvnelSPSuNtnA,1606
62
+ pytcl/dynamic_models/continuous_time/dynamics.py,sha256=XrSFThlyuV8EzFRAVNCjA2R-RWf1fUYUQFZNn9qlciE,12900
63
+ pytcl/dynamic_models/discrete_time/__init__.py,sha256=NrvBawm6ZnITdn9UM0XzbzTgkxhBfYM68ZKW7_79pZc,1367
64
+ pytcl/dynamic_models/discrete_time/coordinated_turn.py,sha256=jrSGCKiAdXaFIJBLzRyAv0xxxpOHOBnAtDHyu7VYsm8,7206
65
+ pytcl/dynamic_models/discrete_time/polynomial.py,sha256=zv5V-AbuaXlIj36n-YkOEyC74jV2vczxpCW09P0kmi0,5529
66
+ pytcl/dynamic_models/discrete_time/singer.py,sha256=wZS3Nad-YyPZp8Mle8Sf5GgW0-t4TxMRcnbc42HtQnA,3861
67
+ pytcl/dynamic_models/process_noise/__init__.py,sha256=eJIpBai_1FVwLeTnHh6sT1Z0sgaeeXx6PoL3VQmswzw,1351
68
+ pytcl/dynamic_models/process_noise/coordinated_turn.py,sha256=w7bHUImLPL5m3KYenfNgAnHPCRtAyYESbsFc6lQKXRg,4768
69
+ pytcl/dynamic_models/process_noise/polynomial.py,sha256=Rb7LITSZ1kbOnd0Q8TWRdUR_4sl9RCqfcsf0OawJl9U,7574
70
+ pytcl/dynamic_models/process_noise/singer.py,sha256=lsJDT6xOvcS_qQKFtgHX0L7Ukpy4D7HgvPT8Q3I0ibU,3901
71
+ pytcl/gravity/__init__.py,sha256=2slTXTP0pzmu5Vlb2E_cwZo9fOk0lThxsEQvyVC-Xl0,5068
72
+ pytcl/gravity/clenshaw.py,sha256=9h_0YDH-gVrtZSBk2NpqMB3xlNMXmL8Mof28drxmIbg,15338
73
+ pytcl/gravity/egm.py,sha256=5JkAEnVi2rt_m_AZgiaYhmP2xH9ManpUyLu40be1rB0,18155
74
+ pytcl/gravity/models.py,sha256=Vws1dZPt0lqXnF12Y1PZ-YUd3onXMHI8TLxSJrapxxw,11145
75
+ pytcl/gravity/spherical_harmonics.py,sha256=cXpxWZYDc3CDkdootjxKBivG4ajbEcb-Sxc8qEeCUkE,14606
76
+ pytcl/gravity/tides.py,sha256=gpd6FU3xi5WCDYpvTQXwc3XVrdX7mmYk-_fx5nvQVYQ,27681
77
+ pytcl/magnetism/__init__.py,sha256=PkJlZRb1z91mc0nRLgvHtI7ZZ6zqBIS3KZcs3LV8KL8,3079
78
+ pytcl/magnetism/emm.py,sha256=_n7uQsKpGWJe-cQl4n4OiYrP3qofYIv4dKdJUrs2DOk,22184
79
+ pytcl/magnetism/igrf.py,sha256=5EAizmdGjlqO3NO8VQQUtabX3GLtY-0ra8mxiAVMRr4,13447
80
+ pytcl/magnetism/wmm.py,sha256=JHM07r2cEJEaTOULVCZheYqFStMc0GtsX4RoOyyaRcI,15869
81
+ pytcl/mathematical_functions/__init__.py,sha256=kvsg48mLLNgdV_KRlWWy6NBKYZJ25lEWOx1ZQ69Vqzg,6585
82
+ pytcl/mathematical_functions/basic_matrix/__init__.py,sha256=Sx0klQeE2WK2O02NwvQCJqhhQlmqKCcAABARtqhDbLA,2783
83
+ pytcl/mathematical_functions/basic_matrix/decompositions.py,sha256=jmrsOg0vIyErILT_4v2D1H0be3y5m3t_wDati1-EbOY,12298
84
+ pytcl/mathematical_functions/basic_matrix/special_matrices.py,sha256=GsJUYOdjCBx6oeJUtvHD5gpTjUjcCcIjSTvv0HnXlb0,13523
85
+ pytcl/mathematical_functions/combinatorics/__init__.py,sha256=94eOx8cigbVzRxIJGqaTKnE2r5yXpxR0Dgku_u8MzDI,2085
86
+ pytcl/mathematical_functions/combinatorics/combinatorics.py,sha256=E9wKPZr2apH-DEVOgEx6ql8Q82zbJl-s7nbbYo2OvNE,12354
87
+ pytcl/mathematical_functions/continuous_optimization/__init__.py,sha256=lck60eeCUOsRpEzPHBY3kiLKwNz_fhmYoUGP3lTmTwk,55
88
+ pytcl/mathematical_functions/geometry/__init__.py,sha256=fBem7Y3-w7oNIJb-o6q1G47ir6-5-dDDOUJfkqGqRP0,1902
89
+ pytcl/mathematical_functions/geometry/geometry.py,sha256=uPg0FvJDng_7zyVHwJHMt_3YyFhIxZJPbzk6CNMqjNQ,16394
90
+ pytcl/mathematical_functions/interpolation/__init__.py,sha256=1SOEIgO-EXbfJJWr2N81Qrkv1nOHiYGj3TMRxS40Mys,1308
91
+ pytcl/mathematical_functions/interpolation/interpolation.py,sha256=AM-8cwhPSruoyg4Jyu0G5sPVa1Ge94N8fpOAUL6VRoo,12692
92
+ pytcl/mathematical_functions/numerical_integration/__init__.py,sha256=vxg92dCfL9I5EJFQR06q4jBPsV4ueaCwYOHpZ4GsA9M,1898
93
+ pytcl/mathematical_functions/numerical_integration/quadrature.py,sha256=J7N92M9kcvfqGvQPQKZmmZcGXeEt9I4427SGjbaeFLk,15748
94
+ pytcl/mathematical_functions/polynomials/__init__.py,sha256=WJWZcoQhnvy5f59-kncMTgD9mCtgwfDgULvDYYHS5ys,43
95
+ pytcl/mathematical_functions/signal_processing/__init__.py,sha256=M7P2plJL82Nf_63Nf5pg1u4fepNR-AkwgID9r57MdRM,4570
96
+ pytcl/mathematical_functions/signal_processing/detection.py,sha256=iu4a3_uXJZ_a-OvnbvS8lpXHOl--CGcFlAaXH0oTtPk,30364
97
+ pytcl/mathematical_functions/signal_processing/filters.py,sha256=qK9H7I0CFpqeCcZNeItDiSyUmV7g0ZqdzmFrH7YksxY,23435
98
+ pytcl/mathematical_functions/signal_processing/matched_filter.py,sha256=8EeArCxVAKgkL2EECODAI5McvUUYD9fBY923hDehbEk,22896
99
+ pytcl/mathematical_functions/special_functions/__init__.py,sha256=J1GpcQnuVHziHv5T-IMYWtNjj7FwuEP-6AA9LjVem8k,8357
100
+ pytcl/mathematical_functions/special_functions/bessel.py,sha256=pv-3Swb1AsDSCkfuIRprl-HHeTlchXmSFrU6Q0eJmTU,14401
101
+ pytcl/mathematical_functions/special_functions/debye.py,sha256=PhGkzvDSo8j3PRLGAtA6768gz5Nd8-Dd1kQTELuPvug,6750
102
+ pytcl/mathematical_functions/special_functions/elliptic.py,sha256=WPCpaX6mdzpXm5cZT4HGdFG29T5PHoIP0vd21bzJD24,7436
103
+ pytcl/mathematical_functions/special_functions/error_functions.py,sha256=QYZ9-FXWqegKCoPKdCsGOjtowb_-Vr9xXrV2Hjqcvr4,6277
104
+ pytcl/mathematical_functions/special_functions/gamma_functions.py,sha256=wsEvjkqjpUDv-y9-JVRTAaDJ5yLEYGgjFoUoUrIItFI,10201
105
+ pytcl/mathematical_functions/special_functions/hypergeometric.py,sha256=FUvl-exvXhM64XAY7kPJw063l_2HotJmxsbtmA-gHqw,9792
106
+ pytcl/mathematical_functions/special_functions/lambert_w.py,sha256=LHX57mpCnFLBepxl19zPbxrb8m5pJu2lSUY9m8s5TRA,6849
107
+ pytcl/mathematical_functions/special_functions/marcum_q.py,sha256=M18qy5HYGiZ_CP93QXH5ndp4BiL-lSwAQyomdEVmdws,9604
108
+ pytcl/mathematical_functions/statistics/__init__.py,sha256=TABlPg91TjY7OvdQBy1KWE4LZP5-M4bL9yokgDnjLPA,2743
109
+ pytcl/mathematical_functions/statistics/distributions.py,sha256=NKE3XOmWwVIPpLt9yisxBKqOW0mjVlKsJwSVQmIzabc,19313
110
+ pytcl/mathematical_functions/statistics/estimators.py,sha256=9VJHXZCiKcvgiaSfvib_pFye4L3yv-um3Nr07QlKSac,10841
111
+ pytcl/mathematical_functions/transforms/__init__.py,sha256=FDXNJnj0M5grhnFnttR9Y386WwR6IgjwhsXNRh7yf8M,4618
112
+ pytcl/mathematical_functions/transforms/fourier.py,sha256=QvSPS4QwD2DMBZ7-g9TUM02HBmUpsFT6L-4lywssrOU,20797
113
+ pytcl/mathematical_functions/transforms/stft.py,sha256=ZY6HwjvE02SC0nZ6I_09xPUWmX_MeYSGsMFsL8-TJus,18637
114
+ pytcl/mathematical_functions/transforms/wavelets.py,sha256=8UVvmdO6NiLK9MQ-h8txIxgFC4U-obR0sT4Ot3faDp4,21620
115
+ pytcl/misc/__init__.py,sha256=SCHf_lQVfdl2gwUluHBiIloTF8HRH8EkgYfbNr7zOug,33
116
+ pytcl/navigation/__init__.py,sha256=12FccHQiec10e5i3Ps7_TZAi8X7B-J_2FbZ2JSytotE,8662
117
+ pytcl/navigation/geodesy.py,sha256=Lci2knfF0oKyICCizaJuy-3OTAMXcvs9dfSv1Qnqcic,17003
118
+ pytcl/navigation/great_circle.py,sha256=IhZ-nNMo57ZjA2wAT2vrabBwg5xGVRhqb0zHj9p6JX4,20895
119
+ pytcl/navigation/ins.py,sha256=D5yKDGWGfYokFA6Auh9eO44-i1Qya6b7Is5-gQUvfqw,31285
120
+ pytcl/navigation/ins_gnss.py,sha256=heEeCWc3Jz_aFjiU7ltu3yuNYKnmYC0JSvpQmNww8Bo,30259
121
+ pytcl/navigation/rhumb.py,sha256=-0Y8TcZjVvC6TEFP1XzAyVSjfqAlr08bwcZa7zxAerI,18204
122
+ pytcl/performance_evaluation/__init__.py,sha256=YcMtkhWJosKJQ5tdZyG5pnLldjl1XJurWoofnZ6ykCI,2851
123
+ pytcl/performance_evaluation/estimation_metrics.py,sha256=o-KBwKyqwS4VTlweX7crzXTBFjm6PMIQVHXH8eGJpko,12387
124
+ pytcl/performance_evaluation/track_metrics.py,sha256=OPDTdeaT7MNP96_V6zi32Asi6xk7AnM3uRB4gyci3Yw,13364
125
+ pytcl/physical_values/__init__.py,sha256=SGbg6b0d4dWebE3baW4OlJshL00grG5E4wABw6jxl20,44
126
+ pytcl/plotting/__init__.py,sha256=QEy9bBfhEFxcBkHQ43j-WHfIXNxUr2ngJpNVMh5iyHU,3893
127
+ pytcl/plotting/coordinates.py,sha256=-yspHSOm2Nsx4yt-RZDasune8D1Yq7b61denVz8VCdY,17038
128
+ pytcl/plotting/ellipses.py,sha256=P3nt9jfCMv_ozVjeFQIVDXZqPQyh_-cex1-rgh4tDuU,12525
129
+ pytcl/plotting/metrics.py,sha256=FurXuzsNRseaMh9J00BwqYFmAwc0kmUAW5QmEDOlacw,18068
130
+ pytcl/plotting/tracks.py,sha256=xi5w1_3gDUTdYE1AH3R2kIMABgRclu0Ts9EyhmDx374,22948
131
+ pytcl/scheduling/__init__.py,sha256=jTqMSKcsCrWU_Fh6WaT6BW5WatNHyyEYjFbsv6X18Oc,39
132
+ pytcl/static_estimation/__init__.py,sha256=7u5YcuaalFRqtqLC8bSBeZ7z1nVH6DkyskD69Z4Jjvo,3758
133
+ pytcl/static_estimation/least_squares.py,sha256=cJozGQCu7ZScF0nrUV90JVa-EfteXnCB9MIUZ_ykIns,13462
134
+ pytcl/static_estimation/maximum_likelihood.py,sha256=6E9zfEidRUVZkLiE4tKeFPv48Gt0fe0g_Det8tDQCGo,21641
135
+ pytcl/static_estimation/robust.py,sha256=TtKx4AB_E-QYvT4sFxel0zdwKv0lb3w67dPTb-Dauxw,18587
136
+ pytcl/terrain/__init__.py,sha256=-WEQ-nK1e_OPe6qwjvAEC1t6-pQRd4oV4UZziqSYnzg,3915
137
+ pytcl/terrain/dem.py,sha256=1XI4p-vSDN1gLGmxSZNm-_KuQC35QoXmXqcq84pqEcM,20780
138
+ pytcl/terrain/loaders.py,sha256=6bm_ADLHMJvDGkUVNFgbQfBvJMC5jLPrnDpZBv4Qg0A,27000
139
+ pytcl/terrain/visibility.py,sha256=Aa0e-iCBALMuyt2GfTWrYAqFTg9BLIxNZWBePwNpxWw,22719
140
+ pytcl/trackers/__init__.py,sha256=ljp9C6MvdbMV4fL_RWccZQ34c4pvkkzB3P69SLvXCp8,1584
141
+ pytcl/trackers/hypothesis.py,sha256=dv9w26ZZhy6HQlX4_yOT02pwtaDbskPbxHOnSkkeFho,17377
142
+ pytcl/trackers/mht.py,sha256=wveWgOcTJkNey8hSF-25tCsMGNyRtCmub6e95xRbDDY,20726
143
+ pytcl/trackers/multi_target.py,sha256=fPBgTWYqInUxAF-15c1eFgRIed9GjWm7gl4JHVuL3NI,10633
144
+ pytcl/trackers/single_target.py,sha256=HiGxkxqqbmUAbhhlKy1YvRD6Mvq6nIfcM1cGFI2ZIdA,6622
145
+ pytcl/transponders/__init__.py,sha256=5fL4u3lKCYgPLo5uFeuZbtRZkJPABntuKYGUvVgMMEI,41
146
+ nrl_tracker-0.22.0.dist-info/LICENSE,sha256=rB5G4WppIIUzMOYr2N6uyYlNJ00hRJqE5tie6BMvYuE,1612
147
+ nrl_tracker-0.22.0.dist-info/METADATA,sha256=I8qnfiIoHmaKz-haPqUSwemAT1HwCzKkXCQKdcYD350,10005
148
+ nrl_tracker-0.22.0.dist-info/WHEEL,sha256=pL8R0wFFS65tNSRnaOVrsw9EOkOqxLrlUPenUYnJKNo,91
149
+ nrl_tracker-0.22.0.dist-info/top_level.txt,sha256=17megxcrTPBWwPZTh6jTkwTKxX7No-ZqRpyvElnnO-s,6
150
+ nrl_tracker-0.22.0.dist-info/RECORD,,
pytcl/__init__.py CHANGED
@@ -20,7 +20,7 @@ References
20
20
  no. 5, pp. 18-27, May 2017.
21
21
  """
22
22
 
23
- __version__ = "0.21.4"
23
+ __version__ = "0.22.0"
24
24
  __author__ = "Python Port Contributors"
25
25
  __original_author__ = "David F. Crouse, Naval Research Laboratory"
26
26
 
@@ -30,16 +30,14 @@ __original_author__ = "David F. Crouse, Naval Research Laboratory"
30
30
  # Specialized domains (Phase 6)
31
31
  # Assignment algorithms (Phase 5)
32
32
  # Core utilities
33
- from pytcl import (
34
- assignment_algorithms,
35
- astronomical,
36
- atmosphere,
37
- core,
38
- navigation,
39
- performance_evaluation,
40
- plotting,
41
- trackers,
42
- )
33
+ from pytcl import assignment_algorithms
34
+ from pytcl import astronomical
35
+ from pytcl import atmosphere
36
+ from pytcl import core
37
+ from pytcl import navigation
38
+ from pytcl import performance_evaluation
39
+ from pytcl import plotting
40
+ from pytcl import trackers
43
41
 
44
42
 
45
43
  # Version tuple for programmatic access
@@ -9,48 +9,38 @@ This module provides:
9
9
  - Data association algorithms (GNN, JPDA)
10
10
  """
11
11
 
12
- from pytcl.assignment_algorithms.data_association import (
13
- AssociationResult,
14
- compute_association_cost,
15
- gated_gnn_association,
16
- gnn_association,
17
- nearest_neighbor,
18
- )
19
- from pytcl.assignment_algorithms.gating import (
20
- chi2_gate_threshold,
21
- compute_gate_volume,
22
- ellipsoidal_gate,
23
- gate_measurements,
24
- mahalanobis_distance,
25
- rectangular_gate,
26
- )
27
- from pytcl.assignment_algorithms.jpda import (
28
- JPDAResult,
29
- JPDAUpdate,
30
- compute_likelihood_matrix,
31
- jpda,
32
- jpda_probabilities,
33
- jpda_update,
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
- )
43
- from pytcl.assignment_algorithms.two_dimensional import (
44
- AssignmentResult,
45
- KBestResult,
46
- assign2d,
47
- auction,
48
- hungarian,
49
- kbest_assign2d,
50
- linear_sum_assignment,
51
- murty,
52
- ranked_assignments,
53
- )
12
+ from pytcl.assignment_algorithms.data_association import AssociationResult
13
+ from pytcl.assignment_algorithms.data_association import compute_association_cost
14
+ from pytcl.assignment_algorithms.data_association import gated_gnn_association
15
+ from pytcl.assignment_algorithms.data_association import gnn_association
16
+ from pytcl.assignment_algorithms.data_association import nearest_neighbor
17
+ from pytcl.assignment_algorithms.gating import chi2_gate_threshold
18
+ from pytcl.assignment_algorithms.gating import compute_gate_volume
19
+ from pytcl.assignment_algorithms.gating import ellipsoidal_gate
20
+ from pytcl.assignment_algorithms.gating import gate_measurements
21
+ from pytcl.assignment_algorithms.gating import mahalanobis_distance
22
+ from pytcl.assignment_algorithms.gating import rectangular_gate
23
+ from pytcl.assignment_algorithms.jpda import JPDAResult
24
+ from pytcl.assignment_algorithms.jpda import JPDAUpdate
25
+ from pytcl.assignment_algorithms.jpda import compute_likelihood_matrix
26
+ from pytcl.assignment_algorithms.jpda import jpda
27
+ from pytcl.assignment_algorithms.jpda import jpda_probabilities
28
+ from pytcl.assignment_algorithms.jpda import jpda_update
29
+ from pytcl.assignment_algorithms.three_dimensional import Assignment3DResult
30
+ from pytcl.assignment_algorithms.three_dimensional import assign3d
31
+ from pytcl.assignment_algorithms.three_dimensional import assign3d_auction
32
+ from pytcl.assignment_algorithms.three_dimensional import assign3d_lagrangian
33
+ from pytcl.assignment_algorithms.three_dimensional import decompose_to_2d
34
+ from pytcl.assignment_algorithms.three_dimensional import greedy_3d
35
+ from pytcl.assignment_algorithms.two_dimensional import AssignmentResult
36
+ from pytcl.assignment_algorithms.two_dimensional import KBestResult
37
+ from pytcl.assignment_algorithms.two_dimensional import assign2d
38
+ from pytcl.assignment_algorithms.two_dimensional import auction
39
+ from pytcl.assignment_algorithms.two_dimensional import hungarian
40
+ from pytcl.assignment_algorithms.two_dimensional import kbest_assign2d
41
+ from pytcl.assignment_algorithms.two_dimensional import linear_sum_assignment
42
+ from pytcl.assignment_algorithms.two_dimensional import murty
43
+ from pytcl.assignment_algorithms.two_dimensional import ranked_assignments
54
44
 
55
45
  __all__ = [
56
46
  # 2D Assignment
@@ -5,18 +5,17 @@ This module provides algorithms for associating measurements to tracks,
5
5
  including Global Nearest Neighbor (GNN) and related methods.
6
6
  """
7
7
 
8
- from typing import List, NamedTuple, Optional
8
+ from typing import List
9
+ from typing import NamedTuple
10
+ from typing import Optional
9
11
 
10
12
  import numpy as np
11
- from numpy.typing import ArrayLike, NDArray
12
-
13
- from pytcl.assignment_algorithms.gating import (
14
- mahalanobis_batch,
15
- mahalanobis_distance,
16
- )
17
- from pytcl.assignment_algorithms.two_dimensional import (
18
- assign2d,
19
- )
13
+ from numpy.typing import ArrayLike
14
+ from numpy.typing import NDArray
15
+
16
+ from pytcl.assignment_algorithms.gating import mahalanobis_batch
17
+ from pytcl.assignment_algorithms.gating import mahalanobis_distance
18
+ from pytcl.assignment_algorithms.two_dimensional import assign2d
20
19
 
21
20
 
22
21
  class AssociationResult(NamedTuple):
@@ -5,11 +5,13 @@ 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 List
9
+ from typing import Tuple
9
10
 
10
11
  import numpy as np
11
12
  from numba import njit
12
- from numpy.typing import ArrayLike, NDArray
13
+ from numpy.typing import ArrayLike
14
+ from numpy.typing import NDArray
13
15
  from scipy.stats import chi2
14
16
 
15
17
 
@@ -19,9 +21,9 @@ def _mahalanobis_distance_2d(
19
21
  S_inv: np.ndarray,
20
22
  ) -> float:
21
23
  """JIT-compiled Mahalanobis distance for 2D innovations."""
22
- return innovation[0] * (
23
- S_inv[0, 0] * innovation[0] + S_inv[0, 1] * innovation[1]
24
- ) + innovation[1] * (S_inv[1, 0] * innovation[0] + S_inv[1, 1] * innovation[1])
24
+ return innovation[0] * (S_inv[0, 0] * innovation[0] + S_inv[0, 1] * innovation[1]) + innovation[
25
+ 1
26
+ ] * (S_inv[1, 0] * innovation[0] + S_inv[1, 1] * innovation[1])
25
27
 
26
28
 
27
29
  @njit(cache=True, fastmath=True)
@@ -9,11 +9,15 @@ 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 List
13
+ from typing import NamedTuple
14
+ from typing import Optional
15
+ from typing import Tuple
13
16
 
14
17
  import numpy as np
15
18
  from numba import njit
16
- from numpy.typing import ArrayLike, NDArray
19
+ from numpy.typing import ArrayLike
20
+ from numpy.typing import NDArray
17
21
  from scipy.stats import chi2
18
22
 
19
23
  from pytcl.assignment_algorithms.gating import mahalanobis_distance
@@ -94,9 +98,7 @@ def compute_measurement_likelihood(
94
98
  return 0.0
95
99
 
96
100
  mahal_sq = innovation @ np.linalg.solve(innovation_cov, innovation)
97
- likelihood = (
98
- detection_prob * np.exp(-0.5 * mahal_sq) / np.sqrt((2 * np.pi) ** m * det_S)
99
- )
101
+ likelihood = detection_prob * np.exp(-0.5 * mahal_sq) / np.sqrt((2 * np.pi) ** m * det_S)
100
102
 
101
103
  return likelihood
102
104
 
@@ -210,9 +212,7 @@ def jpda_probabilities(
210
212
  if n_tracks <= 5 and n_meas <= 5:
211
213
  beta = _jpda_exact(likelihood_matrix, gated, detection_prob, clutter_density)
212
214
  else:
213
- beta = _jpda_approximate(
214
- likelihood_matrix, gated, detection_prob, clutter_density
215
- )
215
+ beta = _jpda_approximate(likelihood_matrix, gated, detection_prob, clutter_density)
216
216
 
217
217
  return beta
218
218
 
@@ -258,9 +258,7 @@ def _jpda_exact(
258
258
  if gated[track_idx, meas_idx] and track_idx not in used_tracks:
259
259
  current_assignment.append(track_idx)
260
260
  used_tracks.add(track_idx)
261
- yield from generate_hypotheses(
262
- meas_idx + 1, current_assignment, used_tracks
263
- )
261
+ yield from generate_hypotheses(meas_idx + 1, current_assignment, used_tracks)
264
262
  used_tracks.remove(track_idx)
265
263
  current_assignment.pop()
266
264
 
@@ -298,9 +296,7 @@ def _jpda_exact(
298
296
  hypothesis_probs = [p / total_prob for p in hypothesis_probs]
299
297
 
300
298
  # Compute marginal association probabilities
301
- for h_idx, (assignment, prob) in enumerate(
302
- zip(hypothesis_assignments, hypothesis_probs)
303
- ):
299
+ for h_idx, (assignment, prob) in enumerate(zip(hypothesis_assignments, hypothesis_probs)):
304
300
  detected_tracks = set()
305
301
  for j, track_idx in enumerate(assignment):
306
302
  if track_idx >= 0:
@@ -5,14 +5,12 @@ This module provides algorithms for solving 3D assignment problems,
5
5
  which arise in multi-sensor data fusion and multi-scan tracking.
6
6
  """
7
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
- )
8
+ from pytcl.assignment_algorithms.three_dimensional.assignment import Assignment3DResult
9
+ from pytcl.assignment_algorithms.three_dimensional.assignment import assign3d
10
+ from pytcl.assignment_algorithms.three_dimensional.assignment import assign3d_auction
11
+ from pytcl.assignment_algorithms.three_dimensional.assignment import assign3d_lagrangian
12
+ from pytcl.assignment_algorithms.three_dimensional.assignment import decompose_to_2d
13
+ from pytcl.assignment_algorithms.three_dimensional.assignment import greedy_3d
16
14
 
17
15
  __all__ = [
18
16
  "Assignment3DResult",
@@ -11,10 +11,14 @@ cost subject to the constraint that each index appears in at most one
11
11
  selected tuple.
12
12
  """
13
13
 
14
- from typing import List, NamedTuple, Optional, Tuple
14
+ from typing import List
15
+ from typing import NamedTuple
16
+ from typing import Optional
17
+ from typing import Tuple
15
18
 
16
19
  import numpy as np
17
- from numpy.typing import ArrayLike, NDArray
20
+ from numpy.typing import ArrayLike
21
+ from numpy.typing import NDArray
18
22
  from scipy.optimize import linear_sum_assignment as scipy_lsa
19
23
 
20
24
 
@@ -6,19 +6,15 @@ the 2D assignment problem (bipartite matching), as well as k-best
6
6
  assignment algorithms for Multiple Hypothesis Tracking.
7
7
  """
8
8
 
9
- from pytcl.assignment_algorithms.two_dimensional.assignment import (
10
- AssignmentResult,
11
- assign2d,
12
- auction,
13
- hungarian,
14
- linear_sum_assignment,
15
- )
16
- from pytcl.assignment_algorithms.two_dimensional.kbest import (
17
- KBestResult,
18
- kbest_assign2d,
19
- murty,
20
- ranked_assignments,
21
- )
9
+ from pytcl.assignment_algorithms.two_dimensional.assignment import AssignmentResult
10
+ from pytcl.assignment_algorithms.two_dimensional.assignment import assign2d
11
+ from pytcl.assignment_algorithms.two_dimensional.assignment import auction
12
+ from pytcl.assignment_algorithms.two_dimensional.assignment import hungarian
13
+ from pytcl.assignment_algorithms.two_dimensional.assignment import linear_sum_assignment
14
+ from pytcl.assignment_algorithms.two_dimensional.kbest import KBestResult
15
+ from pytcl.assignment_algorithms.two_dimensional.kbest import kbest_assign2d
16
+ from pytcl.assignment_algorithms.two_dimensional.kbest import murty
17
+ from pytcl.assignment_algorithms.two_dimensional.kbest import ranked_assignments
22
18
 
23
19
  __all__ = [
24
20
  # 2D Assignment
@@ -5,10 +5,13 @@ This module provides algorithms for solving the 2D assignment (bipartite matchin
5
5
  problem, which is fundamental to data association in target tracking.
6
6
  """
7
7
 
8
- from typing import NamedTuple, Optional, Tuple
8
+ from typing import NamedTuple
9
+ from typing import Optional
10
+ from typing import Tuple
9
11
 
10
12
  import numpy as np
11
- from numpy.typing import ArrayLike, NDArray
13
+ from numpy.typing import ArrayLike
14
+ from numpy.typing import NDArray
12
15
  from scipy.optimize import linear_sum_assignment as scipy_lsa
13
16
 
14
17
 
@@ -6,16 +6,18 @@ This module provides algorithms for finding the k best solutions to the
6
6
  Multiple Hypothesis Tracking (MHT).
7
7
  """
8
8
 
9
- from typing import List, NamedTuple, Optional, Tuple
9
+ from typing import List
10
+ from typing import NamedTuple
11
+ from typing import Optional
12
+ from typing import Tuple
10
13
 
11
14
  import numpy as np
12
- from numpy.typing import ArrayLike, NDArray
15
+ from numpy.typing import ArrayLike
16
+ from numpy.typing import NDArray
13
17
  from scipy.optimize import linear_sum_assignment as scipy_lsa
14
18
 
15
- from pytcl.assignment_algorithms.two_dimensional.assignment import (
16
- AssignmentResult,
17
- assign2d,
18
- )
19
+ from pytcl.assignment_algorithms.two_dimensional.assignment import AssignmentResult
20
+ from pytcl.assignment_algorithms.two_dimensional.assignment import assign2d
19
21
 
20
22
 
21
23
  class KBestResult(NamedTuple):
@@ -335,9 +337,7 @@ def _partition_solution(
335
337
 
336
338
  for i in range(start_idx, n_assigned):
337
339
  # Require assignments 0..i-1, forbid assignment i
338
- new_required = required + [
339
- (row_ind[j], col_ind[j]) for j in range(start_idx, i)
340
- ]
340
+ new_required = required + [(row_ind[j], col_ind[j]) for j in range(start_idx, i)]
341
341
  new_forbidden = forbidden + [(row_ind[i], col_ind[i])]
342
342
 
343
343
  # Solve constrained problem