chiark / gitweb /
Use trusty
[nlopt.git] / direct / DIRserial.c
index 60d0a396c8c11d97cadd9d2d650ac0f5600d3cac..03dd91d40d31d518deb7ce88e38302f1ae9c3654 100644 (file)
@@ -18,9 +18,9 @@
        *delta, integer *sample, integer *new__, integer *length, 
        FILE *logfile, doublereal *f, integer *free, integer *maxi, 
        integer *point, fp fcn, doublereal *x, doublereal *l, doublereal *
-       fmin, integer *minpos, doublereal *u, integer *n, integer *maxfunc, 
-       integer *maxdeep, integer *oops, doublereal *fmax, integer *
-       ifeasiblef, integer *iinfesiblef, void *fcn_data)
+       minf, integer *minpos, doublereal *u, integer *n, integer *maxfunc, 
+       const integer *maxdeep, integer *oops, doublereal *fmax, integer *
+       ifeasiblef, integer *iinfesiblef, void *fcn_data, int *force_stop)
 {
     /* System generated locals */
     integer length_dim1, length_offset, c_dim1, c_offset, i__1, i__2;
 /* +-----------------------------------------------------------------------+ */
 /* | Call the function.                                                    | */
 /* +-----------------------------------------------------------------------+ */
-       direct_dirinfcn_(fcn, &x[1], &l[1], &u[1], n, &f[(pos << 1) + 1], 
-                        &kret, fcn_data);
+       if (force_stop && *force_stop)  /* skip eval after forced stop */
+            f[(pos << 1) + 1] = *fmax;
+       else
+            direct_dirinfcn_(fcn, &x[1], &l[1], &u[1], n, &f[(pos << 1) + 1], 
+                             &kret, fcn_data);
+       if (force_stop && *force_stop)
+            kret = -1; /* mark as invalid point */
 /* +-----------------------------------------------------------------------+ */
 /* | Remember IF an infeasible point has been found.                       | */
 /* +-----------------------------------------------------------------------+ */
 /* | Iterate over all evaluated points and see, IF the minimal             | */
 /* | value of the function has changed.  IF this has happEND,               | */
 /* | store the minimal value and its position in the array.                | */
-/* | Attention: Only valied values are checked!!                           | */
+/* | Attention: Only valid values are checked!!                           | */
 /* +-----------------------------------------------------------------------+ */
     i__1 = *maxi + *maxi;
     for (j = 1; j <= i__1; ++j) {
-       if (f[(pos << 1) + 1] < *fmin && f[(pos << 1) + 2] == 0.) {
-           *fmin = f[(pos << 1) + 1];
+       if (f[(pos << 1) + 1] < *minf && f[(pos << 1) + 2] == 0.) {
+           *minf = f[(pos << 1) + 1];
            *minpos = pos;
        }
        pos = point[pos];