提交 aa2c670f 编写于 作者: S stevenj

fixed MMA so it compiles and works at least in the unconstrained case again

darcs-hash:20080815004455-c8de0-bcd9c932fe94785311188459463df38d7f54d2c6.gz
上级 b5092ed2
......@@ -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;
......
......@@ -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. */
......
......@@ -4,6 +4,8 @@
#include "nlopt.h"
#include "nlopt-util.h"
#include <stddef.h> /* 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" */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册