Clp  1.17.3
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"
12 class ClpMatrixBase;
13 class ClpSimplex;
14 class ClpNetworkBasis;
16 #ifndef CLP_MULTIPLE_FACTORIZATIONS
17 #define CLP_MULTIPLE_FACTORIZATIONS 4
18 #endif
19 #ifdef CLP_MULTIPLE_FACTORIZATIONS
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 
42 public:
54  int factorize(ClpSimplex *model, int solveType, bool valuesPass);
56 
64 
70  ClpFactorization(const ClpFactorization &, int denseIfSmaller = 0);
71 #ifdef CLP_MULTIPLE_FACTORIZATIONS
72 
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
97  void replaceColumn1(CoinIndexedVector *regionSparse, int pivotRow);
100  int replaceColumn2(CoinIndexedVector *regionSparse,
101  int pivotRow,
102  double pivotCheck);
103 #endif
104 
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
146 
148  inline int numberElements() const
150  {
151  if (coinFactorizationA_)
152  return coinFactorizationA_->numberElements();
153  else
154  return coinFactorizationB_->numberElements();
155  }
157  inline int *permute() const
158  {
159  if (coinFactorizationA_)
160  return coinFactorizationA_->permute();
161  else
162  return coinFactorizationB_->permute();
163  }
165  inline int *pivotColumn() const
166  {
167  if (coinFactorizationA_)
168  return coinFactorizationA_->pivotColumn();
169  else
170  return coinFactorizationB_->permute();
171  }
173  inline int maximumPivots() const
174  {
175  if (coinFactorizationA_)
176  return coinFactorizationA_->maximumPivots();
177  else
178  return coinFactorizationB_->maximumPivots();
179  }
181  inline void maximumPivots(int value)
182  {
183  if (coinFactorizationA_)
184  coinFactorizationA_->maximumPivots(value);
185  else
186  coinFactorizationB_->maximumPivots(value);
187  }
189  inline int pivots() const
190  {
191  if (coinFactorizationA_)
192  return coinFactorizationA_->pivots();
193  else
194  return coinFactorizationB_->pivots();
195  }
197  inline double areaFactor() const
198  {
199  if (coinFactorizationA_)
200  return coinFactorizationA_->areaFactor();
201  else
202  return 0.0;
203  }
205  inline void areaFactor(double value)
206  {
207  if (coinFactorizationA_)
208  coinFactorizationA_->areaFactor(value);
209  }
211  inline double zeroTolerance() const
212  {
213  if (coinFactorizationA_)
214  return coinFactorizationA_->zeroTolerance();
215  else
216  return coinFactorizationB_->zeroTolerance();
217  }
219  inline void zeroTolerance(double value)
220  {
221  if (coinFactorizationA_)
222  coinFactorizationA_->zeroTolerance(value);
223  else
224  coinFactorizationB_->zeroTolerance(value);
225  }
227  void saferTolerances(double zeroTolerance, double pivotTolerance);
229  inline int sparseThreshold() const
230  {
231  if (coinFactorizationA_)
232  return coinFactorizationA_->sparseThreshold();
233  else
234  return 0;
235  }
237  inline void sparseThreshold(int value)
238  {
239  if (coinFactorizationA_)
240  coinFactorizationA_->sparseThreshold(value);
241  }
243  inline int status() const
244  {
245  if (coinFactorizationA_)
246  return coinFactorizationA_->status();
247  else
248  return coinFactorizationB_->status();
249  }
251  inline void setStatus(int value)
252  {
253  if (coinFactorizationA_)
254  coinFactorizationA_->setStatus(value);
255  else
256  coinFactorizationB_->setStatus(value);
257  }
259  inline int numberDense() const
260  {
261  if (coinFactorizationA_)
262  return coinFactorizationA_->numberDense();
263  else
264  return 0;
265  }
266 #if 1
267  inline CoinBigIndex numberElementsU() const
269  {
270  if (coinFactorizationA_)
271  return coinFactorizationA_->numberElementsU();
272  else
273  return -1;
274  }
277  {
278  if (coinFactorizationA_)
279  return coinFactorizationA_->numberElementsL();
280  else
281  return -1;
282  }
285  {
286  if (coinFactorizationA_)
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
296  inline int messageLevel() const
298  {
299  if (coinFactorizationA_)
300  return coinFactorizationA_->messageLevel();
301  else
302  return 1;
303  }
305  inline void messageLevel(int value)
306  {
307  if (coinFactorizationA_)
308  coinFactorizationA_->messageLevel(value);
309  }
311  inline void clearArrays()
312  {
313  if (coinFactorizationA_)
314  coinFactorizationA_->clearArrays();
315  else if (coinFactorizationB_)
316  coinFactorizationB_->clearArrays();
317  }
319  inline int numberRows() const
320  {
321  if (coinFactorizationA_)
322  return coinFactorizationA_->numberRows();
323  else
324  return coinFactorizationB_->numberRows();
325  }
327  inline int denseThreshold() const
328  {
329  if (coinFactorizationA_)
330  return coinFactorizationA_->denseThreshold();
331  else
332  return 0;
333  }
335  inline void setDenseThreshold(int value)
336  {
337  if (coinFactorizationA_)
338  coinFactorizationA_->setDenseThreshold(value);
339  }
341  inline double pivotTolerance() const
342  {
343  if (coinFactorizationA_)
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  {
352  if (coinFactorizationA_)
353  coinFactorizationA_->pivotTolerance(value);
354  else if (coinFactorizationB_)
355  coinFactorizationB_->pivotTolerance(value);
356  }
358  inline void relaxAccuracyCheck(double value)
359  {
360  if (coinFactorizationA_)
361  coinFactorizationA_->relaxAccuracyCheck(value);
362  }
368  inline int persistenceFlag() const
369  {
370  if (coinFactorizationA_)
371  return coinFactorizationA_->persistenceFlag();
372  else
373  return 0;
374  }
375  inline void setPersistenceFlag(int value)
376  {
377  if (coinFactorizationA_)
378  coinFactorizationA_->setPersistenceFlag(value);
379  }
381  inline void almostDestructor()
382  {
383  if (coinFactorizationA_)
384  coinFactorizationA_->almostDestructor();
385  else if (coinFactorizationB_)
386  coinFactorizationB_->clearArrays();
387  }
389  inline double adjustedAreaFactor() const
390  {
391  if (coinFactorizationA_)
392  return coinFactorizationA_->adjustedAreaFactor();
393  else
394  return 0.0;
395  }
396  inline void setBiasLU(int value)
397  {
398  if (coinFactorizationA_)
399  coinFactorizationA_->setBiasLU(value);
400  }
402  inline void setForrestTomlin(bool value)
403  {
404  if (coinFactorizationA_)
405  coinFactorizationA_->setForrestTomlin(value);
406  }
408  inline void setDefaultValues()
409  {
410  if (coinFactorizationA_) {
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  }
451  void goDenseOrSmall(int numberRows);
453  void setFactorization(ClpFactorization &factorization);
455  inline int isDenseOrSmall() const
456  {
457  return coinFactorizationB_ ? 1 : 0;
458  }
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
481 
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
497  inline bool networkBasis() const
499  {
500  return (networkBasis_ != NULL);
501  }
502 #else
503  inline bool networkBasis() const
505  {
506  return false;
507  }
508 #endif
509  void getWeights(int *weights) const;
512 
514 private:
517 #ifndef SLIM_CLP
519  ClpNetworkBasis *networkBasis_;
520 #endif
521 #ifdef CLP_MULTIPLE_FACTORIZATIONS
522  CoinFactorization *coinFactorizationA_;
525  CoinOtherFactorization *coinFactorizationB_;
526 #ifdef CLP_REUSE_ETAS
527  ClpSimplex *model_;
529 #endif
530  int forceB_;
533  int goOslThreshold_;
535  int goSmallThreshold_;
537  int goDenseThreshold_;
538 #endif
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_;
547 #endif
548  mutable bool doStatistics_;
551 };
552 
553 #endif
554 
555 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
556 */
void setGoOslThreshold(int value)
Set switch to osl if number rows <= this.
int goDenseThreshold() const
Get switch to dense if number rows <= this.
void setGoSmallThreshold(int value)
Set switch to small if number rows <= this.
void sparseThreshold(int value)
Set sparse threshold.
int numberRows() const
int isDenseOrSmall() const
Return 1 if dense code.
int persistenceFlag() const
Abstract base class for Clp Matrices.
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.
int pivots() const
Returns number of pivots since factorization.
void setStatus(int value)
Sets status.
void getWeights(int *weights) const
Fills weighted row list.
int maximumPivots() const
void setForrestTomlin(bool value)
int factorize(ClpSimplex *model, int solveType, bool valuesPass)
When part of LP - given by basic variables.
void setDenseThreshold(int value)
Sets dense threshold.
CoinBigIndex numberElementsR() const
Returns number in R area.
void almostDestructor()
Delete all stuff (leaves as after CoinFactorization())
void relaxAccuracyCheck(double value)
void forceOtherFactorization(int which)
If nonzero force use of 1,dense 2,small 3,osl.
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.
void setFactorization(ClpFactorization &factorization)
Sets factorization.
double pivotTolerance() const
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 setGoDenseThreshold(int value)
Set switch to dense if number rows <= this.
void setDefaultValues()
Sets default values.
This deals with Factorization and Updates for network structures.
This just implements CoinFactorization when an ClpMatrixBase object is passed.
void setBiasLU(int value)
int goSmallThreshold() const
Get switch to small if number rows <= this.
double adjustedAreaFactor() const
int numberDense() const
void setPersistenceFlag(int value)
#define CLP_MULTIPLE_FACTORIZATIONS
virtual void clearArrays()
int maximumPivots() const
int numberRows() const
Number of Rows after factorization.
double areaFactor() const
Whether larger areas needed.
double zeroTolerance() const
CoinBigIndex numberElementsL() const
Returns number in L area.
void maximumPivots(int value)
Set maximum number of pivots between factorizations.
void setPersistenceFlag(int value)
int sparseThreshold() const
~ClpFactorization()
Destructor.
bool networkBasis() const
Says if a network basis.
int numberElementsL() const
int numberElementsR() const
void cleanUp()
Cleans up i.e. gets rid of network basis.
int numberDense() const
Returns number of dense rows.
void setBiasLU(int value)
int numberElementsU() const
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:106
double zeroTolerance() const
int pivots() const
void goDenseOrSmall(int numberRows)
Go over to dense or small code if small enough.
void clearArrays()
Get rid of all memory.
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...
bool needToReorder() const
Says whether to redo pivot order.
double areaFactor() const
ClpFactorization()
Default constructor.
int * pivotColumn() const
CoinBigIndex numberElementsU() const
Returns number in U area.
void setStatus(int value)
void zeroTolerance(double value)
Set zero tolerance.
int updateColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const
Updates one column (BTRAN) from region2 region1 starts as zero and is zero at end.
int messageLevel() const
void doStatistics(bool trueFalse) const
To switch statistics on or off.
ClpFactorization & operator=(const ClpFactorization &)
void goSparse()
makes a row copy of L for speed and to allow very sparse problems
void setStatus(int value)
int sparseThreshold() const
get sparse threshold
int numberElements() const
int updateColumnForDebug(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const
For debug (no statistics update)
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...
CoinFactorization * coinFactorization() const
Return coinFactorizationA_.
int * pivotColumn() const
Returns address of pivotColumn region (also used for permuting)
double slackValue() const
double adjustedAreaFactor() const
Returns areaFactor but adjusted for dense.
int CoinBigIndex
void messageLevel(int value)
Set level of detail of messages.
int denseThreshold() const
Gets dense threshold.
int denseThreshold() const
int maximumPivots() const
Maximum number of pivots between factorizations.
int * permute() const
Returns address of permute region.
int status() const
bool timeToRefactorize() const
void setDenseThreshold(int value)
int * permute() const
int status() const
Returns status.
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.
virtual int * permute() const=0
double pivotTolerance() const
int messageLevel() const
Level of detail of messages.
double pivotTolerance() const
Pivot tolerance.
void pivotTolerance(double value)
Set pivot tolerance.
void setForrestTomlin(bool value)
true if Forrest Tomlin update, false if PFI
int numberElements() const
Total number of elements in factorization.
void areaFactor(double value)
Set whether larger areas needed.
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 relaxAccuracyCheck(double value)
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
virtual int numberElements() const=0