00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __IPORIGIPOPTNLP_HPP__
00010 #define __IPORIGIPOPTNLP_HPP__
00011
00012 #include "IpIpoptNLP.hpp"
00013 #include "IpException.hpp"
00014 #include "IpTimingStatistics.hpp"
00015
00016 namespace Ipopt
00017 {
00018
00020 enum HessianApproximationType {
00021 EXACT=0,
00022 LIMITED_MEMORY
00023 };
00024
00026 enum HessianApproximationSpace {
00027 NONLINEAR_VARS=0,
00028 ALL_VARS
00029 };
00030
00037 class OrigIpoptNLP : public IpoptNLP
00038 {
00039 public:
00042 OrigIpoptNLP(const SmartPtr<const Journalist>& jnlst,
00043 const SmartPtr<NLP>& nlp,
00044 const SmartPtr<NLPScalingObject>& nlp_scaling);
00045
00047 virtual ~OrigIpoptNLP();
00049
00051 virtual bool Initialize(const Journalist& jnlst,
00052 const OptionsList& options,
00053 const std::string& prefix);
00054
00057 virtual bool InitializeStructures(SmartPtr<Vector>& x,
00058 bool init_x,
00059 SmartPtr<Vector>& y_c,
00060 bool init_y_c,
00061 SmartPtr<Vector>& y_d,
00062 bool init_y_d,
00063 SmartPtr<Vector>& z_L,
00064 bool init_z_L,
00065 SmartPtr<Vector>& z_U,
00066 bool init_z_U,
00067 SmartPtr<Vector>& v_L,
00068 SmartPtr<Vector>& v_U
00069 );
00070
00072 virtual bool GetWarmStartIterate(IteratesVector& warm_start_iterate)
00073 {
00074 return nlp_->GetWarmStartIterate(warm_start_iterate);
00075 }
00079 virtual Number f(const Vector& x);
00080
00083 virtual Number f(const Vector& x, Number mu);
00084
00086 virtual SmartPtr<const Vector> grad_f(const Vector& x);
00087
00090 virtual SmartPtr<const Vector> grad_f(const Vector& x, Number mu);
00091
00093 virtual SmartPtr<const Vector> c(const Vector& x);
00094
00096 virtual SmartPtr<const Matrix> jac_c(const Vector& x);
00097
00100 virtual SmartPtr<const Vector> d(const Vector& x);
00101
00103 virtual SmartPtr<const Matrix> jac_d(const Vector& x);
00104
00106 virtual SmartPtr<const SymMatrix> h(const Vector& x,
00107 Number obj_factor,
00108 const Vector& yc,
00109 const Vector& yd
00110 );
00111
00114 virtual SmartPtr<const SymMatrix> h(const Vector& x,
00115 Number obj_factor,
00116 const Vector& yc,
00117 const Vector& yd,
00118 Number mu);
00119
00123 virtual SmartPtr<const SymMatrix> uninitialized_h();
00124
00126 virtual SmartPtr<const Vector> x_L() const
00127 {
00128 return x_L_;
00129 }
00130
00132 virtual SmartPtr<const Matrix> Px_L() const
00133 {
00134 return Px_L_;
00135 }
00136
00138 virtual SmartPtr<const Vector> x_U() const
00139 {
00140 return x_U_;
00141 }
00142
00144 virtual SmartPtr<const Matrix> Px_U() const
00145 {
00146 return Px_U_;
00147 }
00148
00150 virtual SmartPtr<const Vector> d_L() const
00151 {
00152 return d_L_;
00153 }
00154
00156 virtual SmartPtr<const Matrix> Pd_L() const
00157 {
00158 return Pd_L_;
00159 }
00160
00162 virtual SmartPtr<const Vector> d_U() const
00163 {
00164 return d_U_;
00165 }
00166
00168 virtual SmartPtr<const Matrix> Pd_U() const
00169 {
00170 return Pd_U_;
00171 }
00172
00173 virtual SmartPtr<const SymMatrixSpace> HessianMatrixSpace() const
00174 {
00175 return h_space_;
00176 }
00177
00178 virtual SmartPtr<const VectorSpace> x_space() const
00179 {
00180 return x_space_;
00181 }
00183
00185 virtual void GetSpaces(SmartPtr<const VectorSpace>& x_space,
00186 SmartPtr<const VectorSpace>& c_space,
00187 SmartPtr<const VectorSpace>& d_space,
00188 SmartPtr<const VectorSpace>& x_l_space,
00189 SmartPtr<const MatrixSpace>& px_l_space,
00190 SmartPtr<const VectorSpace>& x_u_space,
00191 SmartPtr<const MatrixSpace>& px_u_space,
00192 SmartPtr<const VectorSpace>& d_l_space,
00193 SmartPtr<const MatrixSpace>& pd_l_space,
00194 SmartPtr<const VectorSpace>& d_u_space,
00195 SmartPtr<const MatrixSpace>& pd_u_space,
00196 SmartPtr<const MatrixSpace>& Jac_c_space,
00197 SmartPtr<const MatrixSpace>& Jac_d_space,
00198 SmartPtr<const SymMatrixSpace>& Hess_lagrangian_space);
00199
00202 virtual void AdjustVariableBounds(const Vector& new_x_L,
00203 const Vector& new_x_U,
00204 const Vector& new_d_L,
00205 const Vector& new_d_U);
00206
00209 virtual Index f_evals() const
00210 {
00211 return f_evals_;
00212 }
00213 virtual Index grad_f_evals() const
00214 {
00215 return grad_f_evals_;
00216 }
00217 virtual Index c_evals() const
00218 {
00219 return c_evals_;
00220 }
00221 virtual Index jac_c_evals() const
00222 {
00223 return jac_c_evals_;
00224 }
00225 virtual Index d_evals() const
00226 {
00227 return d_evals_;
00228 }
00229 virtual Index jac_d_evals() const
00230 {
00231 return jac_d_evals_;
00232 }
00233 virtual Index h_evals() const
00234 {
00235 return h_evals_;
00236 }
00238
00241 void FinalizeSolution(SolverReturn status,
00242 const Vector& x, const Vector& z_L, const Vector& z_U,
00243 const Vector& c, const Vector& d,
00244 const Vector& y_c, const Vector& y_d,
00245 Number obj_value,
00246 const IpoptData* ip_data,
00247 IpoptCalculatedQuantities* ip_cq);
00248 bool IntermediateCallBack(AlgorithmMode mode,
00249 Index iter, Number obj_value,
00250 Number inf_pr, Number inf_du,
00251 Number mu, Number d_norm,
00252 Number regularization_size,
00253 Number alpha_du, Number alpha_pr,
00254 Index ls_trials,
00255 SmartPtr<const IpoptData> ip_data,
00256 SmartPtr<IpoptCalculatedQuantities> ip_cq);
00258
00262 static void RegisterOptions(SmartPtr<RegisteredOptions> roptions);
00264
00266 SmartPtr<NLP> nlp()
00267 {
00268 return nlp_;
00269 }
00270
00273
00275 void ResetTimes();
00276
00277 void PrintTimingStatistics(Journalist& jnlst,
00278 EJournalLevel level,
00279 EJournalCategory category) const;
00280
00281 const TimedTask& f_eval_time() const
00282 {
00283 return f_eval_time_;
00284 }
00285 const TimedTask& grad_f_eval_time() const
00286 {
00287 return grad_f_eval_time_;
00288 }
00289 const TimedTask& c_eval_time() const
00290 {
00291 return c_eval_time_;
00292 }
00293 const TimedTask& jac_c_eval_time() const
00294 {
00295 return jac_c_eval_time_;
00296 }
00297 const TimedTask& d_eval_time() const
00298 {
00299 return d_eval_time_;
00300 }
00301 const TimedTask& jac_d_eval_time() const
00302 {
00303 return jac_d_eval_time_;
00304 }
00305 const TimedTask& h_eval_time() const
00306 {
00307 return h_eval_time_;
00308 }
00309
00310 Number TotalFunctionEvaluationCpuTime() const;
00311 Number TotalFunctionEvaluationSysTime() const;
00312 Number TotalFunctionEvaluationWallclockTime() const;
00314
00315 private:
00317 SmartPtr<const Journalist> jnlst_;
00318
00320 SmartPtr<NLP> nlp_;
00321
00324 SmartPtr<const VectorSpace> x_space_;
00325 SmartPtr<const VectorSpace> c_space_;
00326 SmartPtr<const VectorSpace> d_space_;
00327 SmartPtr<const VectorSpace> x_l_space_;
00328 SmartPtr<const MatrixSpace> px_l_space_;
00329 SmartPtr<const VectorSpace> x_u_space_;
00330 SmartPtr<const MatrixSpace> px_u_space_;
00331 SmartPtr<const VectorSpace> d_l_space_;
00332 SmartPtr<const MatrixSpace> pd_l_space_;
00333 SmartPtr<const VectorSpace> d_u_space_;
00334 SmartPtr<const MatrixSpace> pd_u_space_;
00335 SmartPtr<const MatrixSpace> jac_c_space_;
00336 SmartPtr<const MatrixSpace> jac_d_space_;
00337 SmartPtr<const SymMatrixSpace> h_space_;
00338
00339 SmartPtr<const MatrixSpace> scaled_jac_c_space_;
00340 SmartPtr<const MatrixSpace> scaled_jac_d_space_;
00341 SmartPtr<const SymMatrixSpace> scaled_h_space_;
00343
00346 CachedResults<Number> f_cache_;
00347
00349 CachedResults<SmartPtr<const Vector> > grad_f_cache_;
00350
00352 CachedResults<SmartPtr<const Vector> > c_cache_;
00353
00356 CachedResults<SmartPtr<const Matrix> > jac_c_cache_;
00357
00360 CachedResults<SmartPtr<const Vector> > d_cache_;
00361
00364 CachedResults<SmartPtr<const Matrix> > jac_d_cache_;
00365
00368 CachedResults<SmartPtr<const SymMatrix> > h_cache_;
00369
00371 CachedResults<SmartPtr<const Vector> > unscaled_x_cache_;
00372
00374 SmartPtr<const Vector> x_L_;
00375
00377 SmartPtr<const Matrix> Px_L_;
00378
00380 SmartPtr<const Vector> x_U_;
00381
00383 SmartPtr<const Matrix> Px_U_;
00384
00386 SmartPtr<const Vector> d_L_;
00387
00389 SmartPtr<const Matrix> Pd_L_;
00390
00392 SmartPtr<const Vector> d_U_;
00393
00395 SmartPtr<const Matrix> Pd_U_;
00396
00398 SmartPtr<const Vector> orig_x_L_;
00399
00401 SmartPtr<const Vector> orig_x_U_;
00403
00413 OrigIpoptNLP();
00414
00416 OrigIpoptNLP(const OrigIpoptNLP&);
00417
00419 void operator=(const OrigIpoptNLP&);
00421
00428 void relax_bounds(Number bound_relax_factor, Vector& bounds);
00430 SmartPtr<const Vector> get_unscaled_x(const Vector& x);
00432
00436 Number bound_relax_factor_;
00439 bool honor_original_bounds_;
00442 bool warm_start_same_structure_;
00444 HessianApproximationType hessian_approximation_;
00446 HessianApproximationSpace hessian_approximation_space_;
00449 bool check_derivatives_for_naninf_;
00452 bool jac_c_constant_;
00455 bool jac_d_constant_;
00457 bool hessian_constant_;
00459
00462 Index f_evals_;
00463 Index grad_f_evals_;
00464 Index c_evals_;
00465 Index jac_c_evals_;
00466 Index d_evals_;
00467 Index jac_d_evals_;
00468 Index h_evals_;
00470
00472 bool initialized_;
00473
00476 TimedTask f_eval_time_;
00477 TimedTask grad_f_eval_time_;
00478 TimedTask c_eval_time_;
00479 TimedTask jac_c_eval_time_;
00480 TimedTask d_eval_time_;
00481 TimedTask jac_d_eval_time_;
00482 TimedTask h_eval_time_;
00484 };
00485
00486 }
00487
00488 #endif