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.

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.7.0.tar.gz (606.0 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.7.0-cp310-abi3-win_amd64.whl (612.7 kB view details)

Uploaded CPython 3.10+Windows x86-64

feral_solver-0.7.0-cp310-abi3-manylinux_2_28_aarch64.whl (647.6 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

feral_solver-0.7.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (723.4 kB view details)

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

feral_solver-0.7.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.7.0.tar.gz.

File metadata

  • Download URL: feral_solver-0.7.0.tar.gz
  • Upload date:
  • Size: 606.0 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.7.0.tar.gz
Algorithm Hash digest
SHA256 d8ea90fe62e32735b8fdc8cb4f3d42782220e2e072d8372091a94bc203687a72
MD5 293fbb4a9484fb5da1ffd5c5be2e9719
BLAKE2b-256 db304cf8a5ce18976b4b5413fe367bbc96d5303f82583b4b8b3fa158f2140eb8

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.7.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.7.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: feral_solver-0.7.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 612.7 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.7.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 af06cb46a3eaae206d38c4bc0b0843e8a97c2aeeed0534885b783582ba289031
MD5 e5da881a318983687a88384c1292625b
BLAKE2b-256 8e4cbc49526637b432f613d34f33623b5f291f1db1a70bf6014763bf6d37e817

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.7.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.7.0-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for feral_solver-0.7.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c0679ab07d4c43b98d36735ccaaa01ffafa94684966fc4b61ee34c2c4e63ced6
MD5 f229e2b1c83a216e656cb2dd4c79c25e
BLAKE2b-256 73d871e256d10db86ad89a60413b91a9efe38afcce7fdd32ecaa9b8cb158cbae

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.7.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.7.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for feral_solver-0.7.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 859dfca2a6446ee4768e1b1f74dcdc968d1f4ca5f40ed8ce621d35cd06c207b8
MD5 9bea3feb0fb88faff23fe0b6f6aaaf63
BLAKE2b-256 a91ca100af57f74b0ab1d29e61fcde9cce15a580a64eb8c5569ac81b6828815b

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.7.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.7.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.7.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 ed3c3cdbd4f7914aa317f2803eda469d5afb91528819c16ad5acd62a9d8561f3
MD5 ee7e18a742f0b7761b003fd2d8ae2655
BLAKE2b-256 1d6b14dbd4c78bb4882b92f2d175ea8802cc07123896a26fabd0eb82382c7de3

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.7.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