Clp  1.17.8
ClpFactorization.hpp
Go to the documentation of this file.
1 /* $Id$ */
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;
15 class 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 
42 public:
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
72 
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
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  {
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  }
227  void saferTolerances(double zeroTolerance, double pivotTolerance);
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
267  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
296  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  {
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  }
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
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
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_;
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_;
547 #endif
548  mutable bool doStatistics_;
551 };
552 
553 #endif
554 
555 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
556 */
ClpFactorization::factorize
int factorize(ClpSimplex *model, int solveType, bool valuesPass)
When part of LP - given by basic variables.
ClpSimplex
This solves LPs using the simplex method.
Definition: ClpSimplex.hpp:106
ClpFactorization::messageLevel
int messageLevel() const
Level of detail of messages.
Definition: ClpFactorization.hpp:297
ClpFactorization
This just implements CoinFactorization when an ClpMatrixBase object is passed.
Definition: ClpFactorization.hpp:34
ClpFactorization::forceOtherFactorization
void forceOtherFactorization(int which)
If nonzero force use of 1,dense 2,small 3,osl.
ClpFactorization::setFactorization
void setFactorization(ClpFactorization &factorization)
Sets factorization.
ClpFactorization::goSmallThreshold
int goSmallThreshold() const
Get switch to small if number rows <= this.
Definition: ClpFactorization.hpp:441
ClpFactorization::setForrestTomlin
void setForrestTomlin(bool value)
true if Forrest Tomlin update, false if PFI
Definition: ClpFactorization.hpp:402
ClpFactorization::forceB_
int forceB_
If nonzero force use of 1,dense 2,small 3,osl.
Definition: ClpFactorization.hpp:531
ClpFactorization::goOslThreshold_
int goOslThreshold_
Switch to osl if number rows <= this.
Definition: ClpFactorization.hpp:533
ClpFactorization::numberElementsR
CoinBigIndex numberElementsR() const
Returns number in R area.
Definition: ClpFactorization.hpp:284
ClpFactorization::setDefaultValues
void setDefaultValues()
Sets default values.
Definition: ClpFactorization.hpp:408
ClpFactorization::shortestAverage_
double shortestAverage_
For guessing when to re-factorize.
Definition: ClpFactorization.hpp:541
ClpFactorization::updateTwoColumnsFT
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.
ClpFactorization::setDenseThreshold
void setDenseThreshold(int value)
Sets dense threshold.
Definition: ClpFactorization.hpp:335
ClpFactorization::maximumPivots
void maximumPivots(int value)
Set maximum number of pivots between factorizations.
Definition: ClpFactorization.hpp:181
ClpFactorization::goDenseThreshold
int goDenseThreshold() const
Get switch to dense if number rows <= this.
Definition: ClpFactorization.hpp:431
ClpFactorization::almostDestructor
void almostDestructor()
Delete all stuff (leaves as after CoinFactorization())
Definition: ClpFactorization.hpp:381
ClpFactorization::endLengthU_
int endLengthU_
Definition: ClpFactorization.hpp:544
ClpFactorization::setBiasLU
void setBiasLU(int value)
Definition: ClpFactorization.hpp:396
ClpFactorization::numberDense
int numberDense() const
Returns number of dense rows.
Definition: ClpFactorization.hpp:259
ClpFactorization::totalInR_
double totalInR_
Definition: ClpFactorization.hpp:542
ClpFactorization::relaxAccuracyCheck
void relaxAccuracyCheck(double value)
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
Definition: ClpFactorization.hpp:358
ClpFactorization::doStatistics_
bool doStatistics_
To switch statistics on or off.
Definition: ClpFactorization.hpp:549
ClpFactorization::lastNumberPivots_
int lastNumberPivots_
Definition: ClpFactorization.hpp:545
ClpFactorization::saferTolerances
void saferTolerances(double zeroTolerance, double pivotTolerance)
Set tolerances to safer of existing and given.
ClpFactorization::goOslThreshold
int goOslThreshold() const
Get switch to osl if number rows <= this.
Definition: ClpFactorization.hpp:421
ClpFactorization::getWeights
void getWeights(int *weights) const
Fills weighted row list.
ClpFactorization::zeroTolerance
void zeroTolerance(double value)
Set zero tolerance.
Definition: ClpFactorization.hpp:219
ClpFactorization::setGoDenseThreshold
void setGoDenseThreshold(int value)
Set switch to dense if number rows <= this.
Definition: ClpFactorization.hpp:436
ClpFactorization::numberElementsL
CoinBigIndex numberElementsL() const
Returns number in L area.
Definition: ClpFactorization.hpp:276
ClpFactorization::goDenseOrSmall
void goDenseOrSmall(int numberRows)
Go over to dense or small code if small enough.
ClpFactorization::pivots
int pivots() const
Returns number of pivots since factorization.
Definition: ClpFactorization.hpp:189
ClpFactorization::~ClpFactorization
~ClpFactorization()
Destructor.
ClpFactorization::networkBasis
bool networkBasis() const
Says if a network basis.
Definition: ClpFactorization.hpp:498
ClpNetworkBasis
This deals with Factorization and Updates for network structures.
Definition: ClpNetworkBasis.hpp:25
ClpFactorization::cleanUp
void cleanUp()
Cleans up i.e. gets rid of network basis.
ClpFactorization::needToReorder
bool needToReorder() const
Says whether to redo pivot order.
ClpFactorization::numberElementsU
CoinBigIndex numberElementsU() const
Returns number in U area.
Definition: ClpFactorization.hpp:268
ClpFactorization::goSmallThreshold_
int goSmallThreshold_
Switch to small if number rows <= this.
Definition: ClpFactorization.hpp:535
ClpFactorization::messageLevel
void messageLevel(int value)
Set level of detail of messages.
Definition: ClpFactorization.hpp:305
ClpFactorization::coinFactorization
CoinFactorization * coinFactorization() const
Return coinFactorizationA_.
Definition: ClpFactorization.hpp:460
ClpMatrixBase
Abstract base class for Clp Matrices.
Definition: ClpMatrixBase.hpp:38
ClpFactorization::replaceColumn
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...
ClpSimplex.hpp
ClpFactorization::doStatistics
void doStatistics(bool trueFalse) const
To switch statistics on or off.
Definition: ClpFactorization.hpp:492
ClpFactorization::maximumPivots
int maximumPivots() const
Maximum number of pivots between factorizations.
Definition: ClpFactorization.hpp:173
ClpFactorization::goDenseThreshold_
int goDenseThreshold_
Switch to dense if number rows <= this.
Definition: ClpFactorization.hpp:537
ClpFactorization::adjustedAreaFactor
double adjustedAreaFactor() const
Returns areaFactor but adjusted for dense.
Definition: ClpFactorization.hpp:389
ClpFactorization::numberRows
int numberRows() const
Number of Rows after factorization.
Definition: ClpFactorization.hpp:319
ClpFactorization::areaFactor
double areaFactor() const
Whether larger areas needed.
Definition: ClpFactorization.hpp:197
ClpFactorization::updateColumnForDebug
int updateColumnForDebug(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const
For debug (no statistics update)
ClpFactorization::operator=
ClpFactorization & operator=(const ClpFactorization &)
ClpFactorization::pivotColumn
int * pivotColumn() const
Returns address of pivotColumn region (also used for permuting)
Definition: ClpFactorization.hpp:165
ClpFactorization::setPersistenceFlag
void setPersistenceFlag(int value)
Definition: ClpFactorization.hpp:375
ClpFactorization::updateColumnTranspose
int updateColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const
Updates one column (BTRAN) from region2 region1 starts as zero and is zero at end.
ClpFactorization::effectiveStartNumberU_
int effectiveStartNumberU_
Definition: ClpFactorization.hpp:546
ClpFactorization::status
int status() const
Returns status.
Definition: ClpFactorization.hpp:243
ClpFactorization::coinFactorizationB_
CoinOtherFactorization * coinFactorizationB_
Pointer to CoinOtherFactorization.
Definition: ClpFactorization.hpp:525
ClpFactorization::numberElements
int numberElements() const
Total number of elements in factorization.
Definition: ClpFactorization.hpp:149
CLP_MULTIPLE_FACTORIZATIONS
#define CLP_MULTIPLE_FACTORIZATIONS
Definition: ClpFactorization.hpp:17
ClpFactorization::coinFactorizationA_
CoinFactorization * coinFactorizationA_
Pointer to CoinFactorization.
Definition: ClpFactorization.hpp:523
ClpFactorization::updateTwoColumnsTranspose
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...
ClpFactorization::clearArrays
void clearArrays()
Get rid of all memory.
Definition: ClpFactorization.hpp:311
ClpFactorization::ClpFactorization
ClpFactorization()
Default constructor.
ClpFactorization::setGoOslThreshold
void setGoOslThreshold(int value)
Set switch to osl if number rows <= this.
Definition: ClpFactorization.hpp:426
ClpFactorization::setGoSmallThreshold
void setGoSmallThreshold(int value)
Set switch to small if number rows <= this.
Definition: ClpFactorization.hpp:446
ClpFactorization::areaFactor
void areaFactor(double value)
Set whether larger areas needed.
Definition: ClpFactorization.hpp:205
ClpFactorization::denseThreshold
int denseThreshold() const
Gets dense threshold.
Definition: ClpFactorization.hpp:327
ClpFactorization::setStatus
void setStatus(int value)
Sets status.
Definition: ClpFactorization.hpp:251
ClpFactorization::goSparse
void goSparse()
makes a row copy of L for speed and to allow very sparse problems
ClpFactorization::sparseThreshold
int sparseThreshold() const
get sparse threshold
Definition: ClpFactorization.hpp:229
ClpFactorization::timeToRefactorize
bool timeToRefactorize() const
ClpFactorization::updateColumn
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::isDenseOrSmall
int isDenseOrSmall() const
Return 1 if dense code.
Definition: ClpFactorization.hpp:455
ClpFactorization::persistenceFlag
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...
Definition: ClpFactorization.hpp:368
ClpFactorization::updateColumnFT
int updateColumnFT(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2)
Updates one column (FTRAN) from region2 Tries to do FT update number returned is negative if no room ...
ClpFactorization::zeroTolerance
double zeroTolerance() const
Zero tolerance.
Definition: ClpFactorization.hpp:211
ClpFactorization::sparseThreshold
void sparseThreshold(int value)
Set sparse threshold.
Definition: ClpFactorization.hpp:237
ClpFactorization::totalInIncreasingU_
double totalInIncreasingU_
Definition: ClpFactorization.hpp:543
ClpFactorization::permute
int * permute() const
Returns address of permute region.
Definition: ClpFactorization.hpp:157
ClpFactorization::networkBasis_
ClpNetworkBasis * networkBasis_
Pointer to network basis.
Definition: ClpFactorization.hpp:519
ClpFactorization::pivotTolerance
void pivotTolerance(double value)
Set pivot tolerance.
Definition: ClpFactorization.hpp:350
ClpFactorization::pivotTolerance
double pivotTolerance() const
Pivot tolerance.
Definition: ClpFactorization.hpp:341