Ipopt Documentation  
 
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// 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
14namespace Ipopt
15{
16
17/* forward declarations */
18class DenseVectorSpace;
19
24
41{
42public:
45
49 );
50
53 virtual ~DenseVector();
55
58
59 SmartPtr<DenseVector> MakeNewDenseVector() const;
60
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
110 {
111 DBG_ASSERT(homogeneous_);
112 return scalar_;
113 }
115
118
124 Index Pos,
125 const Vector& x
126 );
127
134 Index Pos,
135 const Vector& x
136 );
138
139protected:
142 virtual void CopyImpl(
143 const Vector& x
144 );
145
146 virtual void ScalImpl(
148 );
149
150 virtual void AxpyImpl(
152 const Vector& x
153 );
154
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(
167 );
168
170 const Vector& x
171 );
172
174 const Vector& x
175 );
176
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(
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,
245 const std::string& name,
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,
258 const std::string& name,
260 const std::string& prefix,
262 ) const;
264
265 friend class ParVector;
266
267private:
276
278
281 const DenseVector&
282 );
283
286 const DenseVector&
287 );
289
292
295
298
300 inline Number* values_allocated();
301
307
315
318
323};
324
327typedef std::map<std::string, std::vector<std::string> > StringMetaDataMapType;
328typedef std::map<std::string, std::vector<Index> > IntegerMetaDataMapType;
329typedef std::map<std::string, std::vector<Number> > NumericMetaDataMapType;
331
334{
335public:
338
340 Index dim
341 )
343 { }
344
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(
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
440private:
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
455 {
456 // If currently the vector is a homogeneous vector, set all elements
457 // explicitly to this value
459 }
461 initialized_ = true;
462 homogeneous_ = false;
464 DBG_ASSERT(Dim() == 0 || values_ != NULL);
465 return values_;
466}
467
468inline const Number* DenseVector::Values() const
469{
470 DBG_ASSERT(initialized_ && (Dim() == 0 || values_));
471 return values_;
472}
473
475{
476 if( values_ == NULL )
477 {
478 values_ = owner_space_->AllocateInternalStorage();
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
495inline
498) const
499{
500 delete[] values;
501}
502
504{
505 return owner_space_->MakeNewDenseVector();
506}
507
508inline
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
524inline
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
540inline
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
556inline 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
566inline 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
576inline 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{
592}
593
595 const std::string& tag,
596 const std::vector<Index>& meta_data
597)
598{
600}
601
603 const std::string& tag,
604 const std::vector<Number>& meta_data
605)
606{
608}
609
614
619
624
625} // namespace Ipopt
626#endif
#define DBG_ASSERT(test)
Definition IpDebug.hpp:27
#define DECLARE_STD_EXCEPTION(__except_type)
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.
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.
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
Pure virtual method for creating a new Vector of the corresponding type.
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 &)
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.
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()
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.
Templated class which stores one entry for the CachedResult class.
Class responsible for all message output.
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
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
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