The scientific computing stack you control, end to end — now warning-free against the very latest PyO3 and free-threaded Python.
Today we released SciRS2 0.3.2 — a focused compatibility and polish release that brings the Python bindings up to pyo3 0.28.2 and clears every deprecation warning across the 0.3.x line.
No C. No Fortran. No NumPy system dependencies. SciRS2 is a pure-Rust replacement for the SciPy/NumPy/scikit-learn stack, built on OxiBLAS (pure-Rust BLAS/LAPACK), OxiFFT (FFTW-comparable FFT), and OxiCode for serialization — replacing OpenBLAS, LAPACK, MKL, and the C/Fortran numerical core wholesale. It compiles to a single static binary or to WebAssembly and runs everywhere, with no apt install, no conda channel, no shared-library hunt.
Why SciRS2 0.3.2 matters
If you have ever shipped Python extensions, you know the pain: the CPython ABI churns, PyO3 deprecates APIs between minor versions, and the GIL quietly shapes everything you can do with threads. On top of that sits the eternal tax of system-dependency installs — a numerical stack that breaks the moment a BLAS shared library moves.
SciRS2 0.3.2 is a maintenance release that hardens the 0.3.x line against exactly this churn:
- pyo3 0.28.2 upgrade. The whole binding layer now builds against the latest PyO3.
Python::with_gil→Python::attach. pyo3 0.28 deprecated the GIL-token API in favor ofPython::attach, reflecting the move toward Python 3.13 free-threaded (“no-GIL”) builds. We migrated every call site.- Forward-compatible with free-threaded Python 3.13. The bindings build cleanly against modern CPython, including free-threaded interpreters.
- Zero deprecation warnings. Consistent with our zero-warnings policy: 0 compilation errors, 0 clippy warnings.
- Benchmark modernization. We replaced the deprecated
criterion::black_boxwithstd::hint::black_boxacross all benchmarks.
This is honest scope: 0.3.2 is a compatibility and polish release, not a feature drop. It is the kind of quiet work that keeps a 2.59M-line library shipping cleanly for the next year.
Technical Deep Dive
SciRS2 is a 29-crate workspace. Three layers carry this release.
Core (scirs2-core). SIMD-accelerated primitives, memory pools, and GPU backends underpin everything above. This is the substrate that makes the 10-100x performance gains possible without leaving Rust.
Scientific. OxiBLAS-backed dense linear algebra (SVD, condition numbers, decompositions), OxiFFT spectral transforms, sparse solvers (LOBPCG, IRAM, AMG), statistics, and optimization (SQP, MIP, SDP, SOCP). The 0.3.x line already ships Transformers, GNNs, diffusion models, Gaussian processes, survival analysis, compressed sensing, and computer vision — all pure Rust.
Python / Interop (scirs2-python, on PyPI via PyO3 0.28.2; plus WASM). This is where 0.3.2 lands. Conceptually, the old GIL-token pattern looked like Python::with_gil(|py| { ... }), where py was a token proving the GIL was held. In a free-threaded world that framing no longer fits, so PyO3 0.28 moved to Python::attach(|py| { ... }) — you attach the current thread to the interpreter rather than acquiring a global lock. We migrated this across optimize.rs, integrate.rs, optimize_ext.rs, and stats/mcmc_gp.rs, and added a from_py_object attribute to the #[pyclass] on PyTimeSeries in series.rs to clear the last deprecation warning. The net effect: SciRS2’s Python bindings build warning-free against the latest PyO3 and modern CPython, free-threaded builds included.
Getting Started
Add SciRS2 to your project:
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 via the pure-Rust OxiBLAS-backed linalg module
let (_u, s, _vt) = scirs2::linalg::decomposition::svd(&a)?;
println!("Singular values: {:.4?}", s);
let cond = scirs2::linalg::basic::condition(&a, None)?;
println!("Condition number: {:.4}", cond);
Ok(())
}
Prefer Python? The bindings ship on PyPI and now build cleanly on pyo3 0.28.2 / modern CPython, including free-threaded 3.13:
pip install scirs2
What’s New in 0.3.2
- Upgraded pyo3 to 0.28.2.
- Migrated
Python::with_gil→Python::attachacrossoptimize.rs,integrate.rs,optimize_ext.rs, andstats/mcmc_gp.rs. - Added
from_py_objectto the#[pyclass]onPyTimeSeriesinseries.rsto resolve a pyo3 deprecation warning. - Modernized benchmarks: replaced deprecated
criterion::black_boxwithstd::hint::black_boxacross all benchmarks. - Still 19,700+ tests, 2.59M SLoC, 29 crates, zero warnings (0 errors, 0 clippy).
Tips
-
Calling SciRS2 from Python? Rebuild your own glue against pyo3 0.28.2 and switch
with_gil→attachin your extension code. The pattern maps one-to-one:// before Python::with_gil(|py| { /* ... */ }); // after Python::attach(|py| { /* ... */ }); -
Free-threaded 3.13? The bindings now tolerate free-threaded CPython — a good moment to test your no-GIL pipelines against SciRS2.
-
Writing benchmarks? Use
std::hint::black_boxinstead ofcriterion::black_box; the criterion re-export is deprecated. -
Upgrading? Pin
scirs2 = "0.3.2"as a drop-in over 0.3.1 — there is no API breakage in this patch.
This is the foundation
SciRS2 is the numerical bedrock of the COOLJAPAN ecosystem. As of March 2026 it sits alongside OxiBLAS (pure-Rust BLAS/LAPACK), OxiFFT (FFT), and OxiCode / oxiarc (serialization and compression) at the low level, and powers higher-level siblings: ToRSh (deep learning), OxiMedia (media and computer vision), OxiHuman, OxiGDAL, OxiRAG, Spintronics, NumRS2, PandRS, and OptiRS. One pure-Rust stack, from BLAS kernels to AI models — no C, no Fortran, no system dependencies.
Repository: https://github.com/cool-japan/scirs
Star the repo if you want a scientific computing stack you can compile, audit, and ship as a single binary.
Pure Rust scientific computing and AI is here — fast, safe, and sovereign.
— KitaSan at COOLJAPAN OÜ March 17, 2026