algorithm >= NLOPT_GN_MLSL_LDS);
case NLOPT_LD_MMA:
- return mma_minimize(n, f, f_data, lb, ub, x, minf, &stop);
+ return mma_minimize(n, f, f_data, 0, NULL, NULL, 0,
+ lb, ub, x, minf, &stop,
+ local_search_alg_deriv, 1e-8, 100000);
default:
return NLOPT_INVALID_ARGS;
#define MMA_RHOMIN 1e-5
/***********************************************************************/
-/* function for MMA's dual optimization of the approximant function */
+/* function for MMA's dual solution of the approximate problem */
typedef struct {
int n; /* must be set on input to dimension of x */
{
nlopt_result ret = NLOPT_SUCCESS;
double *xcur, rho, *sigma, *dfdx, *dfdx_cur, *xprev, *xprevprev, fcur;
- double *dfcdx, *dfcdx_cur, *fcval, *rhoc, *gcval, *y, *dual_lb, *dual_ub;
+ double *dfcdx, *dfcdx_cur;
+ double *fcval, *fcval_cur, *rhoc, *gcval, *y, *dual_lb, *dual_ub;
int i, j, k = 0;
char *fc_data = (char *) fc_data_;
dual_data dd;
int feasible;
- sigma = (double *) malloc(sizeof(double) * (6*n + 2*m*n + m*6));
+ sigma = (double *) malloc(sizeof(double) * (6*n + 2*m*n + m*7));
if (!sigma) return NLOPT_OUT_OF_MEMORY;
dfdx = sigma + n;
dfdx_cur = dfdx + n;
xprev = xcur + n;
xprevprev = xprev + n;
fcval = xprevprev + n;
- rhoc = fcval + m;
+ fcval_cur = fcval + m;
+ rhoc = fcval_cur + m;
gcval = rhoc + m;
dual_lb = gcval + m;
dual_ub = dual_lb + m;
dd.rho = rho;
nlopt_minimize(dual_alg, m, dual_func, &dd,
dual_lb, dual_ub, y, &min_dual,
- -HUGE_VAL, dual_tolrel, 0, 0, NULL, dual_maxeval,
+ -HUGE_VAL, dual_tolrel,0., 0.,NULL, dual_maxeval,
stop->maxtime - (nlopt_seconds() - stop->start));
dual_func(m, y, NULL, &dd); /* evaluate final xcur etc. */
#include "nlopt.h"
#include "nlopt-util.h"
+#include <stddef.h> /* for ptrdiff_t */
+
#ifdef __cplusplus
extern "C"
{
extern int mma_verbose;
nlopt_result mma_minimize(int n, nlopt_func f, void *f_data,
+ int m, nlopt_func fc,
+ void *fc_data_, ptrdiff_t fc_data_size,
const double *lb, const double *ub, /* bounds */
double *x, /* in: initial guess, out: minimizer */
double *minf,
- nlopt_stopping *stop);
+ nlopt_stopping *stop,
+ nlopt_algorithm dual_alg,
+ double dual_tolrel, int dual_maxeval);
#ifdef __cplusplus
} /* extern "C" */