satkit 0.14.2__tar.gz → 0.14.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.
Files changed (114) hide show
  1. {satkit-0.14.2 → satkit-0.14.3}/Cargo.toml +2 -2
  2. {satkit-0.14.2/python/satkit.egg-info → satkit-0.14.3}/PKG-INFO +1 -1
  3. {satkit-0.14.2 → satkit-0.14.3}/pyproject.toml +1 -1
  4. {satkit-0.14.2 → satkit-0.14.3}/python/Cargo.toml +1 -1
  5. {satkit-0.14.2 → satkit-0.14.3/python/satkit.egg-info}/PKG-INFO +1 -1
  6. {satkit-0.14.2 → satkit-0.14.3}/python/src/pypropresult.rs +24 -1
  7. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/propagator.rs +34 -0
  8. {satkit-0.14.2 → satkit-0.14.3}/LICENSE +0 -0
  9. {satkit-0.14.2 → satkit-0.14.3}/MANIFEST.in +0 -0
  10. {satkit-0.14.2 → satkit-0.14.3}/README.md +0 -0
  11. {satkit-0.14.2 → satkit-0.14.3}/python/build.rs +0 -0
  12. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/__init__.py +0 -0
  13. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/__init__.pyi +0 -0
  14. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/density.pyi +0 -0
  15. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/frametransform.pyi +0 -0
  16. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/jplephem.pyi +0 -0
  17. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/moon.pyi +0 -0
  18. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/planets.pyi +0 -0
  19. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/py.typed +0 -0
  20. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/satkit.pyi +0 -0
  21. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/sun.pyi +0 -0
  22. {satkit-0.14.2 → satkit-0.14.3}/python/satkit/utils.pyi +0 -0
  23. {satkit-0.14.2 → satkit-0.14.3}/python/satkit.egg-info/SOURCES.txt +0 -0
  24. {satkit-0.14.2 → satkit-0.14.3}/python/satkit.egg-info/dependency_links.txt +0 -0
  25. {satkit-0.14.2 → satkit-0.14.3}/python/satkit.egg-info/requires.txt +0 -0
  26. {satkit-0.14.2 → satkit-0.14.3}/python/satkit.egg-info/top_level.txt +0 -0
  27. {satkit-0.14.2 → satkit-0.14.3}/python/src/lib.rs +0 -0
  28. {satkit-0.14.2 → satkit-0.14.3}/python/src/mod_utils.rs +0 -0
  29. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyconsts.rs +0 -0
  30. {satkit-0.14.2 → satkit-0.14.3}/python/src/pydensity.rs +0 -0
  31. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyduration.rs +0 -0
  32. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyframes.rs +0 -0
  33. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyframetransform.rs +0 -0
  34. {satkit-0.14.2 → satkit-0.14.3}/python/src/pygravity.rs +0 -0
  35. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyinstant.rs +0 -0
  36. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyitrfcoord.rs +0 -0
  37. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyjplephem.rs +0 -0
  38. {satkit-0.14.2 → satkit-0.14.3}/python/src/pykepler.rs +0 -0
  39. {satkit-0.14.2 → satkit-0.14.3}/python/src/pylambert.rs +0 -0
  40. {satkit-0.14.2 → satkit-0.14.3}/python/src/pylpephem_moon.rs +0 -0
  41. {satkit-0.14.2 → satkit-0.14.3}/python/src/pylpephem_planets.rs +0 -0
  42. {satkit-0.14.2 → satkit-0.14.3}/python/src/pylpephem_sun.rs +0 -0
  43. {satkit-0.14.2 → satkit-0.14.3}/python/src/pympsuccess.rs +0 -0
  44. {satkit-0.14.2 → satkit-0.14.3}/python/src/pynrlmsise.rs +0 -0
  45. {satkit-0.14.2 → satkit-0.14.3}/python/src/pypropagate.rs +0 -0
  46. {satkit-0.14.2 → satkit-0.14.3}/python/src/pypropsettings.rs +0 -0
  47. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyquaternion.rs +0 -0
  48. {satkit-0.14.2 → satkit-0.14.3}/python/src/pysatproperties.rs +0 -0
  49. {satkit-0.14.2 → satkit-0.14.3}/python/src/pysatstate.rs +0 -0
  50. {satkit-0.14.2 → satkit-0.14.3}/python/src/pysgp4.rs +0 -0
  51. {satkit-0.14.2 → satkit-0.14.3}/python/src/pysolarsystem.rs +0 -0
  52. {satkit-0.14.2 → satkit-0.14.3}/python/src/pytle.rs +0 -0
  53. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyukf.rs +0 -0
  54. {satkit-0.14.2 → satkit-0.14.3}/python/src/pyutils.rs +0 -0
  55. {satkit-0.14.2 → satkit-0.14.3}/setup.cfg +0 -0
  56. {satkit-0.14.2 → satkit-0.14.3}/src/consts.rs +0 -0
  57. {satkit-0.14.2 → satkit-0.14.3}/src/earth_orientation_params.rs +0 -0
  58. {satkit-0.14.2 → satkit-0.14.3}/src/earthgravity.rs +0 -0
  59. {satkit-0.14.2 → satkit-0.14.3}/src/frames.rs +0 -0
  60. {satkit-0.14.2 → satkit-0.14.3}/src/frametransform/ierstable.rs +0 -0
  61. {satkit-0.14.2 → satkit-0.14.3}/src/frametransform/mod.rs +0 -0
  62. {satkit-0.14.2 → satkit-0.14.3}/src/frametransform/qcirs2gcrs.rs +0 -0
  63. {satkit-0.14.2 → satkit-0.14.3}/src/itrfcoord.rs +0 -0
  64. {satkit-0.14.2 → satkit-0.14.3}/src/jplephem.rs +0 -0
  65. {satkit-0.14.2 → satkit-0.14.3}/src/kepler.rs +0 -0
  66. {satkit-0.14.2 → satkit-0.14.3}/src/lambert.rs +0 -0
  67. {satkit-0.14.2 → satkit-0.14.3}/src/lib.rs +0 -0
  68. {satkit-0.14.2 → satkit-0.14.3}/src/lpephem/mod.rs +0 -0
  69. {satkit-0.14.2 → satkit-0.14.3}/src/lpephem/moon.rs +0 -0
  70. {satkit-0.14.2 → satkit-0.14.3}/src/lpephem/planets.rs +0 -0
  71. {satkit-0.14.2 → satkit-0.14.3}/src/lpephem/sun.rs +0 -0
  72. {satkit-0.14.2 → satkit-0.14.3}/src/mathtypes.rs +0 -0
  73. {satkit-0.14.2 → satkit-0.14.3}/src/nrlmsise.rs +0 -0
  74. {satkit-0.14.2 → satkit-0.14.3}/src/omm/mod.rs +0 -0
  75. {satkit-0.14.2 → satkit-0.14.3}/src/omm/xml.rs +0 -0
  76. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/drag.rs +0 -0
  77. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/mod.rs +0 -0
  78. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/point_gravity.rs +0 -0
  79. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/precomputed.rs +0 -0
  80. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/satproperties.rs +0 -0
  81. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/satstate.rs +0 -0
  82. {satkit-0.14.2 → satkit-0.14.3}/src/orbitprop/settings.rs +0 -0
  83. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/dpper.rs +0 -0
  84. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/dscom.rs +0 -0
  85. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/dsinit.rs +0 -0
  86. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/dspace.rs +0 -0
  87. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/getgravconst.rs +0 -0
  88. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/initl.rs +0 -0
  89. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/mod.rs +0 -0
  90. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/satrec.rs +0 -0
  91. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/sgp4_impl.rs +0 -0
  92. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/sgp4_lowlevel.rs +0 -0
  93. {satkit-0.14.2 → satkit-0.14.3}/src/sgp4/sgp4init.rs +0 -0
  94. {satkit-0.14.2 → satkit-0.14.3}/src/solar_cycle_forecast.rs +0 -0
  95. {satkit-0.14.2 → satkit-0.14.3}/src/solarsystem.rs +0 -0
  96. {satkit-0.14.2 → satkit-0.14.3}/src/spaceweather.rs +0 -0
  97. {satkit-0.14.2 → satkit-0.14.3}/src/time/chrono.rs +0 -0
  98. {satkit-0.14.2 → satkit-0.14.3}/src/time/duration.rs +0 -0
  99. {satkit-0.14.2 → satkit-0.14.3}/src/time/instant.rs +0 -0
  100. {satkit-0.14.2 → satkit-0.14.3}/src/time/instant_err.rs +0 -0
  101. {satkit-0.14.2 → satkit-0.14.3}/src/time/instant_ops.rs +0 -0
  102. {satkit-0.14.2 → satkit-0.14.3}/src/time/instantparse.rs +0 -0
  103. {satkit-0.14.2 → satkit-0.14.3}/src/time/mod.rs +0 -0
  104. {satkit-0.14.2 → satkit-0.14.3}/src/time/tests.rs +0 -0
  105. {satkit-0.14.2 → satkit-0.14.3}/src/time/timelike.rs +0 -0
  106. {satkit-0.14.2 → satkit-0.14.3}/src/time/timescale.rs +0 -0
  107. {satkit-0.14.2 → satkit-0.14.3}/src/time/weekday.rs +0 -0
  108. {satkit-0.14.2 → satkit-0.14.3}/src/tle/fitting.rs +0 -0
  109. {satkit-0.14.2 → satkit-0.14.3}/src/tle/mod.rs +0 -0
  110. {satkit-0.14.2 → satkit-0.14.3}/src/utils/datadir.rs +0 -0
  111. {satkit-0.14.2 → satkit-0.14.3}/src/utils/download.rs +0 -0
  112. {satkit-0.14.2 → satkit-0.14.3}/src/utils/mod.rs +0 -0
  113. {satkit-0.14.2 → satkit-0.14.3}/src/utils/test.rs +0 -0
  114. {satkit-0.14.2 → satkit-0.14.3}/src/utils/update_data.rs +0 -0
