nrl-tracker 0.22.1__tar.gz → 0.22.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-0.22.1/nrl_tracker.egg-info → nrl_tracker-0.22.3}/PKG-INFO +1 -1
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3/nrl_tracker.egg-info}/PKG-INFO +1 -1
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pyproject.toml +1 -1
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/__init__.py +1 -1
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/conftest.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_astronomical.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_coordinate_systems.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_coverage_boost.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_coverage_boost_2.py +3 -9
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_egm.py +18 -54
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_emm.py +14 -42
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_ephemerides.py +100 -101
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_gaussian_mixtures.py +1 -2
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_great_circle.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_ins.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_ins_gnss.py +3 -9
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_projections.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_relativity.py +96 -97
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_smoothers.py +4 -12
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_static_estimation.py +3 -9
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_tides.py +4 -12
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_trackers.py +4 -12
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_v030_comprehensive.py +3 -9
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_v030_features.py +1 -3
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/CONTRIBUTING.md +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/LICENSE +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/MANIFEST.in +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/README.md +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/nrl_tracker.egg-info/SOURCES.txt +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/nrl_tracker.egg-info/dependency_links.txt +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/nrl_tracker.egg-info/requires.txt +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/nrl_tracker.egg-info/top_level.txt +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/data_association.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/gating.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/jpda.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/three_dimensional/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/three_dimensional/assignment.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/two_dimensional/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/two_dimensional/assignment.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/assignment_algorithms/two_dimensional/kbest.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/astronomical/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/astronomical/ephemerides.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/astronomical/lambert.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/astronomical/orbital_mechanics.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/astronomical/reference_frames.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/astronomical/relativity.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/astronomical/time_systems.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/atmosphere/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/atmosphere/models.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/clustering/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/clustering/dbscan.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/clustering/gaussian_mixture.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/clustering/hierarchical.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/clustering/kmeans.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/cluster_set.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/covertree.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/kd_tree.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/measurement_set.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/rtree.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/track_list.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/containers/vptree.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/conversions/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/conversions/geodetic.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/conversions/spherical.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/jacobians/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/jacobians/jacobians.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/projections/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/projections/projections.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/rotations/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/coordinate_systems/rotations/rotations.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/core/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/core/array_utils.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/core/constants.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/core/validation.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/batch_estimation/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/imm.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/information_filter.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/kalman/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/kalman/extended.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/kalman/linear.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/kalman/square_root.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/kalman/unscented.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/measurement_update/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/particle_filters/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/particle_filters/bootstrap.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_estimation/smoothers.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/continuous_time/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/continuous_time/dynamics.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/discrete_time/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/discrete_time/coordinated_turn.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/discrete_time/polynomial.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/discrete_time/singer.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/process_noise/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/process_noise/coordinated_turn.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/process_noise/polynomial.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/dynamic_models/process_noise/singer.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/gravity/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/gravity/clenshaw.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/gravity/egm.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/gravity/models.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/gravity/spherical_harmonics.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/gravity/tides.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/magnetism/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/magnetism/emm.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/magnetism/igrf.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/magnetism/wmm.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/basic_matrix/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/basic_matrix/decompositions.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/basic_matrix/special_matrices.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/combinatorics/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/combinatorics/combinatorics.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/continuous_optimization/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/geometry/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/geometry/geometry.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/interpolation/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/interpolation/interpolation.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/numerical_integration/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/numerical_integration/quadrature.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/polynomials/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/signal_processing/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/signal_processing/detection.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/signal_processing/filters.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/signal_processing/matched_filter.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/bessel.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/debye.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/elliptic.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/error_functions.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/gamma_functions.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/hypergeometric.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/lambert_w.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/special_functions/marcum_q.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/statistics/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/statistics/distributions.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/statistics/estimators.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/transforms/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/transforms/fourier.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/transforms/stft.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/mathematical_functions/transforms/wavelets.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/misc/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/navigation/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/navigation/geodesy.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/navigation/great_circle.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/navigation/ins.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/navigation/ins_gnss.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/navigation/rhumb.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/performance_evaluation/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/performance_evaluation/estimation_metrics.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/performance_evaluation/track_metrics.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/physical_values/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/plotting/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/plotting/coordinates.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/plotting/ellipses.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/plotting/metrics.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/plotting/tracks.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/scheduling/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/static_estimation/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/static_estimation/least_squares.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/static_estimation/maximum_likelihood.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/static_estimation/robust.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/terrain/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/terrain/dem.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/terrain/loaders.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/terrain/visibility.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/trackers/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/trackers/hypothesis.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/trackers/mht.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/trackers/multi_target.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/trackers/single_target.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/pytcl/transponders/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/setup.cfg +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/__init__.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_additional_trees.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_assignment_algorithms.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_clustering.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_dynamic_models.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_geophysical.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_kalman_filters.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_mathematical_functions.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_maximum_likelihood.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_mht.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_performance_evaluation.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_phase6_specialized.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_plotting.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_rhumb.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_signal_processing.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_spatial_structures.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_special_functions_phase12.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_terrain.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_terrain_loaders.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_tracking_containers.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.3}/tests/test_transforms.py +0 -0
- {nrl_tracker-0.22.1 → nrl_tracker-0.22.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: 0.22.
|
|
3
|
+
Version: 0.22.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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nrl-tracker
|
|
3
|
-
Version: 0.22.
|
|
3
|
+
Version: 0.22.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
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "nrl-tracker"
|
|
7
|
-
version = "0.22.
|
|
7
|
+
version = "0.22.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 = [
|
|
@@ -82,9 +82,7 @@ class NumpyTestCase:
|
|
|
82
82
|
|
|
83
83
|
def assert_shape(self, arr, expected_shape):
|
|
84
84
|
"""Assert array has expected shape."""
|
|
85
|
-
assert
|
|
86
|
-
arr.shape == expected_shape
|
|
87
|
-
), f"Expected shape {expected_shape}, got {arr.shape}"
|
|
85
|
+
assert arr.shape == expected_shape, f"Expected shape {expected_shape}, got {arr.shape}"
|
|
88
86
|
|
|
89
87
|
def assert_symmetric(self, arr, rtol=1e-10):
|
|
90
88
|
"""Assert matrix is symmetric."""
|
|
@@ -150,9 +150,7 @@ class TestOrbitalElementConversions:
|
|
|
150
150
|
|
|
151
151
|
def test_roundtrip_elements_state(self):
|
|
152
152
|
"""Test elements -> state -> elements roundtrip."""
|
|
153
|
-
elements_orig = OrbitalElements(
|
|
154
|
-
a=8000, e=0.2, i=0.5, raan=0.3, omega=0.8, nu=1.0
|
|
155
|
-
)
|
|
153
|
+
elements_orig = OrbitalElements(a=8000, e=0.2, i=0.5, raan=0.3, omega=0.8, nu=1.0)
|
|
156
154
|
state = orbital_elements_to_state(elements_orig)
|
|
157
155
|
elements_back = state_to_orbital_elements(state)
|
|
158
156
|
|
|
@@ -403,9 +403,7 @@ class TestSlerp:
|
|
|
403
403
|
|
|
404
404
|
# Should be 45 deg rotation about z
|
|
405
405
|
expected_angle = angle / 2
|
|
406
|
-
expected = np.array(
|
|
407
|
-
[np.cos(expected_angle / 2), 0, 0, np.sin(expected_angle / 2)]
|
|
408
|
-
)
|
|
406
|
+
expected = np.array([np.cos(expected_angle / 2), 0, 0, np.sin(expected_angle / 2)])
|
|
409
407
|
np.testing.assert_allclose(result, expected, atol=1e-10)
|
|
410
408
|
|
|
411
409
|
|
|
@@ -438,9 +438,7 @@ class TestCoordinatedTurnProcessNoise:
|
|
|
438
438
|
T = 0.1
|
|
439
439
|
sigma_a = 1.0
|
|
440
440
|
sigma_omega = 0.01
|
|
441
|
-
Q = q_coord_turn_2d(
|
|
442
|
-
T, sigma_a, sigma_omega, state_type="position_velocity_omega"
|
|
443
|
-
)
|
|
441
|
+
Q = q_coord_turn_2d(T, sigma_a, sigma_omega, state_type="position_velocity_omega")
|
|
444
442
|
assert Q.shape == (5, 5)
|
|
445
443
|
np.testing.assert_allclose(Q, Q.T)
|
|
446
444
|
|
|
@@ -121,9 +121,7 @@ class TestParticleFilters:
|
|
|
121
121
|
def likelihood_func(z, x):
|
|
122
122
|
return gaussian_likelihood(z, x, R)
|
|
123
123
|
|
|
124
|
-
new_weights, log_lik = bootstrap_pf_update(
|
|
125
|
-
particles, weights, z, likelihood_func
|
|
126
|
-
)
|
|
124
|
+
new_weights, log_lik = bootstrap_pf_update(particles, weights, z, likelihood_func)
|
|
127
125
|
|
|
128
126
|
assert new_weights.shape == weights.shape
|
|
129
127
|
assert np.isclose(np.sum(new_weights), 1.0)
|
|
@@ -327,9 +325,7 @@ class TestParticleFilters:
|
|
|
327
325
|
|
|
328
326
|
mean = particle_mean(particles, weights)
|
|
329
327
|
|
|
330
|
-
expected = (
|
|
331
|
-
0.5 * np.array([0, 0]) + 0.3 * np.array([1, 1]) + 0.2 * np.array([2, 2])
|
|
332
|
-
)
|
|
328
|
+
expected = 0.5 * np.array([0, 0]) + 0.3 * np.array([1, 1]) + 0.2 * np.array([2, 2])
|
|
333
329
|
assert np.allclose(mean, expected)
|
|
334
330
|
|
|
335
331
|
def test_particle_covariance(self):
|
|
@@ -995,9 +991,7 @@ class TestNavigationCoverage:
|
|
|
995
991
|
tdoa12 = 0.0
|
|
996
992
|
tdoa13 = 0.0
|
|
997
993
|
|
|
998
|
-
result1, result2 = great_circle_tdoa_loc(
|
|
999
|
-
lat1, lon1, lat2, lon2, lat3, lon3, tdoa12, tdoa13
|
|
1000
|
-
)
|
|
994
|
+
result1, result2 = great_circle_tdoa_loc(lat1, lon1, lat2, lon2, lat3, lon3, tdoa12, tdoa13)
|
|
1001
995
|
|
|
1002
996
|
# Should return at least one solution
|
|
1003
997
|
assert result1 is not None or result2 is not None
|
|
@@ -98,9 +98,7 @@ class TestClenshawSumOrderDerivative:
|
|
|
98
98
|
cos_theta = 0.5
|
|
99
99
|
sin_theta = np.sqrt(1 - cos_theta**2)
|
|
100
100
|
|
|
101
|
-
result = clenshaw_sum_order_derivative(
|
|
102
|
-
0, cos_theta, sin_theta, coef.C, coef.S, 10
|
|
103
|
-
)
|
|
101
|
+
result = clenshaw_sum_order_derivative(0, cos_theta, sin_theta, coef.C, coef.S, 10)
|
|
104
102
|
|
|
105
103
|
assert isinstance(result, tuple)
|
|
106
104
|
assert len(result) == 4
|
|
@@ -142,12 +140,8 @@ class TestClenshawPotential:
|
|
|
142
140
|
lat = np.radians(30)
|
|
143
141
|
lon = 0
|
|
144
142
|
|
|
145
|
-
V_close = clenshaw_potential(
|
|
146
|
-
|
|
147
|
-
)
|
|
148
|
-
V_far = clenshaw_potential(
|
|
149
|
-
lat, lon, coef.R * 1.1, coef.C, coef.S, coef.R, coef.GM, 10
|
|
150
|
-
)
|
|
143
|
+
V_close = clenshaw_potential(lat, lon, coef.R, coef.C, coef.S, coef.R, coef.GM, 10)
|
|
144
|
+
V_far = clenshaw_potential(lat, lon, coef.R * 1.1, coef.C, coef.S, coef.R, coef.GM, 10)
|
|
151
145
|
|
|
152
146
|
# Potential magnitude should decrease with distance
|
|
153
147
|
assert abs(V_far) < abs(V_close)
|
|
@@ -158,12 +152,8 @@ class TestClenshawPotential:
|
|
|
158
152
|
lon = 0
|
|
159
153
|
r = coef.R
|
|
160
154
|
|
|
161
|
-
V_north = clenshaw_potential(
|
|
162
|
-
|
|
163
|
-
)
|
|
164
|
-
V_south = clenshaw_potential(
|
|
165
|
-
np.radians(-45), lon, r, coef.C, coef.S, coef.R, coef.GM, 10
|
|
166
|
-
)
|
|
155
|
+
V_north = clenshaw_potential(np.radians(45), lon, r, coef.C, coef.S, coef.R, coef.GM, 10)
|
|
156
|
+
V_south = clenshaw_potential(np.radians(-45), lon, r, coef.C, coef.S, coef.R, coef.GM, 10)
|
|
167
157
|
|
|
168
158
|
# For Earth's gravity field (with small asymmetries), should be close
|
|
169
159
|
# The potential is dominated by the central term, so relative difference is small
|
|
@@ -195,9 +185,7 @@ class TestClenshawGravity:
|
|
|
195
185
|
lon = np.radians(0)
|
|
196
186
|
r = coef.R
|
|
197
187
|
|
|
198
|
-
g_r, g_lat, g_lon = clenshaw_gravity(
|
|
199
|
-
lat, lon, r, coef.C, coef.S, coef.R, coef.GM, 10
|
|
200
|
-
)
|
|
188
|
+
g_r, g_lat, g_lon = clenshaw_gravity(lat, lon, r, coef.C, coef.S, coef.R, coef.GM, 10)
|
|
201
189
|
|
|
202
190
|
# Full gravity includes the central term GM/r^2 which is about 9.8 m/s^2
|
|
203
191
|
# The sign depends on convention - we compute -dV/dr
|
|
@@ -257,9 +245,7 @@ class TestAssociatedLegendreScaled:
|
|
|
257
245
|
for m in range(n + 1):
|
|
258
246
|
# exp is indexed by degree only (1D array)
|
|
259
247
|
P_reconstructed = P_scaled[n, m] * (10.0 ** exp[n])
|
|
260
|
-
assert_allclose(
|
|
261
|
-
P_reconstructed, P_unscaled[n, m], rtol=1e-8, atol=1e-12
|
|
262
|
-
)
|
|
248
|
+
assert_allclose(P_reconstructed, P_unscaled[n, m], rtol=1e-8, atol=1e-12)
|
|
263
249
|
|
|
264
250
|
def test_no_overflow_high_degree(self):
|
|
265
251
|
"""High degree computation doesn't overflow."""
|
|
@@ -320,9 +306,7 @@ class TestGeoidHeight:
|
|
|
320
306
|
# Test several locations
|
|
321
307
|
for lat in [0, 45, -45, 90]:
|
|
322
308
|
for lon in [0, 90, -90, 180]:
|
|
323
|
-
N = geoid_height(
|
|
324
|
-
np.radians(lat), np.radians(lon), coefficients=coef, n_max=36
|
|
325
|
-
)
|
|
309
|
+
N = geoid_height(np.radians(lat), np.radians(lon), coefficients=coef, n_max=36)
|
|
326
310
|
assert not np.isnan(N)
|
|
327
311
|
assert not np.isinf(N)
|
|
328
312
|
|
|
@@ -348,9 +332,7 @@ class TestGeoidHeights:
|
|
|
348
332
|
lon = np.radians(-75)
|
|
349
333
|
|
|
350
334
|
N_single = geoid_height(lat, lon, coefficients=coef, n_max=10)
|
|
351
|
-
N_batch = geoid_heights(
|
|
352
|
-
np.array([lat]), np.array([lon]), coefficients=coef, n_max=10
|
|
353
|
-
)
|
|
335
|
+
N_batch = geoid_heights(np.array([lat]), np.array([lon]), coefficients=coef, n_max=10)
|
|
354
336
|
|
|
355
337
|
assert_allclose(N_batch[0], N_single)
|
|
356
338
|
|
|
@@ -380,9 +362,7 @@ class TestGravityDisturbance:
|
|
|
380
362
|
np.radians(30), np.radians(60), h=0.0, coefficients=coef, n_max=10
|
|
381
363
|
)
|
|
382
364
|
|
|
383
|
-
expected_mag = np.sqrt(
|
|
384
|
-
result.delta_g_r**2 + result.delta_g_lat**2 + result.delta_g_lon**2
|
|
385
|
-
)
|
|
365
|
+
expected_mag = np.sqrt(result.delta_g_r**2 + result.delta_g_lat**2 + result.delta_g_lon**2)
|
|
386
366
|
assert_allclose(result.magnitude, expected_mag)
|
|
387
367
|
|
|
388
368
|
def test_disturbance_decreases_with_altitude(self):
|
|
@@ -392,9 +372,7 @@ class TestGravityDisturbance:
|
|
|
392
372
|
lon = np.radians(0)
|
|
393
373
|
|
|
394
374
|
result_0 = gravity_disturbance(lat, lon, h=0.0, coefficients=coef, n_max=20)
|
|
395
|
-
result_10km = gravity_disturbance(
|
|
396
|
-
lat, lon, h=10000.0, coefficients=coef, n_max=20
|
|
397
|
-
)
|
|
375
|
+
result_10km = gravity_disturbance(lat, lon, h=10000.0, coefficients=coef, n_max=20)
|
|
398
376
|
|
|
399
377
|
# Disturbance magnitude should decrease with altitude
|
|
400
378
|
assert result_10km.magnitude < result_0.magnitude
|
|
@@ -407,9 +385,7 @@ class TestGravityAnomaly:
|
|
|
407
385
|
"""gravity_anomaly returns a float."""
|
|
408
386
|
coef = create_test_coefficients(n_max=10)
|
|
409
387
|
|
|
410
|
-
anom = gravity_anomaly(
|
|
411
|
-
np.radians(45), np.radians(-75), h=0.0, coefficients=coef, n_max=10
|
|
412
|
-
)
|
|
388
|
+
anom = gravity_anomaly(np.radians(45), np.radians(-75), h=0.0, coefficients=coef, n_max=10)
|
|
413
389
|
|
|
414
390
|
assert isinstance(anom, float)
|
|
415
391
|
assert not np.isnan(anom)
|
|
@@ -418,9 +394,7 @@ class TestGravityAnomaly:
|
|
|
418
394
|
"""Gravity anomaly computation produces finite values."""
|
|
419
395
|
coef = create_test_coefficients(n_max=36)
|
|
420
396
|
|
|
421
|
-
anom = gravity_anomaly(
|
|
422
|
-
np.radians(45), np.radians(0), h=0.0, coefficients=coef, n_max=36
|
|
423
|
-
)
|
|
397
|
+
anom = gravity_anomaly(np.radians(45), np.radians(0), h=0.0, coefficients=coef, n_max=36)
|
|
424
398
|
|
|
425
399
|
# Note: With test coefficients (including full J2), values are large
|
|
426
400
|
# because J2 represents the equatorial bulge which is part of the
|
|
@@ -449,9 +423,7 @@ class TestDeflectionOfVertical:
|
|
|
449
423
|
"""Deflection values are finite."""
|
|
450
424
|
coef = create_test_coefficients(n_max=36)
|
|
451
425
|
|
|
452
|
-
xi, eta = deflection_of_vertical(
|
|
453
|
-
np.radians(45), np.radians(0), coefficients=coef, n_max=36
|
|
454
|
-
)
|
|
426
|
+
xi, eta = deflection_of_vertical(np.radians(45), np.radians(0), coefficients=coef, n_max=36)
|
|
455
427
|
|
|
456
428
|
# Note: Test coefficients include full J2, so deflections are larger
|
|
457
429
|
# than real-world values which are typically < 60 arcseconds.
|
|
@@ -521,16 +493,12 @@ class TestClenshawVsNaive:
|
|
|
521
493
|
r = coef.R
|
|
522
494
|
|
|
523
495
|
# Compute potential using Clenshaw
|
|
524
|
-
V_clenshaw = clenshaw_potential(
|
|
525
|
-
lat, lon, r, coef.C, coef.S, coef.R, coef.GM, 10
|
|
526
|
-
)
|
|
496
|
+
V_clenshaw = clenshaw_potential(lat, lon, r, coef.C, coef.S, coef.R, coef.GM, 10)
|
|
527
497
|
|
|
528
498
|
# Compute using naive spherical harmonic sum
|
|
529
499
|
# spherical_harmonic_sum takes (lat, lon, r, C, S, R, GM, n_max)
|
|
530
500
|
# and returns (V, dV_r, dV_lat)
|
|
531
|
-
V_naive, _, _ = spherical_harmonic_sum(
|
|
532
|
-
lat, lon, r, coef.C, coef.S, coef.R, coef.GM, 10
|
|
533
|
-
)
|
|
501
|
+
V_naive, _, _ = spherical_harmonic_sum(lat, lon, r, coef.C, coef.S, coef.R, coef.GM, 10)
|
|
534
502
|
|
|
535
503
|
# Should match to reasonable precision
|
|
536
504
|
# (Clenshaw and naive may have different numerical properties)
|
|
@@ -578,12 +546,8 @@ class TestEdgeCases:
|
|
|
578
546
|
"""Negative longitude works correctly."""
|
|
579
547
|
coef = create_test_coefficients(n_max=20)
|
|
580
548
|
|
|
581
|
-
N_pos = geoid_height(
|
|
582
|
-
|
|
583
|
-
)
|
|
584
|
-
N_neg = geoid_height(
|
|
585
|
-
np.radians(45), np.radians(-270), coefficients=coef, n_max=20
|
|
586
|
-
)
|
|
549
|
+
N_pos = geoid_height(np.radians(45), np.radians(90), coefficients=coef, n_max=20)
|
|
550
|
+
N_neg = geoid_height(np.radians(45), np.radians(-270), coefficients=coef, n_max=20)
|
|
587
551
|
|
|
588
552
|
# 90° and -270° are the same longitude
|
|
589
553
|
assert_allclose(N_pos, N_neg, rtol=1e-10)
|
|
@@ -130,41 +130,31 @@ class TestEMMFunction:
|
|
|
130
130
|
|
|
131
131
|
def test_total_intensity_reasonable(self, test_coefficients):
|
|
132
132
|
"""Total field intensity should be in expected range."""
|
|
133
|
-
result = emm(
|
|
134
|
-
np.radians(45), np.radians(0), 0, 2020.0, coefficients=test_coefficients
|
|
135
|
-
)
|
|
133
|
+
result = emm(np.radians(45), np.radians(0), 0, 2020.0, coefficients=test_coefficients)
|
|
136
134
|
# Field intensity typically 25,000-65,000 nT at mid-latitudes
|
|
137
135
|
# but can exceed this at high latitudes, allow up to 100,000 nT
|
|
138
136
|
assert 20000 < result.F < 100000
|
|
139
137
|
|
|
140
138
|
def test_horizontal_intensity_formula(self, test_coefficients):
|
|
141
139
|
"""H = sqrt(X^2 + Y^2)."""
|
|
142
|
-
result = emm(
|
|
143
|
-
np.radians(40), np.radians(-75), 0, 2020.0, coefficients=test_coefficients
|
|
144
|
-
)
|
|
140
|
+
result = emm(np.radians(40), np.radians(-75), 0, 2020.0, coefficients=test_coefficients)
|
|
145
141
|
H_calc = np.sqrt(result.X**2 + result.Y**2)
|
|
146
142
|
assert_allclose(result.H, H_calc, rtol=1e-10)
|
|
147
143
|
|
|
148
144
|
def test_total_intensity_formula(self, test_coefficients):
|
|
149
145
|
"""F = sqrt(H^2 + Z^2)."""
|
|
150
|
-
result = emm(
|
|
151
|
-
np.radians(40), np.radians(-75), 0, 2020.0, coefficients=test_coefficients
|
|
152
|
-
)
|
|
146
|
+
result = emm(np.radians(40), np.radians(-75), 0, 2020.0, coefficients=test_coefficients)
|
|
153
147
|
F_calc = np.sqrt(result.H**2 + result.Z**2)
|
|
154
148
|
assert_allclose(result.F, F_calc, rtol=1e-10)
|
|
155
149
|
|
|
156
150
|
def test_declination_range(self, test_coefficients):
|
|
157
151
|
"""Declination should be within -180 to 180 degrees."""
|
|
158
|
-
result = emm(
|
|
159
|
-
np.radians(45), np.radians(-75), 0, 2020.0, coefficients=test_coefficients
|
|
160
|
-
)
|
|
152
|
+
result = emm(np.radians(45), np.radians(-75), 0, 2020.0, coefficients=test_coefficients)
|
|
161
153
|
assert -np.pi <= result.D <= np.pi
|
|
162
154
|
|
|
163
155
|
def test_inclination_range(self, test_coefficients):
|
|
164
156
|
"""Inclination should be within -90 to 90 degrees."""
|
|
165
|
-
result = emm(
|
|
166
|
-
np.radians(45), np.radians(-75), 0, 2020.0, coefficients=test_coefficients
|
|
167
|
-
)
|
|
157
|
+
result = emm(np.radians(45), np.radians(-75), 0, 2020.0, coefficients=test_coefficients)
|
|
168
158
|
assert -np.pi / 2 <= result.I <= np.pi / 2
|
|
169
159
|
|
|
170
160
|
|
|
@@ -229,9 +219,7 @@ class TestWMMHR:
|
|
|
229
219
|
|
|
230
220
|
def test_wmmhr_returns_result(self, test_coefficients):
|
|
231
221
|
"""WMMHR returns MagneticResult."""
|
|
232
|
-
result = wmmhr(
|
|
233
|
-
np.radians(45), np.radians(-75), 0, 2025.0, coefficients=test_coefficients
|
|
234
|
-
)
|
|
222
|
+
result = wmmhr(np.radians(45), np.radians(-75), 0, 2025.0, coefficients=test_coefficients)
|
|
235
223
|
assert hasattr(result, "F")
|
|
236
224
|
assert hasattr(result, "D")
|
|
237
225
|
assert hasattr(result, "I")
|
|
@@ -271,9 +259,7 @@ class TestConvenienceFunctions:
|
|
|
271
259
|
|
|
272
260
|
def test_emm_declination(self, test_coefficients):
|
|
273
261
|
"""emm_declination returns correct value."""
|
|
274
|
-
result = emm(
|
|
275
|
-
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients
|
|
276
|
-
)
|
|
262
|
+
result = emm(np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients)
|
|
277
263
|
D = emm_declination(
|
|
278
264
|
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients
|
|
279
265
|
)
|
|
@@ -281,9 +267,7 @@ class TestConvenienceFunctions:
|
|
|
281
267
|
|
|
282
268
|
def test_emm_inclination(self, test_coefficients):
|
|
283
269
|
"""emm_inclination returns correct value."""
|
|
284
|
-
result = emm(
|
|
285
|
-
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients
|
|
286
|
-
)
|
|
270
|
+
result = emm(np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients)
|
|
287
271
|
incl = emm_inclination(
|
|
288
272
|
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients
|
|
289
273
|
)
|
|
@@ -291,9 +275,7 @@ class TestConvenienceFunctions:
|
|
|
291
275
|
|
|
292
276
|
def test_emm_intensity(self, test_coefficients):
|
|
293
277
|
"""emm_intensity returns correct value."""
|
|
294
|
-
result = emm(
|
|
295
|
-
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients
|
|
296
|
-
)
|
|
278
|
+
result = emm(np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients)
|
|
297
279
|
F = emm_intensity(
|
|
298
280
|
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=test_coefficients
|
|
299
281
|
)
|
|
@@ -331,12 +313,8 @@ class TestSecularVariation:
|
|
|
331
313
|
|
|
332
314
|
def test_field_changes_with_time(self, test_coefficients):
|
|
333
315
|
"""Field should change slightly between years."""
|
|
334
|
-
result_2020 = emm(
|
|
335
|
-
|
|
336
|
-
)
|
|
337
|
-
result_2022 = emm(
|
|
338
|
-
np.radians(45), np.radians(0), 0, 2022.0, coefficients=test_coefficients
|
|
339
|
-
)
|
|
316
|
+
result_2020 = emm(np.radians(45), np.radians(0), 0, 2020.0, coefficients=test_coefficients)
|
|
317
|
+
result_2022 = emm(np.radians(45), np.radians(0), 0, 2022.0, coefficients=test_coefficients)
|
|
340
318
|
# Small but non-zero change expected
|
|
341
319
|
# Secular variation is ~50-100 nT/year at mid-latitudes
|
|
342
320
|
assert result_2020.F != result_2022.F
|
|
@@ -411,9 +389,7 @@ class TestHighDegreeEvaluation:
|
|
|
411
389
|
def test_higher_degree_coefficients(self):
|
|
412
390
|
"""Test with higher degree coefficients (n_max=50)."""
|
|
413
391
|
coef = create_emm_test_coefficients(n_max=50)
|
|
414
|
-
result = emm(
|
|
415
|
-
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=coef, n_max=50
|
|
416
|
-
)
|
|
392
|
+
result = emm(np.radians(40), np.radians(-105), 0, 2020.0, coefficients=coef, n_max=50)
|
|
417
393
|
assert not np.isnan(result.F)
|
|
418
394
|
assert result.F > 0
|
|
419
395
|
|
|
@@ -422,12 +398,8 @@ class TestHighDegreeEvaluation:
|
|
|
422
398
|
coef = create_emm_test_coefficients(n_max=50)
|
|
423
399
|
|
|
424
400
|
# Evaluate at different n_max values
|
|
425
|
-
result_12 = emm(
|
|
426
|
-
|
|
427
|
-
)
|
|
428
|
-
result_50 = emm(
|
|
429
|
-
np.radians(40), np.radians(-105), 0, 2020.0, coefficients=coef, n_max=50
|
|
430
|
-
)
|
|
401
|
+
result_12 = emm(np.radians(40), np.radians(-105), 0, 2020.0, coefficients=coef, n_max=12)
|
|
402
|
+
result_50 = emm(np.radians(40), np.radians(-105), 0, 2020.0, coefficients=coef, n_max=50)
|
|
431
403
|
|
|
432
404
|
# Both should be valid
|
|
433
405
|
assert result_12.F > 0
|