nrl-tracker 1.7.3__tar.gz → 1.7.5__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.3/nrl_tracker.egg-info → nrl_tracker-1.7.5}/PKG-INFO +1 -1
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5/nrl_tracker.egg-info}/PKG-INFO +1 -1
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/SOURCES.txt +2 -3
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pyproject.toml +1 -1
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/__init__.py +3 -2
- nrl_tracker-1.7.5/tests/test_jpda.py +236 -0
- nrl_tracker-1.7.3/tests/test_special_functions_phase12.py → nrl_tracker-1.7.5/tests/test_special_functions.py +1 -1
- nrl_tracker-1.7.3/tests/test_v030_comprehensive.py +0 -866
- nrl_tracker-1.7.3/tests/test_v030_features.py +0 -447
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/CONTRIBUTING.md +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/LICENSE +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/MANIFEST.in +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/README.md +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/dependency_links.txt +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/requires.txt +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/nrl_tracker.egg-info/top_level.txt +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/data_association.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/gating.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/jpda.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/nd_assignment.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/network_flow.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/three_dimensional/assignment.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/two_dimensional/assignment.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/ephemerides.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/lambert.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/orbital_mechanics.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/reference_frames.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/relativity.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/sgp4.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/special_orbits.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/time_systems.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/astronomical/tle.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/ionosphere.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/models.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/atmosphere/nrlmsise00.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/dbscan.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/gaussian_mixture.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/hierarchical.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/clustering/kmeans.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/base.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/cluster_set.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/covertree.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/kd_tree.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/measurement_set.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/rtree.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/track_list.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/containers/vptree.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/conversions/geodetic.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/jacobians/jacobians.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/projections/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/projections/projections.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/coordinate_systems/rotations/rotations.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/array_utils.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/constants.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/core/validation.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/gaussian_sum_filter.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/imm.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/information_filter.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/constrained.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/extended.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/h_infinity.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/linear.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/square_root.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/sr_ukf.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/ud_filter.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/kalman/unscented.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/rbpf.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_estimation/smoothers.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/dynamic_models/process_noise/singer.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/clenshaw.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/egm.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/models.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/spherical_harmonics.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/gravity/tides.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/logging_config.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/emm.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/igrf.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/magnetism/wmm.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/combinatorics/combinatorics.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/geometry/geometry.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/interpolation/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/numerical_integration/quadrature.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/detection.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/filters.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/signal_processing/matched_filter.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/bessel.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/debye.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/error_functions.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/gamma_functions.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/hypergeometric.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/lambert_w.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/special_functions/marcum_q.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/fourier.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/stft.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/mathematical_functions/transforms/wavelets.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/misc/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/geodesy.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/great_circle.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/ins.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/ins_gnss.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/navigation/rhumb.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/performance_evaluation/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/performance_evaluation/track_metrics.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/physical_values/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/coordinates.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/ellipses.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/metrics.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/plotting/tracks.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/scheduling/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/least_squares.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/maximum_likelihood.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/static_estimation/robust.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/dem.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/loaders.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/terrain/visibility.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/hypothesis.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/mht.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/multi_target.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/trackers/single_target.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/pytcl/transponders/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/setup.cfg +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/__init__.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/conftest.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_additional_trees.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_assignment_algorithms.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_astronomical.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_clustering.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_constrained_ekf.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_coordinate_systems.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_coverage_boost.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_coverage_boost_2.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_dynamic_models.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_egm.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_emm.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_ephemerides.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_gaussian_mixtures.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_gaussian_sum_filter.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_geophysical.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_great_circle.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_h_infinity.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_ins.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_ins_gnss.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_kalman_filters.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_mathematical_functions.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_maximum_likelihood.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_mht.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_nd_assignment.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_network_flow.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_nrlmsise00.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_performance_evaluation.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_phase6_specialized.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_plotting.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_projections.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_rbpf.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_relativity.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_rhumb.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_sgp4.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_signal_processing.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_smoothers.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_spatial_containers_parametrized.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_spatial_structures.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_special_orbits.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_static_estimation.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_terrain.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_terrain_loaders.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_tides.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_tod_mod.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_trackers.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_tracking_containers.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_transforms.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/tests/test_validation.py +0 -0
- {nrl_tracker-1.7.3 → nrl_tracker-1.7.5}/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.5
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nrl-tracker
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.5
|
|
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
|
|
@@ -189,6 +189,7 @@ tests/test_great_circle.py
|
|
|
189
189
|
tests/test_h_infinity.py
|
|
190
190
|
tests/test_ins.py
|
|
191
191
|
tests/test_ins_gnss.py
|
|
192
|
+
tests/test_jpda.py
|
|
192
193
|
tests/test_kalman_filters.py
|
|
193
194
|
tests/test_mathematical_functions.py
|
|
194
195
|
tests/test_maximum_likelihood.py
|
|
@@ -208,7 +209,7 @@ tests/test_signal_processing.py
|
|
|
208
209
|
tests/test_smoothers.py
|
|
209
210
|
tests/test_spatial_containers_parametrized.py
|
|
210
211
|
tests/test_spatial_structures.py
|
|
211
|
-
tests/
|
|
212
|
+
tests/test_special_functions.py
|
|
212
213
|
tests/test_special_orbits.py
|
|
213
214
|
tests/test_static_estimation.py
|
|
214
215
|
tests/test_terrain.py
|
|
@@ -218,7 +219,5 @@ tests/test_tod_mod.py
|
|
|
218
219
|
tests/test_trackers.py
|
|
219
220
|
tests/test_tracking_containers.py
|
|
220
221
|
tests/test_transforms.py
|
|
221
|
-
tests/test_v030_comprehensive.py
|
|
222
|
-
tests/test_v030_features.py
|
|
223
222
|
tests/test_validation.py
|
|
224
223
|
tests/unit/test_core.py
|
|
@@ -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.5"
|
|
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 = [
|
|
@@ -6,7 +6,8 @@ systems, dynamic models, estimation algorithms, and mathematical functions.
|
|
|
6
6
|
|
|
7
7
|
This is a Python port of the U.S. Naval Research Laboratory's Tracker Component
|
|
8
8
|
Library originally written in MATLAB.
|
|
9
|
-
|
|
9
|
+
**Current Version:** 1.7.4 (January 4, 2026)
|
|
10
|
+
**Status:** Production-ready, 2,057 tests passing, 76% line coverage
|
|
10
11
|
Examples
|
|
11
12
|
--------
|
|
12
13
|
>>> import pytcl as pytcl
|
|
@@ -20,7 +21,7 @@ References
|
|
|
20
21
|
no. 5, pp. 18-27, May 2017.
|
|
21
22
|
"""
|
|
22
23
|
|
|
23
|
-
__version__ = "1.7.
|
|
24
|
+
__version__ = "1.7.5"
|
|
24
25
|
__author__ = "Python Port Contributors"
|
|
25
26
|
__original_author__ = "David F. Crouse, Naval Research Laboratory"
|
|
26
27
|
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tests for Joint Probabilistic Data Association (JPDA) algorithms.
|
|
3
|
+
|
|
4
|
+
This module contains tests for JPDA-based multi-target association and tracking.
|
|
5
|
+
Tests are migrated from v0.3.0 comprehensive test suite.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import numpy as np
|
|
9
|
+
import pytest
|
|
10
|
+
from numpy.testing import assert_allclose
|
|
11
|
+
|
|
12
|
+
# =============================================================================
|
|
13
|
+
# JPDA Basic Tests
|
|
14
|
+
# =============================================================================
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TestJPDA:
|
|
18
|
+
"""Tests for Joint Probabilistic Data Association."""
|
|
19
|
+
|
|
20
|
+
def test_jpda_probabilities_single_track(self):
|
|
21
|
+
"""Test JPDA with single track."""
|
|
22
|
+
from pytcl.assignment_algorithms.jpda import jpda_probabilities
|
|
23
|
+
|
|
24
|
+
# Single track, two measurements
|
|
25
|
+
likelihood = np.array([[0.8, 0.1]])
|
|
26
|
+
gated = np.array([[True, True]])
|
|
27
|
+
|
|
28
|
+
beta = jpda_probabilities(
|
|
29
|
+
likelihood, gated, detection_prob=0.9, clutter_density=0.01
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
assert beta.shape == (1, 3) # 1 track, 2 meas + 1 for no-meas
|
|
33
|
+
# Probabilities should sum to 1 for each track
|
|
34
|
+
assert_allclose(np.sum(beta[0, :]), 1.0, rtol=1e-6)
|
|
35
|
+
# Higher likelihood measurement should have higher probability
|
|
36
|
+
assert beta[0, 0] > beta[0, 1]
|
|
37
|
+
|
|
38
|
+
def test_jpda_update_basic(self):
|
|
39
|
+
"""Test basic JPDA update."""
|
|
40
|
+
from pytcl.assignment_algorithms.jpda import jpda_update
|
|
41
|
+
|
|
42
|
+
x1 = np.array([0.0, 1.0])
|
|
43
|
+
x2 = np.array([5.0, -1.0])
|
|
44
|
+
P = np.eye(2) * 0.5
|
|
45
|
+
|
|
46
|
+
measurements = np.array([[0.1], [5.2], [10.0]])
|
|
47
|
+
H = np.array([[1.0, 0.0]])
|
|
48
|
+
R = np.array([[0.1]])
|
|
49
|
+
|
|
50
|
+
result = jpda_update([x1, x2], [P, P], measurements, H, R)
|
|
51
|
+
|
|
52
|
+
assert len(result.states) == 2
|
|
53
|
+
assert len(result.covariances) == 2
|
|
54
|
+
assert result.association_probs.shape == (2, 4) # 2 tracks, 3 meas + no-meas
|
|
55
|
+
|
|
56
|
+
def test_jpda_no_measurements(self):
|
|
57
|
+
"""Test JPDA with no measurements."""
|
|
58
|
+
from pytcl.assignment_algorithms.jpda import jpda_update
|
|
59
|
+
|
|
60
|
+
x = np.array([0.0, 1.0])
|
|
61
|
+
P = np.eye(2) * 0.5
|
|
62
|
+
|
|
63
|
+
measurements = np.array([]).reshape(0, 1)
|
|
64
|
+
H = np.array([[1.0, 0.0]])
|
|
65
|
+
R = np.array([[0.1]])
|
|
66
|
+
|
|
67
|
+
result = jpda_update([x], [P], measurements, H, R)
|
|
68
|
+
|
|
69
|
+
# With no measurements, state should be unchanged
|
|
70
|
+
assert_allclose(result.states[0], x)
|
|
71
|
+
|
|
72
|
+
def test_jpda_result_convenience(self):
|
|
73
|
+
"""Test JPDA convenience function."""
|
|
74
|
+
from pytcl.assignment_algorithms import jpda
|
|
75
|
+
|
|
76
|
+
x1 = np.array([0.0, 1.0])
|
|
77
|
+
x2 = np.array([5.0, -1.0])
|
|
78
|
+
P = np.eye(2) * 0.5
|
|
79
|
+
|
|
80
|
+
measurements = np.array([[0.1], [5.2]])
|
|
81
|
+
H = np.array([[1.0, 0.0]])
|
|
82
|
+
R = np.array([[0.1]])
|
|
83
|
+
|
|
84
|
+
result = jpda([x1, x2], [P, P], measurements, H, R)
|
|
85
|
+
|
|
86
|
+
assert result.association_probs.shape == (2, 3)
|
|
87
|
+
assert len(result.marginal_probs) == 2
|
|
88
|
+
assert result.likelihood_matrix.shape == (2, 2)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# =============================================================================
|
|
92
|
+
# JPDA Comprehensive Tests (v0.3.0)
|
|
93
|
+
# =============================================================================
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class TestJPDAComprehensive:
|
|
97
|
+
"""Comprehensive tests for JPDA algorithm robustness and edge cases."""
|
|
98
|
+
|
|
99
|
+
def test_jpda_probabilities_normalization(self):
|
|
100
|
+
"""Test JPDA probabilities sum to 1."""
|
|
101
|
+
from pytcl.assignment_algorithms.jpda import jpda_probabilities
|
|
102
|
+
|
|
103
|
+
# Multiple tracks, multiple measurements
|
|
104
|
+
likelihood = np.array([[0.8, 0.1, 0.05], [0.1, 0.7, 0.1], [0.05, 0.1, 0.6]])
|
|
105
|
+
gated = np.ones_like(likelihood, dtype=bool)
|
|
106
|
+
|
|
107
|
+
beta = jpda_probabilities(likelihood, gated, detection_prob=0.9)
|
|
108
|
+
|
|
109
|
+
# Each track's probabilities should sum to 1
|
|
110
|
+
for i in range(3):
|
|
111
|
+
assert_allclose(np.sum(beta[i, :]), 1.0, rtol=1e-6)
|
|
112
|
+
|
|
113
|
+
def test_jpda_high_clutter(self):
|
|
114
|
+
"""Test JPDA behavior with high clutter density."""
|
|
115
|
+
from pytcl.assignment_algorithms.jpda import jpda_probabilities
|
|
116
|
+
|
|
117
|
+
likelihood = np.array([[0.5, 0.3]])
|
|
118
|
+
gated = np.array([[True, True]])
|
|
119
|
+
|
|
120
|
+
# High clutter should increase miss probability
|
|
121
|
+
beta_low_clutter = jpda_probabilities(
|
|
122
|
+
likelihood, gated, detection_prob=0.9, clutter_density=0.001
|
|
123
|
+
)
|
|
124
|
+
beta_high_clutter = jpda_probabilities(
|
|
125
|
+
likelihood, gated, detection_prob=0.9, clutter_density=0.1
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
# With high clutter, more probability goes to "no measurement"
|
|
129
|
+
assert beta_high_clutter[0, -1] > beta_low_clutter[0, -1]
|
|
130
|
+
|
|
131
|
+
def test_jpda_low_detection_probability(self):
|
|
132
|
+
"""Test JPDA with low detection probability."""
|
|
133
|
+
from pytcl.assignment_algorithms.jpda import jpda_probabilities
|
|
134
|
+
|
|
135
|
+
likelihood = np.array([[0.8, 0.1]])
|
|
136
|
+
gated = np.array([[True, True]])
|
|
137
|
+
|
|
138
|
+
beta_high_pd = jpda_probabilities(
|
|
139
|
+
likelihood, gated, detection_prob=0.99, clutter_density=0.01
|
|
140
|
+
)
|
|
141
|
+
beta_low_pd = jpda_probabilities(
|
|
142
|
+
likelihood, gated, detection_prob=0.5, clutter_density=0.01
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
# Low detection prob should increase miss probability
|
|
146
|
+
assert beta_low_pd[0, -1] > beta_high_pd[0, -1]
|
|
147
|
+
|
|
148
|
+
def test_jpda_gating_effect(self):
|
|
149
|
+
"""Test that gating correctly excludes measurements."""
|
|
150
|
+
from pytcl.assignment_algorithms.jpda import jpda_probabilities
|
|
151
|
+
|
|
152
|
+
likelihood = np.array([[0.8, 0.7, 0.1]])
|
|
153
|
+
gated = np.array([[True, False, True]]) # Middle measurement not gated
|
|
154
|
+
|
|
155
|
+
beta = jpda_probabilities(likelihood, gated, detection_prob=0.9)
|
|
156
|
+
|
|
157
|
+
# Gated-out measurement should have zero probability
|
|
158
|
+
assert_allclose(beta[0, 1], 0.0)
|
|
159
|
+
|
|
160
|
+
def test_jpda_update_with_ambiguous_measurements(self):
|
|
161
|
+
"""Test JPDA update handles ambiguous measurements."""
|
|
162
|
+
from pytcl.assignment_algorithms.jpda import jpda_update
|
|
163
|
+
|
|
164
|
+
x = np.array([0.0, 1.0])
|
|
165
|
+
P = np.eye(2) * 0.1
|
|
166
|
+
|
|
167
|
+
# Two measurements, both plausible
|
|
168
|
+
measurements = np.array([[0.1], [-0.1]])
|
|
169
|
+
H = np.array([[1.0, 0.0]])
|
|
170
|
+
R = np.array([[0.1]])
|
|
171
|
+
|
|
172
|
+
result = jpda_update([x], [P], measurements, H, R)
|
|
173
|
+
|
|
174
|
+
# JPDA should produce valid state and covariance
|
|
175
|
+
assert result.states[0].shape == (2,)
|
|
176
|
+
assert result.covariances[0].shape == (2, 2)
|
|
177
|
+
# Covariance should remain positive definite
|
|
178
|
+
eigvals = np.linalg.eigvalsh(result.covariances[0])
|
|
179
|
+
assert np.all(eigvals > 0)
|
|
180
|
+
|
|
181
|
+
def test_jpda_multiple_tracks(self):
|
|
182
|
+
"""Test JPDA with multiple tracks."""
|
|
183
|
+
from pytcl.assignment_algorithms.jpda import jpda_update
|
|
184
|
+
|
|
185
|
+
# 3 tracks at different positions
|
|
186
|
+
tracks = [
|
|
187
|
+
np.array([0.0, 1.0]),
|
|
188
|
+
np.array([5.0, 0.0]),
|
|
189
|
+
np.array([10.0, -1.0]),
|
|
190
|
+
]
|
|
191
|
+
covs = [np.eye(2) * 0.1 for _ in range(3)]
|
|
192
|
+
|
|
193
|
+
# 3 measurements near each track
|
|
194
|
+
measurements = np.array([[0.1], [5.1], [9.9]])
|
|
195
|
+
H = np.array([[1.0, 0.0]])
|
|
196
|
+
R = np.array([[0.1]])
|
|
197
|
+
|
|
198
|
+
result = jpda_update(tracks, covs, measurements, H, R)
|
|
199
|
+
|
|
200
|
+
assert len(result.states) == 3
|
|
201
|
+
assert result.association_probs.shape == (3, 4) # 3 tracks, 3+1 columns
|
|
202
|
+
|
|
203
|
+
def test_jpda_empty_tracks(self):
|
|
204
|
+
"""Test JPDA handles empty track list."""
|
|
205
|
+
from pytcl.assignment_algorithms.jpda import jpda_update
|
|
206
|
+
|
|
207
|
+
measurements = np.array([[0.1], [0.2]])
|
|
208
|
+
H = np.array([[1.0, 0.0]])
|
|
209
|
+
R = np.array([[0.1]])
|
|
210
|
+
|
|
211
|
+
result = jpda_update([], [], measurements, H, R)
|
|
212
|
+
|
|
213
|
+
assert len(result.states) == 0
|
|
214
|
+
assert len(result.covariances) == 0
|
|
215
|
+
|
|
216
|
+
def test_jpda_single_measurement_per_track(self):
|
|
217
|
+
"""Test JPDA when each track has exactly one measurement."""
|
|
218
|
+
from pytcl.assignment_algorithms.jpda import jpda_update
|
|
219
|
+
|
|
220
|
+
tracks = [np.array([0.0, 1.0]), np.array([10.0, -1.0])]
|
|
221
|
+
covs = [np.eye(2) * 0.01, np.eye(2) * 0.01] # Very small covariance
|
|
222
|
+
|
|
223
|
+
# Measurements clearly associated with each track
|
|
224
|
+
measurements = np.array([[0.01], [10.01]])
|
|
225
|
+
H = np.array([[1.0, 0.0]])
|
|
226
|
+
R = np.array([[0.001]])
|
|
227
|
+
|
|
228
|
+
result = jpda_update(tracks, covs, measurements, H, R)
|
|
229
|
+
|
|
230
|
+
# Each track should strongly associate with its measurement
|
|
231
|
+
assert result.association_probs[0, 0] > 0.9
|
|
232
|
+
assert result.association_probs[1, 1] > 0.9
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
if __name__ == "__main__":
|
|
236
|
+
pytest.main([__file__, "-v"])
|