Go to the documentation of this file.
6 #ifndef ClpFactorization_H
7 #define ClpFactorization_H
9 #include "CoinPragma.hpp"
11 #include "CoinFactorization.hpp"
15 class CoinOtherFactorization;
16 #ifndef CLP_MULTIPLE_FACTORIZATIONS
17 #define CLP_MULTIPLE_FACTORIZATIONS 4
19 #ifdef CLP_MULTIPLE_FACTORIZATIONS
20 #include "CoinDenseFactorization.hpp"
23 #ifndef COIN_FAST_CODE
24 #define COIN_FAST_CODE
26 #ifndef CLP_FACTORIZATION_NEW_TIMING
27 #define CLP_FACTORIZATION_NEW_TIMING 1
36 :
public CoinFactorization
71 #ifdef CLP_MULTIPLE_FACTORIZATIONS
90 CoinIndexedVector *regionSparse,
91 CoinIndexedVector *tableauColumn,
94 bool checkBeforeModifying =
false,
95 double acceptablePivot = 1.0e-8);
96 #if ABOCA_LITE_FACTORIZATION
97 void replaceColumn1(CoinIndexedVector *regionSparse,
int pivotRow);
100 int replaceColumn2(CoinIndexedVector *regionSparse,
114 CoinIndexedVector *regionSparse2);
118 CoinIndexedVector *regionSparse2,
119 bool noPermute =
false)
const;
126 CoinIndexedVector *regionSparse2,
127 CoinIndexedVector *regionSparse3,
128 bool noPermuteRegion3 =
false);
131 CoinIndexedVector *regionSparse2,
132 bool noPermute =
false)
const;
136 CoinIndexedVector *regionSparse2)
const;
142 CoinIndexedVector *regionSparse2,
143 CoinIndexedVector *regionSparse3)
const;
145 #ifdef CLP_MULTIPLE_FACTORIZATIONS
151 if (coinFactorizationA_)
152 return coinFactorizationA_->numberElements();
154 return coinFactorizationB_->numberElements();
159 if (coinFactorizationA_)
160 return coinFactorizationA_->permute();
162 return coinFactorizationB_->permute();
167 if (coinFactorizationA_)
168 return coinFactorizationA_->pivotColumn();
170 return coinFactorizationB_->permute();
175 if (coinFactorizationA_)
176 return coinFactorizationA_->maximumPivots();
178 return coinFactorizationB_->maximumPivots();
183 if (coinFactorizationA_)
184 coinFactorizationA_->maximumPivots(value);
186 coinFactorizationB_->maximumPivots(value);
191 if (coinFactorizationA_)
192 return coinFactorizationA_->pivots();
194 return coinFactorizationB_->pivots();
199 if (coinFactorizationA_)
200 return coinFactorizationA_->areaFactor();
207 if (coinFactorizationA_)
208 coinFactorizationA_->areaFactor(value);
213 if (coinFactorizationA_)
214 return coinFactorizationA_->zeroTolerance();
216 return coinFactorizationB_->zeroTolerance();
221 if (coinFactorizationA_)
222 coinFactorizationA_->zeroTolerance(value);
224 coinFactorizationB_->zeroTolerance(value);
231 if (coinFactorizationA_)
232 return coinFactorizationA_->sparseThreshold();
239 if (coinFactorizationA_)
240 coinFactorizationA_->sparseThreshold(value);
245 if (coinFactorizationA_)
246 return coinFactorizationA_->status();
248 return coinFactorizationB_->status();
253 if (coinFactorizationA_)
254 coinFactorizationA_->setStatus(value);
256 coinFactorizationB_->setStatus(value);
261 if (coinFactorizationA_)
262 return coinFactorizationA_->numberDense();
270 if (coinFactorizationA_)
271 return coinFactorizationA_->numberElementsU();
278 if (coinFactorizationA_)
279 return coinFactorizationA_->numberElementsL();
286 if (coinFactorizationA_)
287 return coinFactorizationA_->numberElementsR();
293 #if CLP_FACTORIZATION_NEW_TIMING > 1
294 void statsRefactor(
char when)
const;
299 if (coinFactorizationA_)
300 return coinFactorizationA_->messageLevel();
307 if (coinFactorizationA_)
308 coinFactorizationA_->messageLevel(value);
313 if (coinFactorizationA_)
314 coinFactorizationA_->clearArrays();
315 else if (coinFactorizationB_)
316 coinFactorizationB_->clearArrays();
321 if (coinFactorizationA_)
322 return coinFactorizationA_->numberRows();
324 return coinFactorizationB_->numberRows();
329 if (coinFactorizationA_)
330 return coinFactorizationA_->denseThreshold();
337 if (coinFactorizationA_)
338 coinFactorizationA_->setDenseThreshold(value);
343 if (coinFactorizationA_)
344 return coinFactorizationA_->pivotTolerance();
345 else if (coinFactorizationB_)
346 return coinFactorizationB_->pivotTolerance();
352 if (coinFactorizationA_)
353 coinFactorizationA_->pivotTolerance(value);
354 else if (coinFactorizationB_)
355 coinFactorizationB_->pivotTolerance(value);
360 if (coinFactorizationA_)
361 coinFactorizationA_->relaxAccuracyCheck(value);
370 if (coinFactorizationA_)
371 return coinFactorizationA_->persistenceFlag();
377 if (coinFactorizationA_)
378 coinFactorizationA_->setPersistenceFlag(value);
383 if (coinFactorizationA_)
384 coinFactorizationA_->almostDestructor();
385 else if (coinFactorizationB_)
386 coinFactorizationB_->clearArrays();
391 if (coinFactorizationA_)
392 return coinFactorizationA_->adjustedAreaFactor();
398 if (coinFactorizationA_)
399 coinFactorizationA_->setBiasLU(value);
404 if (coinFactorizationA_)
405 coinFactorizationA_->setForrestTomlin(value);
410 if (coinFactorizationA_) {
412 #ifndef COIN_FAST_CODE
413 coinFactorizationA_->slackValue(-1.0);
415 coinFactorizationA_->zeroTolerance(1.0e-13);
423 return goOslThreshold_;
428 goOslThreshold_ = value;
433 return goDenseThreshold_;
438 goDenseThreshold_ = value;
443 return goSmallThreshold_;
448 goSmallThreshold_ = value;
457 return coinFactorizationB_ ? 1 : 0;
462 return coinFactorizationA_;
473 #ifndef COIN_FAST_CODE
479 inline void goDense() {}
494 doStatistics_ = trueFalse;
500 return (networkBasis_ != NULL);
521 #ifdef CLP_MULTIPLE_FACTORIZATIONS
522 CoinFactorization *coinFactorizationA_;
525 CoinOtherFactorization *coinFactorizationB_;
526 #ifdef CLP_REUSE_ETAS
535 int goSmallThreshold_;
537 int goDenseThreshold_;
539 #ifdef CLP_FACTORIZATION_NEW_TIMING
540 mutable double shortestAverage_;
542 mutable double totalInR_;
543 mutable double totalInIncreasingU_;
544 mutable int endLengthU_;
545 mutable int lastNumberPivots_;
546 mutable int effectiveStartNumberU_;
548 mutable bool doStatistics_;
int factorize(ClpSimplex *model, int solveType, bool valuesPass)
When part of LP - given by basic variables.
This solves LPs using the simplex method.
int messageLevel() const
Level of detail of messages.
This just implements CoinFactorization when an ClpMatrixBase object is passed.
void forceOtherFactorization(int which)
If nonzero force use of 1,dense 2,small 3,osl.
void setFactorization(ClpFactorization &factorization)
Sets factorization.
int goSmallThreshold() const
Get switch to small if number rows <= this.
void setForrestTomlin(bool value)
true if Forrest Tomlin update, false if PFI
CoinBigIndex numberElementsR() const
Returns number in R area.
void setDefaultValues()
Sets default values.
int updateTwoColumnsFT(CoinIndexedVector *regionSparse1, CoinIndexedVector *regionSparse2, CoinIndexedVector *regionSparse3, bool noPermuteRegion3=false)
Updates one column (FTRAN) from region2 Tries to do FT update number returned is negative if no room.
void setDenseThreshold(int value)
Sets dense threshold.
void maximumPivots(int value)
Set maximum number of pivots between factorizations.
int goDenseThreshold() const
Get switch to dense if number rows <= this.
void almostDestructor()
Delete all stuff (leaves as after CoinFactorization())
void setBiasLU(int value)
int numberDense() const
Returns number of dense rows.
void relaxAccuracyCheck(double value)
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
void saferTolerances(double zeroTolerance, double pivotTolerance)
Set tolerances to safer of existing and given.
int goOslThreshold() const
Get switch to osl if number rows <= this.
void getWeights(int *weights) const
Fills weighted row list.
void zeroTolerance(double value)
Set zero tolerance.
void setGoDenseThreshold(int value)
Set switch to dense if number rows <= this.
CoinBigIndex numberElementsL() const
Returns number in L area.
void goDenseOrSmall(int numberRows)
Go over to dense or small code if small enough.
int pivots() const
Returns number of pivots since factorization.
~ClpFactorization()
Destructor.
bool networkBasis() const
Says if a network basis.
This deals with Factorization and Updates for network structures.
void cleanUp()
Cleans up i.e. gets rid of network basis.
bool needToReorder() const
Says whether to redo pivot order.
CoinBigIndex numberElementsU() const
Returns number in U area.
void messageLevel(int value)
Set level of detail of messages.
CoinFactorization * coinFactorization() const
Return coinFactorizationA_.
Abstract base class for Clp Matrices.
int replaceColumn(const ClpSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, 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...
void doStatistics(bool trueFalse) const
To switch statistics on or off.
int maximumPivots() const
Maximum number of pivots between factorizations.
double adjustedAreaFactor() const
Returns areaFactor but adjusted for dense.
int numberRows() const
Number of Rows after factorization.
double areaFactor() const
Whether larger areas needed.
int updateColumnForDebug(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const
For debug (no statistics update)
ClpFactorization & operator=(const ClpFactorization &)
int * pivotColumn() const
Returns address of pivotColumn region (also used for permuting)
void setPersistenceFlag(int value)
int updateColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const
Updates one column (BTRAN) from region2 region1 starts as zero and is zero at end.
int status() const
Returns status.
int numberElements() const
Total number of elements in factorization.
#define CLP_MULTIPLE_FACTORIZATIONS
void updateTwoColumnsTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, CoinIndexedVector *regionSparse3) const
Updates two columns (BTRAN) from regionSparse2 and 3 regionSparse starts as zero and is zero at end N...
void clearArrays()
Get rid of all memory.
ClpFactorization()
Default constructor.
void setGoOslThreshold(int value)
Set switch to osl if number rows <= this.
void setGoSmallThreshold(int value)
Set switch to small if number rows <= this.
void areaFactor(double value)
Set whether larger areas needed.
int denseThreshold() const
Gets dense threshold.
void setStatus(int value)
Sets status.
void goSparse()
makes a row copy of L for speed and to allow very sparse problems
int sparseThreshold() const
get sparse threshold
bool timeToRefactorize() const
int updateColumn(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const
Updates one column (FTRAN) from region2 region1 starts as zero and is zero at end.
int isDenseOrSmall() const
Return 1 if dense code.
int persistenceFlag() const
Array persistence flag If 0 then as now (delete/new) 1 then only do arrays if bigger needed 2 as 1 bu...
int updateColumnFT(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2)
Updates one column (FTRAN) from region2 Tries to do FT update number returned is negative if no room ...
double zeroTolerance() const
Zero tolerance.
void sparseThreshold(int value)
Set sparse threshold.
int * permute() const
Returns address of permute region.
void pivotTolerance(double value)
Set pivot tolerance.
double pivotTolerance() const
Pivot tolerance.