@@ -3,7 +3,7 @@ members = [".", "python"]
3
3
 
4
4
  [package]
5
5
  name = "satkit"
6
- version = "0.14.2"
6
+ version = "0.14.3"
7
7
  edition = "2021"
8
8
  description = "Satellite Toolkit"
9
9
  readme = "README.md"
@@ -22,7 +22,7 @@ name = "satkit"
22
22
 
23
23
 
24
24
  [dependencies]
25
- numeris = { version = "0.5.6", features = ["serde", "estimate", "ode"] }
25
+ numeris = { version = "0.5.7", features = ["serde", "estimate", "ode"] }
26
26
  num-traits = "0.2.19"
27
27
  thiserror = "2.0"
28
28
  ureq = "3.1.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.14.2
3
+ Version: 0.14.3
4
4
  Summary: Satellite Orbital Dynamics Toolkit
5
5
  Author-email: Steven Michael <ssmichael@gmail.com>
6
6
  Maintainer-email: Steven Michael <ssmichael@gmail.com>
@@ -9,7 +9,7 @@ requires-python = ">= 3.10"
9
9
  authors = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
10
10
  maintainers = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
11
11
  readme = "README.md"
12
- version = "0.14.2"
12
+ version = "0.14.3"
13
13
  license = "MIT"
