Skip to main content

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

ldlt, lu and spsolve take a Settings object (or the same keywords directly), klu a KluSettings. By default the factor uses RSLAB's deterministic heuristic pick: the adaptive ordering plus an exact nested-dissection bakeoff on large systems, and at most 4 workers (the calibrated count after a one-time rslab.install_diagnose()). Keywords override the pick:

s = rslab.Settings(ordering="metis", threads=2, preconditioner=1e-4)
f = rslab.ldlt(A, settings=s)
f = rslab.lu(A, ordering="amd", pivot_u=0.5)        # the same, as keywords
print(s.to_dict())
Settings keyword default meaning
ordering heuristic pick "auto", "auto_race", "amd", "amf", "metis" (one nested-dissection run), "rcm"
nemin, relax, reorder 16, on, "hybrid_liu" supernode amalgamation and elimination-tree reordering
threads predictor, max 4 int (0 = all cores), "auto", "ambient"; the factor is bit-identical either way
preconditioner None static-pivot floor (e.g. 1e-4): never-fail, refine to solve
force_accept False accept tiny pivots in exact mode instead of failing
drop_tol None incomplete-factor threshold (ILU-style preconditioner)
method, memory "left_looking", "low" numeric schedule and factor emit strategy
pivot_u 0.1 threshold-pivoting tolerance of the LU path
matching True MC64 row matching and scaling before the LU analysis (bounded pivot growth)
scaling "one_pass" LDL^T equilibration: "inf_norm", "mc64", "auto", "identity"
blr, panel_nb off, 64 block-low-rank tolerance, dense panel width
scalar_gate, par_gemm, par_cdiv, use_gemm_schur calibrated kernel tuning knobs
interrupt None an rslab.Interrupt cancellation flag

KluSettings: pivot_tol (1e-3), row_scaling (on), btf (on), matching (on: MC64 row matching as the BTF transversal), parallel (None = structural auto gate, True / False force), interrupt.

Settings a path ignores are reported under diagnostics()["warnings"]. solve and solve_many on Ldlt and Lu handles are supernodal and tree-parallel (leaf subtrees of the elimination tree in parallel, parallel sections inside the wide top separators), bit-identical for every thread count. Throughput is always reported: diagnostics()["rates"] holds the analysis, factorization and solve rates in million unknowns per second (MDOF/s), the factorization flop rate (GFlop/s) and the factor-entry rate (Mnnz/s); the summary line and the info log carry the factor rate too.

Symbolic reuse

The analysis depends only on the sparsity pattern. Pay it once and factor each value set of a sweep on it:

sym = rslab.analyze(A, path="lu")                # LdltSymbolic / LuSymbolic / KluSymbolic
print(sym.factor_nnz, sym.estimate_memory()["factor_mb"])
for omega in frequencies:
    f = sym.factor((K + 1j * omega * C).data)    # same pattern, new values
    x = f.solve(b)

Krylov solvers

gmres, gmres_block, cocg and cocr run on any matrix, optionally preconditioned by any factor handle (an incomplete factor, or the factor of a nearby matrix):

M = rslab.lu(A, drop_tol=1e-3)                   # ILU-style preconditioner
x, converged, iters, res, stop = rslab.gmres(A, b, M, tol=1e-10)
r = rslab.gmres(A_next, b, M, recycle=M.recycle(8))   # reuse M, deflate across solves

Logging

rslab.set_log_level("info")                      # or the RLA_LOG environment variable
log = logging.getLogger("rslab")
rslab.set_log_sink(lambda level, msg: log.log(logging.getLevelName(level.upper()), msg))

API

The full reference, generated from the docstrings, is in docs/api.md (help(rslab.ldlt) etc. show the same text).

name 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 LU)
klu(A, **kw) -> Klu factor a circuit-shaped matrix (BTF + per-block Gilbert-Peierls LU)
analyze(A, path, **kw) the symbolic analysis alone; .factor(data) per value set
Settings, KluSettings, Interrupt configuration objects
gmres, gmres_block, cocg, cocr Krylov solvers, M= any factor handle
install_diagnose() one-time machine calibration
set_log_level, log_level, set_log_sink the core's logger

Factor handles share solve(b, refine=0, target=None, measure="normwise"), solve_many(B), gmres, gmres_block, cocg, cocr, recycle(k), diagnostics() and the attributes n, factor_nnz, n_perturbed, dtype; Ldlt adds inertia, Klu adds n_blocks, solve_transpose(b) and the numeric-only refactor(data).

Supported dtypes: float64, float32, complex128, complex64.

License

MIT.

Release files for rslab 0.34.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rslab 0.34.0
File Size Uploaded
rslab-0.34.0.tar.gz 1.3 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for rslab 0.34.0
File
rslab-0.34.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details
rslab-0.34.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.9 abi3 Linux glibc 2.17+ x86-64 Details
rslab-0.34.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.9 abi3 Linux glibc 2.17+ ARM64 Details
rslab-0.34.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details
rslab-0.34.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details

Total release size: 13.9 MB

Release files / rslab-0.34.0.tar.gz

Download URL rslab-0.34.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
85fa57285a71af25ea66cd33bc6aca1a2152f716848833bf777cd2906a66c353
BLAKE2b-256 checksum
How to use checksums
bf1eab854257f3342037ae77c5ba7815f3a8a5cc2fc5e765f2475be0876d7c7b
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 7, 2026.

Transparency log

Release files / rslab-0.34.0-cp39-abi3-win_amd64.whl

Download URL rslab-0.34.0-cp39-abi3-win_amd64.whl
Size 2.6 MB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
a13f158b7ff843732f05bc1ff7b064b79f6a513e50bcb147bbadfaab1837b7b5
BLAKE2b-256 checksum
How to use checksums
54f130b63df4cb96a961da604c13780c4b9ead311bb4bf616ce696505e1c4542
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 7, 2026.

Transparency log

Release files / rslab-0.34.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL rslab-0.34.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.8 MB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
e1b7507c50c41f5c5f5fc218620707a7c8dd43a3f1605bd29fd20d40f44a4a50
BLAKE2b-256 checksum
How to use checksums
154269ebdd548f4784735ff7f53814813e17682cda069eb65201c236d5af7537
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 7, 2026.

Transparency log

Release files / rslab-0.34.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL rslab-0.34.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.5 MB
Tags CPython 3.9 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
cbfb3ca34d584dfdafc9014a36500726678f08666c507084149799e8d41afdef
BLAKE2b-256 checksum
How to use checksums
120251f3554c40703aa49aff6a2bb60b6412bb438dc061d11ea0764f2b66e197
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 7, 2026.

Transparency log

Release files / rslab-0.34.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL rslab-0.34.0-cp39-abi3-macosx_11_0_arm64.whl
Size 2.3 MB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a4b17cbc4da06fc3a8c4b1efa7b93aeba0497318794ec883516822e412c3fe0e
BLAKE2b-256 checksum
How to use checksums
b9bf0744ab1e5fc50ab1713974b69fce0fc0415635adc06a1b8312adccaf5a16
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 7, 2026.

Transparency log

Release files / rslab-0.34.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL rslab-0.34.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 2.5 MB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
9b1cff66e9c7a06788e66a379cdaab8ffed875e9d8e96e5aa21c97af0d6ac8c9
BLAKE2b-256 checksum
How to use checksums
be0967f27edbde4d0b2887e8783b8f1372c2aed4ba70f997655e221047fd2469
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 7, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page