/* * Copyright (C) 2017 Jelmer Ypma. All Rights Reserved. * This code is published under the L-GPL. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * File: nloptrAPI.h * Author: Jelmer Ypma * Date: 3 October 2017 * * This file provides an API for calling internal NLopt code from C within * R packages. The C functions that are registered in init_nloptr.c can be * accessed by external R packages. * * 03/10/2017: Initial version exposing nlopt_version. */ #ifndef __NLOPTRAPI_H__ #define __NLOPTRAPI_H__ #include #include #include #include /* * C functions can be exposed using the following template: * * RET_TYPE FUNCNAME(ARGTYPE_1 ARGNAME 1, ARGTYPE_2 ARGNAME_2) * { * static RET_TYPE(*fun)(ARGTYPE_1, ARGTYPE_2) = NULL; * if (fun == NULL) fun = (RET_TYPE(*)(ARGTYPE_1, ARGTYPE_2)) R_GetCCallable("nloptr","FUNCNAME"); * return fun(ARGNAME_1, ARGNAME_2); * } * */ inline NLOPT_EXTERN(const char *) nlopt_algorithm_name(nlopt_algorithm a) { static const char *(*fun)(nlopt_algorithm) = NULL; if (fun == NULL) fun = (const char *(*)(nlopt_algorithm)) R_GetCCallable("nloptr","nlopt_algorithm_name"); return fun(a); } inline NLOPT_EXTERN(void) nlopt_srand(unsigned long seed) { static void(*fun)(unsigned long) = NULL; if (fun == NULL) fun = (void(*)(unsigned long)) R_GetCCallable("nloptr","nlopt_srand"); return fun(seed); } inline NLOPT_EXTERN(void) nlopt_srand_time(void) { static void(*fun)(void) = NULL; if (fun == NULL) fun = (void(*)(void)) R_GetCCallable("nloptr","nlopt_srand_time"); return fun(); } inline NLOPT_EXTERN(void) nlopt_version(int *major, int *minor, int *bugfix) { static void(*fun)(int *, int *, int *) = NULL; if (fun == NULL) fun = (void(*)(int *, int *, int *)) R_GetCCallable("nloptr","nlopt_version"); return fun(major, minor, bugfix); } inline NLOPT_EXTERN(nlopt_opt) nlopt_create(nlopt_algorithm algorithm, unsigned n) { static nlopt_opt(*fun)(nlopt_algorithm, unsigned) = NULL; if (fun == NULL) fun = (nlopt_opt(*)(nlopt_algorithm, unsigned)) R_GetCCallable("nloptr","nlopt_create"); return fun(algorithm, n); } inline NLOPT_EXTERN(void) nlopt_destroy(nlopt_opt opt) { static void(*fun)(nlopt_opt) = NULL; if (fun == NULL) fun = (void(*)(nlopt_opt)) R_GetCCallable("nloptr","nlopt_destroy"); return fun(opt); } inline NLOPT_EXTERN(nlopt_opt) nlopt_copy(const nlopt_opt opt) { static nlopt_opt(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (nlopt_opt(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_copy"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_optimize(nlopt_opt opt, double *x, double *opt_f) { static nlopt_result(*fun)(nlopt_opt, double *, double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double *, double *)) R_GetCCallable("nloptr","nlopt_optimize"); return fun(opt, x, opt_f); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_min_objective(nlopt_opt opt, nlopt_func f, void *f_data) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, void *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, void *)) R_GetCCallable("nloptr","nlopt_set_min_objective"); return fun(opt, f, f_data); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_max_objective(nlopt_opt opt, nlopt_func f, void *f_data) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, void *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, void *)) R_GetCCallable("nloptr","nlopt_set_max_objective"); return fun(opt, f, f_data); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_precond_min_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, nlopt_precond, void *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, nlopt_precond, void *)) R_GetCCallable("nloptr","nlopt_set_precond_min_objective"); return fun(opt, f, pre, f_data); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_precond_max_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, nlopt_precond, void *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, nlopt_precond, void *)) R_GetCCallable("nloptr","nlopt_set_precond_max_objective"); return fun(opt, f, pre, f_data); } inline NLOPT_EXTERN(nlopt_algorithm) nlopt_get_algorithm(const nlopt_opt opt) { static nlopt_algorithm(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (nlopt_algorithm(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_algorithm"); return fun(opt); } inline NLOPT_EXTERN(unsigned) nlopt_get_dimension(const nlopt_opt opt) { static unsigned(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (unsigned(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_dimension"); return fun(opt); } /* constraints: */ inline NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds(nlopt_opt opt, const double *lb) { static nlopt_result(*fun)(nlopt_opt, const double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, const double *)) R_GetCCallable("nloptr","nlopt_set_lower_bounds"); return fun(opt, lb); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds1(nlopt_opt opt, double lb) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_lower_bounds1"); return fun(opt, lb); } inline NLOPT_EXTERN(nlopt_result) nlopt_get_lower_bounds(const nlopt_opt opt, double *lb) { static nlopt_result(*fun)(const nlopt_opt, double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(const nlopt_opt, double *)) R_GetCCallable("nloptr","nlopt_get_lower_bounds"); return fun(opt, lb); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds(nlopt_opt opt, const double *ub) { static nlopt_result(*fun)(nlopt_opt, const double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, const double *)) R_GetCCallable("nloptr","nlopt_set_upper_bounds"); return fun(opt, ub); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds1(nlopt_opt opt, double ub) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_upper_bounds1"); return fun(opt, ub); } inline NLOPT_EXTERN(nlopt_result) nlopt_get_upper_bounds(const nlopt_opt opt, double *ub) { static nlopt_result(*fun)(const nlopt_opt, double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(const nlopt_opt, double *)) R_GetCCallable("nloptr","nlopt_get_upper_bounds"); return fun(opt, ub); } inline NLOPT_EXTERN(nlopt_result) nlopt_remove_inequality_constraints(nlopt_opt opt) { static nlopt_result(*fun)(nlopt_opt) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt)) R_GetCCallable("nloptr","nlopt_remove_inequality_constraints"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_constraint(nlopt_opt opt, nlopt_func fc, void *fc_data, double tol) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, void *, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, void *, double)) R_GetCCallable("nloptr","nlopt_add_inequality_constraint"); return fun(opt, fc, fc_data, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_add_precond_inequality_constraint( nlopt_opt opt, nlopt_func fc, nlopt_precond pre, void *fc_data, double tol) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, nlopt_precond, void *, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, nlopt_precond, void *, double)) R_GetCCallable("nloptr","nlopt_add_precond_inequality_constraint"); return fun(opt, fc, pre, fc_data, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_mconstraint(nlopt_opt opt, unsigned m, nlopt_mfunc fc, void *fc_data, const double *tol) { static nlopt_result(*fun)(nlopt_opt, unsigned, nlopt_mfunc, void *, const double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, unsigned, nlopt_mfunc, void *, const double *)) R_GetCCallable("nloptr","nlopt_add_inequality_mconstraint"); return fun(opt, m, fc, fc_data, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_remove_equality_constraints(nlopt_opt opt) { static nlopt_result(*fun)(nlopt_opt) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt)) R_GetCCallable("nloptr","nlopt_remove_equality_constraints"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_add_equality_constraint(nlopt_opt opt, nlopt_func h, void *h_data, double tol) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, void *, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, void *, double)) R_GetCCallable("nloptr","nlopt_add_equality_constraint"); return fun(opt, h, h_data, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_add_precond_equality_constraint( nlopt_opt opt, nlopt_func h, nlopt_precond pre, void *h_data, double tol) { static nlopt_result(*fun)(nlopt_opt, nlopt_func, nlopt_precond, void *, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, nlopt_func, nlopt_precond, void *, double)) R_GetCCallable("nloptr","nlopt_add_precond_equality_constraint"); return fun(opt, h, pre, h_data, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_add_equality_mconstraint(nlopt_opt opt, unsigned m, nlopt_mfunc h, void *h_data, const double *tol) { static nlopt_result(*fun)(nlopt_opt, unsigned, nlopt_mfunc, void *, const double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, unsigned, nlopt_mfunc, void *, const double *)) R_GetCCallable("nloptr","nlopt_add_equality_mconstraint"); return fun(opt, m, h, h_data, tol); } /* stopping criteria: */ inline NLOPT_EXTERN(nlopt_result) nlopt_set_stopval(nlopt_opt opt, double stopval) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_stopval"); return fun(opt, stopval); } inline NLOPT_EXTERN(double) nlopt_get_stopval(const nlopt_opt opt) { static double(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (double(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_stopval"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_rel(nlopt_opt opt, double tol) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_ftol_rel"); return fun(opt, tol); } inline NLOPT_EXTERN(double) nlopt_get_ftol_rel(const nlopt_opt opt) { static double(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (double(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_ftol_rel"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_abs(nlopt_opt opt, double tol) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_ftol_abs"); return fun(opt, tol); } inline NLOPT_EXTERN(double) nlopt_get_ftol_abs(const nlopt_opt opt) { static double(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (double(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_ftol_abs"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_rel(nlopt_opt opt, double tol) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_xtol_rel"); return fun(opt, tol); } inline NLOPT_EXTERN(double) nlopt_get_xtol_rel(const nlopt_opt opt) { static double(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (double(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_xtol_rel"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs1(nlopt_opt opt, double tol) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_xtol_abs1"); return fun(opt, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs(nlopt_opt opt, const double *tol) { static nlopt_result(*fun)(nlopt_opt, const double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, const double *)) R_GetCCallable("nloptr","nlopt_set_xtol_abs"); return fun(opt, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_get_xtol_abs(const nlopt_opt opt, double *tol) { static nlopt_result(*fun)(nlopt_opt, double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double *)) R_GetCCallable("nloptr","nlopt_get_xtol_abs"); return fun(opt, tol); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_maxeval(nlopt_opt opt, int maxeval) { static nlopt_result(*fun)(nlopt_opt, int) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, int)) R_GetCCallable("nloptr","nlopt_set_maxeval"); return fun(opt, maxeval); } inline NLOPT_EXTERN(int) nlopt_get_maxeval(const nlopt_opt opt) { static int(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (int(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_maxeval"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_maxtime(nlopt_opt opt, double maxtime) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_maxtime"); return fun(opt, maxtime); } inline NLOPT_EXTERN(double) nlopt_get_maxtime(const nlopt_opt opt) { static double(*fun)(nlopt_opt) = NULL; if (fun == NULL) fun = (double(*)(nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_maxtime"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_force_stop(nlopt_opt opt) { static nlopt_result(*fun)(nlopt_opt) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt)) R_GetCCallable("nloptr","nlopt_force_stop"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_force_stop(nlopt_opt opt, int val) { static nlopt_result(*fun)(nlopt_opt, int) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, int)) R_GetCCallable("nloptr","nlopt_set_force_stop"); return fun(opt, val); } inline NLOPT_EXTERN(int) nlopt_get_force_stop(const nlopt_opt opt) { static int(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (int(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_force_stop"); return fun(opt); } /* more algorithm-specific parameters */ inline NLOPT_EXTERN(nlopt_result) nlopt_set_local_optimizer(nlopt_opt opt, const nlopt_opt local_opt) { static nlopt_result(*fun)(nlopt_opt, const nlopt_opt) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, const nlopt_opt)) R_GetCCallable("nloptr","nlopt_set_local_optimizer"); return fun(opt, local_opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_population(nlopt_opt opt, unsigned pop) { static nlopt_result(*fun)(nlopt_opt, unsigned) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, unsigned)) R_GetCCallable("nloptr","nlopt_set_population"); return fun(opt, pop); } inline NLOPT_EXTERN(unsigned) nlopt_get_population(const nlopt_opt opt) { static unsigned(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (unsigned(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_population"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_vector_storage(nlopt_opt opt, unsigned dim) { static nlopt_result(*fun)(nlopt_opt, unsigned) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, unsigned)) R_GetCCallable("nloptr","nlopt_set_vector_storage"); return fun(opt, dim); } inline NLOPT_EXTERN(unsigned) nlopt_get_vector_storage(const nlopt_opt opt) { static unsigned(*fun)(const nlopt_opt) = NULL; if (fun == NULL) fun = (unsigned(*)(const nlopt_opt)) R_GetCCallable("nloptr","nlopt_get_vector_storage"); return fun(opt); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_default_initial_step(nlopt_opt opt, const double *x) { static nlopt_result(*fun)(nlopt_opt, const double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, const double *)) R_GetCCallable("nloptr","nlopt_set_default_initial_step"); return fun(opt, x); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step(nlopt_opt opt, const double *dx) { static nlopt_result(*fun)(nlopt_opt, const double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, const double *)) R_GetCCallable("nloptr","nlopt_set_initial_step"); return fun(opt, dx); } inline NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step1(nlopt_opt opt, double dx) { static nlopt_result(*fun)(nlopt_opt, double) = NULL; if (fun == NULL) fun = (nlopt_result(*)(nlopt_opt, double)) R_GetCCallable("nloptr","nlopt_set_initial_step1"); return fun(opt, dx); } inline NLOPT_EXTERN(nlopt_result) nlopt_get_initial_step(const nlopt_opt opt, const double *x, double *dx) { static nlopt_result(*fun)(const nlopt_opt, const double *, double *) = NULL; if (fun == NULL) fun = (nlopt_result(*)(const nlopt_opt, const double *, double *)) R_GetCCallable("nloptr","nlopt_get_initial_step"); return fun(opt, x, dx); } #endif /* __NLOPTRAPI_H__ */