Ipopt
trunk
|
00001 // Copyright (C) 2004, 2008 International Business Machines and others. 00002 // All Rights Reserved. 00003 // This code is published under the Eclipse Public License. 00004 // 00005 // $Id$ 00006 // 00007 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 00008 00009 #ifndef __IPMATRIX_HPP__ 00010 #define __IPMATRIX_HPP__ 00011 00012 #include "IpVector.hpp" 00013 00014 namespace Ipopt 00015 { 00016 00017 /* forward declarations */ 00018 class MatrixSpace; 00019 00027 class Matrix : public TaggedObject 00028 { 00029 public: 00035 Matrix(const MatrixSpace* owner_space) 00036 : 00037 TaggedObject(), 00038 owner_space_(owner_space), 00039 valid_cache_tag_(0) 00040 {} 00041 00043 virtual ~Matrix() 00044 {} 00046 00052 void MultVector(Number alpha, const Vector& x, Number beta, 00053 Vector& y) const 00054 { 00055 MultVectorImpl(alpha, x, beta, y); 00056 } 00057 00062 void TransMultVector(Number alpha, const Vector& x, Number beta, 00063 Vector& y) const 00064 { 00065 TransMultVectorImpl(alpha, x, beta, y); 00066 } 00068 00077 void AddMSinvZ(Number alpha, const Vector& S, const Vector& Z, 00078 Vector& X) const; 00079 00083 void SinvBlrmZMTdBr(Number alpha, const Vector& S, 00084 const Vector& R, const Vector& Z, 00085 const Vector& D, Vector& X) const; 00087 00090 bool HasValidNumbers() const; 00091 00095 inline 00096 Index NRows() const; 00097 00099 inline 00100 Index NCols() const; 00102 00108 void ComputeRowAMax(Vector& rows_norms, bool init=true) const 00109 { 00110 DBG_ASSERT(NRows() == rows_norms.Dim()); 00111 if (init) rows_norms.Set(0.); 00112 ComputeRowAMaxImpl(rows_norms, init); 00113 } 00117 void ComputeColAMax(Vector& cols_norms, bool init=true) const 00118 { 00119 DBG_ASSERT(NCols() == cols_norms.Dim()); 00120 if (init) cols_norms.Set(0.); 00121 ComputeColAMaxImpl(cols_norms, init); 00122 } 00124 00129 virtual void Print(SmartPtr<const Journalist> jnlst, 00130 EJournalLevel level, 00131 EJournalCategory category, 00132 const std::string& name, 00133 Index indent=0, 00134 const std::string& prefix="") const; 00135 virtual void Print(const Journalist& jnlst, 00136 EJournalLevel level, 00137 EJournalCategory category, 00138 const std::string& name, 00139 Index indent=0, 00140 const std::string& prefix="") const; 00142 00144 inline 00145 SmartPtr<const MatrixSpace> OwnerSpace() const; 00146 00147 protected: 00155 virtual void MultVectorImpl(Number alpha, const Vector& x, Number beta, Vector& y) const =0; 00156 00160 virtual void TransMultVectorImpl(Number alpha, const Vector& x, Number beta, Vector& y) const =0; 00161 00166 virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z, 00167 Vector& X) const; 00168 00172 virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S, 00173 const Vector& R, const Vector& Z, 00174 const Vector& D, Vector& X) const; 00175 00179 virtual bool HasValidNumbersImpl() const 00180 { 00181 return true; 00182 } 00183 00187 virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const = 0; 00191 virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const = 0; 00192 00194 virtual void PrintImpl(const Journalist& jnlst, 00195 EJournalLevel level, 00196 EJournalCategory category, 00197 const std::string& name, 00198 Index indent, 00199 const std::string& prefix) const =0; 00201 00202 private: 00212 Matrix(); 00213 00215 Matrix(const Matrix&); 00216 00218 Matrix& operator=(const Matrix&); 00220 00221 const SmartPtr<const MatrixSpace> owner_space_; 00222 00225 mutable TaggedObject::Tag valid_cache_tag_; 00226 mutable bool cached_valid_; 00228 }; 00229 00230 00239 class MatrixSpace : public ReferencedObject 00240 { 00241 public: 00247 MatrixSpace(Index nRows, Index nCols) 00248 : 00249 nRows_(nRows), 00250 nCols_(nCols) 00251 {} 00252 00254 virtual ~MatrixSpace() 00255 {} 00257 00261 virtual Matrix* MakeNew() const=0; 00262 00264 Index NRows() const 00265 { 00266 return nRows_; 00267 } 00269 Index NCols() const 00270 { 00271 return nCols_; 00272 } 00273 00277 bool IsMatrixFromSpace(const Matrix& matrix) const 00278 { 00279 return (matrix.OwnerSpace() == this); 00280 } 00281 00282 private: 00292 MatrixSpace(); 00293 00295 MatrixSpace(const MatrixSpace&); 00296 00298 MatrixSpace& operator=(const MatrixSpace&); 00300 00302 const Index nRows_; 00304 const Index nCols_; 00305 }; 00306 00307 00308 /* Inline Methods */ 00309 inline 00310 Index Matrix::NRows() const 00311 { 00312 return owner_space_->NRows(); 00313 } 00314 00315 inline 00316 Index Matrix::NCols() const 00317 { 00318 return owner_space_->NCols(); 00319 } 00320 00321 inline 00322 SmartPtr<const MatrixSpace> Matrix::OwnerSpace() const 00323 { 00324 return owner_space_; 00325 } 00326 00327 } // namespace Ipopt 00328 00329 // Macro definitions for debugging matrices 00330 #if COIN_IPOPT_VERBOSITY == 0 00331 # define DBG_PRINT_MATRIX(__verbose_level, __mat_name, __mat) 00332 #else 00333 # define DBG_PRINT_MATRIX(__verbose_level, __mat_name, __mat) \ 00334 if (dbg_jrnl.Verbosity() >= (__verbose_level)) { \ 00335 if (dbg_jrnl.Jnlst()!=NULL) { \ 00336 (__mat).Print(dbg_jrnl.Jnlst(), \ 00337 J_ERROR, J_DBG, \ 00338 __mat_name, \ 00339 dbg_jrnl.IndentationLevel()*2, \ 00340 "# "); \ 00341 } \ 00342 } 00343 #endif // #if COIN_IPOPT_VERBOSITY == 0 00344 00345 #endif