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<lpvar> 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<lpvar>::const_iterator begin() const { return vars().begin(); } svector<lpvar>::const_iterator end() const { return vars().end(); }