mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 09:35:32 +00:00
adding dump facility for cancelation #2095, easing dimacs in/out
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
f7746e2284
commit
498864c582
28 changed files with 653 additions and 518 deletions
|
@ -16,5 +16,7 @@ z3_add_component(solver
|
|||
PYG_FILES
|
||||
combined_solver_params.pyg
|
||||
parallel_params.pyg
|
||||
PYG_FILES
|
||||
solver_params.pyg
|
||||
|
||||
)
|
||||
|
|
|
@ -218,7 +218,7 @@ public:
|
|||
return l_undef;
|
||||
}
|
||||
|
||||
lbool check_sat(unsigned num_assumptions, expr * const * assumptions) override {
|
||||
lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override {
|
||||
m_check_sat_executed = true;
|
||||
m_use_solver1_results = false;
|
||||
|
||||
|
@ -227,13 +227,13 @@ public:
|
|||
m_ignore_solver1) {
|
||||
// must use incremental solver
|
||||
switch_inc_mode();
|
||||
return m_solver2->check_sat(num_assumptions, assumptions);
|
||||
return m_solver2->check_sat_core(num_assumptions, assumptions);
|
||||
}
|
||||
|
||||
if (m_inc_mode) {
|
||||
if (m_inc_timeout == UINT_MAX) {
|
||||
IF_VERBOSE(PS_VB_LVL, verbose_stream() << "(combined-solver \"using solver 2 (without a timeout)\")\n";);
|
||||
lbool r = m_solver2->check_sat(num_assumptions, assumptions);
|
||||
lbool r = m_solver2->check_sat_core(num_assumptions, assumptions);
|
||||
if (r != l_undef || !use_solver1_when_undef() || get_manager().canceled()) {
|
||||
return r;
|
||||
}
|
||||
|
@ -244,7 +244,7 @@ public:
|
|||
lbool r = l_undef;
|
||||
try {
|
||||
scoped_timer timer(m_inc_timeout, &eh);
|
||||
r = m_solver2->check_sat(num_assumptions, assumptions);
|
||||
r = m_solver2->check_sat_core(num_assumptions, assumptions);
|
||||
}
|
||||
catch (z3_exception&) {
|
||||
if (!eh.m_canceled) {
|
||||
|
@ -260,7 +260,7 @@ public:
|
|||
|
||||
IF_VERBOSE(PS_VB_LVL, verbose_stream() << "(combined-solver \"using solver 1\")\n";);
|
||||
m_use_solver1_results = true;
|
||||
return m_solver1->check_sat(num_assumptions, assumptions);
|
||||
return m_solver1->check_sat_core(num_assumptions, assumptions);
|
||||
}
|
||||
|
||||
void set_progress_callback(progress_callback * callback) override {
|
||||
|
|
|
@ -3,7 +3,7 @@ Copyright (c) 2011 Microsoft Corporation
|
|||
|
||||
Module Name:
|
||||
|
||||
solver.h
|
||||
solver.cpp
|
||||
|
||||
Abstract:
|
||||
|
||||
|
@ -21,25 +21,25 @@ Notes:
|
|||
#include "ast/ast_util.h"
|
||||
#include "ast/ast_pp.h"
|
||||
#include "ast/ast_pp_util.h"
|
||||
#include "ast/display_dimacs.h"
|
||||
#include "tactic/model_converter.h"
|
||||
#include "solver/solver.h"
|
||||
#include "solver/solver_params.hpp"
|
||||
#include "model/model_evaluator.h"
|
||||
|
||||
|
||||
unsigned solver::get_num_assertions() const {
|
||||
NOT_IMPLEMENTED_YET();
|
||||
UNREACHABLE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
expr * solver::get_assertion(unsigned idx) const {
|
||||
NOT_IMPLEMENTED_YET();
|
||||
UNREACHABLE();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::ostream& solver::display(std::ostream & out, unsigned n, expr* const* assumptions) const {
|
||||
expr_ref_vector fmls(get_manager());
|
||||
stopwatch sw;
|
||||
sw.start();
|
||||
get_assertions(fmls);
|
||||
ast_pp_util visitor(get_manager());
|
||||
model_converter_ref mc = get_model_converter();
|
||||
|
@ -57,6 +57,12 @@ std::ostream& solver::display(std::ostream & out, unsigned n, expr* const* assum
|
|||
return out;
|
||||
}
|
||||
|
||||
std::ostream& solver::display_dimacs(std::ostream& out) const {
|
||||
expr_ref_vector fmls(get_manager());
|
||||
get_assertions(fmls);
|
||||
return ::display_dimacs(out, fmls);
|
||||
}
|
||||
|
||||
void solver::get_assertions(expr_ref_vector& fmls) const {
|
||||
unsigned sz = get_num_assertions();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
|
@ -232,12 +238,16 @@ void solver::collect_param_descrs(param_descrs & r) {
|
|||
|
||||
void solver::reset_params(params_ref const & p) {
|
||||
m_params = p;
|
||||
m_enforce_model_conversion = m_params.get_bool("solver.enforce_model_conversion", false);
|
||||
solver_params sp(m_params);
|
||||
m_enforce_model_conversion = sp.enforce_model_conversion();
|
||||
m_cancel_backup_file = sp.cancel_backup_file();
|
||||
}
|
||||
|
||||
void solver::updt_params(params_ref const & p) {
|
||||
m_params.copy(p);
|
||||
m_enforce_model_conversion = m_params.get_bool("solver.enforce_model_conversion", false);
|
||||
solver_params sp(m_params);
|
||||
m_enforce_model_conversion = sp.enforce_model_conversion();
|
||||
m_cancel_backup_file = sp.cancel_backup_file();
|
||||
}
|
||||
|
||||
|
||||
|
@ -309,3 +319,28 @@ expr_ref_vector solver::get_non_units(ast_manager& m) {
|
|||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
lbool solver::check_sat(unsigned num_assumptions, expr * const * assumptions) {
|
||||
lbool r = l_undef;
|
||||
try {
|
||||
r = check_sat_core(num_assumptions, assumptions);
|
||||
}
|
||||
catch (...) {
|
||||
if (get_manager().canceled()) {
|
||||
dump_state(num_assumptions, assumptions);
|
||||
}
|
||||
throw;
|
||||
}
|
||||
if (r == l_undef && get_manager().canceled()) {
|
||||
dump_state(num_assumptions, assumptions);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
void solver::dump_state(unsigned sz, expr* const* assumptions) {
|
||||
std::string file = m_cancel_backup_file.str();
|
||||
if (file != "") {
|
||||
std::ofstream ous(file);
|
||||
display(ous, sz, assumptions);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,8 +44,9 @@ public:
|
|||
- results based on check_sat_result API
|
||||
*/
|
||||
class solver : public check_sat_result {
|
||||
params_ref m_params;
|
||||
bool m_enforce_model_conversion;
|
||||
params_ref m_params;
|
||||
bool m_enforce_model_conversion;
|
||||
symbol m_cancel_backup_file;
|
||||
public:
|
||||
solver(): m_enforce_model_conversion(false) {}
|
||||
~solver() override {}
|
||||
|
@ -140,7 +141,8 @@ public:
|
|||
|
||||
If it is unsatisfiable, and unsat-core generation is enabled. Then, the unsat-core is a subset of these assumptions.
|
||||
*/
|
||||
virtual lbool check_sat(unsigned num_assumptions, expr * const * assumptions) = 0;
|
||||
|
||||
lbool check_sat(unsigned num_assumptions, expr * const * assumptions);
|
||||
|
||||
lbool check_sat(expr_ref_vector const& asms) { return check_sat(asms.size(), asms.c_ptr()); }
|
||||
|
||||
|
@ -227,6 +229,11 @@ public:
|
|||
*/
|
||||
virtual std::ostream& display(std::ostream & out, unsigned n = 0, expr* const* assumptions = nullptr) const;
|
||||
|
||||
/**
|
||||
\brief Display the content of this solver in DIMACS format
|
||||
*/
|
||||
std::ostream& display_dimacs(std::ostream & out) const;
|
||||
|
||||
/**
|
||||
\brief expose model converter when solver produces partially reduced set of assertions.
|
||||
*/
|
||||
|
@ -249,14 +256,17 @@ public:
|
|||
void disable_pop() { m_nopop = true; }
|
||||
};
|
||||
|
||||
virtual lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) = 0;
|
||||
|
||||
protected:
|
||||
|
||||
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences);
|
||||
|
||||
void dump_state(unsigned sz, expr* const* assumptions);
|
||||
|
||||
bool is_literal(ast_manager& m, expr* e);
|
||||
|
||||
|
||||
};
|
||||
|
||||
typedef ref<solver> solver_ref;
|
||||
|
|
|
@ -61,10 +61,10 @@ struct append_assumptions {
|
|||
}
|
||||
};
|
||||
|
||||
lbool solver_na2as::check_sat(unsigned num_assumptions, expr * const * assumptions) {
|
||||
lbool solver_na2as::check_sat_core(unsigned num_assumptions, expr * const * assumptions) {
|
||||
append_assumptions app(m_assumptions, num_assumptions, assumptions);
|
||||
TRACE("solver_na2as", display(tout););
|
||||
return check_sat_core(m_assumptions.size(), m_assumptions.c_ptr());
|
||||
return check_sat_core2(m_assumptions.size(), m_assumptions.c_ptr());
|
||||
}
|
||||
|
||||
lbool solver_na2as::check_sat_cc(const expr_ref_vector &assumptions, vector<expr_ref_vector> const &clauses) {
|
||||
|
|
|
@ -35,10 +35,9 @@ public:
|
|||
~solver_na2as() override;
|
||||
|
||||
void assert_expr_core2(expr * t, expr * a) override;
|
||||
// virtual void assert_expr_core(expr * t) = 0;
|
||||
|
||||
// Subclasses of solver_na2as should redefine the following *_core methods instead of these ones.
|
||||
lbool check_sat(unsigned num_assumptions, expr * const * assumptions) override;
|
||||
lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override;
|
||||
lbool check_sat_cc(const expr_ref_vector &assumptions, vector<expr_ref_vector> const &clauses) override;
|
||||
void push() override;
|
||||
void pop(unsigned n) override;
|
||||
|
@ -49,7 +48,7 @@ public:
|
|||
lbool get_consequences(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) override;
|
||||
lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) override;
|
||||
protected:
|
||||
virtual lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) = 0;
|
||||
virtual lbool check_sat_core2(unsigned num_assumptions, expr * const * assumptions) = 0;
|
||||
virtual lbool check_sat_cc_core(const expr_ref_vector &assumptions, vector<expr_ref_vector> const &clauses) { NOT_IMPLEMENTED_YET(); }
|
||||
virtual void push_core() = 0;
|
||||
virtual void pop_core(unsigned n) = 0;
|
||||
|
|
8
src/solver/solver_params.pyg
Normal file
8
src/solver/solver_params.pyg
Normal file
|
@ -0,0 +1,8 @@
|
|||
|
||||
def_module_params('solver',
|
||||
description='solver parameters',
|
||||
export=True,
|
||||
params=(('enforce_model_conversion', BOOL, False, "apply model transformation on new assertions"),
|
||||
('cancel_backup_file', SYMBOL, '', "file to save partial search state if search is canceled"),
|
||||
))
|
||||
|
|
@ -119,7 +119,7 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override {
|
||||
lbool check_sat_core2(unsigned num_assumptions, expr * const * assumptions) override {
|
||||
SASSERT(!m_pushed || get_scope_level() > 0);
|
||||
m_proof.reset();
|
||||
scoped_watch _t_(m_pool.m_check_watch);
|
||||
|
|
|
@ -62,7 +62,7 @@ public:
|
|||
|
||||
void push_core() override;
|
||||
void pop_core(unsigned n) override;
|
||||
lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override;
|
||||
lbool check_sat_core2(unsigned num_assumptions, expr * const * assumptions) override;
|
||||
|
||||
void collect_statistics(statistics & st) const override;
|
||||
void get_unsat_core(expr_ref_vector & r) override;
|
||||
|
@ -136,7 +136,7 @@ void tactic2solver::pop_core(unsigned n) {
|
|||
m_result = nullptr;
|
||||
}
|
||||
|
||||
lbool tactic2solver::check_sat_core(unsigned num_assumptions, expr * const * assumptions) {
|
||||
lbool tactic2solver::check_sat_core2(unsigned num_assumptions, expr * const * assumptions) {
|
||||
if (m_tactic.get() == nullptr)
|
||||
return l_false;
|
||||
ast_manager & m = m_assertions.m();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue