Skip to content

solver-support 0.2.2

Latest

Choose a tag to compare

@github-actions github-actions released this 26 Aug 21:52
· 1 commit to main since this release

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 .info file, recorded verbatim on
    the phase under solver_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_time and solver_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
    — plus config_sources, the files that produced it. Intended for a
    consumer's show-registry-style command. resolved=True writes 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