3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-12 12:08:18 +00:00

xor to xr to avoid clang issue

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-02-07 15:25:02 -08:00
parent fa0c75e76e
commit 61f99b242e
5 changed files with 114 additions and 110 deletions

View file

@ -7,7 +7,7 @@ Module Name:
Abstract:
Extension for cardinality and xor reasoning.
Extension for cardinality and xr reasoning.
Author:
@ -47,14 +47,14 @@ namespace sat {
return static_cast<pb const&>(*this);
}
ba_solver::xor& ba_solver::constraint::to_xor() {
SASSERT(is_xor());
return static_cast<xor&>(*this);
ba_solver::xr& ba_solver::constraint::to_xr() {
SASSERT(is_xr());
return static_cast<xr&>(*this);
}
ba_solver::xor const& ba_solver::constraint::to_xor() const{
SASSERT(is_xor());
return static_cast<xor const&>(*this);
ba_solver::xr const& ba_solver::constraint::to_xr() const{
SASSERT(is_xr());
return static_cast<xr const&>(*this);
}
std::ostream& operator<<(std::ostream& out, ba_solver::constraint const& cnstr) {
@ -77,8 +77,8 @@ namespace sat {
out << " >= " << p.k();
break;
}
case ba_solver::xor_t: {
ba_solver::xor const& x = cnstr.to_xor();
case ba_solver::xr_t: {
ba_solver::xr const& x = cnstr.to_xr();
for (unsigned i = 0; i < x.size(); ++i) {
out << x[i] << " ";
if (i + 1 < x.size()) out << "x ";
@ -187,22 +187,22 @@ namespace sat {
// -----------------------------------
// xor
// xr
ba_solver::xor::xor(unsigned id, literal_vector const& lits):
constraint(xor_t, id, null_literal, lits.size(), get_obj_size(lits.size())) {
ba_solver::xr::xr(unsigned id, literal_vector const& lits):
constraint(xr_t, id, null_literal, lits.size(), get_obj_size(lits.size())) {
for (unsigned i = 0; i < size(); ++i) {
m_lits[i] = lits[i];
}
}
bool ba_solver::xor::is_watching(literal l) const {
bool ba_solver::xr::is_watching(literal l) const {
return
l == (*this)[0] || l == (*this)[1] ||
~l == (*this)[0] || ~l == (*this)[1];
}
bool ba_solver::xor::well_formed() const {
bool ba_solver::xr::well_formed() const {
uint_set vars;
if (lit() != null_literal) vars.insert(lit().var());
for (literal l : *this) {
@ -305,7 +305,7 @@ namespace sat {
UNREACHABLE();
}
SASSERT(validate_conflict(c));
if (c.is_xor() && value(lit) == l_true) lit.neg();
if (c.is_xr() && value(lit) == l_true) lit.neg();
SASSERT(value(lit) == l_false);
set_conflict(justification::mk_ext_justification(c.index()), ~lit);
SASSERT(inconsistent());
@ -892,16 +892,16 @@ namespace sat {
// --------------------
// xor:
// xr:
void ba_solver::clear_watch(xor& x) {
void ba_solver::clear_watch(xr& x) {
unwatch_literal(x[0], x);
unwatch_literal(x[1], x);
unwatch_literal(~x[0], x);
unwatch_literal(~x[1], x);
}
bool ba_solver::parity(xor const& x, unsigned offset) const {
bool ba_solver::parity(xr const& x, unsigned offset) const {
bool odd = false;
unsigned sz = x.size();
for (unsigned i = offset; i < sz; ++i) {
@ -913,7 +913,7 @@ namespace sat {
return odd;
}
bool ba_solver::init_watch(xor& x) {
bool ba_solver::init_watch(xr& x) {
clear_watch(x);
if (x.lit() != null_literal && value(x.lit()) == l_false) {
x.negate();
@ -957,7 +957,7 @@ namespace sat {
}
lbool ba_solver::add_assign(xor& x, literal alit) {
lbool ba_solver::add_assign(xr& x, literal alit) {
// literal is assigned
unsigned sz = x.size();
TRACE("ba", tout << "assign: " << ~alit << "@" << lvl(~alit) << " " << x << "\n"; display(tout, x, true); );
@ -1223,12 +1223,12 @@ namespace sat {
for (literal l : m_lemma) process_antecedent(~l, offset);
break;
}
case xor_t: {
case xr_t: {
// jus.push_back(js);
m_lemma.reset();
inc_bound(offset);
inc_coeff(consequent, offset);
get_xor_antecedents(consequent, idx, js, m_lemma);
get_xr_antecedents(consequent, idx, js, m_lemma);
for (literal l : m_lemma) process_antecedent(~l, offset);
break;
}
@ -1593,7 +1593,7 @@ namespace sat {
switch (c.tag()) {
case card_t: return init_watch(c.to_card());
case pb_t: return init_watch(c.to_pb());
case xor_t: return init_watch(c.to_xor());
case xr_t: return init_watch(c.to_xr());
}
UNREACHABLE();
return false;
@ -1603,7 +1603,7 @@ namespace sat {
switch (c.tag()) {
case card_t: return add_assign(c.to_card(), l);
case pb_t: return add_assign(c.to_pb(), l);
case xor_t: return add_assign(c.to_xor(), l);
case xr_t: return add_assign(c.to_xr(), l);
}
UNREACHABLE();
return l_undef;
@ -1632,13 +1632,13 @@ namespace sat {
add_pb_ge(lit, wlits, k, false);
}
void ba_solver::add_xor(literal_vector const& lits) {
add_xor(lits, false);
void ba_solver::add_xr(literal_vector const& lits) {
add_xr(lits, false);
}
ba_solver::constraint* ba_solver::add_xor(literal_vector const& lits, bool learned) {
void * mem = m_allocator.allocate(xor::get_obj_size(lits.size()));
xor* x = new (mem) xor(next_id(), lits);
ba_solver::constraint* ba_solver::add_xr(literal_vector const& lits, bool learned) {
void * mem = m_allocator.allocate(xr::get_obj_size(lits.size()));
xr* x = new (mem) xr(next_id(), lits);
x->set_learned(learned);
add_constraint(x);
for (literal l : lits) s().set_external(l.var()); // TBD: determine if goal2sat does this.
@ -1709,7 +1709,7 @@ namespace sat {
switch (c.tag()) {
case card_t: return get_reward(c.to_card(), occs);
case pb_t: return get_reward(c.to_pb(), occs);
case xor_t: return 0;
case xr_t: return 0;
default: UNREACHABLE(); return 0;
}
}
@ -1737,11 +1737,11 @@ namespace sat {
}
/**
\brief perform parity resolution on xor premises.
The idea is to collect premises based on xor resolvents.
\brief perform parity resolution on xr premises.
The idea is to collect premises based on xr resolvents.
Variables that are repeated an even number of times cancel out.
*/
void ba_solver::get_xor_antecedents(literal l, unsigned index, justification js, literal_vector& r) {
void ba_solver::get_xr_antecedents(literal l, unsigned index, justification js, literal_vector& r) {
unsigned level = lvl(l);
bool_var v = l.var();
SASSERT(js.get_kind() == justification::EXT_JUSTIFICATION);
@ -1758,11 +1758,11 @@ namespace sat {
if (js.get_kind() == justification::EXT_JUSTIFICATION) {
constraint& c = index2constraint(js.get_ext_justification_idx());
TRACE("ba", tout << c << "\n";);
if (!c.is_xor()) {
if (!c.is_xr()) {
r.push_back(l);
}
else {
xor& x = c.to_xor();
xr& x = c.to_xr();
if (x[1].var() == l.var()) {
x.swap(0, 1);
}
@ -1959,7 +1959,7 @@ namespace sat {
}
}
void ba_solver::simplify(xor& x) {
void ba_solver::simplify(xr& x) {
// no-op
}
@ -1979,7 +1979,7 @@ namespace sat {
}
}
void ba_solver::get_antecedents(literal l, xor const& x, literal_vector& r) {
void ba_solver::get_antecedents(literal l, xr const& x, literal_vector& r) {
if (x.lit() != null_literal) r.push_back(x.lit());
// TRACE("ba", display(tout << l << " ", x, true););
SASSERT(x.lit() == null_literal || value(x.lit()) == l_true);
@ -2021,7 +2021,7 @@ namespace sat {
switch (c.tag()) {
case card_t: get_antecedents(l, c.to_card(), r); break;
case pb_t: get_antecedents(l, c.to_pb(), r); break;
case xor_t: get_antecedents(l, c.to_xor(), r); break;
case xr_t: get_antecedents(l, c.to_xr(), r); break;
default: UNREACHABLE(); break;
}
}
@ -2042,8 +2042,8 @@ namespace sat {
case pb_t:
clear_watch(c.to_pb());
break;
case xor_t:
clear_watch(c.to_xor());
case xr_t:
clear_watch(c.to_xr());
break;
default:
UNREACHABLE();
@ -2066,7 +2066,7 @@ namespace sat {
switch (c.tag()) {
case card_t: return validate_unit_propagation(c.to_card(), l);
case pb_t: return validate_unit_propagation(c.to_pb(), l);
case xor_t: return true;
case xr_t: return true;
default: UNREACHABLE(); break;
}
return false;
@ -2081,7 +2081,7 @@ namespace sat {
switch (c.tag()) {
case card_t: return eval(v1, eval(c.to_card()));
case pb_t: return eval(v1, eval(c.to_pb()));
case xor_t: return eval(v1, eval(c.to_xor()));
case xr_t: return eval(v1, eval(c.to_xr()));
default: UNREACHABLE(); break;
}
return l_undef;
@ -2120,7 +2120,7 @@ namespace sat {
return l_undef;
}
lbool ba_solver::eval(xor const& x) const {
lbool ba_solver::eval(xr const& x) const {
bool odd = false;
for (auto l : x) {
@ -2393,9 +2393,9 @@ namespace sat {
if (!clausify(c.to_pb()))
simplify(c.to_pb());
break;
case xor_t:
if (!clausify(c.to_xor()))
simplify(c.to_xor());
case xr_t:
if (!clausify(c.to_xr()))
simplify(c.to_xr());
break;
default:
UNREACHABLE();
@ -2551,7 +2551,7 @@ namespace sat {
case pb_t:
recompile(c.to_pb());
break;
case xor_t:
case xr_t:
NOT_IMPLEMENTED_YET();
break;
default:
@ -2664,7 +2664,7 @@ namespace sat {
return false;
}
bool ba_solver::clausify(xor& x) {
bool ba_solver::clausify(xr& x) {
return false;
}
@ -2730,7 +2730,7 @@ namespace sat {
switch (c.tag()) {
case card_t: split_root(c.to_card()); break;
case pb_t: split_root(c.to_pb()); break;
case xor_t: NOT_IMPLEMENTED_YET(); break;
case xr_t: NOT_IMPLEMENTED_YET(); break;
}
}
@ -2843,8 +2843,8 @@ namespace sat {
}
break;
}
case xor_t: {
xor& x = cp->to_xor();
case xr_t: {
xr& x = cp->to_xr();
for (literal l : x) {
m_cnstr_use_list[l.index()].push_back(&x);
m_cnstr_use_list[(~l).index()].push_back(&x);
@ -3319,11 +3319,11 @@ namespace sat {
result->add_pb_ge(p.lit(), wlits, p.k(), p.learned());
break;
}
case xor_t: {
xor const& x = cp->to_xor();
case xr_t: {
xr const& x = cp->to_xr();
lits.reset();
for (literal l : x) lits.push_back(l);
result->add_xor(lits, x.learned());
result->add_xr(lits, x.learned());
break;
}
default:
@ -3355,8 +3355,8 @@ namespace sat {
}
break;
}
case xor_t: {
xor const& x = cp->to_xor();
case xr_t: {
xr const& x = cp->to_xr();
for (literal l : x) {
ul.insert(l, idx);
ul.insert(~l, idx);
@ -3450,8 +3450,8 @@ namespace sat {
out << ">= " << ineq.m_k << "\n";
}
void ba_solver::display(std::ostream& out, xor const& x, bool values) const {
out << "xor: ";
void ba_solver::display(std::ostream& out, xr const& x, bool values) const {
out << "xr: ";
for (literal l : x) {
out << l;
if (values) {
@ -3520,7 +3520,7 @@ namespace sat {
switch (c.tag()) {
case card_t: display(out, c.to_card(), values); break;
case pb_t: display(out, c.to_pb(), values); break;
case xor_t: display(out, c.to_xor(), values); break;
case xr_t: display(out, c.to_xr(), values); break;
default: UNREACHABLE(); break;
}
}
@ -3612,7 +3612,7 @@ namespace sat {
return false;
}
bool ba_solver::validate_unit_propagation(xor const& x, literal alit) const {
bool ba_solver::validate_unit_propagation(xr const& x, literal alit) const {
if (value(x.lit()) != l_true) return false;
for (unsigned i = 1; i < x.size(); ++i) {
if (value(x[i]) == l_undef) return false;
@ -3827,14 +3827,14 @@ namespace sat {
if (p.lit() != null_literal) ineq.push(~p.lit(), p.k());
break;
}
case xor_t: {
xor& x = cnstr.to_xor();
case xr_t: {
xr& x = cnstr.to_xr();
literal_vector ls;
get_antecedents(lit, x, ls);
ineq.reset(offset);
for (literal l : ls) ineq.push(~l, offset);
literal lxor = x.lit();
if (lxor != null_literal) ineq.push(~lxor, offset);
literal lxr = x.lit();
if (lxr != null_literal) ineq.push(~lxr, offset);
break;
}
default:

View file

@ -51,12 +51,12 @@ namespace sat {
enum tag_t {
card_t,
pb_t,
xor_t
xr_t
};
class card;
class pb;
class xor;
class xr;
class constraint {
protected:
@ -91,13 +91,13 @@ namespace sat {
size_t obj_size() const { return m_obj_size; }
card& to_card();
pb& to_pb();
xor& to_xor();
xr& to_xr();
card const& to_card() const;
pb const& to_pb() const;
xor const& to_xor() const;
xr const& to_xr() const;
bool is_card() const { return m_tag == card_t; }
bool is_pb() const { return m_tag == pb_t; }
bool is_xor() const { return m_tag == xor_t; }
bool is_xr() const { return m_tag == xr_t; }
virtual bool is_watching(literal l) const { UNREACHABLE(); return false; };
virtual literal_vector literals() const { UNREACHABLE(); return literal_vector(); }
@ -174,11 +174,11 @@ namespace sat {
virtual unsigned get_coeff(unsigned i) const { return m_wlits[i].first; }
};
class xor : public constraint {
class xr : public constraint {
literal m_lits[0];
public:
static size_t get_obj_size(unsigned num_lits) { return sizeof(xor) + num_lits * sizeof(literal); }
xor(unsigned id, literal_vector const& lits);
static size_t get_obj_size(unsigned num_lits) { return sizeof(xr) + num_lits * sizeof(literal); }
xr(unsigned id, literal_vector const& lits);
literal operator[](unsigned i) const { return m_lits[i]; }
literal const* begin() const { return m_lits; }
literal const* end() const { return begin() + m_size; }
@ -351,17 +351,17 @@ namespace sat {
double get_reward(card const& c, literal_occs_fun& occs) const;
// xor specific functionality
void clear_watch(xor& x);
bool init_watch(xor& x);
bool parity(xor const& x, unsigned offset) const;
lbool add_assign(xor& x, literal alit);
void get_xor_antecedents(literal l, unsigned index, justification js, literal_vector& r);
void get_antecedents(literal l, xor const& x, literal_vector & r);
void simplify(xor& x);
bool clausify(xor& x);
void flush_roots(xor& x);
lbool eval(xor const& x) const;
// xr specific functionality
void clear_watch(xr& x);
bool init_watch(xr& x);
bool parity(xr const& x, unsigned offset) const;
lbool add_assign(xr& x, literal alit);
void get_xr_antecedents(literal l, unsigned index, justification js, literal_vector& r);
void get_antecedents(literal l, xr const& x, literal_vector & r);
void simplify(xr& x);
bool clausify(xr& x);
void flush_roots(xr& x);
lbool eval(xr const& x) const;
// pb functionality
unsigned m_a_max;
@ -425,14 +425,14 @@ namespace sat {
// validation utilities
bool validate_conflict(card const& c) const;
bool validate_conflict(xor const& x) const;
bool validate_conflict(xr const& x) const;
bool validate_conflict(pb const& p) const;
bool validate_assign(literal_vector const& lits, literal lit);
bool validate_lemma();
bool validate_unit_propagation(card const& c, literal alit) const;
bool validate_unit_propagation(pb const& p, literal alit) const;
bool validate_unit_propagation(pb const& p, literal_vector const& r, literal alit) const;
bool validate_unit_propagation(xor const& x, literal alit) const;
bool validate_unit_propagation(xr const& x, literal alit) const;
bool validate_conflict(literal_vector const& lits, ineq& p);
bool validate_watch_literals() const;
bool validate_watch_literal(literal lit) const;
@ -456,11 +456,11 @@ namespace sat {
void display(std::ostream& out, constraint const& c, bool values) const;
void display(std::ostream& out, card const& c, bool values) const;
void display(std::ostream& out, pb const& p, bool values) const;
void display(std::ostream& out, xor const& c, bool values) const;
void display(std::ostream& out, xr const& c, bool values) const;
constraint* add_at_least(literal l, literal_vector const& lits, unsigned k, bool learned);
constraint* add_pb_ge(literal l, svector<wliteral> const& wlits, unsigned k, bool learned);
constraint* add_xor(literal_vector const& lits, bool learned);
constraint* add_xr(literal_vector const& lits, bool learned);
void copy_core(ba_solver* result, bool learned);
void copy_constraints(ba_solver* result, ptr_vector<constraint> const& constraints);
@ -472,7 +472,7 @@ namespace sat {
virtual void set_unit_walk(unit_walk* u) { m_unit_walk = u; }
void add_at_least(bool_var v, literal_vector const& lits, unsigned k);
void add_pb_ge(bool_var v, svector<wliteral> const& wlits, unsigned k);
void add_xor(literal_vector const& lits);
void add_xr(literal_vector const& lits);
virtual bool propagate(literal l, ext_constraint_idx idx);
virtual lbool resolve_conflict();

View file

@ -400,7 +400,7 @@ namespace sat {
}
break;
}
case ba_solver::xor_t:
case ba_solver::xr_t:
NOT_IMPLEMENTED_YET();
break;
}

View file

@ -104,7 +104,7 @@ public:
virtual ~inc_sat_solver() {}
virtual solver* translate(ast_manager& dst_m, params_ref const& p) {
solver* translate(ast_manager& dst_m, params_ref const& p) override {
if (m_num_scopes > 0) {
throw default_exception("Cannot translate sat solver at non-base level");
}
@ -128,7 +128,7 @@ public:
return result;
}
virtual void set_progress_callback(progress_callback * callback) {}
void set_progress_callback(progress_callback * callback) override {}
void display_weighted(std::ostream& out, unsigned sz, expr * const * assumptions, unsigned const* weights) {
if (weights != 0) {
@ -160,7 +160,7 @@ public:
(m.is_not(e, e) && is_uninterp_const(e));
}
virtual lbool check_sat(unsigned sz, expr * const * assumptions) {
lbool check_sat(unsigned sz, expr * const * assumptions) override {
m_solver.pop_to_base_level();
m_core.reset();
if (m_solver.inconsistent()) return l_false;
@ -213,7 +213,8 @@ public:
}
return r;
}
virtual void push() {
void push() override {
internalize_formulas();
m_solver.user_push();
++m_num_scopes;
@ -223,7 +224,8 @@ public:
if (m_bb_rewriter) m_bb_rewriter->push();
m_map.push();
}
virtual void pop(unsigned n) {
void pop(unsigned n) override {
if (n > m_num_scopes) { // allow inc_sat_solver to
n = m_num_scopes; // take over for another solver.
}
@ -243,9 +245,11 @@ public:
--n;
}
}
unsigned get_scope_level() const override {
return m_num_scopes;
}
void assert_expr_core2(expr * t, expr * a) override {
if (a) {
m_asmsf.push_back(a);
@ -256,18 +260,18 @@ public:
}
}
virtual ast_manager& get_manager() const { return m; }
virtual void assert_expr_core(expr * t) {
ast_manager& get_manager() const override { return m; }
void assert_expr_core(expr * t) override {
TRACE("goal2sat", tout << mk_pp(t, m) << "\n";);
m_fmls.push_back(t);
}
virtual void set_produce_models(bool f) {}
virtual void collect_param_descrs(param_descrs & r) {
void set_produce_models(bool f) override {}
void collect_param_descrs(param_descrs & r) override {
solver::collect_param_descrs(r);
goal2sat::collect_param_descrs(r);
sat::solver::collect_param_descrs(r);
}
virtual void updt_params(params_ref const & p) {
void updt_params(params_ref const & p) override {
m_params.append(p);
sat_params p1(p);
m_params.set_bool("keep_cardinality_constraints", p1.cardinality_solver());
@ -279,20 +283,20 @@ public:
m_solver.set_incremental(is_incremental() && !override_incremental());
}
virtual void collect_statistics(statistics & st) const {
void collect_statistics(statistics & st) const override {
if (m_preprocess) m_preprocess->collect_statistics(st);
m_solver.collect_statistics(st);
}
virtual void get_unsat_core(ptr_vector<expr> & r) {
void get_unsat_core(ptr_vector<expr> & r) override {
r.reset();
r.append(m_core.size(), m_core.c_ptr());
}
virtual proof * get_proof() {
proof * get_proof() override {
UNREACHABLE();
return 0;
}
virtual expr_ref_vector cube(expr_ref_vector& vs, unsigned backtrack_level) {
expr_ref_vector cube(expr_ref_vector& vs, unsigned backtrack_level) override {
if (!is_internalized()) {
lbool r = internalize_formulas();
if (r != l_true) return expr_ref_vector(m);
@ -331,8 +335,8 @@ public:
}
return fmls;
}
virtual lbool get_consequences_core(expr_ref_vector const& assumptions, expr_ref_vector const& vars, expr_ref_vector& conseq) {
lbool get_consequences_core(expr_ref_vector const& assumptions, expr_ref_vector const& vars, expr_ref_vector& conseq) override {
init_preprocess();
TRACE("sat", tout << assumptions << "\n" << vars << "\n";);
sat::literal_vector asms;
@ -780,7 +784,7 @@ private:
}
}
virtual void get_model_core(model_ref & mdl) {
void get_model_core(model_ref & mdl) override {
TRACE("sat", tout << "retrieve model " << (m_solver.model_is_current()?"present":"absent") << "\n";);
if (!m_solver.model_is_current()) {
mdl = nullptr;

View file

@ -400,7 +400,7 @@ struct goal2sat::imp {
lits[i].neg();
}
ensure_extension();
m_ext->add_xor(lits);
m_ext->add_xr(lits);
sat::literal lit(v, sign);
if (root) {
m_result_stack.reset();
@ -1115,7 +1115,7 @@ struct sat2goal::imp {
r.assert_expr(fml);
}
void assert_xor(ref<mc>& mc, goal & r, sat::ba_solver::xor const& x) {
void assert_xor(ref<mc>& mc, goal & r, sat::ba_solver::xr const& x) {
ptr_buffer<expr> lits;
for (sat::literal l : x) {
lits.push_back(lit2expr(mc, l));
@ -1185,8 +1185,8 @@ struct sat2goal::imp {
case sat::ba_solver::pb_t:
assert_pb(mc, r, c->to_pb());
break;
case sat::ba_solver::xor_t:
assert_xor(mc, r, c->to_xor());
case sat::ba_solver::xr_t:
assert_xor(mc, r, c->to_xr());
break;
}
}