3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 17:45:32 +00:00

Add search_iterator

This commit is contained in:
Jakob Rath 2021-09-10 15:34:31 +02:00
parent 8a1a202133
commit b644fe0f3d
2 changed files with 59 additions and 2 deletions

View file

@ -74,4 +74,60 @@ namespace polysat {
inline std::ostream& operator<<(std::ostream& out, search_state const& s) { return s.display(out); }
// Go backwards over the search_state
class search_iterator {
search_state* m_search;
unsigned current;
unsigned first;
struct idx_range {
unsigned current;
unsigned first; // highest index + 1
};
vector<idx_range> m_index_stack;
public:
search_iterator(search_state& search):
m_search(&search) {
first = m_search->size();
current = first; // we start one before the beginning, then it also works for empty m_search
}
search_item const& operator*() const {
return (*m_search)[current];
}
unsigned last() {
return m_index_stack.empty() ? 0 : m_index_stack.back().first;
}
bool next() {
if (current > last()) {
--current;
return true;
}
else {
SASSERT(current == last());
if (m_index_stack.empty())
return false;
current = m_index_stack.back().current;
first = m_index_stack.back().first;
m_index_stack.pop_back();
return true;
}
}
// to be called after all saturations for a step are done
void push_block() {
if (first != m_search->size()) {
m_index_stack.push_back({current, first});
first = m_search->size();
current = first - 1;
}
}
};
}

View file

@ -472,9 +472,10 @@ namespace polysat {
set_marks(m_conflict);
}
for (unsigned i = m_search.size(); i-- > 0; ) {
search_iterator search_it(m_search);
while (search_it.next()) {
LOG("Conflict: " << m_conflict);
auto const& item = m_search[i];
auto const& item = *search_it;
if (item.is_assignment()) {
// Resolve over variable assignment
pvar v = item.var();