summaryrefslogtreecommitdiff
path: root/thirdparty/linux/include/coin/IpCompoundSymMatrix.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/linux/include/coin/IpCompoundSymMatrix.hpp')
-rw-r--r--thirdparty/linux/include/coin/IpCompoundSymMatrix.hpp283
1 files changed, 283 insertions, 0 deletions
diff --git a/thirdparty/linux/include/coin/IpCompoundSymMatrix.hpp b/thirdparty/linux/include/coin/IpCompoundSymMatrix.hpp
new file mode 100644
index 0000000..4ca18fe
--- /dev/null
+++ b/thirdparty/linux/include/coin/IpCompoundSymMatrix.hpp
@@ -0,0 +1,283 @@
+// 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