COOLJAPAN
← All posts

SciRS2 0.1.2 Released — The Last C Dependency Is Gone: Pure Rust FFT via OxiFFT

SciRS2 0.1.2 completes the Pure Rust journey — FFT migrates from FFTW to Pure Rust OxiFFT, plus zero-allocation SIMD ops and functional optimizers (SGD/Adam/RMSprop). 100% Pure Rust by default on OxiBLAS + OxiFFT. No C, no Fortran.

release scirs2 scientific-computing scipy numpy fft oxifft simd pure-rust

The loop is closed: as of 0.1.2, SciRS2 carries no major C dependency in its default build.

Today we released SciRS2 0.1.2 — the release that makes our SciPy/NumPy stack 100% Pure Rust by default, replacing FFTW with the Pure Rust OxiFFT backend.

No C. No Fortran. No FFTW. No OpenBLAS. NumPy and SciPy lean on a tower of native code — C and Fortran kernels, FFTW for transforms, OpenBLAS or LAPACK or MKL for linear algebra — and every one of those is a system library you have to find, build, and version-match before your science even starts. SciRS2 0.1.2 walks away from that tower. cargo add scirs2 pulls in no system libraries; it compiles to a single static binary, or down to WASM, and runs the same on every platform.

Why SciRS2 0.1.2 matters

If you have ever shipped a numerics stack, you know the FFT install hell: hunting for an FFTW package, matching its ABI, juggling platform-specific binaries, and then doing it all again on the next machine and the next OS. Native FFT bindings are exactly the kind of dependency that turns a clean build into a support ticket. 0.1.2 removes that whole category of pain. The concrete wins:

Technical Deep Dive: completing the Pure Rust migration

The release touches four layers, each a real crate in the workspace.

1. Core / SIMD layer (scirs2-core). This is where the allocation savings come from. New zero-allocation operations work in three flavors: in-place ops (simd_add_inplace, simd_sub_inplace, simd_mul_inplace, simd_div_inplace) that mutate a buffer directly; into-buffer ops (simd_add_into, simd_sub_into, simd_mul_into, simd_div_into) that write results into a caller-supplied output; scalar in-place ops (simd_add_scalar_inplace, simd_mul_scalar_inplace); and a fused multiply-add, simd_fma_into. Each uses AVX2 on x86_64 and NEON on aarch64, with scalar fallbacks everywhere else. AlignedVec also gains set, get, fill, clear, and with_capacity_uninit to round out aligned buffer management.

2. FFT layer (scirs2-fft). The headline. FFTW is out; OxiFFT is in. The new OxiFftBackend provides FFTW-compatible performance behind a Pure Rust implementation, and OxiFftPlanCache manages plans so repeated transforms of the same size don’t re-plan. All examples, integration tests, and Python bindings were updated to the new backend.

3. Linear algebra on OxiBLAS (scirs2-linalg). Linear algebra continues to run on the Pure Rust OxiBLAS backend, and the SciPy-compatibility benchmark API is simplified this release: det, norm, lu, cholesky, eigh, compat_solve, and lstsq, with a proper UPLO enum for symmetric and Hermitian problems.

4. AI/ML autodiff layer (scirs2-autograd). New stateless functional optimizersFunctionalSGD, FunctionalAdam, and FunctionalRMSprop — all support learning-rate scheduling and parameter inspection. A new TrainingLoop manages training workflows, and graph-statistics tracking gives you performance monitoring, with tensor-op and graph enhancements wiring the optimizers in cleanly. Serialization throughout the stack rides on oxicode (0.1.1, with serde and SIMD features), keeping persistence Pure Rust too.

Getting Started

cargo add scirs2
use scirs2::prelude::*;
use ndarray::Array2;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let a = Array2::from_shape_vec((3, 3), vec![
        1.0, 2.0, 3.0,
        4.0, 5.0, 6.0,
        7.0, 8.0, 9.0,
    ])?;

    // SVD on the Pure Rust OxiBLAS backend
    let (u, s, vt) = scirs2::linalg::decomposition::svd(&a)?;
    println!("Singular values: {:.4?}", s);

    // Sample from a normal distribution
    let normal = scirs2::stats::distributions::normal::Normal::new(0.0, 1.0)?;
    let samples = normal.random_sample(5, None)?;
    println!("Random samples: {:.4?}", samples);

    Ok(())
}

What’s New in 0.1.2

Tips

This is the foundation

SciRS2 sits inside the growing COOLJAPAN ecosystem, and with 0.1.2 its core stack is built entirely on Pure Rust siblings: OxiBLAS for linear algebra, OxiFFT for signal and FFT work, and oxicode for serialization. That trio is what lets cargo add scirs2 pull a complete scientific computing toolkit with no C, no Fortran, and no system libraries behind it.

Repository: https://github.com/cool-japan/scirs

Star the repo if a Pure Rust SciPy/NumPy stack is something you want to see grow.

Pure Rust scientific computing is here — fast, safe, and sovereign.

KitaSan at COOLJAPAN OÜ January 16, 2026

↑ Back to all posts