24 #ifndef _IPOPT_PROBLEM_H_
25 #define _IPOPT_PROBLEM_H_
49 template <
typename RPROBLEM,
typename VECTOR>
50 class Ipopt_Problem :
public Ipopt::TNLP
53 Ipopt_Problem(
int& ret_val,
54 RPROBLEM * OP, ControlVector<VECTOR>& q,
55 const ControlVector<VECTOR>* q_min,
56 const ControlVector<VECTOR>* q_max,
57 const ConstraintVector<VECTOR>& c);
59 virtual ~Ipopt_Problem() {}
64 virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
65 Ipopt::Index& nnz_h_lag, IndexStyleEnum& index_style);
68 virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
69 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u);
72 virtual bool get_starting_point(Ipopt::Index n,
bool init_x, Ipopt::Number* x,
73 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
74 Ipopt::Index m,
bool init_lambda,
75 Ipopt::Number* lambda);
78 virtual bool eval_f(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Number& obj_value);
81 virtual bool eval_grad_f(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Number* grad_f);
84 virtual bool eval_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Index m, Ipopt::Number* g);
90 virtual bool eval_jac_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x,
91 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow, Ipopt::Index *jCol,
92 Ipopt::Number* values);
98 virtual bool eval_h(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x,
99 Ipopt::Number obj_factor, Ipopt::Index m,
const Ipopt::Number* lambda,
100 bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow,
101 Ipopt::Index* jCol, Ipopt::Number* values);
108 virtual void finalize_solution(Ipopt::SolverReturn status,
109 Ipopt::Index n,
const Ipopt::Number* x,
const Ipopt::Number* z_L,
const Ipopt::Number* z_U,
110 Ipopt::Index m,
const Ipopt::Number* g,
const Ipopt::Number* lambda,
111 Ipopt::Number obj_value,
112 const Ipopt::IpoptData* ip_data,
113 Ipopt::IpoptCalculatedQuantities* ip_cq);
118 ControlVector<VECTOR> _q;
119 ControlVector<VECTOR>& _init;
120 const ControlVector<VECTOR>* _q_min;
121 const ControlVector<VECTOR>* _q_max;
122 ConstraintVector<VECTOR> _c;
127 template <
typename RPROBLEM,
typename VECTOR>
128 Ipopt_Problem<RPROBLEM,VECTOR>::Ipopt_Problem(
int& ret_val,
129 RPROBLEM* OP, ControlVector<VECTOR>& q,
130 const ControlVector<VECTOR>* q_min,
131 const ControlVector<VECTOR>* q_max,
132 const ConstraintVector<VECTOR>& c)
133 : _ret_val(ret_val), _P(OP), _q(q), _init(q),
134 _q_min(q_min), _q_max(q_max), _c(c)
138 template <
typename RPROBLEM,
typename VECTOR>
139 bool Ipopt_Problem<RPROBLEM,VECTOR>::get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
140 Ipopt::Index& nnz_h_lag, IndexStyleEnum& index_style)
142 n = _q.GetSpacialVector().size();
143 m = _c.GetGlobalConstraints().size();
146 index_style = TNLP::C_STYLE;
150 template <
typename RPROBLEM,
typename VECTOR>
151 bool Ipopt_Problem<RPROBLEM,VECTOR>::get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
152 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u)
154 assert(n == (
int) _q.GetSpacialVector().size());
155 assert(m == (
int) _c.GetGlobalConstraints().size());
158 const VECTOR& lb = _q_min->GetSpacialVector();
159 const VECTOR& ub = _q_max->GetSpacialVector();
160 for(
int i = 0; i < n; i++)
166 for(
int i = 0; i < m; i++)
174 template <
typename RPROBLEM,
typename VECTOR>
175 bool Ipopt_Problem<RPROBLEM,VECTOR>::get_starting_point(Ipopt::Index n,
bool init_x, Ipopt::Number* x,
176 bool init_z, Ipopt::Number* , Ipopt::Number* ,
177 Ipopt::Index ,
bool init_lambda,
180 assert(init_x ==
true);
181 assert(init_z ==
false);
182 assert(init_lambda ==
false);
183 const VECTOR& in = _init.GetSpacialVector();
185 for(
int i = 0; i < n; i++)
192 template <
typename RPROBLEM,
typename VECTOR>
193 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_f(Ipopt::Index n,
const Ipopt::Number* x,
bool , Ipopt::Number& obj_value)
195 VECTOR& qval = _q.GetSpacialVector();
196 for(
int i = 0; i < n; i++)
202 obj_value = _P->ComputeReducedCostFunctional(_q);
204 catch(DOpEException& e)
206 _P->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_RPROBLEM::eval_f");
211 template <
typename RPROBLEM,
typename VECTOR>
212 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_grad_f(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Number* grad_f)
214 ControlVector<VECTOR> gradient(_q);
215 ControlVector<VECTOR> gradient_transposed(_q);
219 VECTOR& qval = _q.GetSpacialVector();
220 for(
int i = 0; i < n; i++)
226 _P->ComputeReducedCostFunctional(_q);
228 catch(DOpEException& e)
230 _P->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_f");
236 _P->ComputeReducedGradient(_q,gradient,gradient_transposed);
238 catch(DOpEException& e)
240 _P->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_f");
242 const VECTOR& ref_g = gradient_transposed.GetSpacialVector();
243 for(
int i=0; i < n; i++)
245 grad_f[i] = ref_g(i);
251 template <
typename RPROBLEM,
typename VECTOR>
252 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Index , Ipopt::Number* g)
257 VECTOR& qval = _q.GetSpacialVector();
258 for(
int i = 0; i < n; i++)
264 _P->ComputeReducedCostFunctional(_q);
266 catch(DOpEException& e)
268 _P->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_g");
274 _P->ComputeReducedConstraints(_q,_c);
276 catch(DOpEException& e)
278 _P->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_g");
280 const dealii::Vector<double>& gc = _c.GetGlobalConstraints();
281 for(
unsigned int i=0; i < gc.size(); i++)
288 template <
typename RPROBLEM,
typename VECTOR>
289 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_jac_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x,
290 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow, Ipopt::Index *jCol,
291 Ipopt::Number* values)
296 ControlVector<VECTOR> gradient(_q);
297 ControlVector<VECTOR> gradient_transposed(_q);
301 VECTOR& qval = _q.GetSpacialVector();
302 for(
int i = 0; i < n; i++)
308 _P->ComputeReducedCostFunctional(_q);
310 catch(DOpEException& e)
312 _P->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_g");
316 for(
int j=0; j < m; j++)
320 _P->ComputeReducedGradientOfGlobalConstraints(j,_q,_c,
321 gradient,gradient_transposed);
323 catch(DOpEException& e)
325 _P->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_g");
327 const VECTOR& ref_g = gradient_transposed.GetSpacialVector();
328 for(
int i=0; i < n; i++)
330 values[n*j+i] = ref_g(i);
336 assert(nele_jac == n*m);
338 for(
int i = 0; i < n; i++)
340 for(
int j = 0; j < m; j++)
351 template <
typename RPROBLEM,
typename VECTOR>
352 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_h(Ipopt::Index ,
const Ipopt::Number* ,
bool ,
353 Ipopt::Number , Ipopt::Index ,
const Ipopt::Number* ,
354 bool , Ipopt::Index , Ipopt::Index* ,
355 Ipopt::Index* , Ipopt::Number* )
362 template <
typename RPROBLEM,
typename VECTOR>
363 void Ipopt_Problem<RPROBLEM,VECTOR>::finalize_solution(Ipopt::SolverReturn status,
364 Ipopt::Index n,
const Ipopt::Number* x,
365 const Ipopt::Number* ,
const Ipopt::Number* ,
366 Ipopt::Index ,
const Ipopt::Number* ,
367 const Ipopt::Number* ,
369 const Ipopt::IpoptData* ,
370 Ipopt::IpoptCalculatedQuantities* )
374 VECTOR& ret = _init.GetSpacialVector();
375 for(
int i = 0; i < n; i++)
379 if(status == Ipopt::SUCCESS)
385 #endif //Endof WITH_IPOPT