All notable changes to lambert_izzo are documented here. The format
follows Keep a Changelog, and
the project follows Semantic Versioning.
2.0.0 — 2026-05-01
-
solveLambertno longer throws on solver failure. It now returns the sameLambertOutcometagged union thatsolveLambertBatchreturns per element, so single-call and batch JS callers share one pattern-match shape:result.kind === "ok"→result.response,result.kind === "err"→result.error(a structuredLambertErrorOutput). The Rust core'sResult<T, LambertError>API is unchanged. -
BatchResultrenamed toLambertOutcome. It is the per-solve outcome type used by both entry points and is no longer batch-specific.Migration: replace
try { const r = solveLambert(req); … } catch (e) { … }withconst result = solveLambert(req); if (result.kind === "ok") { … } else { … }. ExistingsolveLambertBatchcallers only need to change the imported type name fromBatchResulttoLambertOutcome(the runtime shape is identical).
1.0.0 — 2026-04-30
Initial public release. lambert_izzo is a no_std-friendly Rust
implementation of Izzo's revisited Lambert solver
(arXiv:1403.2705).
- Single-revolution and multi-revolution (short- and long-way) Lambert
solves via
lambert(&LambertInput) -> Result<LambertSolutions, LambertError>. - Three-regime time-of-flight dispatch — Battin hypergeometric series
near the parabolic point, Lancaster–Blanchard in the transitional
zone, Lagrange elsewhere — with all thresholds documented in
constants.rs. - Cubic Householder iteration with derivative-matched starters
(Izzo Eq. 30, 31) and Halley
T_minsearch for multi-revolution feasibility detection. - Round-trip Kepler validation via a universal-variable Stumpff
propagator;
examples/stress.rsruns 100,000 single-rev plus 100,000 multi-rev randomized trials with vis-viva and angular-momentum conservation checks.
[f64; 3]for all positions and velocities — no hard math-library dependency.nalgebra::Vector3<f64>andglam::DVec3convert natively.- Unit-agnostic: pass any consistent unit system. Documented SI convention is km / km/s / s / km³/s².
- Frame-invariant: the solver returns velocities in whatever inertial frame the inputs are in (ECI, HCRS, MCI, ...). Frame info lives at the call site, not in field names.
LambertErroris a flatthiserrorenum with structured fields (Position,NonFiniteParameter,RevsOutOfRange); zerounwrap/expect/panic!in lib code, mechanically enforced by clippy denials.- Multi-rev capacity is bounded at compile time via
BoundedRevs(newtype aroundNonZeroU32,1..=32); the cap is statically asserted to matchMAX_MULTI_REV_PAIRS. No heap allocation on the solver hot path. - Diagnostics (Householder iteration counts) ride along on every
LambertSolutions— no separate "with-diagnostics" entry point.
serde— derivesSerialize/Deserializeon every public type, includingLambertError. Staysno_std-compatible.rayon— enableslambert_par(&[LambertInput]), a parallel batch solver. Pullsstdtransitively; notno_std-compatible.
lambert_izzo— the canonical Rust crate.no_std-friendly,[f64; 3]-only public surface.lambert_izzo_wasm—wasm-bindgenadapter exposing JavaScript / TypeScript request and response types viatsify. Errors map to a tag-discriminated union; a forward-compatUnknown { message }variant guards against future core variants. Publishes to npm aslambert-izzo, version-locked to the workspaceCargo.toml— npm version matches the crates.io version.lambert_izzo_test_support— workspace-internal dev fixtures (publish = false): SI body constants, rejection-sampling unit vectors, deterministic batch generator, universal-variable Kepler propagator. Used as a[dev-dependencies]path crate by the core's examples, benches, and tests.
- MSRV: Rust 1.85 (first edition-2024 stable).
- Examples:
demo,stress,errors,batch(rayon-gated), andserde(serde-gated). - Benches:
single_rev,batch, andmulti_rev(parametrized acrossM ∈ {1, 3, 5}via Criterion'sbench_with_input); amulti_rev_battingroup exercises the Battin near-parabolic regime (|x − 1| < BATTIN_THRESHOLD) via a near-180° geometry with TOF jittered around the parabolic time-of-flight. - CI: GitHub Actions workflow at
.github/workflows/ci.ymlcovering MSRV (1.85) build × four feature combos, full build/test/doctest on stable × four feature combos, clippy, docs (withRUSTDOCFLAGS: -D warnings), wasm32 build forlambert_izzoandlambert_izzo_wasm, thestressexample, and a markdown link-check pass via lychee (lychee.toml). - Dual-licensed
MIT OR Apache-2.0.