00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPSYMSCALEDMATRIX_HPP__
00010 #define __IPSYMSCALEDMATRIX_HPP__
00011
00012 #include "IpUtils.hpp"
00013 #include "IpSymMatrix.hpp"
00014
00015 namespace Ipopt
00016 {
00017
00018
00019 class SymScaledMatrixSpace;
00020
00026 class SymScaledMatrix : public SymMatrix
00027 {
00028 public:
00029
00032
00035 SymScaledMatrix(const SymScaledMatrixSpace* owner_space);
00036
00038 ~SymScaledMatrix();
00040
00042 void SetUnscaledMatrix(const SmartPtr<const SymMatrix> unscaled_matrix);
00043
00045 void SetUnscaledMatrixNonConst(const SmartPtr<SymMatrix>& unscaled_matrix);
00046
00048 SmartPtr<const SymMatrix> GetUnscaledMatrix() const;
00049
00051 SmartPtr<SymMatrix> GetUnscaledMatrixNonConst();
00052
00054 SmartPtr<const Vector> RowColScaling() const;
00055
00056 protected:
00059 virtual void MultVectorImpl(Number alpha, const Vector& x,
00060 Number beta, Vector& y) const;
00061
00065 virtual bool HasValidNumbersImpl() const;
00066
00067 virtual void PrintImpl(const Journalist& jnlst,
00068 EJournalLevel level,
00069 EJournalCategory category,
00070 const std::string& name,
00071 Index indent,
00072 const std::string& prefix) const;
00074
00075 private:
00085 SymScaledMatrix();
00086
00088 SymScaledMatrix(const SymScaledMatrix&);
00089
00091 void operator=(const SymScaledMatrix&);
00093
00095 SmartPtr<const SymMatrix> matrix_;
00097 SmartPtr<SymMatrix> nonconst_matrix_;
00098
00100 SmartPtr<const SymScaledMatrixSpace> owner_space_;
00101 };
00102
00105 class SymScaledMatrixSpace : public SymMatrixSpace
00106 {
00107 public:
00113 SymScaledMatrixSpace(const SmartPtr<const Vector>& row_col_scaling,
00114 bool row_col_scaling_reciprocal,
00115 const SmartPtr<const SymMatrixSpace>& unscaled_matrix_space)
00116 :
00117 SymMatrixSpace(unscaled_matrix_space->Dim()),
00118 unscaled_matrix_space_(unscaled_matrix_space)
00119 {
00120 scaling_ = row_col_scaling->MakeNewCopy();
00121 if (row_col_scaling_reciprocal) {
00122 scaling_->ElementWiseReciprocal();
00123 }
00124 }
00125
00127 ~SymScaledMatrixSpace()
00128 {}
00130
00132 SymScaledMatrix* MakeNewSymScaledMatrix(bool allocate_unscaled_matrix = false) const
00133 {
00134 SymScaledMatrix* ret = new SymScaledMatrix(this);
00135 if (allocate_unscaled_matrix) {
00136 SmartPtr<SymMatrix> unscaled_matrix = unscaled_matrix_space_->MakeNewSymMatrix();
00137 ret->SetUnscaledMatrixNonConst(unscaled_matrix);
00138 }
00139 return ret;
00140 }
00141
00143 virtual SymMatrix* MakeNewSymMatrix() const
00144 {
00145 return MakeNewSymScaledMatrix();
00146 }
00149 virtual Matrix* MakeNew() const
00150 {
00151 return MakeNewSymScaledMatrix();
00152 }
00153
00155 SmartPtr<const Vector> RowColScaling() const
00156 {
00157 return ConstPtr(scaling_);
00158 }
00159
00161 SmartPtr<const SymMatrixSpace> UnscaledMatrixSpace() const
00162 {
00163 return unscaled_matrix_space_;
00164 }
00165
00166 private:
00176 SymScaledMatrixSpace();
00177
00179 SymScaledMatrixSpace(const SymScaledMatrixSpace&);
00180
00182 SymScaledMatrixSpace& operator=(const SymScaledMatrixSpace&);
00184
00186 SmartPtr<Vector> scaling_;
00188 SmartPtr<const SymMatrixSpace> unscaled_matrix_space_;
00189 };
00190
00191 inline
00192 void SymScaledMatrix::SetUnscaledMatrix(const SmartPtr<const SymMatrix> unscaled_matrix)
00193 {
00194 matrix_ = unscaled_matrix;
00195 nonconst_matrix_ = NULL;
00196 ObjectChanged();
00197 }
00198
00199 inline
00200 void SymScaledMatrix::SetUnscaledMatrixNonConst(const SmartPtr<SymMatrix>& unscaled_matrix)
00201 {
00202 nonconst_matrix_ = unscaled_matrix;
00203 matrix_ = GetRawPtr(unscaled_matrix);
00204 ObjectChanged();
00205 }
00206
00207 inline
00208 SmartPtr<const SymMatrix> SymScaledMatrix::GetUnscaledMatrix() const
00209 {
00210 return matrix_;
00211 }
00212
00213 inline
00214 SmartPtr<SymMatrix> SymScaledMatrix::GetUnscaledMatrixNonConst()
00215 {
00216 DBG_ASSERT(IsValid(nonconst_matrix_));
00217 ObjectChanged();
00218 return nonconst_matrix_;
00219 }
00220
00221 inline SmartPtr<const Vector> SymScaledMatrix::RowColScaling() const
00222 {
00223 return ConstPtr(owner_space_->RowColScaling());
00224 }
00225
00226 }
00227
00228 #endif