Ipopt Documentation  
IpDenseVector.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 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
6 
7 #ifndef __IPDENSEVECTOR_HPP__
8 #define __IPDENSEVECTOR_HPP__
9 
10 #include "IpUtils.hpp"
11 #include "IpVector.hpp"
12 #include <map>
13 
14 namespace Ipopt
15 {
16 
17 /* forward declarations */
18 class DenseVectorSpace;
19 
22 DECLARE_STD_EXCEPTION(METADATA_ERROR);
24 
41 {
42 public:
45 
48  const DenseVectorSpace* owner_space
49  );
50 
53  virtual ~DenseVector();
55 
58 
59  SmartPtr<DenseVector> MakeNewDenseVector() const;
60 
62  void SetValues(
63  const Number* x
64  );
65 
71  inline Number* Values();
72 
84  inline const Number* Values() const;
85 
90  const Number* ExpandedValues() const;
91 
96  {
97  return Values();
98  }
99 
103  bool IsHomogeneous() const
104  {
105  return homogeneous_;
106  }
107 
109  Number Scalar() const
110  {
111  DBG_ASSERT(homogeneous_);
112  return scalar_;
113  }
115 
118 
123  void CopyToPos(
124  Index Pos,
125  const Vector& x
126  );
127 
134  Index Pos,
135  const Vector& x
136  );
138 
139 protected:
142  virtual void CopyImpl(
143  const Vector& x
144  );
145 
146  virtual void ScalImpl(
147  Number alpha
148  );
149 
150  virtual void AxpyImpl(
151  Number alpha,
152  const Vector& x
153  );
154 
155  virtual Number DotImpl(
156  const Vector& x
157  ) const;
158 
159  virtual Number Nrm2Impl() const;
160 
161  virtual Number AsumImpl() const;
162 
163  virtual Number AmaxImpl() const;
164 
165  virtual void SetImpl(
166  Number value
167  );
168 
169  virtual void ElementWiseDivideImpl(
170  const Vector& x
171  );
172 
174  const Vector& x
175  );
176 
177  virtual void ElementWiseSelectImpl(
178  const Vector& x
179  );
180 
181  virtual void ElementWiseMaxImpl(
182  const Vector& x
183  );
184 
185  virtual void ElementWiseMinImpl(
186  const Vector& x
187  );
188 
190 
191  virtual void ElementWiseAbsImpl();
192 
193  virtual void ElementWiseSqrtImpl();
194 
195  virtual void ElementWiseSgnImpl();
196 
197  virtual void AddScalarImpl(
198  Number scalar
199  );
200 
201  virtual Number MaxImpl() const;
202 
203  virtual Number MinImpl() const;
204 
205  virtual Number SumImpl() const;
206 
207  virtual Number SumLogsImpl() const;
209 
212 
217  Number a,
218  const Vector& v1,
219  Number b,
220  const Vector& v2,
221  Number c
222  );
223 
226  const Vector& delta,
227  Number tau
228  ) const;
229 
232  Number a,
233  const Vector& z,
234  const Vector& s,
235  Number c
236  );
238 
241  virtual void PrintImpl(
242  const Journalist& jnlst,
243  EJournalLevel level,
244  EJournalCategory category,
245  const std::string& name,
246  Index indent,
247  const std::string& prefix
248  ) const
249  {
250  PrintImplOffset(jnlst, level, category, name, indent, prefix, 1);
251  }
252 
253  /* Print the entire vector with padding, and start counting with an offset. */
255  const Journalist& jnlst,
256  EJournalLevel level,
257  EJournalCategory category,
258  const std::string& name,
259  Index indent,
260  const std::string& prefix,
261  Index offset
262  ) const;
264 
265  friend class ParVector;
266 
267 private:
276 
278 
281  const DenseVector&
282  );
283 
285  void operator=(
286  const DenseVector&
287  );
289 
292 
295 
298 
300  inline Number* values_allocated();
301 
307 
315 
318 
323 };
324 
327 typedef std::map<std::string, std::vector<std::string> > StringMetaDataMapType;
328 typedef std::map<std::string, std::vector<Index> > IntegerMetaDataMapType;
329 typedef std::map<std::string, std::vector<Number> > NumericMetaDataMapType;
331 
334 {
335 public:
338 
340  Index dim
341  )
342  : VectorSpace(dim)
343  { }
344 
347  { }
349 
352  {
353  return new DenseVector(this);
354  }
355 
356  virtual Vector* MakeNew() const
357  {
358  return MakeNewDenseVector();
359  }
360 
367 
368  inline Number* AllocateInternalStorage() const;
369 
371  inline void FreeInternalStorage(
372  Number* values
373  ) const;
375 
379 
380  inline
381  bool HasStringMetaData(
382  const std::string& tag
383  ) const;
384 
386  inline
387  bool HasIntegerMetaData(
388  const std::string& tag
389  ) const;
390 
392  inline
393  bool HasNumericMetaData(
394  const std::string& tag
395  ) const;
396 
398  inline const std::vector<std::string>& GetStringMetaData(
399  const std::string& tag
400  ) const;
401 
403  inline const std::vector<Index>& GetIntegerMetaData(
404  const std::string& tag
405  ) const;
406 
408  inline const std::vector<Number>& GetNumericMetaData(
409  const std::string& tag
410  ) const;
411 
413  inline void SetStringMetaData(
414  const std::string& tag,
415  const std::vector<std::string>& meta_data
416  );
417 
419  inline void SetIntegerMetaData(
420  const std::string& tag,
421  const std::vector<Index>& meta_data
422  );
423 
425  inline void SetNumericMetaData(
426  const std::string& tag,
427  const std::vector<Number>& meta_data
428  );
429 
431  inline const StringMetaDataMapType& GetStringMetaData() const;
432 
434  inline const IntegerMetaDataMapType& GetIntegerMetaData() const;
435 
437  inline const NumericMetaDataMapType& GetNumericMetaData() const;
439 
440 private:
441  // variables to store vector meta data
445 };
446 
447 // inline functions
449 {
450  // Here we assume that every time someone requests this direct raw
451  // pointer, the data is going to change and the Tag for this
452  // vector has to be updated.
453 
454  if( initialized_ && homogeneous_ )
455  {
456  // If currently the vector is a homogeneous vector, set all elements
457  // explicitly to this value
459  }
460  ObjectChanged();
461  initialized_ = true;
462  homogeneous_ = false;
464  DBG_ASSERT(Dim() == 0 || values_ != NULL);
465  return values_;
466 }
467 
468 inline const Number* DenseVector::Values() const
469 {
470  DBG_ASSERT(initialized_ && (Dim() == 0 || values_));
471  return values_;
472 }
473 
475 {
476  if( values_ == NULL )
477  {
479  }
480  return values_;
481 }
482 
484 {
485  if( Dim() > 0 )
486  {
487  return new Number[Dim()];
488  }
489  else
490  {
491  return NULL;
492  }
493 }
494 
495 inline
497  Number* values
498 ) const
499 {
500  delete[] values;
501 }
502 
504 {
506 }
507 
508 inline
510  const std::string& tag
511 ) const
512 {
513  StringMetaDataMapType::const_iterator iter;
514  iter = string_meta_data_.find(tag);
515 
516  if( iter != string_meta_data_.end() )
517  {
518  return true;
519  }
520 
521  return false;
522 }
523 
524 inline
526  const std::string& tag
527 ) const
528 {
529  IntegerMetaDataMapType::const_iterator iter;
530  iter = integer_meta_data_.find(tag);
531 
532  if( iter != integer_meta_data_.end() )
533  {
534  return true;
535  }
536 
537  return false;
538 }
539 
540 inline
542  const std::string& tag
543 ) const
544 {
545  NumericMetaDataMapType::const_iterator iter;
546  iter = numeric_meta_data_.find(tag);
547 
548  if( iter != numeric_meta_data_.end() )
549  {
550  return true;
551  }
552 
553  return false;
554 }
555 
556 inline const std::vector<std::string>& DenseVectorSpace::GetStringMetaData(
557  const std::string& tag
558 ) const
559 {
561  StringMetaDataMapType::const_iterator iter;
562  iter = string_meta_data_.find(tag);
563  return iter->second;
564 }
565 
566 inline const std::vector<Index>& DenseVectorSpace::GetIntegerMetaData(
567  const std::string& tag
568 ) const
569 {
571  IntegerMetaDataMapType::const_iterator iter;
572  iter = integer_meta_data_.find(tag);
573  return iter->second;
574 }
575 
576 inline const std::vector<Number>& DenseVectorSpace::GetNumericMetaData(
577  const std::string& tag
578 ) const
579 {
581  NumericMetaDataMapType::const_iterator iter;
582  iter = numeric_meta_data_.find(tag);
583  return iter->second;
584 }
585 
587  const std::string& tag,
588  const std::vector<std::string>& meta_data
589 )
590 {
591  string_meta_data_[tag] = meta_data;
592 }
593 
595  const std::string& tag,
596  const std::vector<Index>& meta_data
597 )
598 {
599  integer_meta_data_[tag] = meta_data;
600 }
601 
603  const std::string& tag,
604  const std::vector<Number>& meta_data
605 )
606 {
607  numeric_meta_data_[tag] = meta_data;
608 }
609 
611 {
612  return string_meta_data_;
613 }
614 
616 {
617  return integer_meta_data_;
618 }
619 
621 {
622  return numeric_meta_data_;
623 }
624 
625 } // namespace Ipopt
626 #endif
#define DBG_ASSERT(test)
Definition: IpDebug.hpp:27
This vectors space is the vector space for DenseVector.
void SetNumericMetaData(const std::string &tag, const std::vector< Number > &meta_data)
Set meta data of type Number by tag.
void SetStringMetaData(const std::string &tag, const std::vector< std::string > &meta_data)
Set meta data of type std::string by tag.
Number * AllocateInternalStorage() const
Allocate internal storage for the DenseVector.
const NumericMetaDataMapType & GetNumericMetaData() const
Get map of meta data of type Number.
const StringMetaDataMapType & GetStringMetaData() const
Get map of meta data of type Number.
StringMetaDataMapType string_meta_data_
NumericMetaDataMapType numeric_meta_data_
DenseVectorSpace(Index dim)
Constructor, requires dimension of all vector for this VectorSpace.
void SetIntegerMetaData(const std::string &tag, const std::vector< Index > &meta_data)
Set meta data of type Index by tag.
virtual Vector * MakeNew() const
Pure virtual method for creating a new Vector of the corresponding type.
IntegerMetaDataMapType integer_meta_data_
bool HasStringMetaData(const std::string &tag) const
Check if string meta exists for tag.
void FreeInternalStorage(Number *values) const
Deallocate internal storage for the DenseVector.
bool HasNumericMetaData(const std::string &tag) const
Check if Numeric meta exists for tag.
bool HasIntegerMetaData(const std::string &tag) const
Check if Integer meta exists for tag.
~DenseVectorSpace()
Destructor.
const IntegerMetaDataMapType & GetIntegerMetaData() const
Get map of meta data of type Number.
DenseVector * MakeNewDenseVector() const
Method for creating a new vector of this specific type.
Dense Vector Implementation.
virtual Number DotImpl(const Vector &x) const
Computes inner product of vector x with this (DDOT)
const Number * ExpandedValues() const
The same as the const version of Values, but we ensure that we always return a valid array,...
void AddVectorQuotientImpl(Number a, const Vector &z, const Vector &s, Number c)
Add the quotient of two vectors, y = a * z/s + c * y.
void SetValues(const Number *x)
Set elements in the vector to the Number array x.
virtual void AxpyImpl(Number alpha, const Vector &x)
Add the multiple alpha of vector x to this vector (DAXPY)
bool initialized_
Flag for Initialization.
void operator=(const DenseVector &)
Default Assignment Operator.
const DenseVectorSpace * owner_space_
Copy of the owner_space ptr as a DenseVectorSpace instead of a VectorSpace.
Number * values_allocated()
Get the internal values array, making sure that memory has been allocated.
bool IsHomogeneous() const
Indicates if the vector is homogeneous (i.e., all entries have the value Scalar().
virtual void ElementWiseSgnImpl()
Replaces entries with sgn of the entry.
Number * expanded_values_
Dense Number array pointer that is used for ExpandedValues.
virtual void ElementWiseDivideImpl(const Vector &x)
Element-wise division .
DenseVector(const DenseVectorSpace *owner_space)
Default Constructor.
virtual void ElementWiseSqrtImpl()
Take elementwise square-root of the elements of the vector.
Number * ExpandedValues()
This is the same as Values, but we add it here so that ExpandedValues can also be used for the non-co...
virtual void SetImpl(Number value)
Set each element in the vector to the scalar alpha.
void AddTwoVectorsImpl(Number a, const Vector &v1, Number b, const Vector &v2, Number c)
Add two vectors (a * v1 + b * v2).
void PrintImplOffset(const Journalist &jnlst, EJournalLevel level, EJournalCategory category, const std::string &name, Index indent, const std::string &prefix, Index offset) const
void set_values_from_scalar()
Auxiliary method for setting explicitly all elements in values_ to the current scalar value.
Number FracToBoundImpl(const Vector &delta, Number tau) const
Fraction to the boundary parameter.
virtual Number Nrm2Impl() const
Computes the 2-norm of this vector (DNRM2)
virtual void ElementWiseSelectImpl(const Vector &x)
Element-wise selection .
void CopyFromPos(Index Pos, const Vector &x)
Copy a subrange of x, starting at Pos, into the full data of this vector.
virtual Number MinImpl() const
Min number in the vector.
virtual void ScalImpl(Number alpha)
Scales the vector by scalar alpha (DSCAL)
virtual ~DenseVector()
Destructor.
virtual void CopyImpl(const Vector &x)
Copy the data of the vector x into this vector (DCOPY).
bool homogeneous_
Flag indicating whether the vector is currently homogeneous (that is, all elements have the same valu...
virtual Number AmaxImpl() const
Computes the max-norm of this vector (based on IDAMAX)
virtual void ElementWiseReciprocalImpl()
Reciprocates the elements of the vector.
Number scalar_
Homogeneous value of all elements if the vector is currently homogeneous.
DenseVector(const DenseVector &)
Copy Constructor.
SmartPtr< DenseVector > MakeNewDenseVector() const
Create a new DenseVector from same VectorSpace.
virtual void ElementWiseAbsImpl()
Take elementwise absolute values of the elements of the vector.
virtual Number MaxImpl() const
Max value in the vector.
virtual void ElementWiseMultiplyImpl(const Vector &x)
Element-wise multiplication .
virtual void PrintImpl(const Journalist &jnlst, EJournalLevel level, EJournalCategory category, const std::string &name, Index indent, const std::string &prefix) const
Print the entire vector.
virtual void AddScalarImpl(Number scalar)
Add scalar to every component of vector.
Number Scalar() const
Scalar value of all entries in a homogeneous vector.
virtual Number SumLogsImpl() const
Sum of logs of entries in the vector.
virtual void ElementWiseMaxImpl(const Vector &x)
Element-wise max against entries in x.
virtual Number AsumImpl() const
Computes the 1-norm of this vector (DASUM)
void CopyToPos(Index Pos, const Vector &x)
Copy the data in x into the subrange of this vector starting at position Pos in this vector.
virtual Number SumImpl() const
Sum of entries in the vector.
Number * Values()
Obtain pointer to the internal Number array with vector elements with the intention to change the vec...
DenseVector()
Default Constructor.
virtual void ElementWiseMinImpl(const Vector &x)
Element-wise min against entries in x.
Number * values_
Dense Number array of vector values.
Class responsible for all message output.
Template class for Smart Pointers.
Definition: IpSmartPtr.hpp:165
void ObjectChanged()
Objects derived from TaggedObject MUST call this method every time their internal state changes to up...
VectorSpace base class, corresponding to the Vector base class.
Definition: IpVector.hpp:473
Index Dim() const
Accessor function for the dimension of the vectors of this type.
Definition: IpVector.hpp:495
Vector Base Class.
Definition: IpVector.hpp:48
Index Dim() const
Dimension of the Vector.
Definition: IpVector.hpp:858
#define IPOPTLIB_EXPORT
Definition: config.h:94
This file contains a base class for all exceptions and a set of macros to help with exceptions.
std::map< std::string, std::vector< Number > > NumericMetaDataMapType
DECLARE_STD_EXCEPTION(FATAL_ERROR_IN_LINEAR_SOLVER)
ipindex Index
Type of all indices of vectors, matrices etc.
Definition: IpTypes.hpp:20
EJournalCategory
Category Selection Enum.
std::map< std::string, std::vector< Index > > IntegerMetaDataMapType
std::map< std::string, std::vector< std::string > > StringMetaDataMapType
EJournalLevel
Print Level Enum.
ipnumber Number
Type of all numbers.
Definition: IpTypes.hpp:17