3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-15 13:28:47 +00:00
This commit is contained in:
Nikolaj Bjorner 2017-11-09 09:55:41 -08:00
commit ee3ed3a27a
21 changed files with 47 additions and 34 deletions

View file

@ -529,9 +529,9 @@ extern "C" {
Z3_CATCH_RETURN(Z3_L_UNDEF); Z3_CATCH_RETURN(Z3_L_UNDEF);
} }
Z3_ast Z3_API Z3_solver_cube(Z3_context c, Z3_solver s) { Z3_ast Z3_API Z3_solver_cube(Z3_context c, Z3_solver s, unsigned cutoff) {
Z3_TRY; Z3_TRY;
LOG_Z3_solver_cube(c, s); LOG_Z3_solver_cube(c, s, cutoff);
ast_manager& m = mk_c(c)->m(); ast_manager& m = mk_c(c)->m();
expr_ref result(m); expr_ref result(m);
unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout()); unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
@ -544,7 +544,7 @@ extern "C" {
scoped_timer timer(timeout, &eh); scoped_timer timer(timeout, &eh);
scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit); scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit);
try { try {
result = to_solver_ref(s)->cube(); result = to_solver_ref(s)->cube(cutoff);
} }
catch (z3_exception & ex) { catch (z3_exception & ex) {
mk_c(c)->handle_exception(ex); mk_c(c)->handle_exception(ex);

View file

@ -353,6 +353,12 @@ namespace Microsoft.Z3
} }
} }
/// <summary>
/// Backtrack level that can be adjusted by conquer process
/// </summary>
public uint BacktrackLevel { get; set; }
/// <summary> /// <summary>
/// Return a set of cubes. /// Return a set of cubes.
/// </summary> /// </summary>
@ -360,10 +366,8 @@ namespace Microsoft.Z3
{ {
int rounds = 0; int rounds = 0;
while (true) { while (true) {
BoolExpr r = (BoolExpr)Expr.Create(Context, Native.Z3_solver_cube(Context.nCtx, NativeObject)); BoolExpr r = (BoolExpr)Expr.Create(Context, Native.Z3_solver_cube(Context.nCtx, NativeObject, BacktrackLevel));
if (r.IsFalse) { if (r.IsFalse) {
if (rounds == 0)
yield return r;
break; break;
} }
if (r.IsTrue) { if (r.IsTrue) {
@ -412,6 +416,7 @@ namespace Microsoft.Z3
: base(ctx, obj) : base(ctx, obj)
{ {
Contract.Requires(ctx != null); Contract.Requires(ctx != null);
this.BacktrackLevel = uint.MaxValue;
} }
internal class DecRefQueue : IDecRefQueue internal class DecRefQueue : IDecRefQueue

View file

@ -5988,6 +5988,7 @@ class Solver(Z3PPObject):
def __init__(self, solver=None, ctx=None): def __init__(self, solver=None, ctx=None):
assert solver is None or ctx is not None assert solver is None or ctx is not None
self.ctx = _get_ctx(ctx) self.ctx = _get_ctx(ctx)
self.backtrack_level = 4000000000
self.solver = None self.solver = None
if solver is None: if solver is None:
self.solver = Z3_mk_solver(self.ctx.ref()) self.solver = Z3_mk_solver(self.ctx.ref())
@ -6285,17 +6286,13 @@ class Solver(Z3PPObject):
def cube(self): def cube(self):
"""Get set of cubes""" """Get set of cubes"""
rounds = 0
while True: while True:
r = _to_expr_ref(Z3_solver_cube(self.ctx.ref(), self.solver), self.ctx) r = _to_expr_ref(Z3_solver_cube(self.ctx.ref(), self.solver, self.backtrack_level), self.ctx)
if (is_false(r)): if (is_false(r)):
if (rounds == 0):
yield r
return return
if (is_true(r)): if (is_true(r)):
yield r yield r
return return
rounds += 1
yield r yield r
def proof(self): def proof(self):

View file

@ -6232,10 +6232,13 @@ extern "C" {
The number of (non-constant) cubes is by default 1. For the sat solver cubing is controlled The number of (non-constant) cubes is by default 1. For the sat solver cubing is controlled
using parameters sat.lookahead.cube.cutoff and sat.lookahead.cube.fraction. using parameters sat.lookahead.cube.cutoff and sat.lookahead.cube.fraction.
def_API('Z3_solver_cube', AST, (_in(CONTEXT), _in(SOLVER))) The last argument is a backtracking level. It instructs the cube process to backtrack below
the indicated level for the next cube.
def_API('Z3_solver_cube', AST, (_in(CONTEXT), _in(SOLVER), _in(UINT)))
*/ */
Z3_ast Z3_API Z3_solver_cube(Z3_context c, Z3_solver s); Z3_ast Z3_API Z3_solver_cube(Z3_context c, Z3_solver s, unsigned backtrack_level);
/** /**
\brief Retrieve the model for the last #Z3_solver_check or #Z3_solver_check_assumptions \brief Retrieve the model for the last #Z3_solver_check or #Z3_solver_check_assumptions

View file

@ -119,7 +119,7 @@ public:
{NOT_IMPLEMENTED_YET();} {NOT_IMPLEMENTED_YET();}
virtual void assert_lemma(expr* e) { NOT_IMPLEMENTED_YET(); } virtual void assert_lemma(expr* e) { NOT_IMPLEMENTED_YET(); }
virtual expr_ref lookahead(const expr_ref_vector &,const expr_ref_vector &) { return expr_ref(m.mk_true(), m); } virtual expr_ref lookahead(const expr_ref_vector &,const expr_ref_vector &) { return expr_ref(m.mk_true(), m); }
virtual expr_ref cube() { return expr_ref(m.mk_true(), m); } virtual expr_ref cube(unsigned) { return expr_ref(m.mk_true(), m); }
virtual void push(); virtual void push();

View file

@ -94,7 +94,7 @@ public:
virtual void reset(); virtual void reset();
virtual void set_progress_callback(progress_callback *callback) {UNREACHABLE();} virtual void set_progress_callback(progress_callback *callback) {UNREACHABLE();}
virtual expr_ref cube() { return expr_ref(m.mk_true(), m); } virtual expr_ref cube(unsigned) { return expr_ref(m.mk_true(), m); }
virtual solver *translate(ast_manager &m, params_ref const &p); virtual solver *translate(ast_manager &m, params_ref const &p);

View file

@ -108,7 +108,7 @@ namespace opt {
virtual ast_manager& get_manager() const { return m; } virtual ast_manager& get_manager() const { return m; }
virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes); virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes);
virtual lbool preferred_sat(expr_ref_vector const& asms, vector<expr_ref_vector>& cores); virtual lbool preferred_sat(expr_ref_vector const& asms, vector<expr_ref_vector>& cores);
virtual expr_ref cube() { return expr_ref(m.mk_true(), m); } virtual expr_ref cube(unsigned) { return expr_ref(m.mk_true(), m); }
void set_logic(symbol const& logic); void set_logic(symbol const& logic);
smt::theory_var add_objective(app* term); smt::theory_var add_objective(app* term);

View file

@ -1964,7 +1964,7 @@ namespace sat {
bool_var_vector vars; bool_var_vector vars;
for (bool_var v : m_freevars) vars.push_back(v); for (bool_var v : m_freevars) vars.push_back(v);
while (true) { while (true) {
lbool result = cube(vars, lits); lbool result = cube(vars, lits, UINT_MAX);
if (lits.empty() || result != l_undef) { if (lits.empty() || result != l_undef) {
return l_undef; return l_undef;
} }
@ -1973,7 +1973,7 @@ namespace sat {
return l_undef; return l_undef;
} }
lbool lookahead::cube(bool_var_vector const& vars, literal_vector& lits) { lbool lookahead::cube(bool_var_vector const& vars, literal_vector& lits, unsigned backtrack_level) {
scoped_ext _scoped_ext(*this); scoped_ext _scoped_ext(*this);
lits.reset(); lits.reset();
m_select_lookahead_vars.reset(); m_select_lookahead_vars.reset();
@ -2006,6 +2006,14 @@ namespace sat {
continue; continue;
} }
pick_up_work: pick_up_work:
if (m_cube_state.m_cube.size() >= backtrack_level) {
IF_VERBOSE(10, verbose_stream() << "(sat-cube :cube: " << m_cube_state.m_cube.size() << " :backtrack_level " << backtrack_level << ")\n";);
while (m_cube_state.m_cube.size() >= backtrack_level) {
set_conflict();
backtrack(m_cube_state.m_cube, m_cube_state.m_is_decision);
}
}
backtrack_level = UINT_MAX;
depth = m_cube_state.m_cube.size(); depth = m_cube_state.m_cube.size();
if ((m_config.m_cube_cutoff != 0 && depth == m_config.m_cube_cutoff) || if ((m_config.m_cube_cutoff != 0 && depth == m_config.m_cube_cutoff) ||
(m_config.m_cube_cutoff == 0 && m_freevars.size() < m_cube_state.m_freevars_threshold)) { (m_config.m_cube_cutoff == 0 && m_freevars.size() < m_cube_state.m_freevars_threshold)) {

View file

@ -567,7 +567,7 @@ namespace sat {
lbool cube(); lbool cube();
lbool cube(bool_var_vector const& vars, literal_vector& lits); lbool cube(bool_var_vector const& vars, literal_vector& lits, unsigned backtrack_level);
literal select_lookahead(literal_vector const& assumptions, bool_var_vector const& vars); literal select_lookahead(literal_vector const& assumptions, bool_var_vector const& vars);
/** /**

View file

@ -837,11 +837,11 @@ namespace sat {
return lh.select_lookahead(assumptions, vars); return lh.select_lookahead(assumptions, vars);
} }
lbool solver::cube(bool_var_vector const& vars, literal_vector& lits) { lbool solver::cube(bool_var_vector const& vars, literal_vector& lits, unsigned backtrack_level) {
if (!m_cuber) { if (!m_cuber) {
m_cuber = alloc(lookahead, *this); m_cuber = alloc(lookahead, *this);
} }
lbool result = m_cuber->cube(vars, lits); lbool result = m_cuber->cube(vars, lits, backtrack_level);
if (result == l_false) { if (result == l_false) {
dealloc(m_cuber); dealloc(m_cuber);
m_cuber = nullptr; m_cuber = nullptr;

View file

@ -352,7 +352,7 @@ namespace sat {
bool check_clauses(model const& m) const; bool check_clauses(model const& m) const;
literal select_lookahead(literal_vector const& assumptions, bool_var_vector const& vars); literal select_lookahead(literal_vector const& assumptions, bool_var_vector const& vars);
lbool cube(bool_var_vector const& vars, literal_vector& lits); lbool cube(bool_var_vector const& vars, literal_vector& lits, unsigned backtrack_level);
protected: protected:
unsigned m_conflicts_since_init; unsigned m_conflicts_since_init;

View file

@ -301,7 +301,7 @@ public:
return 0; return 0;
} }
virtual expr_ref cube() { virtual expr_ref cube(unsigned backtrack_level) {
if (!m_internalized) { if (!m_internalized) {
dep2asm_t dep2asm; dep2asm_t dep2asm;
m_model = 0; m_model = 0;
@ -315,7 +315,7 @@ public:
vars.push_back(kv.m_value); vars.push_back(kv.m_value);
} }
sat::literal_vector lits; sat::literal_vector lits;
lbool result = m_solver.cube(vars, lits); lbool result = m_solver.cube(vars, lits, backtrack_level);
if (result == l_false || lits.empty()) { if (result == l_false || lits.empty()) {
return expr_ref(m.mk_false(), m); return expr_ref(m.mk_false(), m);
} }

View file

@ -226,7 +226,7 @@ namespace smt {
return expr_ref(m.mk_true(), m); return expr_ref(m.mk_true(), m);
} }
virtual expr_ref cube() { virtual expr_ref cube(unsigned) {
ast_manager& m = get_manager(); ast_manager& m = get_manager();
return expr_ref(m.mk_true(), m); return expr_ref(m.mk_true(), m);
} }

View file

@ -281,8 +281,8 @@ public:
return m_solver1->get_num_assumptions() + m_solver2->get_num_assumptions(); return m_solver1->get_num_assumptions() + m_solver2->get_num_assumptions();
} }
virtual expr_ref cube() { virtual expr_ref cube(unsigned backtrack_level) {
return m_solver1->cube(); return m_solver1->cube(backtrack_level);
} }
virtual expr * get_assumption(unsigned idx) const { virtual expr * get_assumption(unsigned idx) const {

View file

@ -189,7 +189,7 @@ public:
\brief extract a lookahead candidates for branching. \brief extract a lookahead candidates for branching.
*/ */
virtual expr_ref cube() = 0; virtual expr_ref cube(unsigned backtrack_level) = 0;
/** /**
\brief Display the content of this solver. \brief Display the content of this solver.

View file

@ -223,7 +223,7 @@ public:
virtual void get_labels(svector<symbol> & r) { return m_base->get_labels(r); } virtual void get_labels(svector<symbol> & r) { return m_base->get_labels(r); }
virtual void set_progress_callback(progress_callback * callback) { m_base->set_progress_callback(callback); } virtual void set_progress_callback(progress_callback * callback) { m_base->set_progress_callback(callback); }
virtual expr_ref cube() { return expr_ref(m.mk_true(), m); } virtual expr_ref cube(unsigned ) { return expr_ref(m.mk_true(), m); }
virtual ast_manager& get_manager() const { return m_base->get_manager(); } virtual ast_manager& get_manager() const { return m_base->get_manager(); }

View file

@ -77,7 +77,7 @@ public:
virtual ast_manager& get_manager() const; virtual ast_manager& get_manager() const;
virtual expr_ref cube() { virtual expr_ref cube(unsigned ) {
ast_manager& m = get_manager(); ast_manager& m = get_manager();
return expr_ref(m.mk_true(), m); return expr_ref(m.mk_true(), m);
} }

View file

@ -163,7 +163,7 @@ public:
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); } virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); } virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); }
virtual ast_manager& get_manager() const { return m; } virtual ast_manager& get_manager() const { return m; }
virtual expr_ref cube() { flush_assertions(); return m_solver->cube(); } virtual expr_ref cube(unsigned backtrack_level) { flush_assertions(); return m_solver->cube(backtrack_level); }
virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) { return m_solver->find_mutexes(vars, mutexes); } virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) { return m_solver->find_mutexes(vars, mutexes); }
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) { virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) {
flush_assertions(); flush_assertions();

View file

@ -113,7 +113,7 @@ public:
virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); } virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); }
virtual ast_manager& get_manager() const { return m; } virtual ast_manager& get_manager() const { return m; }
virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) { return m_solver->find_mutexes(vars, mutexes); } virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) { return m_solver->find_mutexes(vars, mutexes); }
virtual expr_ref cube() { return m_solver->cube(); } virtual expr_ref cube(unsigned backtrack_level) { return m_solver->cube(backtrack_level); }
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) { virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) {
datatype_util dt(m); datatype_util dt(m);

View file

@ -414,7 +414,7 @@ private:
cubes.reset(); cubes.reset();
s.set_cube_params(); s.set_cube_params();
while (true) { while (true) {
expr_ref c = s.get_solver().cube(); expr_ref c = s.get_solver().cube(UINT_MAX); // TBD tune this
VERIFY(c); VERIFY(c);
if (m.is_false(c)) { if (m.is_false(c)) {
break; break;

View file

@ -103,7 +103,7 @@ public:
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); } virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); } virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); }
virtual ast_manager& get_manager() const { return m; } virtual ast_manager& get_manager() const { return m; }
virtual expr_ref cube() { flush_assertions(); return m_solver->cube(); } virtual expr_ref cube(unsigned backtrack_level) { flush_assertions(); return m_solver->cube(backtrack_level); }
virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) { return m_solver->find_mutexes(vars, mutexes); } virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) { return m_solver->find_mutexes(vars, mutexes); }
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) { virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) {
flush_assertions(); flush_assertions();