9 #ifndef CoinSimpFactorization_H 10 #define CoinSimpFactorization_H 33 FactorPointers(
int numRows,
int numCols,
int *UrowLengths_,
int *UcolLengths_ );
75 virtual void postProcess(
const int * sequence,
int * pivotVariable);
103 bool checkBeforeModifying=
false,
104 double acceptablePivot=1.0e-8);
119 bool noPermute=
false);
125 bool noPermute=
false)
const;
130 bool noPermute=
false);
134 bool noPermute=
false,
bool save=
false)
const;
172 const int colStarts[],
173 const int indicesRow[],
190 int findShortRow(
const int column,
const int length,
int &minRow,
209 void increaseColSize(
const int column,
const int newSize,
const bool b);
213 void enlargeUcol(
const int numNewElements,
const bool b);
215 int findInRow(
const int row,
const int column);
229 void Lxeqb(
double *b)
const;
231 void Lxeqb2(
double *b1,
double *b2)
const;
233 void Uxeqb(
double *b,
double *sol)
const;
235 void Uxeqb2(
double *b1,
double *sol1,
double *sol2,
double *b2)
const;
237 void xLeqb(
double *b)
const;
239 void xUeqb(
double *b,
double *sol)
const;
243 void newEta(
int row,
int numNewElements);
247 void Hxeqb(
double *b)
const;
249 void Hxeqb2(
double *b1,
double *b2)
const;
251 void xHeqb(
double *b)
const;
253 void ftran(
double *b,
double *sol,
bool save)
const;
255 void ftran2(
double *b1,
double *sol1,
double *b2,
double *sol2)
const;
257 void btran(
double *b,
double *sol)
const;
266 int checkPivot(
double saveFromU,
double oldPivot)
const;
328 #ifdef COIN_SIMP_CAPACITY 329 int *UrowCapacities_;
353 #ifdef COIN_SIMP_CAPACITY 354 int *UcolCapacities_;
void increaseRowSize(const int row, const int newSize)
allocates more space for a row of U
virtual int updateColumnFT(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false)
Updates one column (FTRAN) from regionSparse2 Tries to do FT update number returned is negative if no...
int lastColInU_
last column in U
int lastRowInU_
last row in U
int numberRows() const
Number of Rows after factorization.
void btran(double *b, double *sol) const
does BTRAN
int * EtaStarts_
Starts of eta vectors.
virtual int factor()
Does most of factorization returning status 0 - OK -99 - needs more memory -1 - singular - use number...
int pivotCandLimit_
maximum number of candidates for pivot
void enlargeUrow(const int numNewElements)
allocates more space for rows of U
int * LrowInd_
indices in the rows of L
int * UcolLengths_
Lengths of the columns of U.
int * indices() const
Returns array to put basis indices in.
int * UrowLengths_
Lengths of the rows of U.
double maxGrowth_
bound on the growth rate
int minIncrease_
minimum storage increase
double * Urows_
U by rows.
int UrowMaxCap_
maximum capacity of Urows
virtual void postProcess(const int *sequence, int *pivotVariable)
Does post processing on valid factorization - putting variables on correct rows.
Abstract base class which also has some scalars so can be used from Dense or Simp.
virtual void getAreas(int numberRows, int numberColumns, CoinBigIndex maximumL, CoinBigIndex maximumU)
Gets space for a factorization.
int numberPivots_
Number pivots since last factorization.
int * LcolLengths_
Lengths of the columns of L.
int EtaSize_
number of elements in Eta_
int * UcolInd_
Indices in the columns of U.
virtual CoinOtherFactorization * clone() const
Clone.
pointers used during factorization
void allocateSomeArrays()
allocates several working arrays
int maxEtaRows_
maximum number of eta vectors
void factorize(int numberOfRows, int numberOfColumns, const int colStarts[], const int indicesRow[], const double elements[])
calls factorization
int numberRows_
Number of Rows in factorization.
double * workArea3_
work array
int checkPivot(double saveFromU, double oldPivot) const
int UcolMaxCap_
maximum capacity of Ucolumns_
int firstRowInU_
first row in U
void newEta(int row, int numNewElements)
creates a new eta vector
virtual ~CoinSimpFactorization()
Destructor.
int * LrowLengths_
Lengths of the rows of L.
bool doSuhlHeuristic_
do Shul heuristic
int upColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const
does updateColumnTranspose, the other is a wrapper
void gutsOfCopy(const CoinSimpFactorization &other)
The real work of copy.
int * LcolStarts_
Starts of the columns of L.
void Hxeqb2(double *b1, double *b2) const
same as above but with two rhs
void clearArrays()
Get rid of all memory.
int * EtaInd_
columns of eta vectors
int * prevColInU_
previous column in U
int * secRowPosition_
position of row after permutation during LUupdate
void GaussEliminate(FactorPointers &pointers, int &r, int &s)
does Gauss elimination
void removeColumnFromActSet(const int column, FactorPointers &pointers)
declares a column inactive
int * UcolStarts_
Starts of the columns of U.
double updateTol_
maximum size for the diagonal of U after update
int UrowEnd_
number of used places in Urows
void xLeqb(double *b) const
solves x L = b
int * rowPosition_
position of row after permutation
void gutsOfDestructor()
The real work of destructor.
int findShortColumn(const int row, const int length, int &minCol, int &minColLength, FactorPointers &pointers)
finds short column that intersects a given row
int findShortRow(const int column, const int length, int &minRow, int &minRowLength, FactorPointers &pointers)
finds short row that intersects a given column
int * LcolInd_
indices in the columns of L
void increaseLsize()
allocates more space for L
FactorPointers(int numRows, int numCols, int *UrowLengths_, int *UcolLengths_)
double * workArea2_
work array
double * Eta_
elements of eta vectors
virtual int replaceColumn(CoinIndexedVector *regionSparse, int pivotRow, double pivotCheck, bool checkBeforeModifying=false, double acceptablePivot=1.0e-8)
Replaces one Column to basis, returns 0=OK, 1=Probably OK, 2=singular, 3=no room If checkBeforeModify...
double * Lcolumns_
L by columns.
virtual int * permute() const
Returns permute in.
CoinFactorizationDouble * elements_
Elements of factorization and updates length is maxR*maxR+maxSpace will always be long enough so can ...
double * invOfPivots_
inverse values of the elements of diagonal of U
void Lxeqb(double *b) const
solves L x = b
int * LrowStarts_
Starts of the rows of L.
virtual int updateTwoColumnsFT(CoinIndexedVector *regionSparse1, CoinIndexedVector *regionSparse2, CoinIndexedVector *regionSparse3, bool noPermute=false)
does FTRAN on two columns
int keepSize_
number of nonzeros
int LUupdate(int newBasicCol)
updates factorization after a Simplex iteration
int * auxInd_
auxiliary vector
int numberSlacks_
number of slacks in basis
double * denseVector_
work array (should be initialized to zero)
int EtaMaxCap_
Capacity of Eta_.
int firstNumberSlacks_
number of slacks in irst basis
virtual CoinFactorizationDouble * elements() const
Returns array to put basis elements in.
void removeRowFromActSet(const int row, FactorPointers &pointers)
declares a row inactive
virtual int numberElements() const
Total number of elements in factorization.
void xUeqb(double *b, double *sol) const
solves x U = b
void pivoting(const int pivotRow, const int pivotColumn, const double invPivot, FactorPointers &pointers)
does pivoting
int upColumn(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false, bool save=false) const
does updatecolumn if save==true keeps column for replace column
void Uxeqb2(double *b1, double *sol1, double *sol2, double *b2) const
same as above but with two rhs
void copyLbyRows()
copies L by rows
int * prevRowInU_
previous row in U
void copyUbyColumns()
copies U by columns
int * EtaPosition_
position of Eta vector
int numberColumns() const
Total number of columns in factorization.
void ftran(double *b, double *sol, bool save) const
does FTRAN
int * colSlack_
indicator of slack variables
void gutsOfInitialize()
The real work of constructor.
CoinSimpFactorization()
Default constructor.
int * nextRowInU_
next row in U
void Hxeqb(double *b) const
solves H x = b, where H is a product of eta matrices
virtual void makeNonSingular(int *sequence, int numberColumns)
Makes a non-singular basis by replacing variables.
int LrowSize_
Size of Lrows_;.
int * indKeep_
indices of this vector
void updateCurrentRow(const int pivotRow, const int row, const double multiplier, FactorPointers &pointers, int &newNonZeros)
part of pivoting
int LcolSize_
numbers of elements in L
Sparse Matrix Base Class.
void xHeqb(double *b) const
solves x H = b
int findPivot(FactorPointers &pointers, int &r, int &s, bool &ifSlack)
finds a pivot element using Markowitz count
void allocateSpaceForU()
allocates space for U
void increaseColSize(const int column, const int newSize, const bool b)
allocates more space for a column of U
int * indVector_
array of indices
void Uxeqb(double *b, double *sol) const
solves U x = b
int * rowOfU_
permutations of rows
double * vecKeep_
vector to keep for LUupdate
int findPivotShCol(FactorPointers &pointers, int &r, int &s)
finds a pivot in a shortest column
int * nextColInU_
next column in U
int * colOfU_
permutation of columns
void initialSomeNumbers()
initializes some numbers
int * UrowStarts_
Starts of the rows of U.
void copyRowPermutations()
makes a copy of row permutations
int firstColInU_
first column in U
void enlargeUcol(const int numNewElements, const bool b)
allocates more space for columns of U
int * vecLabels_
array of labels (should be initialized to zero)
int * pivotRow_
Pivot row.
int findPivotSimp(FactorPointers &pointers, int &r, int &s)
finds a pivot in the first column available
int findInRow(const int row, const int column)
finds a given row in a column
virtual int updateColumn(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const
This version has same effect as above with FTUpdate==false so number returned is always >=0...
int LcolCap_
maximum capacity of L
int findInColumn(const int column, const int row)
finds a given column in a row
int LrowCap_
Capacity of Lrows_.
double * Ucolumns_
U by columns.
virtual int updateColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const
Updates one column (BTRAN) from regionSparse2 regionSparse starts as zero and is zero at end Note - i...
int * EtaLengths_
Lengths of eta vectors.
int * secRowOfU_
permutations of rows during LUupdate
void ftran2(double *b1, double *sol1, double *b2, double *sol2) const
same as above but with two columns
double maximumCoefficient() const
Returns maximum absolute value in factorization.
void Lxeqb2(double *b1, double *b2) const
same as above but with two rhs
int numberColumns_
Number of Columns in factorization.
virtual void preProcess()
PreProcesses column ordered copy of basis.
virtual int * pivotRow() const
Returns pivot row.
int * colPosition_
position of column after permutation
double * Lrows_
L by rows.
double * auxVector_
auxiliary vector
int UcolEnd_
last used position in Ucolumns_
int lastEtaRow_
last eta row
CoinSimpFactorization & operator=(const CoinSimpFactorization &other)
= copy
int * UrowInd_
Indices in the rows of U.
double findMaxInRrow(const int row, FactorPointers &pointers)
finds maximum absolute value in a row
int mainLoopFactor(FactorPointers &pointers)
main loop of factorization
friend void CoinSimpFactorizationUnitTest(const std::string &mpsDir)