From aa2c670f3072df9911c878c73887d9620a016f7b Mon Sep 17 00:00:00 2001 From: stevenj Date: Thu, 14 Aug 2008 20:44:55 -0400 Subject: [PATCH] fixed MMA so it compiles and works at least in the unconstrained case again darcs-hash:20080815004455-c8de0-bcd9c932fe94785311188459463df38d7f54d2c6.gz --- api/nlopt.c | 4 +++- mma/mma.c | 12 +++++++----- mma/mma.h | 8 +++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/api/nlopt.c b/api/nlopt.c index fb58dd1..b8019bf 100644 --- a/api/nlopt.c +++ b/api/nlopt.c @@ -409,7 +409,9 @@ static nlopt_result nlopt_minimize_( 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; diff --git a/mma/mma.c b/mma/mma.c index 280ee3f..4c595c4 100644 --- a/mma/mma.c +++ b/mma/mma.c @@ -18,7 +18,7 @@ int mma_verbose = 0; /* > 0 for verbose output */ #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 */ @@ -137,13 +137,14 @@ nlopt_result mma_minimize(int n, nlopt_func f, void *f_data, { 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; @@ -151,7 +152,8 @@ nlopt_result mma_minimize(int n, nlopt_func f, void *f_data, 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; @@ -212,7 +214,7 @@ nlopt_result mma_minimize(int n, nlopt_func f, void *f_data, 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. */ diff --git a/mma/mma.h b/mma/mma.h index b2d18d2..929a228 100644 --- a/mma/mma.h +++ b/mma/mma.h @@ -4,6 +4,8 @@ #include "nlopt.h" #include "nlopt-util.h" +#include /* for ptrdiff_t */ + #ifdef __cplusplus extern "C" { @@ -12,10 +14,14 @@ 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" */ -- 2.30.2