3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-19 09:40:20 +00:00
This commit is contained in:
Miguel Angelo Da Terra Neves 2017-10-25 17:06:08 -07:00
commit e1ff6304ed
5 changed files with 61 additions and 60 deletions

View file

@ -942,6 +942,7 @@ namespace sat {
} }
literal next() { SASSERT(!empty()); return to_literal(m_queue.erase_min()); } literal next() { SASSERT(!empty()); return to_literal(m_queue.erase_min()); }
bool empty() const { return m_queue.empty(); } bool empty() const { return m_queue.empty(); }
void reset() { m_queue.reset(); }
}; };
simplifier & s; simplifier & s;
@ -1042,19 +1043,17 @@ namespace sat {
m_to_remove.reset(); m_to_remove.reset();
clause_use_list & occs = s.m_use_list.get(l); clause_use_list & occs = s.m_use_list.get(l);
clause_use_list::iterator it = occs.mk_iterator(); clause_use_list::iterator it = occs.mk_iterator();
while (!it.at_end()) { for (; !it.at_end(); it.next()) {
clause & c = it.curr(); clause & c = it.curr();
if (!c.is_blocked()) { if (c.is_blocked()) continue;
m_counter -= c.size(); m_counter -= c.size();
SASSERT(c.contains(l)); SASSERT(c.contains(l));
s.mark_all_but(c, l); s.mark_all_but(c, l);
if (all_tautology(l)) { if (all_tautology(l)) {
block_clause(c, l, new_entry); block_clause(c, l, new_entry);
s.m_num_blocked_clauses++; s.m_num_blocked_clauses++;
}
s.unmark_all(c);
} }
it.next(); s.unmark_all(c);
} }
for (clause* c : m_to_remove) for (clause* c : m_to_remove)
s.block_clause(*c); s.block_clause(*c);
@ -1084,35 +1083,33 @@ namespace sat {
} }
clause_use_list & neg_occs = s.m_use_list.get(~l); clause_use_list & neg_occs = s.m_use_list.get(~l);
clause_use_list::iterator it = neg_occs.mk_iterator(); clause_use_list::iterator it = neg_occs.mk_iterator();
while (!it.at_end()) { for (; !it.at_end(); it.next()) {
bool tautology = false; bool tautology = false;
clause & c = it.curr(); clause & c = it.curr();
if (!c.is_blocked()) { if (c.is_blocked()) continue;
for (literal lit : c) { for (literal lit : c) {
if (s.is_marked(~lit) && lit != ~l) { if (s.is_marked(~lit) && lit != ~l) {
tautology = true; tautology = true;
break; break;
} }
} }
if (!tautology) { if (!tautology) {
if (first) { if (first) {
for (literal lit : c) { for (literal lit : c) {
if (lit != ~l && !s.is_marked(lit)) inter.push_back(lit); if (lit != ~l && !s.is_marked(lit)) inter.push_back(lit);
} }
first = false; first = false;
if (inter.empty()) return false; if (inter.empty()) return false;
} }
else { else {
unsigned j = 0; unsigned j = 0;
for (literal lit : inter) for (literal lit : inter)
if (c.contains(lit)) if (c.contains(lit))
inter[j++] = lit; inter[j++] = lit;
inter.shrink(j); inter.shrink(j);
if (j == 0) return false; if (j == 0) return false;
}
} }
} }
it.next();
} }
return first; return first;
} }
@ -1206,12 +1203,12 @@ namespace sat {
} }
void cce() { void cce() {
insert_queue();
cce_clauses(); cce_clauses();
cce_binary(); cce_binary();
} }
void cce_binary() { void cce_binary() {
insert_queue();
while (!m_queue.empty() && m_counter >= 0) { while (!m_queue.empty() && m_counter >= 0) {
s.checkpoint(); s.checkpoint();
process_cce_binary(m_queue.next()); process_cce_binary(m_queue.next());
@ -1311,6 +1308,7 @@ namespace sat {
} }
void bca() { void bca() {
m_queue.reset();
insert_queue(); insert_queue();
while (!m_queue.empty() && m_counter >= 0) { while (!m_queue.empty() && m_counter >= 0) {
s.checkpoint(); s.checkpoint();
@ -1360,20 +1358,18 @@ namespace sat {
clause_use_list & neg_occs = s.m_use_list.get(~l); clause_use_list & neg_occs = s.m_use_list.get(~l);
clause_use_list::iterator it = neg_occs.mk_iterator(); clause_use_list::iterator it = neg_occs.mk_iterator();
while (!it.at_end()) { for (; !it.at_end(); it.next()) {
clause & c = it.curr(); clause & c = it.curr();
if (!c.is_blocked()) { if (c.is_blocked()) continue;
m_counter -= c.size(); m_counter -= c.size();
unsigned sz = c.size(); unsigned sz = c.size();
unsigned i; unsigned i;
for (i = 0; i < sz; i++) { for (i = 0; i < sz; i++) {
if (s.is_marked(~c[i])) if (s.is_marked(~c[i]))
break; break;
}
if (i == sz)
return false;
} }
it.next(); if (i == sz)
return false;
} }
if (s.s.m_ext) { if (s.s.m_ext) {

View file

@ -70,10 +70,11 @@ class inc_sat_solver : public solver {
bool m_internalized; // are formulas internalized? bool m_internalized; // are formulas internalized?
bool m_internalized_converted; // have internalized formulas been converted back bool m_internalized_converted; // have internalized formulas been converted back
expr_ref_vector m_internalized_fmls; // formulas in internalized format expr_ref_vector m_internalized_fmls; // formulas in internalized format
bool m_incremental_mode;
typedef obj_map<expr, sat::literal> dep2asm_t; typedef obj_map<expr, sat::literal> dep2asm_t;
public: public:
inc_sat_solver(ast_manager& m, params_ref const& p): inc_sat_solver(ast_manager& m, params_ref const& p, bool incremental_mode):
m(m), m(m),
m_solver(p, m.limit()), m_solver(p, m.limit()),
m_params(p), m_params(p),
@ -87,7 +88,8 @@ public:
m_unknown("no reason given"), m_unknown("no reason given"),
m_internalized(false), m_internalized(false),
m_internalized_converted(false), m_internalized_converted(false),
m_internalized_fmls(m) { m_internalized_fmls(m),
m_incremental_mode(incremental_mode) {
updt_params(p); updt_params(p);
init_preprocess(); init_preprocess();
} }
@ -100,7 +102,7 @@ public:
} }
ast_translation tr(m, dst_m); ast_translation tr(m, dst_m);
m_solver.pop_to_base_level(); m_solver.pop_to_base_level();
inc_sat_solver* result = alloc(inc_sat_solver, dst_m, p); inc_sat_solver* result = alloc(inc_sat_solver, dst_m, p, m_incremental_mode);
result->m_solver.copy(m_solver); result->m_solver.copy(m_solver);
result->m_fmls_head = m_fmls_head; result->m_fmls_head = m_fmls_head;
for (expr* f : m_fmls) result->m_fmls.push_back(tr(f)); for (expr* f : m_fmls) result->m_fmls.push_back(tr(f));
@ -272,7 +274,10 @@ public:
virtual void updt_params(params_ref const & p) { virtual void updt_params(params_ref const & p) {
m_params.append(p); m_params.append(p);
sat_params p1(p); sat_params p1(p);
m_params.set_bool("elim_vars", false); if (m_incremental_mode) {
m_params.set_bool("elim_vars", false);
m_params.set_uint("elim_blocked_clauses_at", UINT_MAX);
}
m_params.set_bool("keep_cardinality_constraints", p1.cardinality_solver()); m_params.set_bool("keep_cardinality_constraints", p1.cardinality_solver());
m_params.set_bool("keep_pb_constraints", m_solver.get_config().m_pb_solver == sat::PB_SOLVER); m_params.set_bool("keep_pb_constraints", m_solver.get_config().m_pb_solver == sat::PB_SOLVER);
m_params.set_bool("pb_num_system", m_solver.get_config().m_pb_solver == sat::PB_SORTING); m_params.set_bool("pb_num_system", m_solver.get_config().m_pb_solver == sat::PB_SORTING);
@ -849,8 +854,8 @@ private:
}; };
solver* mk_inc_sat_solver(ast_manager& m, params_ref const& _p) { solver* mk_inc_sat_solver(ast_manager& m, params_ref const& p, bool incremental_mode) {
return alloc(inc_sat_solver, m, _p); return alloc(inc_sat_solver, m, p, incremental_mode);
} }

View file

@ -22,7 +22,7 @@ Notes:
#include "solver/solver.h" #include "solver/solver.h"
solver* mk_inc_sat_solver(ast_manager& m, params_ref const& p); solver* mk_inc_sat_solver(ast_manager& m, params_ref const& p, bool incremental_mode = true);
void inc_sat_display(std::ostream& out, solver& s, unsigned sz, expr*const* soft, rational const* _weights); void inc_sat_display(std::ostream& out, solver& s, unsigned sz, expr*const* soft, rational const* _weights);

View file

@ -25,8 +25,8 @@ Notes:
#include "tactic/portfolio/bounded_int2bv_solver.h" #include "tactic/portfolio/bounded_int2bv_solver.h"
#include "solver/solver2tactic.h" #include "solver/solver2tactic.h"
solver * mk_fd_solver(ast_manager & m, params_ref const & p) { solver * mk_fd_solver(ast_manager & m, params_ref const & p, bool incremental_mode) {
solver* s = mk_inc_sat_solver(m, p); solver* s = mk_inc_sat_solver(m, p, incremental_mode);
s = mk_enum2bv_solver(m, p, s); s = mk_enum2bv_solver(m, p, s);
s = mk_pb2bv_solver(m, p, s); s = mk_pb2bv_solver(m, p, s);
s = mk_bounded_int2bv_solver(m, p, s); s = mk_bounded_int2bv_solver(m, p, s);
@ -34,5 +34,5 @@ solver * mk_fd_solver(ast_manager & m, params_ref const & p) {
} }
tactic * mk_fd_tactic(ast_manager & m, params_ref const& p) { tactic * mk_fd_tactic(ast_manager & m, params_ref const& p) {
return mk_solver2tactic(mk_fd_solver(m, p)); return mk_solver2tactic(mk_fd_solver(m, p, false));
} }

View file

@ -25,7 +25,7 @@ Notes:
class solver; class solver;
class tactic; class tactic;
solver * mk_fd_solver(ast_manager & m, params_ref const & p); solver * mk_fd_solver(ast_manager & m, params_ref const & p, bool incremental_mode = true);
tactic * mk_fd_tactic(ast_manager & m, params_ref const & p); tactic * mk_fd_tactic(ast_manager & m, params_ref const & p);
/* /*