mirror of
https://github.com/Z3Prover/z3
synced 2025-06-20 21:03:39 +00:00
solver factories, cleanup solver API, simplified strategic solver, added combined solver
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
bfe6678ad2
commit
8198e62cbd
22 changed files with 720 additions and 492 deletions
|
@ -582,8 +582,8 @@ void cmd_context::init_manager_core(bool new_manager) {
|
|||
// it prevents clashes with builtin types.
|
||||
insert(pm().mk_plist_decl());
|
||||
}
|
||||
if (m_solver) {
|
||||
init_solver_options(m_solver.get());
|
||||
if (m_solver_factory) {
|
||||
mk_solver();
|
||||
}
|
||||
m_check_logic.set_logic(m(), m_logic);
|
||||
}
|
||||
|
@ -1119,7 +1119,7 @@ void cmd_context::reset(bool finalize) {
|
|||
reset_func_decls();
|
||||
restore_assertions(0);
|
||||
if (m_solver)
|
||||
m_solver->reset();
|
||||
m_solver = 0;
|
||||
m_pp_env = 0;
|
||||
m_dt_eh = 0;
|
||||
if (m_manager) {
|
||||
|
@ -1441,17 +1441,18 @@ void cmd_context::validate_model() {
|
|||
}
|
||||
}
|
||||
|
||||
void cmd_context::init_solver_options(solver * s) {
|
||||
void cmd_context::mk_solver() {
|
||||
bool proofs_enabled, models_enabled, unsat_core_enabled;
|
||||
params_ref p;
|
||||
m_params.init_solver_params(m(), *m_solver, p);
|
||||
m_solver->init(m(), m_logic);
|
||||
m_params.get_solver_params(m(), p, proofs_enabled, models_enabled, unsat_core_enabled);
|
||||
m_solver = (*m_solver_factory)(m(), p, proofs_enabled, models_enabled, unsat_core_enabled, m_logic);
|
||||
}
|
||||
|
||||
void cmd_context::set_solver(solver * s) {
|
||||
void cmd_context::set_solver_factory(solver_factory * f) {
|
||||
m_solver_factory = f;
|
||||
m_check_sat_result = 0;
|
||||
m_solver = s;
|
||||
if (has_manager() && s != 0) {
|
||||
init_solver_options(s);
|
||||
if (has_manager() && f != 0) {
|
||||
mk_solver();
|
||||
// assert formulas and create scopes in the new solver.
|
||||
unsigned lim = 0;
|
||||
svector<scope>::iterator it = m_scopes.begin();
|
||||
|
|
|
@ -185,6 +185,7 @@ protected:
|
|||
};
|
||||
|
||||
svector<scope> m_scopes;
|
||||
scoped_ptr<solver_factory> m_solver_factory;
|
||||
ref<solver> m_solver;
|
||||
ref<check_sat_result> m_check_sat_result;
|
||||
|
||||
|
@ -243,7 +244,7 @@ protected:
|
|||
void print_unsupported_msg() { regular_stream() << "unsupported" << std::endl; }
|
||||
void print_unsupported_info(symbol const& s) { if (s != symbol::null) diagnostic_stream() << "; " << s << std::endl;}
|
||||
|
||||
void init_solver_options(solver * s);
|
||||
void mk_solver();
|
||||
|
||||
public:
|
||||
cmd_context(bool main_ctx = true, ast_manager * m = 0, symbol const & l = symbol::null);
|
||||
|
@ -289,8 +290,7 @@ public:
|
|||
pdecl_manager & pm() const { if (!m_pmanager) const_cast<cmd_context*>(this)->init_manager(); return *m_pmanager; }
|
||||
sexpr_manager & sm() const { if (!m_sexpr_manager) const_cast<cmd_context*>(this)->m_sexpr_manager = alloc(sexpr_manager); return *m_sexpr_manager; }
|
||||
|
||||
void set_solver(solver * s);
|
||||
solver * get_solver() const { return m_solver.get(); }
|
||||
void set_solver_factory(solver_factory * s);
|
||||
void set_check_sat_result(check_sat_result * r) { m_check_sat_result = r; }
|
||||
check_sat_result * get_check_sat_result() const { return m_check_sat_result.get(); }
|
||||
check_sat_state cs_state() const;
|
||||
|
|
|
@ -131,11 +131,11 @@ params_ref context_params::merge_default_params(params_ref const & p) {
|
|||
}
|
||||
}
|
||||
|
||||
void context_params::init_solver_params(ast_manager & m, solver & s, params_ref const & p) {
|
||||
s.set_produce_proofs(m.proofs_enabled() && m_proof);
|
||||
s.set_produce_models(p.get_bool("model", m_model));
|
||||
s.set_produce_unsat_cores(p.get_bool("unsat_core", m_unsat_core));
|
||||
s.updt_params(merge_default_params(p));
|
||||
void context_params::get_solver_params(ast_manager const & m, params_ref & p, bool & proofs_enabled, bool & models_enabled, bool & unsat_core_enabled) {
|
||||
proofs_enabled = m.proofs_enabled() && p.get_bool("proof", m_proof);
|
||||
models_enabled = p.get_bool("model", m_model);
|
||||
unsat_core_enabled = p.get_bool("unsat_core", m_unsat_core);
|
||||
p = merge_default_params(p);
|
||||
}
|
||||
|
||||
ast_manager * context_params::mk_ast_manager() {
|
||||
|
|
|
@ -22,7 +22,6 @@ Notes:
|
|||
|
||||
#include"params.h"
|
||||
class ast_manager;
|
||||
class solver;
|
||||
|
||||
class context_params {
|
||||
void set_bool(bool & opt, char const * param, char const * value);
|
||||
|
@ -50,13 +49,9 @@ public:
|
|||
*/
|
||||
|
||||
/**
|
||||
\brief Goodie for updating the solver params
|
||||
based on the configuration of the context_params object.
|
||||
|
||||
This method is used when creating solvers from the
|
||||
cmd_context and API.
|
||||
\brief Goodies for extracting parameters for creating a solver object.
|
||||
*/
|
||||
void init_solver_params(ast_manager & m, solver & s, params_ref const & p);
|
||||
void get_solver_params(ast_manager const & m, params_ref & p, bool & proofs_enabled, bool & models_enabled, bool & unsat_core_enabled);
|
||||
|
||||
/**
|
||||
\brief Include in p parameters derived from this context_params.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue