3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-07-23 23:42:33 +00:00

fix: parallel mode exits unknown immediately for QF_BV due to reason-string mismatch (#10183)

Under `parallel.enable=true`, QF_BV workers that exhaust their per-cube
conflict budget (1000) are misclassified as unrecoverably incomplete,
causing the portfolio to return `unknown` in ~1 second instead of
escalating the budget and continuing.

## Root cause

`parallel_tactical.cpp` only recognizes `"max-conflicts-reached"` (the
`smt::context` spelling) as a signal to escalate the conflict budget.
SAT-core-backed solvers — which QF_BV workers use — report the same
condition as `"sat.max.conflicts"` (from
`sat_solver::reached_max_conflicts()`). The mismatch causes every QF_BV
cube attempt to fall through to `b.set_unknown()` instead of
`update_max_thread_conflicts()`.

## Fix

```diff
- if (reason != "max-conflicts-reached") {
+ if (reason != "max-conflicts-reached" && reason != "sat.max.conflicts") {
```

Both spellings now correctly route to the budget-escalation path. The
parallel `smt_parallel.cpp` path is unaffected — it owns `smt::context`
workers, which can only produce `"max-conflicts-reached"`.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
Copilot 2026-07-21 19:48:55 -07:00 committed by GitHub
parent 35f6b0869a
commit ae190b8b88
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1250,7 +1250,7 @@ class parallel_solver {
// re-checking the same cube would spin forever. Record a sound
// 'unknown' verdict and stop working this branch instead.
std::string reason = s->reason_unknown();
if (reason != "max-conflicts-reached") {
if (reason != "max-conflicts-reached" && reason != "sat.max.conflicts") {
LOG_WORKER(1, " undef cube is not conflict-limited (" << reason << "); reporting unknown\n");
b.set_unknown(reason);
return;