chiark / gitweb /
don't call MLSL recursively (e.g. in auglag)
authorstevenj <stevenj@alum.mit.edu>
Sun, 4 Apr 2010 22:24:32 +0000 (18:24 -0400)
committerstevenj <stevenj@alum.mit.edu>
Sun, 4 Apr 2010 22:24:32 +0000 (18:24 -0400)
darcs-hash:20100404222432-c8de0-d8e9e542f9b3e8add61ec28c5346858e37bd3577.gz

api/optimize.c

index 2738351d1366110c0eefea6834aef3224c07ae03..595f44e92a8c079fa32a0a2ea8ee318656f55074 100644 (file)
@@ -357,10 +357,17 @@ nlopt_result nlopt_optimize(nlopt_opt opt, double *x, double *minf)
              nlopt_opt local_opt = opt->local_opt;
              nlopt_result ret;
              if (!local_opt) { /* default */
-                  local_opt = nlopt_create((algorithm == NLOPT_GN_MLSL ||
-                                            algorithm == NLOPT_GN_MLSL_LDS)
-                                           ? nlopt_local_search_alg_nonderiv
-                                           : nlopt_local_search_alg_deriv, n);
+                  nlopt_algorithm local_alg = (algorithm == NLOPT_GN_MLSL ||
+                                               algorithm == NLOPT_GN_MLSL_LDS)
+                       ? nlopt_local_search_alg_nonderiv
+                       : nlopt_local_search_alg_deriv;
+                  /* don't call MLSL recursively! */
+                  if (local_alg >= NLOPT_GN_MLSL
+                      && local_alg <= NLOPT_GD_MLSL_LDS)
+                       local_alg = (algorithm == NLOPT_GN_MLSL ||
+                                    algorithm == NLOPT_GN_MLSL_LDS)
+                            ? NLOPT_LN_COBYLA : NLOPT_LD_MMA;
+                  local_opt = nlopt_create(local_alg, n);
                   if (!local_opt) return NLOPT_FAILURE;
                   nlopt_set_ftol_rel(local_opt, opt->ftol_rel);
                   nlopt_set_ftol_abs(local_opt, opt->ftol_abs);