Ipopt  3.12.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
IpCompoundMatrix.hpp
Go to the documentation of this file.
1 // Copyright (C) 2004, 2009 International Business Machines and others.
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // $Id: IpCompoundMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $
6 //
7 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
8 
9 #ifndef __IPCOMPOUNDMATRIX_HPP__
10 #define __IPCOMPOUNDMATRIX_HPP__
11 
12 #include "IpUtils.hpp"
13 #include "IpMatrix.hpp"
14 
15 namespace Ipopt
16 {
17 
18  /* forward declarations */
19  class CompoundMatrixSpace;
20 
34  class CompoundMatrix : public Matrix
35  {
36  public:
37 
40 
47  CompoundMatrix(const CompoundMatrixSpace* owner_space);
48 
50  virtual ~CompoundMatrix();
52 
56  void SetComp(Index irow, Index jcol, const Matrix& matrix);
57 
59  void SetCompNonConst(Index irow, Index jcol, Matrix& matrix);
60 
62  void CreateBlockFromSpace(Index irow, Index jcol);
63 
68  {
69  return ConstComp(irow, jcol);
70  }
71 
77  {
78  ObjectChanged();
79  return Comp(irow, jcol);
80  }
81 
83  inline Index NComps_Rows() const;
85  inline Index NComps_Cols() const;
86 
87  protected:
90  virtual void MultVectorImpl(Number alpha, const Vector& x,
91  Number beta, Vector& y) const;
92 
93  virtual void TransMultVectorImpl(Number alpha, const Vector& x,
94  Number beta, Vector& y) const;
95 
98  virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z,
99  Vector& X) const;
100 
103  virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S,
104  const Vector& R, const Vector& Z,
105  const Vector& D, Vector& X) const;
106 
109  virtual bool HasValidNumbersImpl() const;
110 
111  virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const;
112 
113  virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const;
114 
115  virtual void PrintImpl(const Journalist& jnlst,
116  EJournalLevel level,
117  EJournalCategory category,
118  const std::string& name,
119  Index indent,
120  const std::string& prefix) const;
122 
123  private:
133  CompoundMatrix();
134 
137 
139  void operator=(const CompoundMatrix&);
141 
143  std::vector<std::vector<SmartPtr<Matrix> > > comps_;
144 
146  std::vector<std::vector<SmartPtr<const Matrix> > > const_comps_;
147 
151 
153  mutable bool matrices_valid_;
154 
156  bool MatricesValid() const;
157 
158  inline const Matrix* ConstComp(Index irow, Index jcol) const;
159 
160  inline Matrix* Comp(Index irow, Index jcol);
161  };
162 
169  {
170  public:
176  CompoundMatrixSpace(Index ncomps_rows,
177  Index ncomps_cols,
178  Index total_nRows,
179  Index total_nCols);
180 
183  {}
185 
189  void SetBlockRows(Index irow, Index nrows);
190 
192  void SetBlockCols(Index jcol, Index ncols);
193 
195  Index GetBlockRows(Index irow) const;
196 
198  Index GetBlockCols(Index jcol) const;
199 
206  void SetCompSpace(Index irow, Index jcol,
207  const MatrixSpace& mat_space,
208  bool auto_allocate = false);
210 
215  {
216  DBG_ASSERT(irow<NComps_Rows());
217  DBG_ASSERT(jcol<NComps_Cols());
218  return comp_spaces_[irow][jcol];
219  }
220 
225  {
226  return ncomps_rows_;
227  }
230  {
231  return ncomps_cols_;
232  }
233 
235  bool Diagonal() const
236  {
237  return diagonal_;
238  }
240 
243 
246  virtual Matrix* MakeNew() const
247  {
248  return MakeNewCompoundMatrix();
249  }
250 
251  private:
262 
265 
269 
272 
275 
277  mutable bool dimensions_set_;
278 
280  std::vector<std::vector<SmartPtr<const MatrixSpace> > > comp_spaces_;
281 
284  std::vector<std::vector< bool > > allocate_block_;
285 
287  std::vector<Index> block_rows_;
288 
290  std::vector<Index> block_cols_;
291 
296  bool diagonal_;
297 
300  bool DimensionsSet() const;
301  };
302 
303  /* inline methods */
304  inline
306  {
307  return owner_space_->NComps_Rows();
308  }
309 
310  inline
312  {
313  return owner_space_->NComps_Cols();
314  }
315 
316  inline
317  const Matrix* CompoundMatrix::ConstComp(Index irow, Index jcol) const
318  {
319  DBG_ASSERT(irow < NComps_Rows());
320  DBG_ASSERT(jcol < NComps_Cols());
321  if (IsValid(comps_[irow][jcol])) {
322  return GetRawPtr(comps_[irow][jcol]);
323  }
324  else if (IsValid(const_comps_[irow][jcol])) {
325  return GetRawPtr(const_comps_[irow][jcol]);
326  }
327 
328  return NULL;
329  }
330 
331  inline
333  {
334  DBG_ASSERT(irow < NComps_Rows());
335  DBG_ASSERT(jcol < NComps_Cols());
336  return GetRawPtr(comps_[irow][jcol]);
337  }
338 
339 } // namespace Ipopt
340 #endif
bool Diagonal() const
True if the blocks lie on the diagonal - can make some operations faster.
virtual void MultVectorImpl(Number alpha, const Vector &x, Number beta, Vector &y) const
Matrix-vector multiply.
bool IsValid(const SmartPtr< U > &smart_ptr)
Definition: IpSmartPtr.hpp:579
Number * x
Input: Starting point Output: Optimal solution.
virtual void PrintImpl(const Journalist &jnlst, EJournalLevel level, EJournalCategory category, const std::string &name, Index indent, const std::string &prefix) const
Print detailed information about the matrix.
void SetCompNonConst(Index irow, Index jcol, Matrix &matrix)
Method to set a non-const Matrix entry.
bool diagonal_
true if the CompoundMatrixSpace only has Matrix spaces along the diagonal.
SmartPtr< const Matrix > GetComp(Index irow, Index jcol) const
Method for retrieving one block from the compound matrix as a const Matrix.
double Number
Type of all numbers.
Definition: IpTypes.hpp:17
This is the matrix space for CompoundMatrix.
void ObjectChanged()
Objects derived from TaggedObject MUST call this method every time their internal state changes to up...
Vector Base Class.
Definition: IpVector.hpp:47
SmartPtr< const MatrixSpace > GetCompSpace(Index irow, Index jcol) const
Obtain the component MatrixSpace in block row irow and block column jcol.
Index NComps_Rows() const
Number of block rows.
bool MatricesValid() const
Method to check whether or not the matrices are valid.
virtual void AddMSinvZImpl(Number alpha, const Vector &S, const Vector &Z, Vector &X) const
X = beta*X + alpha*(Matrix S^{-1} Z).
void SetCompSpace(Index irow, Index jcol, const MatrixSpace &mat_space, bool auto_allocate=false)
Set the component MatrixSpace.
EJournalLevel
Print Level Enum.
Matrix * Comp(Index irow, Index jcol)
bool matrices_valid_
boolean indicating if the compound matrix is in a &quot;valid&quot; state
CompoundMatrixSpace & operator=(const CompoundMatrixSpace &)
Overloaded Equals Operator.
Index GetBlockRows(Index irow) const
Get the number nrows of rows in row-block number irow.
void SetBlockRows(Index irow, Index nrows)
Set the number nrows of rows in row-block number irow.
void operator=(const CompoundMatrix &)
Overloaded Equals Operator.
CompoundMatrix()
Default Constructor.
Template class for Smart Pointers.
Definition: IpSmartPtr.hpp:172
void CreateBlockFromSpace(Index irow, Index jcol)
Method to create a new matrix from the space for this block.
std::vector< std::vector< SmartPtr< const MatrixSpace > > > comp_spaces_
2-dim std::vector of matrix spaces for the components
Index ncomps_rows_
Number of block rows.
void SetComp(Index irow, Index jcol, const Matrix &matrix)
Method for setting an individual component at position (irow, icol) in the compound matrix...
std::vector< std::vector< SmartPtr< Matrix > > > comps_
Matrix of matrix&#39;s containing the components.
bool dimensions_set_
Store whether or not the dimensions are valid.
U * GetRawPtr(const SmartPtr< U > &smart_ptr)
Definition: IpSmartPtr.hpp:560
const Matrix * ConstComp(Index irow, Index jcol) const
virtual Matrix * MakeNew() const
Overloaded MakeNew method for the MatrixSpace base class.
Matrix Base Class.
Definition: IpMatrix.hpp:27
std::vector< std::vector< bool > > allocate_block_
2-dim std::vector of booleans deciding whether to allocate a new matrix for the blocks automagically ...
virtual void ComputeColAMaxImpl(Vector &cols_norms, bool init) const
Compute the max-norm of the columns in the matrix.
SmartPtr< Matrix > GetCompNonConst(Index irow, Index jcol)
Method for retrieving one block from the compound matrix as a non-const Matrix.
MatrixSpace base class, corresponding to the Matrix base class.
Definition: IpMatrix.hpp:239
virtual ~CompoundMatrix()
Destructor.
virtual void TransMultVectorImpl(Number alpha, const Vector &x, Number beta, Vector &y) const
Matrix(transpose) vector multiply.
CompoundMatrixSpace()
Default constructor.
int Index
Type of all indices of vectors, matrices etc.
Definition: IpTypes.hpp:19
Index NComps_Cols() const
Number of block columns.
std::vector< std::vector< SmartPtr< const Matrix > > > const_comps_
Matrix of const matrix&#39;s containing the components.
#define DBG_ASSERT(test)
Definition: IpDebug.hpp:38
Index NComps_Rows() const
Number of block rows of this compound matrix.
void SetBlockCols(Index jcol, Index ncols)
Set the number ncols of columns in column-block number jcol.
Index NComps_Cols() const
Number of block colmuns of this compound matrix.
CompoundMatrix * MakeNewCompoundMatrix() const
Method for creating a new matrix of this specific type.
Class responsible for all message output.
std::vector< Index > block_rows_
Vector of the number of rows in each comp column.
const CompoundMatrixSpace * owner_space_
Copy of the owner_space ptr as a CompoundMatrixSpace instead of MatrixSpace.
std::vector< Index > block_cols_
Vector of the number of cols in each comp row.
virtual void ComputeRowAMaxImpl(Vector &rows_norms, bool init) const
Compute the max-norm of the rows in the matrix.
bool DimensionsSet() const
Auxilliary function for debugging to set if all block dimensions have been set.
Index ncomps_cols_
Number of block columns.
Class for Matrices consisting of other matrices.
EJournalCategory
Category Selection Enum.
Index GetBlockCols(Index jcol) const
Set the number ncols of columns in column-block number jcol.
virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector &S, const Vector &R, const Vector &Z, const Vector &D, Vector &X) const
X = S^{-1} (r + alpha*Z*M^Td).
virtual bool HasValidNumbersImpl() const
Method for determining if all stored numbers are valid (i.e., no Inf or Nan).