All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Add
SO2methodsnormandnormalized@elias-taufer (#239) - Rigid-body inertia and the free joint.
SpatialInertiafor a body's mass, balance point, and resistance to spinning, andFreeJointStatefor the pose and velocity of a body free to move in all six directions, with aSpatialErrorfor the mass properties that do not describe a usable body. @kmolan - MuJoCo model loading. A
multicalc-mjcfcrate reading one free-floating body out of an MJCF file, working the mass out from the shapes where the file does not state it, checked against MuJoCo's own compile of the same file. Ships with amodel_ingestiondemo. @kmolan Vector2D/Vector3D/Vector6DandMatrix2D/Matrix3D/Matrix4D/Matrix6Daliases for the vector and matrix sizes used most, so a call site writesVector3D<T>rather thanVector<3, T>. Each names the same type as the long spelling, so the two mix freely and nothing existing has to change. @kmolanQuaternion::from_two_vectors,Quaternion::rotation_angle_to, andQuaternion::inverse_transform_point. (#214)- Add
Defaulttrait implementation for spatial typesQuaternion,SO2,SO3,SE2,SE3,Twist,Wrench. @elias-taufer (#244)
ResamplingScheme::resample_indicesnow leaves output indices untouched for empty weights instead of panicking. (#204)
0.9.0 - 2026-07-26
A feature release adding state estimation, feedback control, wheeled kinematics, and waypoint paths, plus a prelude and one-call entry points for the calculus core.
- Const-evaluable solver constructors, AutoDiff
new(), and Gaussian quadrature node tables /nodes. @rtmongold (#168) - Add
Vector/Matrixget/get_mut,Matrix::try_row/try_column, andMatrix::as_mut_slice_rows. @rtmongold (#185) - Kinematics. A
kinematicsmodule withDifferentialDrive, a unicycle model, and dead-reckoning odometry, plus akinematicsdemo. @kmolan (#170) - State estimation. An
estimationmodule withKalmanFilterandExtendedKalmanFilter(the latter differentiating its nonlinear models for the Jacobians each step), aCovarianceUpdatechoice for how the covariance is recomputed, cross-validation fixtures, and anestimationdemo. @kmolan (#175) - Particle filter. A bootstrap/SIR
ParticleFilterwith pluggable resampling and measurement likelihood, behind theallocfeature. @kmolan (#188) - Control. A
controlmodule withPid, a one-pole derivative filter (OnePoleLowPass), and the pure-pursuit path-following law. @kmolan (#179) - Follow-the-gap. A reactive obstacle-avoidance controller in
control, with anavoidancedemo. @kmolan (#188) - Waypoint paths. A
motionmodule withPolylinePathand its arc-length, closest-point, and lookahead queries. @kmolan (#179) - Random numbers. A
randommodule with theRandomSourcetrait and the seedablePcg32generator, giving uniform and normal draws without a heap orstd. @kmolan (#188) - Prelude and one-call functions.
multicalc::preludefor the traits and short functions worth importing together, plusderivative,second_derivative,partial, andintegral, which need no configured backend. @kmolan (#198) - General N×N determinant and inverse. Sizes past 4×4 now factor through LU instead of being unsupported; small sizes keep their closed forms. @kirloo (#184)
- 3D surface flux integral.
flux_integral_3dandflux_integral_3d_custom. @mubasharameen485-cloud (#172) - Property tests that LU and QR factorizations reconstruct their input matrix. @yvoolab (#189)
- A localization and obstacle-avoidance lap demo, with simulated lidar, an occupancy grid, a particle-filter localizer, latency benchmarks, and embedded smoke fixtures. @kmolan (#192)
- docs.rs now builds with all features so gated items appear in the published docs. @kmolan (#197)
- Add
Matrixmethods:trace,frobenius_norm,from_diagonal@birchmd (#191) - Add
Vectormethods:normalize,normalized,map@birchmd (#191) - Add impl Div where T: Numeric for
MatrixandVector@birchmd (#191)
- Iterative integrators return
IntegrateError::LimitsIllDefinedinstead ofNaNifclassifyfails after validation. @rtmongold (#171) - RK45 now handles zero-dimensional states without producing NaN norms. @terminalchai (#174)
- 2×2/3×3/4×4
Matrix::inversereject near-singular inputs via anEPSILON-scaled det check instead of exactdet == 0. @rtmongold (#181) - Spatial small-angle Taylor cutoffs use
30 · EPSILONand(30 · EPSILON)²instead of fixed1e-6/1e-12. @rtmongold (#190) - The iterative and Gaussian integrators check their samples and return
IntegrateError::NonFinite, instead of letting a blown-up integrand propagate into a garbage result. @SAY-5 (#180) - The multi-variable integrators bounds-check the variable index and return the new
IntegrateError::IndexOutOfRange. @Devil1716 (#178)
- Keep panicking
Index/IndexMutas the ergonomic Matrix/Vector access path. Remove panickingrow/column(usetry_row/try_column). @rtmongold (#185) - Vector-field functions renamed and re-exported.
curl::get_2d,line_integral::get_2d, and the rest are nowcurl_2d,line_integral_2d, and so on, imported straight fromvector_field. @kmolan (#199) - Kalman filter takes a
KalmanModel. The four model matrices are one named struct instead of four positional constructor arguments. @kmolan (#198) - The crate root re-exports the differentiation, integration, and approximation types, so they can be named without their module paths. @kmolan (#198)
- Rewrote the test suite for readability: table-driven cases, named expectations, and shared helpers. @kmolan (#200)
- Golden fixture regeneration runs from a script in a local virtualenv with locked, hash-checked dependencies and a pinned timestamp, so a rerun produces the same bytes. @kmolan (#201)
- Dropped CI caching, which was causing flaky pipeline failures. @kmolan (#173)
0.8.0 - 2026-07-16
A feature release adding spatial math (quaternions, Lie groups, twists/wrenches), ODE solvers, matrix-based discretization, and per-module error enums.
vector!andmatrix!macros for building [Vector] and [Matrix] literals, e.g.vector![1.0, 2.0, 3.0]andmatrix![[1.0, 2.0], [3.0, 4.0]]. @rtmongold (#37)- Autodiff scalars example. A runnable walkthrough (
examples/autodiff_scalars.rs) that usesDualandHyperDualdirectly (no derivator). @rtmongold (#106) - Fixed
examples/README.mdtable entry foroptimization_solvers(was an orphan bullet). @rtmongold (#117) Primalscalar projection. Newto_f64/to_f32trait for edge use (viz, logging, etc.), kept separate fromNumeric.showcase/viznow uses it instead of its privatePlottabletrait. @ProtoFN (#131)- Property tests for linear/quadratic approximation invariants (exactness on matching-degree polynomials, metrics consistency). @rtmongold (#130)
- Property tests that autodiff and central finite-difference derivatives agree on random polynomial compositions. @rtmongold (#129)
- Opt-in Kahan compensated summation for iterative integration and approximation metrics
via
.with_kahan_summation(); pairwise remains the default. @rtmongold (#134) - RISC-V embedded smoke.
embedded-smokeruns onriscv32imc-unknown-none-elfunder QEMUvirt, gated with its own flash/stack budgets. @rtmongold (#140) - Quaternion type. A
spatial::quaternionmodule with unit-quaternion rotations. @kmolan (#128) - Lie groups. A
spatial::liemodule withSO(2),SE(2),SO(3), andSE(3)(exp/log maps, composition, and group action), plus anexamples/lie_groups.rswalkthrough. @kmolan (#133) - Twists and wrenches.
spatial::twistandspatial::wrenchscrew-theory types. @kmolan (#137) - Discretization and matrix exponential. A new
discretizationmodule and alinear_algebra::expmmatrix exponential. @kmolan (#137) - ODE solvers. A new
odemodule with a fixed-stepRK4and an adaptiveRK45integrator, plus anexamples/ode.rswalkthrough and anodebenchmark. @kmolan (#135) - Extended
Numerictrait. Inverse-trig (asin/acos/atan/atan2), hyperbolic (sinh/cosh/tanh), andcopysign/floor/signum/hypot/powf/mul_add/recip, so autodiff scalar types support them. @kmolan (#120) - Property tests for numerical integration invariants. @kirloo (#122)
- Showcase demos. A 3D arm IK demo and a 2D arm IK demo (renamed from
ik_servo), with a CSV/Rerun sink abstraction in thedemoscrate. @kmolan (#145)
- Per-module error enums. Fallible operations now return family-specific enums
(
LinalgError,DiffError,IntegrateError,SolveError), all convertible into theCalcErrorumbrella, replacing the monolithic error codes. @kmolan (#136) - Faster Jacobians for large inputs: the multi-variable Jacobian now uses a single column solve instead of per-column solves. @kmolan (#138)
- Reorganized the benchmark suites and harness. @kmolan (#143)
- Refreshed the crate README and updated its links and media. @kmolan (#144, #146, #147)
- Internal refactor of the QA test and oracle scaffolding. @kmolan (#141)
- Updated the ignored advisories in
deny.toml. @kmolan (#142)
- Fixed misspelled
examples/link labels inoptimization/README.md. @rtmongold - Corrected the
CONTRIBUTING.mdlink from the README. @kirloo (#121)
0.7.2 - 2026-07-09
- f32 pseudo-inverse identity tests. The SVD pseudo-inverse is now checked against the Moore–Penrose conditions in f32, complementing the existing f64 coverage. @KSHITIZ6341 (#110)
- Gauss-Newton example. A runnable walkthrough (
examples/optimization_solvers.rs) and accompanying docs for the Gauss-Newton solver. @tapheret2 (#108) - A pull-request template and a workflow that greets first-time issue and PR authors.
- Two showcase demo GIFs (1 kHz IK servo, Newton fractal) in the crate README.
- Refreshed crates.io metadata (description, keywords, categories) for discoverability.
- Renamed
CONTRIBUTIONS.mdtoCONTRIBUTING.mdand rewrote it with a host-only quickstart and contribution workflow.
0.7.1 - 2026-07-07
A tooling and infrastructure release. The library API is unchanged; the repository
is now a Cargo workspace with cross-validation, embedded, and visualization crates
alongside the core multicalc crate.
- Workspace layout. The repository is now a Cargo workspace; the library lives in
crates/multicalc, with supporting crates and tools split out. (#90) - Embedded smoke tests. A
no_stdfirmware crate (crates/embedded-smoke) that builds and runs core APIs on Cortex-M targets, guarding embedded compatibility in CI. (#92, #100) - Oracle. Cross-validation fixtures for linear algebra, optimization, and quadrature, generated from reference implementations, with tests checking multicalc against them. (#93)
- multicalc-viz showcase. Rerun-based visualization examples under
showcase/viz(Fourier Ferris, gradient marbles, IK servo, Newton fractal, live/recorded curve fit), plus demo reels in the README. (#97) - Nightly CI and expanded build matrix. A nightly workflow and additional target builds. (#94)
- Benchmark suites are unified under a single
benchmarkstarget: use criterion substring filters (cargo bench -- linear_algebra) instead of--bench <suite>. @rtmongold (#96) - Improved the README project description and switched image sources to direct GitHub links so they render off-crates.io. (#91, #98)
- Miscellaneous CI cleanup. (#95)
0.7.0 - 2026-07-06
A feature release adding automatic differentiation, a linear-algebra core, nonlinear
optimization, and root finding, while staying strict no_std.
- Automatic differentiation. New
scalarmodule with dual, hyper-dual, and Jet number types built on a shared numeric-traits abstraction. Autodiff is now the default backend for derivatives, gradients, Jacobians, and Hessians, with finite differences still available. - Linear algebra. Fixed-size, const-generic
VectorandMatrixtypes plus small-matrix solves: inverse, LU, Cholesky, QR, and SVD. - Optimization. A nonlinear least-squares
optimizationmodule with Gauss-Newton, Levenberg-Marquardt, and trust-region solvers. - Root finding. A
root_findingmodule with bisection, Newton's method, and Newton for systems of equations. - Pairwise summation utility for numerically stable sums, applied across iterative integration and approximation.
- An embedded curve-fitting example and an
embeddedfeature marker that keeps the firmware example off host builds. - A README for every source module, and benchmark suites split by area (calculus, linear algebra, optimization, root finding).
- Autodiff replaces finite differences as the default differentiation method.
- Public integration tests moved from
src/**/test.rsinto top-leveltests/, andBENCHMARKS.mdwas split into per-area files underbenches/.
0.6.0 - 2026-06-28
A breaking rewrite focused on real-time latency, ease of use, maintainability, and strict no_std.
- Infinite and semi-infinite integration limits for the iterative integrators (use
f64::INFINITY/f64::NEG_INFINITY), via a domain transform. Accurate for convergent, decaying integrands. - A runnable example for every module under
examples/, andBENCHMARKS.mdwith accuracy and latency figures. - A criterion benchmark suite under
benches/, plus deterministic work-count regression tests that fail if a latency optimization is reverted. CalcErrorimplementscore::error::ErrorandDisplay.
f64-only API. Dropped thenum_complex::ComplexFloatgeneric; transcendental functions now come fromlibm, so the crate is genuinelyno_std.- Errors are a typed
CalcErrorenum instead of&'static strstrings. - Functions and integrands are taken as generic
F: Fn(...)(monomorphized) rather than&dyn Fn. - Removed the redundant runtime "number of integrations" / "derivative order" arguments; these are now inferred from the const-generic array lengths.
- Renamed the solver types to
FiniteDifferenceSingle/Multi,IterativeSingle/Multi, andGaussianSingle/Multi. - Unified the vector-field calling convention: line and flux integrals now take
&[&dyn Fn(&[f64; N]) -> f64; N], matching curl and divergence. - Gaussian quadrature takes the bare integrand; the tabulated weights carry the
e^{-x^2}/e^{-x}weighting factor. - Per-solver settings are now a plain-data
configfield (e.g.solver.config.method = ...) instead of getters and setters. - Renamed the
heapfeature toalloc. - Default iterative interval count is now 120 (a multiple of 12) so the Boole and Simpson rules stay exact.
- Gauss-Hermite and Gauss-Laguerre no longer double-apply the weighting function.
- Gauss-Laguerre multi-fold recursion (it read the Legendre table and failed to decrement the fold).
- The 3D line-integral z-component, and the reversed / equal /
NaNlimit checks (negative ranges such as[-2.0, 1.0]are now accepted). - The linear and quadratic approximation formulas and their goodness-of-fit metrics.
- The
num-complexdependency, theComplexFloatgeneric, andf32/ complex-number support.