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.
284 lines
9.2 KiB
284 lines
9.2 KiB
5 years ago
|
// Copyright (C) 2004, 2008 International Business Machines and others.
|
||
|
// All Rights Reserved.
|
||
|
// This code is published under the Eclipse Public License.
|
||
|
//
|
||
|
// $Id: IpCompoundSymMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $
|
||
|
//
|
||
|
// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
|
||
|
|
||
|
#ifndef __IPCOMPOUNDSYMMATRIX_HPP__
|
||
|
#define __IPCOMPOUNDSYMMATRIX_HPP__
|
||
|
|
||
|
#include "IpUtils.hpp"
|
||
|
#include "IpSymMatrix.hpp"
|
||
|
|
||
|
namespace Ipopt
|
||
|
{
|
||
|
|
||
|
/* forward declarations */
|
||
|
class CompoundSymMatrixSpace;
|
||
|
|
||
|
/** Class for symmetric matrices consisting of other matrices.
|
||
|
* Here, the lower left block of the matrix is stored.
|
||
|
*/
|
||
|
class CompoundSymMatrix : public SymMatrix
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
/**@name Constructors / Destructors */
|
||
|
//@{
|
||
|
|
||
|
/** Constructor, taking only the number for block components into the
|
||
|
* row and column direction. The owner_space has to be defined, so
|
||
|
* that at each block row and column contain at least one non-NULL
|
||
|
* component.
|
||
|
*/
|
||
|
CompoundSymMatrix(const CompoundSymMatrixSpace* owner_space);
|
||
|
|
||
|
/** Destructor */
|
||
|
~CompoundSymMatrix();
|
||
|
//@}
|
||
|
|
||
|
/** Method for setting an individual component at position (irow,
|
||
|
* icol) in the compound matrix. The counting of indices starts
|
||
|
* at 0. Since this only the lower left components are stored, we need
|
||
|
* to have jcol<=irow, and if irow==jcol, the matrix must be a SymMatrix */
|
||
|
void SetComp(Index irow, Index jcol, const Matrix& matrix);
|
||
|
|
||
|
/** Non const version of the same method */
|
||
|
void SetCompNonConst(Index irow, Index jcol, Matrix& matrix);
|
||
|
|
||
|
/** Method for retrieving one block from the compound matrix.
|
||
|
* Since this only the lower left components are stored, we need
|
||
|
* to have jcol<=irow */
|
||
|
SmartPtr<const Matrix> GetComp(Index irow, Index jcol) const
|
||
|
{
|
||
|
return ConstComp(irow,jcol);
|
||
|
}
|
||
|
|
||
|
/** Non const version of GetComp. You should only use this method
|
||
|
* if you are intending to change the matrix you receive, since
|
||
|
* this CompoundSymMatrix will be marked as changed. */
|
||
|
SmartPtr<Matrix> GetCompNonConst(Index irow, Index jcol)
|
||
|
{
|
||
|
ObjectChanged();
|
||
|
return Comp(irow,jcol);
|
||
|
}
|
||
|
|
||
|
/** Method for creating a new matrix of this specific type. */
|
||
|
SmartPtr<CompoundSymMatrix> MakeNewCompoundSymMatrix() const;
|
||
|
|
||
|
// The following don't seem to be necessary
|
||
|
/* Number of block rows of this compound matrix. */
|
||
|
// Index NComps_NRows() const { return NComps_Dim(); }
|
||
|
|
||
|
/* Number of block colmuns of this compound matrix. */
|
||
|
// Index NComps_NCols() const { return NComps_Dim(); }
|
||
|
|
||
|
/** Number of block rows and columns */
|
||
|
Index NComps_Dim() const;
|
||
|
|
||
|
protected:
|
||
|
/**@name Methods overloaded from matrix */
|
||
|
//@{
|
||
|
virtual void MultVectorImpl(Number alpha, const Vector& x,
|
||
|
Number beta, Vector& y) const;
|
||
|
|
||
|
/** Method for determining if all stored numbers are valid (i.e.,
|
||
|
* no Inf or Nan). */
|
||
|
virtual bool HasValidNumbersImpl() const;
|
||
|
|
||
|
virtual void ComputeRowAMaxImpl(Vector& rows_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;
|
||
|
//@}
|
||
|
|
||
|
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 */
|
||
|
CompoundSymMatrix();
|
||
|
|
||
|
/** Copy Constructor */
|
||
|
CompoundSymMatrix(const CompoundSymMatrix&);
|
||
|
|
||
|
/** Overloaded Equals Operator */
|
||
|
void operator=(const CompoundSymMatrix&);
|
||
|
//@}
|
||
|
|
||
|
/** Vector of vectors containing the components */
|
||
|
std::vector<std::vector<SmartPtr<Matrix> > > comps_;
|
||
|
|
||
|
/** Vector of vectors containing the const components */
|
||
|
std::vector<std::vector<SmartPtr<const Matrix> > > const_comps_;
|
||
|
|
||
|
/** Copy of the owner_space ptr as a CompoundSymMatrixSpace */
|
||
|
const CompoundSymMatrixSpace* owner_space_;
|
||
|
|
||
|
/** boolean indicating if the compound matrix is in a "valid" state */
|
||
|
mutable bool matrices_valid_;
|
||
|
|
||
|
/** method to check wether or not the matrices are valid */
|
||
|
bool MatricesValid() const;
|
||
|
|
||
|
/** Internal method to return a const pointer to one of the comps */
|
||
|
const Matrix* ConstComp(Index irow, Index jcol) const
|
||
|
{
|
||
|
DBG_ASSERT(irow < NComps_Dim());
|
||
|
DBG_ASSERT(jcol <= irow);
|
||
|
if (IsValid(comps_[irow][jcol])) {
|
||
|
return GetRawPtr(comps_[irow][jcol]);
|
||
|
}
|
||
|
else if (IsValid(const_comps_[irow][jcol])) {
|
||
|
return GetRawPtr(const_comps_[irow][jcol]);
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/** Internal method to return a non-const pointer to one of the comps */
|
||
|
Matrix* Comp(Index irow, Index jcol)
|
||
|
{
|
||
|
DBG_ASSERT(irow < NComps_Dim());
|
||
|
DBG_ASSERT(jcol <= irow);
|
||
|
// We shouldn't be asking for a non-const if this entry holds a
|
||
|
// const one...
|
||
|
DBG_ASSERT(IsNull(const_comps_[irow][jcol]));
|
||
|
if (IsValid(comps_[irow][jcol])) {
|
||
|
return GetRawPtr(comps_[irow][jcol]);
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/** This is the matrix space for CompoundSymMatrix. Before a
|
||
|
* CompoundSymMatrix can be created, at least one SymMatrixSpace has
|
||
|
* to be set per block row and column. Individual component
|
||
|
* SymMatrixSpace's can be set with the SetComp method.
|
||
|
*/
|
||
|
class CompoundSymMatrixSpace : public SymMatrixSpace
|
||
|
{
|
||
|
public:
|
||
|
/** @name Constructors / Destructors */
|
||
|
//@{
|
||
|
/** Constructor, given the number of blocks (same for rows and
|
||
|
* columns), as well as the total dimension of the matrix.
|
||
|
*/
|
||
|
CompoundSymMatrixSpace(Index ncomp_spaces, Index total_dim);
|
||
|
|
||
|
/** Destructor */
|
||
|
~CompoundSymMatrixSpace()
|
||
|
{}
|
||
|
//@}
|
||
|
|
||
|
/** @name Methods for setting information about the components. */
|
||
|
//@{
|
||
|
/** Set the dimension dim for block row (or column) irow_jcol */
|
||
|
void SetBlockDim(Index irow_jcol, Index dim);
|
||
|
|
||
|
/** Get the dimension dim for block row (or column) irow_jcol */
|
||
|
Index GetBlockDim(Index irow_jcol) const;
|
||
|
|
||
|
/** Set the component SymMatrixSpace. If auto_allocate is true, then
|
||
|
* a new CompoundSymMatrix created later with MakeNew will have this
|
||
|
* component automatically created with the SymMatrix's MakeNew.
|
||
|
* Otherwise, the corresponding component will be NULL and has to
|
||
|
* be set with the SetComp methods of the CompoundSymMatrix.
|
||
|
*/
|
||
|
void SetCompSpace(Index irow, Index jcol,
|
||
|
const MatrixSpace& mat_space,
|
||
|
bool auto_allocate = false);
|
||
|
//@}
|
||
|
|
||
|
/** Obtain the component MatrixSpace in block row irow and block
|
||
|
* column jcol.
|
||
|
*/
|
||
|
SmartPtr<const MatrixSpace> GetCompSpace(Index irow, Index jcol) const
|
||
|
{
|
||
|
DBG_ASSERT(irow<ncomp_spaces_);
|
||
|
DBG_ASSERT(jcol<=irow);
|
||
|
return comp_spaces_[irow][jcol];
|
||
|
}
|
||
|
|
||
|
/** @name Accessor methods */
|
||
|
//@{
|
||
|
Index NComps_Dim() const
|
||
|
{
|
||
|
return ncomp_spaces_;
|
||
|
}
|
||
|
//@}
|
||
|
|
||
|
/** Method for creating a new matrix of this specific type. */
|
||
|
CompoundSymMatrix* MakeNewCompoundSymMatrix() const;
|
||
|
|
||
|
/** Overloaded MakeNew method for the SymMatrixSpace base class.
|
||
|
*/
|
||
|
virtual SymMatrix* MakeNewSymMatrix() const
|
||
|
{
|
||
|
return MakeNewCompoundSymMatrix();
|
||
|
}
|
||
|
|
||
|
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 */
|
||
|
CompoundSymMatrixSpace();
|
||
|
|
||
|
/** Copy Constructor */
|
||
|
CompoundSymMatrixSpace(const CompoundSymMatrix&);
|
||
|
|
||
|
/** Overloaded Equals Operator */
|
||
|
CompoundSymMatrixSpace& operator=(const CompoundSymMatrixSpace&);
|
||
|
//@}
|
||
|
|
||
|
/** Number of components per row and column */
|
||
|
Index ncomp_spaces_;
|
||
|
|
||
|
/** Vector of the number of rows in each comp column,
|
||
|
* Since this is symmetric, this is also the number
|
||
|
* of columns in each row, hence, it is the dimension
|
||
|
* each of the diagonals */
|
||
|
std::vector<Index> block_dim_;
|
||
|
|
||
|
/** 2-dim std::vector of matrix spaces for the components. Only
|
||
|
* the lower right part is stored. */
|
||
|
std::vector<std::vector<SmartPtr<const MatrixSpace> > > comp_spaces_;
|
||
|
|
||
|
/** 2-dim std::vector of booleans deciding whether to
|
||
|
* allocate a new matrix for the blocks automagically */
|
||
|
std::vector<std::vector< bool > > allocate_block_;
|
||
|
|
||
|
/** boolean indicating if the compound matrix space is in a "valid" state */
|
||
|
mutable bool dimensions_set_;
|
||
|
|
||
|
/** Method to check whether or not the spaces are valid */
|
||
|
bool DimensionsSet() const;
|
||
|
};
|
||
|
|
||
|
inline
|
||
|
SmartPtr<CompoundSymMatrix> CompoundSymMatrix::MakeNewCompoundSymMatrix() const
|
||
|
{
|
||
|
return owner_space_->MakeNewCompoundSymMatrix();
|
||
|
}
|
||
|
|
||
|
} // namespace Ipopt
|
||
|
#endif
|