3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-05-05 14:55:45 +00:00
z3/src/math/polysat/search_state.cpp
Nikolaj Bjorner 8d3c3ede39 save
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2021-12-08 12:40:44 -08:00

69 lines
1.7 KiB
C++

/*++
Copyright (c) 2021 Microsoft Corporation
Module Name:
polysat search state
Author:
Nikolaj Bjorner (nbjorner) 2021-03-19
Jakob Rath 2021-04-6
--*/
#include "math/polysat/search_state.h"
namespace polysat {
std::ostream& search_state::display(search_item const& item, std::ostream& out) const {
rational r;
switch (item.kind()) {
case search_item_k::assignment:
if (value(item.var(), r))
return out << "v" << item.var() << " := " << r;
else
return out << "v" << item.var() << " := *";
case search_item_k::boolean:
return out << item.lit();
}
UNREACHABLE();
return out;
}
std::ostream& search_state::display(std::ostream& out) const {
for (auto const& item : m_items)
display(item, out) << " ";
return out;
}
bool search_state::value(pvar v, rational& val) const {
for (auto const& [p, r] : m_assignment)
if (v == p) {
val = r;
return true;
}
return false;
}
void search_state::push_assignment(pvar p, rational const& r) {
m_items.push_back(search_item::assignment(p));
m_assignment.push_back({p, r});
}
void search_state::pop_asssignment() {
m_assignment.pop_back();
}
void search_state::push_boolean(sat::literal lit) {
m_items.push_back(search_item::boolean(lit));
}
void search_state::pop() {
auto const& item = m_items.back();
if (item.is_assignment() && !m_assignment.empty() && item.var() == m_assignment.back().first)
m_assignment.pop_back();
m_items.pop_back();
}
}