MAiNGO
ipoptProblem.h
Go to the documentation of this file.
1 /**********************************************************************************
2  * Copyright (c) 2019 Process Systems Engineering (AVT.SVT), RWTH Aachen University
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License 2.0 which is available at
6  * http://www.eclipse.org/legal/epl-2.0.
7  *
8  * SPDX-License-Identifier: EPL-2.0
9  *
10  **********************************************************************************/
11 
12 #pragma once
13 
14 #include "ubpStructure.h"
15 
16 // Needed according to Ipopt Dll readme:
17 #define HAVE_CONFIG_H
18 #include "IpTNLP.hpp"
19 
20 #include <memory>
21 #include <vector>
22 
23 
24 namespace maingo {
25 
26 
27 namespace ubp {
28 
29 
30 struct DagObj;
31 
42 class IpoptProblem: public Ipopt::TNLP {
43 
44  public:
48  IpoptProblem();
49 
61  IpoptProblem(unsigned nvarIn, unsigned neqIn, unsigned nineqIn, unsigned nineqSquashIn, UbpStructure* structureIn,
62  std::shared_ptr<std::vector<Constraint>> constraintPropertiesIn, std::shared_ptr<DagObj> dagObj);
63 
65  virtual ~IpoptProblem();
66 
76  virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
77  Ipopt::Index& nnz_h_lag, IndexStyleEnum& Index_style);
78 
88  virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
89  Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u);
90 
104  virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x,
105  bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
106  Ipopt::Index m, bool init_lambda,
107  Ipopt::Number* lambda);
116  virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number& obj_value);
117 
126  virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number* grad_f);
127 
137  virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Index m, Ipopt::Number* g);
138 
151  virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
152  Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow, Ipopt::Index* jCol,
153  Ipopt::Number* values);
154 
170  virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
171  Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda,
172  bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow,
173  Ipopt::Index* jCol, Ipopt::Number* values);
174 
190  virtual void finalize_solution(Ipopt::SolverReturn status,
191  Ipopt::Index n, const Ipopt::Number* x, const Ipopt::Number* z_L, const Ipopt::Number* z_U,
192  Ipopt::Index m, const Ipopt::Number* g, const Ipopt::Number* lambda,
193  Ipopt::Number obj_value,
194  const Ipopt::IpoptData* ip_data,
195  Ipopt::IpoptCalculatedQuantities* ip_cq);
196 
203  double get_solution(std::vector<double>& sol_x);
204 
212  void set_bounds_and_starting_point(const std::vector<double>& xL, const std::vector<double>& xU, const std::vector<double>& xStart);
213 
214  private:
215  std::shared_ptr<DagObj> _DAGobj;
221  Ipopt::Index _nvar;
222  Ipopt::Index _nineq;
223  Ipopt::Index _nineqSquash;
224  Ipopt::Index _neq;
226  std::shared_ptr<std::vector<Constraint>> _constraintProperties;
227  double _solution_f;
228  std::vector<double> _xL;
229  std::vector<double> _xU;
230  std::vector<double> _xStart;
231  std::vector<double> _solutionX;
234  // Copy constructors made private
235  IpoptProblem(const IpoptProblem&);
237 };
238 
239 
240 } // end namespace ubp
241 
242 
243 } // end namespace maingo
virtual bool eval_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Number *g)
Function called by Ipopt to evaluate the constraints.
Definition: ipoptProblem.cpp:145
std::vector< double > _xL
Definition: ipoptProblem.h:228
virtual bool eval_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number &obj_value)
Function called by Ipopt to evaluate the objective function.
Definition: ipoptProblem.cpp:125
std::shared_ptr< std::vector< Constraint > > _constraintProperties
Definition: ipoptProblem.h:226
virtual ~IpoptProblem()
Destructor.
Definition: ipoptProblem.cpp:36
virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number *grad_f)
Function called by Ipopt to evaluate the gradient of the objective function.
Definition: ipoptProblem.cpp:135
virtual bool get_nlp_info(Ipopt::Index &n, Ipopt::Index &m, Ipopt::Index &nnz_jac_g, Ipopt::Index &nnz_h_lag, IndexStyleEnum &Index_style)
Function called by Ipopt to get basic information on the problem.
Definition: ipoptProblem.cpp:44
std::shared_ptr< DagObj > _DAGobj
Definition: ipoptProblem.h:215
IpoptProblem()
Standard constructor.
IpoptProblem & operator=(const IpoptProblem &)
Ipopt::Index _nineqSquash
Definition: ipoptProblem.h:223
double get_solution(std::vector< double > &sol_x)
Function called from the upper bounding wrapper to query the solution.
Definition: ipoptProblem.cpp:249
Ipopt::Index _nvar
Definition: ipoptProblem.h:221
UbpStructure * _structure
Definition: ipoptProblem.h:225
std::vector< double > _xStart
Definition: ipoptProblem.h:230
virtual bool eval_h(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number *lambda, bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values)
Function called by Ipopt to evaluate the Hessian - not implemented, just throws an exception! ...
Definition: ipoptProblem.cpp:189
namespace holding all essentials of MAiNGO
Definition: aleModel.h:25
virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number *x_l, Ipopt::Number *x_u, Ipopt::Index m, Ipopt::Number *g_l, Ipopt::Number *g_u)
Function called by Ipopt to get information on variables bounds.
Definition: ipoptProblem.cpp:69
double _solution_f
Definition: ipoptProblem.h:227
std::vector< double > _xU
Definition: ipoptProblem.h:229
void set_bounds_and_starting_point(const std::vector< double > &xL, const std::vector< double > &xU, const std::vector< double > &xStart)
Function called from the upper bounding wrapper to specify the variable bounds and starting point...
Definition: ipoptProblem.cpp:259
virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values)
Function called by Ipopt to evaluate the constraints.
Definition: ipoptProblem.cpp:155
Ipopt::Index _nineq
Definition: ipoptProblem.h:222
virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number *x, bool init_z, Ipopt::Number *z_L, Ipopt::Number *z_U, Ipopt::Index m, bool init_lambda, Ipopt::Number *lambda)
Function called by Ipopt to query the starting point for local search.
Definition: ipoptProblem.cpp:103
Class for representing problems to be solved by IpOpt, providing an interface to the problem definiti...
Definition: ipoptProblem.h:42
Struct for storing structure information for the upper bounding solver.
Definition: ubpStructure.h:30
virtual void finalize_solution(Ipopt::SolverReturn status, Ipopt::Index n, const Ipopt::Number *x, const Ipopt::Number *z_L, const Ipopt::Number *z_U, Ipopt::Index m, const Ipopt::Number *g, const Ipopt::Number *lambda, Ipopt::Number obj_value, const Ipopt::IpoptData *ip_data, Ipopt::IpoptCalculatedQuantities *ip_cq)
Function called by Ipopt to communicate the result of the local search.
Definition: ipoptProblem.cpp:230
Ipopt::Index _neq
Definition: ipoptProblem.h:224
std::vector< double > _solutionX
Definition: ipoptProblem.h:231