You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
6.8 KiB
212 lines
6.8 KiB
// Copyright (C) 2004, 2009 International Business Machines and others.
|
|
// All Rights Reserved.
|
|
// This code is published under the Eclipse Public License.
|
|
//
|
|
// $Id: IpExpansionMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $
|
|
//
|
|
// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
|
|
|
|
#ifndef __IPEXPANSIONMATRIX_HPP__
|
|
#define __IPEXPANSIONMATRIX_HPP__
|
|
|
|
#include "IpUtils.hpp"
|
|
#include "IpMatrix.hpp"
|
|
|
|
namespace Ipopt
|
|
{
|
|
|
|
/** forward declarations */
|
|
class ExpansionMatrixSpace;
|
|
|
|
/** Class for expansion/projection matrices. These matrices allow
|
|
* to lift a vector to a vector with larger dimension, keeping
|
|
* some elements of the larger vector zero. This operation is achieved
|
|
* by the MultVector operation. The transpose operation then
|
|
* filters some elements from a large vector into a smaller vector.
|
|
*/
|
|
class ExpansionMatrix : public Matrix
|
|
{
|
|
public:
|
|
|
|
/**@name Constructors / Destructors */
|
|
//@{
|
|
|
|
/** Constructor, taking the owner_space.
|
|
*/
|
|
ExpansionMatrix(const ExpansionMatrixSpace* owner_space);
|
|
|
|
/** Destructor */
|
|
~ExpansionMatrix();
|
|
//@}
|
|
|
|
/** Return the vector of indices marking the expanded position.
|
|
* The result is the Index array (of length NSmallVec=NCols())
|
|
* that stores the mapping from the small vector to the large
|
|
* vector. For each element i=0,..,NSmallVec in the small
|
|
* vector, ExpandedPosIndices()[i] give the corresponding index
|
|
* in the large vector.
|
|
*/
|
|
const Index* ExpandedPosIndices() const;
|
|
|
|
/** Return the vector of indices marking the compressed position.
|
|
* The result is the Index array (of length NLargeVec=NRows())
|
|
* that stores the mapping from the large vector to the small
|
|
* vector. For each element i=0,..,NLargeVec in the large
|
|
* vector, CompressedPosIndices()[i] gives the corresponding
|
|
* index in the small vector, unless CompressedPosIndices()[i] is
|
|
* negative.
|
|
*/
|
|
const Index* CompressedPosIndices() const;
|
|
|
|
protected:
|
|
/**@name Overloaded methods from Matrix base class*/
|
|
//@{
|
|
virtual void MultVectorImpl(Number alpha, const Vector &x, Number beta,
|
|
Vector &y) const;
|
|
|
|
virtual void TransMultVectorImpl(Number alpha, const Vector& x,
|
|
Number beta, Vector& y) const;
|
|
|
|
/** X = beta*X + alpha*(Matrix S^{-1} Z). Specialized implementation.
|
|
*/
|
|
virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z,
|
|
Vector& X) const;
|
|
|
|
/** X = S^{-1} (r + alpha*Z*M^Td). Specialized implementation.
|
|
*/
|
|
virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S,
|
|
const Vector& R, const Vector& Z,
|
|
const Vector& D, Vector& X) const;
|
|
|
|
virtual void ComputeRowAMaxImpl(Vector& rows_norms, bool init) const;
|
|
|
|
virtual void ComputeColAMaxImpl(Vector& cols_norms, bool init) const;
|
|
|
|
virtual void PrintImpl(const Journalist& jnlst,
|
|
EJournalLevel level,
|
|
EJournalCategory category,
|
|
const std::string& name,
|
|
Index indent,
|
|
const std::string& prefix) const
|
|
{
|
|
PrintImplOffset(jnlst, level, category, name, indent, prefix, 1, 1);
|
|
}
|
|
//@}
|
|
|
|
void PrintImplOffset(const Journalist& jnlst,
|
|
EJournalLevel level,
|
|
EJournalCategory category,
|
|
const std::string& name,
|
|
Index indent,
|
|
const std::string& prefix,
|
|
Index row_offset,
|
|
Index col_offset) const;
|
|
|
|
friend class ParExpansionMatrix;
|
|
|
|
private:
|
|
/**@name Default Compiler Generated Methods
|
|
* (Hidden to avoid implicit creation/calling).
|
|
* These methods are not implemented and
|
|
* we do not want the compiler to implement
|
|
* them for us, so we declare them private
|
|
* and do not define them. This ensures that
|
|
* they will not be implicitly created/called. */
|
|
//@{
|
|
/** Default Constructor */
|
|
ExpansionMatrix();
|
|
|
|
/** Copy Constructor */
|
|
ExpansionMatrix(const ExpansionMatrix&);
|
|
|
|
/** Overloaded Equals Operator */
|
|
void operator=(const ExpansionMatrix&);
|
|
//@}
|
|
|
|
const ExpansionMatrixSpace* owner_space_;
|
|
|
|
};
|
|
|
|
/** This is the matrix space for ExpansionMatrix.
|
|
*/
|
|
class ExpansionMatrixSpace : public MatrixSpace
|
|
{
|
|
public:
|
|
/** @name Constructors / Destructors */
|
|
//@{
|
|
/** Constructor, given the list of elements of the large vector
|
|
* (of size NLargeVec) to be filtered into the small vector (of
|
|
* size NSmallVec). For each i=0..NSmallVec-1 the i-th element
|
|
* of the small vector will be put into the ExpPos[i] position of
|
|
* the large vector. The position counting in the vector is
|
|
* assumed to start at 0 (C-like array notation).
|
|
*/
|
|
ExpansionMatrixSpace(Index NLargeVec,
|
|
Index NSmallVec,
|
|
const Index *ExpPos,
|
|
const int offset = 0);
|
|
|
|
/** Destructor */
|
|
~ExpansionMatrixSpace()
|
|
{
|
|
delete [] compressed_pos_;
|
|
delete [] expanded_pos_;
|
|
}
|
|
//@}
|
|
|
|
/** Method for creating a new matrix of this specific type. */
|
|
ExpansionMatrix* MakeNewExpansionMatrix() const
|
|
{
|
|
return new ExpansionMatrix(this);
|
|
}
|
|
|
|
/** Overloaded MakeNew method for the MatrixSpace base class.
|
|
*/
|
|
virtual Matrix* MakeNew() const
|
|
{
|
|
return MakeNewExpansionMatrix();
|
|
}
|
|
|
|
/** Accessor Method to obtain the Index array (of length
|
|
* NSmallVec=NCols()) that stores the mapping from the small
|
|
* vector to the large vector. For each element i=0,..,NSmallVec
|
|
* in the small vector, ExpandedPosIndices()[i] give the
|
|
* corresponding index in the large vector.
|
|
*/
|
|
const Index* ExpandedPosIndices() const
|
|
{
|
|
return expanded_pos_;
|
|
}
|
|
|
|
/** Accessor Method to obtain the Index array (of length
|
|
* NLargeVec=NRows()) that stores the mapping from the large
|
|
* vector to the small vector. For each element i=0,..,NLargeVec
|
|
* in the large vector, CompressedPosIndices()[i] gives the
|
|
* corresponding index in the small vector, unless
|
|
* CompressedPosIndices()[i] is negative.
|
|
*/
|
|
const Index* CompressedPosIndices() const
|
|
{
|
|
return compressed_pos_;
|
|
}
|
|
|
|
private:
|
|
Index *expanded_pos_;
|
|
Index *compressed_pos_;
|
|
};
|
|
|
|
/* inline methods */
|
|
inline
|
|
const Index* ExpansionMatrix::ExpandedPosIndices() const
|
|
{
|
|
return owner_space_->ExpandedPosIndices();
|
|
}
|
|
|
|
inline
|
|
const Index* ExpansionMatrix::CompressedPosIndices() const
|
|
{
|
|
return owner_space_->CompressedPosIndices();
|
|
}
|
|
|
|
} // namespace Ipopt
|
|
#endif
|
|
|