Skip to main content

Sparse symmetric indefinite direct solver with certified inertia, in pure Rust.

Project description

feral-solver

Python bindings for feral, a pure-Rust sparse symmetric indefinite direct solver with certified inertia counts. Aimed at interior-point methods (the IPM in discopt is the primary consumer), but usable for any application that factors symmetric KKT-shaped systems.

Install

pip install feral-solver           # plain
pip install 'feral-solver[scipy]'  # with scipy.sparse adapters
uv add feral-solver                # via uv

Wheels are published for CPython 3.10+ on Linux x86_64/aarch64, macOS universal2, and Windows x86_64. abi3 means one wheel per platform/arch covers all supported Python minor versions.

Quickstart

import numpy as np
import feral

A = feral.CscMatrix.from_dense(np.array([
    [4.0, 1.0, 0.0],
    [1.0, 3.0, 2.0],
    [0.0, 2.0, 5.0],
]))

solver = feral.Solver()
status, inertia = solver.factor(A)
assert status == feral.FactorStatus.SUCCESS
print(inertia)                       # Inertia(n_pos=3, n_neg=0, n_zero=0)

b = np.array([1.0, 2.0, 3.0])
x = solver.solve(b)
print(np.allclose(A.symv(x), b))     # True

IPM use

The feral.ipm.KktSolver class wraps Solver with the Wächter–Biegler 2006 §3.1 perturbation-escalation loop. Symbolic analysis is cached; across an entire Newton run solver.symbolic_call_count stays at 1.

import feral
import feral.ipm

kkt_pattern = feral.CscMatrix.from_scipy(my_kkt)   # see scipy adapter
kkt = feral.ipm.KktSolver(
    kkt_pattern,
    expected_inertia=feral.Inertia(n_vars, n_equality_constraints),
)
for newton_iter in range(max_iter):
    report = kkt.factor(values_this_iter)          # auto-perturbs if needed
    if report.status != feral.FactorStatus.SUCCESS:
        break
    dx_aff, dx_corr = kkt.solve_pair(b_aff, b_corr)
    ...

See examples/discopt_ipm_kkt.py for an end-to-end Newton step against a small NLP.

Example notebooks

Runnable notebooks live in examples/notebooks/ (regenerate the .ipynb from _build_notebooks.py; execute with jupyter nbconvert --execute or open in Jupyter):

  • 01_basic_factor_solve — factor, certified inertia, solve, refine, reuse.
  • 02_multi_rhs_batchedbatched multi-RHS solve, motivated by a steady-state heat-conduction sweep, with a correctness check and a looped-vs-batched timing showing the per-RHS speedup (issue #57).
  • 03_kkt_saddle_inertia — indefinite KKT system with certified inertia.
  • 04_scipy_numpy_interopscipy.sparse round-trip vs spsolve.

scipy.sparse interop

import scipy.sparse as sp
import feral

A_scipy = sp.csc_matrix(...)
A = feral.from_scipy(A_scipy, symmetric="full")    # reads lower triangle
# ... factor, solve ...
A_back = feral.to_scipy(A)                          # round-trips to scipy

Building from source

Requires a stable Rust toolchain (1.75+) and Python 3.10+.

git clone https://github.com/jkitchin/feral.git
cd feral/python
pip install maturin
maturin develop --release    # builds and installs into current venv
pytest tests/

License

MIT, same as the underlying Rust crate.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

feral_solver-0.9.0.tar.gz (635.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

feral_solver-0.9.0-cp310-abi3-win_amd64.whl (625.2 kB view details)

Uploaded CPython 3.10+Windows x86-64

feral_solver-0.9.0-cp310-abi3-manylinux_2_28_aarch64.whl (660.2 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

feral_solver-0.9.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (735.0 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

feral_solver-0.9.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.3 MB view details)

Uploaded CPython 3.10+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file feral_solver-0.9.0.tar.gz.

File metadata

  • Download URL: feral_solver-0.9.0.tar.gz
  • Upload date:
  • Size: 635.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for feral_solver-0.9.0.tar.gz
Algorithm Hash digest
SHA256 d8fb3938332634ab23b81a92109bbe301c7009e5cdfdb9244b2fbb2cbab02c7e
MD5 2e0face7f4b14fba556b3c458298c958
BLAKE2b-256 89215fa8267b4e5abbf77ec743cac480bc3860ef345f95e2c24e37b1d1fbc00b

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.9.0.tar.gz:

Publisher: python-wheels.yml on jkitchin/feral

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file feral_solver-0.9.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: feral_solver-0.9.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 625.2 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for feral_solver-0.9.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b4027b59ed9a3dadc267771edde94a90e882e2d03e5f9166fda24e56390bb01c
MD5 ff07f4f6309abb42faf115479103c591
BLAKE2b-256 758e63ce632b0fd95b6ce42b8097d3879b5a103e56abc951511e827609717d20

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.9.0-cp310-abi3-win_amd64.whl:

Publisher: python-wheels.yml on jkitchin/feral

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file feral_solver-0.9.0-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for feral_solver-0.9.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7d7712d1376d7b2f6a3fce78d92c31f80984c819e98795996155cd981180f271
MD5 c7a1b7c02fdf6c3755e7d7a023f1f2d0
BLAKE2b-256 74ba6137c49a976c070a836d448dddb35bda8532fa31f4bfc9596fcaf0261ae2

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.9.0-cp310-abi3-manylinux_2_28_aarch64.whl:

Publisher: python-wheels.yml on jkitchin/feral

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file feral_solver-0.9.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for feral_solver-0.9.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2904569601087b79a7b6e8c7c11f2d68e1c889eafe3239bb13e1781d7faf582b
MD5 1d3220f3aea68d626f91eade847a7275
BLAKE2b-256 9aae86664e8ad8e4b924088c27e05e0119786d68a3f20de05d67f4f182999930

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.9.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-wheels.yml on jkitchin/feral

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file feral_solver-0.9.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for feral_solver-0.9.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 51727dda1b2ec39e6c5f35984543bf827c5b26c687f2902ebc19306e3e51671d
MD5 ba6d5cf5fbf3a6684bc67e58384b8a32
BLAKE2b-256 1a9edfe006884cd8a71b435cd06ec92b47fd8fa8123e875a2ebcd2969c19eb3f

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.9.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: python-wheels.yml on jkitchin/feral

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page