Skip to content

Commit 185b01d

Browse files
fix #2416
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent c2264c7 commit 185b01d

File tree

6 files changed

+18
-46
lines changed

6 files changed

+18
-46
lines changed

src/sat/ba_solver.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2504,7 +2504,7 @@ namespace sat {
25042504
}
25052505

25062506
void ba_solver::remove_constraint(constraint& c, char const* reason) {
2507-
TRACE("ba", tout << "remove " << c << " " << reason << "\n";);
2507+
TRACE("ba", display(tout << "remove ", c, true) << " " << reason << "\n";);
25082508
IF_VERBOSE(21, display(verbose_stream() << "remove " << reason << " ", c, true););
25092509
nullify_tracking_literal(c);
25102510
clear_watch(c);
@@ -2991,7 +2991,7 @@ namespace sat {
29912991
init_use_lists();
29922992
remove_unused_defs();
29932993
set_non_external();
2994-
if (get_config().m_elim_vars) elim_pure();
2994+
if (get_config().m_elim_vars && !s().get_config().m_incremental && !s().tracking_assumptions()) elim_pure();
29952995
for (unsigned sz = m_constraints.size(), i = 0; i < sz; ++i) subsumption(*m_constraints[i]);
29962996
for (unsigned sz = m_learned.size(), i = 0; i < sz; ++i) subsumption(*m_learned[i]);
29972997
unit_strengthen();
@@ -4371,7 +4371,7 @@ namespace sat {
43714371
SASSERT(c1.index() != c2.index());
43724372
if (subsumes(c1, c2, slit)) {
43734373
if (slit.empty()) {
4374-
TRACE("ba", tout << "subsume cardinality\n" << c1.index() << ":" << c1 << "\n" << c2.index() << ":" << c2 << "\n";);
4374+
TRACE("ba", tout << "subsume cardinality\n" << c1 << "\n" << c2.index() << ":" << c2 << "\n";);
43754375
remove_constraint(c2, "subsumed");
43764376
++m_stats.m_num_pb_subsumes;
43774377
set_non_learned(c1);
@@ -4789,13 +4789,14 @@ namespace sat {
47894789
return out << index2constraint(idx);
47904790
}
47914791

4792-
void ba_solver::display(std::ostream& out, constraint const& c, bool values) const {
4792+
std::ostream& ba_solver::display(std::ostream& out, constraint const& c, bool values) const {
47934793
switch (c.tag()) {
47944794
case card_t: display(out, c.to_card(), values); break;
47954795
case pb_t: display(out, c.to_pb(), values); break;
47964796
case xr_t: display(out, c.to_xr(), values); break;
47974797
default: UNREACHABLE(); break;
47984798
}
4799+
return out;
47994800
}
48004801

48014802
void ba_solver::collect_statistics(statistics& st) const {

src/sat/ba_solver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ namespace sat {
608608
bool check_model(model const& m) const override;
609609

610610
ptr_vector<constraint> const & constraints() const { return m_constraints; }
611-
void display(std::ostream& out, constraint const& c, bool values) const;
611+
std::ostream& display(std::ostream& out, constraint const& c, bool values) const;
612612

613613
bool validate() override;
614614

src/sat/sat_model_converter.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ namespace sat {
6868

6969
void model_converter::operator()(model & m) const {
7070
bool first = false;
71-
TRACE("sat", display(tout););
7271
literal_vector clause;
7372
for (unsigned i = m_entries.size(); i-- > m_exposed_lim; ) {
7473
entry const& e = m_entries[i];
@@ -86,7 +85,7 @@ namespace sat {
8685
// end of clause
8786
VERIFY (sat || e.get_kind() != ATE);
8887
if (!sat && e.get_kind() != ATE && v0 != null_bool_var) {
89-
VERIFY(legal_to_flip(v0));
88+
VERIFY(legal_to_flip(v0));
9089
m[v0] = var_sign ? l_false : l_true;
9190
}
9291
elim_stack* st = e.m_elim_stack[index];

src/sat/sat_solver/inc_sat_solver.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,10 @@ class inc_sat_solver : public solver {
869869
return;
870870
}
871871
TRACE("sat", m_solver.display_model(tout););
872-
sat::model const & ll_m = m_solver.get_model();
872+
sat::model ll_m = m_solver.get_model();
873+
if (m_sat_mc) {
874+
(*m_sat_mc)(ll_m);
875+
}
873876
mdl = alloc(model, m);
874877
for (sat::bool_var v = 0; v < ll_m.size(); ++v) {
875878
expr* n = m_sat_mc->var2expr(v);

src/sat/tactic/goal2sat.cpp

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,43 +1002,11 @@ void sat2goal::mc::get_units(obj_map<expr, bool>& units) {
10021002
}
10031003

10041004

1005+
void sat2goal::mc::operator()(sat::model& md) {
1006+
m_smc(md);
1007+
}
1008+
10051009
void sat2goal::mc::operator()(model_ref & md) {
1006-
model_evaluator ev(*md);
1007-
ev.set_model_completion(false);
1008-
1009-
// create a SAT model using md
1010-
sat::model sat_md;
1011-
expr_ref val(m);
1012-
for (expr * atom : m_var2expr) {
1013-
if (!atom) {
1014-
sat_md.push_back(l_undef);
1015-
continue;
1016-
}
1017-
ev(atom, val);
1018-
if (m.is_true(val))
1019-
sat_md.push_back(l_true);
1020-
else if (m.is_false(val))
1021-
sat_md.push_back(l_false);
1022-
else
1023-
sat_md.push_back(l_undef);
1024-
}
1025-
1026-
// apply SAT model converter
1027-
m_smc(sat_md);
1028-
1029-
// register value of non-auxiliary boolean variables back into md
1030-
unsigned sz = m_var2expr.size();
1031-
for (sat::bool_var v = 0; v < sz; v++) {
1032-
app * atom = m_var2expr.get(v);
1033-
if (atom && is_uninterp_const(atom)) {
1034-
func_decl * d = atom->get_decl();
1035-
lbool new_val = sat_md[v];
1036-
if (new_val == l_true)
1037-
md->register_decl(d, m.mk_true());
1038-
else if (new_val == l_false)
1039-
md->register_decl(d, m.mk_false());
1040-
}
1041-
}
10421010
// apply externalized model converter
10431011
if (m_gmc) (*m_gmc)(md);
10441012
TRACE("sat_mc", tout << "after sat_mc\n"; model_v2_pp(tout, *md););

src/sat/tactic/goal2sat.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class sat2goal {
7979
ast_manager& m;
8080
sat::model_converter m_smc;
8181
generic_model_converter_ref m_gmc;
82-
app_ref_vector m_var2expr;
82+
app_ref_vector m_var2expr;
8383

8484
// flushes from m_smc to m_gmc;
8585
void flush_gmc();
@@ -88,7 +88,8 @@ class sat2goal {
8888
mc(ast_manager& m);
8989
~mc() override {}
9090
// flush model converter from SAT solver to this structure.
91-
void flush_smc(sat::solver_core& s, atom2bool_var const& map);
91+
void flush_smc(sat::solver_core& s, atom2bool_var const& map);
92+
void operator()(sat::model& m);
9293
void operator()(model_ref& md) override;
9394
void operator()(expr_ref& fml) override;
9495
model_converter* translate(ast_translation& translator) override;

0 commit comments

Comments
 (0)