3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 09:05:31 +00:00

different strategies for weighted

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2013-12-20 12:04:17 +01:00
parent 26237a3727
commit 0deb951873
15 changed files with 352 additions and 123 deletions

View file

@ -1334,6 +1334,7 @@ namespace smt {
TRACE("propagate_bool_var_enode_bug", tout << "var: " << v << " #" << bool_var2expr(v)->get_id() << "\n";);
SASSERT(v < static_cast<int>(m_b_internalized_stack.size()));
enode * n = bool_var2enode(v);
CTRACE("mk_bool_var", !n, tout << "No enode for " << v << "\n";);
bool sign = val == l_false;
if (n->merge_tf())
add_eq(n, sign ? m_false_enode : m_true_enode, eq_justification(literal(v, sign)));

View file

@ -328,7 +328,9 @@ namespace smt {
theory_pb::theory_pb(ast_manager& m):
theory(m.mk_family_id("pb")),
m_util(m),
m_lemma(null_literal)
m_lemma(null_literal),
m_learn_complements(false),
m_conflict_frequency(0xF)
{}
theory_pb::~theory_pb() {
@ -716,10 +718,11 @@ namespace smt {
numeral k = c.k();
numeral coeff = c.coeff(w);
for (unsigned i = c.watch_size(); c.watch_sum() - coeff < k + c.max_watch() && i < c.size(); ++i) {
bool add_more = c.watch_sum() - coeff < k + c.max_watch();
for (unsigned i = c.watch_size(); add_more && i < c.size(); ++i) {
if (ctx.get_assignment(c.lit(i)) != l_false) {
add_watch(c, i);
add_more = c.watch_sum() - coeff < k + c.max_watch();
}
}
@ -750,8 +753,9 @@ namespace smt {
literal_vector& lits = get_unhelpful_literals(c, true);
lits.push_back(c.lit());
numeral deficit = c.watch_sum() - k;
for (unsigned i = 0; i < c.size(); ++i) {
if (c.watch_sum() - c.coeff(i) < k && ctx.get_assignment(c.lit(i)) == l_undef) {
if (ctx.get_assignment(c.lit(i)) == l_undef && deficit < c.coeff(i)) {
DEBUG_CODE(validate_assign(c, lits, c.lit(i)););
add_assign(c, lits, c.lit(i));
}
@ -1044,12 +1048,18 @@ namespace smt {
tout << "\n";
display(tout, c, true););
if (true || (c.m_num_propagations & 0xF) == 0) {
justification* js = 0;
if (m_conflict_frequency == 0 || (0 == (c.m_num_propagations % m_conflict_frequency))) {
resolve_conflict(c);
}
justification* js = 0;
ctx.mk_clause(lits.size(), lits.c_ptr(), js, CLS_AUX_LEMMA, 0);
// if (true || (c.m_num_propagations & 0xF) == 0) {
// resolve_conflict(c);
//}
}
@ -1090,7 +1100,7 @@ namespace smt {
if (ctx.get_assignment(l) != l_false) {
m_lemma.m_k -= coeff;
if (true && false && is_marked(v)) {
if (m_learn_complements && is_marked(v)) {
SASSERT(ctx.get_assignment(l) == l_true);
numeral& lcoeff = m_lemma.m_args[m_conseq_index[v]].second;
lcoeff -= coeff;

View file

@ -111,6 +111,8 @@ namespace smt {
pb_util m_util;
stats m_stats;
ptr_vector<ineq> m_to_compile; // inequalities to compile.
unsigned m_conflict_frequency;
bool m_learn_complements;
// internalize_atom:
literal compile_arg(expr* arg);
@ -189,5 +191,8 @@ namespace smt {
virtual void collect_statistics(::statistics & st) const;
virtual model_value_proc * mk_value(enode * n, model_generator & mg);
virtual void init_model(model_generator & m);
void set_conflict_frequency(unsigned f) { m_conflict_frequency = f; }
void set_learn_complements(bool l) { m_learn_complements = l; }
};
};