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.6.0.tar.gz (599.5 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.6.0-cp310-abi3-win_amd64.whl (612.1 kB view details)

Uploaded CPython 3.10+Windows x86-64

feral_solver-0.6.0-cp310-abi3-manylinux_2_28_aarch64.whl (647.2 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

feral_solver-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (722.7 kB view details)

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

feral_solver-0.6.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.6.0.tar.gz.

File metadata

  • Download URL: feral_solver-0.6.0.tar.gz
  • Upload date:
  • Size: 599.5 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.6.0.tar.gz
Algorithm Hash digest
SHA256 25d9016e86150a95dae62924f24b6ebc08637b54bbb6129afa5e26c25c5bfb17
MD5 5e41e5244721637a5bc3b6d5ba572941
BLAKE2b-256 3819bf5f6a6a02d117350173462803c1993c34f3a5e5dd71c03ada4f910236c9

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: feral_solver-0.6.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 612.1 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.6.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 27817d62a86dd4402620b37894b62c793cd61aabc5d7ce5c79be78184dfc616c
MD5 d4c7eb2c13380fe4a971bb01d8e10a4b
BLAKE2b-256 8197c8f464f6d5c59ea1ada6e0f3a418cb119ed11915a0bd03888c5e7511c375

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for feral_solver-0.6.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ca37912f445e2292447d903ae61b4953ac8f4d383d48dc370158f58a3ba2518f
MD5 295b07791ebf37f08d830c5f6bb6a8e4
BLAKE2b-256 7cd872f8f74805ad8da8ed0c6b3c9a88856fd619c47042522ff7c37b96519312

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for feral_solver-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 87681a15023fcb0e30a21b4034598b688d18b31cb7085d3e0890447e0eae36e9
MD5 e8e2eee526d68013c6ccadb81272afeb
BLAKE2b-256 2c37afa378707f30135fd54693ad35f1d1dce87a14cc2647ecbc46d59a083b54

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.6.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.6.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.6.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 147a45dd65c2ac93aa480ec319a57ac2e13e796236da498694853030f52d387d
MD5 48835cf02998e8a0b2cfb92eaf3ed5c2
BLAKE2b-256 85d59c0ba05dc363e01824b0b87505f6de8d8ab23abeff2b2ee19ff12186f471

See more details on using hashes here.

Provenance

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