mirror of
https://github.com/Z3Prover/z3
synced 2025-08-27 13:39:49 +00:00
remove lazy push from theory_lra
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
9b5dc0ca26
commit
727ea43b16
7 changed files with 71 additions and 61 deletions
|
@ -79,6 +79,7 @@ namespace euf {
|
|||
}
|
||||
|
||||
bool solver::propagate(literal l, ext_constraint_idx idx) {
|
||||
force_push();
|
||||
auto* ext = sat::constraint_base::to_extension(idx);
|
||||
SASSERT(ext != this);
|
||||
return ext->propagate(l, idx);
|
||||
|
@ -101,17 +102,17 @@ namespace euf {
|
|||
// init_ackerman();
|
||||
|
||||
switch (j.kind()) {
|
||||
case constraint::conflict:
|
||||
case constraint::kind_t::conflict:
|
||||
SASSERT(m_egraph.inconsistent());
|
||||
m_egraph.explain<unsigned>(m_explain);
|
||||
break;
|
||||
case constraint::eq:
|
||||
case constraint::kind_t::eq:
|
||||
n = m_var2node[l.var()].first;
|
||||
SASSERT(n);
|
||||
SASSERT(m_egraph.is_equality(n));
|
||||
m_egraph.explain_eq<unsigned>(m_explain, n->get_arg(0), n->get_arg(1), n->commutative());
|
||||
break;
|
||||
case constraint::lit:
|
||||
case constraint::kind_t::lit:
|
||||
p = m_var2node[l.var()];
|
||||
n = p.first;
|
||||
sign = l.sign() != p.second;
|
||||
|
@ -127,8 +128,10 @@ namespace euf {
|
|||
}
|
||||
|
||||
void solver::asserted(literal l) {
|
||||
|
||||
auto* ext = get_solver(l.var());
|
||||
if (ext) {
|
||||
force_push();
|
||||
ext->asserted(l);
|
||||
return;
|
||||
}
|
||||
|
@ -136,6 +139,7 @@ namespace euf {
|
|||
auto p = m_var2node.get(l.var(), enode_bool_pair(nullptr, false));
|
||||
if (!p.first)
|
||||
return;
|
||||
force_push();
|
||||
bool sign = p.second != l.sign();
|
||||
euf::enode* n = p.first;
|
||||
expr* e = n->get_owner();
|
||||
|
@ -152,7 +156,7 @@ namespace euf {
|
|||
propagate();
|
||||
}
|
||||
|
||||
void solver::propagate() {
|
||||
void solver::propagate() {
|
||||
m_egraph.propagate();
|
||||
if (m_egraph.inconsistent()) {
|
||||
s().set_conflict(sat::justification::mk_ext_justification(s().scope_lvl(), conflict_constraint().to_index()));
|
||||
|
@ -196,6 +200,7 @@ namespace euf {
|
|||
}
|
||||
|
||||
sat::check_result solver::check() {
|
||||
force_push();
|
||||
bool give_up = false;
|
||||
bool cont = false;
|
||||
for (auto* e : m_solvers)
|
||||
|
@ -212,27 +217,40 @@ namespace euf {
|
|||
}
|
||||
|
||||
void solver::push() {
|
||||
for (auto* e : m_solvers)
|
||||
e->push();
|
||||
m_egraph.push();
|
||||
++m_num_scopes;
|
||||
}
|
||||
|
||||
void solver::force_push() {
|
||||
for (; m_num_scopes > 0; --m_num_scopes) {
|
||||
scope s;
|
||||
s.m_bool_var_lim = m_bool_var_trail.size();
|
||||
s.m_trail_lim = m_trail.size();
|
||||
m_scopes.push_back(s);
|
||||
for (auto* e : m_solvers)
|
||||
e->push();
|
||||
m_egraph.push();
|
||||
}
|
||||
}
|
||||
|
||||
void solver::pop(unsigned n) {
|
||||
m_egraph.pop(n);
|
||||
for (auto* e : m_solvers)
|
||||
e->pop(n);
|
||||
if (n <= m_num_scopes) {
|
||||
m_num_scopes -= n;
|
||||
return;
|
||||
}
|
||||
n -= m_num_scopes;
|
||||
unsigned old_lim = m_bool_var_lim.size() - n;
|
||||
unsigned old_sz = m_bool_var_lim[old_lim];
|
||||
for (unsigned i = m_bool_var_trail.size(); i-- > old_sz; )
|
||||
m_egraph.pop(n);
|
||||
for (auto* e : m_solvers)
|
||||
e->pop(n);
|
||||
|
||||
scope & s = m_scopes[m_scopes.size() - n];
|
||||
|
||||
for (unsigned i = m_bool_var_trail.size(); i-- > s.m_bool_var_lim; )
|
||||
m_var2node[m_bool_var_trail[i]] = enode_bool_pair(nullptr, false);
|
||||
m_bool_var_trail.shrink(old_sz);
|
||||
m_bool_var_lim.shrink(old_lim);
|
||||
m_bool_var_trail.shrink(s.m_bool_var_lim);
|
||||
|
||||
undo_trail_stack(*this, m_trail, s.m_trail_lim);
|
||||
|
||||
m_scopes.shrink(m_scopes.size() - n);
|
||||
}
|
||||
|
||||
void solver::pre_simplify() {
|
||||
|
@ -312,6 +330,7 @@ namespace euf {
|
|||
}
|
||||
|
||||
void solver::pop_reinit() {
|
||||
force_push();
|
||||
for (auto* e : m_solvers)
|
||||
e->pop_reinit();
|
||||
}
|
||||
|
@ -390,6 +409,7 @@ namespace euf {
|
|||
}
|
||||
|
||||
sat::literal solver::internalize(expr* e, bool sign, bool root) {
|
||||
force_push();
|
||||
auto* ext = get_solver(e);
|
||||
if (ext)
|
||||
return ext->internalize(e, sign, root);
|
||||
|
@ -463,8 +483,6 @@ namespace euf {
|
|||
|
||||
void solver::attach_bool_var(sat::bool_var v, bool sign, euf::enode* n) {
|
||||
m_var2node.reserve(v + 1, enode_bool_pair(nullptr, false));
|
||||
for (; m_num_scopes > 0; --m_num_scopes)
|
||||
m_bool_var_lim.push_back(m_bool_var_trail.size());
|
||||
SASSERT(m_var2node[v].first == nullptr);
|
||||
m_var2node[v] = euf::enode_bool_pair(n, sign);
|
||||
m_bool_var_trail.push_back(v);
|
||||
|
|
|
@ -17,6 +17,7 @@ Author:
|
|||
#pragma once
|
||||
|
||||
#include "util/scoped_ptr_vector.h"
|
||||
#include "util/trail.h"
|
||||
#include "ast/ast_translation.h"
|
||||
#include "ast/euf/euf_egraph.h"
|
||||
#include "smt/params/smt_params.h"
|
||||
|
@ -35,12 +36,12 @@ namespace euf {
|
|||
|
||||
class constraint {
|
||||
public:
|
||||
enum kind_t { conflict, eq, lit};
|
||||
enum class kind_t { conflict, eq, lit};
|
||||
private:
|
||||
kind_t m_kind;
|
||||
public:
|
||||
constraint(kind_t k) : m_kind(k) {}
|
||||
unsigned kind() const { return m_kind; }
|
||||
kind_t kind() const { return m_kind; }
|
||||
static constraint* from_idx(size_t z) { return reinterpret_cast<constraint*>(z); }
|
||||
size_t to_index() const { return sat::constraint_base::mem2base(this); }
|
||||
};
|
||||
|
@ -53,6 +54,11 @@ namespace euf {
|
|||
stats() { reset(); }
|
||||
void reset() { memset(this, 0, sizeof(*this)); }
|
||||
};
|
||||
struct scope {
|
||||
unsigned m_bool_var_lim;
|
||||
unsigned m_trail_lim;
|
||||
};
|
||||
typedef ptr_vector<trail<solver> > trail_stack;
|
||||
|
||||
ast_manager& m;
|
||||
atom2bool_var& m_expr2var;
|
||||
|
@ -60,8 +66,11 @@ namespace euf {
|
|||
smt_params m_config;
|
||||
euf::egraph m_egraph;
|
||||
stats m_stats;
|
||||
sat::solver* m_solver { nullptr };
|
||||
sat::lookahead* m_lookahead { nullptr };
|
||||
|
||||
trail_stack m_trail;
|
||||
|
||||
sat::solver* m_solver { nullptr };
|
||||
sat::lookahead* m_lookahead { nullptr };
|
||||
ast_manager* m_to_m;
|
||||
atom2bool_var* m_to_expr2var;
|
||||
sat::sat_internalizer* m_to_si;
|
||||
|
@ -73,7 +82,7 @@ namespace euf {
|
|||
svector<sat::frame> m_stack;
|
||||
unsigned m_num_scopes { 0 };
|
||||
unsigned_vector m_bool_var_trail;
|
||||
unsigned_vector m_bool_var_lim;
|
||||
svector<scope> m_scopes;
|
||||
scoped_ptr_vector<sat::th_solver> m_solvers;
|
||||
ptr_vector<sat::th_solver> m_id2solver;
|
||||
|
||||
|
@ -109,11 +118,12 @@ namespace euf {
|
|||
// solving
|
||||
void propagate();
|
||||
void get_antecedents(literal l, constraint& j, literal_vector& r);
|
||||
void force_push();
|
||||
|
||||
constraint& mk_constraint(constraint*& c, constraint::kind_t k);
|
||||
constraint& conflict_constraint() { return mk_constraint(m_conflict, constraint::conflict); }
|
||||
constraint& eq_constraint() { return mk_constraint(m_eq, constraint::eq); }
|
||||
constraint& lit_constraint() { return mk_constraint(m_lit, constraint::lit); }
|
||||
constraint& conflict_constraint() { return mk_constraint(m_conflict, constraint::kind_t::conflict); }
|
||||
constraint& eq_constraint() { return mk_constraint(m_eq, constraint::kind_t::eq); }
|
||||
constraint& lit_constraint() { return mk_constraint(m_lit, constraint::kind_t::lit); }
|
||||
|
||||
public:
|
||||
solver(ast_manager& m, atom2bool_var& expr2var, sat::sat_internalizer& si, params_ref const& p = params_ref()):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue