/home/coin/SVN-release/CoinAll-1.1.0/Ipopt/src/LinAlg/IpSymScaledMatrix.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2004, 2007 International Business Machines and others.
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // $Id: IpSymScaledMatrix.hpp 1001 2007-06-18 20:36:53Z andreasw $
00006 //
00007 // Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13
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   /* forward declarations */
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 } // namespace Ipopt
00227 
00228 #endif

Generated on Sun Nov 14 14:06:36 2010 for Coin-All by  doxygen 1.4.7