summaryrefslogtreecommitdiff
path: root/src/theory/arith/simplex.cpp
diff options
context:
space:
mode:
authorTim King <taking@cs.nyu.edu>2011-02-22 01:13:56 +0000
committerTim King <taking@cs.nyu.edu>2011-02-22 01:13:56 +0000
commitc40d5678a4bbd73bde711149004206e37176661b (patch)
tree8df1349d7568768e7e8f9f58b2361884dc9fd830 /src/theory/arith/simplex.cpp
parenta101b2e309dd2818a85c954e45af586e530e289a (diff)
- Adds column based iterators.
Diffstat (limited to 'src/theory/arith/simplex.cpp')
-rw-r--r--src/theory/arith/simplex.cpp67
1 files changed, 53 insertions, 14 deletions
diff --git a/src/theory/arith/simplex.cpp b/src/theory/arith/simplex.cpp
index d837d7ac0..2785222e3 100644
--- a/src/theory/arith/simplex.cpp
+++ b/src/theory/arith/simplex.cpp
@@ -168,6 +168,37 @@ bool SimplexDecisionProcedure::AssertEquality(ArithVar x_i, const DeltaRational&
return false;
}
+set<ArithVar> tableauAndHasSet(Tableau& tab, ArithVar v){
+ set<ArithVar> has;
+ for(ArithVarSet::iterator basicIter = tab.begin();
+ basicIter != tab.end();
+ ++basicIter){
+ ArithVar basic = *basicIter;
+ ReducedRowVector& row = tab.lookup(basic);
+
+ if(row.has(v)){
+ has.insert(basic);
+ }
+ }
+ return has;
+}
+
+set<ArithVar> columnIteratorSet(Tableau& tab,ArithVar v){
+ set<ArithVar> has;
+ ArithVarSet::iterator basicIter = tab.beginColumn(v);
+ ArithVarSet::iterator endIter = tab.endColumn(v);
+ for(; basicIter != endIter; ++basicIter){
+ ArithVar basic = *basicIter;
+ has.insert(basic);
+ }
+ return has;
+}
+
+
+bool matchingSets(Tableau& tab, ArithVar v){
+ return tableauAndHasSet(tab, v) == columnIteratorSet(tab, v);
+}
+
void SimplexDecisionProcedure::update(ArithVar x_i, const DeltaRational& v){
Assert(!d_tableau.isBasic(x_i));
DeltaRational assignment_x_i = d_partialModel.getAssignment(x_i);
@@ -177,22 +208,21 @@ void SimplexDecisionProcedure::update(ArithVar x_i, const DeltaRational& v){
<< assignment_x_i << "|-> " << v << endl;
DeltaRational diff = v - assignment_x_i;
- for(ArithVarSet::iterator basicIter = d_tableau.begin();
- basicIter != d_tableau.end();
- ++basicIter){
+ Assert(matchingSets(d_tableau, x_i));
+ ArithVarSet::iterator basicIter = d_tableau.beginColumn(x_i);
+ ArithVarSet::iterator endIter = d_tableau.endColumn(x_i);
+ for(; basicIter != endIter; ++basicIter){
ArithVar x_j = *basicIter;
ReducedRowVector& row_j = d_tableau.lookup(x_j);
- if(row_j.has(x_i)){
- const Rational& a_ji = row_j.lookup(x_i);
+ Assert(row_j.has(x_i));
+ const Rational& a_ji = row_j.lookup(x_i);
- const DeltaRational& assignment = d_partialModel.getAssignment(x_j);
- DeltaRational nAssignment = assignment+(diff * a_ji);
- d_partialModel.setAssignment(x_j, nAssignment);
+ const DeltaRational& assignment = d_partialModel.getAssignment(x_j);
+ DeltaRational nAssignment = assignment+(diff * a_ji);
+ d_partialModel.setAssignment(x_j, nAssignment);
- d_queue.enqueueIfInconsistent(x_j);
- //checkBasicVariable(x_j);
- }
+ d_queue.enqueueIfInconsistent(x_j);
}
d_partialModel.setAssignment(x_i, v);
@@ -250,12 +280,21 @@ void SimplexDecisionProcedure::pivotAndUpdate(ArithVar x_i, ArithVar x_j, DeltaR
DeltaRational tmp = d_partialModel.getAssignment(x_j) + theta;
d_partialModel.setAssignment(x_j, tmp);
- ArithVarSet::iterator basicIter = d_tableau.begin(), end = d_tableau.end();
- for(; basicIter != end; ++basicIter){
+
+ Assert(matchingSets(d_tableau, x_j));
+ ArithVarSet::iterator basicIter = d_tableau.beginColumn(x_j);
+ ArithVarSet::iterator endIter = d_tableau.endColumn(x_j);
+ for(; basicIter != endIter; ++basicIter){
+
+ //ArithVarSet::iterator basicIter = d_tableau.begin(), end = d_tableau.end();
+ //for(; basicIter != end; ++basicIter){
ArithVar x_k = *basicIter;
ReducedRowVector& row_k = d_tableau.lookup(x_k);
- if(x_k != x_i && row_k.has(x_j)){
+ Assert(row_k.has(x_j));
+
+ //if(x_k != x_i && row_k.has(x_j)){
+ if(x_k != x_i ){
const Rational& a_kj = row_k.lookup(x_j);
DeltaRational nextAssignment = d_partialModel.getAssignment(x_k) + (theta * a_kj);
d_partialModel.setAssignment(x_k, nextAssignment);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback