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