26 #include "ipopt_nlp.hpp"
27 #include "ipopt_interface.hpp"
28 #include "casadi/core/timing.hpp"
29 #include "casadi/core/convexify.hpp"
34 : solver_(solver), mem_(mem) {
38 #ifdef WITH_IPOPT_CALLBACK
41 z_L_ =
new double[n_];
42 z_U_ =
new double[n_];
43 lambda_ =
new double[m_];
49 #ifdef WITH_IPOPT_CALLBACK
60 Index& nnz_h_lag, IndexStyleEnum& index_style) {
64 index_style = TNLP::C_STYLE;
71 Index m, Number* g_l, Number* g_u) {
72 casadi_assert_dev(n==solver_.
nx_);
73 casadi_assert_dev(m==solver_.
ng_);
79 bool init_z, Number* z_L, Number* z_U,
80 Index m,
bool init_lambda,
82 casadi_assert_dev(n==solver_.
nx_);
83 casadi_assert_dev(m==solver_.
ng_);
84 return solver_.
get_starting_point(mem_, init_x, x, init_z, z_L, z_U, init_lambda, lambda);
91 mem_->
res[0] = &obj_value;
95 casadi_warning(
"KeyboardInterruptException");
97 }
catch (std::exception& ex) {
99 casadi_warning(
"IpoptUserClass::eval_f failed:" + std::string(ex.
what()));
109 mem_->
res[0] =
nullptr;
110 mem_->
res[1] = grad_f;
114 casadi_warning(
"KeyboardInterruptException");
116 }
catch (std::exception& ex) {
118 casadi_warning(
"IpoptUserClass::eval_grad_f failed:" + std::string(ex.
what()));
132 casadi_warning(
"KeyboardInterruptException");
134 }
catch (std::exception& ex) {
136 casadi_warning(
"IpoptUserClass::eval_g failed:" + std::string(ex.
what()));
144 Index m, Index nele_jac, Index* iRow, Index *jCol,
150 mem_->
res[0] =
nullptr;
151 mem_->
res[1] = values;
155 casadi_warning(
"KeyboardInterruptException");
157 }
catch (std::exception& ex) {
159 casadi_warning(
"IpoptUserClass::eval_jac_g failed:" + std::string(ex.
what()));
168 if (nele_jac!=colind[ncol])
return false;
171 for (casadi_int cc=0; cc<ncol; ++cc) {
172 for (casadi_int el=colind[cc]; el<colind[cc+1]; ++el) {
183 Number obj_factor, Index m,
const Number* lambda,
184 bool new_lambda, Index nele_hess, Index* iRow,
185 Index* jCol, Number* values) {
190 mem_->
arg[2] = &obj_factor;
191 mem_->
arg[3] = lambda;
192 mem_->
res[0] = values;
196 casadi_warning(
"KeyboardInterruptException");
198 }
catch (std::exception& ex) {
200 casadi_warning(
"IpoptUserClass::eval_h failed:" + std::string(ex.
what()));
218 for (casadi_int cc=0; cc<ncol; ++cc) {
219 for (casadi_int el=colind[cc]; el<colind[cc+1]; ++el) {
230 const Number* z_L,
const Number* z_U,
231 Index m,
const Number* g,
const Number* lambda,
233 const IpoptData* ip_data,
234 IpoptCalculatedQuantities* ip_cq) {
241 Number inf_pr, Number inf_du,
242 Number mu, Number d_norm,
243 Number regularization_size,
244 Number alpha_du, Number alpha_pr,
246 const IpoptData* ip_data,
247 IpoptCalculatedQuantities* ip_cq) {
256 bool full_callback =
false;
258 #ifdef WITH_IPOPT_CALLBACK
259 OrigIpoptNLP* orignlp =
dynamic_cast<OrigIpoptNLP*
>(GetRawPtr(ip_cq->GetIpoptNLP()));
260 if (!orignlp)
return true;
261 TNLPAdapter* tnlp_adapter =
dynamic_cast<TNLPAdapter*
>(GetRawPtr(orignlp->nlp()));
262 if (!tnlp_adapter)
return true;
264 const Vector& x = *ip_data->curr()->x();
265 const Vector& z_L = *ip_data->curr()->z_L();
266 const Vector& z_U = *ip_data->curr()->z_U();
267 const Vector& c = *ip_cq->curr_c();
268 const Vector& d = *ip_cq->curr_d();
269 const Vector& y_c = *ip_data->curr()->y_c();
270 const Vector& y_d = *ip_data->curr()->y_d();
272 std::fill_n(x_, n_, 0);
273 std::fill_n(g_, m_, 0);
274 std::fill_n(z_L_, n_, 0);
275 std::fill_n(z_U_, n_, 0);
276 std::fill_n(lambda_, m_, 0);
278 tnlp_adapter->ResortX(x, x_);
279 tnlp_adapter->ResortG(y_c, y_d, lambda_);
280 tnlp_adapter->ResortG(c, d, g_);
283 const Index* c_pos = tnlp_adapter->P_c_g_->ExpandedPosIndices();
284 Index n_c_no_fixed = tnlp_adapter->P_c_g_->NCols();
285 for (Index i=0; i<n_c_no_fixed; i++) {
286 g_[c_pos[i]] += tnlp_adapter->c_rhs_[i];
289 #if (IPOPT_VERSION_MAJOR > 3) || (IPOPT_VERSION_MAJOR == 3 && IPOPT_VERSION_MINOR >= 14)
290 tnlp_adapter->ResortBounds(z_L, z_L_, z_U, z_U_);
292 tnlp_adapter->ResortBnds(z_L, z_L_, z_U, z_U_);
296 if (tnlp_adapter->fixed_variable_treatment_==TNLPAdapter::MAKE_CONSTRAINT &&
297 tnlp_adapter->n_x_fixed_>0) {
298 const DenseVector* dy_c =
static_cast<const DenseVector*
>(&y_c);
299 Index n_c_no_fixed = y_c.Dim() - tnlp_adapter->n_x_fixed_;
300 if (!dy_c->IsHomogeneous()) {
301 const Number* values = dy_c->Values();
302 for (Index i=0; i<tnlp_adapter->n_x_fixed_; i++) {
303 z_L_[tnlp_adapter->x_fixed_map_[i]] = Max(0., -values[n_c_no_fixed+i]);
304 z_U_[tnlp_adapter->x_fixed_map_[i]] = Max(0., values[n_c_no_fixed+i]);
307 double value = dy_c->Scalar();
308 for (Index i=0; i<tnlp_adapter->n_x_fixed_; i++) {
309 z_L_[tnlp_adapter->x_fixed_map_[i]] = Max(0., -value);
310 z_U_[tnlp_adapter->x_fixed_map_[i]] = Max(0., value);
314 full_callback =
true;
318 inf_pr, inf_du, mu, d_norm, regularization_size,
319 alpha_du, alpha_pr, ls_trials, full_callback);
327 Index* pos_nonlin_vars) {
332 IntegerMetaDataMapType& var_integer_md,
333 NumericMetaDataMapType& var_numeric_md,
334 Index m, StringMetaDataMapType& con_string_md,
335 IntegerMetaDataMapType& con_integer_md,
336 NumericMetaDataMapType& con_numeric_md) {
339 con_string_md, con_integer_md, con_numeric_md);
343 const IntegerMetaDataMapType& var_integer_md,
344 const NumericMetaDataMapType& var_numeric_md,
345 Index m,
const StringMetaDataMapType& con_string_md,
346 const IntegerMetaDataMapType& con_integer_md,
347 const NumericMetaDataMapType& con_numeric_md) {
348 casadi_assert_dev(n==solver_.
nx_);
349 casadi_assert_dev(m==solver_.
ng_);
const char * what() const override
Display error.
'ipopt' plugin for Nlpsol
void get_nlp_info(IpoptMemory *m, int &nx, int &ng, int &nnz_jac_g, int &nnz_h_lag) const
void finalize_solution(IpoptMemory *m, const double *x, const double *z_L, const double *z_U, const double *g, const double *lambda, double obj_value, int iter_count) const
bool get_bounds_info(IpoptMemory *m, double *x_l, double *x_u, double *g_l, double *g_u) const
bool convexify_
convexify?
ConvexifyData convexify_data_
Data for convexification.
int get_number_of_nonlinear_variables() const
bool get_var_con_metadata(std::map< std::string, std::vector< std::string > > &var_string_md, std::map< std::string, std::vector< int > > &var_integer_md, std::map< std::string, std::vector< double > > &var_numeric_md, std::map< std::string, std::vector< std::string > > &con_string_md, std::map< std::string, std::vector< int > > &con_integer_md, std::map< std::string, std::vector< double > > &con_numeric_md) const
bool intermediate_callback(IpoptMemory *m, const double *x, const double *z_L, const double *z_U, const double *g, const double *lambda, double obj_value, int iter, double inf_pr, double inf_du, double mu, double d_norm, double regularization_size, double alpha_du, double alpha_pr, int ls_trials, bool full_callback) const
bool get_list_of_nonlinear_variables(int num_nonlin_vars, int *pos_nonlin_vars) const
bool get_starting_point(IpoptMemory *m, bool init_x, double *x, bool init_z, double *z_L, double *z_U, bool init_lambda, double *lambda) const
void finalize_solution(SolverReturn status, Index n, const Number *x, const Number *z_L, const Number *z_U, Index m, const Number *g, const Number *lambda, Number obj_value, const IpoptData *ip_data, IpoptCalculatedQuantities *ip_cq) override
~IpoptUserClass() override
bool intermediate_callback(AlgorithmMode mode, Index iter, Number obj_value, Number inf_pr, Number inf_du, Number mu, Number d_norm, Number regularization_size, Number alpha_du, Number alpha_pr, Index ls_trials, const IpoptData *ip_data, IpoptCalculatedQuantities *ip_cq) override
bool get_var_con_metadata(Index n, StringMetaDataMapType &var_string_md, IntegerMetaDataMapType &var_integer_md, NumericMetaDataMapType &var_numeric_md, Index m, StringMetaDataMapType &con_string_md, IntegerMetaDataMapType &con_integer_md, NumericMetaDataMapType &con_numeric_md) override
void finalize_metadata(Index n, const StringMetaDataMapType &var_string_md, const IntegerMetaDataMapType &var_integer_md, const NumericMetaDataMapType &var_numeric_md, Index m, const StringMetaDataMapType &con_string_md, const IntegerMetaDataMapType &con_integer_md, const NumericMetaDataMapType &con_numeric_md) override
bool get_list_of_nonlinear_variables(Index num_nonlin_vars, Index *pos_nonlin_vars) override
bool eval_g(Index n, const Number *x, bool new_x, Index m, Number *g) override
IpoptUserClass(const IpoptInterface &solver, IpoptMemory *mem)
bool get_bounds_info(Index n, Number *x_l, Number *x_u, Index m, Number *g_l, Number *g_u) override
bool eval_h(Index n, const Number *x, bool new_x, Number obj_factor, Index m, const Number *lambda, bool new_lambda, Index nele_hess, Index *iRow, Index *jCol, Number *values) override
bool eval_jac_g(Index n, const Number *x, bool new_x, Index m, Index nele_jac, Index *iRow, Index *jCol, Number *values) override
bool eval_f(Index n, const Number *x, bool new_x, Number &obj_value) override
bool get_starting_point(Index n, bool init_x, Number *x, bool init_z, Number *z_L, Number *z_U, Index m, bool init_lambda, Number *lambda) override
bool get_nlp_info(Index &n, Index &m, Index &nnz_jac_g, Index &nnz_h_lag, IndexStyleEnum &index_style) override
bool eval_grad_f(Index n, const Number *x, bool new_x, Number *grad_f) override
Index get_number_of_nonlinear_variables() override
casadi_int ng_
Number of constraints.
casadi_int callback_step_
Execute the callback function only after this amount of iterations.
casadi_int nx_
Number of variables.
int calc_function(OracleMemory *m, const std::string &fcn, const double *const *arg=nullptr, int thread_id=0) const
bool show_eval_warnings_
Show evaluation warnings.
casadi_int size2() const
Get the number of columns.
const casadi_int * row() const
Get a reference to row-vector,.
const casadi_int * colind() const
Get a reference to the colindex of all column element (see class description)
casadi_convexify_config< double > config
std::map< std::string, std::vector< double > > con_numeric_md
std::map< std::string, std::vector< std::string > > var_string_md
std::map< std::string, std::vector< std::string > > con_string_md
std::map< std::string, std::vector< int > > var_integer_md
std::map< std::string, std::vector< double > > var_numeric_md
std::map< std::string, std::vector< int > > con_integer_md
casadi_nlpsol_data< double > d_nlp
std::map< std::string, FStats > fstats