Skip to content

Commit

Permalink
add propagation flag to monic and method for updating it to emonics. …
Browse files Browse the repository at this point in the history
…This replaces the bool-vector tracking for propagation and internalizes it to the emonics class

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
  • Loading branch information
NikolajBjorner committed Sep 27, 2023
1 parent 9c63ea3 commit aaa5873
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/math/lp/emonics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
}

}
2 changes: 2 additions & 0 deletions src/math/lp/emonics.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ class emonics {
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; }

Expand Down
3 changes: 3 additions & 0 deletions src/math/lp/monic.h
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -74,6 +75,8 @@ class monic: public mon_eq {
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(); }
Expand Down

0 comments on commit aaa5873

Please sign in to comment.