Ipopt 3.11.9
Loading...
Searching...
No Matches
IpoptRNLP.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2010 Jelmer Ypma. All Rights Reserved.
3 * This code is published under the Eclipse Public License.
4 *
5 * file: IpoptRNLP.hpp
6 * author: Jelmer Ypma
7 * date: 18 April 2010
8 *
9 * This file defines a C++ class that derives from Ipopt::TNLP. The class
10 * takes care of interaction between Ipopt and user-defined functions in R.
11 *
12 * Financial support of the UK Economic and Social Research Council
13 * through a grant (RES-589-28-0001) to the ESRC Centre for Microdata
14 * Methods and Practice (CeMMAP) is gratefully acknowledged.
15 */
16
17#ifndef __IpoptRNLP_HPP__
18#define __IpoptRNLP_HPP__
19
20#include "IpTNLP.hpp" // ISA TNLP
21
22#include <assert.h>
23
24#include <R.h>
25#include <Rdefines.h>
26#include <R_ext/Utils.h>
27// Rdefines.h is somewhat more higher level then Rinternal.h, and is preferred if the code might be shared with S at any stage.
28// Utils.h defines void R_CheckUserInterrupt(void); to allow user interuption from R
29
30
31class IpoptRNLP : public Ipopt::TNLP
32{
33 SEXP R_environment; // this is the environment that the function gets called in. This environment can be used
34 // to pass common data to the R functions.
35 SEXP R_eval_f; // objective function
36 SEXP R_eval_grad_f; // gradient of objective function
37
38 SEXP R_init_values; // vector with initial values, we get the Ipopt::Number of controls from the length of this vector
39
40 SEXP R_lower_bounds; // lower bounds of the control x
41 SEXP R_upper_bounds; // upper bounds of the control x
42
43 SEXP R_eval_g; // function to evaluate constraints
44 SEXP R_eval_jac_g; // function to evaluate jacobian of constraints
45 SEXP R_eval_jac_g_structure; // list with non-zero elements in the Jacobian, this defines the sparse structure
46
47 SEXP R_constraint_lower_bounds; // lower bounds of the contraint function g()
48 SEXP R_constraint_upper_bounds; // upper bounds of the contraint function g()
49
50 SEXP R_eval_h; // function to evaluate Hessian
51 SEXP R_eval_h_structure; // list with non-zero elements of the Hessian, this defines the sparse structure
52
53 SEXP R_result_list; // structure that will contain the return values
54
55 bool d_hessian_approximation; // should we approximate the Hessian? default: false
56
57 int d_num_protected_members; // counter of the number of PROTECT calls of the SEXPs above
58public:
61
63 virtual ~IpoptRNLP();
64
65 void set_R_environment( SEXP env );
66
67
68 void set_R_eval_f( SEXP f );
69 void set_R_eval_grad_f( SEXP f );
70
71 void set_R_init_values( SEXP x0 );
72 void set_R_lower_bounds( SEXP lb );
73 void set_R_upper_bounds( SEXP ub );
74
75 void set_R_eval_g( SEXP g );
76 void set_R_eval_jac_g( SEXP g );
78
81
82 void set_R_eval_h( SEXP h );
83 void set_R_eval_h_structure( SEXP s );
84
86
88
92 virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
93 Ipopt::Index& nnz_h_lag, IndexStyleEnum& Index_style);
94
98
100 virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x,
101 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
102 Ipopt::Index m, bool init_lambda,
103 Ipopt::Number* lambda);
104
106 virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number& obj_value);
107
109 virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number* grad_f);
110
112 virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Index m, Ipopt::Number* g);
113
118 virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
120 Ipopt::Number* values);
121
126 virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
127 Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda,
128 bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow,
129 Ipopt::Index* jCol, Ipopt::Number* values);
130
132
137 Ipopt::Index n, const Ipopt::Number* x, const Ipopt::Number* z_L, const Ipopt::Number* z_U,
138 Ipopt::Index m, const Ipopt::Number* g, const Ipopt::Number* lambda,
139 Ipopt::Number obj_value,
140 const Ipopt::IpoptData* ip_data,
143
144private:
156 // IpoptRNLP();
160};
161
162
163#endif
Number * x
Input: Starting point Output: Optimal solution.
Number Number Index Number Number Index Index nele_hess
Number of non-zero elements in Hessian of Lagrangian.
Number Number * g
Values of constraint at final point (output only - ignored if set to NULL)
Number Number Index Number Number Index nele_jac
Number of non-zero elements in constraint Jacobian.
Number Number Index m
Number of constraints.
virtual bool eval_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number &obj_value)
Method to return the objective value.
SEXP R_lower_bounds
Definition IpoptRNLP.hpp:40
void set_R_eval_h(SEXP h)
IpoptRNLP(const IpoptRNLP &)
SEXP R_eval_f
Definition IpoptRNLP.hpp:35
IpoptRNLP()
default constructor
SEXP R_result_list
Definition IpoptRNLP.hpp:53
void set_R_environment(SEXP env)
SEXP R_eval_g
Definition IpoptRNLP.hpp:43
virtual bool eval_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Number *g)
Method to return the constraint residuals.
SEXP R_constraint_lower_bounds
Definition IpoptRNLP.hpp:47
SEXP R_eval_jac_g
Definition IpoptRNLP.hpp:44
void set_R_eval_h_structure(SEXP s)
void set_R_constraint_upper_bounds(SEXP ub)
SEXP R_constraint_upper_bounds
Definition IpoptRNLP.hpp:48
void set_R_lower_bounds(SEXP lb)
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)
Method to return: 1) The structure of the jacobian (if "values" is NULL) 2) The values of the jacobia...
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)
Method to return: 1) The structure of the hessian of the lagrangian (if "values" is NULL) 2) The valu...
void set_R_upper_bounds(SEXP ub)
SEXP R_eval_grad_f
Definition IpoptRNLP.hpp:36
virtual ~IpoptRNLP()
default destructor
virtual bool get_nlp_info(Ipopt::Index &n, Ipopt::Index &m, Ipopt::Index &nnz_jac_g, Ipopt::Index &nnz_h_lag, IndexStyleEnum &Index_style)
Method to return some info about the nlp.
SEXP R_environment
Definition IpoptRNLP.hpp:33
SEXP R_init_values
Definition IpoptRNLP.hpp:38
void set_R_constraint_lower_bounds(SEXP lb)
void set_R_eval_f(SEXP f)
SEXP get_R_result_list()
virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number *grad_f)
Method to return the gradient of the objective.
SEXP R_eval_h
Definition IpoptRNLP.hpp:50
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)
Method to return the bounds for my problem.
SEXP R_eval_jac_g_structure
Definition IpoptRNLP.hpp:45
IpoptRNLP & operator=(const IpoptRNLP &)
bool d_hessian_approximation
Definition IpoptRNLP.hpp:55
void set_R_eval_grad_f(SEXP f)
int d_num_protected_members
Definition IpoptRNLP.hpp:57
SEXP R_eval_h_structure
Definition IpoptRNLP.hpp:51
void set_R_eval_g(SEXP g)
void set_R_eval_jac_g(SEXP g)
void set_R_eval_jac_g_structure(SEXP s)
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)
This method is called when the algorithm is complete so the TNLP can store/write the solution.
void set_R_init_values(SEXP x0)
SEXP R_upper_bounds
Definition IpoptRNLP.hpp:41
void set_hessian_approximation(bool b)
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)
Method to return the starting point for the algorithm.
Class for all IPOPT specific calculated quantities.
Class to organize all the data required by the algorithm.
Base class for all NLP's that use standard triplet matrix form and dense vectors.
Definition IpTNLP.hpp:51
IndexStyleEnum
overload this method to return the number of variables and constraints, and the number of non-zeros i...
Definition IpTNLP.hpp:80
SolverReturn
enum for the return from the optimize algorithm (obviously we need to add more)
int Index
Type of all indices of vectors, matrices etc.
Definition IpTypes.hpp:19
double Number
Type of all numbers.
Definition IpTypes.hpp:17