00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPGENTMATRIX_HPP__
00010 #define __IPGENTMATRIX_HPP__
00011
00012 #include "IpUtils.hpp"
00013 #include "IpMatrix.hpp"
00014
00015 namespace Ipopt
00016 {
00017
00018
00019 class GenTMatrixSpace;
00020
00036 class GenTMatrix : public Matrix
00037 {
00038 public:
00039
00042
00045 GenTMatrix(const GenTMatrixSpace* owner_space);
00046
00048 ~GenTMatrix();
00050
00058 void SetValues(const Number* Values);
00060
00064 Index Nonzeros() const;
00065
00067 const Index* Irows() const;
00068
00070 const Index* Jcols() const;
00071
00073 const Number* Values() const
00074 {
00075 return values_;
00076 }
00077
00082 Number* Values()
00083 {
00084 ObjectChanged();
00085 initialized_ = true;
00086 return values_;
00087 }
00089
00090 protected:
00093 virtual void MultVectorImpl(Number alpha, const Vector &x, Number beta,
00094 Vector &y) const;
00095
00096 virtual void TransMultVectorImpl(Number alpha, const Vector& x, Number beta,
00097 Vector& y) const;
00098
00101 virtual bool HasValidNumbersImpl() const;
00102
00103 virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const;
00104
00105 virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const;
00106
00107 virtual void PrintImpl(const Journalist& jnlst,
00108 EJournalLevel level,
00109 EJournalCategory category,
00110 const std::string& name,
00111 Index indent,
00112 const std::string& prefix) const
00113 {
00114 PrintImplOffset(jnlst, level, category, name, indent, prefix, 0);
00115 }
00117
00118 void PrintImplOffset(const Journalist& jnlst,
00119 EJournalLevel level,
00120 EJournalCategory category,
00121 const std::string& name,
00122 Index indent,
00123 const std::string& prefix,
00124 Index offset) const;
00125
00126 friend class ParGenMatrix;
00127
00128 private:
00138 GenTMatrix();
00139
00141 GenTMatrix(const GenTMatrix&);
00142
00144 void operator=(const GenTMatrix&);
00146
00150 const GenTMatrixSpace* owner_space_;
00151
00153 Number* values_;
00154
00156 bool initialized_;
00157
00158 };
00159
00164 class GenTMatrixSpace : public MatrixSpace
00165 {
00166 public:
00176 GenTMatrixSpace(Index nRows, Index nCols,
00177 Index nonZeros,
00178 const Index* iRows, const Index* jCols);
00179
00181 ~GenTMatrixSpace()
00182 {
00183 delete [] iRows_;
00184 delete [] jCols_;
00185 }
00187
00189 GenTMatrix* MakeNewGenTMatrix() const
00190 {
00191 return new GenTMatrix(this);
00192 }
00193
00196 virtual Matrix* MakeNew() const
00197 {
00198 return MakeNewGenTMatrix();
00199 }
00200
00204 Index Nonzeros() const
00205 {
00206 return nonZeros_;
00207 }
00208
00210 const Index* Irows() const
00211 {
00212 return iRows_;
00213 }
00214
00216 const Index* Jcols() const
00217 {
00218 return jCols_;
00219 }
00221
00222 private:
00227 const Index nonZeros_;
00228 Index* jCols_;
00229 Index* iRows_;
00231
00234 Number* AllocateInternalStorage() const;
00235
00238 void FreeInternalStorage(Number* values) const;
00239
00240 friend class GenTMatrix;
00241 };
00242
00243
00244 inline
00245 Index GenTMatrix::Nonzeros() const
00246 {
00247 return owner_space_->Nonzeros();
00248 }
00249
00250 inline
00251 const Index* GenTMatrix::Irows() const
00252 {
00253 return owner_space_->Irows();
00254 }
00255
00256 inline
00257 const Index* GenTMatrix::Jcols() const
00258 {
00259 return owner_space_->Jcols();
00260 }
00261
00262
00263 }
00264 #endif