nrl-tracker 0.21.4__py3-none-any.whl → 1.7.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nrl_tracker-0.21.4.dist-info → nrl_tracker-1.7.5.dist-info}/METADATA +57 -10
- nrl_tracker-1.7.5.dist-info/RECORD +165 -0
- pytcl/__init__.py +4 -3
- pytcl/assignment_algorithms/__init__.py +28 -0
- pytcl/assignment_algorithms/data_association.py +2 -7
- pytcl/assignment_algorithms/gating.py +10 -10
- pytcl/assignment_algorithms/jpda.py +40 -40
- pytcl/assignment_algorithms/nd_assignment.py +379 -0
- pytcl/assignment_algorithms/network_flow.py +371 -0
- pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
- pytcl/astronomical/__init__.py +162 -8
- pytcl/astronomical/ephemerides.py +533 -0
- pytcl/astronomical/reference_frames.py +865 -56
- pytcl/astronomical/relativity.py +473 -0
- pytcl/astronomical/sgp4.py +710 -0
- pytcl/astronomical/special_orbits.py +532 -0
- pytcl/astronomical/tle.py +558 -0
- pytcl/atmosphere/__init__.py +45 -3
- pytcl/atmosphere/ionosphere.py +512 -0
- pytcl/atmosphere/nrlmsise00.py +809 -0
- pytcl/clustering/dbscan.py +2 -2
- pytcl/clustering/gaussian_mixture.py +3 -3
- pytcl/clustering/hierarchical.py +15 -15
- pytcl/clustering/kmeans.py +4 -4
- pytcl/containers/__init__.py +28 -21
- pytcl/containers/base.py +219 -0
- pytcl/containers/cluster_set.py +2 -1
- pytcl/containers/covertree.py +26 -29
- pytcl/containers/kd_tree.py +94 -29
- pytcl/containers/measurement_set.py +1 -9
- pytcl/containers/rtree.py +200 -1
- pytcl/containers/vptree.py +21 -28
- pytcl/coordinate_systems/conversions/geodetic.py +272 -5
- pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
- pytcl/coordinate_systems/projections/__init__.py +4 -2
- pytcl/coordinate_systems/projections/projections.py +2 -2
- pytcl/coordinate_systems/rotations/rotations.py +10 -6
- pytcl/core/__init__.py +18 -0
- pytcl/core/validation.py +333 -2
- pytcl/dynamic_estimation/__init__.py +26 -0
- pytcl/dynamic_estimation/gaussian_sum_filter.py +434 -0
- pytcl/dynamic_estimation/imm.py +15 -18
- pytcl/dynamic_estimation/kalman/__init__.py +30 -0
- pytcl/dynamic_estimation/kalman/constrained.py +382 -0
- pytcl/dynamic_estimation/kalman/extended.py +9 -12
- pytcl/dynamic_estimation/kalman/h_infinity.py +613 -0
- pytcl/dynamic_estimation/kalman/square_root.py +60 -573
- pytcl/dynamic_estimation/kalman/sr_ukf.py +302 -0
- pytcl/dynamic_estimation/kalman/ud_filter.py +410 -0
- pytcl/dynamic_estimation/kalman/unscented.py +9 -10
- pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
- pytcl/dynamic_estimation/rbpf.py +589 -0
- pytcl/dynamic_estimation/smoothers.py +1 -5
- pytcl/dynamic_models/discrete_time/__init__.py +1 -5
- pytcl/dynamic_models/process_noise/__init__.py +1 -5
- pytcl/gravity/egm.py +13 -0
- pytcl/gravity/spherical_harmonics.py +98 -37
- pytcl/gravity/tides.py +6 -6
- pytcl/logging_config.py +328 -0
- pytcl/magnetism/__init__.py +10 -14
- pytcl/magnetism/emm.py +10 -3
- pytcl/magnetism/wmm.py +260 -23
- pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
- pytcl/mathematical_functions/geometry/geometry.py +5 -5
- pytcl/mathematical_functions/interpolation/__init__.py +2 -2
- pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
- pytcl/mathematical_functions/signal_processing/detection.py +24 -24
- pytcl/mathematical_functions/signal_processing/filters.py +14 -14
- pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
- pytcl/mathematical_functions/special_functions/__init__.py +2 -2
- pytcl/mathematical_functions/special_functions/bessel.py +15 -3
- pytcl/mathematical_functions/special_functions/debye.py +136 -26
- pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
- pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
- pytcl/mathematical_functions/special_functions/hypergeometric.py +81 -15
- pytcl/mathematical_functions/transforms/fourier.py +8 -8
- pytcl/mathematical_functions/transforms/stft.py +12 -12
- pytcl/mathematical_functions/transforms/wavelets.py +9 -9
- pytcl/navigation/__init__.py +14 -10
- pytcl/navigation/geodesy.py +246 -160
- pytcl/navigation/great_circle.py +101 -19
- pytcl/navigation/ins.py +1 -5
- pytcl/plotting/coordinates.py +7 -7
- pytcl/plotting/tracks.py +2 -2
- pytcl/static_estimation/maximum_likelihood.py +16 -14
- pytcl/static_estimation/robust.py +5 -5
- pytcl/terrain/loaders.py +5 -5
- pytcl/trackers/__init__.py +3 -14
- pytcl/trackers/hypothesis.py +1 -1
- pytcl/trackers/mht.py +9 -9
- pytcl/trackers/multi_target.py +2 -5
- nrl_tracker-0.21.4.dist-info/RECORD +0 -148
- {nrl_tracker-0.21.4.dist-info → nrl_tracker-1.7.5.dist-info}/LICENSE +0 -0
- {nrl_tracker-0.21.4.dist-info → nrl_tracker-1.7.5.dist-info}/WHEEL +0 -0
- {nrl_tracker-0.21.4.dist-info → nrl_tracker-1.7.5.dist-info}/top_level.txt +0 -0
|
@@ -5,15 +5,12 @@ The UKF uses the unscented transform to propagate the mean and covariance
|
|
|
5
5
|
through nonlinear functions without requiring Jacobian computation.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
from typing import Callable, NamedTuple, Optional, Tuple
|
|
8
|
+
from typing import Any, Callable, NamedTuple, Optional, Tuple
|
|
9
9
|
|
|
10
10
|
import numpy as np
|
|
11
11
|
from numpy.typing import ArrayLike, NDArray
|
|
12
12
|
|
|
13
|
-
from pytcl.dynamic_estimation.kalman.linear import
|
|
14
|
-
KalmanPrediction,
|
|
15
|
-
KalmanUpdate,
|
|
16
|
-
)
|
|
13
|
+
from pytcl.dynamic_estimation.kalman.linear import KalmanPrediction, KalmanUpdate
|
|
17
14
|
|
|
18
15
|
|
|
19
16
|
class SigmaPoints(NamedTuple):
|
|
@@ -229,7 +226,7 @@ def unscented_transform(
|
|
|
229
226
|
def ukf_predict(
|
|
230
227
|
x: ArrayLike,
|
|
231
228
|
P: ArrayLike,
|
|
232
|
-
f: Callable[[NDArray], NDArray],
|
|
229
|
+
f: Callable[[NDArray[Any]], NDArray[Any]],
|
|
233
230
|
Q: ArrayLike,
|
|
234
231
|
alpha: float = 1e-3,
|
|
235
232
|
beta: float = 2.0,
|
|
@@ -295,7 +292,7 @@ def ukf_update(
|
|
|
295
292
|
x: ArrayLike,
|
|
296
293
|
P: ArrayLike,
|
|
297
294
|
z: ArrayLike,
|
|
298
|
-
h: Callable[[NDArray], NDArray],
|
|
295
|
+
h: Callable[[NDArray[Any]], NDArray[Any]],
|
|
299
296
|
R: ArrayLike,
|
|
300
297
|
alpha: float = 1e-3,
|
|
301
298
|
beta: float = 2.0,
|
|
@@ -385,7 +382,9 @@ def ukf_update(
|
|
|
385
382
|
)
|
|
386
383
|
|
|
387
384
|
|
|
388
|
-
def ckf_spherical_cubature_points(
|
|
385
|
+
def ckf_spherical_cubature_points(
|
|
386
|
+
n: int,
|
|
387
|
+
) -> tuple[NDArray[np.floating], NDArray[np.floating]]:
|
|
389
388
|
"""
|
|
390
389
|
Generate cubature points for Cubature Kalman Filter.
|
|
391
390
|
|
|
@@ -421,7 +420,7 @@ def ckf_spherical_cubature_points(n: int) -> Tuple[NDArray, NDArray]:
|
|
|
421
420
|
def ckf_predict(
|
|
422
421
|
x: ArrayLike,
|
|
423
422
|
P: ArrayLike,
|
|
424
|
-
f: Callable[[NDArray], NDArray],
|
|
423
|
+
f: Callable[[NDArray[Any]], NDArray[Any]],
|
|
425
424
|
Q: ArrayLike,
|
|
426
425
|
) -> KalmanPrediction:
|
|
427
426
|
"""
|
|
@@ -490,7 +489,7 @@ def ckf_update(
|
|
|
490
489
|
x: ArrayLike,
|
|
491
490
|
P: ArrayLike,
|
|
492
491
|
z: ArrayLike,
|
|
493
|
-
h: Callable[[NDArray], NDArray],
|
|
492
|
+
h: Callable[[NDArray[Any]], NDArray[Any]],
|
|
494
493
|
R: ArrayLike,
|
|
495
494
|
) -> KalmanUpdate:
|
|
496
495
|
"""
|
|
@@ -5,7 +5,7 @@ This module provides particle filtering algorithms for nonlinear/non-Gaussian
|
|
|
5
5
|
state estimation.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
from typing import Callable, NamedTuple, Optional, Tuple
|
|
8
|
+
from typing import Any, Callable, NamedTuple, Optional, Tuple
|
|
9
9
|
|
|
10
10
|
import numpy as np
|
|
11
11
|
from numba import njit
|
|
@@ -102,9 +102,9 @@ def resample_systematic(
|
|
|
102
102
|
|
|
103
103
|
@njit(cache=True)
|
|
104
104
|
def _resample_residual_deterministic(
|
|
105
|
-
particles: np.ndarray,
|
|
106
|
-
floor_Nw: np.ndarray,
|
|
107
|
-
) -> Tuple[np.ndarray, int]:
|
|
105
|
+
particles: np.ndarray[Any, Any],
|
|
106
|
+
floor_Nw: np.ndarray[Any, Any],
|
|
107
|
+
) -> Tuple[np.ndarray[Any, Any], int]:
|
|
108
108
|
"""JIT-compiled deterministic copy portion of residual resampling."""
|
|
109
109
|
N = particles.shape[0]
|
|
110
110
|
n = particles.shape[1]
|
|
@@ -196,8 +196,8 @@ def effective_sample_size(weights: NDArray[np.floating]) -> float:
|
|
|
196
196
|
|
|
197
197
|
def bootstrap_pf_predict(
|
|
198
198
|
particles: NDArray[np.floating],
|
|
199
|
-
f: Callable[[NDArray], NDArray],
|
|
200
|
-
Q_sample: Callable[[int, Optional[np.random.Generator]], NDArray],
|
|
199
|
+
f: Callable[[NDArray[Any]], NDArray[Any]],
|
|
200
|
+
Q_sample: Callable[[int, Optional[np.random.Generator]], NDArray[Any]],
|
|
201
201
|
rng: Optional[np.random.Generator] = None,
|
|
202
202
|
) -> NDArray[np.floating]:
|
|
203
203
|
"""
|
|
@@ -242,7 +242,7 @@ def bootstrap_pf_update(
|
|
|
242
242
|
particles: NDArray[np.floating],
|
|
243
243
|
weights: NDArray[np.floating],
|
|
244
244
|
z: ArrayLike,
|
|
245
|
-
likelihood_func: Callable[[NDArray, NDArray], float],
|
|
245
|
+
likelihood_func: Callable[[NDArray[Any], NDArray[Any]], float],
|
|
246
246
|
) -> Tuple[NDArray[np.floating], float]:
|
|
247
247
|
"""
|
|
248
248
|
Bootstrap particle filter update step.
|
|
@@ -328,9 +328,9 @@ def bootstrap_pf_step(
|
|
|
328
328
|
particles: NDArray[np.floating],
|
|
329
329
|
weights: NDArray[np.floating],
|
|
330
330
|
z: ArrayLike,
|
|
331
|
-
f: Callable[[NDArray], NDArray],
|
|
332
|
-
h: Callable[[NDArray], NDArray],
|
|
333
|
-
Q_sample: Callable[[int, Optional[np.random.Generator]], NDArray],
|
|
331
|
+
f: Callable[[NDArray[Any]], NDArray[Any]],
|
|
332
|
+
h: Callable[[NDArray[Any]], NDArray[Any]],
|
|
333
|
+
Q_sample: Callable[[int, Optional[np.random.Generator]], NDArray[Any]],
|
|
334
334
|
R: ArrayLike,
|
|
335
335
|
resample_threshold: float = 0.5,
|
|
336
336
|
resample_method: str = "systematic",
|
|
@@ -378,7 +378,7 @@ def bootstrap_pf_step(
|
|
|
378
378
|
particles_pred = bootstrap_pf_predict(particles, f, Q_sample, rng)
|
|
379
379
|
|
|
380
380
|
# Update
|
|
381
|
-
def likelihood_func(z, x):
|
|
381
|
+
def likelihood_func(z: NDArray[Any], x: NDArray[Any]) -> Any:
|
|
382
382
|
z_pred = h(x)
|
|
383
383
|
return gaussian_likelihood(z, z_pred, R)
|
|
384
384
|
|
|
@@ -426,10 +426,10 @@ def particle_mean(
|
|
|
426
426
|
|
|
427
427
|
@njit(cache=True)
|
|
428
428
|
def _particle_covariance_core(
|
|
429
|
-
particles: np.ndarray,
|
|
430
|
-
weights: np.ndarray,
|
|
431
|
-
mean: np.ndarray,
|
|
432
|
-
) -> np.ndarray:
|
|
429
|
+
particles: np.ndarray[Any, Any],
|
|
430
|
+
weights: np.ndarray[Any, Any],
|
|
431
|
+
mean: np.ndarray[Any, Any],
|
|
432
|
+
) -> np.ndarray[Any, Any]:
|
|
433
433
|
"""JIT-compiled core for particle covariance computation."""
|
|
434
434
|
N = particles.shape[0]
|
|
435
435
|
n = particles.shape[1]
|