Skip to content

fix(processor): bound the complete satisfiability solver operation #1108

Description

@doublewhy

Problem

The finite-domain satisfiability adapter can perform up to 32,769 checks. Each check currently rebuilds the entire Z3 variable/constraint graph, and the governed 5-second timeout starts only inside solver.check(). Python-side expression construction and the total multi-check operation are therefore outside the claimed runtime bound.

Decision

Build one deterministic incremental QF_LIA solver session per normalized model. Encode each clause once behind a Boolean assumption, use assumptions for selected clauses and fixed witness indices, and preserve the incumbent initial-decision, lexicographic witness, and sorted-deletion core semantics. Add one monotonic 5-second operation deadline covering model construction, every check, and result selection. Each Z3 call receives only its remaining deadline (capped at 5000 ms); a result returned after the operation deadline is rejected. No partial SAT/UNSAT evidence is emitted.

Acceptance

  • one solver and one expression graph are built per analysis;
  • deterministic SAT witnesses and subset-minimal UNSAT cores remain byte-identical to the incumbent algorithm on generated bounded models;
  • timeout includes Python model construction and all repeated checks;
  • timeout/exhaustion/unknown remain typed operational failures with safe phase, check count/budget, and bounded reason;
  • performance regression covers the published maximum check-count shape without rebuilding solvers;
  • replay and solver-configuration evidence remain compatible.

Requirement: ASR-530. Related: #826, PR #1083.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions