Ipopt  3.11.8
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
IpMatrix.hpp
Go to the documentation of this file.
1 // Copyright (C) 2004, 2008 International Business Machines and others.
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // $Id: IpMatrix.hpp 2476 2014-04-08 09:41:07Z stefan $
6 //
7 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
8 
9 #ifndef __IPMATRIX_HPP__
10 #define __IPMATRIX_HPP__
11 
12 #include "IpVector.hpp"
13 
14 namespace Ipopt
15 {
16 
17  /* forward declarations */
18  class MatrixSpace;
19 
27  class Matrix : public TaggedObject
28  {
29  public:
35  Matrix(const MatrixSpace* owner_space)
36  :
37  TaggedObject(),
38  owner_space_(owner_space),
40  {}
41 
43  virtual ~Matrix()
44  {}
46 
52  void MultVector(Number alpha, const Vector& x, Number beta,
53  Vector& y) const
54  {
55  MultVectorImpl(alpha, x, beta, y);
56  }
57 
62  void TransMultVector(Number alpha, const Vector& x, Number beta,
63  Vector& y) const
64  {
65  TransMultVectorImpl(alpha, x, beta, y);
66  }
68 
77  void AddMSinvZ(Number alpha, const Vector& S, const Vector& Z,
78  Vector& X) const;
79 
83  void SinvBlrmZMTdBr(Number alpha, const Vector& S,
84  const Vector& R, const Vector& Z,
85  const Vector& D, Vector& X) const;
87 
90  bool HasValidNumbers() const;
91 
95  inline
96  Index NRows() const;
97 
99  inline
100  Index NCols() const;
102 
108  void ComputeRowAMax(Vector& rows_norms, bool init=true) const
109  {
110  DBG_ASSERT(NRows() == rows_norms.Dim());
111  if (init) rows_norms.Set(0.);
112  ComputeRowAMaxImpl(rows_norms, init);
113  }
117  void ComputeColAMax(Vector& cols_norms, bool init=true) const
118  {
119  DBG_ASSERT(NCols() == cols_norms.Dim());
120  if (init) cols_norms.Set(0.);
121  ComputeColAMaxImpl(cols_norms, init);
122  }
124 
129  virtual void Print(SmartPtr<const Journalist> jnlst,
130  EJournalLevel level,
131  EJournalCategory category,
132  const std::string& name,
133  Index indent=0,
134  const std::string& prefix="") const;
135  virtual void Print(const Journalist& jnlst,
136  EJournalLevel level,
137  EJournalCategory category,
138  const std::string& name,
139  Index indent=0,
140  const std::string& prefix="") const;
142 
144  inline
146 
147  protected:
155  virtual void MultVectorImpl(Number alpha, const Vector& x, Number beta, Vector& y) const =0;
156 
160  virtual void TransMultVectorImpl(Number alpha, const Vector& x, Number beta, Vector& y) const =0;
161 
166  virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z,
167  Vector& X) const;
168 
172  virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S,
173  const Vector& R, const Vector& Z,
174  const Vector& D, Vector& X) const;
175 
179  virtual bool HasValidNumbersImpl() const
180  {
181  return true;
182  }
183 
187  virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const = 0;
191  virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const = 0;
192 
194  virtual void PrintImpl(const Journalist& jnlst,
195  EJournalLevel level,
196  EJournalCategory category,
197  const std::string& name,
198  Index indent,
199  const std::string& prefix) const =0;
201 
202  private:
212  Matrix();
213 
215  Matrix(const Matrix&);
216 
218  Matrix& operator=(const Matrix&);
220 
222 
226  mutable bool cached_valid_;
228  };
229 
230 
240  {
241  public:
247  MatrixSpace(Index nRows, Index nCols)
248  :
249  nRows_(nRows),
250  nCols_(nCols)
251  {}
252 
254  virtual ~MatrixSpace()
255  {}
257 
261  virtual Matrix* MakeNew() const=0;
262 
264  Index NRows() const
265  {
266  return nRows_;
267  }
269  Index NCols() const
270  {
271  return nCols_;
272  }
273 
277  bool IsMatrixFromSpace(const Matrix& matrix) const
278  {
279  return (matrix.OwnerSpace() == this);
280  }
281 
282  private:
292  MatrixSpace();
293 
295  MatrixSpace(const MatrixSpace&);
296 
300 
302  const Index nRows_;
304  const Index nCols_;
305  };
306 
307 
308  /* Inline Methods */
309  inline
311  {
312  return owner_space_->NRows();
313  }
314 
315  inline
317  {
318  return owner_space_->NCols();
319  }
320 
321  inline
323  {
324  return owner_space_;
325  }
326 
327 } // namespace Ipopt
328 
329 // Macro definitions for debugging matrices
330 #if COIN_IPOPT_VERBOSITY == 0
331 # define DBG_PRINT_MATRIX(__verbose_level, __mat_name, __mat)
332 #else
333 # define DBG_PRINT_MATRIX(__verbose_level, __mat_name, __mat) \
334  if (dbg_jrnl.Verbosity() >= (__verbose_level)) { \
335  if (dbg_jrnl.Jnlst()!=NULL) { \
336  (__mat).Print(dbg_jrnl.Jnlst(), \
337  J_ERROR, J_DBG, \
338  __mat_name, \
339  dbg_jrnl.IndentationLevel()*2, \
340  "# "); \
341  } \
342  }
343 #endif // #if COIN_IPOPT_VERBOSITY == 0
344 
345 #endif