00001
00002
00003
00004 #ifndef ClpCholeskyDense_H
00005 #define ClpCholeskyDense_H
00006
00007 #include "ClpCholeskyBase.hpp"
00008 class ClpMatrixBase;
00009
00010 class ClpCholeskyDense : public ClpCholeskyBase {
00011
00012 public:
00017 virtual int order(ClpInterior * model) ;
00022 virtual int symbolic();
00025 virtual int factorize(const CoinWorkDouble * diagonal, int * rowsDropped) ;
00027 virtual void solve (CoinWorkDouble * region) ;
00035 int reserveSpace(const ClpCholeskyBase * factor, int numberRows) ;
00037 CoinBigIndex space( int numberRows) const;
00039 void factorizePart2(int * rowsDropped) ;
00041 void factorizePart3(int * rowsDropped) ;
00043 void solveF1(longDouble * a, int n, CoinWorkDouble * region);
00044 void solveF2(longDouble * a, int n, CoinWorkDouble * region, CoinWorkDouble * region2);
00046 void solveB1(longDouble * a, int n, CoinWorkDouble * region);
00047 void solveB2(longDouble * a, int n, CoinWorkDouble * region, CoinWorkDouble * region2);
00048 int bNumber(const longDouble * array, int &, int&);
00050 inline longDouble * aMatrix() const {
00051 return sparseFactor_;
00052 }
00054 inline longDouble * diagonal() const {
00055 return diagonal_;
00056 }
00063 ClpCholeskyDense();
00065 virtual ~ClpCholeskyDense();
00067 ClpCholeskyDense(const ClpCholeskyDense&);
00069 ClpCholeskyDense& operator=(const ClpCholeskyDense&);
00071 virtual ClpCholeskyBase * clone() const ;
00075 private:
00079 bool borrowSpace_;
00081 };
00082
00083
00084 typedef struct {
00085 longDouble * diagonal_;
00086 longDouble * a;
00087 longDouble * work;
00088 int * rowsDropped;
00089 double doubleParameters_[1];
00090 int integerParameters_[2];
00091 int n;
00092 int numberBlocks;
00093 } ClpCholeskyDenseC;
00094
00095 extern "C" {
00096 void ClpCholeskySpawn(void *);
00097 }
00099 void
00100 ClpCholeskyCfactor(ClpCholeskyDenseC * thisStruct,
00101 longDouble * a, int n, int numberBlocks,
00102 longDouble * diagonal, longDouble * work, int * rowsDropped);
00103
00105 void
00106 ClpCholeskyCtriRec(ClpCholeskyDenseC * thisStruct,
00107 longDouble * aTri, int nThis,
00108 longDouble * aUnder, longDouble * diagonal,
00109 longDouble * work,
00110 int nLeft, int iBlock, int jBlock,
00111 int numberBlocks);
00113 void
00114 ClpCholeskyCrecTri(ClpCholeskyDenseC * thisStruct,
00115 longDouble * aUnder, int nTri, int nDo,
00116 int iBlock, int jBlock, longDouble * aTri,
00117 longDouble * diagonal, longDouble * work,
00118 int numberBlocks);
00123 void
00124 ClpCholeskyCrecRec(ClpCholeskyDenseC * thisStruct,
00125 longDouble * above, int nUnder, int nUnderK,
00126 int nDo, longDouble * aUnder, longDouble *aOther,
00127 longDouble * work,
00128 int iBlock, int jBlock,
00129 int numberBlocks);
00131 void
00132 ClpCholeskyCfactorLeaf(ClpCholeskyDenseC * thisStruct,
00133 longDouble * a, int n,
00134 longDouble * diagonal, longDouble * work,
00135 int * rowsDropped);
00137 void
00138 ClpCholeskyCtriRecLeaf(
00139 longDouble * aTri, longDouble * aUnder,
00140 longDouble * diagonal, longDouble * work,
00141 int nUnder);
00143 void
00144 ClpCholeskyCrecTriLeaf(
00145 longDouble * aUnder, longDouble * aTri,
00146 longDouble * work, int nUnder);
00151 void
00152 ClpCholeskyCrecRecLeaf(
00153 const longDouble * COIN_RESTRICT above,
00154 const longDouble * COIN_RESTRICT aUnder,
00155 longDouble * COIN_RESTRICT aOther,
00156 const longDouble * COIN_RESTRICT work,
00157 int nUnder);
00158 #endif