Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPLOWRANKUPDATESYMMATRIX_HPP__
00010 #define __IPLOWRANKUPDATESYMMATRIX_HPP__
00011
00012 #include "IpUtils.hpp"
00013 #include "IpSymMatrix.hpp"
00014 #include "IpMultiVectorMatrix.hpp"
00015
00016 namespace Ipopt
00017 {
00018
00019
00020 class LowRankUpdateSymMatrixSpace;
00021
00031 class LowRankUpdateSymMatrix : public SymMatrix
00032 {
00033 public:
00034
00037
00039 LowRankUpdateSymMatrix(const LowRankUpdateSymMatrixSpace* owner_space);
00040
00042 ~LowRankUpdateSymMatrix();
00044
00046 void SetDiag(const Vector& D)
00047 {
00048 D_ = &D;
00049 ObjectChanged();
00050 }
00051
00053 SmartPtr<const Vector> GetDiag() const
00054 {
00055 return D_;
00056 }
00057
00059 void SetV(const MultiVectorMatrix& V)
00060 {
00061 V_ = &V;
00062 ObjectChanged();
00063 }
00064
00066 SmartPtr<const MultiVectorMatrix> GetV() const
00067 {
00068 return V_;
00069 }
00070
00072 void SetU(const MultiVectorMatrix& U)
00073 {
00074 U_ = &U;
00075 ObjectChanged();
00076 }
00077
00079 SmartPtr<const MultiVectorMatrix> GetU() const
00080 {
00081 return U_;
00082 }
00083
00086 SmartPtr<const Matrix> P_LowRank() const;
00087
00090 SmartPtr<const VectorSpace> LowRankVectorSpace() const;
00091
00094 bool ReducedDiag() const;
00095
00096 protected:
00099 virtual void MultVectorImpl(Number alpha, const Vector& x,
00100 Number beta, Vector& y) const;
00101
00104 virtual bool HasValidNumbersImpl() const;
00105
00106 virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const;
00107
00108 virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const;
00109
00110 virtual void PrintImpl(const Journalist& jnlst,
00111 EJournalLevel level,
00112 EJournalCategory category,
00113 const std::string& name,
00114 Index indent,
00115 const std::string& prefix) const;
00117
00118 private:
00128 LowRankUpdateSymMatrix();
00129
00131 LowRankUpdateSymMatrix(const LowRankUpdateSymMatrix&);
00132
00134 void operator=(const LowRankUpdateSymMatrix&);
00136
00138 SmartPtr<const LowRankUpdateSymMatrixSpace> owner_space_;
00139
00141 SmartPtr<const Vector> D_;
00142
00144 SmartPtr<const MultiVectorMatrix> V_;
00145
00147 SmartPtr<const MultiVectorMatrix> U_;
00148 };
00149
00151 class LowRankUpdateSymMatrixSpace : public SymMatrixSpace
00152 {
00153 public:
00157 LowRankUpdateSymMatrixSpace(Index dim,
00158 SmartPtr<const Matrix> P_LowRank,
00159 SmartPtr<const VectorSpace> LowRankVectorSpace,
00160 bool reduced_diag)
00161 :
00162 SymMatrixSpace(dim),
00163 P_LowRank_(P_LowRank),
00164 lowrank_vector_space_(LowRankVectorSpace),
00165 reduced_diag_(reduced_diag)
00166 {
00167 DBG_ASSERT(IsValid(lowrank_vector_space_));
00168 }
00169
00171 virtual ~LowRankUpdateSymMatrixSpace()
00172 {}
00174
00177 virtual SymMatrix* MakeNewSymMatrix() const
00178 {
00179 return MakeNewLowRankUpdateSymMatrix();
00180 }
00181
00183 LowRankUpdateSymMatrix* MakeNewLowRankUpdateSymMatrix() const
00184 {
00185 return new LowRankUpdateSymMatrix(this);
00186 }
00187
00188 SmartPtr<const Matrix> P_LowRank() const
00189 {
00190 return P_LowRank_;
00191 }
00192
00193 SmartPtr<const VectorSpace> LowRankVectorSpace() const
00194 {
00195 return lowrank_vector_space_;
00196 }
00197
00198 bool ReducedDiag() const
00199 {
00200 return reduced_diag_;
00201 }
00202
00203 private:
00213 LowRankUpdateSymMatrixSpace();
00214
00216 LowRankUpdateSymMatrixSpace(const LowRankUpdateSymMatrixSpace&);
00217
00219 void operator=(const LowRankUpdateSymMatrixSpace&);
00221
00225 SmartPtr<const Matrix> P_LowRank_;
00226
00229 SmartPtr<const VectorSpace> lowrank_vector_space_;
00230
00233 bool reduced_diag_;
00234 };
00235
00236 inline
00237 SmartPtr<const Matrix> LowRankUpdateSymMatrix::P_LowRank() const
00238 {
00239 return owner_space_->P_LowRank();
00240 }
00241
00242 inline
00243 SmartPtr<const VectorSpace> LowRankUpdateSymMatrix::LowRankVectorSpace() const
00244 {
00245 return owner_space_->LowRankVectorSpace();
00246 }
00247
00248 inline
00249 bool LowRankUpdateSymMatrix::ReducedDiag() const
00250 {
00251 return owner_space_->ReducedDiag();
00252 }
00253
00254 }
00255 #endif