This roadmap records likely directions for the la-stack crate. It is not a
stability promise; release scope depends on mathematical correctness, API
maturity, downstream need, and validation quality. Concrete implementation work
is tracked as GitHub issues; keep this document focused on release direction,
ordering, and non-goals.
Pre-1.0 releases may still revise public APIs when that makes the crate more
correct or easier to use safely. The v0.4.x line should stay on stable Rust
and focus on documentation, downstream ergonomics, API-contract cleanup,
validation, invariant audits, and benchmark coverage. The v0.5.0 line is
reserved for work that depends on stabilized generic_const_exprs or equivalent
const-generic expressiveness.
la-stack intentionally supports f64 for floating-point APIs and exact
rationals behind the optional "exact" feature. This is not a temporary
implementation detail: the crate targets small, fixed-size,
robustness-sensitive numerical and computational geometry workloads where
f64 plus exact arithmetic is the right tradeoff.
Other scalar families are non-goals. Users who need lower-precision f32 /
f16 support, throughput-oriented reduced precision, accelerator-heavy
computation, large dynamic matrices, sparse matrices, or broad decomposition
coverage should use larger linear-algebra ecosystems such as nalgebra or
faer.
The v0.4.2 milestone collects the work that can be done on today's stable
Rust while keeping the crate useful to downstream geometry crates. The GitHub
native Blocking / Is blocked by graph mirrors this order:
Completed foundation work:
- #100 clarified
f64as the intended floating-point type in README and other documentation. - #109 added fallible runtime matrix dispatch and contextual index errors.
- #83 changed
Matrix::setto returnOption<()>instead ofbool. - #94 made tolerance parsing explicit and consistent across the crate.
- #82 unified
det()error behavior across all dimensions as far as stable Rust allows. - #120 completed the
parse-don't-validate
NonZero*audit. - #111, #112, #113, and #117 cleaned up Markdown/YAML tooling, CI speed, and shared Rust workflow/security checks.
Current API-invariant cleanup:
- #126 is resolved as an
internal parse-don't-validate design rather than a public proof-bearing API.
Matrix<D>andVector<D>remain the raw boundary types so callers can pass deserialized, fixture, or otherwise uncheckedf64storage and receive structured diagnostics. Crate-privateFiniteMatrix<D>andFiniteVector<D>are validated domain types that carry the finite-entry proof behind the scenes for LU, LDLT, determinant, error-bound, and exact-arithmetic paths. - The public prelude stays focused on downstream composition: raw boundary
types, factorization handles, tolerances, crate errors, dispatch helpers, and
documented constants. Proof-bearing wrappers remain crate-private, and
exact-arithmetic integer/rational re-exports remain gated behind the
"exact"feature. - The public LDLT API remains
Matrix::ldlt. Symmetry proof storage is kept internal,SymmetricMatrixis not exported, asymmetric inputs returnLaError::Asymmetric, and negative LDLT pivots returnLaError::NotPositiveSemidefiniterather than being folded intoLaError::Singular. - The determinant error-bound constants
ERR_COEFF_2,ERR_COEFF_3, andERR_COEFF_4are documented as dimension-specific roundoff multipliers over the absolute Leibniz sum, not caller-tuned tolerances.
Remaining release blockers:
- #125 - Add a Semgrep
guardrail against
unwrap/expectin examples, benches, and doctests. - #98 - Add random-input percentile benchmarks to the exact arithmetic suite.
The broad shape is now: document scalar scope, add downstream dispatch ergonomics, clean up small API contracts, tighten validation, encode reusable invariants behind the public raw-boundary API, lock examples and benchmarks into proper error handling, then finish with broader benchmark work.
v0.5.0 is reserved for the post-stabilization const-generic API revision.
The current anchor issue is
#123, which tracks
refactoring determinant APIs around stable generic_const_exprs.
That work should revisit determinant APIs after the language can express more
dimension-dependent support at the type level. In particular, it should look for
ways to reduce runtime D branching, make closed-form determinant support more
explicit, and unify direct, LU-backed, error-bound, and exact determinant paths
where doing so improves correctness and maintainability.
- Keep the crate focused on fixed small dimensions and stack allocation.
- Preserve
const fnsurfaces where they make mathematical evaluation compile-time checkable. - Grow exact-arithmetic support only where it strengthens robustness-sensitive workflows without making the default build dependency-heavy.
- Use benchmarks to validate performance claims against
nalgebraandfaerwithin the crate's intended dimensional scope.
- Dynamic or large matrix dimensions.
- Sparse matrices, parallel solvers, GPU acceleration, or out-of-core storage.
- Alternate floating-point scalar families such as
f32orf16. - Replacing full-featured linear-algebra libraries.