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;
00114
00115
00116 private:
00126 GenTMatrix();
00127
00129 GenTMatrix(const GenTMatrix&);
00130
00132 void operator=(const GenTMatrix&);
00134
00138 const GenTMatrixSpace* owner_space_;
00139
00141 Number* values_;
00142
00144 bool initialized_;
00145
00146 };
00147
00152 class GenTMatrixSpace : public MatrixSpace
00153 {
00154 public:
00164 GenTMatrixSpace(Index nRows, Index nCols,
00165 Index nonZeros,
00166 const Index* iRows, const Index* jCols);
00167
00169 ~GenTMatrixSpace()
00170 {
00171 delete [] iRows_;
00172 delete [] jCols_;
00173 }
00175
00177 GenTMatrix* MakeNewGenTMatrix() const
00178 {
00179 return new GenTMatrix(this);
00180 }
00181
00184 virtual Matrix* MakeNew() const
00185 {
00186 return MakeNewGenTMatrix();
00187 }
00188
00192 Index Nonzeros() const
00193 {
00194 return nonZeros_;
00195 }
00196
00198 const Index* Irows() const
00199 {
00200 return iRows_;
00201 }
00202
00204 const Index* Jcols() const
00205 {
00206 return jCols_;
00207 }
00209
00210 private:
00215 const Index nonZeros_;
00216 Index* jCols_;
00217 Index* iRows_;
00219
00222 Number* AllocateInternalStorage() const;
00223
00226 void FreeInternalStorage(Number* values) const;
00227
00228 friend class GenTMatrix;
00229 };
00230
00231
00232 inline
00233 Index GenTMatrix::Nonzeros() const
00234 {
00235 return owner_space_->Nonzeros();
00236 }
00237
00238 inline
00239 const Index* GenTMatrix::Irows() const
00240 {
00241 return owner_space_->Irows();
00242 }
00243
00244 inline
00245 const Index* GenTMatrix::Jcols() const
00246 {
00247 return owner_space_->Jcols();
00248 }
00249
00250
00251 }
00252 #endif