pounce-feral
POUNCE's default sparse symmetric LDLᵀ backend, built on the pure-Rust
FERAL library. Implements
SparseSymLinearSolverInterface so the upstream
TSymLinearSolver wrapper requires no changes versus the MA57 path.
This crate is what makes the default POUNCE build pure Rust — no Fortran, no HSL, no system BLAS required.
Lifecycle
The wrapper mirrors pounce-hsl::Ma57SolverInterface:
matrix_format()returnsEMatrixFormat::TripletFormat(1-based, lower-triangle COO).initialize_structurecaches 0-based row/col arrays and allocates the values buffer; the upper-triangle entries that POUNCE's KKT assembly emits are canonicalized to the lower triangle here, because FERAL'sCscMatrix::from_tripletssilently drops upper-triangle entries during LDLᵀ.multi_solverebuilds the CSC matrix from the cached pattern + caller-filled values, then dispatches toferal::Solver::factor/solve_many. FERAL's pattern-fingerprint cache reuses the symbolic factorization across iterates with identical structure — the IPM common case.increase_qualitydelegates toferal::Solver::increase_qualityand uses MA57'spivtol_changed/CallAgainprotocol so the upper-layer reload-and-retry semantics line up.
When to use FERAL vs MA57
FERAL is the default. MA57 is generally faster for very large sparse
KKT systems (≳ 50k variables) and remains the option of choice when
libcoinhsl is available; enable it with --features ma57 on
pounce-cli. See benchmarks/BENCHMARK_REPORT.md for a head-to-head
comparison across the .nl benchmark suites.
License
EPL-2.0.