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.
Files changed (95) hide show
  1. {nrl_tracker-0.21.4.dist-info → nrl_tracker-1.7.5.dist-info}/METADATA +57 -10
  2. nrl_tracker-1.7.5.dist-info/RECORD +165 -0
  3. pytcl/__init__.py +4 -3
  4. pytcl/assignment_algorithms/__init__.py +28 -0
  5. pytcl/assignment_algorithms/data_association.py +2 -7
  6. pytcl/assignment_algorithms/gating.py +10 -10
  7. pytcl/assignment_algorithms/jpda.py +40 -40
  8. pytcl/assignment_algorithms/nd_assignment.py +379 -0
  9. pytcl/assignment_algorithms/network_flow.py +371 -0
  10. pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
  11. pytcl/astronomical/__init__.py +162 -8
  12. pytcl/astronomical/ephemerides.py +533 -0
  13. pytcl/astronomical/reference_frames.py +865 -56
  14. pytcl/astronomical/relativity.py +473 -0
  15. pytcl/astronomical/sgp4.py +710 -0
  16. pytcl/astronomical/special_orbits.py +532 -0
  17. pytcl/astronomical/tle.py +558 -0
  18. pytcl/atmosphere/__init__.py +45 -3
  19. pytcl/atmosphere/ionosphere.py +512 -0
  20. pytcl/atmosphere/nrlmsise00.py +809 -0
  21. pytcl/clustering/dbscan.py +2 -2
  22. pytcl/clustering/gaussian_mixture.py +3 -3
  23. pytcl/clustering/hierarchical.py +15 -15
  24. pytcl/clustering/kmeans.py +4 -4
  25. pytcl/containers/__init__.py +28 -21
  26. pytcl/containers/base.py +219 -0
  27. pytcl/containers/cluster_set.py +2 -1
  28. pytcl/containers/covertree.py +26 -29
  29. pytcl/containers/kd_tree.py +94 -29
  30. pytcl/containers/measurement_set.py +1 -9
  31. pytcl/containers/rtree.py +200 -1
  32. pytcl/containers/vptree.py +21 -28
  33. pytcl/coordinate_systems/conversions/geodetic.py +272 -5
  34. pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
  35. pytcl/coordinate_systems/projections/__init__.py +4 -2
  36. pytcl/coordinate_systems/projections/projections.py +2 -2
  37. pytcl/coordinate_systems/rotations/rotations.py +10 -6
  38. pytcl/core/__init__.py +18 -0
  39. pytcl/core/validation.py +333 -2
  40. pytcl/dynamic_estimation/__init__.py +26 -0
  41. pytcl/dynamic_estimation/gaussian_sum_filter.py +434 -0
  42. pytcl/dynamic_estimation/imm.py +15 -18
  43. pytcl/dynamic_estimation/kalman/__init__.py +30 -0
  44. pytcl/dynamic_estimation/kalman/constrained.py +382 -0
  45. pytcl/dynamic_estimation/kalman/extended.py +9 -12
  46. pytcl/dynamic_estimation/kalman/h_infinity.py +613 -0
  47. pytcl/dynamic_estimation/kalman/square_root.py +60 -573
  48. pytcl/dynamic_estimation/kalman/sr_ukf.py +302 -0
  49. pytcl/dynamic_estimation/kalman/ud_filter.py +410 -0
  50. pytcl/dynamic_estimation/kalman/unscented.py +9 -10
  51. pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
  52. pytcl/dynamic_estimation/rbpf.py +589 -0
  53. pytcl/dynamic_estimation/smoothers.py +1 -5
  54. pytcl/dynamic_models/discrete_time/__init__.py +1 -5
  55. pytcl/dynamic_models/process_noise/__init__.py +1 -5
  56. pytcl/gravity/egm.py +13 -0
  57. pytcl/gravity/spherical_harmonics.py +98 -37
  58. pytcl/gravity/tides.py +6 -6
  59. pytcl/logging_config.py +328 -0
  60. pytcl/magnetism/__init__.py +10 -14
  61. pytcl/magnetism/emm.py +10 -3
  62. pytcl/magnetism/wmm.py +260 -23
  63. pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
  64. pytcl/mathematical_functions/geometry/geometry.py +5 -5
  65. pytcl/mathematical_functions/interpolation/__init__.py +2 -2
  66. pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
  67. pytcl/mathematical_functions/signal_processing/detection.py +24 -24
  68. pytcl/mathematical_functions/signal_processing/filters.py +14 -14
  69. pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
  70. pytcl/mathematical_functions/special_functions/__init__.py +2 -2
  71. pytcl/mathematical_functions/special_functions/bessel.py +15 -3
  72. pytcl/mathematical_functions/special_functions/debye.py +136 -26
  73. pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
  74. pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
  75. pytcl/mathematical_functions/special_functions/hypergeometric.py +81 -15
  76. pytcl/mathematical_functions/transforms/fourier.py +8 -8
  77. pytcl/mathematical_functions/transforms/stft.py +12 -12
  78. pytcl/mathematical_functions/transforms/wavelets.py +9 -9
  79. pytcl/navigation/__init__.py +14 -10
  80. pytcl/navigation/geodesy.py +246 -160
  81. pytcl/navigation/great_circle.py +101 -19
  82. pytcl/navigation/ins.py +1 -5
  83. pytcl/plotting/coordinates.py +7 -7
  84. pytcl/plotting/tracks.py +2 -2
  85. pytcl/static_estimation/maximum_likelihood.py +16 -14
  86. pytcl/static_estimation/robust.py +5 -5
  87. pytcl/terrain/loaders.py +5 -5
  88. pytcl/trackers/__init__.py +3 -14
  89. pytcl/trackers/hypothesis.py +1 -1
  90. pytcl/trackers/mht.py +9 -9
  91. pytcl/trackers/multi_target.py +2 -5
  92. nrl_tracker-0.21.4.dist-info/RECORD +0 -148
  93. {nrl_tracker-0.21.4.dist-info → nrl_tracker-1.7.5.dist-info}/LICENSE +0 -0
  94. {nrl_tracker-0.21.4.dist-info → nrl_tracker-1.7.5.dist-info}/WHEEL +0 -0
  95. {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(n: int) -> Tuple[NDArray, NDArray]:
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]