Clp  1.17.3
AbcSimplexFactorization.hpp
Go to the documentation of this file.
1 /* $Id: AbcSimplexFactorization.hpp 2385 2019-01-06 19:43:06Z unxusr $ */
2 // Copyright (C) 2002, International Business Machines
3 // Corporation and others, Copyright (C) 2012, FasterCoin. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 
6 #ifndef AbcSimplexFactorization_H
7 #define AbcSimplexFactorization_H
8 
9 #include "CoinPragma.hpp"
10 
11 #include "CoinAbcCommon.hpp"
12 #include "CoinAbcFactorization.hpp"
13 #include "AbcMatrix.hpp"
14 //#include "CoinAbcAnyFactorization.hpp"
15 #include "AbcSimplex.hpp"
16 #ifndef ABC_USE_COIN_FACTORIZATION
17 class ClpFactorization;
18 class CoinFactorization;
19 #else
20 #include "ClpFactorization.hpp"
21 #include "CoinFactorization.hpp"
22 #endif
23 
27 
28 public:
40  int factorize(AbcSimplex *model, int solveType, bool valuesPass);
41 #ifdef EARLY_FACTORIZE
42  inline int factorize(AbcSimplex *model, CoinIndexedVector &stuff)
44  {
45  return coinAbcFactorization_->factorize(model, stuff);
46  }
47 #endif
48 
49 
57 
61  AbcSimplexFactorization(const AbcSimplexFactorization &, int denseIfSmaller = 0);
66 
67  /* **** below here is so can use networkish basis */
70 
75  inline
76 #ifdef ABC_LONG_FACTORIZATION
77  long
78 #endif
79  double
81  int pivotRow)
82  {
83  return coinAbcFactorization_->checkReplacePart1(regionSparse, pivotRow);
84  }
89  inline
90 #ifdef ABC_LONG_FACTORIZATION
91  long
92 #endif
93  double
95  CoinIndexedVector *partialUpdate,
96  int pivotRow)
97  {
98  return coinAbcFactorization_->checkReplacePart1(regionSparse, partialUpdate, pivotRow);
99  }
100 #ifdef MOVE_REPLACE_PART1A
101 
105  inline void checkReplacePart1a(CoinIndexedVector *regionSparse,
106  int pivotRow)
107  {
108  coinAbcFactorization_->checkReplacePart1a(regionSparse, pivotRow);
109  }
110  inline double checkReplacePart1b(CoinIndexedVector *regionSparse,
111  int pivotRow)
112  {
113  return coinAbcFactorization_->checkReplacePart1b(regionSparse, pivotRow);
114  }
115 #endif
116 
118  inline int checkReplacePart2(int pivotRow,
119  double btranAlpha,
120  double ftranAlpha,
121 #ifdef ABC_LONG_FACTORIZATION
122  long
123 #endif
124  double ftAlpha)
125  {
126  return coinAbcFactorization_->checkReplacePart2(pivotRow, btranAlpha, ftranAlpha, ftAlpha);
127  }
128 #ifdef ABC_LONG_FACTORIZATION
129  inline void clearHiddenArrays()
131  {
132  coinAbcFactorization_->clearHiddenArrays();
133  }
134 #endif
135 
137  void replaceColumnPart3(const AbcSimplex *model,
138  CoinIndexedVector *regionSparse,
139  CoinIndexedVector *tableauColumn,
140  int pivotRow,
141 #ifdef ABC_LONG_FACTORIZATION
142  long
143 #endif
144  double alpha);
147  void replaceColumnPart3(const AbcSimplex *model,
148  CoinIndexedVector *regionSparse,
149  CoinIndexedVector *tableauColumn,
150  CoinIndexedVector *partialUpdate,
151  int pivotRow,
152 #ifdef ABC_LONG_FACTORIZATION
153  long
154 #endif
155  double alpha);
156 #ifdef EARLY_FACTORIZE
157  inline int replaceColumns(const AbcSimplex *model,
159  CoinIndexedVector &stuff,
160  int firstPivot, int lastPivot, bool cleanUp)
161  {
162  return coinAbcFactorization_->replaceColumns(model, stuff, firstPivot, lastPivot, cleanUp);
163  }
164 #endif
165 
166 
170 #if 0
171 
175  int updateColumnFT ( CoinIndexedVector * regionSparse,
176  CoinIndexedVector * regionSparse2);
179  int updateColumn ( CoinIndexedVector * regionSparse,
180  CoinIndexedVector * regionSparse2) const;
186  int updateTwoColumnsFT ( CoinIndexedVector * regionSparse1,
187  CoinIndexedVector * regionSparse2,
188  CoinIndexedVector * regionSparse3) ;
191  int updateColumnTranspose ( CoinIndexedVector * regionSparse,
192  CoinIndexedVector * regionSparse2) const;
193 #endif
194 
197  inline int updateColumnFT(CoinIndexedVector &regionSparseFT)
198  {
199  return coinAbcFactorization_->updateColumnFT(regionSparseFT);
200  }
201  inline int updateColumnFTPart1(CoinIndexedVector &regionSparseFT)
202  {
203  return coinAbcFactorization_->updateColumnFTPart1(regionSparseFT);
204  }
205  inline void updateColumnFTPart2(CoinIndexedVector &regionSparseFT)
206  {
207  coinAbcFactorization_->updateColumnFTPart2(regionSparseFT);
208  }
212  inline void updateColumnFT(CoinIndexedVector &regionSparseFT,
213  CoinIndexedVector &partialUpdate,
214  int which)
215  {
216  coinAbcFactorization_->updateColumnFT(regionSparseFT, partialUpdate, which);
217  }
219  inline int updateColumn(CoinIndexedVector &regionSparse) const
220  {
221  return coinAbcFactorization_->updateColumn(regionSparse);
222  }
227  inline int updateTwoColumnsFT(CoinIndexedVector &regionSparseFT,
228  CoinIndexedVector &regionSparseOther)
229  {
230  return coinAbcFactorization_->updateTwoColumnsFT(regionSparseFT, regionSparseOther);
231  }
233  inline int updateColumnTranspose(CoinIndexedVector &regionSparse) const
234  {
235  return coinAbcFactorization_->updateColumnTranspose(regionSparse);
236  }
238  inline void updateColumnCpu(CoinIndexedVector &regionSparse, int whichCpu) const
239 #ifndef ABC_USE_COIN_FACTORIZATION
240  {
241  coinAbcFactorization_->updateColumnCpu(regionSparse, whichCpu);
242  }
243 #else
244  {
245  coinAbcFactorization_->updateColumn(regionSparse);
246  }
247 #endif
248 
249  inline void updateColumnTransposeCpu(CoinIndexedVector &regionSparse, int whichCpu) const
250 #ifndef ABC_USE_COIN_FACTORIZATION
251  {
252  coinAbcFactorization_->updateColumnTransposeCpu(regionSparse, whichCpu);
253  }
254 #else
255  {
256  coinAbcFactorization_->updateColumnTranspose(regionSparse);
257  }
258 #endif
259 
260  inline void updateFullColumn(CoinIndexedVector &regionSparse) const
261  {
262  coinAbcFactorization_->updateFullColumn(regionSparse);
263  }
265  inline void updateFullColumnTranspose(CoinIndexedVector &regionSparse) const
266  {
267  coinAbcFactorization_->updateFullColumnTranspose(regionSparse);
268  }
270  void updateWeights(CoinIndexedVector &regionSparse) const
271 #ifndef ABC_USE_COIN_FACTORIZATION
272  {
273  coinAbcFactorization_->updateWeights(regionSparse);
274  }
275 #else
276  {
277  coinAbcFactorization_->updateColumn(regionSparse);
278  }
279 #endif
280 
281 
283  inline int numberElements() const
285  {
286  return coinAbcFactorization_->numberElements();
287  }
289  inline int maximumPivots() const
290  {
291  return coinAbcFactorization_->maximumPivots();
292  }
294  inline void maximumPivots(int value)
295  {
296  coinAbcFactorization_->maximumPivots(value);
297  }
299  inline bool usingFT() const
300  {
301  return !coinAbcFactorization_->wantsTableauColumn();
302  }
304  inline int pivots() const
305  {
306  return coinAbcFactorization_->pivots();
307  }
309  inline void setModel(AbcSimplex *model)
310  {
311  model_ = model;
312  }
314  inline void setPivots(int value) const
315  {
316  coinAbcFactorization_->setPivots(value);
317  }
319  inline double areaFactor() const
320  {
321  return coinAbcFactorization_->areaFactor();
322  }
324  inline void areaFactor(double value)
325  {
326  coinAbcFactorization_->areaFactor(value);
327  }
329  inline double zeroTolerance() const
330  {
331  return coinAbcFactorization_->zeroTolerance();
332  }
334  inline void zeroTolerance(double value)
335  {
336  coinAbcFactorization_->zeroTolerance(value);
337  }
339  void saferTolerances(double zeroTolerance, double pivotTolerance);
341  inline int status() const
342  {
343  return coinAbcFactorization_->status();
344  }
346  inline void setStatus(int value)
347  {
348  coinAbcFactorization_->setStatus(value);
349  }
350 #if ABC_PARALLEL == 2
351  inline void setParallelMode(int value)
353  {
354  coinAbcFactorization_->setParallelMode(value);
355  };
356 #endif
357  inline int numberDense() const
359  {
360  return coinAbcFactorization_->numberDense();
361  }
362  bool timeToRefactorize() const;
363 #if CLP_FACTORIZATION_NEW_TIMING > 1
364  void statsRefactor(char when) const;
365 #endif
366  inline void clearArrays()
368  {
369  coinAbcFactorization_->clearArrays();
370  }
372  inline int numberRows() const
373  {
374  return coinAbcFactorization_->numberRows();
375  }
377  inline int numberSlacks() const
378  {
379  return numberSlacks_;
380  }
382  inline double pivotTolerance() const
383  {
384  return coinAbcFactorization_->pivotTolerance();
385  }
387  inline void pivotTolerance(double value)
388  {
389  coinAbcFactorization_->pivotTolerance(value);
390  }
392  inline double minimumPivotTolerance() const
393  {
394  return coinAbcFactorization_->minimumPivotTolerance();
395  }
397  inline void minimumPivotTolerance(double value)
398  {
399  coinAbcFactorization_->minimumPivotTolerance(value);
400  }
402  inline double *pivotRegion() const
403  {
404  return coinAbcFactorization_->pivotRegion();
405  }
407  //inline void relaxAccuracyCheck(double /*value*/) {
408  //abort();
409  //}
411  inline void almostDestructor()
412  {
413  coinAbcFactorization_->clearArrays();
414  }
416  void setDenseThreshold(int number);
417  int getDenseThreshold() const;
419  void forceOtherFactorization(int which);
421  void goDenseOrSmall(int numberRows);
423  inline int goDenseThreshold() const
424  {
425  return goDenseThreshold_;
426  }
428  inline void setGoDenseThreshold(int value)
429  {
430  goDenseThreshold_ = value;
431  }
433  inline int goSmallThreshold() const
434  {
435  return goSmallThreshold_;
436  }
438  inline void setGoSmallThreshold(int value)
439  {
440  goSmallThreshold_ = value;
441  }
443  inline int goLongThreshold() const
444  {
445  return goLongThreshold_;
446  }
448  inline void setGoLongThreshold(int value)
449  {
450  goLongThreshold_ = value;
451  }
453  inline int typeOfFactorization() const
454  {
455  return forceB_;
456  }
458  void synchronize(const ClpFactorization *otherFactorization, const AbcSimplex *model);
460 
464  void goSparse();
465 #ifndef NDEBUG
466 #ifndef ABC_USE_COIN_FACTORIZATION
467  inline void checkMarkArrays() const
468  {
469  coinAbcFactorization_->checkMarkArrays();
470  }
471 #else
472  inline void checkMarkArrays() const
473  {
474  }
475 #endif
476 #endif
477  inline bool needToReorder() const
479  {
480  abort();
481  return true;
482  }
484 #ifndef ABC_USE_COIN_FACTORIZATION
486  {
487  return coinAbcFactorization_;
488  }
489 #else
491  {
492  return coinAbcFactorization_;
493  }
494 #endif
495 
496 
498 private:
501  AbcSimplex *model_;
504 #ifndef ABC_USE_COIN_FACTORIZATION
505  CoinAbcAnyFactorization *coinAbcFactorization_;
506 #else
507  CoinFactorization *coinAbcFactorization_;
508 #endif
509 #ifdef CLP_FACTORIZATION_NEW_TIMING
510  mutable double shortestAverage_;
512  mutable double totalInR_;
513  mutable double totalInIncreasingU_;
514  mutable int endLengthU_;
515  mutable int lastNumberPivots_;
516  mutable int effectiveStartNumberU_;
517 #endif
518  int forceB_;
521  int goDenseThreshold_;
523  int goSmallThreshold_;
525  int goLongThreshold_;
527  int numberSlacks_;
529 };
530 
531 #endif
532 
533 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
534 */
virtual void updateColumnTransposeCpu(CoinIndexedVector &regionSparse, int whichCpu) const
Updates one column (BTRAN)
int goDenseThreshold() const
Get switch to dense if number rows <= this.
void setGoLongThreshold(int value)
Set switch to long/ordered if number rows >= this.
void updateColumnFT(CoinIndexedVector &regionSparseFT, CoinIndexedVector &partialUpdate, int which)
Updates one column (FTRAN) Tries to do FT update puts partial update in vector.
void areaFactor(double value)
Set whether larger areas needed.
This just implements AbcFactorization when an AbcMatrix object is passed.
int updateColumnTranspose(CoinIndexedVector &regionSparse) const
Updates one column (BTRAN)
virtual double checkReplacePart1(CoinIndexedVector *, int)
Checks if can replace one Column to basis, returns update alpha Fills in region for use later partial...
void synchronize(const ClpFactorization *otherFactorization, const AbcSimplex *model)
Synchronize stuff.
int numberElements() const
Total number of elements in factorization.
Abstract base class which also has some scalars so can be used from Dense or Simp.
bool needToReorder() const
Says whether to redo pivot order.
void updateFullColumn(CoinIndexedVector &regionSparse) const
Updates one full column (FTRAN)
int typeOfFactorization() const
Returns type.
~AbcSimplexFactorization()
Destructor.
int numberSlacks() const
Number of slacks at last factorization.
virtual void updateFullColumnTranspose(CoinIndexedVector &regionSparse) const =0
Updates one column (BTRAN) from unpacked regionSparse.
virtual int updateColumnFTPart1(CoinIndexedVector &regionSparse)=0
void saferTolerances(double zeroTolerance, double pivotTolerance)
Set tolerances to safer of existing and given.
virtual int updateColumnTranspose(CoinIndexedVector &regionSparse) const =0
Updates one column (BTRAN) from unpacked regionSparse.
bool usingFT() const
Returns true if doing FT.
CoinSimplexInt numberDense() const
Number of dense rows after factorization.
int factorize(AbcSimplex *model, int solveType, bool valuesPass)
When part of LP - given by basic variables.
virtual void updateFullColumn(CoinIndexedVector &regionSparse) const =0
This version does FTRAN on array when indices not set up.
int numberRows() const
Number of Rows after factorization.
AbcSimplexFactorization & operator=(const AbcSimplexFactorization &)
This just implements CoinFactorization when an ClpMatrixBase object is passed.
virtual int updateTwoColumnsFT(CoinIndexedVector &regionFT, CoinIndexedVector &regionOther)=0
does FTRAN on two unpacked columns
int updateTwoColumnsFT(CoinIndexedVector &regionSparseFT, CoinIndexedVector &regionSparseOther)
Updates one column (FTRAN) from regionFT Tries to do FT update number returned is negative if no room...
int updateColumnFTPart1(CoinIndexedVector &regionSparseFT)
AbcSimplexFactorization(int numberRows=0)
Default constructor.
void setStatus(int value)
Sets status.
double checkReplacePart1(CoinIndexedVector *regionSparse, CoinIndexedVector *partialUpdate, int pivotRow)
Checks if can replace one Column to basis, returns update alpha Fills in region for use later partial...
int updateColumnFT(CoinIndexedVector &regionSparseFT)
Updates one column (FTRAN) Tries to do FT update number returned is negative if no room.
void zeroTolerance(double value)
Set zero tolerance.
double areaFactor() const
Whether larger areas needed.
virtual int updateColumnFT(CoinIndexedVector &regionSparse)=0
Updates one column (FTRAN) from unpacked regionSparse Tries to do FT update number returned is negati...
void pivotTolerance(double value)
Set pivot tolerance.
int getDenseThreshold() const
int status() const
Returns status.
double pivotTolerance() const
Pivot tolerance.
double pivotTolerance() const
Pivot tolerance.
int checkReplacePart2(int pivotRow, double btranAlpha, double ftranAlpha, double ftAlpha)
Checks if can replace one Column to basis, returns 0=OK, 1=Probably OK, 2=singular,...
int goLongThreshold() const
Get switch to long/ordered if number rows >= this.
void clearArrays()
Get rid of all memory.
void setModel(AbcSimplex *model)
Sets model.
void setFactorization(AbcSimplexFactorization &rhs)
Sets factorization.
virtual void updateColumnCpu(CoinIndexedVector &regionSparse, int whichCpu) const
Updates one column (FTRAN)
void maximumPivots(int value)
Set maximum number of pivots between factorizations.
void updateColumnTransposeCpu(CoinIndexedVector &regionSparse, int whichCpu) const
Updates one column (BTRAN)
void goSparse()
makes a row copy of L for speed and to allow very sparse problems
void setStatus(int value)
Sets status.
void updateWeights(CoinIndexedVector &regionSparse) const
Updates one column for dual steepest edge weights (FTRAN)
void updateFullColumnTranspose(CoinIndexedVector &regionSparse) const
Updates one full column (BTRAN)
int status() const
Returns status.
void forceOtherFactorization(int which)
If nonzero force use of 1,dense 2,small 3,long.
virtual int updateColumn(CoinIndexedVector &regionSparse) const =0
This version has same effect as above with FTUpdate==false so number returned is always >=0.
virtual void checkReplacePart1a(CoinIndexedVector *, int)
virtual int numberElements() const =0
Total number of elements in factorization.
void replaceColumnPart3(const AbcSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, int pivotRow, double alpha)
Replaces one Column to basis, partial update already in U.
void setPivots(int value)
Sets number of pivots since factorization.
CoinAbcAnyFactorization * factorization() const
Pointer to factorization.
void setGoSmallThreshold(int value)
Set switch to small if number rows <= this.
double zeroTolerance() const
Zero tolerance.
int numberDense() const
Returns number of dense rows.
double minimumPivotTolerance() const
Minimum pivot tolerance.
int goSmallThreshold() const
Get switch to small if number rows <= this.
double minimumPivotTolerance() const
Minimum pivot tolerance.
virtual double checkReplacePart1b(CoinIndexedVector *, int)
virtual void updateWeights(CoinIndexedVector &regionSparse) const =0
Updates one column for dual steepest edge weights (FTRAN)
int pivots() const
Returns number of pivots since factorization.
void almostDestructor()
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
virtual bool wantsTableauColumn() const
Returns true if wants tableauColumn in replaceColumn.
void setPivots(int value) const
Sets number of pivots since factorization.
virtual int checkReplacePart2(int pivotRow, double btranAlpha, double ftranAlpha, double ftAlpha, double acceptablePivot=1.0e-8)=0
Checks if can replace one Column to basis, returns 0=OK, 1=Probably OK, 2=singular,...
int maximumPivots() const
Maximum number of pivots between factorizations.
double checkReplacePart1(CoinIndexedVector *regionSparse, int pivotRow)
Checks if can replace one Column to basis, returns update alpha Fills in region for use later partial...
void setGoDenseThreshold(int value)
Set switch to dense if number rows <= this.
int numberRows() const
Number of Rows after factorization.
double * pivotRegion() const
pivot region
void setDenseThreshold(int number)
So we can temporarily switch off dense.
double zeroTolerance() const
Zero tolerance.
void updateColumnCpu(CoinIndexedVector &regionSparse, int whichCpu) const
Updates one column (FTRAN)
int pivots() const
Returns number of pivots since factorization.
void minimumPivotTolerance(double value)
Set minimum pivot tolerance.
void goDenseOrSmall(int numberRows)
Go over to dense code.
virtual void clearArrays()
Get rid of all memory.
double areaFactor() const
Area factor.
int updateColumn(CoinIndexedVector &regionSparse) const
Updates one column (FTRAN)
int maximumPivots() const
Maximum number of pivots between factorizations.
void updateColumnFTPart2(CoinIndexedVector &regionSparseFT)
bool timeToRefactorize() const
virtual CoinFactorizationDouble * pivotRegion() const
virtual void updateColumnFTPart2(CoinIndexedVector &regionSparse)=0