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.
		
		
		
		
		
			
		
			
				
					
					
						
							254 lines
						
					
					
						
							7.4 KiB
						
					
					
				
			
		
		
	
	
							254 lines
						
					
					
						
							7.4 KiB
						
					
					
				// Copyright (C) 2004, 2008 International Business Machines and others.
 | 
						|
// All Rights Reserved.
 | 
						|
// This code is published under the Eclipse Public License.
 | 
						|
//
 | 
						|
// $Id: IpScaledMatrix.hpp 2269 2013-05-05 11:32:40Z stefan $
 | 
						|
//
 | 
						|
// Authors:  Carl Laird, Andreas Waechter     IBM    2004-08-13
 | 
						|
 | 
						|
#ifndef __IPSCALEDMATRIX_HPP__
 | 
						|
#define __IPSCALEDMATRIX_HPP__
 | 
						|
 | 
						|
#include "IpUtils.hpp"
 | 
						|
#include "IpMatrix.hpp"
 | 
						|
 | 
						|
namespace Ipopt
 | 
						|
{
 | 
						|
 | 
						|
  /* forward declarations */
 | 
						|
  class ScaledMatrixSpace;
 | 
						|
 | 
						|
  /** Class for a Matrix in conjunction with its scaling factors for
 | 
						|
   *  row and column scaling. Operations on the matrix are performed using
 | 
						|
   *  the scaled matrix. You can pull out the pointer to the 
 | 
						|
   *  unscaled matrix for unscaled calculations.
 | 
						|
   */
 | 
						|
  class ScaledMatrix : public Matrix
 | 
						|
  {
 | 
						|
  public:
 | 
						|
 | 
						|
    /**@name Constructors / Destructors */
 | 
						|
    //@{
 | 
						|
 | 
						|
    /** Constructor, taking the owner_space.
 | 
						|
     */
 | 
						|
    ScaledMatrix(const ScaledMatrixSpace* owner_space);
 | 
						|
 | 
						|
    /** Destructor */
 | 
						|
    ~ScaledMatrix();
 | 
						|
    //@}
 | 
						|
 | 
						|
    /** Set the unscaled matrix */
 | 
						|
    void SetUnscaledMatrix(const SmartPtr<const Matrix> unscaled_matrix);
 | 
						|
 | 
						|
    /** Set the unscaled matrix in a non-const version */
 | 
						|
    void SetUnscaledMatrixNonConst(const SmartPtr<Matrix>& unscaled_matrix);
 | 
						|
 | 
						|
    /** Return the unscaled matrix in const form */
 | 
						|
    SmartPtr<const Matrix> GetUnscaledMatrix() const;
 | 
						|
 | 
						|
    /** Return the unscaled matrix in non-const form */
 | 
						|
    SmartPtr<Matrix> GetUnscaledMatrixNonConst();
 | 
						|
 | 
						|
    /** return the vector for the row scaling */
 | 
						|
    SmartPtr<const Vector> RowScaling() const;
 | 
						|
 | 
						|
    /** return the vector for the column scaling */
 | 
						|
    SmartPtr<const Vector> ColumnScaling() const;
 | 
						|
 | 
						|
  protected:
 | 
						|
    /**@name Methods overloaded from Matrix */
 | 
						|
    //@{
 | 
						|
    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;
 | 
						|
 | 
						|
    /** Method for determining if all stored numbers are valid (i.e.,
 | 
						|
     *  no Inf or Nan).  It is assumed that the scaling factors are
 | 
						|
     *  valid. */
 | 
						|
    virtual bool HasValidNumbersImpl() 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;
 | 
						|
 | 
						|
    /** X = beta*X + alpha*(Matrix S^{-1} Z).  Specialized
 | 
						|
     *  implementation missing so far!
 | 
						|
     */
 | 
						|
    virtual void AddMSinvZImpl(Number alpha, const Vector& S, const Vector& Z,
 | 
						|
                               Vector& X) const;
 | 
						|
 | 
						|
    /** X = S^{-1} (r + alpha*Z*M^Td).  Specialized implementation
 | 
						|
     *  missing so far!
 | 
						|
     */
 | 
						|
    virtual void SinvBlrmZMTdBrImpl(Number alpha, const Vector& S,
 | 
						|
                                    const Vector& R, const Vector& Z,
 | 
						|
                                    const Vector& D, Vector& X) 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 */
 | 
						|
    ScaledMatrix();
 | 
						|
 | 
						|
    /** Copy Constructor */
 | 
						|
    ScaledMatrix(const ScaledMatrix&);
 | 
						|
 | 
						|
    /** Overloaded Equals Operator */
 | 
						|
    void operator=(const ScaledMatrix&);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /** const version of the unscaled matrix */
 | 
						|
    SmartPtr<const Matrix> matrix_;
 | 
						|
    /** non-const version of the unscaled matrix */
 | 
						|
    SmartPtr<Matrix> nonconst_matrix_;
 | 
						|
 | 
						|
    /** Matrix space stored as a ScaledMatrixSpace */
 | 
						|
    SmartPtr<const ScaledMatrixSpace> owner_space_;
 | 
						|
  };
 | 
						|
 | 
						|
  /** This is the matrix space for ScaledMatrix.
 | 
						|
   */
 | 
						|
  class ScaledMatrixSpace : public MatrixSpace
 | 
						|
  {
 | 
						|
  public:
 | 
						|
    /** @name Constructors / Destructors */
 | 
						|
    //@{
 | 
						|
    /** Constructor, given the number of row and columns blocks, as
 | 
						|
     *  well as the totel number of rows and columns.
 | 
						|
     */
 | 
						|
    ScaledMatrixSpace(const SmartPtr<const Vector>& row_scaling,
 | 
						|
                      bool row_scaling_reciprocal,
 | 
						|
                      const SmartPtr<const MatrixSpace>& unscaled_matrix_space,
 | 
						|
                      const SmartPtr<const Vector>& column_scaling,
 | 
						|
                      bool column_scaling_reciprocal);
 | 
						|
 | 
						|
    /** Destructor */
 | 
						|
    ~ScaledMatrixSpace()
 | 
						|
    {}
 | 
						|
    //@}
 | 
						|
 | 
						|
    /** Method for creating a new matrix of this specific type. */
 | 
						|
    ScaledMatrix* MakeNewScaledMatrix(bool allocate_unscaled_matrix = false) const
 | 
						|
    {
 | 
						|
      ScaledMatrix* ret = new ScaledMatrix(this);
 | 
						|
      if (allocate_unscaled_matrix) {
 | 
						|
        SmartPtr<Matrix> unscaled_matrix = unscaled_matrix_space_->MakeNew();
 | 
						|
        ret->SetUnscaledMatrixNonConst(unscaled_matrix);
 | 
						|
      }
 | 
						|
      return ret;
 | 
						|
    }
 | 
						|
 | 
						|
    /** Overloaded MakeNew method for the MatrixSpace base class.
 | 
						|
     */
 | 
						|
    virtual Matrix* MakeNew() const
 | 
						|
    {
 | 
						|
      return MakeNewScaledMatrix();
 | 
						|
    }
 | 
						|
 | 
						|
    /** return the vector for the row scaling */
 | 
						|
    SmartPtr<const Vector> RowScaling() const
 | 
						|
    {
 | 
						|
      return ConstPtr(row_scaling_);
 | 
						|
    }
 | 
						|
 | 
						|
    /** return the matrix space for the unscaled matrix */
 | 
						|
    SmartPtr<const MatrixSpace> UnscaledMatrixSpace() const
 | 
						|
    {
 | 
						|
      return unscaled_matrix_space_;
 | 
						|
    }
 | 
						|
 | 
						|
    /** return the vector for the column scaling */
 | 
						|
    SmartPtr<const Vector> ColumnScaling() const
 | 
						|
    {
 | 
						|
      return ConstPtr(column_scaling_);
 | 
						|
    }
 | 
						|
 | 
						|
  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 */
 | 
						|
    ScaledMatrixSpace();
 | 
						|
 | 
						|
    /** Copy Constructor */
 | 
						|
    ScaledMatrixSpace(const ScaledMatrixSpace&);
 | 
						|
 | 
						|
    /** Overloaded Equals Operator */
 | 
						|
    ScaledMatrixSpace& operator=(const ScaledMatrixSpace&);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /** Row scaling vector */
 | 
						|
    SmartPtr<Vector> row_scaling_;
 | 
						|
    /** unscaled matrix space */
 | 
						|
    SmartPtr<const MatrixSpace> unscaled_matrix_space_;
 | 
						|
    /** column scaling vector */
 | 
						|
    SmartPtr<Vector> column_scaling_;
 | 
						|
  };
 | 
						|
 | 
						|
  inline
 | 
						|
  void ScaledMatrix::SetUnscaledMatrix(const SmartPtr<const Matrix> unscaled_matrix)
 | 
						|
  {
 | 
						|
    matrix_ = unscaled_matrix;
 | 
						|
    nonconst_matrix_ = NULL;
 | 
						|
    ObjectChanged();
 | 
						|
  }
 | 
						|
 | 
						|
  inline
 | 
						|
  void ScaledMatrix::SetUnscaledMatrixNonConst(const SmartPtr<Matrix>& unscaled_matrix)
 | 
						|
  {
 | 
						|
    nonconst_matrix_ = unscaled_matrix;
 | 
						|
    matrix_ = GetRawPtr(unscaled_matrix);
 | 
						|
    ObjectChanged();
 | 
						|
  }
 | 
						|
 | 
						|
  inline
 | 
						|
  SmartPtr<const Matrix> ScaledMatrix::GetUnscaledMatrix() const
 | 
						|
  {
 | 
						|
    return matrix_;
 | 
						|
  }
 | 
						|
 | 
						|
  inline
 | 
						|
  SmartPtr<Matrix> ScaledMatrix::GetUnscaledMatrixNonConst()
 | 
						|
  {
 | 
						|
    DBG_ASSERT(IsValid(nonconst_matrix_));
 | 
						|
    ObjectChanged();
 | 
						|
    return nonconst_matrix_;
 | 
						|
  }
 | 
						|
 | 
						|
  inline
 | 
						|
  SmartPtr<const Vector> ScaledMatrix::RowScaling() const
 | 
						|
  {
 | 
						|
    return ConstPtr(owner_space_->RowScaling());
 | 
						|
  }
 | 
						|
 | 
						|
  inline
 | 
						|
  SmartPtr<const Vector> ScaledMatrix::ColumnScaling() const
 | 
						|
  {
 | 
						|
    return ConstPtr(owner_space_->ColumnScaling());
 | 
						|
  }
 | 
						|
 | 
						|
} // namespace Ipopt
 | 
						|
 | 
						|
#endif
 | 
						|
 |