14
14
  description = "Satellite Orbital Dynamics Toolkit"
15
15
  keywords = [
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "satkit-python"
3
- version = "0.14.2"
3
+ version = "0.14.3"
4
4
  edition = "2021"
5
5
  publish = false
6
6
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: satkit
3
- Version: 0.14.2
3
+ Version: 0.14.3
4
4
  Summary: Satellite Orbital Dynamics Toolkit
5
5
  Author-email: Steven Michael <ssmichael@gmail.com>
6
6
  Maintainer-email: Steven Michael <ssmichael@gmail.com>
@@ -313,7 +313,30 @@ impl PyPropResult {
313
313
 
314
314
  let times = (&time).to_time_vec()?;
315
315
 
316
- if is_list {
316
+ if is_list && !output_phi {
317
+ // Batch interpolation — returns Nx6 numpy array
318
+ match &self.0 {
319
+ PyPropResultType::R1(r) => {
320
+ let results = r.interp_batch(&times)
321
+ .map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?;
322
+ pyo3::Python::attach(|py| {
323
+ let n = results.len();
324
+ let flat: Vec<f64> = results.iter().flat_map(|r| r.as_slice().iter().copied().take(6)).collect();
325
+ slice2py2d(py, &flat, n, 6)
326
+ })
327
+ }
328
+ PyPropResultType::R7(r) => {
329
+ let results = r.interp_batch(&times)
330
+ .map_err(|e| pyo3::exceptions::PyValueError::new_err(e.to_string()))?;
331
+ pyo3::Python::attach(|py| {
332
+ let n = results.len();
333
+ let flat: Vec<f64> = results.iter().flat_map(|r| r.as_slice().iter().copied().take(6)).collect();
334
+ slice2py2d(py, &flat, n, 6)
335
+ })
336
+ }
337
+ }
338
+ } else if is_list {
339
+ // Fallback for output_phi=true — need per-element processing
317
340
  let results: PyResult<Vec<Py<PyAny>>> =
318
341
  times.iter().map(|t| self.interp_at(t, output_phi)).collect();
319
342
  pyo3::Python::attach(|py| results?.into_py_any(py))
@@ -52,6 +52,10 @@ impl<const T: usize> PropagationResult<T> {
52
52
  pub fn interp<U: TimeLike>(&self, time: &U) -> Result<Matrix<6, T>> {
53
53
  interp_propresult(self, time)
54
54
  }
55
+
56
+ pub fn interp_batch(&self, times: &[Instant]) -> Result<Vec<StateType<T>>> {
57
+ interp_propresult_batch(self, times)
58
+ }
55
59
  }
56
60
 
57
61
  pub type StateType<const C: usize> = Matrix<6, C>;
@@ -549,6 +553,36 @@ pub fn interp_propresult<const C: usize, T: TimeLike>(
549
553
  Ok(result.map_err(PropagationError::ODEError)?)
550
554
  }
551
555
 
556
+ pub fn interp_propresult_batch<const C: usize>(
557
+ res: &PropagationResult<C>,
558
+ times: &[Instant],
559
+ ) -> Result<Vec<StateType<C>>> {
560
+ use crate::orbitprop::Integrator;
561
+
562
+ let sol = res
563
+ .odesol
564
+ .as_ref()
565
+ .filter(|s| s.dense.is_some())
566
+ .ok_or(PropagationError::NoDenseOutputInSolution)?;
567
+
568
+ let xs: Vec<f64> = times
569
+ .iter()
570
+ .map(|t| (*t - res.time_begin).as_seconds())
571
+ .collect();
572
+
573
+ let results = match res.integrator {
574
+ Integrator::RKV98 => ode::RKV98::interpolate_batch(&xs, sol),
575
+ Integrator::RKV98NoInterp => ode::RKV98NoInterp::interpolate_batch(&xs, sol),
576
+ Integrator::RKV87 => ode::RKV87::interpolate_batch(&xs, sol),
577
+ Integrator::RKV65 => ode::RKV65::interpolate_batch(&xs, sol),
578
+ Integrator::RKTS54 => ode::RKTS54::interpolate_batch(&xs, sol),
579
+ Integrator::RODAS4 => {
580
+ return Err(PropagationError::NoDenseOutputInSolution.into());
581
+ }
582
+ };
583
+ Ok(results.map_err(PropagationError::ODEError)?)
584
+ }
585
+
552
586
  #[cfg(test)]
553
587
  mod tests {
554
588
  use super::*;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes