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:
parent
26237a3727
commit
0deb951873
15 changed files with 352 additions and 123 deletions
|
@ -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)));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue