diff --git a/src/smt/smt_case_split_queue.cpp b/src/smt/smt_case_split_queue.cpp index 41a269820..c461b130b 100644 --- a/src/smt/smt_case_split_queue.cpp +++ b/src/smt/smt_case_split_queue.cpp @@ -51,9 +51,9 @@ namespace smt { if (!m_theory_var_priority.find(v2, p_v2)) { p_v2 = 0.0; } - // add clause activity - p_v1 += m_activity[v1]; - p_v2 += m_activity[v2]; + // add clause activity + p_v1 += m_activity[v1]; + p_v2 += m_activity[v2]; return p_v1 > p_v2; } }; @@ -82,6 +82,7 @@ namespace smt { virtual void mk_var_eh(bool_var v) { m_queue.reserve(v+1); + SASSERT(!m_queue.contains(v)); m_queue.insert(v); } @@ -130,10 +131,7 @@ namespace smt { virtual void display(std::ostream & out) { bool first = true; - bool_var_act_queue::const_iterator it = m_queue.begin(); - bool_var_act_queue::const_iterator end = m_queue.end(); - for (; it != end ; ++it) { - unsigned v = *it; + for (unsigned v : m_queue) { if (m_context.get_assignment(v) == l_undef) { if (first) { out << "remaining case-splits:\n"; @@ -143,8 +141,7 @@ namespace smt { } } if (!first) - out << "\n"; - + out << "\n"; } virtual ~act_case_split_queue() {}; @@ -166,11 +163,15 @@ namespace smt { act_case_split_queue::activity_increased_eh(v); if (m_queue.contains(v)) m_queue.decreased(v); + if (m_delayed_queue.contains(v)) + m_delayed_queue.decreased(v); } virtual void mk_var_eh(bool_var v) { m_queue.reserve(v+1); m_delayed_queue.reserve(v+1); + SASSERT(!m_delayed_queue.contains(v)); + SASSERT(!m_queue.contains(v)); if (m_context.is_searching()) m_delayed_queue.insert(v); else @@ -1099,8 +1100,6 @@ namespace smt { #endif GOAL_STOP(); - - //std::cout << "goal set, time " << m_goal_time.get_seconds() << "\n"; } void set_global_generation() diff --git a/src/smt/smt_context.cpp b/src/smt/smt_context.cpp index 4e56d3004..b5789a597 100644 --- a/src/smt/smt_context.cpp +++ b/src/smt/smt_context.cpp @@ -1826,6 +1826,7 @@ namespace smt { } void context::rescale_bool_var_activity() { + TRACE("case_split", tout << "rescale\n";); svector::iterator it = m_activity.begin(); svector::iterator end = m_activity.end(); for (; it != end; ++it) diff --git a/src/smt/smt_context.h b/src/smt/smt_context.h index 9c70f5999..6b3129d91 100644 --- a/src/smt/smt_context.h +++ b/src/smt/smt_context.h @@ -1040,6 +1040,7 @@ namespace smt { if (act > ACTIVITY_LIMIT) rescale_bool_var_activity(); m_case_split_queue->activity_increased_eh(v); + TRACE("case_split", tout << "v" << v << " " << m_bvar_inc << " -> " << act << "\n";); } protected: diff --git a/src/util/heap.h b/src/util/heap.h index e8964a4f0..cde2451db 100644 --- a/src/util/heap.h +++ b/src/util/heap.h @@ -43,6 +43,15 @@ class heap : private LT { return i >> 1; } + void display(std::ostream& out, unsigned indent, int idx) const { + if (idx < static_cast(m_values.size())) { + for (unsigned i = 0; i < indent; ++i) out << " "; + out << m_values[idx] << "\n"; + display(out, indent + 1, left(idx)); + display(out, indent + 1, right(idx)); + } + } + #ifdef Z3DEBUG // Return true if the value can be inserted in the heap. That is, the vector m_value2indices is big enough to store this value. bool is_valid_value(int v) const { @@ -59,10 +68,13 @@ class heap : private LT { } return true; } + + public: bool check_invariant() const { return check_invariant_core(1); } + #endif private: @@ -219,6 +231,7 @@ public: void insert(int val) { CASSERT("heap", check_invariant()); + CASSERT("heap", !contains(val)); SASSERT(is_valid_value(val)); int idx = static_cast(m_values.size()); m_value2indices[val] = idx; @@ -272,6 +285,11 @@ public: } } } + + void display(std::ostream& out) const { + display(out, 0, 1); + } + };