chiark / gitweb /
fixed MMA so it compiles and works at least in the unconstrained case again
authorstevenj <stevenj@alum.mit.edu>
Fri, 15 Aug 2008 00:44:55 +0000 (20:44 -0400)
committerstevenj <stevenj@alum.mit.edu>
Fri, 15 Aug 2008 00:44:55 +0000 (20:44 -0400)
darcs-hash:20080815004455-c8de0-bcd9c932fe94785311188459463df38d7f54d2c6.gz

api/nlopt.c
mma/mma.c
mma/mma.h

index fb58dd10648e624fa01254ceff436ab745971256..b8019bf47c5b18f4bfb314bce1834f3ac9e43ed7 100644 (file)
@@ -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;
index 280ee3f363141fe30f540de60bb678c881b18500..4c595c4b8fd2e58e707dba83c6374df32a4f0662 100644 (file)
--- 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. */
 
index b2d18d24ee313978e9c9f52a1e5159943ba46113..929a228f4dd8ff12421c201ca8e567ef872d6120 100644 (file)
--- a/mma/mma.h
+++ b/mma/mma.h
@@ -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" */