| 1 | /* $Id: ClpCholeskyDense.hpp 1665 2011-01-04 17:55:54Z lou $ */ | 
|---|
| 2 | /* | 
|---|
| 3 | Copyright (C) 2003, International Business Machines Corporation | 
|---|
| 4 | and others.  All Rights Reserved. | 
|---|
| 5 |  | 
|---|
| 6 | This code is licensed under the terms of the Eclipse Public License (EPL). | 
|---|
| 7 | */ | 
|---|
| 8 | #ifndef ClpCholeskyDense_H | 
|---|
| 9 | #define ClpCholeskyDense_H | 
|---|
| 10 |  | 
|---|
| 11 | #include "ClpCholeskyBase.hpp" | 
|---|
| 12 | class ClpMatrixBase; | 
|---|
| 13 |  | 
|---|
| 14 | class ClpCholeskyDense : public ClpCholeskyBase { | 
|---|
| 15 |  | 
|---|
| 16 | public: | 
|---|
| 17 | /**@name Virtual methods that the derived classes provides  */ | 
|---|
| 18 | /**@{*/ | 
|---|
| 19 | /** Orders rows and saves pointer to matrix.and model. | 
|---|
| 20 | Returns non-zero if not enough memory */ | 
|---|
| 21 | virtual int order(ClpInterior * model) ; | 
|---|
| 22 | /** Does Symbolic factorization given permutation. | 
|---|
| 23 | This is called immediately after order.  If user provides this then | 
|---|
| 24 | user must provide factorize and solve.  Otherwise the default factorization is used | 
|---|
| 25 | returns non-zero if not enough memory */ | 
|---|
| 26 | virtual int symbolic(); | 
|---|
| 27 | /** Factorize - filling in rowsDropped and returning number dropped. | 
|---|
| 28 | If return code negative then out of memory */ | 
|---|
| 29 | virtual int factorize(const CoinWorkDouble * diagonal, int * rowsDropped) ; | 
|---|
| 30 | /** Uses factorization to solve. */ | 
|---|
| 31 | virtual void solve (CoinWorkDouble * region) ; | 
|---|
| 32 | /**@}*/ | 
|---|
| 33 |  | 
|---|
| 34 | /**@name Non virtual methods for ClpCholeskyDense  */ | 
|---|
| 35 | /**@{*/ | 
|---|
| 36 | /** Reserves space. | 
|---|
| 37 | If factor not NULL then just uses passed space | 
|---|
| 38 | Returns non-zero if not enough memory */ | 
|---|
| 39 | int reserveSpace(const ClpCholeskyBase * factor, int numberRows) ; | 
|---|
| 40 | /** Returns space needed */ | 
|---|
| 41 | CoinBigIndex space( int numberRows) const; | 
|---|
| 42 | /** part 2 of Factorize - filling in rowsDropped */ | 
|---|
| 43 | void factorizePart2(int * rowsDropped) ; | 
|---|
| 44 | /** part 2 of Factorize - filling in rowsDropped - blocked */ | 
|---|
| 45 | void factorizePart3(int * rowsDropped) ; | 
|---|
| 46 | /** Forward part of solve */ | 
|---|
| 47 | void solveF1(longDouble * a, int n, CoinWorkDouble * region); | 
|---|
| 48 | void solveF2(longDouble * a, int n, CoinWorkDouble * region, CoinWorkDouble * region2); | 
|---|
| 49 | /** Backward part of solve */ | 
|---|
| 50 | void solveB1(longDouble * a, int n, CoinWorkDouble * region); | 
|---|
| 51 | void solveB2(longDouble * a, int n, CoinWorkDouble * region, CoinWorkDouble * region2); | 
|---|
| 52 | int bNumber(const longDouble * array, int &, int&); | 
|---|
| 53 | /** A */ | 
|---|
| 54 | inline longDouble * aMatrix() const { | 
|---|
| 55 | return sparseFactor_; | 
|---|
| 56 | } | 
|---|
| 57 | /** Diagonal */ | 
|---|
| 58 | inline longDouble * diagonal() const { | 
|---|
| 59 | return diagonal_; | 
|---|
| 60 | } | 
|---|
| 61 | /**@}*/ | 
|---|
| 62 |  | 
|---|
| 63 |  | 
|---|
| 64 | /**@name Constructors, destructor */ | 
|---|
| 65 | /**@{*/ | 
|---|
| 66 | /** Default constructor. */ | 
|---|
| 67 | ClpCholeskyDense(); | 
|---|
| 68 | /** Destructor  */ | 
|---|
| 69 | virtual ~ClpCholeskyDense(); | 
|---|
| 70 | /** Copy */ | 
|---|
| 71 | ClpCholeskyDense(const ClpCholeskyDense&); | 
|---|
| 72 | /** Assignment */ | 
|---|
| 73 | ClpCholeskyDense& operator=(const ClpCholeskyDense&); | 
|---|
| 74 | /** Clone */ | 
|---|
| 75 | virtual ClpCholeskyBase * clone() const ; | 
|---|
| 76 | /**@}*/ | 
|---|
| 77 |  | 
|---|
| 78 |  | 
|---|
| 79 | private: | 
|---|
| 80 | /**@name Data members */ | 
|---|
| 81 | /**@{*/ | 
|---|
| 82 | /** Just borrowing space */ | 
|---|
| 83 | bool borrowSpace_; | 
|---|
| 84 | /**@}*/ | 
|---|
| 85 | }; | 
|---|
| 86 |  | 
|---|
| 87 | /* structure for C */ | 
|---|
| 88 | typedef struct { | 
|---|
| 89 | longDouble * diagonal_; | 
|---|
| 90 | longDouble * a; | 
|---|
| 91 | longDouble * work; | 
|---|
| 92 | int * rowsDropped; | 
|---|
| 93 | double doubleParameters_[1]; /* corresponds to 10 */ | 
|---|
| 94 | int integerParameters_[2]; /* corresponds to 34, nThreads */ | 
|---|
| 95 | int n; | 
|---|
| 96 | int numberBlocks; | 
|---|
| 97 | } ClpCholeskyDenseC; | 
|---|
| 98 |  | 
|---|
| 99 | extern "C"{ | 
|---|
| 100 | void ClpCholeskySpawn(void *); | 
|---|
| 101 | } | 
|---|
| 102 | /**Non leaf recursive factor */ | 
|---|
| 103 | void | 
|---|
| 104 | ClpCholeskyCfactor(ClpCholeskyDenseC * thisStruct, | 
|---|
| 105 | longDouble * a, int n, int numberBlocks, | 
|---|
| 106 | longDouble * diagonal, longDouble * work, int * rowsDropped); | 
|---|
| 107 |  | 
|---|
| 108 | /**Non leaf recursive triangle rectangle update */ | 
|---|
| 109 | void | 
|---|
| 110 | ClpCholeskyCtriRec(ClpCholeskyDenseC * thisStruct, | 
|---|
| 111 | longDouble * aTri, int nThis, | 
|---|
| 112 | longDouble * aUnder, longDouble * diagonal, | 
|---|
| 113 | longDouble * work, | 
|---|
| 114 | int nLeft, int iBlock, int jBlock, | 
|---|
| 115 | int numberBlocks); | 
|---|
| 116 | /**Non leaf recursive rectangle triangle update */ | 
|---|
| 117 | void | 
|---|
| 118 | ClpCholeskyCrecTri(ClpCholeskyDenseC * thisStruct, | 
|---|
| 119 | longDouble * aUnder, int nTri, int nDo, | 
|---|
| 120 | int iBlock, int jBlock, longDouble * aTri, | 
|---|
| 121 | longDouble * diagonal, longDouble * work, | 
|---|
| 122 | int numberBlocks); | 
|---|
| 123 | /** Non leaf recursive rectangle rectangle update, | 
|---|
| 124 | nUnder is number of rows in iBlock, | 
|---|
| 125 | nUnderK is number of rows in kBlock | 
|---|
| 126 | */ | 
|---|
| 127 | void | 
|---|
| 128 | ClpCholeskyCrecRec(ClpCholeskyDenseC * thisStruct, | 
|---|
| 129 | longDouble * above, int nUnder, int nUnderK, | 
|---|
| 130 | int nDo, longDouble * aUnder, longDouble *aOther, | 
|---|
| 131 | longDouble * work, | 
|---|
| 132 | int iBlock, int jBlock, | 
|---|
| 133 | int numberBlocks); | 
|---|
| 134 | /**Leaf recursive factor */ | 
|---|
| 135 | void | 
|---|
| 136 | ClpCholeskyCfactorLeaf(ClpCholeskyDenseC * thisStruct, | 
|---|
| 137 | longDouble * a, int n, | 
|---|
| 138 | longDouble * diagonal, longDouble * work, | 
|---|
| 139 | int * rowsDropped); | 
|---|
| 140 | /**Leaf recursive triangle rectangle update */ | 
|---|
| 141 | void | 
|---|
| 142 | ClpCholeskyCtriRecLeaf(/*ClpCholeskyDenseC * thisStruct,*/ | 
|---|
| 143 | longDouble * aTri, longDouble * aUnder, | 
|---|
| 144 | longDouble * diagonal, longDouble * work, | 
|---|
| 145 | int nUnder); | 
|---|
| 146 | /**Leaf recursive rectangle triangle update */ | 
|---|
| 147 | void | 
|---|
| 148 | ClpCholeskyCrecTriLeaf(/*ClpCholeskyDenseC * thisStruct, */ | 
|---|
| 149 | longDouble * aUnder, longDouble * aTri, | 
|---|
| 150 | /*longDouble * diagonal,*/ longDouble * work, int nUnder); | 
|---|
| 151 | /** Leaf recursive rectangle rectangle update, | 
|---|
| 152 | nUnder is number of rows in iBlock, | 
|---|
| 153 | nUnderK is number of rows in kBlock | 
|---|
| 154 | */ | 
|---|
| 155 | void | 
|---|
| 156 | ClpCholeskyCrecRecLeaf(/*ClpCholeskyDenseC * thisStruct, */ | 
|---|
| 157 | const longDouble * COIN_RESTRICT above, | 
|---|
| 158 | const longDouble * COIN_RESTRICT aUnder, | 
|---|
| 159 | longDouble * COIN_RESTRICT aOther, | 
|---|
| 160 | const longDouble * COIN_RESTRICT work, | 
|---|
| 161 | int nUnder); | 
|---|
| 162 | #endif | 
|---|
| 163 |  | 
|---|