nrl-tracker 0.22.5__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 (84) hide show
  1. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.7.5.dist-info}/METADATA +57 -10
  2. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.7.5.dist-info}/RECORD +84 -69
  3. pytcl/__init__.py +4 -3
  4. pytcl/assignment_algorithms/__init__.py +28 -0
  5. pytcl/assignment_algorithms/gating.py +10 -10
  6. pytcl/assignment_algorithms/jpda.py +40 -40
  7. pytcl/assignment_algorithms/nd_assignment.py +379 -0
  8. pytcl/assignment_algorithms/network_flow.py +371 -0
  9. pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
  10. pytcl/astronomical/__init__.py +104 -3
  11. pytcl/astronomical/ephemerides.py +14 -11
  12. pytcl/astronomical/reference_frames.py +865 -56
  13. pytcl/astronomical/relativity.py +6 -5
  14. pytcl/astronomical/sgp4.py +710 -0
  15. pytcl/astronomical/special_orbits.py +532 -0
  16. pytcl/astronomical/tle.py +558 -0
  17. pytcl/atmosphere/__init__.py +43 -1
  18. pytcl/atmosphere/ionosphere.py +512 -0
  19. pytcl/atmosphere/nrlmsise00.py +809 -0
  20. pytcl/clustering/dbscan.py +2 -2
  21. pytcl/clustering/gaussian_mixture.py +3 -3
  22. pytcl/clustering/hierarchical.py +15 -15
  23. pytcl/clustering/kmeans.py +4 -4
  24. pytcl/containers/__init__.py +24 -0
  25. pytcl/containers/base.py +219 -0
  26. pytcl/containers/cluster_set.py +12 -2
  27. pytcl/containers/covertree.py +26 -29
  28. pytcl/containers/kd_tree.py +94 -29
  29. pytcl/containers/rtree.py +200 -1
  30. pytcl/containers/vptree.py +21 -28
  31. pytcl/coordinate_systems/conversions/geodetic.py +272 -5
  32. pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
  33. pytcl/coordinate_systems/projections/__init__.py +1 -1
  34. pytcl/coordinate_systems/projections/projections.py +2 -2
  35. pytcl/coordinate_systems/rotations/rotations.py +10 -6
  36. pytcl/core/__init__.py +18 -0
  37. pytcl/core/validation.py +333 -2
  38. pytcl/dynamic_estimation/__init__.py +26 -0
  39. pytcl/dynamic_estimation/gaussian_sum_filter.py +434 -0
  40. pytcl/dynamic_estimation/imm.py +14 -14
  41. pytcl/dynamic_estimation/kalman/__init__.py +30 -0
  42. pytcl/dynamic_estimation/kalman/constrained.py +382 -0
  43. pytcl/dynamic_estimation/kalman/extended.py +8 -8
  44. pytcl/dynamic_estimation/kalman/h_infinity.py +613 -0
  45. pytcl/dynamic_estimation/kalman/square_root.py +60 -573
  46. pytcl/dynamic_estimation/kalman/sr_ukf.py +302 -0
  47. pytcl/dynamic_estimation/kalman/ud_filter.py +410 -0
  48. pytcl/dynamic_estimation/kalman/unscented.py +8 -6
  49. pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
  50. pytcl/dynamic_estimation/rbpf.py +589 -0
  51. pytcl/gravity/egm.py +13 -0
  52. pytcl/gravity/spherical_harmonics.py +98 -37
  53. pytcl/gravity/tides.py +6 -6
  54. pytcl/logging_config.py +328 -0
  55. pytcl/magnetism/__init__.py +7 -0
  56. pytcl/magnetism/emm.py +10 -3
  57. pytcl/magnetism/wmm.py +260 -23
  58. pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
  59. pytcl/mathematical_functions/geometry/geometry.py +5 -5
  60. pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
  61. pytcl/mathematical_functions/signal_processing/detection.py +24 -24
  62. pytcl/mathematical_functions/signal_processing/filters.py +14 -14
  63. pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
  64. pytcl/mathematical_functions/special_functions/bessel.py +15 -3
  65. pytcl/mathematical_functions/special_functions/debye.py +136 -26
  66. pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
  67. pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
  68. pytcl/mathematical_functions/special_functions/hypergeometric.py +81 -15
  69. pytcl/mathematical_functions/transforms/fourier.py +8 -8
  70. pytcl/mathematical_functions/transforms/stft.py +12 -12
  71. pytcl/mathematical_functions/transforms/wavelets.py +9 -9
  72. pytcl/navigation/geodesy.py +246 -160
  73. pytcl/navigation/great_circle.py +101 -19
  74. pytcl/plotting/coordinates.py +7 -7
  75. pytcl/plotting/tracks.py +2 -2
  76. pytcl/static_estimation/maximum_likelihood.py +16 -14
  77. pytcl/static_estimation/robust.py +5 -5
  78. pytcl/terrain/loaders.py +5 -5
  79. pytcl/trackers/hypothesis.py +1 -1
  80. pytcl/trackers/mht.py +9 -9
  81. pytcl/trackers/multi_target.py +1 -1
  82. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.7.5.dist-info}/LICENSE +0 -0
  83. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.7.5.dist-info}/WHEEL +0 -0
  84. {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.7.5.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@ 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
@@ -226,7 +226,7 @@ def unscented_transform(
226
226
  def ukf_predict(
227
227
  x: ArrayLike,
228
228
  P: ArrayLike,
229
- f: Callable[[NDArray], NDArray],
229
+ f: Callable[[NDArray[Any]], NDArray[Any]],
230
230
  Q: ArrayLike,
231
231
  alpha: float = 1e-3,
232
232
  beta: float = 2.0,
@@ -292,7 +292,7 @@ def ukf_update(
292
292
  x: ArrayLike,
293
293
  P: ArrayLike,
294
294
  z: ArrayLike,
295
- h: Callable[[NDArray], NDArray],
295
+ h: Callable[[NDArray[Any]], NDArray[Any]],
296
296
  R: ArrayLike,
297
297
  alpha: float = 1e-3,
298
298
  beta: float = 2.0,
@@ -382,7 +382,9 @@ def ukf_update(
382
382
  )
383
383
 
384
384
 
385
- 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]]:
386
388
  """
387
389
  Generate cubature points for Cubature Kalman Filter.
388
390
 
@@ -418,7 +420,7 @@ def ckf_spherical_cubature_points(n: int) -> Tuple[NDArray, NDArray]:
418
420
  def ckf_predict(
419
421
  x: ArrayLike,
420
422
  P: ArrayLike,
421
- f: Callable[[NDArray], NDArray],
423
+ f: Callable[[NDArray[Any]], NDArray[Any]],
422
424
  Q: ArrayLike,
423
425
  ) -> KalmanPrediction:
424
426
  """
@@ -487,7 +489,7 @@ def ckf_update(
487
489
  x: ArrayLike,
488
490
  P: ArrayLike,
489
491
  z: ArrayLike,
490
- h: Callable[[NDArray], NDArray],
492
+ h: Callable[[NDArray[Any]], NDArray[Any]],
491
493
  R: ArrayLike,
492
494
  ) -> KalmanUpdate:
493
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]