From aaa587398ea84ec5107ae9906bf5d665da262ffd Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Tue, 26 Sep 2023 20:52:34 -0700 Subject: [PATCH] add propagation flag to monic and method for updating it to emonics. This replaces the bool-vector tracking for propagation and internalizes it to the emonics class Signed-off-by: Nikolaj Bjorner --- src/math/lp/emonics.cpp | 16 ++++++++++++++++ src/math/lp/emonics.h | 2 ++ src/math/lp/monic.h | 3 +++ 3 files changed, 21 insertions(+) diff --git a/src/math/lp/emonics.cpp b/src/math/lp/emonics.cpp index a8ac63689..f051a8f2e 100644 --- a/src/math/lp/emonics.cpp +++ b/src/math/lp/emonics.cpp @@ -595,4 +595,20 @@ bool emonics::invariant() const { return true; } + +void emonics::set_propagated(monic& m) { + struct set_unpropagated : public trail { + emonics& em; + unsigned var; + public: + set_unpropagated(emonics& em, unsigned var): em(em), var(var) {} + void undo() override { + em[var].set_propagated(false); + } + }; + SASSERT(!m.is_propagated()); + m.set_propagated(true); + m_u_f_stack.push(set_unpropagated(*this, m.var())); +} + } diff --git a/src/math/lp/emonics.h b/src/math/lp/emonics.h index e4f4f4848..051e1d6f0 100644 --- a/src/math/lp/emonics.h +++ b/src/math/lp/emonics.h @@ -142,6 +142,8 @@ public: void merge_eh(unsigned r2, unsigned r1, unsigned v2, unsigned v1) {} void after_merge_eh(unsigned r2, unsigned r1, unsigned v2, unsigned v1) {} + void set_propagated(monic& m); + // this method is required by union_find trail_stack & get_trail_stack() { return m_u_f_stack; } diff --git a/src/math/lp/monic.h b/src/math/lp/monic.h index 884adaaf8..d981b2042 100644 --- a/src/math/lp/monic.h +++ b/src/math/lp/monic.h @@ -58,6 +58,7 @@ class monic: public mon_eq { svector m_rvars; bool m_rsign; mutable unsigned m_visited; + bool m_propagated = false; public: // constructors monic(lpvar v, unsigned sz, lpvar const* vs, unsigned idx): @@ -74,6 +75,8 @@ public: void reset_rfields() { m_rsign = false; m_rvars.reset(); SASSERT(m_rvars.size() == 0); } void push_rvar(signed_var sv) { m_rsign ^= sv.sign(); m_rvars.push_back(sv.var()); } void sort_rvars() { std::sort(m_rvars.begin(), m_rvars.end()); } + void set_propagated(bool p) { m_propagated = p; } + bool is_propagated() const { return m_propagated; } svector::const_iterator begin() const { return vars().begin(); } svector::const_iterator end() const { return vars().end(); }