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

Uploaded CPython 3.10+Windows x86-64

feral_solver-0.5.0-cp310-abi3-manylinux_2_28_aarch64.whl (647.8 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

feral_solver-0.5.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (722.3 kB view details)

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

feral_solver-0.5.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.5.0.tar.gz.

File metadata

  • Download URL: feral_solver-0.5.0.tar.gz
  • Upload date:
  • Size: 590.7 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.5.0.tar.gz
Algorithm Hash digest
SHA256 a378615270a9f0edfc3187a80cea72e1a9388733d0cbf1f7d52d831a170e903e
MD5 ed8247ee8712012bf817dd3d276dca04
BLAKE2b-256 acb711a8d9d368fe4527607b6e871d94cc21c9277cfd5a66ead35acc51c98fc2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: feral_solver-0.5.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.5.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 85329b431d19820f4d2165bc72de8e77a551b72e40ca65e70e1c8c784ff59fdf
MD5 1fc0607d229bd3907adb4a7bbe3c9971
BLAKE2b-256 e07fb1e1fc32be5f5590f71cf8618809660fb080bff8742d28298773345ac021

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for feral_solver-0.5.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 634bdcef54f041852bcb12c61a34de33e83195bcfef24cd8e498aada3ad77c6e
MD5 c6da97cc84332687e154517bb8de5f07
BLAKE2b-256 244ba35a3c8d06e9233c975cfab1a87e17f6799bb83431a09f0b8e8518f3e672

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for feral_solver-0.5.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f94fb0f62bcbb5fb23b2bd127a54b5134275f46c72b91f7ed1f41b87ff7ae5c
MD5 21cf38fdefe09d1af603f5a2562f70ff
BLAKE2b-256 74764f568d98563c43d452d45909b32c4c5fc26b40251532b2d421deeb6b36dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for feral_solver-0.5.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.5.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.5.0-cp310-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 e086c059f966f10388e62c286e5b7e6826336de2a0e5d303d3b21c5d664f3501
MD5 06540c39c45141f248d29625b3027b4f
BLAKE2b-256 d66117431be0612a841b98bf4ed597db215efeeed8a70756a83229cbd5b7026d

See more details on using hashes here.

Provenance

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