Releases: Axect/Peroxide
Releases · Axect/Peroxide
Release list
v0.43.0
Release 0.43.0 (2026-07-11)
Breaking changes
- Make the
rand/rand_distrsampling stack optional behind the default-onrandfeature (#88, #104)- Existing default-feature users are unchanged.
default-features = falsenow provides a deterministic core without RNG dependencies; sampling APIs require therandfeature.- This is a breaking change for users who already disabled default features and relied on sampling APIs.
New features
- Add the
Dirichlet(α)probability distribution (#95) - Add
O3-openblas-systemfor linking a system-installed OpenBLAS throughpkg-config(#98, #107)
Documentation
- Clarify BLAS/LAPACK backend selection, OpenBLAS source versus system builds, TLS prerequisites, and HDF5 constraints (#98)
- Remove the stale
Peroxide_BLASsetup link from the main README; the archived repository is retained for historical reference - Replace the hand-maintained source-layout table with module-level docs.rs pointers and improve module descriptions (#99, #108)
CI / Lint
- Add cargo-hack coverage for individual features and pairwise pure-Rust feature combinations (#98)
- Add dedicated CI coverage for system/source OpenBLAS, no-rand
wasm32, plotting, formatting, and clippy
v0.42.0
Release 0.42.0 (2026-07-06)
Breaking changes
- Encapsulate
Matrix/ComplexMatrixfields to fix a soundness hole (#101, 2874984)- Safe code could set
row/col/datadirectly and reach heap out-of-bounds reads and writes through the internal raw-pointer and BLAS paths - Fields are now private and the
matrix()/cmatrix()constructors assertdata.len() == row * col - Migration guide:
m.row->m.nrow()m.col->m.ncol()m.shape->m.layout()m.data->m.as_slice()/m.as_mut_slice()/m.into_vec()Matrix { data, row, col, shape }literal ->matrix(data, row, col, shape)
- Known follow-up:
serde/rkyvdeserialization can still bypass the constructor validation; tracked separately
- Safe code could set
Bug fixes
- Fix even-order adaptive Gauss-Kronrod rules (
G10K21/G20K41/G30K61and theirRvariants) never early-exiting (#93, febd4e2)- The Gauss-sum reconstruction assumed the odd-order node layout, so even-order rules produced a corrupted error estimate and always subdivided to
max_iter, even for constant integrands - Integrating a cubic over
[0, 1]withG10K21(1e-8, 20)drops from about 87 ms to about 70 ns
- The Gauss-sum reconstruction assumed the odd-order node layout, so even-order rules produced a corrupted error estimate and always subdivided to
New features
MatrixTrait::shape()returning(usize, usize)(#86, #103 by @ferxades12)Matrix::trace()andComplexMatrix::trace()(#87, 523185d)ComplexMatrix::h(): Hermitian conjugate (conjugate transpose) (#87)ComplexMatrix::real()/imag(): extract the real or imaginary part as a realMatrix(#87)- New accessors on both matrix types:
nrow(),ncol(),layout(),into_vec()(#101)
CI / Lint
- Add cargo-hack feature-combinations job: every feature builds alone, plus the pairwise powerset of the pure-Rust features (#98, fcfd012)
- Add a blocking
cargo fmt --all --checkjob and format the files added after #96 (bd36784, ec37e61)
Documentation
v0.41.0
Release 0.41.0 (2026-03-15)
Replace enum AD with const-generic Jet<N> (Breaking Change)
Core
- Replace
enum AD { AD0(f64), AD1(f64,f64), AD2(f64,f64,f64) }withstruct Jet<const N: usize> - Normalized Taylor coefficients — all arithmetic uses simple convolution (no binomial coefficients)
- Arbitrary-order forward AD:
Jet<1>,Jet<2>, ...,Jet<10>, etc. - Type aliases:
Dual = Jet<1>,HyperDual = Jet<2> - Direct
sqrtrecurrence (instead ofpowf(0.5))
Proc Macro (peroxide-ad)
#[ad_function]now generatesf_ad<const JET_ORDER: usize>(x: Jet<JET_ORDER>) -> Jet<JET_ORDER>— arbitrary-order differentiationad_closure!generatesJet<1>closure
Backward Compatibility
ADtype alias (= Jet<2>),AD0,AD1,AD2constructor functions preservedADFn,ADVec,StableFnimpls preservedRealtrait implemented forJet<2>(viaADalias)
Integration Updates
jacobian(),newton(),Optimizerupdated to useJet<1>internallynewton!macro works with new proc macro output
Documentation
- KaTeX-rendered math in all doc comments (recurrences for exp, ln, sin/cos, sqrt, inverse trig)
- Accuracy plot:
Jet<N>vs finite differences - Taylor convergence plot:
sin(x)polynomial approximation - New examples:
jet_ad.rs,higher_order_ad.rs - Updated examples:
hessian.rs,real_trait_test.rs - 115 new Jet-specific unit tests
Migration Guide
| Old (0.40.x) | New (0.41.0) |
|---|---|
AD1(x, dx) |
AD1(x, dx) (still works) or Jet::<1>::var(x) |
AD2(x, dx, ddx) |
AD2(x, dx, ddx) (still works) or Jet::<2>::var(x) |
fn f(x: AD) -> AD |
fn f(x: AD) -> AD (still works) or fn f(x: Jet<2>) -> Jet<2> |
f_ad(x: AD) (macro) |
f_ad::<N>(x: Jet<N>) (now generic) |
Fn(&Vec<AD>) -> Vec<AD> |
Fn(&Vec<AD>) -> Vec<AD> (still works) |
v0.40.0
Release 0.40.0 (2025-07-24)
Move from arrow2 to arrow & parquet
- Remove
arrow2dependency - Add
arrowandparquetdependencies - Update
WithParquetimplementation - On user side, there are almost no changes in
DataFrameAPI, but there is one change forfugauser:CompressionOptions->UNCOMPRESSED,SNAPPY,GZIP(level),LZ4,ZSTD(level),BROTLI(level),LZO,LZ4_RAW- For
prelude user, there are completely no changes. Default compression isSNAPPY.
Release 0.39.11 (2025-07-22)
- Implement
derivativeandintegralof B-Spline
Full Changelog: v0.39.11...v0.40.0
v0.39.10
Release 0.39.10 (2025-07-11)
- Fixed a bug in the adaptive step size control for all embedded Runge-Kutta methods.
- Corrected the
BUcoefficient vector for the 7th order solution in theRKF78implementation.
Release 0.39.9 (2025-07-10)
- Change implementation of Gauss-Legendre 4th order method
Full Changelog: v0.39.8...v0.39.10
v0.39.8
Release 0.39.8 (2025-06-23)
- Implement
LogNormaldistributionLogNormal(mu: f64, sigma: f64)
- Fix sampling method for
Gamma
Full Changelog: v0.39.7...v0.39.8
v0.39.7
Release 0.39.7 (2025-05-27)
- Add some methods for
DataFramefilter_by<F: Fn(Scalar) -> bool>(&self, column: &str, f: F) -> anyhow::Result<DataFrame>
: Filter rows by a condition on a specific columnmask(&self, mask: &Series) -> anyhow::Result<DataFrame>
: Filter rows by a boolean maskselect_rows(&self, indices: &[usize]) -> DataFrame
: Select specific rows by indices
Release 0.39.6 (2025-05-16)
- New ODESolver:
RKF78- Implement
RKF78method forODESolver
- Implement
Full Changelog: v0.39.5...v0.39.7
v0.39.5
Release 0.39.5 (2025-04-21)
- New feature
rkyv- Implement
rkyv::{Archive, Serialize, Deserialize}forMatrix,Polynomial,Spline,ODE
- Implement
Full Changelog: v0.39.4...v0.39.5
v0.39.4
Release 0.39.4 (2025-04-11)
Optimize integrate
- Replace the output signature of
gauss_legendre_tableandkronrod_tableto&'static [f64]to avoid unnecessary allocations. - Hard code symmetry of weights and nodes into source code to avoid unnecessary allocations.
- New helper function -
compute_gauss_kronrod_sum_stored- Reduce the number of function calls (G+K -> K)
- Change update method of subinterval tolerance (divide by 2 -> divide by sqrt(2))
- These changes improve the performance of
integrateby 1.2x - 50x (to integrate highly oscillatory functions)
Update dependencies
- Update
randto0.9 - Update
rand_distrto0.5
Full Changelog: v0.39.3...v0.39.4