Index: trunk/psLib/src/dataManip/psMinimize.c
===================================================================
--- trunk/psLib/src/dataManip/psMinimize.c	(revision 2230)
+++ trunk/psLib/src/dataManip/psMinimize.c	(revision 2235)
@@ -9,6 +9,6 @@
  *  @author GLG, MHPCC
  *
- *  @version $Revision: 1.74 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-28 23:03:11 $
+ *  @version $Revision: 1.75 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-29 02:00:25 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -1188,4 +1188,6 @@
 }
 
+
+#define PS_DETERMINE_BRACKET_MAX_ITERATIONS 100
 psVector *p_psDetermineBracket2(psVector *params,
                                 psVector *line,
@@ -1200,11 +1202,5 @@
     float fb = 0.0;
     float fc = 0.0;
-    psS32 iter = 100;
-    float aDir = 0.0;
-    float cDir = 0.0;
-    float new_aDir = 0.0;
-    float new_cDir = 0.0;
-    psVector *bracket = psVectorAlloc(3, PS_TYPE_F32);
-    float stepSize = PS_DETERMINE_BRACKET_STEP_SIZE;
+    psS32 iter = 0;
     psVector *tmp = NULL;
     psBool boolLineIsNull = true;
@@ -1220,37 +1216,76 @@
         psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
                 "---- p_psDetermineBracket() end (NULL) ----\n");
-        psFree(bracket);
         return(NULL);
     }
 
+    psVector *bracket = psVectorAlloc(3, PS_TYPE_F32);
     tmp = psVectorAlloc(params->n, PS_TYPE_F32);
 
-    a = 0.0;
-    b = stepSize;
-
-    PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);
-    fa = func(tmp, coords);
+
+    determineINitialBracket(params, paramMask, line, coords, func, &a, &b, &fa, &fb);
+
+    a = -1.0;
+    b = 0.0;
+    c = 1.0;
 
     PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, b);
     fb = func(tmp, coords);
 
-    if (fa < fb) {
-        aDir = -1;
-    } else {
-        aDir = 1;
-    }
-
+    do {
+        a*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);
+        fa = func(tmp, coords);
+    } while (fabs(fb - fa) < FLT_EPSILON);
+
+    do {
+        c*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE);
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+        fc = func(tmp, coords);
+    } while (fabs(fc - fb) < FLT_EPSILON);
+
+    if ((fb < fa) && (fb < fc)) {
+        bracket->data.F32[0] = a;
+        bracket->data.F32[1] = b;
+        bracket->data.F32[2] = c;
+        psFree(tmp);
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "---- p_psDetermineBracket() end ----\n");
+        return(bracket);
+    }
+
+    // The object of this code is to set the initial point a to 0.0, and
+    // ensure that (fb < fa).
     if (fc < fb) {
-        cDir = -1;
-    } else {
-        cDir = 1;
-    }
-
-    psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
-            "(a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", a, b, c, fa, fb, fc);
-
-    while (iter > 0) {
+        a = b;
+        b = c;
+        fa = fb;
+        fb = fc;
+    } else if (fa < fb) {
+        float aSave = a;
+        float faSave = fa;
+
+        a = b;
+        fa = fb;
+
+        b = aSave;
+        fb = faSave;
+    }
+    c = b;
+
+    // At this point we have (a, b) and we know that (fa > fb).  Initially, c=b;
+    // We keep stretching b out further from "a" until (fc > previous fc).  If
+    // that happens, then we have our bracket.
+    iter = 0;
+    while (iter < PS_DETERMINE_BRACKET_MAX_ITERATIONS) {
         psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
-                "psDetermineBracket(): iteration %d\n", iter);
+                "psDetermineBracket(): iterationA %d\n", iter);
+        c*= (1.0 + PS_DETERMINE_BRACKET_STEP_SIZE);
+
+        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
+        fc = func(tmp, coords);
+
+        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
+                "IterA(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);
+
         if ((fb < fa) && (fb < fc)) {
             bracket->data.F32[0] = a;
@@ -1261,52 +1296,13 @@
                     "---- p_psDetermineBracket() end ----\n");
             return(bracket);
-        }
-        stepSize*= (1.0 + stepSize);
-        a =- stepSize;
-        c =+ stepSize;
-
-        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, a);
-        fa = func(tmp, coords);
-
-        PS_VECTOR_ADD_MULTIPLE(params, paramMask, line, tmp, c);
-        fc = func(tmp, coords);
-
-        psTrace(".psLib.dataManip.p_psDetermineBracket", 6,
-                "Iter(%d): (a, b, c) is (%f %f %f) (fa, fb, fc) is (%f %f %f)\n", iter, a, b, c, fa, fb, fc);
-
-        if (fa < fb) {
-            new_aDir = -1;
         } else {
-            new_aDir = 1;
-        }
-
-        if (fc < fb) {
-            new_cDir = -1;
-        } else {
-            new_cDir = 1;
-        }
-        if ((new_aDir == 1) && (aDir == -1)) {
-            bracket->data.F32[0] = a;
-            bracket->data.F32[1] = b;
-            bracket->data.F32[2] = c;
-            psFree(tmp);
-            psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
-                    "---- p_psDetermineBracket() end ----\n");
-            return(bracket);
-        }
-
-        if ((new_cDir == 1) && (cDir == -1)) {
-            bracket->data.F32[0] = a;
-            bracket->data.F32[1] = b;
-            bracket->data.F32[2] = c;
-            psFree(tmp);
-            psTrace(".psLib.dataManip.p_psDetermineBracket", 4,
-                    "---- p_psDetermineBracket() end ----\n");
-            return(bracket);
-        }
-        aDir = new_aDir;
-        cDir = new_cDir;
-        iter--;
-    }
+            b = c;
+            fb = fc;
+        }
+        iter++;
+    }
+
+    // Okay, let's try the other direction.
+
     psFree(tmp);
     psFree(bracket);
@@ -1397,5 +1393,5 @@
     }
 
-    bracket = p_psDetermineBracket(params, line, paramMask, coords, func);
+    bracket = p_psDetermineBracket2(params, line, paramMask, coords, func);
     if (bracket == NULL) {
         psFree(tmpa);
