Skip to content

Commit a1abd02

Browse files
committed
Preprocessing decision preferences
1 parent 9ea472e commit a1abd02

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

src/api/MainSolver.cc

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ sstat MainSolver::simplifyFormulas() {
184184
if (status == s_False) { break; }
185185

186186
for (PTRef pref : decisionPreferences.scope(i)) {
187-
giveDecisionPreferenceToSMTSolver(pref, frameId);
187+
giveDecisionPreferenceToSMTSolver(pref, frameId, context);
188188
}
189189
}
190190

@@ -346,15 +346,15 @@ PTRef MainSolver::rewriteMaxArity(PTRef root) {
346346
return opensmt::rewriteMaxArityClassic(logic, root);
347347
}
348348

349-
void MainSolver::giveDecisionPreferenceToSMTSolver(PTRef pref, FrameId frameId) {
349+
void MainSolver::giveDecisionPreferenceToSMTSolver(PTRef pref, FrameId frameId, PreprocessingContext const & pcontext) {
350350
assert(logic.getSortRef(pref) == logic.getSort_bool());
351351
assert(not logic.isConstant(pref));
352352

353353
// Ignores substitutions ..
354354
Lit l = [&] {
355355
if (term_mapper->hasLit(pref)) { return giveExistingDecisionPreferenceToSMTSolver(pref); }
356356
if (logic.isBoolVarLiteral(pref)) { return giveBoolVarDecisionPreferenceToSMTSolver(pref); }
357-
return giveAnyDecisionPreferenceToSMTSolver(pref, frameId);
357+
return giveAnyDecisionPreferenceToSMTSolver(pref, frameId, pcontext);
358358
}();
359359

360360
smt_solver->pushUserBranchLit(l);
@@ -380,17 +380,25 @@ Lit MainSolver::giveBoolVarDecisionPreferenceToSMTSolver(PTRef pref) {
380380
return l;
381381
}
382382

383-
Lit MainSolver::giveAnyDecisionPreferenceToSMTSolver(PTRef pref, FrameId frameId) {
383+
Lit MainSolver::giveAnyDecisionPreferenceToSMTSolver(PTRef pref, FrameId frameId,
384+
PreprocessingContext const & pcontext) {
384385
assert(not term_mapper->hasLit(pref));
385386
assert(not logic.isBoolVarLiteral(pref));
386387

388+
// Cannot preprocess pref unconditionally - may result in a conflict
389+
387390
auto name = std::string{".pref"} + std::to_string(pref.x);
388391
PTRef decisionVarTerm = logic.mkBoolVar(name.c_str());
389392
Lit l = term_mapper->getOrCreateLit(decisionVarTerm);
390393
PTRef condTerm = logic.mkImpl(decisionVarTerm, pref);
394+
PTRef processed = preprocessFormula(condTerm, pcontext);
395+
assert(not logic.isConstant(processed));
396+
assert(not logic.isBoolVarLiteral(processed));
397+
391398
[[maybe_unused]]
392-
sstat status = giveToSolver(condTerm, frameId);
399+
sstat status = giveToSolver(processed, frameId);
393400
assert(status == s_Undef);
401+
394402
assert(term_mapper->getLit(decisionVarTerm) == l);
395403
assert(term_mapper->getVar(decisionVarTerm) == var(l));
396404

src/api/MainSolver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,10 @@ class MainSolver {
307307

308308
PTRef rewriteMaxArity(PTRef root);
309309

310-
void giveDecisionPreferenceToSMTSolver(PTRef, FrameId);
310+
void giveDecisionPreferenceToSMTSolver(PTRef, FrameId, PreprocessingContext const &);
311311
Lit giveExistingDecisionPreferenceToSMTSolver(PTRef);
312312
Lit giveBoolVarDecisionPreferenceToSMTSolver(PTRef);
313-
Lit giveAnyDecisionPreferenceToSMTSolver(PTRef, FrameId);
313+
Lit giveAnyDecisionPreferenceToSMTSolver(PTRef, FrameId, PreprocessingContext const &);
314314

315315
virtual sstat solve_(vec<FrameId> const & enabledFrames);
316316

0 commit comments

Comments
 (0)