COOLJAPAN
← All posts

OxiBLAS 0.1.1 Released — Correct Eigenvectors for Tridiagonal QR

OxiBLAS 0.1.1 fixes a critical sign bug in the symmetric eigenvalue QR algorithm so eigenvectors accumulate correctly for matrices that need multiple QR sweeps. The pure Rust BLAS/LAPACK foundation now powering the just-launched SciRS2 core.

release oxiblas blas lapack scirs2 pure-rust eigenvalues linear-algebra

A small version number, a meaningful correctness fix.

Today we released OxiBLAS 0.1.1 — a focused patch that fixes a subtle but important bug in the symmetric eigenvalue solver, one day after the 0.1.0 debut of pure Rust BLAS/LAPACK.

No C. No Fortran. No external shared libraries. No FFI overhead. No build hell. Just clean, memory-safe linear algebra that compiles to a single static binary and runs everywhere.

Why 0.1.1 matters

The symmetric eigenvalue decomposition (syev) reduces a matrix to tridiagonal form and then runs the implicit QR algorithm with Givens rotations to drive the off-diagonal to zero. In 0.1.0, the off-diagonal element during a QR sweep was stored as hypot(x, z) — which is always non-negative — instead of c * x - s * z, which preserves sign.

The consequence was precise and easy to miss: eigenvalues were correct, but for matrices that required multiple QR iterations the eigenvectors were computed incorrectly, because the Givens rotations were not accumulated into the eigenvector matrix with the right signs. Any code that consumed only the spectrum was fine; any code that relied on the eigenvectors — projections, PCA-style decompositions, spectral methods — could silently get wrong directions.

0.1.1 fixes the rotation bookkeeping so eigenvectors accumulate correctly across iterations. If you used eig/syev on real symmetric matrices in 0.1.0, this is the release you want.

Technical Deep Dive: where the fix lives

OxiBLAS keeps its eigensolvers in oxiblas-lapack, layered on the same workspace introduced in 0.1.0:

The fix is in the tridiagonal QR step: the Givens rotation (c, s) that zeroes a sub-diagonal entry must produce the new off-diagonal value as c * x - s * z, and the same rotation must be applied to the accumulating eigenvector matrix. Restoring the signed update makes both halves — the implicit shift on the tridiagonal and the rotation of the eigenvectors — consistent, so the reconstructed A = V Λ Vᵀ holds to full precision again.

Getting Started

cargo add oxiblas

Symmetric eigendecomposition, now with trustworthy eigenvectors:

use oxiblas::prelude::*;

// A symmetric matrix whose eigenvectors matter
let a = Mat::from_rows(&[
    &[2.0, 1.0, 0.0],
    &[1.0, 2.0, 1.0],
    &[0.0, 1.0, 2.0],
]);

let evd = SymmetricEvd::compute(a.as_ref()).expect("EVD failed");
let values = evd.eigenvalues();   // ascending eigenvalues
let vectors = evd.eigenvectors(); // columns are orthonormal eigenvectors

What’s New in 0.1.1

Tips

This is the foundation

OxiBLAS is the linear algebra backend of the COOLJAPAN scientific stack, and as of today that role is concrete: SciRS2 0.1.0 launches this very day, and it builds its core numerical operations on OxiBLAS. A correct symmetric eigensolver is exactly the kind of primitive everything downstream depends on. OxiBLAS sits alongside the early COOLJAPAN siblings — VoiRS, TenRSo, TensorLogic, Spintronics, and Oxicode — in a sovereign, C/C++/Fortran-free ecosystem.

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

Star the repo if you want high-performance scientific computing without the traditional toolchain headaches.

Pure Rust numerical linear algebra is here — fast, safe, and sovereign.

KitaSan at COOLJAPAN OÜ December 29, 2025

↑ Back to all posts