Clp 1.16.9
Loading...
Searching...
No Matches
CoinAbcDenseFactorization.hpp
Go to the documentation of this file.
1/* $Id: CoinAbcDenseFactorization.hpp 1910 2013-01-27 02:00:13Z stefan $ */
2// Copyright (C) 2008, 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
7/*
8 Authors
9
10 John Forrest
11
12 */
13#ifndef CoinAbcDenseFactorization_H
14#define CoinAbcDenseFactorization_H
15
16#include <iostream>
17#include <string>
18#include <cassert>
19#include "CoinTypes.hpp"
20#include "CoinAbcCommon.hpp"
21#include "CoinIndexedVector.hpp"
22class CoinPackedMatrix;
25
26public:
27
34
39
41 virtual CoinAbcAnyFactorization * clone() const = 0;
43
47 inline int status ( ) const {
48 return status_;
49 }
51 inline void setStatus ( int value)
52 { status_=value; }
54 inline int pivots ( ) const {
55 return numberPivots_;
56 }
57#if ABC_PARALLEL==2
59 inline void setParallelMode(int value)
60 {parallelMode_=value;};
61#endif
63 inline void setPivots ( int value )
64 { numberPivots_=value; }
66 inline int numberSlacks ( ) const {
67 return numberSlacks_;
68 }
70 inline void setNumberSlacks ( int value )
71 { numberSlacks_=value; }
73 inline void setNumberRows(int value)
74 { numberRows_ = value; }
76 inline int numberRows ( ) const {
77 return numberRows_;
78 }
80 inline CoinSimplexInt numberDense ( ) const {
81 return numberDense_;
82 }
84 inline int numberGoodColumns ( ) const {
85 return numberGoodU_;
86 }
88 inline void relaxAccuracyCheck(double value)
89 { relaxCheck_ = value;}
90 inline double getAccuracyCheck() const
91 { return relaxCheck_;}
93 inline int maximumPivots ( ) const {
94 return maximumPivots_ ;
95 }
97 virtual void maximumPivots ( int value );
98
100 inline double pivotTolerance ( ) const {
101 return pivotTolerance_ ;
102 }
103 void pivotTolerance ( double value );
105 inline double minimumPivotTolerance ( ) const {
107 }
108 void minimumPivotTolerance ( double value );
109 virtual CoinFactorizationDouble * pivotRegion() const
110 { return NULL;}
112 inline double areaFactor ( ) const {
113 return areaFactor_ ;
114 }
115 inline void areaFactor ( CoinSimplexDouble value ) {
116 areaFactor_=value;
117 }
119 inline double zeroTolerance ( ) const {
120 return zeroTolerance_ ;
121 }
122 void zeroTolerance ( double value );
124 virtual CoinFactorizationDouble * elements() const;
126 virtual int * pivotRow() const;
128 virtual CoinFactorizationDouble * workArea() const;
130 virtual int * intWorkArea() const;
132 virtual int * numberInRow() const;
134 virtual int * numberInColumn() const;
136 virtual CoinBigIndex * starts() const;
138 virtual int * permuteBack() const;
140 virtual void goSparse() {}
141#ifndef NDEBUG
142 virtual inline void checkMarkArrays() const {}
143#endif
148 inline int solveMode() const
149 { return solveMode_ ;}
154 inline void setSolveMode(int value)
155 { solveMode_ = value;}
157 virtual bool wantsTableauColumn() const;
162 virtual void setUsefulInformation(const int * info,int whereFrom);
164 virtual void clearArrays() {}
166
169 virtual int * indices() const = 0;
171 virtual int * permute() const = 0;
173 virtual int * pivotColumn() const;
175 virtual int numberElements ( ) const = 0;
177
180 virtual void getAreas ( int numberRows,
181 int numberColumns,
182 CoinBigIndex maximumL,
183 CoinBigIndex maximumU ) = 0;
184
186 virtual void preProcess ( ) = 0;
192 virtual int factor (AbcSimplex * model) = 0;
193#ifdef EARLY_FACTORIZE
195 virtual int factorize (AbcSimplex * /*model*/, CoinIndexedVector & /*stuff*/)
196 { return -2;}
197#endif
199 virtual void postProcess(const int * sequence, int * pivotVariable) = 0;
201 virtual void makeNonSingular(int * sequence) = 0;
203
206#if 0
211 virtual int checkReplace ( CoinIndexedVector * /*regionSparse*/,
212 int /*pivotRow*/,
213 double & /*pivotCheck*/,
214 double /*acceptablePivot = 1.0e-8*/)
215 {return 0;}
220 virtual int replaceColumn ( CoinIndexedVector * regionSparse,
221 int pivotRow,
222 double pivotCheck ,
223 bool skipBtranU=false,
224 double acceptablePivot=1.0e-8)=0;
225#endif
226#ifdef EARLY_FACTORIZE
228 virtual int replaceColumns ( const AbcSimplex * /*model*/,
229 CoinIndexedVector & /*stuff*/,
230 int /*firstPivot*/,int /*lastPivot*/,bool /*cleanUp*/)
231 { return -1;}
232#endif
233#ifdef ABC_LONG_FACTORIZATION
235 virtual void clearHiddenArrays() {}
236#endif
241 virtual
242#ifdef ABC_LONG_FACTORIZATION
243 long
244#endif
245 double checkReplacePart1 ( CoinIndexedVector * /*regionSparse*/,
246 int /*pivotRow*/)
247 {return 0.0;}
248 virtual
249#ifdef ABC_LONG_FACTORIZATION
250 long
251#endif
252 double checkReplacePart1 ( CoinIndexedVector * /*regionSparse*/,
253 CoinIndexedVector * /*partialUpdate*/,
254 int /*pivotRow*/)
255 {return 0.0;}
256 virtual void checkReplacePart1a ( CoinIndexedVector * /* regionSparse */,
257 int /*pivotRow*/)
258 {}
259 virtual double checkReplacePart1b (CoinIndexedVector * /*regionSparse*/,
260 int /*pivotRow*/)
261 {return 0.0;}
264 virtual int checkReplacePart2 ( int pivotRow,
265 double btranAlpha,
266 double ftranAlpha,
267#ifdef ABC_LONG_FACTORIZATION
268 long
269#endif
270 double ftAlpha,
271 double acceptablePivot = 1.0e-8) = 0;
274 virtual void replaceColumnPart3 ( const AbcSimplex * model,
275 CoinIndexedVector * regionSparse,
276 CoinIndexedVector * tableauColumn,
277 int pivotRow,
278#ifdef ABC_LONG_FACTORIZATION
279 long
280#endif
281 double alpha ) = 0;
284 virtual void replaceColumnPart3 ( const AbcSimplex * model,
285 CoinIndexedVector * regionSparse,
286 CoinIndexedVector * tableauColumn,
287 CoinIndexedVector * partialUpdate,
288 int pivotRow,
289#ifdef ABC_LONG_FACTORIZATION
290 long
291#endif
292 double alpha )=0;
294
302 virtual int updateColumnFT ( CoinIndexedVector & regionSparse) = 0;
303 virtual int updateColumnFTPart1 ( CoinIndexedVector & regionSparse) = 0;
304 virtual void updateColumnFTPart2 ( CoinIndexedVector & regionSparse) = 0;
305 virtual void updateColumnFT ( CoinIndexedVector & regionSparseFT,
306 CoinIndexedVector & partialUpdate,
307 int which)=0;
310 virtual int updateColumn ( CoinIndexedVector & regionSparse) const = 0;
312 virtual int updateTwoColumnsFT(CoinIndexedVector & regionFT,
313 CoinIndexedVector & regionOther) = 0;
316 virtual int updateColumnTranspose ( CoinIndexedVector & regionSparse) const = 0;
318 virtual void updateFullColumn ( CoinIndexedVector & regionSparse) const = 0;
321 virtual void updateFullColumnTranspose ( CoinIndexedVector & regionSparse) const = 0;
323 virtual void updateWeights ( CoinIndexedVector & regionSparse) const=0;
325 virtual void updateColumnCpu ( CoinIndexedVector & regionSparse,int whichCpu) const;
327 virtual void updateColumnTransposeCpu ( CoinIndexedVector & regionSparse,int whichCpu) const;
329
331protected:
332
343 //#ifndef slackValue_
344#define slackValue2_ 1.0
345 //#endif
349 CoinBigIndex factorElements_;
366#if ABC_PARALLEL==2
367 int parallelMode_;
368#endif
375 CoinFactorizationDouble * elements_;
377 CoinFactorizationDouble * workArea_;
384};
395 friend void CoinAbcDenseFactorizationUnitTest( const std::string & mpsDir );
396
397public:
398
405
411 virtual CoinAbcAnyFactorization * clone() const ;
413
417 virtual void getAreas ( int numberRows,
418 int numberColumns,
419 CoinBigIndex maximumL,
420 CoinBigIndex maximumU );
421
423 virtual void preProcess ( );
429 virtual int factor (AbcSimplex * model);
431 virtual void postProcess(const int * sequence, int * pivotVariable);
433 virtual void makeNonSingular(int * sequence);
435
439 virtual inline int numberElements ( ) const {
441 }
443 double maximumCoefficient() const;
445
448
453 virtual int replaceColumn ( CoinIndexedVector * regionSparse,
454 int pivotRow,
455 double pivotCheck ,
456 bool skipBtranU=false,
457 double acceptablePivot=1.0e-8);
460 virtual int checkReplacePart2 ( int pivotRow,
461 double btranAlpha,
462 double ftranAlpha,
463#ifdef ABC_LONG_FACTORIZATION
464 long
465#endif
466 double ftAlpha,
467 double acceptablePivot = 1.0e-8) ;
470 virtual void replaceColumnPart3 ( const AbcSimplex * model,
471 CoinIndexedVector * regionSparse,
472 CoinIndexedVector * tableauColumn,
473 int pivotRow,
474#ifdef ABC_LONG_FACTORIZATION
475 long
476#endif
477 double alpha );
480 virtual void replaceColumnPart3 ( const AbcSimplex * model,
481 CoinIndexedVector * regionSparse,
482 CoinIndexedVector * tableauColumn,
483 CoinIndexedVector * /*partialUpdate*/,
484 int pivotRow,
485#ifdef ABC_LONG_FACTORIZATION
486 long
487#endif
488 double alpha )
489 { replaceColumnPart3(model,regionSparse,tableauColumn,pivotRow,alpha);}
491
499 virtual int updateColumnFT ( CoinIndexedVector & regionSparse)
500 {return updateColumn(regionSparse);}
501 virtual int updateColumnFTPart1 ( CoinIndexedVector & regionSparse)
502 {return updateColumn(regionSparse);}
503 virtual void updateColumnFTPart2 ( CoinIndexedVector & /*regionSparse*/)
504 {}
505 virtual void updateColumnFT ( CoinIndexedVector & regionSparseFT,CoinIndexedVector & /*partialUpdate*/,int /*which*/)
506 { updateColumnFT(regionSparseFT);}
509 virtual int updateColumn ( CoinIndexedVector & regionSparse) const;
511 virtual int updateTwoColumnsFT(CoinIndexedVector & regionFT,
512 CoinIndexedVector & regionOther);
515 virtual int updateColumnTranspose ( CoinIndexedVector & regionSparse) const;
517 virtual void updateFullColumn ( CoinIndexedVector & regionSparse) const
518 {updateColumn(regionSparse);}
521 virtual void updateFullColumnTranspose ( CoinIndexedVector & regionSparse) const
522 {updateColumnTranspose(regionSparse);}
524 virtual void updateWeights ( CoinIndexedVector & regionSparse) const;
526
527
532 inline void clearArrays()
533 { gutsOfDestructor();}
535 virtual inline int * indices() const
536 { return reinterpret_cast<int *> (elements_+numberRows_*numberRows_);}
538 virtual inline int * permute() const
539 { return NULL;/*pivotRow_*/;}
541
548
550protected:
553 int checkPivot(double saveFromU, double oldPivot) const;
555protected:
557 CoinBigIndex maximumSpace_;
560
564};
565#endif
double CoinSimplexDouble
int CoinSimplexInt
Abstract base class which also has some scalars so can be used from Dense or Simp.
virtual CoinAbcAnyFactorization * clone() const =0
Clone.
void setStatus(int value)
Sets status.
virtual int * intWorkArea() const
Returns int work area.
virtual int numberElements() const =0
Total number of elements in factorization.
virtual int updateTwoColumnsFT(CoinIndexedVector &regionFT, CoinIndexedVector &regionOther)=0
does FTRAN on two unpacked columns
virtual ~CoinAbcAnyFactorization()
Destructor.
int maximumPivots_
Maximum number of pivots before factorization.
virtual void updateFullColumnTranspose(CoinIndexedVector &regionSparse) const =0
Updates one column (BTRAN) from unpacked regionSparse.
virtual void setUsefulInformation(const int *info, int whereFrom)
Useful information for factorization 0 - iteration number whereFrom is 0 for factorize and 1 for repl...
int solveMode() const
Get solve mode e.g.
virtual void preProcess()=0
PreProcesses column ordered copy of basis.
int numberGoodColumns() const
Number of good columns in factorization.
CoinBigIndex factorElements_
Number of elements after factorization.
double zeroTolerance() const
Zero tolerance.
double pivotTolerance() const
Pivot tolerance.
void pivotTolerance(double value)
int pivots() const
Returns number of pivots since factorization.
double zeroTolerance_
Zero tolerance.
void setNumberSlacks(int value)
Sets number of slacks.
void zeroTolerance(double value)
virtual double checkReplacePart1b(CoinIndexedVector *, int)
virtual CoinFactorizationDouble * workArea() const
Returns work area.
int maximumPivots() const
Maximum number of pivots between factorizations.
virtual int * permute() const =0
Returns permute in.
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,...
virtual void updateWeights(CoinIndexedVector &regionSparse) const =0
Updates one column for dual steepest edge weights (FTRAN)
void setNumberRows(int value)
Set number of Rows after factorization.
virtual CoinFactorizationDouble * pivotRegion() const
virtual CoinFactorizationDouble * elements() const
Returns array to put basis elements in.
virtual void clearArrays()
Get rid of all memory.
void setPivots(int value)
Sets number of pivots since factorization.
virtual int * numberInRow() const
Number of entries in each row.
int status_
Status of factorization.
CoinFactorizationDouble * elements_
Elements of factorization and updates length is maxR*maxR+maxSpace will always be long enough so can ...
void setSolveMode(int value)
Set solve mode e.g.
virtual void replaceColumnPart3(const AbcSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, int pivotRow, double alpha)=0
Replaces one Column to basis, partial update already in U.
void minimumPivotTolerance(double value)
virtual void updateColumnFTPart2(CoinIndexedVector &regionSparse)=0
virtual double checkReplacePart1(CoinIndexedVector *, CoinIndexedVector *, int)
virtual int updateColumnFTPart1(CoinIndexedVector &regionSparse)=0
void relaxAccuracyCheck(double value)
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
virtual int factor(AbcSimplex *model)=0
Does most of factorization returning status 0 - OK -99 - needs more memory -1 - singular - use number...
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 makeNonSingular(int *sequence)=0
Makes a non-singular basis by replacing variables.
CoinAbcAnyFactorization(const CoinAbcAnyFactorization &other)
Copy constructor.
virtual bool wantsTableauColumn() const
Returns true if wants tableauColumn in replaceColumn.
CoinAbcAnyFactorization()
Default constructor.
int numberSlacks() const
Returns number of slacks.
double minimumPivotTolerance_
Minimum pivot tolerance.
int numberDense_
Number of dense rows in factorization.
virtual void updateColumnFT(CoinIndexedVector &regionSparseFT, CoinIndexedVector &partialUpdate, int which)=0
virtual void postProcess(const int *sequence, int *pivotVariable)=0
Does post processing on valid factorization - putting variables on correct rows.
virtual int updateColumnFT(CoinIndexedVector &regionSparse)=0
Updates one column (FTRAN) from unpacked regionSparse Tries to do FT update number returned is negati...
virtual int * pivotColumn() const
Returns pivotColumn or permute.
virtual void maximumPivots(int value)
Set maximum pivots.
virtual void checkReplacePart1a(CoinIndexedVector *, int)
int maximumRows_
Maximum rows ever (i.e. use to copy arrays etc)
CoinAbcAnyFactorization & operator=(const CoinAbcAnyFactorization &other)
= copy
double areaFactor() const
Area factor.
virtual int updateColumnTranspose(CoinIndexedVector &regionSparse) const =0
Updates one column (BTRAN) from unpacked regionSparse.
int numberRows() const
Number of Rows after factorization.
int numberPivots_
Number pivots since last factorization.
int status() const
Returns status.
virtual int * indices() const =0
Returns array to put basis indices in.
virtual CoinBigIndex * starts() const
Returns array to put basis starts in.
virtual void updateFullColumn(CoinIndexedVector &regionSparse) const =0
This version does FTRAN on array when indices not set up.
virtual void updateColumnTransposeCpu(CoinIndexedVector &regionSparse, int whichCpu) 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...
CoinSimplexInt numberDense() const
Number of dense rows after factorization.
double minimumPivotTolerance() const
Minimum pivot tolerance.
int numberGoodU_
Number factorized in U (not row singletons)
virtual void goSparse()
Sees whether to go sparse.
virtual int * permuteBack() const
Returns permute back.
double relaxCheck_
Relax check on accuracy in replaceColumn.
virtual void updateColumnCpu(CoinIndexedVector &regionSparse, int whichCpu) const
Updates one column (FTRAN)
virtual int * numberInColumn() const
Number of entries in each column.
virtual int * pivotRow() const
Returns pivot row.
int numberRows_
Number of Rows in factorization.
double pivotTolerance_
Pivot tolerance.
void areaFactor(CoinSimplexDouble value)
virtual void replaceColumnPart3(const AbcSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, CoinIndexedVector *partialUpdate, int pivotRow, double alpha)=0
Replaces one Column to basis, partial update in vector.
CoinFactorizationDouble * workArea_
Work area of numberRows_.
virtual void getAreas(int numberRows, int numberColumns, CoinBigIndex maximumL, CoinBigIndex maximumU)=0
Gets space for a factorization.
This deals with Factorization and Updates This is a simple dense version so other people can write a ...
CoinAbcDenseFactorization & operator=(const CoinAbcDenseFactorization &other)
= copy
void gutsOfCopy(const CoinAbcDenseFactorization &other)
The real work of copy.
virtual void updateFullColumnTranspose(CoinIndexedVector &regionSparse) const
Updates one column (BTRAN) from unpacked regionSparse.
int checkPivot(double saveFromU, double oldPivot) const
Returns accuracy status of replaceColumn returns 0=OK, 1=Probably OK, 2=singular.
virtual int updateTwoColumnsFT(CoinIndexedVector &regionFT, CoinIndexedVector &regionOther)
does FTRAN on two unpacked columns
virtual void updateWeights(CoinIndexedVector &regionSparse) const
Updates one column for dual steepest edge weights (FTRAN)
virtual CoinAbcAnyFactorization * clone() const
Clone.
CoinBigIndex maximumSpace_
Maximum length of iterating area.
virtual void postProcess(const int *sequence, int *pivotVariable)
Does post processing on valid factorization - putting variables on correct rows.
virtual int * permute() const
Returns permute in.
virtual int replaceColumn(CoinIndexedVector *regionSparse, int pivotRow, double pivotCheck, bool skipBtranU=false, double acceptablePivot=1.0e-8)
Replaces one Column to basis, returns 0=OK, 1=Probably OK, 2=singular, 3=no room If skipBtranU is fal...
void clearArrays()
Get rid of all memory.
virtual void updateFullColumn(CoinIndexedVector &regionSparse) const
This version does FTRAN on array when indices not set up.
virtual void updateColumnFT(CoinIndexedVector &regionSparseFT, CoinIndexedVector &, int)
virtual int * indices() const
Returns array to put basis indices in.
void gutsOfInitialize()
The real work of constructor.
virtual void makeNonSingular(int *sequence)
Makes a non-singular basis by replacing variables.
CoinAbcDenseFactorization()
Default constructor.
double maximumCoefficient() const
Returns maximum absolute value in factorization.
virtual int checkReplacePart2(int pivotRow, double btranAlpha, double ftranAlpha, double ftAlpha, double acceptablePivot=1.0e-8)
Checks if can replace one Column to basis, returns 0=OK, 1=Probably OK, 2=singular,...
friend void CoinAbcDenseFactorizationUnitTest(const std::string &mpsDir)
virtual void getAreas(int numberRows, int numberColumns, CoinBigIndex maximumL, CoinBigIndex maximumU)
Gets space for a factorization.
virtual int updateColumnFT(CoinIndexedVector &regionSparse)
Updates one column (FTRAN) from unpacked regionSparse Tries to do FT update number returned is negati...
virtual int factor(AbcSimplex *model)
Does most of factorization returning status 0 - OK -99 - needs more memory -1 - singular - use number...
virtual void preProcess()
PreProcesses column ordered copy of basis.
virtual int updateColumn(CoinIndexedVector &regionSparse) const
This version has same effect as above with FTUpdate==false so number returned is always >=0.
CoinAbcDenseFactorization(const CoinAbcDenseFactorization &other)
Copy constructor.
virtual int updateColumnFTPart1(CoinIndexedVector &regionSparse)
virtual ~CoinAbcDenseFactorization()
Destructor.
virtual int numberElements() const
Total number of elements in factorization.
virtual int updateColumnTranspose(CoinIndexedVector &regionSparse) const
Updates one column (BTRAN) from unpacked regionSparse.
virtual void replaceColumnPart3(const AbcSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, CoinIndexedVector *, int pivotRow, double alpha)
Replaces one Column to basis, partial update in vector.
virtual void updateColumnFTPart2(CoinIndexedVector &)
virtual void replaceColumnPart3(const AbcSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, int pivotRow, double alpha)
Replaces one Column to basis, partial update already in U.
CoinSimplexInt maximumRowsAdjusted_
Use for array size to get multiple of 8.
void gutsOfDestructor()
The real work of desstructor.