mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 04:03:39 +00:00
fix bug exposed when running test-z3.exe /a in debug mode, #1159. Add assertions to heap interaction
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
9d6be286d0
commit
9f9c575451
|
@ -51,9 +51,9 @@ namespace smt {
|
||||||
if (!m_theory_var_priority.find(v2, p_v2)) {
|
if (!m_theory_var_priority.find(v2, p_v2)) {
|
||||||
p_v2 = 0.0;
|
p_v2 = 0.0;
|
||||||
}
|
}
|
||||||
// add clause activity
|
// add clause activity
|
||||||
p_v1 += m_activity[v1];
|
p_v1 += m_activity[v1];
|
||||||
p_v2 += m_activity[v2];
|
p_v2 += m_activity[v2];
|
||||||
return p_v1 > p_v2;
|
return p_v1 > p_v2;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -82,6 +82,7 @@ namespace smt {
|
||||||
|
|
||||||
virtual void mk_var_eh(bool_var v) {
|
virtual void mk_var_eh(bool_var v) {
|
||||||
m_queue.reserve(v+1);
|
m_queue.reserve(v+1);
|
||||||
|
SASSERT(!m_queue.contains(v));
|
||||||
m_queue.insert(v);
|
m_queue.insert(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,10 +131,7 @@ namespace smt {
|
||||||
|
|
||||||
virtual void display(std::ostream & out) {
|
virtual void display(std::ostream & out) {
|
||||||
bool first = true;
|
bool first = true;
|
||||||
bool_var_act_queue::const_iterator it = m_queue.begin();
|
for (unsigned v : m_queue) {
|
||||||
bool_var_act_queue::const_iterator end = m_queue.end();
|
|
||||||
for (; it != end ; ++it) {
|
|
||||||
unsigned v = *it;
|
|
||||||
if (m_context.get_assignment(v) == l_undef) {
|
if (m_context.get_assignment(v) == l_undef) {
|
||||||
if (first) {
|
if (first) {
|
||||||
out << "remaining case-splits:\n";
|
out << "remaining case-splits:\n";
|
||||||
|
@ -143,8 +141,7 @@ namespace smt {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!first)
|
if (!first)
|
||||||
out << "\n";
|
out << "\n";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~act_case_split_queue() {};
|
virtual ~act_case_split_queue() {};
|
||||||
|
@ -166,11 +163,15 @@ namespace smt {
|
||||||
act_case_split_queue::activity_increased_eh(v);
|
act_case_split_queue::activity_increased_eh(v);
|
||||||
if (m_queue.contains(v))
|
if (m_queue.contains(v))
|
||||||
m_queue.decreased(v);
|
m_queue.decreased(v);
|
||||||
|
if (m_delayed_queue.contains(v))
|
||||||
|
m_delayed_queue.decreased(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void mk_var_eh(bool_var v) {
|
virtual void mk_var_eh(bool_var v) {
|
||||||
m_queue.reserve(v+1);
|
m_queue.reserve(v+1);
|
||||||
m_delayed_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())
|
if (m_context.is_searching())
|
||||||
m_delayed_queue.insert(v);
|
m_delayed_queue.insert(v);
|
||||||
else
|
else
|
||||||
|
@ -1099,8 +1100,6 @@ namespace smt {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GOAL_STOP();
|
GOAL_STOP();
|
||||||
|
|
||||||
//std::cout << "goal set, time " << m_goal_time.get_seconds() << "\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_global_generation()
|
void set_global_generation()
|
||||||
|
|
|
@ -1826,6 +1826,7 @@ namespace smt {
|
||||||
}
|
}
|
||||||
|
|
||||||
void context::rescale_bool_var_activity() {
|
void context::rescale_bool_var_activity() {
|
||||||
|
TRACE("case_split", tout << "rescale\n";);
|
||||||
svector<double>::iterator it = m_activity.begin();
|
svector<double>::iterator it = m_activity.begin();
|
||||||
svector<double>::iterator end = m_activity.end();
|
svector<double>::iterator end = m_activity.end();
|
||||||
for (; it != end; ++it)
|
for (; it != end; ++it)
|
||||||
|
|
|
@ -1040,6 +1040,7 @@ namespace smt {
|
||||||
if (act > ACTIVITY_LIMIT)
|
if (act > ACTIVITY_LIMIT)
|
||||||
rescale_bool_var_activity();
|
rescale_bool_var_activity();
|
||||||
m_case_split_queue->activity_increased_eh(v);
|
m_case_split_queue->activity_increased_eh(v);
|
||||||
|
TRACE("case_split", tout << "v" << v << " " << m_bvar_inc << " -> " << act << "\n";);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -43,6 +43,15 @@ class heap : private LT {
|
||||||
return i >> 1;
|
return i >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void display(std::ostream& out, unsigned indent, int idx) const {
|
||||||
|
if (idx < static_cast<int>(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
|
#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.
|
// 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 {
|
bool is_valid_value(int v) const {
|
||||||
|
@ -59,10 +68,13 @@ class heap : private LT {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool check_invariant() const {
|
bool check_invariant() const {
|
||||||
return check_invariant_core(1);
|
return check_invariant_core(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -219,6 +231,7 @@ public:
|
||||||
|
|
||||||
void insert(int val) {
|
void insert(int val) {
|
||||||
CASSERT("heap", check_invariant());
|
CASSERT("heap", check_invariant());
|
||||||
|
CASSERT("heap", !contains(val));
|
||||||
SASSERT(is_valid_value(val));
|
SASSERT(is_valid_value(val));
|
||||||
int idx = static_cast<int>(m_values.size());
|
int idx = static_cast<int>(m_values.size());
|
||||||
m_value2indices[val] = idx;
|
m_value2indices[val] = idx;
|
||||||
|
@ -272,6 +285,11 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void display(std::ostream& out) const {
|
||||||
|
display(out, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue