mirror of
https://github.com/Z3Prover/z3
synced 2025-11-25 23:19:32 +00:00
Add commands for forcing preferences during search
Add commands: (prefer <formula>) - will instruct case split queue to assign formula to true. - prefer commands added within a scope are forgotten after leaving the scope. (reset-preferences) - resets asserted preferences. Has to be invoked at base level. This provides functionality related to MathSAT and based on an ask by Tomáš Kolárik who is integrating the functionality with OpenSMT2
This commit is contained in:
parent
5d8fcaa3ee
commit
0e6b3a922a
6 changed files with 190 additions and 45 deletions
|
|
@ -628,6 +628,7 @@ cmd_context::~cmd_context() {
|
|||
finalize_tactic_manager();
|
||||
m_proof_cmds = nullptr;
|
||||
m_var2values.reset();
|
||||
m_preferred = nullptr;
|
||||
reset(true);
|
||||
m_mcs.reset();
|
||||
m_solver = nullptr;
|
||||
|
|
@ -1518,6 +1519,8 @@ void cmd_context::reset(bool finalize) {
|
|||
m_dt_eh = nullptr;
|
||||
m_std_subst = nullptr;
|
||||
m_rev_subst = nullptr;
|
||||
m_preferred = nullptr;
|
||||
m_var2values.reset();
|
||||
if (m_manager) {
|
||||
dealloc(m_pmanager);
|
||||
m_pmanager = nullptr;
|
||||
|
|
@ -1884,6 +1887,29 @@ void cmd_context::set_initial_value(expr* var, expr* value) {
|
|||
m_var2values.push_back({expr_ref(var, m()), expr_ref(value, m())});
|
||||
}
|
||||
|
||||
void cmd_context::set_preferred(expr* fmla) {
|
||||
if (!m_preferred) {
|
||||
auto p = alloc(preferred_value_propagator, m());
|
||||
m_preferred = p;
|
||||
if (get_solver()) {
|
||||
get_solver()->user_propagate_init(p, p->push_eh, p->pop_eh, p->fresh_eh);
|
||||
get_solver()->user_propagate_register_decide(p->decide_eh);
|
||||
}
|
||||
}
|
||||
m_preferred->set_preferred(fmla);
|
||||
if (get_opt()) {
|
||||
throw default_exception("setting preferred on optimization context is not supported yet");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void cmd_context::reset_preferred() {
|
||||
if (!m_scopes.empty())
|
||||
throw default_exception("reset-preferred can only be invoked at base level");
|
||||
if (m_preferred)
|
||||
m_preferred->reset_preferred();
|
||||
}
|
||||
|
||||
|
||||
void cmd_context::display_model(model_ref& mdl) {
|
||||
if (mdl) {
|
||||
|
|
@ -2261,8 +2287,13 @@ void cmd_context::mk_solver() {
|
|||
m_params.get_solver_params(p, proofs_enabled, models_enabled, unsat_core_enabled);
|
||||
m_solver = (*m_solver_factory)(m(), p, proofs_enabled, models_enabled, unsat_core_enabled, m_logic);
|
||||
m_solver = mk_slice_solver(m_solver.get());
|
||||
if (m_simplifier_factory)
|
||||
if (m_simplifier_factory)
|
||||
m_solver = mk_simplifier_solver(m_solver.get(), &m_simplifier_factory);
|
||||
if (m_preferred) {
|
||||
auto p = m_preferred.get();
|
||||
m_solver->user_propagate_init(p, p->push_eh, p->pop_eh, p->fresh_eh);
|
||||
m_solver->user_propagate_register_decide(p->decide_eh);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue