1 /********************* */
4 ** Original author: taking
5 ** Major contributors: none
6 ** Minor contributors (to current version): none
7 ** This file is part of the CVC4 prototype.
8 ** Copyright (c) 2009, 2010 The Analysis of Computer Systems Group (ACSys)
9 ** Courant Institute of Mathematical Sciences
10 ** New York University
11 ** See the file COPYING in the top-level source directory for licensing
12 ** information.\endverbatim
14 ** \brief [[ Add one-line brief description here ]]
16 ** [[ Add lengthier description here ]]
17 ** \todo document this file
21 #include "theory/arith/tableau.h"
24 using namespace CVC4::theory
;
25 using namespace CVC4::theory::arith
;
27 void Tableau::addRow(ArithVar basicVar
,
28 const std::vector
<Rational
>& coeffs
,
29 const std::vector
<ArithVar
>& variables
){
31 Assert(coeffs
.size() == variables
.size());
32 Assert(d_basicManager
.isMember(basicVar
));
34 //The new basic variable cannot already be a basic variable
35 Assert(!isActiveBasicVariable(basicVar
));
36 d_activeBasicVars
.add(basicVar
);
37 ReducedRowVector
* row_current
= new ReducedRowVector(basicVar
,variables
, coeffs
,d_rowCount
);
38 d_rowsTable
[basicVar
] = row_current
;
40 //A variable in the row may have been made non-basic already.
41 //If this is the case we fake pivoting this variable
42 vector
<Rational
>::const_iterator coeffsIter
= coeffs
.begin();
43 vector
<Rational
>::const_iterator coeffsEnd
= coeffs
.end();
45 vector
<ArithVar
>::const_iterator varsIter
= variables
.begin();
47 for( ; coeffsIter
!= coeffsEnd
; ++coeffsIter
, ++ varsIter
){
48 ArithVar var
= *varsIter
;
50 if(d_basicManager
.isMember(var
)){
51 if(!isActiveBasicVariable(var
)){
54 Assert(isActiveBasicVariable(var
));
56 ReducedRowVector
* row_var
= lookup(var
);
57 row_current
->substitute(*row_var
);
62 void Tableau::pivot(ArithVar x_r
, ArithVar x_s
){
63 Assert(d_basicManager
.isMember(x_r
));
64 Assert(!d_basicManager
.isMember(x_s
));
66 Debug("tableau") << "Tableau::pivot("
67 << x_r
<<", " <<x_s
<<")" << endl
;
69 ReducedRowVector
* row_s
= lookup(x_r
);
70 Assert(row_s
->has(x_s
));
72 //Swap x_r and x_s in d_activeRows
73 d_rowsTable
[x_s
] = row_s
;
74 d_rowsTable
[x_r
] = NULL
;
76 d_activeBasicVars
.remove(x_r
);
77 d_basicManager
.remove(x_r
);
79 d_activeBasicVars
.add(x_s
);
80 d_basicManager
.add(x_s
);
84 for(ArithVarSet::iterator basicIter
= begin(), endIter
= end();
85 basicIter
!= endIter
; ++basicIter
){
86 ArithVar basic
= *basicIter
;
87 if(basic
== x_s
) continue;
89 ReducedRowVector
* row_k
= lookup(basic
);
91 d_activityMonitor
[basic
] += 30;
92 row_k
->substitute(*row_s
);
96 void Tableau::printTableau(){
97 Debug("tableau") << "Tableau::d_activeRows" << endl
;
99 typedef RowsTable::iterator table_iter
;
100 for(table_iter rowIter
= d_rowsTable
.begin(), end
= d_rowsTable
.end();
101 rowIter
!= end
; ++rowIter
){
102 ReducedRowVector
* row_k
= *rowIter
;
110 void Tableau::updateRow(ReducedRowVector
* row
){
111 ArithVar basic
= row
->basic();
112 for(ReducedRowVector::NonZeroIterator i
=row
->beginNonZero(), endIter
= row
->endNonZero(); i
!= endIter
; ){
113 ArithVar var
= i
->first
;
115 if(var
!= basic
&& d_basicManager
.isMember(var
)){
116 ReducedRowVector
* row_var
= isActiveBasicVariable(var
) ? lookup(var
) : lookupEjected(var
);
118 Assert(row_var
!= row
);
119 row
->substitute(*row_var
);
121 i
= row
->beginNonZero();
122 endIter
= row
->endNonZero();