mirror of
https://github.com/Z3Prover/z3
synced 2025-06-24 06:43:40 +00:00
Revert "remove overcomplicated search_iterator"
This reverts commit 309473edad
.
This commit is contained in:
parent
31ffe89480
commit
9766ad00b1
2 changed files with 78 additions and 6 deletions
|
@ -106,4 +106,74 @@ namespace polysat {
|
||||||
|
|
||||||
inline std::ostream& operator<<(std::ostream& out, search_item_pp const& p) { return p.verbose ? p.s.display_verbose(p.i, out) : p.s.display(p.i, out); }
|
inline std::ostream& operator<<(std::ostream& out, search_item_pp const& p) { return p.verbose ? p.s.display_verbose(p.i, out) : p.s.display(p.i, out); }
|
||||||
|
|
||||||
|
// Go backwards over the search_state.
|
||||||
|
// If new entries are added during processing an item, they will be queued for processing next after the current item.
|
||||||
|
class search_iterator {
|
||||||
|
|
||||||
|
search_state* m_search;
|
||||||
|
|
||||||
|
unsigned current;
|
||||||
|
unsigned first; // highest index + 1
|
||||||
|
|
||||||
|
struct idx_range {
|
||||||
|
unsigned current;
|
||||||
|
unsigned first; // highest index + 1
|
||||||
|
};
|
||||||
|
vector<idx_range> m_index_stack;
|
||||||
|
|
||||||
|
void init() {
|
||||||
|
first = m_search->size();
|
||||||
|
current = first; // we start one before the beginning
|
||||||
|
}
|
||||||
|
|
||||||
|
void try_push_block() {
|
||||||
|
if (first != m_search->size()) {
|
||||||
|
m_index_stack.push_back({current, first});
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void pop_block() {
|
||||||
|
current = m_index_stack.back().current;
|
||||||
|
// We don't restore 'first', otherwise 'next()' will immediately push a new block again.
|
||||||
|
// Instead, the current block is merged with the popped one.
|
||||||
|
m_index_stack.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned last() {
|
||||||
|
return m_index_stack.empty() ? 0 : m_index_stack.back().first;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
search_iterator(search_state& search):
|
||||||
|
m_search(&search) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_resolved() {
|
||||||
|
m_search->set_resolved(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
search_item const& operator*() {
|
||||||
|
return (*m_search)[current];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool next() {
|
||||||
|
#if 1 // If you want to resolve over constraints that have been added during conflict resolution, enable this.
|
||||||
|
try_push_block();
|
||||||
|
#endif
|
||||||
|
if (current > last()) {
|
||||||
|
--current;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SASSERT(current == last());
|
||||||
|
if (m_index_stack.empty())
|
||||||
|
return false;
|
||||||
|
pop_block();
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -624,9 +624,10 @@ namespace polysat {
|
||||||
}
|
}
|
||||||
m_conflict.begin_conflict("resolve_conflict");
|
m_conflict.begin_conflict("resolve_conflict");
|
||||||
|
|
||||||
for (unsigned i = m_search.size(); i-- > 0; ) {
|
search_iterator search_it(m_search);
|
||||||
auto& item = m_search[i];
|
while (search_it.next()) {
|
||||||
m_search.set_resolved(i);
|
auto& item = *search_it;
|
||||||
|
search_it.set_resolved();
|
||||||
if (item.is_assignment()) {
|
if (item.is_assignment()) {
|
||||||
// Resolve over variable assignment
|
// Resolve over variable assignment
|
||||||
pvar v = item.var();
|
pvar v = item.var();
|
||||||
|
@ -721,9 +722,10 @@ namespace polysat {
|
||||||
*/
|
*/
|
||||||
void solver::backtrack_fi() {
|
void solver::backtrack_fi() {
|
||||||
uint_set relevant_vars;
|
uint_set relevant_vars;
|
||||||
for (unsigned i = m_search.size(); i-- > 0; ) {
|
search_iterator search_it(m_search);
|
||||||
auto& item = m_search[i];
|
while (search_it.next()) {
|
||||||
m_search.set_resolved(i);
|
auto& item = *search_it;
|
||||||
|
search_it.set_resolved();
|
||||||
if (item.is_assignment()) {
|
if (item.is_assignment()) {
|
||||||
// Resolve over variable assignment
|
// Resolve over variable assignment
|
||||||
pvar v = item.var();
|
pvar v = item.var();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue