summaryrefslogtreecommitdiff
path: root/thirdparty/linux/include/coin1/IpNLPScaling.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/linux/include/coin1/IpNLPScaling.hpp')
-rw-r--r--thirdparty/linux/include/coin1/IpNLPScaling.hpp451
1 files changed, 451 insertions, 0 deletions
diff --git a/thirdparty/linux/include/coin1/IpNLPScaling.hpp b/thirdparty/linux/include/coin1/IpNLPScaling.hpp
new file mode 100644
index 0000000..be5f13d
--- /dev/null
+++ b/thirdparty/linux/include/coin1/IpNLPScaling.hpp
@@ -0,0 +1,451 @@
+// Copyright (C) 2004, 2007 International Business Machines and others.
+// All Rights Reserved.
+// This code is published under the Eclipse Public License.
+//
+// $Id: IpNLPScaling.hpp 2269 2013-05-05 11:32:40Z stefan $
+//
+// Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
+
+#ifndef __IPNLPSCALING_HPP__
+#define __IPNLPSCALING_HPP__
+
+#include "IpOptionsList.hpp"
+#include "IpRegOptions.hpp"
+
+namespace Ipopt
+{
+ // forward declarations
+ class Vector;
+ class VectorSpace;
+ class Matrix;
+ class MatrixSpace;
+ class SymMatrix;
+ class SymMatrixSpace;
+ class ScaledMatrixSpace;
+ class SymScaledMatrixSpace;
+
+ /** This is the abstract base class for problem scaling.
+ * It is repsonsible for determining the scaling factors
+ * and mapping quantities in and out of scaled and unscaled
+ * versions
+ */
+ class NLPScalingObject : public ReferencedObject
+ {
+ public:
+ /**@name Constructors/Destructors */
+ //@{
+ NLPScalingObject();
+
+ /** Default destructor */
+ virtual ~NLPScalingObject();
+ //@}
+
+ /** Method to initialize the options */
+ bool Initialize(const Journalist& jnlst,
+ const OptionsList& options,
+ const std::string& prefix)
+ {
+ jnlst_ = &jnlst;
+ return InitializeImpl(options, prefix);
+ }
+
+ /** Methods to map scaled and unscaled matrices */
+ //@{
+ /** Returns an obj-scaled version of the given scalar */
+ virtual Number apply_obj_scaling(const Number& f)=0;
+ /** Returns an obj-unscaled version of the given scalar */
+ virtual Number unapply_obj_scaling(const Number& f)=0;
+ /** Returns an x-scaled version of the given vector */
+ virtual SmartPtr<Vector>
+ apply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v)=0;
+ /** Returns an x-scaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ apply_vector_scaling_x(const SmartPtr<const Vector>& v)=0;
+ /** Returns an x-unscaled version of the given vector */
+ virtual SmartPtr<Vector>
+ unapply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v)=0;
+ /** Returns an x-unscaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ unapply_vector_scaling_x(const SmartPtr<const Vector>& v)=0;
+ /** Returns an c-scaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ apply_vector_scaling_c(const SmartPtr<const Vector>& v)=0;
+ /** Returns an c-unscaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ unapply_vector_scaling_c(const SmartPtr<const Vector>& v)=0;
+ /** Returns an c-scaled version of the given vector */
+ virtual SmartPtr<Vector>
+ apply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v)=0;
+ /** Returns an c-unscaled version of the given vector */
+ virtual SmartPtr<Vector>
+ unapply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v)=0;
+ /** Returns an d-scaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ apply_vector_scaling_d(const SmartPtr<const Vector>& v)=0;
+ /** Returns an d-unscaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ unapply_vector_scaling_d(const SmartPtr<const Vector>& v)=0;
+ /** Returns an d-scaled version of the given vector */
+ virtual SmartPtr<Vector>
+ apply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v)=0;
+ /** Returns an d-unscaled version of the given vector */
+ virtual SmartPtr<Vector>
+ unapply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v)=0;
+ /** Returns a scaled version of the jacobian for c. If the
+ * overloaded method does not make a new matrix, make sure to set
+ * the matrix ptr passed in to NULL.
+ */
+ virtual SmartPtr<const Matrix>
+ apply_jac_c_scaling(SmartPtr<const Matrix> matrix)=0;
+ /** Returns a scaled version of the jacobian for d If the
+ * overloaded method does not create a new matrix, make sure to
+ * set the matrix ptr passed in to NULL.
+ */
+ virtual SmartPtr<const Matrix>
+ apply_jac_d_scaling(SmartPtr<const Matrix> matrix)=0;
+ /** Returns a scaled version of the hessian of the lagrangian If
+ * the overloaded method does not create a new matrix, make sure
+ * to set the matrix ptr passed in to NULL.
+ */
+ virtual SmartPtr<const SymMatrix>
+ apply_hessian_scaling(SmartPtr<const SymMatrix> matrix)=0;
+ //@}
+
+ /** Methods for scaling bounds - these wrap those above */
+ //@{
+ /** Returns an x-scaled vector in the x_L or x_U space */
+ SmartPtr<Vector> apply_vector_scaling_x_LU_NonConst(
+ const Matrix& Px_LU,
+ const SmartPtr<const Vector>& lu,
+ const VectorSpace& x_space);
+ /** Returns an x-scaled vector in the x_L or x_U space */
+ SmartPtr<const Vector> apply_vector_scaling_x_LU(
+ const Matrix& Px_LU,
+ const SmartPtr<const Vector>& lu,
+ const VectorSpace& x_space);
+ /** Returns an d-scaled vector in the d_L or d_U space */
+ SmartPtr<Vector> apply_vector_scaling_d_LU_NonConst(
+ const Matrix& Pd_LU,
+ const SmartPtr<const Vector>& lu,
+ const VectorSpace& d_space);
+ /** Returns an d-scaled vector in the d_L or d_U space */
+ SmartPtr<const Vector> apply_vector_scaling_d_LU(
+ const Matrix& Pd_LU,
+ const SmartPtr<const Vector>& lu,
+ const VectorSpace& d_space);
+ /** Returns an d-unscaled vector in the d_L or d_U space */
+ SmartPtr<Vector> unapply_vector_scaling_d_LU_NonConst(
+ const Matrix& Pd_LU,
+ const SmartPtr<const Vector>& lu,
+ const VectorSpace& d_space);
+ /** Returns an d-unscaled vector in the d_L or d_U space */
+ SmartPtr<const Vector> unapply_vector_scaling_d_LU(
+ const Matrix& Pd_LU,
+ const SmartPtr<const Vector>& lu,
+ const VectorSpace& d_space);
+ //@}
+
+ /** Methods for scaling the gradient of the objective - wraps the
+ * virtual methods above
+ */
+ //@{
+ /** Returns a grad_f scaled version (d_f * D_x^{-1}) of the given vector */
+ virtual SmartPtr<Vector>
+ apply_grad_obj_scaling_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns a grad_f scaled version (d_f * D_x^{-1}) of the given vector */
+ virtual SmartPtr<const Vector>
+ apply_grad_obj_scaling(const SmartPtr<const Vector>& v);
+ /** Returns a grad_f unscaled version (d_f * D_x^{-1}) of the
+ * given vector */
+ virtual SmartPtr<Vector>
+ unapply_grad_obj_scaling_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns a grad_f unscaled version (d_f * D_x^{-1}) of the
+ * given vector */
+ virtual SmartPtr<const Vector>
+ unapply_grad_obj_scaling(const SmartPtr<const Vector>& v);
+ //@}
+
+ /** @name Methods for determining whether scaling for entities is
+ * done */
+ //@{
+ /** Returns true if the primal x variables are scaled. */
+ virtual bool have_x_scaling()=0;
+ /** Returns true if the equality constraints are scaled. */
+ virtual bool have_c_scaling()=0;
+ /** Returns true if the inequality constraints are scaled. */
+ virtual bool have_d_scaling()=0;
+ //@}
+
+ /** This method is called by the IpoptNLP's at a convenient time to
+ * compute and/or read scaling factors
+ */
+ virtual void DetermineScaling(const SmartPtr<const VectorSpace> x_space,
+ const SmartPtr<const VectorSpace> c_space,
+ const SmartPtr<const VectorSpace> d_space,
+ const SmartPtr<const MatrixSpace> jac_c_space,
+ const SmartPtr<const MatrixSpace> jac_d_space,
+ const SmartPtr<const SymMatrixSpace> h_space,
+ SmartPtr<const MatrixSpace>& new_jac_c_space,
+ SmartPtr<const MatrixSpace>& new_jac_d_space,
+ SmartPtr<const SymMatrixSpace>& new_h_space,
+ const Matrix& Px_L, const Vector& x_L,
+ const Matrix& Px_U, const Vector& x_U)=0;
+ protected:
+ /** Implementation of the initialization method that has to be
+ * overloaded by for each derived class. */
+ virtual bool InitializeImpl(const OptionsList& options,
+ const std::string& prefix)=0;
+
+ /** Accessor method for the journalist */
+ const Journalist& Jnlst() const
+ {
+ return *jnlst_;
+ }
+ 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. */
+ //@{
+
+ /** Copy Constructor */
+ NLPScalingObject(const NLPScalingObject&);
+
+ /** Overloaded Equals Operator */
+ void operator=(const NLPScalingObject&);
+ //@}
+
+ SmartPtr<const Journalist> jnlst_;
+ };
+
+ /** This is a base class for many standard scaling
+ * techniques. The overloaded classes only need to
+ * provide the scaling parameters
+ */
+ class StandardScalingBase : public NLPScalingObject
+ {
+ public:
+ /**@name Constructors/Destructors */
+ //@{
+ StandardScalingBase();
+
+ /** Default destructor */
+ virtual ~StandardScalingBase();
+ //@}
+
+ /** Methods to map scaled and unscaled matrices */
+ //@{
+ /** Returns an obj-scaled version of the given scalar */
+ virtual Number apply_obj_scaling(const Number& f);
+ /** Returns an obj-unscaled version of the given scalar */
+ virtual Number unapply_obj_scaling(const Number& f);
+ /** Returns an x-scaled version of the given vector */
+ virtual SmartPtr<Vector>
+ apply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns an x-scaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ apply_vector_scaling_x(const SmartPtr<const Vector>& v);
+ /** Returns an x-unscaled version of the given vector */
+ virtual SmartPtr<Vector>
+ unapply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns an x-unscaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ unapply_vector_scaling_x(const SmartPtr<const Vector>& v);
+ /** Returns an c-scaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ apply_vector_scaling_c(const SmartPtr<const Vector>& v);
+ /** Returns an c-unscaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ unapply_vector_scaling_c(const SmartPtr<const Vector>& v);
+ /** Returns an c-scaled version of the given vector */
+ virtual SmartPtr<Vector>
+ apply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns an c-unscaled version of the given vector */
+ virtual SmartPtr<Vector>
+ unapply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns an d-scaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ apply_vector_scaling_d(const SmartPtr<const Vector>& v);
+ /** Returns an d-unscaled version of the given vector */
+ virtual SmartPtr<const Vector>
+ unapply_vector_scaling_d(const SmartPtr<const Vector>& v);
+ /** Returns an d-scaled version of the given vector */
+ virtual SmartPtr<Vector>
+ apply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns an d-unscaled version of the given vector */
+ virtual SmartPtr<Vector>
+ unapply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v);
+ /** Returns a scaled version of the jacobian for c. If the
+ * overloaded method does not make a new matrix, make sure to set
+ * the matrix ptr passed in to NULL.
+ */
+ virtual SmartPtr<const Matrix>
+ apply_jac_c_scaling(SmartPtr<const Matrix> matrix);
+ /** Returns a scaled version of the jacobian for d If the
+ * overloaded method does not create a new matrix, make sure to
+ * set the matrix ptr passed in to NULL.
+ */
+ virtual SmartPtr<const Matrix>
+ apply_jac_d_scaling(SmartPtr<const Matrix> matrix);
+ /** Returns a scaled version of the hessian of the lagrangian If
+ * the overloaded method does not create a new matrix, make sure
+ * to set the matrix ptr passed in to NULL.
+ */
+ virtual SmartPtr<const SymMatrix>
+ apply_hessian_scaling(SmartPtr<const SymMatrix> matrix);
+ //@}
+
+ /** @name Methods for determining whether scaling for entities is
+ * done */
+ //@{
+ virtual bool have_x_scaling();
+ virtual bool have_c_scaling();
+ virtual bool have_d_scaling();
+ //@}
+
+ /** This method is called by the IpoptNLP's at a convenient time to
+ * compute and/or read scaling factors
+ */
+ virtual void DetermineScaling(const SmartPtr<const VectorSpace> x_space,
+ const SmartPtr<const VectorSpace> c_space,
+ const SmartPtr<const VectorSpace> d_space,
+ const SmartPtr<const MatrixSpace> jac_c_space,
+ const SmartPtr<const MatrixSpace> jac_d_space,
+ const SmartPtr<const SymMatrixSpace> h_space,
+ SmartPtr<const MatrixSpace>& new_jac_c_space,
+ SmartPtr<const MatrixSpace>& new_jac_d_space,
+ SmartPtr<const SymMatrixSpace>& new_h_space,
+ const Matrix& Px_L, const Vector& x_L,
+ const Matrix& Px_U, const Vector& x_U);
+
+ /** Methods for IpoptType */
+ //@{
+ static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
+ //@}
+
+ protected:
+ /** Overloaded initialization method */
+ virtual bool InitializeImpl(const OptionsList& options,
+ const std::string& prefix);
+
+ /** This is the method that has to be overloaded by a particular
+ * scaling method that somehow computes the scaling vectors dx,
+ * dc, and dd. The pointers to those vectors can be NULL, in
+ * which case no scaling for that item will be done later. */
+ virtual void DetermineScalingParametersImpl(
+ const SmartPtr<const VectorSpace> x_space,
+ const SmartPtr<const VectorSpace> c_space,
+ const SmartPtr<const VectorSpace> d_space,
+ const SmartPtr<const MatrixSpace> jac_c_space,
+ const SmartPtr<const MatrixSpace> jac_d_space,
+ const SmartPtr<const SymMatrixSpace> h_space,
+ const Matrix& Px_L, const Vector& x_L,
+ const Matrix& Px_U, const Vector& x_U,
+ Number& df,
+ SmartPtr<Vector>& dx,
+ SmartPtr<Vector>& dc,
+ SmartPtr<Vector>& dd)=0;
+
+ 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. */
+ //@{
+
+ /** Copy Constructor */
+ StandardScalingBase(const StandardScalingBase&);
+
+ /** Overloaded Equals Operator */
+ void operator=(const StandardScalingBase&);
+ //@}
+
+ /** Scaling parameters - we only need to keep copies of
+ * the objective scaling and the x scaling - the others we can
+ * get from the scaled matrix spaces.
+ */
+ //@{
+ /** objective scaling parameter */
+ Number df_;
+ /** x scaling */
+ SmartPtr<Vector> dx_;
+ //@}
+
+ /** Scaled Matrix Spaces */
+ //@{
+ /** Scaled jacobian of c space */
+ SmartPtr<ScaledMatrixSpace> scaled_jac_c_space_;
+ /** Scaled jacobian of d space */
+ SmartPtr<ScaledMatrixSpace> scaled_jac_d_space_;
+ /** Scaled hessian of lagrangian spacea */
+ SmartPtr<SymScaledMatrixSpace> scaled_h_space_;
+ //@}
+
+ /** @name Algorithmic parameters */
+ //@{
+ /** Additional scaling value for the objective function */
+ Number obj_scaling_factor_;
+ //@}
+ };
+
+ /** Class implementing the scaling object that doesn't to any scaling */
+ class NoNLPScalingObject : public StandardScalingBase
+ {
+ public:
+ /**@name Constructors/Destructors */
+ //@{
+ NoNLPScalingObject()
+ {}
+
+ /** Default destructor */
+ virtual ~NoNLPScalingObject()
+ {}
+ //@}
+
+
+ protected:
+ /** Overloaded from StandardScalingBase */
+ virtual void DetermineScalingParametersImpl(
+ const SmartPtr<const VectorSpace> x_space,
+ const SmartPtr<const VectorSpace> c_space,
+ const SmartPtr<const VectorSpace> d_space,
+ const SmartPtr<const MatrixSpace> jac_c_space,
+ const SmartPtr<const MatrixSpace> jac_d_space,
+ const SmartPtr<const SymMatrixSpace> h_space,
+ const Matrix& Px_L, const Vector& x_L,
+ const Matrix& Px_U, const Vector& x_U,
+ Number& df,
+ SmartPtr<Vector>& dx,
+ SmartPtr<Vector>& dc,
+ SmartPtr<Vector>& dd);
+
+ 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. */
+ //@{
+
+ /** Copy Constructor */
+ NoNLPScalingObject(const NoNLPScalingObject&);
+
+ /** Overloaded Equals Operator */
+ void operator=(const NoNLPScalingObject&);
+ //@}
+ };
+
+} // namespace Ipopt
+
+#endif