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:
- FFT is now Pure Rust via OxiFFT — the new
OxiFftBackenddelivers FFTW-compatible performance, with anOxiFftPlanCachefor efficient plan reuse. No FFTW, no native linker step. - The last major C dependency is gone from the default build. With OxiBLAS already handling BLAS/LAPACK, OxiFFT was the final piece — SciRS2 is now truly 100% Pure Rust by default.
- Zero-allocation in-place SIMD ops (AVX2 on x86_64, NEON on aarch64) cut allocations in hot paths, operating directly on your buffers instead of churning intermediates.
- Functional optimizers and a training loop land in the autograd layer, making ML training workflows cleaner and stateless.
- A simpler SciPy-compat linalg API trims the benchmark surface down to the operations people actually reach for.
- 11,400+ tests passing, zero warnings — the migration shipped clean across the whole workspace.
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 optimizers — FunctionalSGD, 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
- Complete FFTW → OxiFFT migration: Pure Rust FFT backend (
OxiFftBackend) with FFTW-compatible performance and anOxiFftPlanCache; the last major C dependency is gone from the default build. - Zero-allocation SIMD ops: new in-place (
simd_*_inplace) and into-buffer (simd_*_into) operations, plussimd_fma_into, on AVX2/NEON with scalar fallbacks;AlignedVecgainsset,get,fill,clear, andwith_capacity_uninit. - Functional optimizers:
FunctionalSGD,FunctionalAdam,FunctionalRMSpropwith LR scheduling and parameter inspection, a newTrainingLoop, and graph-statistics tracking. - Simplified SciPy-compat linalg API: streamlined benchmark surface (
det,norm,lu,cholesky,eigh,compat_solve,lstsq) with a properUPLOenum. - Zero-warnings cleanup across the workspace — all clippy and compiler warnings resolved.
- No breaking changes — fully backward compatible with the 0.1.1 API.
- 11,400+ tests passing across 170+ binaries; 2.42M total lines (1.68M Rust code, 149K comments) across 23 workspace crates.
Tips
- Drop your FFTW setup. The default build is fully Pure Rust now, so any FFTW system installation or linker flags you carried for SciRS2 can go.
- Avoid allocations in hot paths with the in-place SIMD ops, e.g.
simd_add_inplace(&mut a, &b);, or write into a preallocated buffer withsimd_mul_into(&a, &b, &mut out);. - Use
simd_fma_intofor fused multiply-add in tight loops where you’d otherwise chain a multiply and an add. - Train with a stateless optimizer like
FunctionalAdampaired withTrainingLoopto keep your training workflow explicit and easy to inspect. - Reuse FFT plans via
OxiFftPlanCachewhen you transform many arrays of the same size — plan once, transform repeatedly. - Upgrading from 0.1.1 needs no code changes. The API is backward compatible; just bump the version.
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