You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
DNumericalOrbitPropagator::builder() - typestate builder that names required fields and lets optional fields be set by name or omitted. build() is only callable once epoch, state, and force_config are all set, enforced via Set/Unset marker type parameters. @markusz (#321)
Added states_ecef and states_eme2000 to SGPPropagator. @duncaneddy (#331)
Added states_eme2000 to KeplerianPropagator. @duncaneddy (#331)
Added states_eci, states_ecef, states_gcrf, states_itrf, and states_eme2000 to NumericalOrbitPropagator. @duncaneddy (#331)
New high-fidelity propagator benchmarks under benchmarks/comparative/tasks/propagation_tasks.py: numerical_rk4_grav5x5, numerical_rk4_grav20x20_sun_moon, numerical_rk4_grav80x80_full. Each runs RK4 over one LEO revolution with matched force-model and frame settings on both sides (OreKit loads brahe's EGM2008_360.gfc via ICGEMFormatReader, GCRF inertial frame, ITRF / IAU 2006/2000A body-fixed rotation, DE-440 third-body ephemerides, identical spacecraft mass / area / Cd / Cr). @duncaneddy (#332)
New function-level acceleration benchmarks under benchmarks/comparative/tasks/force_model_tasks.py for point-mass gravity, 20×20 and 80×80 spherical-harmonic gravity, and third-body Sun/Moon. These evaluate a single acceleration at a fixed state and epoch, isolating force-model code from integrator behaviour. @duncaneddy (#332)
"Force Model" section in docs/about/benchmarks.md documenting the new function-level comparisons. @duncaneddy (#332)
GravityModel::load_uncached(model) — explicit cold-load primitive for users who need deterministic memory or want to profile the parse path. @duncaneddy (#332)
GravityModel::compute_spherical_harmonics_with_workspace(...) and accel_gravity_spherical_harmonics_with_workspace(...) — variants that accept caller-supplied V/W work matrices, letting hot-path callers (the numerical propagator's dynamics closure, batch orbit-determination residual code) amortize the per-call DMatrix::zeros((n_max + 2)²) allocation. At 80×80 the saved allocation+memset is ~15 µs per call. @duncaneddy (#332)
clear_gravity_model_cache() — manual cache invalidation, useful after replacing a FromFile(path) source on disk or in tests. @duncaneddy (#332)
mimalloc as the global allocator for the brahe-py Python extension and the comparative-benchmark Rust binary. The brahe core library remains allocator-agnostic so downstream Rust consumers pick their own. @duncaneddy (#332)
NumericalOrbitPropagator and NumericalPropagator now no longer store accelerations by default to save space and improve performance. @duncaneddy (#330)
The FD fallback for HermiteQuintic is removed. Previously, calling HermiteQuintic on a trajectory without stored accelerations would silently degrade to finite-difference acceleration estimation if 3+ points were available; now it errors. Combined with the earlier store_accelerations: false default flip, any code path that today uses HermiteQuintic either needs NumericalPropagationConfig::with_store_accelerations(true) (propagator path) or trajectory.enable_acceleration_storage() (direct path). @duncaneddy (#330)
Performance, numerical propagator (no behaviour change): the DNumericalOrbitPropagator hot path now caches the ECI→body-fixed rotation across integrator stages, shares one Arc<GravityModel> across propagators with the same gravity config (no more 60 ms .gfc reload per construction), borrows the state vector instead of cloning it on every stage call, returns the orbital derivative as a stack-allocated Vector6<f64> instead of allocating a fresh DVector, and reuses the spherical-harmonic V/W work matrices across stages. @duncaneddy (#332)
GravityModel::from_model_type is now process-wide cache-backed. Repeated calls for the same GravityModelType parse the .gfc file once (~60 ms cold), then return owned clones from the cached Arc (~1 ms each). The public signature is unchanged. Cache is documented as unbounded — see the # Caution block on the function for the growth caveat with many distinct FromFile(path) sources, and use clear_gravity_model_cache() as the escape hatch. @duncaneddy (#332)
bias_precession_nutation switched from iauXys06a (full IAU 2000A nutation, ~1300 terms) to iauXys00b (truncated IAU 2000B, ~77 terms). Per-call cost dropped from ~150 µs to ~2.3 µs; agreement with the full series is sub-milliarcsecond, no regressions in tests. @duncaneddy (#332)
Changed how adding a flaot second time to an Epoch (epc + 42.5) processes the internal addition. Previously, it would loop of remaining nanoseconds and convert them into integer seconds. For large second values, this would result in many loops for a single step, meaning that time addition, a frequent code hot-path, would grow linearly in time. Now it is an O(1) operation. @duncaneddy (#333)
Fixed
Update urllib3 to mitigate security vulnerability. @duncaneddy (#326)
Some estimation plots used unicode sigma instead of $\sigma$. When latex is installed and defaults to pdfLaTeX compiler, this causes an error. Switch to $\sigma$ everywhere. @duncaneddy (#331)
DNumericalOrbitPropagator::propagate_to may hang with fixed-step RK4. At src/propagators/dnumerical_orbit_propagator.rs:2312 the restore-dt_next guard used > instead of >=. With target_epoch = epc + N * step_size constructed by repeated arithmetic, float drift could leave target_rel slightly larger than the integer multiple; Fixed by changing the comparison to >= so the restore fires whenever the integrator returned its preferred step. @duncaneddy (#332)
Workspace mismatch in benchmarks/comparative/implementations/rust/Cargo.toml: the crate predated the brahe repo-root workspace and would fail with "current package believes it's in a workspace when it's not". Added an empty [workspace] table so cargo treats the bench as its own workspace root. @duncaneddy (#332)
Fix issue with new release workflow CHANGELOG generation that would result in an error causing the release to fail. Release notes now must be manually generated and committed prior to running the release action. @duncaneddy (#334)