3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-30 12:25:51 +00:00
z3/src/math/polysat/boolean.cpp
Nikolaj Bjorner 04ce8ca5ef u256, separate viable_set
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-07-04 23:47:12 -07:00

96 lines
2.9 KiB
C++

/*++
Copyright (c) 2021 Microsoft Corporation
Module Name:
polysat boolean variables
Author:
Jakob Rath 2021-04-6
--*/
#include "math/polysat/boolean.h"
#include "math/polysat/log.h"
namespace polysat {
sat::bool_var bool_var_manager::new_var() {
if (m_unused.empty()) {
sat::bool_var var = size();
m_value.push_back(l_undef);
m_value.push_back(l_undef);
m_level.push_back(UINT_MAX);
m_reason.push_back(nullptr);
m_lemma.push_back(nullptr);
return var;
}
else {
sat::bool_var var = m_unused.back();
m_unused.pop_back();
SASSERT_EQ(m_level[var], UINT_MAX);
SASSERT_EQ(m_value[2*var], l_undef);
SASSERT_EQ(m_value[2*var+1], l_undef);
SASSERT_EQ(m_reason[var], nullptr);
SASSERT_EQ(m_lemma[var], nullptr);
return var;
}
}
void bool_var_manager::del_var(sat::bool_var var) {
SASSERT(std::all_of(m_unused.begin(), m_unused.end(), [var](unsigned unused_var) { return var != unused_var; }));
auto lit = sat::literal(var);
m_value[lit.index()] = l_undef;
m_value[(~lit).index()] = l_undef;
m_level[var] = UINT_MAX;
m_reason[var] = nullptr;
m_lemma[var] = nullptr;
// TODO: this is disabled for now, since re-using variables for different constraints may be confusing during debugging. Should be enabled later.
// m_unused.push_back(var);
}
void bool_var_manager::assign(sat::literal lit, unsigned lvl, clause* reason, clause* lemma) {
SASSERT(!is_assigned(lit));
m_value[lit.index()] = l_true;
m_value[(~lit).index()] = l_false;
m_level[lit.var()] = lvl;
m_reason[lit.var()] = reason;
m_lemma[lit.var()] = lemma;
}
void bool_var_manager::unassign(sat::literal lit) {
SASSERT(is_assigned(lit));
m_value[lit.index()] = l_undef;
m_value[(~lit).index()] = l_undef;
m_level[lit.var()] = UINT_MAX;
m_reason[lit.var()] = nullptr;
m_lemma[lit.var()] = nullptr;
}
void bool_var_manager::reset_marks() {
LOG_V("-------------------------- (reset boolean marks)");
m_marks.reserve(size());
m_clock++;
if (m_clock != 0)
return;
m_clock++;
m_marks.fill(0);
}
void bool_var_manager::set_mark(sat::bool_var var) {
LOG_V("Marking: b" << var);
SASSERT(var != sat::null_bool_var);
m_marks[var] = m_clock;
}
std::ostream& bool_var_manager::display(std::ostream& out) const {
for (sat::bool_var v = 0; v < size(); ++v) {
sat::literal lit{v};
if (value(lit) == l_true)
out << " " << lit;
if (value(lit) == l_false)
out << " " << ~lit;
}
return out;
}
}