diff --git a/src/math/polysat/pvar_queue.h b/src/math/polysat/pvar_queue.h index 7245153ca..dfb080d13 100644 --- a/src/math/polysat/pvar_queue.h +++ b/src/math/polysat/pvar_queue.h @@ -3,11 +3,11 @@ Copyright (c) 2011 Microsoft Corporation Module Name: - var_queue.h + pvar_queue.h Abstract: - SAT variable priority queue. + polysat variable priority queue. Author: @@ -21,61 +21,63 @@ Revision History: #include "util/heap.h" - -class var_queue { +class pvar_queue { typedef unsigned var; - struct lt { - svector & m_activity; - lt(svector & act):m_activity(act) {} - bool operator()(var v1, var v2) const { return m_activity[v1] > m_activity[v2]; } + class lt { + unsigned_vector const& m_size; + unsigned_vector const& m_activity; + public: + lt(unsigned_vector const& sz, unsigned_vector const& act): m_size(sz), m_activity(act) {} + bool operator()(var v1, var v2) const { + return m_size[v1] > m_size[v2] + || (m_size[v1] == m_size[v2] && m_activity[v1] > m_activity[v2]); + } }; - heap m_queue; + + heap m_queue; public: - - var_queue(svector & act):m_queue(128, lt(act)) {} - + pvar_queue(unsigned_vector const& sz, unsigned_vector const& act): m_queue(128, lt(sz, act)) {} + void activity_increased_eh(var v) { if (m_queue.contains(v)) m_queue.decreased(v); } - + void activity_changed_eh(var v, bool up) { if (m_queue.contains(v)) { - if (up) + if (up) m_queue.decreased(v); - else + else m_queue.increased(v); } } - + void mk_var_eh(var v) { m_queue.reserve(v+1); unassign_var_eh(v); } - + void del_var_eh(var v) { if (m_queue.contains(v)) m_queue.erase(v); } - + void unassign_var_eh(var v) { if (!m_queue.contains(v)) m_queue.insert(v); } - + void reset() { m_queue.reset(); } - + bool empty() const { return m_queue.empty(); } - + var next_var() { SASSERT(!empty()); return m_queue.erase_min(); } - + var min_var() { SASSERT(!empty()); return m_queue.min_value(); } - - bool more_active(var v1, var v2) const { return m_queue.less_than(v1, v2); } std::ostream& display(std::ostream& out) const { bool first = true; @@ -95,6 +97,6 @@ public: const_iterator end() const { return m_queue.end(); } }; -inline std::ostream& operator<<(std::ostream& out, var_queue const& queue) { +inline std::ostream& operator<<(std::ostream& out, pvar_queue const& queue) { return queue.display(out); } diff --git a/src/math/polysat/solver.cpp b/src/math/polysat/solver.cpp index 67771aaba..67e70015f 100644 --- a/src/math/polysat/solver.cpp +++ b/src/math/polysat/solver.cpp @@ -55,7 +55,7 @@ namespace polysat { m_simplify(*this), m_restart(*this), m_bvars(*this), - m_free_pvars(m_activity), + m_free_pvars(m_size, m_activity), m_constraints(*this), m_names(*this), m_slicing(*this), diff --git a/src/math/polysat/solver.h b/src/math/polysat/solver.h index e9215a391..e651ffe4d 100644 --- a/src/math/polysat/solver.h +++ b/src/math/polysat/solver.h @@ -34,6 +34,7 @@ Author: #include "math/polysat/search_state.h" #include "math/polysat/assignment.h" #include "math/polysat/trail.h" +#include "math/polysat/pvar_queue.h" #include "math/polysat/viable.h" #include "math/polysat/log.h" #include @@ -170,7 +171,7 @@ namespace polysat { simplify m_simplify; restart m_restart; bool_var_manager m_bvars; // Map boolean variables to constraints - var_queue m_free_pvars; // free poly vars + pvar_queue m_free_pvars; // free poly vars stats m_stats; random_gen m_rand; diff --git a/src/math/polysat/types.h b/src/math/polysat/types.h index a19db8cb8..2dbe40499 100644 --- a/src/math/polysat/types.h +++ b/src/math/polysat/types.h @@ -16,7 +16,6 @@ Author: #include "util/map.h" #include "util/rlimit.h" #include "util/scoped_ptr_vector.h" -#include "util/var_queue.h" #include "util/ref_vector.h" #include "util/sat_literal.h" #include "math/dd/dd_pdd.h"