0.2.2 — keep the whole Savile Row .info, and report the effective registry
Two additions, both about not throwing away information the pipeline already
had. Additive: no existing field changes name or meaning.
Installation
pip install --upgrade solver-support
Python 3.9 or newer. Runtime dependencies are psutil and PyYAML only.
Added
- The whole of each horizon's Savile Row
.infofile, recorded verbatim on
the phase undersolver_stats['savilerow_info'](#1). Previously two fields
were renamed out of it and everything else discarded, so a consumer wanting the
encoding size, the search-effort counters, or the outcome flags had to re-parse
the files — which depends on the run's output directory rather than its
summary, and so stops working once those files are cleaned up. The two renamed
times,savilerow_timeandsolver_time, are unchanged. ModelRegistry.effective_config(resolved=False)and
dump_config(resolved=False, header=True), reporting the configuration
actually in force — the deep merge of the bundled config and any user override
— plusconfig_sources, the files that produced it. Intended for a
consumer'sshow-registry-style command.resolved=Truewrites out defaults a
builder supplies for an absent key, notably a savilerow solver's implicit
backend: sat, which is the one setting nothing in the config file states.
Notes
savilerow_info is nested, not flattened, because solver_stats is the
core's normalised cross-solver vocabulary while these are one solver's own keys
in its own spelling. It is verbatim, not curated, because the backends
disagree about which keys exist: measured on one model, Minion alone emits
SolverSetupTime / SolverSolveTime / SolverSolutionsFound, the FlatZinc
backends alone SolverTotalWallTime, kissat alone SATVars / SATClauses, and
SolverNodes is absent only from OR-Tools. Four backends give four different key
sets, so any allow-list would already be wrong. The full table is in
docs/timing-model.md.
dump_config is a view, not a config generator. Comments are not preserved,
and user overrides are deep-merged — so adopting a whole dump as an override
would pin every key at today's value and silently shadow later changes. The
emitted header says so. A partial override, carrying only the keys being changed,
is the supported shape.
SolverSatisfiable is not yet promoted to a first-class field. It is the
strongest candidate — every backend emits it, and it separates a refuted horizon
from one that gave up — but its name must not suggest problem-level unsat, which
a bounded model cannot prove.
Alpha: the API may still shift between 0.x releases.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com