nrl-tracker 1.9.2__tar.gz → 1.11.0__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.9.2 → nrl_tracker-1.11.0}/CONTRIBUTING.md +20 -23
- {nrl_tracker-1.9.2/nrl_tracker.egg-info → nrl_tracker-1.11.0}/PKG-INFO +49 -4
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/README.md +40 -3
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0/nrl_tracker.egg-info}/PKG-INFO +49 -4
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/nrl_tracker.egg-info/SOURCES.txt +24 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/nrl_tracker.egg-info/requires.txt +10 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pyproject.toml +14 -1
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/__init__.py +3 -3
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/nd_assignment.py +359 -1
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/jacobians/jacobians.py +63 -33
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/core/optional_deps.py +20 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/matrix_utils.py +133 -35
- nrl_tracker-1.11.0/pytcl/gpu/__init__.py +153 -0
- nrl_tracker-1.11.0/pytcl/gpu/ekf.py +433 -0
- nrl_tracker-1.11.0/pytcl/gpu/kalman.py +543 -0
- nrl_tracker-1.11.0/pytcl/gpu/matrix_utils.py +491 -0
- nrl_tracker-1.11.0/pytcl/gpu/particle_filter.py +578 -0
- nrl_tracker-1.11.0/pytcl/gpu/ukf.py +476 -0
- nrl_tracker-1.11.0/pytcl/gpu/utils.py +582 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/gravity/clenshaw.py +8 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/gravity/spherical_harmonics.py +17 -10
- nrl_tracker-1.11.0/tests/test_cfar_detection.py +654 -0
- nrl_tracker-1.11.0/tests/test_combinatorics.py +488 -0
- nrl_tracker-1.11.0/tests/test_debye.py +344 -0
- nrl_tracker-1.11.0/tests/test_elliptic.py +323 -0
- nrl_tracker-1.11.0/tests/test_error_functions.py +419 -0
- nrl_tracker-1.11.0/tests/test_gamma_functions.py +391 -0
- nrl_tracker-1.11.0/tests/test_geometry.py +566 -0
- nrl_tracker-1.11.0/tests/test_gpu.py +427 -0
- nrl_tracker-1.11.0/tests/test_gpu_utils.py +173 -0
- nrl_tracker-1.11.0/tests/test_hypergeometric.py +398 -0
- nrl_tracker-1.11.0/tests/test_ionosphere.py +610 -0
- nrl_tracker-1.11.0/tests/test_marcum_q.py +340 -0
- nrl_tracker-1.11.0/tests/test_matched_filter.py +501 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_nd_assignment.py +227 -0
- nrl_tracker-1.11.0/tests/test_quadrature.py +462 -0
- nrl_tracker-1.11.0/tests/test_rotations.py +569 -0
- nrl_tracker-1.11.0/tests/test_square_root_filters.py +1162 -0
- nrl_tracker-1.11.0/tests/test_wavelets.py +705 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/LICENSE +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/MANIFEST.in +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/nrl_tracker.egg-info/dependency_links.txt +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/nrl_tracker.egg-info/top_level.txt +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/data_association.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/dijkstra_min_cost.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/gating.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/jpda.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/network_flow.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/network_simplex.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/three_dimensional/assignment.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/two_dimensional/assignment.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/ephemerides.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/lambert.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/orbital_mechanics.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/reference_frames.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/relativity.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/sgp4.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/special_orbits.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/time_systems.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/astronomical/tle.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/atmosphere/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/atmosphere/ionosphere.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/atmosphere/models.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/atmosphere/nrlmsise00.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/clustering/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/clustering/dbscan.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/clustering/gaussian_mixture.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/clustering/hierarchical.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/clustering/kmeans.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/base.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/cluster_set.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/covertree.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/kd_tree.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/measurement_set.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/rtree.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/track_list.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/containers/vptree.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/conversions/geodetic.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/projections/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/projections/projections.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/coordinate_systems/rotations/rotations.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/core/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/core/array_utils.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/core/constants.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/core/exceptions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/core/maturity.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/core/validation.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/gaussian_sum_filter.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/imm.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/information_filter.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/constrained.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/extended.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/h_infinity.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/linear.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/square_root.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/sr_ukf.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/types.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/ud_filter.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/kalman/unscented.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/rbpf.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_estimation/smoothers.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/discrete_time/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/process_noise/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/dynamic_models/process_noise/singer.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/gravity/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/gravity/egm.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/gravity/models.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/gravity/tides.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/logging_config.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/magnetism/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/magnetism/emm.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/magnetism/igrf.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/magnetism/wmm.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/combinatorics/combinatorics.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/geometry/geometry.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/interpolation/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/numerical_integration/quadrature.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/signal_processing/detection.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/signal_processing/filters.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/signal_processing/matched_filter.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/bessel.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/debye.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/error_functions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/gamma_functions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/hypergeometric.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/lambert_w.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/special_functions/marcum_q.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/transforms/fourier.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/transforms/stft.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/mathematical_functions/transforms/wavelets.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/misc/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/navigation/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/navigation/geodesy.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/navigation/great_circle.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/navigation/ins.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/navigation/ins_gnss.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/navigation/rhumb.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/performance_evaluation/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/performance_evaluation/track_metrics.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/physical_values/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/plotting/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/plotting/coordinates.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/plotting/ellipses.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/plotting/metrics.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/plotting/tracks.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/scheduling/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/static_estimation/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/static_estimation/least_squares.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/static_estimation/maximum_likelihood.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/static_estimation/robust.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/terrain/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/terrain/dem.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/terrain/loaders.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/terrain/visibility.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/trackers/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/trackers/hypothesis.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/trackers/mht.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/trackers/multi_target.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/trackers/single_target.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/pytcl/transponders/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/setup.cfg +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/__init__.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/conftest.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_additional_trees.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_assignment_algorithms.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_astronomical.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_clustering.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_constrained_ekf.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_coordinate_systems.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_coverage_boost.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_coverage_boost_2.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_dynamic_models.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_egm.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_emm.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_ephemerides.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_exceptions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_gaussian_mixtures.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_gaussian_sum_filter.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_geophysical.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_great_circle.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_h_infinity.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_ins.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_ins_gnss.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_jpda.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_kalman_filters.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_mathematical_functions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_maximum_likelihood.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_mht.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_network_flow.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_nrlmsise00.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_optional_deps.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_performance_evaluation.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_phase6_specialized.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_plotting.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_projections.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_rbpf.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_relativity.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_rhumb.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_sgp4.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_signal_processing.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_smoothers.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_spatial_containers_parametrized.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_spatial_structures.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_special_functions.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_special_orbits.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_static_estimation.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_terrain.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_terrain_loaders.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_tides.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_tod_mod.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_trackers.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_tracking_containers.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_transforms.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/test_validation.py +0 -0
- {nrl_tracker-1.9.2 → nrl_tracker-1.11.0}/tests/unit/test_core.py +0 -0
|
@@ -222,34 +222,29 @@ When porting a function from the original MATLAB library:
|
|
|
222
222
|
|
|
223
223
|
## Current Development Status
|
|
224
224
|
|
|
225
|
-
**Version:** v1.
|
|
225
|
+
**Version:** v1.11.0
|
|
226
226
|
**MATLAB Parity:** 100% ✅
|
|
227
|
-
**Test Suite:** 2,
|
|
227
|
+
**Test Suite:** 2,894 tests passing
|
|
228
228
|
**Code Coverage:** 76% (target 80%+ in v2.0.0)
|
|
229
229
|
**Quality:** 100% compliance (black, isort, flake8, mypy --strict)
|
|
230
|
+
**GPU Acceleration:** CuPy (NVIDIA) + MLX (Apple Silicon)
|
|
231
|
+
**Performance Optimization:** Numba JIT, lru_cache, sparse matrix support
|
|
230
232
|
|
|
231
|
-
## v2.0.0 Roadmap
|
|
233
|
+
## v2.0.0 Roadmap Progress
|
|
232
234
|
|
|
233
|
-
###
|
|
234
|
-
**
|
|
235
|
-
- **
|
|
236
|
-
- **
|
|
237
|
-
- **
|
|
238
|
-
- **
|
|
235
|
+
### Completed Phases
|
|
236
|
+
- **Phase 1** ✅: Network flow performance (50-100x faster)
|
|
237
|
+
- **Phase 2** ✅: API standardization (exceptions, spatial indexes, optional deps)
|
|
238
|
+
- **Phase 5** ✅: GPU acceleration (CuPy + MLX, 5-15x speedup)
|
|
239
|
+
- **Phase 6** ✅: Test expansion (+761 tests, 2,894 total)
|
|
240
|
+
- **Phase 7** ✅: Performance optimization (Numba JIT, lru_cache, sparse matrices)
|
|
239
241
|
|
|
240
|
-
###
|
|
241
|
-
- Phase
|
|
242
|
-
- Phase
|
|
243
|
-
- Phase 4: Signal processing optimization
|
|
244
|
-
- Phase 5: Advanced estimation methods
|
|
242
|
+
### In Progress
|
|
243
|
+
- **Phase 3**: Documentation expansion
|
|
244
|
+
- **Phase 4**: Jupyter notebooks
|
|
245
245
|
|
|
246
|
-
###
|
|
247
|
-
- **
|
|
248
|
-
- **Focus:** Edge cases, numerical stability, batch operations
|
|
249
|
-
|
|
250
|
-
### Phases 7-8: Documentation & Final Polish
|
|
251
|
-
- Phase 7: Documentation updates and examples
|
|
252
|
-
- Phase 8: Performance tuning and optimization
|
|
246
|
+
### Remaining
|
|
247
|
+
- **Phase 8**: Release preparation (alpha → beta → RC → v2.0.0)
|
|
253
248
|
|
|
254
249
|
## Priority Areas for Contributors
|
|
255
250
|
|
|
@@ -301,12 +296,14 @@ pytest --collect-only -q | tail -1
|
|
|
301
296
|
pytest --cov=pytcl --cov-report=term
|
|
302
297
|
```
|
|
303
298
|
|
|
304
|
-
Current metrics (v1.
|
|
299
|
+
Current metrics (v1.11.0):
|
|
305
300
|
- **Functions:** 1,070+
|
|
306
301
|
- **Modules:** 150+
|
|
307
|
-
- **Tests:** 2,
|
|
302
|
+
- **Tests:** 2,894 (all passing)
|
|
308
303
|
- **Coverage:** 76%
|
|
309
304
|
- **MATLAB Parity:** 100%
|
|
305
|
+
- **GPU Backends:** 2 (CuPy + MLX)
|
|
306
|
+
- **Performance:** Numba JIT + lru_cache optimizations
|
|
310
307
|
|
|
311
308
|
### 3. Sync Examples
|
|
312
309
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nrl-tracker
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.11.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
|
|
@@ -41,11 +41,17 @@ Provides-Extra: optimization
|
|
|
41
41
|
Requires-Dist: cvxpy>=1.3.0; extra == "optimization"
|
|
42
42
|
Provides-Extra: signal
|
|
43
43
|
Requires-Dist: pywavelets>=1.4.0; extra == "signal"
|
|
44
|
+
Provides-Extra: gpu
|
|
45
|
+
Requires-Dist: cupy-cuda12x>=12.0.0; extra == "gpu"
|
|
46
|
+
Provides-Extra: gpu-apple
|
|
47
|
+
Requires-Dist: mlx>=0.5.0; extra == "gpu-apple"
|
|
44
48
|
Provides-Extra: dev
|
|
45
49
|
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
46
50
|
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
47
51
|
Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
|
|
48
52
|
Requires-Dist: pytest-benchmark>=4.0.0; extra == "dev"
|
|
53
|
+
Requires-Dist: pytest-timeout>=2.0.0; extra == "dev"
|
|
54
|
+
Requires-Dist: nbval>=0.10.0; extra == "dev"
|
|
49
55
|
Requires-Dist: hypothesis>=6.0.0; extra == "dev"
|
|
50
56
|
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
51
57
|
Requires-Dist: isort>=5.12.0; extra == "dev"
|
|
@@ -56,6 +62,8 @@ Requires-Dist: sphinx>=6.0.0; extra == "dev"
|
|
|
56
62
|
Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "dev"
|
|
57
63
|
Requires-Dist: myst-parser>=1.0.0; extra == "dev"
|
|
58
64
|
Requires-Dist: nbsphinx>=0.9.0; extra == "dev"
|
|
65
|
+
Requires-Dist: jupyter>=1.0.0; extra == "dev"
|
|
66
|
+
Requires-Dist: ipykernel>=6.0.0; extra == "dev"
|
|
59
67
|
Provides-Extra: benchmark
|
|
60
68
|
Requires-Dist: pytest-benchmark>=4.0.0; extra == "benchmark"
|
|
61
69
|
Provides-Extra: all
|
|
@@ -63,17 +71,17 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
|
|
|
63
71
|
|
|
64
72
|
# Tracker Component Library (Python)
|
|
65
73
|
|
|
66
|
-
[](https://pypi.org/project/nrl-tracker/)
|
|
67
75
|
[](https://www.python.org/downloads/)
|
|
68
76
|
[](https://en.wikipedia.org/wiki/Public_domain)
|
|
69
77
|
[](https://github.com/psf/black)
|
|
70
|
-
[](https://github.com/nedonatelli/TCL)
|
|
71
79
|
[](docs/gap_analysis.rst)
|
|
72
80
|
[](mypy.ini)
|
|
73
81
|
|
|
74
82
|
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.
|
|
75
83
|
|
|
76
|
-
**1,070+ functions** | **153 modules** | **2,
|
|
84
|
+
**1,070+ functions** | **153 modules** | **2,894 tests** | **100% MATLAB parity**
|
|
77
85
|
|
|
78
86
|
## Overview
|
|
79
87
|
|
|
@@ -90,6 +98,7 @@ The Tracker Component Library provides building blocks for developing target tra
|
|
|
90
98
|
- **Navigation**: Geodetic calculations, INS mechanization, GNSS utilities, INS/GNSS integration
|
|
91
99
|
- **Geophysical Models**: Gravity (WGS84, EGM96/2008), magnetism (WMM, IGRF), atmosphere, tides, terrain
|
|
92
100
|
- **Signal Processing**: Digital filters, matched filtering, CFAR detection, transforms (FFT, STFT, wavelets)
|
|
101
|
+
- **GPU Acceleration**: CuPy (NVIDIA CUDA) and MLX (Apple Silicon) backends for batch Kalman filtering and particle filters
|
|
93
102
|
|
|
94
103
|
## Installation
|
|
95
104
|
|
|
@@ -111,6 +120,12 @@ pip install nrl-tracker[geodesy]
|
|
|
111
120
|
# For visualization
|
|
112
121
|
pip install nrl-tracker[visualization]
|
|
113
122
|
|
|
123
|
+
# For GPU acceleration (NVIDIA CUDA)
|
|
124
|
+
pip install nrl-tracker[gpu]
|
|
125
|
+
|
|
126
|
+
# For GPU acceleration (Apple Silicon M1/M2/M3)
|
|
127
|
+
pip install nrl-tracker[gpu-apple]
|
|
128
|
+
|
|
114
129
|
# For development
|
|
115
130
|
pip install nrl-tracker[dev]
|
|
116
131
|
|
|
@@ -183,6 +198,35 @@ assignment, total_cost = hungarian(cost_matrix)
|
|
|
183
198
|
print(f"Optimal assignment: {assignment}, Total cost: {total_cost}")
|
|
184
199
|
```
|
|
185
200
|
|
|
201
|
+
### GPU Acceleration
|
|
202
|
+
|
|
203
|
+
The library supports GPU acceleration for batch processing of multiple tracks:
|
|
204
|
+
|
|
205
|
+
```python
|
|
206
|
+
from pytcl.gpu import is_gpu_available, get_backend, to_gpu, to_cpu
|
|
207
|
+
|
|
208
|
+
# Check GPU availability (auto-detects CUDA or Apple Silicon)
|
|
209
|
+
if is_gpu_available():
|
|
210
|
+
print(f"GPU available, using {get_backend()} backend")
|
|
211
|
+
|
|
212
|
+
# Transfer data to GPU
|
|
213
|
+
x_gpu = to_gpu(states) # (n_tracks, state_dim)
|
|
214
|
+
P_gpu = to_gpu(covariances) # (n_tracks, state_dim, state_dim)
|
|
215
|
+
|
|
216
|
+
# Use batch Kalman filter operations
|
|
217
|
+
from pytcl.gpu import batch_kf_predict
|
|
218
|
+
x_pred, P_pred = batch_kf_predict(x_gpu, P_gpu, F, Q)
|
|
219
|
+
|
|
220
|
+
# Transfer results back to CPU
|
|
221
|
+
x_pred_cpu = to_cpu(x_pred)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Supported backends:**
|
|
225
|
+
- **NVIDIA CUDA**: Via CuPy (`pip install nrl-tracker[gpu]`)
|
|
226
|
+
- **Apple Silicon**: Via MLX (`pip install nrl-tracker[gpu-apple]`)
|
|
227
|
+
|
|
228
|
+
The backend is automatically selected based on your platform.
|
|
229
|
+
|
|
186
230
|
## Module Structure
|
|
187
231
|
|
|
188
232
|
```
|
|
@@ -202,6 +246,7 @@ pytcl/
|
|
|
202
246
|
├── gravity/ # Gravity models
|
|
203
247
|
├── magnetism/ # Magnetic field models
|
|
204
248
|
├── terrain/ # Terrain elevation models
|
|
249
|
+
├── gpu/ # GPU acceleration (CuPy/MLX)
|
|
205
250
|
└── misc/ # Utilities, visualization
|
|
206
251
|
```
|
|
207
252
|
|
|
@@ -1,16 +1,16 @@
|
|
|
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
|
-
[](https://github.com/nedonatelli/TCL)
|
|
8
8
|
[](docs/gap_analysis.rst)
|
|
9
9
|
[](mypy.ini)
|
|
10
10
|
|
|
11
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.
|
|
12
12
|
|
|
13
|
-
**1,070+ functions** | **153 modules** | **2,
|
|
13
|
+
**1,070+ functions** | **153 modules** | **2,894 tests** | **100% MATLAB parity**
|
|
14
14
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
@@ -27,6 +27,7 @@ The Tracker Component Library provides building blocks for developing target tra
|
|
|
27
27
|
- **Navigation**: Geodetic calculations, INS mechanization, GNSS utilities, INS/GNSS integration
|
|
28
28
|
- **Geophysical Models**: Gravity (WGS84, EGM96/2008), magnetism (WMM, IGRF), atmosphere, tides, terrain
|
|
29
29
|
- **Signal Processing**: Digital filters, matched filtering, CFAR detection, transforms (FFT, STFT, wavelets)
|
|
30
|
+
- **GPU Acceleration**: CuPy (NVIDIA CUDA) and MLX (Apple Silicon) backends for batch Kalman filtering and particle filters
|
|
30
31
|
|
|
31
32
|
## Installation
|
|
32
33
|
|
|
@@ -48,6 +49,12 @@ pip install nrl-tracker[geodesy]
|
|
|
48
49
|
# For visualization
|
|
49
50
|
pip install nrl-tracker[visualization]
|
|
50
51
|
|
|
52
|
+
# For GPU acceleration (NVIDIA CUDA)
|
|
53
|
+
pip install nrl-tracker[gpu]
|
|
54
|
+
|
|
55
|
+
# For GPU acceleration (Apple Silicon M1/M2/M3)
|
|
56
|
+
pip install nrl-tracker[gpu-apple]
|
|
57
|
+
|
|
51
58
|
# For development
|
|
52
59
|
pip install nrl-tracker[dev]
|
|
53
60
|
|
|
@@ -120,6 +127,35 @@ assignment, total_cost = hungarian(cost_matrix)
|
|
|
120
127
|
print(f"Optimal assignment: {assignment}, Total cost: {total_cost}")
|
|
121
128
|
```
|
|
122
129
|
|
|
130
|
+
### GPU Acceleration
|
|
131
|
+
|
|
132
|
+
The library supports GPU acceleration for batch processing of multiple tracks:
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
from pytcl.gpu import is_gpu_available, get_backend, to_gpu, to_cpu
|
|
136
|
+
|
|
137
|
+
# Check GPU availability (auto-detects CUDA or Apple Silicon)
|
|
138
|
+
if is_gpu_available():
|
|
139
|
+
print(f"GPU available, using {get_backend()} backend")
|
|
140
|
+
|
|
141
|
+
# Transfer data to GPU
|
|
142
|
+
x_gpu = to_gpu(states) # (n_tracks, state_dim)
|
|
143
|
+
P_gpu = to_gpu(covariances) # (n_tracks, state_dim, state_dim)
|
|
144
|
+
|
|
145
|
+
# Use batch Kalman filter operations
|
|
146
|
+
from pytcl.gpu import batch_kf_predict
|
|
147
|
+
x_pred, P_pred = batch_kf_predict(x_gpu, P_gpu, F, Q)
|
|
148
|
+
|
|
149
|
+
# Transfer results back to CPU
|
|
150
|
+
x_pred_cpu = to_cpu(x_pred)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Supported backends:**
|
|
154
|
+
- **NVIDIA CUDA**: Via CuPy (`pip install nrl-tracker[gpu]`)
|
|
155
|
+
- **Apple Silicon**: Via MLX (`pip install nrl-tracker[gpu-apple]`)
|
|
156
|
+
|
|
157
|
+
The backend is automatically selected based on your platform.
|
|
158
|
+
|
|
123
159
|
## Module Structure
|
|
124
160
|
|
|
125
161
|
```
|
|
@@ -139,6 +175,7 @@ pytcl/
|
|
|
139
175
|
├── gravity/ # Gravity models
|
|
140
176
|
├── magnetism/ # Magnetic field models
|
|
141
177
|
├── terrain/ # Terrain elevation models
|
|
178
|
+
├── gpu/ # GPU acceleration (CuPy/MLX)
|
|
142
179
|
└── misc/ # Utilities, visualization
|
|
143
180
|
```
|
|
144
181
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nrl-tracker
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.11.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
|
|
@@ -41,11 +41,17 @@ Provides-Extra: optimization
|
|
|
41
41
|
Requires-Dist: cvxpy>=1.3.0; extra == "optimization"
|
|
42
42
|
Provides-Extra: signal
|
|
43
43
|
Requires-Dist: pywavelets>=1.4.0; extra == "signal"
|
|
44
|
+
Provides-Extra: gpu
|
|
45
|
+
Requires-Dist: cupy-cuda12x>=12.0.0; extra == "gpu"
|
|
46
|
+
Provides-Extra: gpu-apple
|
|
47
|
+
Requires-Dist: mlx>=0.5.0; extra == "gpu-apple"
|
|
44
48
|
Provides-Extra: dev
|
|
45
49
|
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
46
50
|
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
47
51
|
Requires-Dist: pytest-xdist>=3.0.0; extra == "dev"
|
|
48
52
|
Requires-Dist: pytest-benchmark>=4.0.0; extra == "dev"
|
|
53
|
+
Requires-Dist: pytest-timeout>=2.0.0; extra == "dev"
|
|
54
|
+
Requires-Dist: nbval>=0.10.0; extra == "dev"
|
|
49
55
|
Requires-Dist: hypothesis>=6.0.0; extra == "dev"
|
|
50
56
|
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
51
57
|
Requires-Dist: isort>=5.12.0; extra == "dev"
|
|
@@ -56,6 +62,8 @@ Requires-Dist: sphinx>=6.0.0; extra == "dev"
|
|
|
56
62
|
Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "dev"
|
|
57
63
|
Requires-Dist: myst-parser>=1.0.0; extra == "dev"
|
|
58
64
|
Requires-Dist: nbsphinx>=0.9.0; extra == "dev"
|
|
65
|
+
Requires-Dist: jupyter>=1.0.0; extra == "dev"
|
|
66
|
+
Requires-Dist: ipykernel>=6.0.0; extra == "dev"
|
|
59
67
|
Provides-Extra: benchmark
|
|
60
68
|
Requires-Dist: pytest-benchmark>=4.0.0; extra == "benchmark"
|
|
61
69
|
Provides-Extra: all
|
|
@@ -63,17 +71,17 @@ Requires-Dist: nrl-tracker[astronomy,dev,geodesy,optimization,signal,visualizati
|
|
|
63
71
|
|
|
64
72
|
# Tracker Component Library (Python)
|
|
65
73
|
|
|
66
|
-
[](https://pypi.org/project/nrl-tracker/)
|
|
67
75
|
[](https://www.python.org/downloads/)
|
|
68
76
|
[](https://en.wikipedia.org/wiki/Public_domain)
|
|
69
77
|
[](https://github.com/psf/black)
|
|
70
|
-
[](https://github.com/nedonatelli/TCL)
|
|
71
79
|
[](docs/gap_analysis.rst)
|
|
72
80
|
[](mypy.ini)
|
|
73
81
|
|
|
74
82
|
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.
|
|
75
83
|
|
|
76
|
-
**1,070+ functions** | **153 modules** | **2,
|
|
84
|
+
**1,070+ functions** | **153 modules** | **2,894 tests** | **100% MATLAB parity**
|
|
77
85
|
|
|
78
86
|
## Overview
|
|
79
87
|
|
|
@@ -90,6 +98,7 @@ The Tracker Component Library provides building blocks for developing target tra
|
|
|
90
98
|
- **Navigation**: Geodetic calculations, INS mechanization, GNSS utilities, INS/GNSS integration
|
|
91
99
|
- **Geophysical Models**: Gravity (WGS84, EGM96/2008), magnetism (WMM, IGRF), atmosphere, tides, terrain
|
|
92
100
|
- **Signal Processing**: Digital filters, matched filtering, CFAR detection, transforms (FFT, STFT, wavelets)
|
|
101
|
+
- **GPU Acceleration**: CuPy (NVIDIA CUDA) and MLX (Apple Silicon) backends for batch Kalman filtering and particle filters
|
|
93
102
|
|
|
94
103
|
## Installation
|
|
95
104
|
|
|
@@ -111,6 +120,12 @@ pip install nrl-tracker[geodesy]
|
|
|
111
120
|
# For visualization
|
|
112
121
|
pip install nrl-tracker[visualization]
|
|
113
122
|
|
|
123
|
+
# For GPU acceleration (NVIDIA CUDA)
|
|
124
|
+
pip install nrl-tracker[gpu]
|
|
125
|
+
|
|
126
|
+
# For GPU acceleration (Apple Silicon M1/M2/M3)
|
|
127
|
+
pip install nrl-tracker[gpu-apple]
|
|
128
|
+
|
|
114
129
|
# For development
|
|
115
130
|
pip install nrl-tracker[dev]
|
|
116
131
|
|
|
@@ -183,6 +198,35 @@ assignment, total_cost = hungarian(cost_matrix)
|
|
|
183
198
|
print(f"Optimal assignment: {assignment}, Total cost: {total_cost}")
|
|
184
199
|
```
|
|
185
200
|
|
|
201
|
+
### GPU Acceleration
|
|
202
|
+
|
|
203
|
+
The library supports GPU acceleration for batch processing of multiple tracks:
|
|
204
|
+
|
|
205
|
+
```python
|
|
206
|
+
from pytcl.gpu import is_gpu_available, get_backend, to_gpu, to_cpu
|
|
207
|
+
|
|
208
|
+
# Check GPU availability (auto-detects CUDA or Apple Silicon)
|
|
209
|
+
if is_gpu_available():
|
|
210
|
+
print(f"GPU available, using {get_backend()} backend")
|
|
211
|
+
|
|
212
|
+
# Transfer data to GPU
|
|
213
|
+
x_gpu = to_gpu(states) # (n_tracks, state_dim)
|
|
214
|
+
P_gpu = to_gpu(covariances) # (n_tracks, state_dim, state_dim)
|
|
215
|
+
|
|
216
|
+
# Use batch Kalman filter operations
|
|
217
|
+
from pytcl.gpu import batch_kf_predict
|
|
218
|
+
x_pred, P_pred = batch_kf_predict(x_gpu, P_gpu, F, Q)
|
|
219
|
+
|
|
220
|
+
# Transfer results back to CPU
|
|
221
|
+
x_pred_cpu = to_cpu(x_pred)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Supported backends:**
|
|
225
|
+
- **NVIDIA CUDA**: Via CuPy (`pip install nrl-tracker[gpu]`)
|
|
226
|
+
- **Apple Silicon**: Via MLX (`pip install nrl-tracker[gpu-apple]`)
|
|
227
|
+
|
|
228
|
+
The backend is automatically selected based on your platform.
|
|
229
|
+
|
|
186
230
|
## Module Structure
|
|
187
231
|
|
|
188
232
|
```
|
|
@@ -202,6 +246,7 @@ pytcl/
|
|
|
202
246
|
├── gravity/ # Gravity models
|
|
203
247
|
├── magnetism/ # Magnetic field models
|
|
204
248
|
├── terrain/ # Terrain elevation models
|
|
249
|
+
├── gpu/ # GPU acceleration (CuPy/MLX)
|
|
205
250
|
└── misc/ # Utilities, visualization
|
|
206
251
|
```
|
|
207
252
|
|
|
@@ -100,6 +100,13 @@ pytcl/dynamic_models/process_noise/__init__.py
|
|
|
100
100
|
pytcl/dynamic_models/process_noise/coordinated_turn.py
|
|
101
101
|
pytcl/dynamic_models/process_noise/polynomial.py
|
|
102
102
|
pytcl/dynamic_models/process_noise/singer.py
|
|
103
|
+
pytcl/gpu/__init__.py
|
|
104
|
+
pytcl/gpu/ekf.py
|
|
105
|
+
pytcl/gpu/kalman.py
|
|
106
|
+
pytcl/gpu/matrix_utils.py
|
|
107
|
+
pytcl/gpu/particle_filter.py
|
|
108
|
+
pytcl/gpu/ukf.py
|
|
109
|
+
pytcl/gpu/utils.py
|
|
103
110
|
pytcl/gravity/__init__.py
|
|
104
111
|
pytcl/gravity/clenshaw.py
|
|
105
112
|
pytcl/gravity/egm.py
|
|
@@ -180,25 +187,38 @@ tests/conftest.py
|
|
|
180
187
|
tests/test_additional_trees.py
|
|
181
188
|
tests/test_assignment_algorithms.py
|
|
182
189
|
tests/test_astronomical.py
|
|
190
|
+
tests/test_cfar_detection.py
|
|
183
191
|
tests/test_clustering.py
|
|
192
|
+
tests/test_combinatorics.py
|
|
184
193
|
tests/test_constrained_ekf.py
|
|
185
194
|
tests/test_coordinate_systems.py
|
|
186
195
|
tests/test_coverage_boost.py
|
|
187
196
|
tests/test_coverage_boost_2.py
|
|
197
|
+
tests/test_debye.py
|
|
188
198
|
tests/test_dynamic_models.py
|
|
189
199
|
tests/test_egm.py
|
|
200
|
+
tests/test_elliptic.py
|
|
190
201
|
tests/test_emm.py
|
|
191
202
|
tests/test_ephemerides.py
|
|
203
|
+
tests/test_error_functions.py
|
|
192
204
|
tests/test_exceptions.py
|
|
205
|
+
tests/test_gamma_functions.py
|
|
193
206
|
tests/test_gaussian_mixtures.py
|
|
194
207
|
tests/test_gaussian_sum_filter.py
|
|
208
|
+
tests/test_geometry.py
|
|
195
209
|
tests/test_geophysical.py
|
|
210
|
+
tests/test_gpu.py
|
|
211
|
+
tests/test_gpu_utils.py
|
|
196
212
|
tests/test_great_circle.py
|
|
197
213
|
tests/test_h_infinity.py
|
|
214
|
+
tests/test_hypergeometric.py
|
|
198
215
|
tests/test_ins.py
|
|
199
216
|
tests/test_ins_gnss.py
|
|
217
|
+
tests/test_ionosphere.py
|
|
200
218
|
tests/test_jpda.py
|
|
201
219
|
tests/test_kalman_filters.py
|
|
220
|
+
tests/test_marcum_q.py
|
|
221
|
+
tests/test_matched_filter.py
|
|
202
222
|
tests/test_mathematical_functions.py
|
|
203
223
|
tests/test_maximum_likelihood.py
|
|
204
224
|
tests/test_mht.py
|
|
@@ -210,9 +230,11 @@ tests/test_performance_evaluation.py
|
|
|
210
230
|
tests/test_phase6_specialized.py
|
|
211
231
|
tests/test_plotting.py
|
|
212
232
|
tests/test_projections.py
|
|
233
|
+
tests/test_quadrature.py
|
|
213
234
|
tests/test_rbpf.py
|
|
214
235
|
tests/test_relativity.py
|
|
215
236
|
tests/test_rhumb.py
|
|
237
|
+
tests/test_rotations.py
|
|
216
238
|
tests/test_sgp4.py
|
|
217
239
|
tests/test_signal_processing.py
|
|
218
240
|
tests/test_smoothers.py
|
|
@@ -220,6 +242,7 @@ tests/test_spatial_containers_parametrized.py
|
|
|
220
242
|
tests/test_spatial_structures.py
|
|
221
243
|
tests/test_special_functions.py
|
|
222
244
|
tests/test_special_orbits.py
|
|
245
|
+
tests/test_square_root_filters.py
|
|
223
246
|
tests/test_static_estimation.py
|
|
224
247
|
tests/test_terrain.py
|
|
225
248
|
tests/test_terrain_loaders.py
|
|
@@ -229,4 +252,5 @@ tests/test_trackers.py
|
|
|
229
252
|
tests/test_tracking_containers.py
|
|
230
253
|
tests/test_transforms.py
|
|
231
254
|
tests/test_validation.py
|
|
255
|
+
tests/test_wavelets.py
|
|
232
256
|
tests/unit/test_core.py
|
|
@@ -17,6 +17,8 @@ pytest>=7.0.0
|
|
|
17
17
|
pytest-cov>=4.0.0
|
|
18
18
|
pytest-xdist>=3.0.0
|
|
19
19
|
pytest-benchmark>=4.0.0
|
|
20
|
+
pytest-timeout>=2.0.0
|
|
21
|
+
nbval>=0.10.0
|
|
20
22
|
hypothesis>=6.0.0
|
|
21
23
|
black>=23.0.0
|
|
22
24
|
isort>=5.12.0
|
|
@@ -27,11 +29,19 @@ sphinx>=6.0.0
|
|
|
27
29
|
sphinx-rtd-theme>=1.2.0
|
|
28
30
|
myst-parser>=1.0.0
|
|
29
31
|
nbsphinx>=0.9.0
|
|
32
|
+
jupyter>=1.0.0
|
|
33
|
+
ipykernel>=6.0.0
|
|
30
34
|
|
|
31
35
|
[geodesy]
|
|
32
36
|
pyproj>=3.4.0
|
|
33
37
|
geographiclib>=2.0
|
|
34
38
|
|
|
39
|
+
[gpu]
|
|
40
|
+
cupy-cuda12x>=12.0.0
|
|
41
|
+
|
|
42
|
+
[gpu-apple]
|
|
43
|
+
mlx>=0.5.0
|
|
44
|
+
|
|
35
45
|
[optimization]
|
|
36
46
|
cvxpy>=1.3.0
|
|
37
47
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "nrl-tracker"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.11.0"
|
|
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 = [
|
|
@@ -63,11 +63,19 @@ optimization = [
|
|
|
63
63
|
signal = [
|
|
64
64
|
"pywavelets>=1.4.0",
|
|
65
65
|
]
|
|
66
|
+
gpu = [
|
|
67
|
+
"cupy-cuda12x>=12.0.0",
|
|
68
|
+
]
|
|
69
|
+
gpu-apple = [
|
|
70
|
+
"mlx>=0.5.0",
|
|
71
|
+
]
|
|
66
72
|
dev = [
|
|
67
73
|
"pytest>=7.0.0",
|
|
68
74
|
"pytest-cov>=4.0.0",
|
|
69
75
|
"pytest-xdist>=3.0.0",
|
|
70
76
|
"pytest-benchmark>=4.0.0",
|
|
77
|
+
"pytest-timeout>=2.0.0",
|
|
78
|
+
"nbval>=0.10.0",
|
|
71
79
|
"hypothesis>=6.0.0",
|
|
72
80
|
"black>=23.0.0",
|
|
73
81
|
"isort>=5.12.0",
|
|
@@ -78,6 +86,8 @@ dev = [
|
|
|
78
86
|
"sphinx-rtd-theme>=1.2.0",
|
|
79
87
|
"myst-parser>=1.0.0",
|
|
80
88
|
"nbsphinx>=0.9.0",
|
|
89
|
+
"jupyter>=1.0.0",
|
|
90
|
+
"ipykernel>=6.0.0",
|
|
81
91
|
]
|
|
82
92
|
benchmark = [
|
|
83
93
|
"pytest-benchmark>=4.0.0",
|
|
@@ -107,6 +117,7 @@ markers = [
|
|
|
107
117
|
"benchmark: marks tests as benchmarks",
|
|
108
118
|
"light: marks benchmark as part of light (PR) suite",
|
|
109
119
|
"full: marks benchmark as part of full (main) suite",
|
|
120
|
+
"notebook: marks notebook validation tests",
|
|
110
121
|
]
|
|
111
122
|
filterwarnings = [
|
|
112
123
|
"ignore::DeprecationWarning",
|
|
@@ -176,5 +187,7 @@ module = [
|
|
|
176
187
|
"plotly.*",
|
|
177
188
|
"cvxpy.*",
|
|
178
189
|
"pywt.*",
|
|
190
|
+
"cupy.*",
|
|
191
|
+
"mlx.*",
|
|
179
192
|
]
|
|
180
193
|
ignore_missing_imports = true
|
|
@@ -6,8 +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
|
-
**Current Version:** 1.
|
|
10
|
-
**Status:** Production-ready, 2,
|
|
9
|
+
**Current Version:** 1.11.0 (January 5, 2026)
|
|
10
|
+
**Status:** Production-ready, 2,894 tests passing, 76% line coverage
|
|
11
11
|
Examples
|
|
12
12
|
--------
|
|
13
13
|
>>> import pytcl as pytcl
|
|
@@ -21,7 +21,7 @@ References
|
|
|
21
21
|
no. 5, pp. 18-27, May 2017.
|
|
22
22
|
"""
|
|
23
23
|
|
|
24
|
-
__version__ = "1.
|
|
24
|
+
__version__ = "1.11.0"
|
|
25
25
|
__author__ = "Python Port Contributors"
|
|
26
26
|
__original_author__ = "David F. Crouse, Naval Research Laboratory"
|
|
27
27
|
|