mirror of
https://github.com/Z3Prover/z3
synced 2025-06-18 20:03:38 +00:00
snapshot
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
94b3a46811
commit
e11e1231dc
2 changed files with 27 additions and 29 deletions
|
@ -45,8 +45,8 @@ namespace smt {
|
||||||
rational m_penalty; // current penalty of soft constraints
|
rational m_penalty; // current penalty of soft constraints
|
||||||
vector<unsigned_vector> m_hard_occ, m_soft_occ; // variable occurrence
|
vector<unsigned_vector> m_hard_occ, m_soft_occ; // variable occurrence
|
||||||
svector<bool> m_assignment; // current assignment.
|
svector<bool> m_assignment; // current assignment.
|
||||||
obj_map<expr, unsigned> m_expr2var; // map expressions to Boolean variables.
|
obj_map<func_decl, unsigned> m_decl2var; // map declarations to Boolean variables.
|
||||||
ptr_vector<expr> m_var2expr; // reverse map
|
ptr_vector<func_decl> m_var2decl; // reverse map
|
||||||
uint_set m_hard_false; // list of hard clauses that are false.
|
uint_set m_hard_false; // list of hard clauses that are false.
|
||||||
uint_set m_soft_false; // list of soft clauses that are false.
|
uint_set m_soft_false; // list of soft clauses that are false.
|
||||||
unsigned m_max_flips;
|
unsigned m_max_flips;
|
||||||
|
@ -75,10 +75,11 @@ namespace smt {
|
||||||
clause cls(mgr);
|
clause cls(mgr);
|
||||||
if (compile_clause(f, cls)) {
|
if (compile_clause(f, cls)) {
|
||||||
m_clauses.push_back(cls);
|
m_clauses.push_back(cls);
|
||||||
|
m_weights.push_back(w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_value(expr* f, bool b) {
|
void set_value(func_decl* f, bool b) {
|
||||||
literal lit = mk_literal(f);
|
literal lit = mk_literal(f);
|
||||||
SASSERT(!lit.sign());
|
SASSERT(!lit.sign());
|
||||||
m_assignment[lit.var()] = b;
|
m_assignment[lit.var()] = b;
|
||||||
|
@ -95,14 +96,6 @@ namespace smt {
|
||||||
return l_undef;
|
return l_undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get_value(expr* f) {
|
|
||||||
unsigned var;
|
|
||||||
if (m_expr2var.find(f, var)) {
|
|
||||||
return m_assignment[var];
|
|
||||||
}
|
|
||||||
UNREACHABLE();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
bool get_value(literal l) {
|
bool get_value(literal l) {
|
||||||
return l.sign() ^ m_assignment[l.var()];
|
return l.sign() ^ m_assignment[l.var()];
|
||||||
}
|
}
|
||||||
|
@ -267,6 +260,21 @@ namespace smt {
|
||||||
return break_count;
|
return break_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
literal mk_literal(func_decl* f) {
|
||||||
|
SASSERT(f->get_family_id() == null_family_id);
|
||||||
|
unsigned var;
|
||||||
|
if (!m_expr2var.find(f, var)) {
|
||||||
|
var = m_hard_occ.size();
|
||||||
|
SASSERT(m_expr2var.size() == var);
|
||||||
|
m_hard_occ.push_back(unsigned_vector());
|
||||||
|
m_soft_occ.push_back(unsigned_vector());
|
||||||
|
m_assignment.push_back(false);
|
||||||
|
m_expr2var.insert(f, var);
|
||||||
|
m_var2decl.push_back(f);
|
||||||
|
}
|
||||||
|
return literal(var);
|
||||||
|
}
|
||||||
|
|
||||||
literal mk_literal(expr* f) {
|
literal mk_literal(expr* f) {
|
||||||
literal result;
|
literal result;
|
||||||
bool sign = false;
|
bool sign = false;
|
||||||
|
@ -279,18 +287,12 @@ namespace smt {
|
||||||
else if (m.is_false(f)) {
|
else if (m.is_false(f)) {
|
||||||
result = false_literal;
|
result = false_literal;
|
||||||
}
|
}
|
||||||
else {
|
else if (is_uninterp_const(f)) {
|
||||||
unsigned var;
|
result = mk_literal(to_app(f)->get_decl());
|
||||||
if (!m_expr2var.find(f, var)) {
|
|
||||||
var = m_hard_occ.size();
|
|
||||||
SASSERT(m_expr2var.size() == var);
|
|
||||||
m_hard_occ.push_back(unsigned_vector());
|
|
||||||
m_soft_occ.push_back(unsigned_vector());
|
|
||||||
m_assignment.push_back(false);
|
|
||||||
m_expr2var.insert(f, var);
|
|
||||||
m_var2expr.push_back(f);
|
|
||||||
}
|
}
|
||||||
result = literal(var);
|
else {
|
||||||
|
IF_VERBOSE(0, verbose_stream() << "not handled: " << mk_pp(f, m) << "\n";);
|
||||||
|
result = null_literal;
|
||||||
}
|
}
|
||||||
if (sign) {
|
if (sign) {
|
||||||
result.neg();
|
result.neg();
|
||||||
|
@ -363,15 +365,12 @@ namespace smt {
|
||||||
void pb_sls::add(expr* f, rational const& w) {
|
void pb_sls::add(expr* f, rational const& w) {
|
||||||
m_imp->add(f, w);
|
m_imp->add(f, w);
|
||||||
}
|
}
|
||||||
void pb_sls::init_value(expr* f, bool b) {
|
void pb_sls::set_value(func_decl* f, bool b) {
|
||||||
m_imp->init_value(f, b);
|
m_imp->set_value(f, b);
|
||||||
}
|
}
|
||||||
lbool pb_sls::operator()() {
|
lbool pb_sls::operator()() {
|
||||||
return (*m_imp)();
|
return (*m_imp)();
|
||||||
}
|
}
|
||||||
bool pb_sls::get_value(expr* f) {
|
|
||||||
return m_imp->get_value(f);
|
|
||||||
}
|
|
||||||
void pb_sls::set_cancel(bool f) {
|
void pb_sls::set_cancel(bool f) {
|
||||||
m_imp->set_cancel(f);
|
m_imp->set_cancel(f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,9 +35,8 @@ namespace smt {
|
||||||
~pb_sls();
|
~pb_sls();
|
||||||
void add(expr* f);
|
void add(expr* f);
|
||||||
void add(expr* f, rational const& w);
|
void add(expr* f, rational const& w);
|
||||||
void init_value(expr* f, bool b);
|
void set_value(func_decl* f, bool b);
|
||||||
lbool operator()();
|
lbool operator()();
|
||||||
bool get_value(expr* f);
|
|
||||||
void set_cancel(bool f);
|
void set_cancel(bool f);
|
||||||
void collect_statistics(statistics& st) const;
|
void collect_statistics(statistics& st) const;
|
||||||
void get_model(model_ref& mdl);
|
void get_model(model_ref& mdl);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue