rslab (Python bindings)
NumPy/SciPy bindings for RSLAB, a pure-Rust sparse direct solver and preconditioner: complex/real symmetric LDL^T (Bunch-Kaufman), unsymmetric LU, and a KLU-style path for circuit-shaped matrices. A thin wrapper, all numeric work happens in Rust.
Install
pip install rslab
Usage
import numpy as np
import scipy.sparse as sp
import rslab
# Symmetric system (real or complex; the dtype selects the path).
A = sp.random(5000, 5000, density=1e-3, format="csc") + sp.eye(5000) * 10
A = A + A.T
b = np.random.rand(5000)
# One-shot solve.
x = rslab.spsolve(A, b)
# Factor once, solve many right-hand sides.
f = rslab.ldlt(A)
x1 = f.solve(b)
X = f.solve_many(np.random.rand(5000, 8)) # n x nrhs
print(f.n, f.factor_nnz, f.inertia, f.dtype)
Complex-symmetric matrices (EM/FEM, PARDISO mtype 6) work identically:
A = A.astype(np.complex128); A.data += 1j * 0.3 * A.data.real
x = rslab.ldlt(A).solve(np.ones(A.shape[0], dtype=np.complex128))
Unsymmetric matrices use the LU path:
f = rslab.lu(A_general)
x = f.solve(b)
Circuit-shaped matrices (MNA / SPICE-class: very sparse, unsymmetric,
near-triangularizable) use the KLU path, bit-deterministic, with a
numeric-only refactor for fixed-pattern sweeps:
f = rslab.klu(A_circuit)
x = f.solve(b)
A_circuit.data *= 1.5 # frequency sweep: same pattern, new values
f.refactor(A_circuit.data) # no symbolic work, no pivot search
x2 = f.solve(b)
y = f.solve_transpose(b) # A.T @ y = b on the same factors (adjoint)
solve_transpose is the plain transpose; for the conjugate-transpose adjoint
use f.solve_transpose(b.conj()).conj().
Preconditioner mode
Never-fail static pivoting plus iterative refinement for hard/indefinite systems:
f = rslab.ldlt(A, preconditioner=1e-4)
x = f.solve(b, refine=20) # refine against the original A
Configuration (keyword arguments)
By default ldlt, lu and spsolve use RSLAB's deterministic heuristic
pick, the adaptive ordering plus an exact nested-dissection bakeoff on large
systems (adopted only on a clear predicted win with no fill/memory
regression). A one-time rslab.install_diagnose() measures this machine's
throughput and speedup curve and caches it; afterwards the default also picks
its worker count from the calibration (until then the conservative capped
default applies). Keyword arguments override the pick:
| kwarg | default | meaning |
|---|---|---|
threads |
None (auto) |
None = calibrated/structural per-matrix pick; int = fixed (0 = all) |
preconditioner |
None |
static-pivot floor (e.g. 1e-4); never-fail, refine to solve |
drop_tol |
None |
incomplete-factor threshold (preconditioner) |
method |
"left_looking" |
"left_looking" or "multifrontal" |
memory |
"low" |
"low" or "eager" factor emit strategy |
force_accept |
False |
accept tiny pivots in exact mode instead of failing |
klu accepts:
| kwarg | default | meaning |
|---|---|---|
pivot_tol |
1e-3 |
diagonal-preference threshold; 1.0 = plain partial pivoting |
row_scaling |
True |
divide each row by its max-magnitude entry before factoring |
btf |
True |
permute to block upper triangular form first (keep it on) |
parallel |
None |
per-block parallel factor/refactor over the BTF blocks; None = auto gate (>=4 blocks, >=8000 nnz, no dominant block), True/False force on/off; bit-identical result in every mode |
Supported dtypes: float64, float32, complex128, complex64.
API
Everything ships in the flat rslab namespace; full parameter documentation
lives in the docstrings (help(rslab.klu) etc.).
Functions
| function | meaning |
|---|---|
spsolve(A, b, **kw) |
one-shot factor-and-solve; detects symmetry and picks the LDL^T or LU path |
ldlt(A, **kw) -> Ldlt |
factor a real/complex symmetric matrix (Bunch-Kaufman LDL^T) |
lu(A, **kw) -> Lu |
factor a general unsymmetric matrix (supernodal multifrontal LU) |
klu(A, **kw) -> Klu |
factor a circuit-shaped matrix (BTF + per-block Gilbert-Peierls LU) |
install_diagnose() |
one-time machine calibration; caches the measured thread-speedup curve |
Factor handles - factor once, then:
| method / attribute | Ldlt |
Lu |
Klu |
meaning |
|---|---|---|---|---|
solve(b, refine=0) |
yes | yes | yes | solve one RHS, optional iterative-refinement steps against the original A |
solve_many(B) |
yes | yes | yes | solve n x nrhs RHS in one batched pass |
solve_transpose(b) |
- | - | yes | solve A^T y = b on the same factors (plain transpose, not conjugate) |
refactor(data) |
- | - | yes | numeric-only re-factorization for new values on the same pattern (no symbolic work, no pivot search) |
gmres(b, tol=1e-8, maxit=400, restart=None, x0=None, recycle=None) |
yes | yes | yes | GMRES with this factor as preconditioner |
gmres_block(B, tol=1e-8, maxit=400, restart=None, x0=None) |
yes | yes | yes | block GMRES for multiple RHS |
recycle(k) |
yes | yes | yes | a Recycle workspace holding up to k deflation vectors across gmres calls |
n, factor_nnz, n_perturbed, dtype |
yes | yes | yes | dimension, stored factor entries, perturbed pivots (always 0 for Klu), NumPy dtype name |
inertia |
yes | - | - | (n_pos, n_neg, n_zero) eigenvalue counts from LDL^T |
n_blocks |
- | - | yes | number of BTF diagonal blocks |
Recycle - deflation-subspace carrier for sweeps: attributes k,
active, dtype; clear() resets it.
License
MIT.
Release files for rslab 0.30.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rslab-0.30.2.tar.gz | 1.2 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| rslab-0.30.2-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| rslab-0.30.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| rslab-0.30.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| rslab-0.30.2-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| rslab-0.30.2-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 11.4 MB
Release files / rslab-0.30.2.tar.gz
| Download URL | rslab-0.30.2.tar.gz |
|---|---|
| Size | 1.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
791ca1b3460b48f6e3eee91a02f7c1530f180ec6b628f059619a4403f5986f62
|
|
BLAKE2b-256 checksum How to use checksums |
04d0233b2b8a1da5ddec25c21e06200925088fff0d4e19e55218212083b6a623
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency logRelease files / rslab-0.30.2-cp39-abi3-win_amd64.whl
| Download URL | rslab-0.30.2-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
deba52f1b57c25e3a6bdb4a7b1606daf2c86d8ab2b7b23a453df113406ee81d3
|
|
BLAKE2b-256 checksum How to use checksums |
6f511c58906c21bef8d5bf2c511a0d86ff5ff6ce129b21c2e603619475e72dee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency logRelease files / rslab-0.30.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rslab-0.30.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
3a8e7b1e88b0309c081b5476e941597d014498fcde42056f1527f85bfa0a26bf
|
|
BLAKE2b-256 checksum How to use checksums |
5a31ebed15445969676297dadc38eee657897efe66c5d1813753093f5175f678
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency logRelease files / rslab-0.30.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | rslab-0.30.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
a58463bca9a134671a16928fd3d90029cb0f0792175847e6eea98297e2ae5196
|
|
BLAKE2b-256 checksum How to use checksums |
af3432a2a92eda70e749fd791daff96907ea2238c463160be058946ebe5a25d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency logRelease files / rslab-0.30.2-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | rslab-0.30.2-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.9 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
df4fe0282fc3923f5cd02db5e862cd312bfaa733e09699d7d32c9365523b3149
|
|
BLAKE2b-256 checksum How to use checksums |
8073cf25b1de9573296a83f2d45a726c76e7751f8a5b4dabf86961758a674ba4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency logRelease files / rslab-0.30.2-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | rslab-0.30.2-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.0 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
c21193cdbc318b8ce29069a74bb34b319bdd44cd86d7ce7b118227174f55f0db
|
|
BLAKE2b-256 checksum How to use checksums |
b7ff3085fb104b38dee8f1dde2905fb3b54973437821eeb87834ab1c312b7f18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 5, 2026.
Transparency log