Clp 1.17.5
Loading...
Searching...
No Matches
ClpFactorization.hpp
Go to the documentation of this file.
1/* $Id: ClpFactorization.hpp 2385 2019-01-06 19:43:06Z unxusr $ */
2// Copyright (C) 2002, International Business Machines
3// Corporation and others. All Rights Reserved.
4// This code is licensed under the terms of the Eclipse Public License (EPL).
5
6#ifndef ClpFactorization_H
7#define ClpFactorization_H
8
9#include "CoinPragma.hpp"
10
11#include "CoinFactorization.hpp"
12class ClpMatrixBase;
13class ClpSimplex;
14class ClpNetworkBasis;
15class CoinOtherFactorization;
16#ifndef CLP_MULTIPLE_FACTORIZATIONS
17#define CLP_MULTIPLE_FACTORIZATIONS 4
18#endif
19#ifdef CLP_MULTIPLE_FACTORIZATIONS
20#include "CoinDenseFactorization.hpp"
21#include "ClpSimplex.hpp"
22#endif
23#ifndef COIN_FAST_CODE
24#define COIN_FAST_CODE
25#endif
26#ifndef CLP_FACTORIZATION_NEW_TIMING
27#define CLP_FACTORIZATION_NEW_TIMING 1
28#endif
29
36 : public CoinFactorization
37#endif
38{
39
40 //friend class CoinFactorization;
41
42public:
54 int factorize(ClpSimplex *model, int solveType, bool valuesPass);
56
64
68 ClpFactorization(const CoinFactorization &);
70 ClpFactorization(const ClpFactorization &, int denseIfSmaller = 0);
71#ifdef CLP_MULTIPLE_FACTORIZATIONS
73 ClpFactorization(const CoinOtherFactorization &);
74#endif
77
78 /* **** below here is so can use networkish basis */
81
89 int replaceColumn(const ClpSimplex *model,
90 CoinIndexedVector *regionSparse,
91 CoinIndexedVector *tableauColumn,
92 int pivotRow,
93 double pivotCheck,
94 bool checkBeforeModifying = false,
95 double acceptablePivot = 1.0e-8);
96#if ABOCA_LITE_FACTORIZATION
98 void replaceColumn1(CoinIndexedVector *regionSparse, int pivotRow);
100 int replaceColumn2(CoinIndexedVector *regionSparse,
101 int pivotRow,
102 double pivotCheck);
103#endif
105
113 int updateColumnFT(CoinIndexedVector *regionSparse,
114 CoinIndexedVector *regionSparse2);
117 int updateColumn(CoinIndexedVector *regionSparse,
118 CoinIndexedVector *regionSparse2,
119 bool noPermute = false) const;
125 int updateTwoColumnsFT(CoinIndexedVector *regionSparse1,
126 CoinIndexedVector *regionSparse2,
127 CoinIndexedVector *regionSparse3,
128 bool noPermuteRegion3 = false);
130 int updateColumnForDebug(CoinIndexedVector *regionSparse,
131 CoinIndexedVector *regionSparse2,
132 bool noPermute = false) const;
135 int updateColumnTranspose(CoinIndexedVector *regionSparse,
136 CoinIndexedVector *regionSparse2) const;
141 void updateTwoColumnsTranspose(CoinIndexedVector *regionSparse,
142 CoinIndexedVector *regionSparse2,
143 CoinIndexedVector *regionSparse3) const;
145#ifdef CLP_MULTIPLE_FACTORIZATIONS
149 inline int numberElements() const
150 {
152 return coinFactorizationA_->numberElements();
153 else
154 return coinFactorizationB_->numberElements();
155 }
157 inline int *permute() const
158 {
160 return coinFactorizationA_->permute();
161 else
162 return coinFactorizationB_->permute();
163 }
165 inline int *pivotColumn() const
166 {
168 return coinFactorizationA_->pivotColumn();
169 else
170 return coinFactorizationB_->permute();
171 }
173 inline int maximumPivots() const
174 {
176 return coinFactorizationA_->maximumPivots();
177 else
178 return coinFactorizationB_->maximumPivots();
179 }
181 inline void maximumPivots(int value)
182 {
184 coinFactorizationA_->maximumPivots(value);
185 else
186 coinFactorizationB_->maximumPivots(value);
187 }
189 inline int pivots() const
190 {
192 return coinFactorizationA_->pivots();
193 else
194 return coinFactorizationB_->pivots();
195 }
197 inline double areaFactor() const
198 {
200 return coinFactorizationA_->areaFactor();
201 else
202 return 0.0;
203 }
205 inline void areaFactor(double value)
206 {
208 coinFactorizationA_->areaFactor(value);
209 }
211 inline double zeroTolerance() const
212 {
214 return coinFactorizationA_->zeroTolerance();
215 else
216 return coinFactorizationB_->zeroTolerance();
217 }
219 inline void zeroTolerance(double value)
220 {
222 coinFactorizationA_->zeroTolerance(value);
223 else
224 coinFactorizationB_->zeroTolerance(value);
225 }
229 inline int sparseThreshold() const
230 {
232 return coinFactorizationA_->sparseThreshold();
233 else
234 return 0;
235 }
237 inline void sparseThreshold(int value)
238 {
240 coinFactorizationA_->sparseThreshold(value);
241 }
243 inline int status() const
244 {
246 return coinFactorizationA_->status();
247 else
248 return coinFactorizationB_->status();
249 }
251 inline void setStatus(int value)
252 {
254 coinFactorizationA_->setStatus(value);
255 else
256 coinFactorizationB_->setStatus(value);
257 }
259 inline int numberDense() const
260 {
262 return coinFactorizationA_->numberDense();
263 else
264 return 0;
265 }
266#if 1
268 inline CoinBigIndex numberElementsU() const
269 {
271 return coinFactorizationA_->numberElementsU();
272 else
273 return -1;
274 }
276 inline CoinBigIndex numberElementsL() const
277 {
279 return coinFactorizationA_->numberElementsL();
280 else
281 return -1;
282 }
284 inline CoinBigIndex numberElementsR() const
285 {
287 return coinFactorizationA_->numberElementsR();
288 else
289 return 0;
290 }
291#endif
292 bool timeToRefactorize() const;
293#if CLP_FACTORIZATION_NEW_TIMING > 1
294 void statsRefactor(char when) const;
295#endif
297 inline int messageLevel() const
298 {
300 return coinFactorizationA_->messageLevel();
301 else
302 return 1;
303 }
305 inline void messageLevel(int value)
306 {
308 coinFactorizationA_->messageLevel(value);
309 }
311 inline void clearArrays()
312 {
314 coinFactorizationA_->clearArrays();
315 else if (coinFactorizationB_)
316 coinFactorizationB_->clearArrays();
317 }
319 inline int numberRows() const
320 {
322 return coinFactorizationA_->numberRows();
323 else
324 return coinFactorizationB_->numberRows();
325 }
327 inline int denseThreshold() const
328 {
330 return coinFactorizationA_->denseThreshold();
331 else
332 return 0;
333 }
335 inline void setDenseThreshold(int value)
336 {
338 coinFactorizationA_->setDenseThreshold(value);
339 }
341 inline double pivotTolerance() const
342 {
344 return coinFactorizationA_->pivotTolerance();
345 else if (coinFactorizationB_)
346 return coinFactorizationB_->pivotTolerance();
347 return 1.0e-8;
348 }
350 inline void pivotTolerance(double value)
351 {
353 coinFactorizationA_->pivotTolerance(value);
354 else if (coinFactorizationB_)
355 coinFactorizationB_->pivotTolerance(value);
356 }
358 inline void relaxAccuracyCheck(double value)
359 {
361 coinFactorizationA_->relaxAccuracyCheck(value);
362 }
368 inline int persistenceFlag() const
369 {
371 return coinFactorizationA_->persistenceFlag();
372 else
373 return 0;
374 }
375 inline void setPersistenceFlag(int value)
376 {
378 coinFactorizationA_->setPersistenceFlag(value);
379 }
381 inline void almostDestructor()
382 {
384 coinFactorizationA_->almostDestructor();
385 else if (coinFactorizationB_)
386 coinFactorizationB_->clearArrays();
387 }
389 inline double adjustedAreaFactor() const
390 {
392 return coinFactorizationA_->adjustedAreaFactor();
393 else
394 return 0.0;
395 }
396 inline void setBiasLU(int value)
397 {
399 coinFactorizationA_->setBiasLU(value);
400 }
402 inline void setForrestTomlin(bool value)
403 {
405 coinFactorizationA_->setForrestTomlin(value);
406 }
408 inline void setDefaultValues()
409 {
411 // row activities have negative sign
412#ifndef COIN_FAST_CODE
413 coinFactorizationA_->slackValue(-1.0);
414#endif
415 coinFactorizationA_->zeroTolerance(1.0e-13);
416 }
417 }
419 void forceOtherFactorization(int which);
421 inline int goOslThreshold() const
422 {
423 return goOslThreshold_;
424 }
426 inline void setGoOslThreshold(int value)
427 {
428 goOslThreshold_ = value;
429 }
431 inline int goDenseThreshold() const
432 {
433 return goDenseThreshold_;
434 }
436 inline void setGoDenseThreshold(int value)
437 {
438 goDenseThreshold_ = value;
439 }
441 inline int goSmallThreshold() const
442 {
443 return goSmallThreshold_;
444 }
446 inline void setGoSmallThreshold(int value)
447 {
448 goSmallThreshold_ = value;
449 }
453 void setFactorization(ClpFactorization &factorization);
455 inline int isDenseOrSmall() const
456 {
457 return coinFactorizationB_ ? 1 : 0;
458 }
460 inline CoinFactorization *coinFactorization() const
461 {
462 return coinFactorizationA_;
463 }
464#else
465 inline bool timeToRefactorize() const
466 {
467 return (pivots() * 3 > maximumPivots() * 2 && numberElementsR() * 3 > (numberElementsL() + numberElementsU()) * 2 + 1000 && !numberDense());
468 }
470 inline void setDefaultValues()
471 {
472 // row activities have negative sign
473#ifndef COIN_FAST_CODE
474 slackValue(-1.0);
475#endif
476 zeroTolerance(1.0e-13);
477 }
479 inline void goDense() {}
480#endif
482
486 void goSparse();
488 void cleanUp();
490 bool needToReorder() const;
492 inline void doStatistics(bool trueFalse) const
493 {
494 doStatistics_ = trueFalse;
495 }
496#ifndef SLIM_CLP
498 inline bool networkBasis() const
499 {
500 return (networkBasis_ != NULL);
501 }
502#else
504 inline bool networkBasis() const
505 {
506 return false;
507 }
508#endif
510 void getWeights(int *weights) const;
512
514private:
518#ifndef SLIM_CLP
520#endif
521#ifdef CLP_MULTIPLE_FACTORIZATIONS
523 CoinFactorization *coinFactorizationA_;
525 CoinOtherFactorization *coinFactorizationB_;
526#ifdef CLP_REUSE_ETAS
528 ClpSimplex *model_;
529#endif
538#endif
539#ifdef CLP_FACTORIZATION_NEW_TIMING
541 mutable double shortestAverage_;
542 mutable double totalInR_;
543 mutable double totalInIncreasingU_;
544 mutable int endLengthU_;
545 mutable int lastNumberPivots_;
547#endif
549 mutable bool doStatistics_;
551};
552
553#endif
554
555/* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
556*/
#define CLP_MULTIPLE_FACTORIZATIONS
This just implements CoinFactorization when an ClpMatrixBase object is passed.
int numberElements() const
Total number of elements in factorization.
int numberDense() const
Returns number of dense rows.
void doStatistics(bool trueFalse) const
To switch statistics on or off.
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 pivotTolerance(double value)
Set pivot tolerance.
void goSparse()
makes a row copy of L for speed and to allow very sparse problems
void saferTolerances(double zeroTolerance, double pivotTolerance)
Set tolerances to safer of existing and given.
int * permute() const
Returns address of permute region.
int factorize(ClpSimplex *model, int solveType, bool valuesPass)
When part of LP - given by basic variables.
bool networkBasis() const
Says if a network basis.
void setDenseThreshold(int value)
Sets dense threshold.
double pivotTolerance() const
Pivot tolerance.
double shortestAverage_
For guessing when to re-factorize.
double zeroTolerance() const
Zero tolerance.
int status() const
Returns status.
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...
int forceB_
If nonzero force use of 1,dense 2,small 3,osl.
ClpNetworkBasis * networkBasis_
Pointer to network basis.
bool needToReorder() const
Says whether to redo pivot order.
int sparseThreshold() const
get sparse threshold
ClpFactorization(const CoinFactorization &)
The copy constructor from an CoinFactorization.
void setPersistenceFlag(int value)
void sparseThreshold(int value)
Set sparse threshold.
int * pivotColumn() const
Returns address of pivotColumn region (also used for permuting)
int denseThreshold() const
Gets dense threshold.
double adjustedAreaFactor() const
Returns areaFactor but adjusted for dense.
CoinOtherFactorization * coinFactorizationB_
Pointer to CoinOtherFactorization.
CoinBigIndex numberElementsR() const
Returns number in R area.
CoinFactorization * coinFactorizationA_
Pointer to CoinFactorization.
void zeroTolerance(double value)
Set zero tolerance.
int updateColumnForDebug(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const
For debug (no statistics update)
int goOslThreshold() const
Get switch to osl if number rows <= this.
void getWeights(int *weights) const
Fills weighted row list.
void setGoDenseThreshold(int value)
Set switch to dense if number rows <= this.
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...
~ClpFactorization()
Destructor.
bool doStatistics_
To switch statistics on or off.
void messageLevel(int value)
Set level of detail of messages.
int updateColumnFT(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2)
Updates one column (FTRAN) from region2 Tries to do FT update number returned is negative if no room ...
int pivots() const
Returns number of pivots since factorization.
ClpFactorization(const ClpFactorization &, int denseIfSmaller=0)
The copy constructor.
bool timeToRefactorize() const
int messageLevel() const
Level of detail of messages.
CoinBigIndex numberElementsU() const
Returns number in U area.
void almostDestructor()
Delete all stuff (leaves as after CoinFactorization())
void relaxAccuracyCheck(double value)
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
ClpFactorization & operator=(const ClpFactorization &)
void setBiasLU(int value)
int isDenseOrSmall() const
Return 1 if dense code.
int goDenseThreshold_
Switch to dense if number rows <= this.
CoinBigIndex numberElementsL() const
Returns number in L area.
int updateColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const
Updates one column (BTRAN) from region2 region1 starts as zero and is zero at end.
void setGoSmallThreshold(int value)
Set switch to small if number rows <= this.
void setGoOslThreshold(int value)
Set switch to osl if number rows <= this.
void areaFactor(double value)
Set whether larger areas needed.
int maximumPivots() const
Maximum number of pivots between factorizations.
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...
void setFactorization(ClpFactorization &factorization)
Sets factorization.
int goSmallThreshold() const
Get switch to small if number rows <= this.
int goOslThreshold_
Switch to osl if number rows <= this.
int goDenseThreshold() const
Get switch to dense if number rows <= this.
CoinFactorization * coinFactorization() const
Return coinFactorizationA_.
void maximumPivots(int value)
Set maximum number of pivots between factorizations.
void clearArrays()
Get rid of all memory.
void goDenseOrSmall(int numberRows)
Go over to dense or small code if small enough.
int numberRows() const
Number of Rows after factorization.
ClpFactorization(const CoinOtherFactorization &)
The copy constructor from an CoinOtherFactorization.
void setDefaultValues()
Sets default values.
void setStatus(int value)
Sets status.
void cleanUp()
Cleans up i.e. gets rid of network basis.
void forceOtherFactorization(int which)
If nonzero force use of 1,dense 2,small 3,osl.
double areaFactor() const
Whether larger areas needed.
void setForrestTomlin(bool value)
true if Forrest Tomlin update, false if PFI
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.
ClpFactorization()
Default constructor.
int goSmallThreshold_
Switch to small if number rows <= this.
Abstract base class for Clp Matrices.
This deals with Factorization and Updates for network structures.
This solves LPs using the simplex method.