Skip to content

Releases: Axect/Peroxide

v0.43.0

Choose a tag to compare

@Axect Axect released this 11 Jul 11:35
53e1717

Release 0.43.0 (2026-07-11)

Breaking changes

  • Make the rand / rand_distr sampling stack optional behind the default-on rand feature (#88, #104)
    • Existing default-feature users are unchanged.
    • default-features = false now provides a deterministic core without RNG dependencies; sampling APIs require the rand feature.
    • 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-system for linking a system-installed OpenBLAS through pkg-config (#98, #107)

Documentation

  • Clarify BLAS/LAPACK backend selection, OpenBLAS source versus system builds, TLS prerequisites, and HDF5 constraints (#98)
  • Remove the stale Peroxide_BLAS setup 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

Choose a tag to compare

@Axect Axect released this 06 Jul 12:39

Release 0.42.0 (2026-07-06)

Breaking changes

  • Encapsulate Matrix / ComplexMatrix fields to fix a soundness hole (#101, 2874984)
    • Safe code could set row / col / data directly 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 assert data.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 / rkyv deserialization can still bypass the constructor validation; tracked separately

Bug fixes

  • Fix even-order adaptive Gauss-Kronrod rules (G10K21 / G20K41 / G30K61 and their R variants) 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] with G10K21(1e-8, 20) drops from about 87 ms to about 70 ns

New features

  • MatrixTrait::shape() returning (usize, usize) (#86, #103 by @ferxades12)
  • Matrix::trace() and ComplexMatrix::trace() (#87, 523185d)
  • ComplexMatrix::h(): Hermitian conjugate (conjugate transpose) (#87)
  • ComplexMatrix::real() / imag(): extract the real or imaginary part as a real Matrix (#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 --check job and format the files added after #96 (bd36784, ec37e61)

Documentation

  • Promote the Quickstart to the top of README.md, condense the feature inventory, and trim the CONTRIBUTING.md source layout to a directory-level table (#99, 72a9e56)
  • Document that O3-accelerate only builds on Apple targets, with cargo-hack exclusion guidance (#98, 6d99f2f)

v0.41.0

Choose a tag to compare

@Axect Axect released this 15 Mar 09:01

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) } with struct 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 sqrt recurrence (instead of powf(0.5))

Proc Macro (peroxide-ad)

  • #[ad_function] now generates f_ad<const JET_ORDER: usize>(x: Jet<JET_ORDER>) -> Jet<JET_ORDER> — arbitrary-order differentiation
  • ad_closure! generates Jet<1> closure

Backward Compatibility

  • AD type alias (= Jet<2>), AD0, AD1, AD2 constructor functions preserved
  • ADFn, ADVec, StableFn impls preserved
  • Real trait implemented for Jet<2> (via AD alias)

Integration Updates

  • jacobian(), newton(), Optimizer updated to use Jet<1> internally
  • newton! 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

Choose a tag to compare

@Axect Axect released this 24 Jul 03:35

Release 0.40.0 (2025-07-24)

Move from arrow2 to arrow & parquet

  • Remove arrow2 dependency
  • Add arrow and parquet dependencies
  • Update WithParquet implementation
  • On user side, there are almost no changes in DataFrame API, but there is one change for fuga user:
    • CompressionOptions -> UNCOMPRESSED, SNAPPY, GZIP(level), LZ4, ZSTD(level), BROTLI(level), LZO, LZ4_RAW
    • For prelude user, there are completely no changes. Default compression is SNAPPY.

Release 0.39.11 (2025-07-22)

  • Implement derivative and integral of B-Spline

Full Changelog: v0.39.11...v0.40.0

v0.39.10

Choose a tag to compare

@Axect Axect released this 11 Jul 01:55

Release 0.39.10 (2025-07-11)

  • Fixed a bug in the adaptive step size control for all embedded Runge-Kutta methods.
  • Corrected the BU coefficient vector for the 7th order solution in the RKF78 implementation.

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

Choose a tag to compare

@Axect Axect released this 23 Jun 11:10

Release 0.39.8 (2025-06-23)

  • Implement LogNormal distribution
    • LogNormal(mu: f64, sigma: f64)
  • Fix sampling method for Gamma

Full Changelog: v0.39.7...v0.39.8

v0.39.7

Choose a tag to compare

@Axect Axect released this 27 May 08:49

Release 0.39.7 (2025-05-27)

  • Add some methods for DataFrame
    • filter_by<F: Fn(Scalar) -> bool>(&self, column: &str, f: F) -> anyhow::Result<DataFrame>
      : Filter rows by a condition on a specific column
    • mask(&self, mask: &Series) -> anyhow::Result<DataFrame>
      : Filter rows by a boolean mask
    • select_rows(&self, indices: &[usize]) -> DataFrame
      : Select specific rows by indices

Release 0.39.6 (2025-05-16)

  • New ODESolver: RKF78
    • Implement RKF78 method for ODESolver

Full Changelog: v0.39.5...v0.39.7

v0.39.5

Choose a tag to compare

@Axect Axect released this 21 Apr 01:52

Release 0.39.5 (2025-04-21)

  • New feature rkyv
    • Implement rkyv::{Archive, Serialize, Deserialize} for Matrix, Polynomial, Spline, ODE

Full Changelog: v0.39.4...v0.39.5

v0.39.4

Choose a tag to compare

@Axect Axect released this 11 Apr 07:22

Release 0.39.4 (2025-04-11)

Optimize integrate

  • Replace the output signature of gauss_legendre_table and kronrod_table to &'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 integrate by 1.2x - 50x (to integrate highly oscillatory functions)

Update dependencies

  • Update rand to 0.9
  • Update rand_distr to 0.5

Full Changelog: v0.39.3...v0.39.4

v0.39.3

Choose a tag to compare

@Axect Axect released this 13 Mar 01:34

Release 0.39.3 (2025-03-13)

  • Update puruspe to 0.4.0

Full Changelog: v0.39.2...v0.39.3