3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-19 19:02:02 +00:00

Comments in pdr_context.cpp

This commit is contained in:
Arie Gurfinkel 2018-06-05 16:12:12 -07:00
parent ece2e53c98
commit ab5f579d0b

View file

@ -876,6 +876,7 @@ namespace pdr {
return out; return out;
} }
// return order of this node in the children of its parent
unsigned model_node::index() const { unsigned model_node::index() const {
model_node* p = parent(); model_node* p = parent();
if (!p) return 0; if (!p) return 0;
@ -886,7 +887,8 @@ namespace pdr {
return 0; return 0;
} }
// detach this node from a queue with the head root
// requires: root is a head of a queue
void model_node::dequeue(model_node*& root) { void model_node::dequeue(model_node*& root) {
TRACE("pdr", tout << this << " root: " << root << " " << state() << "\n";); TRACE("pdr", tout << this << " root: " << root << " " << state() << "\n";);
if (!m_next && !m_prev) return; if (!m_next && !m_prev) return;
@ -912,6 +914,8 @@ namespace pdr {
} }
// insert node n after this in the queue
// requires: this is in a queue or this == n
void model_node::enqueue(model_node* n) { void model_node::enqueue(model_node* n) {
TRACE("pdr", tout << n << " " << n->state() << "\n";); TRACE("pdr", tout << n << " " << n->state() << "\n";);
SASSERT(!n->m_next); SASSERT(!n->m_next);
@ -963,6 +967,7 @@ namespace pdr {
} }
void model_search::set_leaf(model_node& n) { void model_search::set_leaf(model_node& n) {
// remove all children that n might have
erase_children(n, true); erase_children(n, true);
SASSERT(n.is_open()); SASSERT(n.is_open());
enqueue_leaf(&n); enqueue_leaf(&n);
@ -971,13 +976,16 @@ namespace pdr {
void model_search::enqueue_leaf(model_node* n) { void model_search::enqueue_leaf(model_node* n) {
TRACE("pdr_verbose", tout << "node: " << n << " " << n->state() << " goal: " << m_goal << "\n";); TRACE("pdr_verbose", tout << "node: " << n << " " << n->state() << " goal: " << m_goal << "\n";);
SASSERT(n->is_open()); SASSERT(n->is_open());
// queue is empty, initialize it with n
if (!m_goal) { if (!m_goal) {
m_goal = n; m_goal = n;
m_goal->enqueue(n); m_goal->enqueue(n);
} }
// insert n after m_goal
else if (m_bfs) { else if (m_bfs) {
m_goal->enqueue(n); m_goal->enqueue(n);
} }
// insert n after m_goal()->next()
else { else {
m_goal->next()->enqueue(n); m_goal->next()->enqueue(n);
} }
@ -1002,7 +1010,9 @@ namespace pdr {
void model_search::erase_children(model_node& n, bool backtrack) { void model_search::erase_children(model_node& n, bool backtrack) {
ptr_vector<model_node> todo, nodes; ptr_vector<model_node> todo, nodes;
todo.append(n.children()); todo.append(n.children());
// detach n from queue
remove_goal(n); remove_goal(n);
// removes children
n.reset(); n.reset();
while (!todo.empty()) { while (!todo.empty()) {
model_node* m = todo.back(); model_node* m = todo.back();
@ -1014,10 +1024,12 @@ namespace pdr {
std::for_each(nodes.begin(), nodes.end(), delete_proc<model_node>()); std::for_each(nodes.begin(), nodes.end(), delete_proc<model_node>());
} }
// removes node from the search tree and from the cache
void model_search::remove_node(model_node& n, bool backtrack) { void model_search::remove_node(model_node& n, bool backtrack) {
TRACE("pdr_verbose", tout << "remove: " << n.level() << ": " << &n << " " << n.state() << "\n";); TRACE("pdr_verbose", tout << "remove: " << n.level() << ": " << &n << " " << n.state() << "\n";);
model_nodes& nodes = cache(n).find(n.state()); model_nodes& nodes = cache(n).find(n.state());
nodes.erase(&n); nodes.erase(&n);
// detach n from m_goals
remove_goal(n); remove_goal(n);
// TBD: siblings would also fail if n is not a goal. // TBD: siblings would also fail if n is not a goal.
if (!nodes.empty() && backtrack && nodes[0]->children().empty() && nodes[0]->is_closed()) { if (!nodes.empty() && backtrack && nodes[0]->children().empty() && nodes[0]->is_closed()) {
@ -1036,6 +1048,7 @@ namespace pdr {
} }
} }
// detach node n from the queue m_goal
void model_search::remove_goal(model_node& n) { void model_search::remove_goal(model_node& n) {
n.dequeue(m_goal); n.dequeue(m_goal);
} }