00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPDENSEGENMATRIX_HPP__
00010 #define __IPDENSEGENMATRIX_HPP__
00011
00012 #include "IpUtils.hpp"
00013 #include "IpMatrix.hpp"
00014 #include "IpDenseVector.hpp"
00015 #include "IpDenseSymMatrix.hpp"
00016
00017 namespace Ipopt
00018 {
00019
00021 class DenseGenMatrixSpace;
00022
00026 class DenseGenMatrix : public Matrix
00027 {
00028 public:
00029
00032
00035 DenseGenMatrix(const DenseGenMatrixSpace* owner_space);
00036
00038 ~DenseGenMatrix();
00040
00042 SmartPtr<DenseGenMatrix> MakeNewDenseGenMatrix() const;
00043
00048 Number* Values()
00049 {
00050 initialized_ = true;
00051 ObjectChanged();
00052 return values_;
00053 }
00054
00058 const Number* Values() const
00059 {
00060 DBG_ASSERT(initialized_);
00061 return values_;
00062 }
00063
00066 void Copy(const DenseGenMatrix& M);
00067
00070 void FillIdentity(Number factor=1.);
00071
00074 void ScaleColumns(const DenseVector& scal_vec);
00075
00077 void AddMatrixProduct(Number alpha, const DenseGenMatrix& A,
00078 bool transA, const DenseGenMatrix& B,
00079 bool transB, Number beta);
00080
00084 void HighRankUpdateTranspose(Number alpha,
00085 const MultiVectorMatrix& V1,
00086 const MultiVectorMatrix& V2,
00087 Number beta);
00088
00094 bool ComputeCholeskyFactor(const DenseSymMatrix& M);
00095
00101 bool ComputeEigenVectors(const DenseSymMatrix& M,
00102 DenseVector& Evalues);
00103
00109 void CholeskyBackSolveMatrix(bool trans, Number alpha,
00110 DenseGenMatrix& B) const;
00111
00116 void CholeskySolveVector(DenseVector& b) const;
00117
00123 void CholeskySolveMatrix(DenseGenMatrix& B) const;
00124
00127 bool ComputeLUFactorInPlace();
00128
00131 void LUSolveMatrix(DenseGenMatrix& B) const;
00132
00135 void LUSolveVector(DenseVector& b) const;
00136
00137 protected:
00140 virtual void MultVectorImpl(Number alpha, const Vector &x, Number beta,
00141 Vector &y) const;
00142
00143 virtual void TransMultVectorImpl(Number alpha, const Vector& x,
00144 Number beta, Vector& y) const;
00145
00148 virtual bool HasValidNumbersImpl() const;
00149
00150 virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const;
00151
00152 virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const;
00153
00154 virtual void PrintImpl(const Journalist& jnlst,
00155 EJournalLevel level,
00156 EJournalCategory category,
00157 const std::string& name,
00158 Index indent,
00159 const std::string& prefix) const;
00161
00162
00163 private:
00173 DenseGenMatrix();
00174
00176 DenseGenMatrix(const DenseGenMatrix&);
00177
00179 void operator=(const DenseGenMatrix&);
00181
00182 const DenseGenMatrixSpace* owner_space_;
00183
00186 Number* values_;
00187
00189 bool initialized_;
00190
00192 enum Factorization
00193 {
00194 NONE,
00195 LU,
00196 CHOL
00197 };
00198
00200 Factorization factorization_;
00201
00203 int* pivot_;
00204 };
00205
00208 class DenseGenMatrixSpace : public MatrixSpace
00209 {
00210 public:
00216 DenseGenMatrixSpace(Index nRows, Index nCols);
00217
00219 ~DenseGenMatrixSpace()
00220 {}
00222
00224 DenseGenMatrix* MakeNewDenseGenMatrix() const
00225 {
00226 return new DenseGenMatrix(this);
00227 }
00228
00231 virtual Matrix* MakeNew() const
00232 {
00233 return MakeNewDenseGenMatrix();
00234 }
00235
00236 };
00237
00238 inline
00239 SmartPtr<DenseGenMatrix> DenseGenMatrix::MakeNewDenseGenMatrix() const
00240 {
00241 return owner_space_->MakeNewDenseGenMatrix();
00242 }
00243
00244 }
00245 #endif