chiark / gitweb /
detect singular case in BOBYQA
authorstevenj <stevenj@alum.mit.edu>
Tue, 17 Nov 2009 20:49:52 +0000 (15:49 -0500)
committerstevenj <stevenj@alum.mit.edu>
Tue, 17 Nov 2009 20:49:52 +0000 (15:49 -0500)
darcs-hash:20091117204952-c8de0-431f828a31642f18f4394f438e3bdb94128288ac.gz

bobyqa/bobyqa.c
test/testopt.cpp

index f34133322c1d5a6e5ad04b76cc3216d6f3b5d609..51f5ddb650a91c1d187ef1dd73f58dea4ca659ca 100644 (file)
@@ -2747,6 +2747,12 @@ L360:
 /* L500: */
            suma += zmat[knew + jj * zmat_dim1] * zmat[k + jj * zmat_dim1];
        }
+       if (nlopt_isinf(suma)) {
+         /* SGJ: detect singularity here (happend if we run
+            for too many iterations) ... is there another way to recover? */
+         rc = NLOPT_ROUNDOFF_LIMITED;
+         goto L720;
+       }
        sumb = zero;
        i__2 = *n;
        for (j = 1; j <= i__2; ++j) {
index 18a5a1e437f5e06f46d1a56d6322b04d2285ce94..4d73c014d92f01cd7c1dc754135cdfd735347542 100644 (file)
@@ -210,8 +210,11 @@ static int test_function(int ifunc)
     printf("Minimum at x = [");
     for (i = 0; i < func.n; ++i) printf(" %g", x[i]);
     printf("]\n");
-    printf("|f - minf| = %g, |f - minf| / |minf| = %e\n",
-          fabs(minf - func.minf), fabs(minf - func.minf) / fabs(func.minf));
+    if (func.minf == 0)
+      printf("|f - minf| = %g\n", fabs(minf - func.minf));
+    else
+      printf("|f - minf| = %g, |f - minf| / |minf| = %e\n",
+            fabs(minf - func.minf), fabs(minf - func.minf) / fabs(func.minf));
     total_err += fabs(minf - func.minf);
     if (fabs(minf - func.minf) > max_err)
       max_err = fabs(minf - func.minf);