24 #ifndef IPOPT_PROBLEM_H_
25 #define IPOPT_PROBLEM_H_
29 #pragma GCC diagnostic push
30 #pragma GCC diagnostic ignored "-Wunused-parameter"
32 #pragma GCC diagnostic pop
53 template <
typename RPROBLEM,
typename VECTOR>
54 class Ipopt_Problem :
public Ipopt::TNLP
57 Ipopt_Problem(
int& ret_val,
58 RPROBLEM * OP, ControlVector<VECTOR>& q,
59 const ControlVector<VECTOR>* q_min,
60 const ControlVector<VECTOR>* q_max,
61 const ConstraintVector<VECTOR>& c);
63 virtual ~Ipopt_Problem() {}
68 virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
69 Ipopt::Index& nnz_h_lag, IndexStyleEnum& index_style);
72 virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
73 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u);
76 virtual bool get_starting_point(Ipopt::Index n,
bool init_x, Ipopt::Number* x,
77 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
78 Ipopt::Index m,
bool init_lambda,
79 Ipopt::Number* lambda);
82 virtual bool eval_f(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Number& obj_value);
85 virtual bool eval_grad_f(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Number* grad_f);
88 virtual bool eval_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Index m, Ipopt::Number* g);
94 virtual bool eval_jac_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x,
95 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow, Ipopt::Index *jCol,
96 Ipopt::Number* values);
102 virtual bool eval_h(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x,
103 Ipopt::Number obj_factor, Ipopt::Index m,
const Ipopt::Number* lambda,
104 bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow,
105 Ipopt::Index* jCol, Ipopt::Number* values);
112 virtual void finalize_solution(Ipopt::SolverReturn status,
113 Ipopt::Index n,
const Ipopt::Number* x,
const Ipopt::Number* z_L,
const Ipopt::Number* z_U,
114 Ipopt::Index m,
const Ipopt::Number* g,
const Ipopt::Number* lambda,
115 Ipopt::Number obj_value,
116 const Ipopt::IpoptData* ip_data,
117 Ipopt::IpoptCalculatedQuantities* ip_cq);
122 ControlVector<VECTOR> q_;
123 ControlVector<VECTOR>& init_;
124 const ControlVector<VECTOR>* q_min_;
125 const ControlVector<VECTOR>* q_max_;
126 ConstraintVector<VECTOR> c_;
131 template <
typename RPROBLEM,
typename VECTOR>
132 Ipopt_Problem<RPROBLEM,VECTOR>::Ipopt_Problem(
int& ret_val,
133 RPROBLEM* OP, ControlVector<VECTOR>& q,
134 const ControlVector<VECTOR>* q_min,
135 const ControlVector<VECTOR>* q_max,
136 const ConstraintVector<VECTOR>& c)
137 : ret_val_(ret_val), P_(OP), q_(q), init_(q),
138 q_min_(q_min), q_max_(q_max), c_(c)
142 template <
typename RPROBLEM,
typename VECTOR>
143 bool Ipopt_Problem<RPROBLEM,VECTOR>::get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
144 Ipopt::Index& nnz_h_lag, IndexStyleEnum& index_style)
146 n = q_.GetSpacialVector().size();
147 m = c_.GetGlobalConstraints().size();
150 index_style = TNLP::C_STYLE;
154 template <
typename RPROBLEM,
typename VECTOR>
155 bool Ipopt_Problem<RPROBLEM,VECTOR>::get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
156 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u)
158 assert(n == (
int) q_.GetSpacialVector().size());
159 assert(m == (
int) c_.GetGlobalConstraints().size());
162 const VECTOR& lb = q_min_->GetSpacialVector();
163 const VECTOR& ub = q_max_->GetSpacialVector();
164 for(
int i = 0; i < n; i++)
170 for(
int i = 0; i < m; i++)
178 template <
typename RPROBLEM,
typename VECTOR>
179 bool Ipopt_Problem<RPROBLEM,VECTOR>::get_starting_point(Ipopt::Index n,
bool , Ipopt::Number* x,
180 bool , Ipopt::Number* , Ipopt::Number* ,
181 Ipopt::Index ,
bool ,
187 const VECTOR& in = init_.GetSpacialVector();
189 for(
int i = 0; i < n; i++)
196 template <
typename RPROBLEM,
typename VECTOR>
197 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_f(Ipopt::Index n,
const Ipopt::Number* x,
bool , Ipopt::Number& obj_value)
199 VECTOR& qval = q_.GetSpacialVector();
200 for(
int i = 0; i < n; i++)
206 obj_value = P_->ComputeReducedCostFunctional(q_);
208 catch(DOpEException& e)
210 P_->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_RPROBLEM::eval_f");
215 template <
typename RPROBLEM,
typename VECTOR>
216 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_grad_f(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Number* grad_f)
218 ControlVector<VECTOR> gradient(q_);
219 ControlVector<VECTOR> gradient_transposed(q_);
223 VECTOR& qval = q_.GetSpacialVector();
224 for(
int i = 0; i < n; i++)
230 P_->ComputeReducedCostFunctional(q_);
232 catch(DOpEException& e)
234 P_->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_f");
240 P_->ComputeReducedGradient(q_,gradient,gradient_transposed);
242 catch(DOpEException& e)
244 P_->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_f");
246 const VECTOR& ref_g = gradient_transposed.GetSpacialVector();
247 for(
int i=0; i < n; i++)
249 grad_f[i] = ref_g(i);
255 template <
typename RPROBLEM,
typename VECTOR>
256 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x, Ipopt::Index , Ipopt::Number* g)
261 VECTOR& qval = q_.GetSpacialVector();
262 for(
int i = 0; i < n; i++)
268 P_->ComputeReducedCostFunctional(q_);
270 catch(DOpEException& e)
272 P_->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_g");
278 P_->ComputeReducedConstraints(q_,c_);
280 catch(DOpEException& e)
282 P_->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_g");
284 const dealii::Vector<double>& gc = c_.GetGlobalConstraints();
285 for(
unsigned int i=0; i < gc.size(); i++)
292 template <
typename RPROBLEM,
typename VECTOR>
293 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_jac_g(Ipopt::Index n,
const Ipopt::Number* x,
bool new_x,
294 Ipopt::Index m, Ipopt::Index , Ipopt::Index* iRow, Ipopt::Index *jCol,
295 Ipopt::Number* values)
300 ControlVector<VECTOR> gradient(q_);
301 ControlVector<VECTOR> gradient_transposed(q_);
305 VECTOR& qval = q_.GetSpacialVector();
306 for(
int i = 0; i < n; i++)
312 P_->ComputeReducedCostFunctional(q_);
314 catch(DOpEException& e)
316 P_->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_g");
320 for(
int j=0; j < m; j++)
324 P_->ComputeReducedGradientOfGlobalConstraints(j,q_,c_,
325 gradient,gradient_transposed);
327 catch(DOpEException& e)
329 P_->GetExceptionHandler()->HandleCriticalException(e,
"IPOPT_PROBLEM::eval_grad_g");
331 const VECTOR& ref_g = gradient_transposed.GetSpacialVector();
332 for(
int i=0; i < n; i++)
334 values[n*j+i] = ref_g(i);
340 assert(nele_jac == n*m);
342 for(
int i = 0; i < n; i++)
344 for(
int j = 0; j < m; j++)
355 template <
typename RPROBLEM,
typename VECTOR>
356 bool Ipopt_Problem<RPROBLEM,VECTOR>::eval_h(Ipopt::Index ,
const Ipopt::Number* ,
bool ,
357 Ipopt::Number , Ipopt::Index ,
const Ipopt::Number* ,
358 bool , Ipopt::Index , Ipopt::Index* ,
359 Ipopt::Index* , Ipopt::Number* )
366 template <
typename RPROBLEM,
typename VECTOR>
367 void Ipopt_Problem<RPROBLEM,VECTOR>::finalize_solution(Ipopt::SolverReturn status,
368 Ipopt::Index n,
const Ipopt::Number* x,
369 const Ipopt::Number* ,
const Ipopt::Number* ,
370 Ipopt::Index ,
const Ipopt::Number* ,
371 const Ipopt::Number* ,
373 const Ipopt::IpoptData* ,
374 Ipopt::IpoptCalculatedQuantities* )
378 VECTOR& ret = init_.GetSpacialVector();
379 for(
int i = 0; i < n; i++)
383 if(status == Ipopt::SUCCESS)
389 #endif //Endof WITH_IPOPT