Ipopt 3.11.9
Loading...
Searching...
No Matches
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// $Id: IpDenseVector.hpp 2161 2013-01-01 20:39:05Z stefan $
6//
7// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
8
9#ifndef __IPDENSEVECTOR_HPP__
10#define __IPDENSEVECTOR_HPP__
11
12#include "IpUtils.hpp"
13#include "IpVector.hpp"
14#include <map>
15
16namespace Ipopt
17{
18
19 /* forward declarations */
20 class DenseVectorSpace;
21
24 DECLARE_STD_EXCEPTION(METADATA_ERROR);
26
40 class DenseVector : public Vector
41 {
42 public:
43
48 DenseVector(const DenseVectorSpace* owner_space);
49
52 virtual ~DenseVector();
54
59
61 void SetValues(const Number *x);
62
68 inline Number* Values();
69
78 inline const Number* Values() const;
79
83 const Number* ExpandedValues() const;
84
88 {
89 return Values();
90 }
91
94 bool IsHomogeneous() const
95 {
96 return homogeneous_;
97 }
98
101 {
103 return scalar_;
104 }
106
112 void CopyToPos(Index Pos, const Vector& x);
116 void CopyFromPos(Index Pos, const Vector& x);
118
119 protected:
123 virtual void CopyImpl(const Vector& x);
124
126 virtual void ScalImpl(Number alpha);
127
129 virtual void AxpyImpl(Number alpha, const Vector &x);
130
132 virtual Number DotImpl(const Vector &x) const;
133
135 virtual Number Nrm2Impl() const;
136
138 virtual Number AsumImpl() const;
139
141 virtual Number AmaxImpl() const;
142
144 virtual void SetImpl(Number value);
145
147 virtual void ElementWiseDivideImpl(const Vector& x);
148
150 virtual void ElementWiseMultiplyImpl(const Vector& x);
151
153 virtual void ElementWiseMaxImpl(const Vector& x);
154
156 virtual void ElementWiseMinImpl(const Vector& x);
157
160
162 virtual void ElementWiseAbsImpl();
163
165 virtual void ElementWiseSqrtImpl();
166
168 virtual void ElementWiseSgnImpl();
169
171 virtual void AddScalarImpl(Number scalar);
172
174 virtual Number MaxImpl() const;
175
177 virtual Number MinImpl() const;
178
180 virtual Number SumImpl() const;
181
183 virtual Number SumLogsImpl() const;
184
189 void AddTwoVectorsImpl(Number a, const Vector& v1,
190 Number b, const Vector& v2, Number c);
192 Number FracToBoundImpl(const Vector& delta, Number tau) const;
194 void AddVectorQuotientImpl(Number a, const Vector& z, const Vector& s,
195 Number c);
197
200 /* Print the entire vector with padding */
201 virtual void PrintImpl(const Journalist& jnlst,
202 EJournalLevel level,
203 EJournalCategory category,
204 const std::string& name,
205 Index indent,
206 const std::string& prefix) const
207 {
208 PrintImplOffset(jnlst, level, category, name, indent, prefix, 1);
209 }
210 /* Print the entire vector with padding, and start counting with
211 an offset. */
212 void PrintImplOffset(const Journalist& jnlst,
213 EJournalLevel level,
214 EJournalCategory category,
215 const std::string& name,
216 Index indent,
217 const std::string& prefix,
218 Index offset) const;
220 friend class ParVector;
221
222 private:
233
236
238 void operator=(const DenseVector&);
240
245
248
251
254 inline
256
260
266
270
274 };
275
279 typedef std::map<std::string, std::vector<std::string> > StringMetaDataMapType;
280 typedef std::map<std::string, std::vector<Index> > IntegerMetaDataMapType;
281 typedef std::map<std::string, std::vector<Number> > NumericMetaDataMapType;
282
286 {
287 public:
294 :
295 VectorSpace(dim)
296 {}
297
302
304 inline
306 {
307 return new DenseVector(this);
308 }
309
313 virtual Vector* MakeNew() const
314 {
315 return MakeNewDenseVector();
316 }
317
324 inline
326
328 inline
329 void FreeInternalStorage(Number* values) const;
331
336 inline
337 bool HasStringMetaData(const std::string tag) const;
338
340 inline
341 bool HasIntegerMetaData(const std::string tag) const;
342
344 inline
345 bool HasNumericMetaData(const std::string tag) const;
346
348 inline
349 const std::vector<std::string>& GetStringMetaData(const std::string& tag) const;
350
352 inline
353 const std::vector<Index>& GetIntegerMetaData(const std::string& tag) const;
354
356 inline
357 const std::vector<Number>& GetNumericMetaData(const std::string& tag) const;
358
360 inline
361 void SetStringMetaData(std::string tag, std::vector<std::string> meta_data);
362
364 inline
365 void SetIntegerMetaData(std::string tag, std::vector<Index> meta_data);
366
368 inline
369 void SetNumericMetaData(std::string tag, std::vector<Number> meta_data);
370
372 inline
374
376 inline
378
380 inline
383
384 private:
385 // variables to store vector meta data
389
390 };
391
392 // inline functions
394 {
395 // Here we assume that every time someone requests this direct raw
396 // pointer, the data is going to change and the Tag for this
397 // vector has to be updated.
398
399 if (initialized_ && homogeneous_) {
400 // If currently the vector is a homogeneous vector, set all elements
401 // explicitly to this value
403 }
405 initialized_= true;
406 homogeneous_ = false;
407 return values_allocated();
408 }
409
410 inline const Number* DenseVector::Values() const
411 {
412 DBG_ASSERT(initialized_ && (Dim()==0 || values_));
413 return values_;
414 }
415
417 {
418 if (values_==NULL) {
420 }
421 return values_;
422 }
423
424 inline
426 {
427 if (Dim()>0) {
428 return new Number[Dim()];
429 }
430 else {
431 return NULL;
432 }
433 }
434
435 inline
437 {
438 delete [] values;
439 }
440
441 inline
446
447 inline
448 bool DenseVectorSpace::HasStringMetaData(const std::string tag) const
449 {
450 StringMetaDataMapType::const_iterator iter;
451 iter = string_meta_data_.find(tag);
452
453 if (iter != string_meta_data_.end()) {
454 return true;
455 }
456
457 return false;
458 }
459
460 inline
461 bool DenseVectorSpace::HasIntegerMetaData(const std::string tag) const
462 {
463 IntegerMetaDataMapType::const_iterator iter;
464 iter = integer_meta_data_.find(tag);
465
466 if (iter != integer_meta_data_.end()) {
467 return true;
468 }
469
470 return false;
471 }
472
473 inline
474 bool DenseVectorSpace::HasNumericMetaData(const std::string tag) const
475 {
476 NumericMetaDataMapType::const_iterator iter;
477 iter = numeric_meta_data_.find(tag);
478
479 if (iter != numeric_meta_data_.end()) {
480 return true;
481 }
482
483 return false;
484 }
485
486 inline
487 const std::vector<std::string>& DenseVectorSpace::GetStringMetaData(const std::string& tag) const
488 {
490 StringMetaDataMapType::const_iterator iter;
491 iter = string_meta_data_.find(tag);
492 return iter->second;
493 }
494
495 inline
496 const std::vector<Index>& DenseVectorSpace::GetIntegerMetaData(const std::string& tag) const
497 {
499 IntegerMetaDataMapType::const_iterator iter;
500 iter = integer_meta_data_.find(tag);
501 return iter->second;
502 }
503
504 inline
505 const std::vector<Number>& DenseVectorSpace::GetNumericMetaData(const std::string& tag) const
506 {
508 NumericMetaDataMapType::const_iterator iter;
509 iter = numeric_meta_data_.find(tag);
510 return iter->second;
511 }
512
513 inline
514 void DenseVectorSpace::SetStringMetaData(std::string tag, std::vector<std::string> meta_data)
515 {
516 string_meta_data_[tag] = meta_data;
517 }
518
519 inline
520 void DenseVectorSpace::SetIntegerMetaData(std::string tag, std::vector<Index> meta_data)
521 {
522 integer_meta_data_[tag] = meta_data;
523 }
524
525 inline
526 void DenseVectorSpace::SetNumericMetaData(std::string tag, std::vector<Number> meta_data)
527 {
528 numeric_meta_data_[tag] = meta_data;
529 }
530
531 inline
536
537 inline
542
543 inline
548
549} // namespace Ipopt
550#endif
#define DBG_ASSERT(test)
Definition IpDebug.hpp:38
#define DECLARE_STD_EXCEPTION(__except_type)
Number * x
Input: Starting point Output: Optimal solution.
This vectors space is the vector space for DenseVector.
Number * AllocateInternalStorage() const
Allocate internal storage for the DenseVector.
const NumericMetaDataMapType & GetNumericMetaData() const
Get map of meta data of type Number.
bool HasIntegerMetaData(const std::string tag) const
Check if Integer meta exists for tag.
void SetStringMetaData(std::string tag, std::vector< std::string > meta_data)
Set meta data of type std::string by tag.
const StringMetaDataMapType & GetStringMetaData() const
Get map of meta data of type Number.
StringMetaDataMapType string_meta_data_
bool HasStringMetaData(const std::string tag) const
Check if string meta exists for tag.
NumericMetaDataMapType numeric_meta_data_
bool HasNumericMetaData(const std::string tag) const
Check if Numeric meta exists for tag.
DenseVectorSpace(Index dim)
Constructor, requires dimension of all vector for this VectorSpace.
void SetIntegerMetaData(std::string tag, std::vector< Index > meta_data)
Set meta data of type Index by tag.
IntegerMetaDataMapType integer_meta_data_
void SetNumericMetaData(std::string tag, std::vector< Number > meta_data)
Set meta data of type Number by tag.
void FreeInternalStorage(Number *values) const
Deallocate internal storage for the DenseVector.
DenseVector * MakeNewDenseVector() const
Method for creating a new vector of this specific type.
const IntegerMetaDataMapType & GetIntegerMetaData() const
Get map of meta data of type Number.
virtual Vector * MakeNew() const
Instantiation of the generate MakeNew method for the VectorSpace base class.
Dense Vector Implementation.
virtual Number DotImpl(const Vector &x) const
Computes inner product of vector x with this (DDOT)
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)
Number * ExpandedValues()
This is the same as Values, but we add it here so that ExpandedValues can also be used for the non-co...
bool initialized_
Flag for Initialization.
void operator=(const DenseVector &)
Overloaded Equals Operator.
const DenseVectorSpace * owner_space_
Copy of the owner_space ptr as a DenseVectorSpace instead of a VectorSpace.
Number * values_allocated()
Method of getting 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()
Changes each entry in the vector to its sgn value.
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 square-root of the elements of the vector
virtual void SetImpl(Number value)
Set each element in the vector to the scalar alpha.
const Number * ExpandedValues() const
The same as the const version of Values, but we ensure that we always return a valid array,...
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()
Auxilliary 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)
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 value 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 homogenous.
DenseVector(const DenseVector &)
Copy Constructor.
SmartPtr< DenseVector > MakeNewDenseVector() const
Create a new DenseVector from same VectorSpace.
virtual void ElementWiseAbsImpl()
take abs 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 the vector.
Number Scalar() const
Scalar value of all entries in a homogeneous vector.
virtual Number SumLogsImpl() const
Computes the sum of the logs of the elements of vector.
virtual void ElementWiseMaxImpl(const Vector &x)
Set entry to max of itself and the corresponding element 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
Computes the sum of the lements of vector.
Number * Values()
Obtain pointer to the internal Number array with vector elements with the indention to change the vec...
DenseVector()
Default Constructor.
virtual void ElementWiseMinImpl(const Vector &x)
Set entry to min of itself and the corresponding element in x.
Number * values_
Dense Number array of vector values.
Class responsible for all message output.
Template class for Smart Pointers.
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:391
Index Dim() const
Accessor function for the dimension of the vectors of this type.
Definition IpVector.hpp:411
Vector Base Class.
Definition IpVector.hpp:48
Index Dim() const
Dimension of the Vector.
Definition IpVector.hpp:739
std::map< std::string, std::vector< Number > > NumericMetaDataMapType
EJournalCategory
Category Selection Enum.
std::map< std::string, std::vector< Index > > IntegerMetaDataMapType
int Index
Type of all indices of vectors, matrices etc.
Definition IpTypes.hpp:19
std::map< std::string, std::vector< std::string > > StringMetaDataMapType
typedefs for the map variables that define meta data for the DenseVectorSpace
EJournalLevel
Print Level Enum.
double Number
Type of all numbers.
Definition IpTypes.hpp:17