nrl-tracker 1.7.0__tar.gz → 1.7.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nrl_tracker-1.7.0/nrl_tracker.egg-info → nrl_tracker-1.7.3}/PKG-INFO +43 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/README.md +42 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3/nrl_tracker.egg-info}/PKG-INFO +43 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pyproject.toml +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/__init__.py +2 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/gating.py +10 -10
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/jpda.py +40 -40
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/nd_assignment.py +5 -4
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/network_flow.py +18 -8
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/__init__.py +9 -9
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/ephemerides.py +14 -11
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/reference_frames.py +8 -4
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/relativity.py +6 -5
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/special_orbits.py +9 -13
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/nrlmsise00.py +153 -152
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/dbscan.py +2 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/gaussian_mixture.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/hierarchical.py +15 -15
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/kmeans.py +4 -4
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/base.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/cluster_set.py +12 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/covertree.py +5 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/rtree.py +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/vptree.py +4 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/conversions/geodetic.py +31 -7
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/projections/__init__.py +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/projections/projections.py +2 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/rotations/rotations.py +10 -6
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/validation.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/gaussian_sum_filter.py +20 -38
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/imm.py +14 -14
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/constrained.py +35 -23
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/extended.py +8 -8
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/h_infinity.py +2 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/square_root.py +8 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/sr_ukf.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/ud_filter.py +11 -5
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/unscented.py +8 -6
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/rbpf.py +36 -40
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/spherical_harmonics.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/tides.py +6 -6
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/logging_config.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/emm.py +10 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/wmm.py +4 -4
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/geometry/geometry.py +5 -5
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/detection.py +24 -24
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/filters.py +14 -14
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/bessel.py +15 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/debye.py +5 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/hypergeometric.py +6 -4
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/fourier.py +8 -8
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/stft.py +12 -12
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/wavelets.py +9 -9
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/geodesy.py +3 -3
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/great_circle.py +5 -5
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/coordinates.py +7 -7
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/tracks.py +2 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/maximum_likelihood.py +16 -14
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/robust.py +5 -5
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/loaders.py +5 -5
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/hypothesis.py +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/mht.py +9 -9
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/multi_target.py +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_assignment_algorithms.py +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_constrained_ekf.py +142 -143
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_coordinate_systems.py +8 -8
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_gaussian_sum_filter.py +8 -12
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_nd_assignment.py +2 -6
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_network_flow.py +2 -4
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_nrlmsise00.py +382 -199
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_rbpf.py +55 -24
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_sgp4.py +3 -2
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_special_functions_phase12.py +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/CONTRIBUTING.md +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/LICENSE +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/MANIFEST.in +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/SOURCES.txt +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/dependency_links.txt +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/requires.txt +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/nrl_tracker.egg-info/top_level.txt +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/__init__.py +15 -15
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/data_association.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/two_dimensional/assignment.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/lambert.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/orbital_mechanics.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/sgp4.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/time_systems.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/astronomical/tle.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/__init__.py +6 -6
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/ionosphere.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/atmosphere/models.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/clustering/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/kd_tree.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/measurement_set.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/containers/track_list.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/array_utils.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/core/constants.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/__init__.py +16 -16
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/information_filter.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/__init__.py +1 -1
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/kalman/linear.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_estimation/smoothers.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/dynamic_models/process_noise/singer.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/clenshaw.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/egm.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/gravity/models.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/magnetism/igrf.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/interpolation/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/lambert_w.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/special_functions/marcum_q.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/misc/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/ins.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/ins_gnss.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/navigation/rhumb.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/performance_evaluation/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/performance_evaluation/track_metrics.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/physical_values/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/ellipses.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/plotting/metrics.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/scheduling/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/static_estimation/least_squares.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/dem.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/terrain/visibility.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/trackers/single_target.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/transponders/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/setup.cfg +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/__init__.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/conftest.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_additional_trees.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_astronomical.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_clustering.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_coverage_boost.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_coverage_boost_2.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_dynamic_models.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_egm.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_emm.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_ephemerides.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_gaussian_mixtures.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_geophysical.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_great_circle.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_h_infinity.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_ins.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_ins_gnss.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_kalman_filters.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_mathematical_functions.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_maximum_likelihood.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_mht.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_performance_evaluation.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_phase6_specialized.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_plotting.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_projections.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_relativity.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_rhumb.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_signal_processing.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_smoothers.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_spatial_containers_parametrized.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_spatial_structures.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_special_orbits.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_static_estimation.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_terrain.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_terrain_loaders.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_tides.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_tod_mod.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_trackers.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_tracking_containers.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_transforms.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_v030_comprehensive.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_v030_features.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/test_validation.py +0 -0
- {nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/tests/unit/test_core.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nrl-tracker
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.3
|
|
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,12 +63,13 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
|
|
|
63
63
|
|
|
64
64
|
# Tracker Component Library (Python)
|
|
65
65
|
|
|
66
|
-
[](https://pypi.org/project/nrl-tracker/)
|
|
67
67
|
[](https://www.python.org/downloads/)
|
|
68
68
|
[](https://en.wikipedia.org/wiki/Public_domain)
|
|
69
69
|
[](https://github.com/psf/black)
|
|
70
70
|
[](https://github.com/nedonatelli/TCL)
|
|
71
71
|
[](docs/gap_analysis.rst)
|
|
72
|
+
[](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
|
|
|
@@ -208,7 +209,46 @@ pytcl/
|
|
|
208
209
|
|
|
209
210
|
- [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
|
|
210
211
|
- [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
|
|
211
|
-
- [Examples](examples/)
|
|
212
|
+
- [Examples](examples/) - 29 validated example scripts
|
|
213
|
+
- [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
|
|
214
|
+
|
|
215
|
+
## Examples & Tutorials
|
|
216
|
+
|
|
217
|
+
The library includes 39 runnable code examples demonstrating all major features:
|
|
218
|
+
|
|
219
|
+
### Examples (29 files in `/examples/`)
|
|
220
|
+
|
|
221
|
+
Comprehensive demonstrations of library functionality:
|
|
222
|
+
- **Tracking & Estimation**: Kalman filters, particle filters, smoothers
|
|
223
|
+
- **Assignment**: Hungarian algorithm, k-best assignments, 3D assignment
|
|
224
|
+
- **Coordinates**: Frame conversions, transformations, geodetic calculations
|
|
225
|
+
- **Dynamics**: State models, motion models, dynamic systems
|
|
226
|
+
- **Filtering**: Uncertainty visualization, multi-target tracking
|
|
227
|
+
- **Astronomy**: Ephemerides, orbital mechanics, relativistic corrections
|
|
228
|
+
- **Navigation**: INS/GNSS integration, geophysical modeling
|
|
229
|
+
- **Signal Processing**: Detection, filtering, transforms
|
|
230
|
+
- **Terrain & Atmosphere**: Elevation models, atmospheric properties
|
|
231
|
+
|
|
232
|
+
**Status**: ✅ All 29 examples validated and passing (100% execution success)
|
|
233
|
+
|
|
234
|
+
### Tutorials (10 modules in `/docs/tutorials/`)
|
|
235
|
+
|
|
236
|
+
Interactive learning modules with visualizations:
|
|
237
|
+
- Assignment algorithms and 3D assignment problems
|
|
238
|
+
- Atmospheric and geophysical models
|
|
239
|
+
- Dynamical systems and reference frames
|
|
240
|
+
- Filtering and smoothing techniques
|
|
241
|
+
- Sensor fusion and advanced filtering
|
|
242
|
+
- Special functions and mathematical tools
|
|
243
|
+
|
|
244
|
+
**Status**: ✅ All 10 tutorials validated and passing (100% execution success)
|
|
245
|
+
|
|
246
|
+
## Documentation
|
|
247
|
+
|
|
248
|
+
- [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
|
|
249
|
+
- [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
|
|
250
|
+
- [Examples](examples/) - 29 validated example scripts
|
|
251
|
+
- [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
|
|
212
252
|
|
|
213
253
|
## Comparison with Original MATLAB Library
|
|
214
254
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# Tracker Component Library (Python)
|
|
2
2
|
|
|
3
|
-
[](https://pypi.org/project/nrl-tracker/)
|
|
4
4
|
[](https://www.python.org/downloads/)
|
|
5
5
|
[](https://en.wikipedia.org/wiki/Public_domain)
|
|
6
6
|
[](https://github.com/psf/black)
|
|
7
7
|
[](https://github.com/nedonatelli/TCL)
|
|
8
8
|
[](docs/gap_analysis.rst)
|
|
9
|
+
[](mypy.ini)
|
|
9
10
|
|
|
10
11
|
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.
|
|
11
12
|
|
|
@@ -145,7 +146,46 @@ pytcl/
|
|
|
145
146
|
|
|
146
147
|
- [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
|
|
147
148
|
- [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
|
|
148
|
-
- [Examples](examples/)
|
|
149
|
+
- [Examples](examples/) - 29 validated example scripts
|
|
150
|
+
- [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
|
|
151
|
+
|
|
152
|
+
## Examples & Tutorials
|
|
153
|
+
|
|
154
|
+
The library includes 39 runnable code examples demonstrating all major features:
|
|
155
|
+
|
|
156
|
+
### Examples (29 files in `/examples/`)
|
|
157
|
+
|
|
158
|
+
Comprehensive demonstrations of library functionality:
|
|
159
|
+
- **Tracking & Estimation**: Kalman filters, particle filters, smoothers
|
|
160
|
+
- **Assignment**: Hungarian algorithm, k-best assignments, 3D assignment
|
|
161
|
+
- **Coordinates**: Frame conversions, transformations, geodetic calculations
|
|
162
|
+
- **Dynamics**: State models, motion models, dynamic systems
|
|
163
|
+
- **Filtering**: Uncertainty visualization, multi-target tracking
|
|
164
|
+
- **Astronomy**: Ephemerides, orbital mechanics, relativistic corrections
|
|
165
|
+
- **Navigation**: INS/GNSS integration, geophysical modeling
|
|
166
|
+
- **Signal Processing**: Detection, filtering, transforms
|
|
167
|
+
- **Terrain & Atmosphere**: Elevation models, atmospheric properties
|
|
168
|
+
|
|
169
|
+
**Status**: ✅ All 29 examples validated and passing (100% execution success)
|
|
170
|
+
|
|
171
|
+
### Tutorials (10 modules in `/docs/tutorials/`)
|
|
172
|
+
|
|
173
|
+
Interactive learning modules with visualizations:
|
|
174
|
+
- Assignment algorithms and 3D assignment problems
|
|
175
|
+
- Atmospheric and geophysical models
|
|
176
|
+
- Dynamical systems and reference frames
|
|
177
|
+
- Filtering and smoothing techniques
|
|
178
|
+
- Sensor fusion and advanced filtering
|
|
179
|
+
- Special functions and mathematical tools
|
|
180
|
+
|
|
181
|
+
**Status**: ✅ All 10 tutorials validated and passing (100% execution success)
|
|
182
|
+
|
|
183
|
+
## Documentation
|
|
184
|
+
|
|
185
|
+
- [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
|
|
186
|
+
- [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
|
|
187
|
+
- [Examples](examples/) - 29 validated example scripts
|
|
188
|
+
- [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
|
|
149
189
|
|
|
150
190
|
## Comparison with Original MATLAB Library
|
|
151
191
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nrl-tracker
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.3
|
|
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,12 +63,13 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
|
|
|
63
63
|
|
|
64
64
|
# Tracker Component Library (Python)
|
|
65
65
|
|
|
66
|
-
[](https://pypi.org/project/nrl-tracker/)
|
|
67
67
|
[](https://www.python.org/downloads/)
|
|
68
68
|
[](https://en.wikipedia.org/wiki/Public_domain)
|
|
69
69
|
[](https://github.com/psf/black)
|
|
70
70
|
[](https://github.com/nedonatelli/TCL)
|
|
71
71
|
[](docs/gap_analysis.rst)
|
|
72
|
+
[](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
|
|
|
@@ -208,7 +209,46 @@ pytcl/
|
|
|
208
209
|
|
|
209
210
|
- [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
|
|
210
211
|
- [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
|
|
211
|
-
- [Examples](examples/)
|
|
212
|
+
- [Examples](examples/) - 29 validated example scripts
|
|
213
|
+
- [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
|
|
214
|
+
|
|
215
|
+
## Examples & Tutorials
|
|
216
|
+
|
|
217
|
+
The library includes 39 runnable code examples demonstrating all major features:
|
|
218
|
+
|
|
219
|
+
### Examples (29 files in `/examples/`)
|
|
220
|
+
|
|
221
|
+
Comprehensive demonstrations of library functionality:
|
|
222
|
+
- **Tracking & Estimation**: Kalman filters, particle filters, smoothers
|
|
223
|
+
- **Assignment**: Hungarian algorithm, k-best assignments, 3D assignment
|
|
224
|
+
- **Coordinates**: Frame conversions, transformations, geodetic calculations
|
|
225
|
+
- **Dynamics**: State models, motion models, dynamic systems
|
|
226
|
+
- **Filtering**: Uncertainty visualization, multi-target tracking
|
|
227
|
+
- **Astronomy**: Ephemerides, orbital mechanics, relativistic corrections
|
|
228
|
+
- **Navigation**: INS/GNSS integration, geophysical modeling
|
|
229
|
+
- **Signal Processing**: Detection, filtering, transforms
|
|
230
|
+
- **Terrain & Atmosphere**: Elevation models, atmospheric properties
|
|
231
|
+
|
|
232
|
+
**Status**: ✅ All 29 examples validated and passing (100% execution success)
|
|
233
|
+
|
|
234
|
+
### Tutorials (10 modules in `/docs/tutorials/`)
|
|
235
|
+
|
|
236
|
+
Interactive learning modules with visualizations:
|
|
237
|
+
- Assignment algorithms and 3D assignment problems
|
|
238
|
+
- Atmospheric and geophysical models
|
|
239
|
+
- Dynamical systems and reference frames
|
|
240
|
+
- Filtering and smoothing techniques
|
|
241
|
+
- Sensor fusion and advanced filtering
|
|
242
|
+
- Special functions and mathematical tools
|
|
243
|
+
|
|
244
|
+
**Status**: ✅ All 10 tutorials validated and passing (100% execution success)
|
|
245
|
+
|
|
246
|
+
## Documentation
|
|
247
|
+
|
|
248
|
+
- [API Reference](https://pytcl.readthedocs.io/en/latest/api/)
|
|
249
|
+
- [User Guides](https://pytcl.readthedocs.io/en/latest/user_guide/)
|
|
250
|
+
- [Examples](examples/) - 29 validated example scripts
|
|
251
|
+
- [Tutorials](docs/tutorials/) - 10 interactive tutorial modules
|
|
212
252
|
|
|
213
253
|
## Comparison with Original MATLAB Library
|
|
214
254
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "nrl-tracker"
|
|
7
|
-
version = "1.7.
|
|
7
|
+
version = "1.7.3"
|
|
8
8
|
description = "Python port of the U.S. Naval Research Laboratory's Tracker Component Library for target tracking algorithms"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [
|
|
@@ -20,7 +20,7 @@ References
|
|
|
20
20
|
no. 5, pp. 18-27, May 2017.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
-
__version__ = "1.
|
|
23
|
+
__version__ = "1.7.3"
|
|
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
|
|
|
@@ -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
|
|
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:
|
|
106
|
-
track_covariances:
|
|
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
|
-
) ->
|
|
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
|
|
|
@@ -212,14 +212,15 @@ def relaxation_assignment_nd(
|
|
|
212
212
|
result_relaxed = greedy_assignment_nd(relaxed_cost)
|
|
213
213
|
|
|
214
214
|
# Compute lower bound from relaxed solution
|
|
215
|
-
lower_bound = (
|
|
216
|
-
|
|
217
|
-
+ sum(np.sum(lambdas[d]) for d in range(n_dims))
|
|
215
|
+
lower_bound = result_relaxed.cost + sum(
|
|
216
|
+
np.sum(lambdas[d]) for d in range(n_dims)
|
|
218
217
|
)
|
|
219
218
|
|
|
220
219
|
# Extract solution from relaxed problem
|
|
221
220
|
if len(result_relaxed.assignments) > 0:
|
|
222
|
-
actual_cost = float(
|
|
221
|
+
actual_cost = float(
|
|
222
|
+
np.sum(cost_tensor[tuple(result_relaxed.assignments.T)])
|
|
223
|
+
)
|
|
223
224
|
|
|
224
225
|
if actual_cost < best_cost:
|
|
225
226
|
best_cost = actual_cost
|
|
@@ -20,7 +20,7 @@ References
|
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
from enum import Enum
|
|
23
|
-
from typing import NamedTuple, Tuple
|
|
23
|
+
from typing import Any, NamedTuple, Tuple
|
|
24
24
|
|
|
25
25
|
import numpy as np
|
|
26
26
|
from numpy.typing import NDArray
|
|
@@ -79,7 +79,7 @@ class FlowEdge(NamedTuple):
|
|
|
79
79
|
|
|
80
80
|
def assignment_to_flow_network(
|
|
81
81
|
cost_matrix: NDArray[np.float64],
|
|
82
|
-
) -> Tuple[list, NDArray, NDArray]:
|
|
82
|
+
) -> Tuple[list[FlowEdge], NDArray[np.floating], NDArray[Any]]:
|
|
83
83
|
"""
|
|
84
84
|
Convert 2D assignment problem to min-cost flow network.
|
|
85
85
|
|
|
@@ -140,7 +140,9 @@ def assignment_to_flow_network(
|
|
|
140
140
|
# Tasks to sink: capacity 1, cost 0
|
|
141
141
|
for j in range(1, n + 1):
|
|
142
142
|
task_node = m + j
|
|
143
|
-
edges.append(
|
|
143
|
+
edges.append(
|
|
144
|
+
FlowEdge(from_node=task_node, to_node=sink, capacity=1.0, cost=0.0)
|
|
145
|
+
)
|
|
144
146
|
|
|
145
147
|
# Supply/demand: source supplies m units, sink demands m units
|
|
146
148
|
supplies = np.zeros(n_nodes)
|
|
@@ -158,7 +160,7 @@ def assignment_to_flow_network(
|
|
|
158
160
|
|
|
159
161
|
|
|
160
162
|
def min_cost_flow_successive_shortest_paths(
|
|
161
|
-
edges: list,
|
|
163
|
+
edges: list[FlowEdge],
|
|
162
164
|
supplies: NDArray[np.float64],
|
|
163
165
|
max_iterations: int = 1000,
|
|
164
166
|
) -> MinCostFlowResult:
|
|
@@ -260,7 +262,9 @@ def min_cost_flow_successive_shortest_paths(
|
|
|
260
262
|
|
|
261
263
|
# Find minimum capacity along path
|
|
262
264
|
min_flow = min(residual_capacity[e] for e in path_edges)
|
|
263
|
-
min_flow = min(
|
|
265
|
+
min_flow = min(
|
|
266
|
+
min_flow, current_supplies[excess_node], -current_supplies[deficit_node]
|
|
267
|
+
)
|
|
264
268
|
|
|
265
269
|
# Push flow along path
|
|
266
270
|
total_cost = 0.0
|
|
@@ -295,7 +299,7 @@ def min_cost_flow_successive_shortest_paths(
|
|
|
295
299
|
|
|
296
300
|
def assignment_from_flow_solution(
|
|
297
301
|
flow: NDArray[np.float64],
|
|
298
|
-
edges: list,
|
|
302
|
+
edges: list[FlowEdge],
|
|
299
303
|
cost_matrix_shape: Tuple[int, int],
|
|
300
304
|
) -> Tuple[NDArray[np.intp], float]:
|
|
301
305
|
"""
|
|
@@ -331,7 +335,11 @@ def assignment_from_flow_solution(
|
|
|
331
335
|
assignment = np.array(assignment, dtype=np.intp)
|
|
332
336
|
cost = 0.0
|
|
333
337
|
if len(assignment) > 0:
|
|
334
|
-
cost = float(
|
|
338
|
+
cost = float(
|
|
339
|
+
np.sum(
|
|
340
|
+
flow[edge_idx] * edges[edge_idx].cost for edge_idx in range(len(edges))
|
|
341
|
+
)
|
|
342
|
+
)
|
|
335
343
|
|
|
336
344
|
return assignment, cost
|
|
337
345
|
|
|
@@ -356,6 +364,8 @@ def min_cost_assignment_via_flow(
|
|
|
356
364
|
"""
|
|
357
365
|
edges, supplies, _ = assignment_to_flow_network(cost_matrix)
|
|
358
366
|
result = min_cost_flow_successive_shortest_paths(edges, supplies)
|
|
359
|
-
assignment, cost = assignment_from_flow_solution(
|
|
367
|
+
assignment, cost = assignment_from_flow_solution(
|
|
368
|
+
result.flow, edges, cost_matrix.shape
|
|
369
|
+
)
|
|
360
370
|
|
|
361
371
|
return assignment, cost
|
{nrl_tracker-1.7.0 → nrl_tracker-1.7.3}/pytcl/assignment_algorithms/three_dimensional/assignment.py
RENAMED
|
@@ -11,7 +11,7 @@ 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 Any, List, NamedTuple, Optional, Tuple
|
|
15
15
|
|
|
16
16
|
import numpy as np
|
|
17
17
|
from numpy.typing import ArrayLike, NDArray
|
|
@@ -511,7 +511,7 @@ def assign3d_auction(
|
|
|
511
511
|
assign_i: List[Optional[Tuple[int, int]]] = [None] * n1
|
|
512
512
|
|
|
513
513
|
# Reverse: which i is assigned to (j, k)
|
|
514
|
-
reverse: dict = {}
|
|
514
|
+
reverse: dict[tuple[int, int], int] = {}
|
|
515
515
|
|
|
516
516
|
converged = False
|
|
517
517
|
|
|
@@ -585,7 +585,7 @@ def assign3d(
|
|
|
585
585
|
cost_tensor: ArrayLike,
|
|
586
586
|
method: str = "lagrangian",
|
|
587
587
|
maximize: bool = False,
|
|
588
|
-
**kwargs,
|
|
588
|
+
**kwargs: Any,
|
|
589
589
|
) -> Assignment3DResult:
|
|
590
590
|
"""
|
|
591
591
|
Solve 3D assignment problem.
|