• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

/build/buildd/coinor-ipopt-3.8.3/Ipopt/src/LinAlg/IpCompoundSymMatrix.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2004, 2008 International Business Machines and others.
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // $Id: IpCompoundSymMatrix.hpp 1280 2008-08-10 21:19:31Z andreasw $
00006 //
00007 // Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13
00008 
00009 #ifndef __IPCOMPOUNDSYMMATRIX_HPP__
00010 #define __IPCOMPOUNDSYMMATRIX_HPP__
00011 
00012 #include "IpUtils.hpp"
00013 #include "IpSymMatrix.hpp"
00014 
00015 namespace Ipopt
00016 {
00017 
00018   /* forward declarations */
00019   class CompoundSymMatrixSpace;
00020 
00024   class CompoundSymMatrix : public SymMatrix
00025   {
00026   public:
00027 
00030 
00036     CompoundSymMatrix(const CompoundSymMatrixSpace* owner_space);
00037 
00039     ~CompoundSymMatrix();
00041 
00046     void SetComp(Index irow, Index jcol, const Matrix& matrix);
00047 
00049     void SetCompNonConst(Index irow, Index jcol, Matrix& matrix);
00050 
00054     SmartPtr<const Matrix> GetComp(Index irow, Index jcol) const
00055     {
00056       return ConstComp(irow,jcol);
00057     }
00058 
00062     SmartPtr<Matrix> GetCompNonConst(Index irow, Index jcol)
00063     {
00064       ObjectChanged();
00065       return Comp(irow,jcol);
00066     }
00067 
00069     SmartPtr<CompoundSymMatrix> MakeNewCompoundSymMatrix() const;
00070 
00071     // The following don't seem to be necessary
00072     /* Number of block rows of this compound matrix. */
00073     //    Index NComps_NRows() const { return NComps_Dim(); }
00074 
00075     /* Number of block colmuns of this compound matrix. */
00076     //    Index NComps_NCols() const { return NComps_Dim(); }
00077 
00079     Index NComps_Dim() const;
00080 
00081   protected:
00084     virtual void MultVectorImpl(Number alpha, const Vector& x,
00085                                 Number beta, Vector& y) const;
00086 
00089     virtual bool HasValidNumbersImpl() const;
00090 
00091     virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const;
00092 
00093     virtual void PrintImpl(const Journalist& jnlst,
00094                            EJournalLevel level,
00095                            EJournalCategory category,
00096                            const std::string& name,
00097                            Index indent,
00098                            const std::string& prefix) const;
00100 
00101   private:
00111     CompoundSymMatrix();
00112 
00114     CompoundSymMatrix(const CompoundSymMatrix&);
00115 
00117     void operator=(const CompoundSymMatrix&);
00119 
00121     std::vector<std::vector<SmartPtr<Matrix> > > comps_;
00122 
00124     std::vector<std::vector<SmartPtr<const Matrix> > > const_comps_;
00125 
00127     const CompoundSymMatrixSpace* owner_space_;
00128 
00130     mutable bool matrices_valid_;
00131 
00133     bool MatricesValid() const;
00134 
00136     const Matrix* ConstComp(Index irow, Index jcol) const
00137     {
00138       DBG_ASSERT(irow < NComps_Dim());
00139       DBG_ASSERT(jcol <= irow);
00140       if (IsValid(comps_[irow][jcol])) {
00141         return GetRawPtr(comps_[irow][jcol]);
00142       }
00143       else if (IsValid(const_comps_[irow][jcol])) {
00144         return GetRawPtr(const_comps_[irow][jcol]);
00145       }
00146 
00147       return NULL;
00148     }
00149 
00151     Matrix* Comp(Index irow, Index jcol)
00152     {
00153       DBG_ASSERT(irow < NComps_Dim());
00154       DBG_ASSERT(jcol <= irow);
00155       // We shouldn't be asking for a non-const if this entry holds a
00156       // const one...
00157       DBG_ASSERT(IsNull(const_comps_[irow][jcol]));
00158       if (IsValid(comps_[irow][jcol])) {
00159         return GetRawPtr(comps_[irow][jcol]);
00160       }
00161 
00162       return NULL;
00163     }
00164   };
00165 
00171   class CompoundSymMatrixSpace : public SymMatrixSpace
00172   {
00173   public:
00179     CompoundSymMatrixSpace(Index ncomp_spaces, Index total_dim);
00180 
00182     ~CompoundSymMatrixSpace()
00183     {}
00185 
00189     void SetBlockDim(Index irow_jcol, Index dim);
00190 
00192     Index GetBlockDim(Index irow_jcol) const;
00193 
00200     void SetCompSpace(Index irow, Index jcol,
00201                       const MatrixSpace& mat_space,
00202                       bool auto_allocate = false);
00204 
00208     SmartPtr<const MatrixSpace> GetCompSpace(Index irow, Index jcol) const
00209     {
00210       DBG_ASSERT(irow<ncomp_spaces_);
00211       DBG_ASSERT(jcol<=irow);
00212       return comp_spaces_[irow][jcol];
00213     }
00214 
00217     Index NComps_Dim() const
00218     {
00219       return ncomp_spaces_;
00220     }
00222 
00224     CompoundSymMatrix* MakeNewCompoundSymMatrix() const;
00225 
00228     virtual SymMatrix* MakeNewSymMatrix() const
00229     {
00230       return MakeNewCompoundSymMatrix();
00231     }
00232 
00233   private:
00243     CompoundSymMatrixSpace();
00244 
00246     CompoundSymMatrixSpace(const CompoundSymMatrix&);
00247 
00249     CompoundSymMatrixSpace& operator=(const CompoundSymMatrixSpace&);
00251 
00253     Index ncomp_spaces_;
00254 
00259     std::vector<Index> block_dim_;
00260 
00263     std::vector<std::vector<SmartPtr<const MatrixSpace> > > comp_spaces_;
00264 
00267     std::vector<std::vector< bool > > allocate_block_;
00268 
00270     mutable bool dimensions_set_;
00271 
00273     bool DimensionsSet() const;
00274   };
00275 
00276   inline
00277   SmartPtr<CompoundSymMatrix> CompoundSymMatrix::MakeNewCompoundSymMatrix() const
00278   {
00279     return owner_space_->MakeNewCompoundSymMatrix();
00280   }
00281 
00282 } // namespace Ipopt
00283 #endif

Generated on Sat Oct 16 2010 02:54:51 by  doxygen 1.7.1