00001
00002
00003
00004
00005
00006 #ifndef ClpCholeskyBase_H
00007 #define ClpCholeskyBase_H
00008
00009 #include "CoinPragma.hpp"
00010 #include "CoinTypes.hpp"
00011
00012 #ifndef CLP_LONG_CHOLESKY
00013 #define CLP_LONG_CHOLESKY 0
00014 #endif
00015
00016
00017
00018
00019
00020 #if COIN_LONG_WORK==0
00021 #if CLP_LONG_CHOLESKY>0
00022 #define CHOLESKY_BAD_COMBINATION
00023 #endif
00024 #else
00025 #if CLP_LONG_CHOLESKY==0
00026 #define CHOLESKY_BAD_COMBINATION
00027 #endif
00028 #endif
00029 #ifdef CHOLESKY_BAD_COMBINATION
00030 # warning("Bad combination of CLP_LONG_CHOLESKY and COIN_BIG_DOUBLE/COIN_LONG_WORK");
00031 "Bad combination of CLP_LONG_CHOLESKY and COIN_LONG_WORK"
00032 #endif
00033 #if CLP_LONG_CHOLESKY>1
00034 typedef long double longDouble;
00035 #define CHOL_SMALL_VALUE 1.0e-15
00036 #elif CLP_LONG_CHOLESKY==1
00037 typedef double longDouble;
00038 #define CHOL_SMALL_VALUE 1.0e-11
00039 #else
00040 typedef double longDouble;
00041 #define CHOL_SMALL_VALUE 1.0e-11
00042 #endif
00043 class ClpInterior;
00044 class ClpCholeskyDense;
00045 class ClpMatrixBase;
00046
00053 class ClpCholeskyBase {
00054
00055 public:
00064 virtual int order(ClpInterior * model);
00069 virtual int symbolic();
00072 virtual int factorize(const CoinWorkDouble * diagonal, int * rowsDropped) ;
00074 virtual void solve (CoinWorkDouble * region) ;
00077 virtual void solveKKT (CoinWorkDouble * region1, CoinWorkDouble * region2, const CoinWorkDouble * diagonal,
00078 CoinWorkDouble diagonalScaleFactor);
00079 private:
00081 int orderAMD();
00082 public:
00084
00087
00088 inline int status() const {
00089 return status_;
00090 }
00092 inline int numberRowsDropped() const {
00093 return numberRowsDropped_;
00094 }
00096 void resetRowsDropped();
00098 inline char * rowsDropped() const {
00099 return rowsDropped_;
00100 }
00102 inline double choleskyCondition() const {
00103 return choleskyCondition_;
00104 }
00106 inline double goDense() const {
00107 return goDense_;
00108 }
00110 inline void setGoDense(double value) {
00111 goDense_ = value;
00112 }
00114 inline int rank() const {
00115 return numberRows_ - numberRowsDropped_;
00116 }
00118 inline int numberRows() const {
00119 return numberRows_;
00120 }
00122 inline CoinBigIndex size() const {
00123 return sizeFactor_;
00124 }
00126 inline longDouble * sparseFactor() const {
00127 return sparseFactor_;
00128 }
00130 inline longDouble * diagonal() const {
00131 return diagonal_;
00132 }
00134 inline longDouble * workDouble() const {
00135 return workDouble_;
00136 }
00138 inline bool kkt() const {
00139 return doKKT_;
00140 }
00142 inline void setKKT(bool yesNo) {
00143 doKKT_ = yesNo;
00144 }
00146 inline void setIntegerParameter(int i, int value) {
00147 integerParameters_[i] = value;
00148 }
00150 inline int getIntegerParameter(int i) {
00151 return integerParameters_[i];
00152 }
00154 inline void setDoubleParameter(int i, double value) {
00155 doubleParameters_[i] = value;
00156 }
00158 inline double getDoubleParameter(int i) {
00159 return doubleParameters_[i];
00160 }
00162
00163
00164 public:
00165
00171 ClpCholeskyBase(int denseThreshold = -1);
00173 virtual ~ClpCholeskyBase();
00175 ClpCholeskyBase(const ClpCholeskyBase&);
00177 ClpCholeskyBase& operator=(const ClpCholeskyBase&);
00179
00180
00181
00182 virtual ClpCholeskyBase * clone() const;
00183
00185 inline int type() const {
00186 if (doKKT_) return 100;
00187 else return type_;
00188 }
00189 protected:
00191 inline void setType(int type) {
00192 type_ = type;
00193 }
00195 inline void setModel(ClpInterior * model) {
00196 model_ = model;
00197 }
00199
00206 int symbolic1(const CoinBigIndex * Astart, const int * Arow);
00210 void symbolic2(const CoinBigIndex * Astart, const int * Arow);
00214 void factorizePart2(int * rowsDropped) ;
00218 void solve(CoinWorkDouble * region, int type);
00220 int preOrder(bool lowerTriangular, bool includeDiagonal, bool doKKT);
00222 void updateDense(longDouble * d, int * first);
00224
00225 protected:
00229
00230 int type_;
00232 bool doKKT_;
00234 double goDense_;
00236 double choleskyCondition_;
00238 ClpInterior * model_;
00240 int numberTrials_;
00242 int numberRows_;
00244 int status_;
00246 char * rowsDropped_;
00248 int * permuteInverse_;
00250 int * permute_;
00252 int numberRowsDropped_;
00254 longDouble * sparseFactor_;
00256 CoinBigIndex * choleskyStart_;
00258 int * choleskyRow_;
00260 CoinBigIndex * indexStart_;
00262 longDouble * diagonal_;
00264 longDouble * workDouble_;
00266 int * link_;
00267
00268 CoinBigIndex * workInteger_;
00269
00270 int * clique_;
00272 CoinBigIndex sizeFactor_;
00274 CoinBigIndex sizeIndex_;
00276 int firstDense_;
00278 int integerParameters_[64];
00280 double doubleParameters_[64];
00282 ClpMatrixBase * rowCopy_;
00284 char * whichDense_;
00286 longDouble * denseColumn_;
00288 ClpCholeskyDense * dense_;
00290 int denseThreshold_;
00292 };
00293
00294 #endif