Ipopt
trunk
|
00001 // Copyright (C) 2004, 2007 International Business Machines and others. 00002 // All Rights Reserved. 00003 // This code is published under the Eclipse Public License. 00004 // 00005 // $Id$ 00006 // 00007 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 00008 00009 #ifndef __IPNLPSCALING_HPP__ 00010 #define __IPNLPSCALING_HPP__ 00011 00012 #include "IpOptionsList.hpp" 00013 #include "IpRegOptions.hpp" 00014 00015 namespace Ipopt 00016 { 00017 // forward declarations 00018 class Vector; 00019 class VectorSpace; 00020 class Matrix; 00021 class MatrixSpace; 00022 class SymMatrix; 00023 class SymMatrixSpace; 00024 class ScaledMatrixSpace; 00025 class SymScaledMatrixSpace; 00026 00032 class NLPScalingObject : public ReferencedObject 00033 { 00034 public: 00037 NLPScalingObject(); 00038 00040 virtual ~NLPScalingObject(); 00042 00044 bool Initialize(const Journalist& jnlst, 00045 const OptionsList& options, 00046 const std::string& prefix) 00047 { 00048 jnlst_ = &jnlst; 00049 return InitializeImpl(options, prefix); 00050 } 00051 00055 virtual Number apply_obj_scaling(const Number& f)=0; 00057 virtual Number unapply_obj_scaling(const Number& f)=0; 00059 virtual SmartPtr<Vector> 00060 apply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v)=0; 00062 virtual SmartPtr<const Vector> 00063 apply_vector_scaling_x(const SmartPtr<const Vector>& v)=0; 00065 virtual SmartPtr<Vector> 00066 unapply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v)=0; 00068 virtual SmartPtr<const Vector> 00069 unapply_vector_scaling_x(const SmartPtr<const Vector>& v)=0; 00071 virtual SmartPtr<const Vector> 00072 apply_vector_scaling_c(const SmartPtr<const Vector>& v)=0; 00074 virtual SmartPtr<const Vector> 00075 unapply_vector_scaling_c(const SmartPtr<const Vector>& v)=0; 00077 virtual SmartPtr<Vector> 00078 apply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v)=0; 00080 virtual SmartPtr<Vector> 00081 unapply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v)=0; 00083 virtual SmartPtr<const Vector> 00084 apply_vector_scaling_d(const SmartPtr<const Vector>& v)=0; 00086 virtual SmartPtr<const Vector> 00087 unapply_vector_scaling_d(const SmartPtr<const Vector>& v)=0; 00089 virtual SmartPtr<Vector> 00090 apply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v)=0; 00092 virtual SmartPtr<Vector> 00093 unapply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v)=0; 00098 virtual SmartPtr<const Matrix> 00099 apply_jac_c_scaling(SmartPtr<const Matrix> matrix)=0; 00104 virtual SmartPtr<const Matrix> 00105 apply_jac_d_scaling(SmartPtr<const Matrix> matrix)=0; 00110 virtual SmartPtr<const SymMatrix> 00111 apply_hessian_scaling(SmartPtr<const SymMatrix> matrix)=0; 00113 00117 SmartPtr<Vector> apply_vector_scaling_x_LU_NonConst( 00118 const Matrix& Px_LU, 00119 const SmartPtr<const Vector>& lu, 00120 const VectorSpace& x_space); 00122 SmartPtr<const Vector> apply_vector_scaling_x_LU( 00123 const Matrix& Px_LU, 00124 const SmartPtr<const Vector>& lu, 00125 const VectorSpace& x_space); 00127 SmartPtr<Vector> apply_vector_scaling_d_LU_NonConst( 00128 const Matrix& Pd_LU, 00129 const SmartPtr<const Vector>& lu, 00130 const VectorSpace& d_space); 00132 SmartPtr<const Vector> apply_vector_scaling_d_LU( 00133 const Matrix& Pd_LU, 00134 const SmartPtr<const Vector>& lu, 00135 const VectorSpace& d_space); 00137 SmartPtr<Vector> unapply_vector_scaling_d_LU_NonConst( 00138 const Matrix& Pd_LU, 00139 const SmartPtr<const Vector>& lu, 00140 const VectorSpace& d_space); 00142 SmartPtr<const Vector> unapply_vector_scaling_d_LU( 00143 const Matrix& Pd_LU, 00144 const SmartPtr<const Vector>& lu, 00145 const VectorSpace& d_space); 00147 00153 virtual SmartPtr<Vector> 00154 apply_grad_obj_scaling_NonConst(const SmartPtr<const Vector>& v); 00156 virtual SmartPtr<const Vector> 00157 apply_grad_obj_scaling(const SmartPtr<const Vector>& v); 00160 virtual SmartPtr<Vector> 00161 unapply_grad_obj_scaling_NonConst(const SmartPtr<const Vector>& v); 00164 virtual SmartPtr<const Vector> 00165 unapply_grad_obj_scaling(const SmartPtr<const Vector>& v); 00167 00172 virtual bool have_x_scaling()=0; 00174 virtual bool have_c_scaling()=0; 00176 virtual bool have_d_scaling()=0; 00178 00182 virtual void DetermineScaling(const SmartPtr<const VectorSpace> x_space, 00183 const SmartPtr<const VectorSpace> c_space, 00184 const SmartPtr<const VectorSpace> d_space, 00185 const SmartPtr<const MatrixSpace> jac_c_space, 00186 const SmartPtr<const MatrixSpace> jac_d_space, 00187 const SmartPtr<const SymMatrixSpace> h_space, 00188 SmartPtr<const MatrixSpace>& new_jac_c_space, 00189 SmartPtr<const MatrixSpace>& new_jac_d_space, 00190 SmartPtr<const SymMatrixSpace>& new_h_space, 00191 const Matrix& Px_L, const Vector& x_L, 00192 const Matrix& Px_U, const Vector& x_U)=0; 00193 protected: 00196 virtual bool InitializeImpl(const OptionsList& options, 00197 const std::string& prefix)=0; 00198 00200 const Journalist& Jnlst() const 00201 { 00202 return *jnlst_; 00203 } 00204 private: 00205 00214 00216 NLPScalingObject(const NLPScalingObject&); 00217 00219 void operator=(const NLPScalingObject&); 00221 00222 SmartPtr<const Journalist> jnlst_; 00223 }; 00224 00229 class StandardScalingBase : public NLPScalingObject 00230 { 00231 public: 00234 StandardScalingBase(); 00235 00237 virtual ~StandardScalingBase(); 00239 00243 virtual Number apply_obj_scaling(const Number& f); 00245 virtual Number unapply_obj_scaling(const Number& f); 00247 virtual SmartPtr<Vector> 00248 apply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v); 00250 virtual SmartPtr<const Vector> 00251 apply_vector_scaling_x(const SmartPtr<const Vector>& v); 00253 virtual SmartPtr<Vector> 00254 unapply_vector_scaling_x_NonConst(const SmartPtr<const Vector>& v); 00256 virtual SmartPtr<const Vector> 00257 unapply_vector_scaling_x(const SmartPtr<const Vector>& v); 00259 virtual SmartPtr<const Vector> 00260 apply_vector_scaling_c(const SmartPtr<const Vector>& v); 00262 virtual SmartPtr<const Vector> 00263 unapply_vector_scaling_c(const SmartPtr<const Vector>& v); 00265 virtual SmartPtr<Vector> 00266 apply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v); 00268 virtual SmartPtr<Vector> 00269 unapply_vector_scaling_c_NonConst(const SmartPtr<const Vector>& v); 00271 virtual SmartPtr<const Vector> 00272 apply_vector_scaling_d(const SmartPtr<const Vector>& v); 00274 virtual SmartPtr<const Vector> 00275 unapply_vector_scaling_d(const SmartPtr<const Vector>& v); 00277 virtual SmartPtr<Vector> 00278 apply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v); 00280 virtual SmartPtr<Vector> 00281 unapply_vector_scaling_d_NonConst(const SmartPtr<const Vector>& v); 00286 virtual SmartPtr<const Matrix> 00287 apply_jac_c_scaling(SmartPtr<const Matrix> matrix); 00292 virtual SmartPtr<const Matrix> 00293 apply_jac_d_scaling(SmartPtr<const Matrix> matrix); 00298 virtual SmartPtr<const SymMatrix> 00299 apply_hessian_scaling(SmartPtr<const SymMatrix> matrix); 00301 00305 virtual bool have_x_scaling(); 00306 virtual bool have_c_scaling(); 00307 virtual bool have_d_scaling(); 00309 00313 virtual void DetermineScaling(const SmartPtr<const VectorSpace> x_space, 00314 const SmartPtr<const VectorSpace> c_space, 00315 const SmartPtr<const VectorSpace> d_space, 00316 const SmartPtr<const MatrixSpace> jac_c_space, 00317 const SmartPtr<const MatrixSpace> jac_d_space, 00318 const SmartPtr<const SymMatrixSpace> h_space, 00319 SmartPtr<const MatrixSpace>& new_jac_c_space, 00320 SmartPtr<const MatrixSpace>& new_jac_d_space, 00321 SmartPtr<const SymMatrixSpace>& new_h_space, 00322 const Matrix& Px_L, const Vector& x_L, 00323 const Matrix& Px_U, const Vector& x_U); 00324 00327 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions); 00329 00330 protected: 00332 virtual bool InitializeImpl(const OptionsList& options, 00333 const std::string& prefix); 00334 00339 virtual void DetermineScalingParametersImpl( 00340 const SmartPtr<const VectorSpace> x_space, 00341 const SmartPtr<const VectorSpace> c_space, 00342 const SmartPtr<const VectorSpace> d_space, 00343 const SmartPtr<const MatrixSpace> jac_c_space, 00344 const SmartPtr<const MatrixSpace> jac_d_space, 00345 const SmartPtr<const SymMatrixSpace> h_space, 00346 const Matrix& Px_L, const Vector& x_L, 00347 const Matrix& Px_U, const Vector& x_U, 00348 Number& df, 00349 SmartPtr<Vector>& dx, 00350 SmartPtr<Vector>& dc, 00351 SmartPtr<Vector>& dd)=0; 00352 00353 private: 00354 00363 00365 StandardScalingBase(const StandardScalingBase&); 00366 00368 void operator=(const StandardScalingBase&); 00370 00377 Number df_; 00379 SmartPtr<Vector> dx_; 00381 00385 SmartPtr<ScaledMatrixSpace> scaled_jac_c_space_; 00387 SmartPtr<ScaledMatrixSpace> scaled_jac_d_space_; 00389 SmartPtr<SymScaledMatrixSpace> scaled_h_space_; 00391 00395 Number obj_scaling_factor_; 00397 }; 00398 00400 class NoNLPScalingObject : public StandardScalingBase 00401 { 00402 public: 00405 NoNLPScalingObject() 00406 {} 00407 00409 virtual ~NoNLPScalingObject() 00410 {} 00412 00413 00414 protected: 00416 virtual void DetermineScalingParametersImpl( 00417 const SmartPtr<const VectorSpace> x_space, 00418 const SmartPtr<const VectorSpace> c_space, 00419 const SmartPtr<const VectorSpace> d_space, 00420 const SmartPtr<const MatrixSpace> jac_c_space, 00421 const SmartPtr<const MatrixSpace> jac_d_space, 00422 const SmartPtr<const SymMatrixSpace> h_space, 00423 const Matrix& Px_L, const Vector& x_L, 00424 const Matrix& Px_U, const Vector& x_U, 00425 Number& df, 00426 SmartPtr<Vector>& dx, 00427 SmartPtr<Vector>& dc, 00428 SmartPtr<Vector>& dd); 00429 00430 private: 00431 00440 00442 NoNLPScalingObject(const NoNLPScalingObject&); 00443 00445 void operator=(const NoNLPScalingObject&); 00447 }; 00448 00449 } // namespace Ipopt 00450 00451 #endif