CoinOslFactorization.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef CoinOslFactorization_H
00013 #define CoinOslFactorization_H
00014 #include <iostream>
00015 #include <string>
00016 #include <cassert>
00017 #include "CoinTypes.hpp"
00018 #include "CoinIndexedVector.hpp"
00019 #include "CoinDenseFactorization.hpp"
00020 class CoinPackedMatrix;
00028 typedef struct {int suc, pre;} EKKHlink;
00029 typedef struct _EKKfactinfo {
00030 double drtpiv;
00031 double demark;
00032 double zpivlu;
00033 double zeroTolerance;
00034 double areaFactor;
00035 int *xrsadr;
00036 int *xcsadr;
00037 int *xrnadr;
00038 int *xcnadr;
00039 int *krpadr;
00040 int *kcpadr;
00041 int *mpermu;
00042 int *bitArray;
00043 int * back;
00044 char * nonzero;
00045 double * trueStart;
00046 mutable double *kadrpm;
00047 int *R_etas_index;
00048 int *R_etas_start;
00049 double *R_etas_element;
00050
00051 int *xecadr;
00052 int *xeradr;
00053 double *xeeadr;
00054 double *xe2adr;
00055 EKKHlink * kp1adr;
00056 EKKHlink * kp2adr;
00057 double * kw1adr;
00058 double * kw2adr;
00059 double * kw3adr;
00060 int * hpivcoR;
00061 int nrow;
00062 int nrowmx;
00063 int firstDoRow;
00064 int firstLRow;
00065 int maxinv;
00066 int nnetas;
00067 int iterin;
00068 int iter0;
00069 int invok;
00070 int nbfinv;
00071 int num_resets;
00072 int nnentl;
00073 int nnentu;
00074 #ifdef CLP_REUSE_ETAS
00075 int save_nnentu;
00076 #endif
00077 int ndenuc;
00078 int npivots;
00079 int kmxeta;
00080 int xnetal;
00081 int first_dense;
00082 int last_dense;
00083 int iterno;
00084 int numberSlacks;
00085 int lastSlack;
00086 int firstNonSlack;
00087 int xnetalval;
00088 int lstart;
00089 int if_sparse_update;
00090 mutable int packedMode;
00091 int switch_off_sparse_update;
00092 int nuspike;
00093 bool rows_ok;
00094 #ifdef CLP_REUSE_ETAS
00095 mutable int reintro;
00096 #endif
00097 int nR_etas;
00098 int sortedEta;
00099 int lastEtaCount;
00100 int ifvsol;
00101 int eta_size;
00102 int last_eta_size;
00103 int maxNNetas;
00104 } EKKfactinfo;
00105
00106 class CoinOslFactorization : public CoinOtherFactorization {
00107 friend void CoinOslFactorizationUnitTest( const std::string & mpsDir );
00108
00109 public:
00110
00113
00114 CoinOslFactorization ( );
00116 CoinOslFactorization ( const CoinOslFactorization &other);
00117
00119 virtual ~CoinOslFactorization ( );
00121 CoinOslFactorization & operator = ( const CoinOslFactorization & other );
00123 virtual CoinOtherFactorization * clone() const ;
00125
00128
00129 virtual void getAreas ( int numberRows,
00130 int numberColumns,
00131 CoinBigIndex maximumL,
00132 CoinBigIndex maximumU );
00133
00135 virtual void preProcess ( );
00141 virtual int factor ( );
00143 virtual void postProcess(const int * sequence, int * pivotVariable);
00145 virtual void makeNonSingular(int * sequence, int numberColumns);
00153 int factorize ( const CoinPackedMatrix & matrix,
00154 int rowIsBasic[], int columnIsBasic[] ,
00155 double areaFactor = 0.0 );
00157
00160
00161 virtual inline int numberElements ( ) const {
00162 return numberRows_*(numberColumns_+numberPivots_);
00163 }
00165 virtual CoinFactorizationDouble * elements() const;
00167 virtual int * pivotRow() const;
00169 virtual CoinFactorizationDouble * workArea() const;
00171 virtual int * intWorkArea() const;
00173 virtual int * numberInRow() const;
00175 virtual int * numberInColumn() const;
00177 virtual CoinBigIndex * starts() const;
00179 virtual int * permuteBack() const;
00181 virtual bool wantsTableauColumn() const;
00186 virtual void setUsefulInformation(const int * info,int whereFrom);
00188 virtual void maximumPivots ( int value );
00189
00191 double maximumCoefficient() const;
00193 double conditionNumber() const;
00195 virtual void clearArrays();
00197
00200
00208 virtual int replaceColumn ( CoinIndexedVector * regionSparse,
00209 int pivotRow,
00210 double pivotCheck ,
00211 bool checkBeforeModifying=false,
00212 double acceptablePivot=1.0e-8);
00214
00224 virtual int updateColumnFT ( CoinIndexedVector * regionSparse,
00225 CoinIndexedVector * regionSparse2,
00226 bool noPermute=false);
00229 virtual int updateColumn ( CoinIndexedVector * regionSparse,
00230 CoinIndexedVector * regionSparse2,
00231 bool noPermute=false) const;
00233 virtual int updateTwoColumnsFT(CoinIndexedVector * regionSparse1,
00234 CoinIndexedVector * regionSparse2,
00235 CoinIndexedVector * regionSparse3,
00236 bool noPermute=false);
00241 virtual int updateColumnTranspose ( CoinIndexedVector * regionSparse,
00242 CoinIndexedVector * regionSparse2) const;
00244
00245
00249
00250
00251
00253 virtual int * indices() const;
00255 virtual inline int * permute() const
00256 { return NULL;;}
00258
00260 void gutsOfDestructor(bool clearFact=true);
00262 void gutsOfInitialize(bool zapFact=true);
00264 void gutsOfCopy(const CoinOslFactorization &other);
00265
00267 protected:
00270 int checkPivot(double saveFromU, double oldPivot) const;
00272 protected:
00273
00276
00277 EKKfactinfo factInfo_;
00279 };
00280 #endif