CoinDenseFactorization.hpp
Go to the documentation of this file.
1 /* $Id: CoinDenseFactorization.hpp 1191 2009-07-25 08:38:12Z forrest $ */
2 // Copyright (C) 2008, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 
5 /*
6  Authors
7 
8  John Forrest
9 
10  */
11 #ifndef CoinDenseFactorization_H
12 #define CoinDenseFactorization_H
13 
14 #include <iostream>
15 #include <string>
16 #include <cassert>
17 #include "CoinFinite.hpp"
18 #include "CoinIndexedVector.hpp"
19 #include "CoinFactorization.hpp"
20 class CoinPackedMatrix;
23 
24 public:
25 
32 
34  virtual ~CoinOtherFactorization ( );
37 
39  virtual CoinOtherFactorization * clone() const = 0;
41 
44  inline int status ( ) const {
46  return status_;
47  }
49  inline void setStatus ( int value)
50  { status_=value; }
52  inline int pivots ( ) const {
53  return numberPivots_;
54  }
56  inline void setPivots ( int value )
57  { numberPivots_=value; }
59  inline void setNumberRows(int value)
60  { numberRows_ = value; }
62  inline int numberRows ( ) const {
63  return numberRows_;
64  }
66  inline int numberColumns ( ) const {
67  return numberColumns_;
68  }
70  inline int numberGoodColumns ( ) const {
71  return numberGoodU_;
72  }
74  inline void relaxAccuracyCheck(double value)
75  { relaxCheck_ = value;}
76  inline double getAccuracyCheck() const
77  { return relaxCheck_;}
79  inline int maximumPivots ( ) const {
80  return maximumPivots_ ;
81  }
83  virtual void maximumPivots ( int value );
84 
86  inline double pivotTolerance ( ) const {
87  return pivotTolerance_ ;
88  }
89  void pivotTolerance ( double value );
91  inline double zeroTolerance ( ) const {
92  return zeroTolerance_ ;
93  }
94  void zeroTolerance ( double value );
95 #ifndef COIN_FAST_CODE
96  inline double slackValue ( ) const {
98  return slackValue_ ;
99  }
100  void slackValue ( double value );
101 #endif
102  virtual CoinFactorizationDouble * elements() const;
105  virtual int * pivotRow() const;
107  virtual CoinFactorizationDouble * workArea() const;
109  virtual int * intWorkArea() const;
111  virtual int * numberInRow() const;
113  virtual int * numberInColumn() const;
115  virtual CoinBigIndex * starts() const;
117  virtual int * permuteBack() const;
122  inline int solveMode() const
123  { return solveMode_ ;}
128  inline void setSolveMode(int value)
129  { solveMode_ = value;}
131  virtual bool wantsTableauColumn() const;
136  virtual void setUsefulInformation(const int * info,int whereFrom);
138  virtual void clearArrays() {}
140 
142  virtual int * indices() const = 0;
145  virtual int * permute() const = 0;
147  virtual int numberElements ( ) const = 0;
149 
151  virtual void getAreas ( int numberRows,
153  int numberColumns,
154  CoinBigIndex maximumL,
155  CoinBigIndex maximumU ) = 0;
156 
158  virtual void preProcess ( ) = 0;
164  virtual int factor ( ) = 0;
166  virtual void postProcess(const int * sequence, int * pivotVariable) = 0;
168  virtual void makeNonSingular(int * sequence, int numberColumns) = 0;
170 
173 
181  virtual int replaceColumn ( CoinIndexedVector * regionSparse,
182  int pivotRow,
183  double pivotCheck ,
184  bool checkBeforeModifying=false,
185  double acceptablePivot=1.0e-8)=0;
187 
197  virtual int updateColumnFT ( CoinIndexedVector * regionSparse,
198  CoinIndexedVector * regionSparse2,
199  bool noPermute=false) = 0;
202  virtual int updateColumn ( CoinIndexedVector * regionSparse,
203  CoinIndexedVector * regionSparse2,
204  bool noPermute=false) const = 0;
206  virtual int updateTwoColumnsFT(CoinIndexedVector * regionSparse1,
207  CoinIndexedVector * regionSparse2,
208  CoinIndexedVector * regionSparse3,
209  bool noPermute=false) = 0;
214  virtual int updateColumnTranspose ( CoinIndexedVector * regionSparse,
215  CoinIndexedVector * regionSparse2) const = 0;
217 
219 protected:
220 
223  double pivotTolerance_;
227 #ifndef COIN_FAST_CODE
228  double slackValue_;
230 #else
231 #ifndef slackValue_
232 #define slackValue_ -1.0
233 #endif
234 #endif
235  double relaxCheck_;
250  int status_;
256  int * pivotRow_;
270 };
281  friend void CoinDenseFactorizationUnitTest( const std::string & mpsDir );
282 
283 public:
284 
291 
293  virtual ~CoinDenseFactorization ( );
297  virtual CoinOtherFactorization * clone() const ;
299 
302  virtual void getAreas ( int numberRows,
304  int numberColumns,
305  CoinBigIndex maximumL,
306  CoinBigIndex maximumU );
307 
309  virtual void preProcess ( );
315  virtual int factor ( );
317  virtual void postProcess(const int * sequence, int * pivotVariable);
319  virtual void makeNonSingular(int * sequence, int numberColumns);
321 
324  virtual inline int numberElements ( ) const {
327  }
329  double maximumCoefficient() const;
331 
334 
342  virtual int replaceColumn ( CoinIndexedVector * regionSparse,
343  int pivotRow,
344  double pivotCheck ,
345  bool checkBeforeModifying=false,
346  double acceptablePivot=1.0e-8);
348 
358  virtual inline int updateColumnFT ( CoinIndexedVector * regionSparse,
359  CoinIndexedVector * regionSparse2,
360  bool = false)
361  { return updateColumn(regionSparse,regionSparse2);}
364  virtual int updateColumn ( CoinIndexedVector * regionSparse,
365  CoinIndexedVector * regionSparse2,
366  bool noPermute=false) const;
368  virtual int updateTwoColumnsFT(CoinIndexedVector * regionSparse1,
369  CoinIndexedVector * regionSparse2,
370  CoinIndexedVector * regionSparse3,
371  bool noPermute=false);
376  virtual int updateColumnTranspose ( CoinIndexedVector * regionSparse,
377  CoinIndexedVector * regionSparse2) const;
379 
384  inline void clearArrays()
386  { gutsOfDestructor();}
388  virtual inline int * indices() const
389  { return reinterpret_cast<int *> (elements_+numberRows_*numberRows_);}
391  virtual inline int * permute() const
392  { return NULL;/*pivotRow_*/;}
394 
396  void gutsOfDestructor();
398  void gutsOfInitialize();
400  void gutsOfCopy(const CoinDenseFactorization &other);
401 
403 protected:
406  int checkPivot(double saveFromU, double oldPivot) const;
408 protected:
409 
412 
413 };
414 #endif
int CoinBigIndex
virtual int updateColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const =0
Updates one column (BTRAN) from regionSparse2 regionSparse starts as zero and is zero at end Note - i...
virtual int * permute() const =0
Returns permute in.
virtual CoinOtherFactorization * clone() const
Clone.
int pivots() const
Returns number of pivots since factorization.
void setSolveMode(int value)
Set solve mode e.g.
virtual int * permute() const
Returns permute in.
int numberGoodU_
Number factorized in U (not row singletons)
int numberColumns_
Number of Columns in factorization.
int maximumPivots_
Maximum number of pivots before factorization.
void setNumberRows(int value)
Set number of Rows after factorization.
CoinOtherFactorization & operator=(const CoinOtherFactorization &other)
= copy
virtual void makeNonSingular(int *sequence, int numberColumns)=0
Makes a non-singular basis by replacing variables.
virtual void getAreas(int numberRows, int numberColumns, CoinBigIndex maximumL, CoinBigIndex maximumU)=0
Gets space for a factorization.
virtual int updateColumn(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const =0
This version has same effect as above with FTUpdate==false so number returned is always >=0...
virtual int updateColumnFT(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool=false)
Updates one column (FTRAN) from regionSparse2 Tries to do FT update number returned is negative if no...
CoinDenseFactorization()
Default constructor.
virtual int * indices() const =0
Returns array to put basis indices in.
int numberColumns() const
Total number of columns in factorization.
void setStatus(int value)
Sets status.
virtual int updateColumn(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false) const
This version has same effect as above with FTUpdate==false so number returned is always >=0...
CoinDenseFactorization & operator=(const CoinDenseFactorization &other)
= copy
double CoinFactorizationDouble
Definition: CoinFinite.hpp:86
Abstract base class which also has some scalars so can be used from Dense or Simp.
virtual int factor()
Does most of factorization returning status 0 - OK -99 - needs more memory -1 - singular - use number...
void gutsOfInitialize()
The real work of constructor.
int maximumRows_
Maximum rows ever (i.e. use to copy arrays etc)
virtual CoinFactorizationDouble * elements() const
Returns array to put basis elements in.
virtual int * intWorkArea() const
Returns int work area.
double maximumCoefficient() const
Returns maximum absolute value in factorization.
CoinFactorizationDouble * workArea_
Work area of numberRows_.
Sparse Matrix Base Class.
virtual void postProcess(const int *sequence, int *pivotVariable)
Does post processing on valid factorization - putting variables on correct rows.
double slackValue_
Whether slack value is +1 or -1.
virtual void preProcess()=0
PreProcesses column ordered copy of basis.
virtual void getAreas(int numberRows, int numberColumns, CoinBigIndex maximumL, CoinBigIndex maximumU)
Gets space for a factorization.
friend void CoinDenseFactorizationUnitTest(const std::string &mpsDir)
virtual void setUsefulInformation(const int *info, int whereFrom)
Useful information for factorization 0 - iteration number whereFrom is 0 for factorize and 1 for repl...
virtual int * indices() const
Returns array to put basis indices in.
double zeroTolerance() const
Zero tolerance.
virtual void postProcess(const int *sequence, int *pivotVariable)=0
Does post processing on valid factorization - putting variables on correct rows.
virtual void preProcess()
PreProcesses column ordered copy of basis.
double pivotTolerance() const
Pivot tolerance.
virtual void makeNonSingular(int *sequence, int numberColumns)
Makes a non-singular basis by replacing variables.
CoinBigIndex factorElements_
Number of elements after factorization.
virtual int * numberInColumn() const
Number of entries in each column.
double relaxCheck_
Relax check on accuracy in replaceColumn.
int solveMode() const
Get solve mode e.g.
CoinFactorizationDouble * elements_
Elements of factorization and updates length is maxR*maxR+maxSpace will always be long enough so can ...
virtual int updateColumnTranspose(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2) const
Updates one column (BTRAN) from regionSparse2 regionSparse starts as zero and is zero at end Note - i...
Indexed Vector.
virtual ~CoinDenseFactorization()
Destructor.
CoinBigIndex maximumSpace_
Maximum length of iterating area.
CoinOtherFactorization()
Default constructor.
virtual bool wantsTableauColumn() const
Returns true if wants tableauColumn in replaceColumn.
int maximumPivots() const
Maximum number of pivots between factorizations.
virtual ~CoinOtherFactorization()
Destructor.
virtual int * permuteBack() const
Returns permute back.
virtual CoinFactorizationDouble * workArea() const
Returns work area.
double slackValue() const
Whether slack value is +1 or -1.
int checkPivot(double saveFromU, double oldPivot) const
Returns accuracy status of replaceColumn returns 0=OK, 1=Probably OK, 2=singular. ...
void clearArrays()
Get rid of all memory.
int numberRows() const
Number of Rows after factorization.
virtual int updateTwoColumnsFT(CoinIndexedVector *regionSparse1, CoinIndexedVector *regionSparse2, CoinIndexedVector *regionSparse3, bool noPermute=false)=0
does FTRAN on two columns
virtual int factor()=0
Does most of factorization returning status 0 - OK -99 - needs more memory -1 - singular - use number...
double getAccuracyCheck() const
Returns status.
void gutsOfCopy(const CoinDenseFactorization &other)
The real work of copy.
int status_
Status of factorization.
void gutsOfDestructor()
The real work of desstructor.
int status() const
Returns status.
virtual int * pivotRow() const
Returns pivot row.
virtual int replaceColumn(CoinIndexedVector *regionSparse, 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...
virtual int replaceColumn(CoinIndexedVector *regionSparse, int pivotRow, double pivotCheck, bool checkBeforeModifying=false, double acceptablePivot=1.0e-8)=0
Replaces one Column to basis, returns 0=OK, 1=Probably OK, 2=singular, 3=no room If checkBeforeModify...
int numberPivots_
Number pivots since last factorization.
int numberGoodColumns() const
Number of good columns in factorization.
virtual int numberElements() const
Total number of elements in factorization.
void relaxAccuracyCheck(double value)
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
virtual int updateTwoColumnsFT(CoinIndexedVector *regionSparse1, CoinIndexedVector *regionSparse2, CoinIndexedVector *regionSparse3, bool noPermute=false)
does FTRAN on two columns
int numberRows_
Number of Rows in factorization.
virtual void clearArrays()
Get rid of all memory.
This deals with Factorization and Updates This is a simple dense version so other people can write a ...
void setPivots(int value)
Sets number of pivots since factorization.
double pivotTolerance_
Pivot tolerance.
virtual int updateColumnFT(CoinIndexedVector *regionSparse, CoinIndexedVector *regionSparse2, bool noPermute=false)=0
Updates one column (FTRAN) from regionSparse2 Tries to do FT update number returned is negative if no...
double zeroTolerance_
Zero tolerance.
virtual int * numberInRow() const
Number of entries in each row.
virtual int numberElements() const =0
Total number of elements in factorization.
virtual CoinOtherFactorization * clone() const =0
Clone.
virtual CoinBigIndex * starts() const
Returns array to put basis starts in.