3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-27 10:55:50 +00:00

interleave linear solver calls

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-05-14 11:31:35 -07:00
parent 118dc0f3b4
commit 17fcf79c04
4 changed files with 26 additions and 7 deletions

View file

@ -68,6 +68,7 @@ namespace polysat {
solver::solver(reslimit& lim):
m_lim(lim),
m_linear_solver(*this),
m_bdd(1000),
m_dm(m_value_manager, m_alloc),
m_free_vars(m_activity) {
@ -155,6 +156,7 @@ namespace polysat {
void solver::new_constraint(constraint* c) {
SASSERT(c);
LOG("New constraint: " << *c);
m_linear_solver.new_constraint(*c);
m_constraints.push_back(c);
SASSERT(!get_bv2c(c->bvar()));
insert_bv2c(c->bvar(), c);
@ -243,6 +245,7 @@ namespace polysat {
m_assign_eh_history.push_back(v);
m_trail.push_back(trail_instr_t::assign_eh_i);
c->narrow(*this);
m_linear_solver.activate_constraint(*c);
}
@ -254,6 +257,13 @@ namespace polysat {
push_qhead();
while (can_propagate())
propagate(m_search[m_qhead++].first);
switch (m_linear_solver.check()) {
case l_false:
// TODO extract conflict
break;
default:
break;
}
SASSERT(wlist_invariant());
}
@ -282,10 +292,12 @@ namespace polysat {
void solver::push_level() {
++m_level;
m_trail.push_back(trail_instr_t::inc_level_i);
m_linear_solver.push();
}
void solver::pop_levels(unsigned num_levels) {
LOG("Pop " << num_levels << " levels; current level is " << m_level);
m_linear_solver.pop(num_levels);
while (num_levels > 0) {
switch (m_trail.back()) {
case trail_instr_t::qhead_i: {
@ -422,6 +434,7 @@ namespace polysat {
m_search.push_back(std::make_pair(v, val));
m_trail.push_back(trail_instr_t::assign_i);
m_justification[v] = j;
m_linear_solver.set_value(v, val);
}
void solver::set_conflict(constraint& c) {
@ -777,9 +790,9 @@ namespace polysat {
cs.append(m_constraints.size(), m_constraints.data());
cs.append(m_redundant.size(), m_redundant.data());
for (auto* c : cs) {
unsigned num_watches = 0;
int64_t num_watches = 0;
for (auto const& wlist : m_watch) {
unsigned n = std::count(wlist.begin(), wlist.end(), c);
auto n = std::count(wlist.begin(), wlist.end(), c);
VERIFY(n <= 1); // no duplicates in the watchlist
num_watches += n;
}