Index: /trunk/psLib/src/dataManip/psMinimize.c
===================================================================
--- /trunk/psLib/src/dataManip/psMinimize.c	(revision 1990)
+++ /trunk/psLib/src/dataManip/psMinimize.c	(revision 1991)
@@ -9,6 +9,6 @@
  *  @author GLF, MHPCC
  *
- *  @version $Revision: 1.55 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-06 21:30:53 $
+ *  @version $Revision: 1.56 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-06 23:29:16 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -1297,4 +1297,6 @@
  
 XXX: Define constants for default dummy number of iterations and tolerance.
+ 
+XXX: Must define behavior on various NULL inputs.
  *****************************************************************************/
 bool psMinimizePowell(psMinimization *min,
@@ -1304,4 +1306,10 @@
                       psMinimizePowellFunc func)
 {
+    PS_CHECK_NULL_VECTOR_RETURN_NULL(params);
+    PS_CHECK_EMPTY_VECTOR_RETURN_NULL(params);
+    PS_CHECK_NULL_PTR_RETURN_NULL(min);
+    PS_CHECK_NULL_PTR_RETURN_NULL(coords);
+    PS_CHECK_NULL_PTR_RETURN_NULL(func);
+
     int numDims = params->n;
     int i = 0;
@@ -1311,4 +1319,5 @@
     psVector *Q = NULL;
     psVector *u = NULL;
+    psVector *myParamMask = NULL;  // XXX: Use a recylced vector here.
     psMinimization dummyMin;
     float mul = 0.0;
@@ -1333,4 +1342,14 @@
     Q = psVectorAlloc(numDims, PS_TYPE_F32);
 
+    if (paramMask == NULL) {
+        myParamMask = psVectorAlloc(params->n, PS_TYPE_U8);
+        for (i=0;i<myParamMask->n;i++) {
+            myParamMask->data.U8[i] = 0;
+        }
+    } else {
+        myParamMask = (psVector *) paramMask;
+    }
+    PS_CHECK_VECTOR_SIZE_EQUAL_RETURN_NULL(params, myParamMask);
+
     // 1: Set v[i] to be the unit vectors for each dimension in params
     v = (psVector **) psAlloc(params->n * sizeof(psVector **));
@@ -1348,5 +1367,5 @@
     // 2: Set Q to be the initial params (P in the ADD)
     for (i=0;i<numDims;i++) {
-        if (paramMask->data.U8[i] == 0) {
+        if (myParamMask->data.U8[i] == 0) {
             Q->data.F32[i] = params->data.F32[i];
         }
@@ -1368,8 +1387,8 @@
         biggestIter = 0;
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 dummyMin.maxIter = 100;
                 dummyMin.tol = 0.01;
-                mul = p_psLineMin(&dummyMin, Q, v[i], paramMask, coords, func);
+                mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func);
                 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) {
                     biggestDiff = fabs(dummyMin.value - currFuncVal);
@@ -1382,5 +1401,5 @@
         // 4: Set the vector u = Q - P
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 u->data.F32[i] = Q->data.F32[i] - params->data.F32[i];
 
@@ -1402,5 +1421,5 @@
         }
 
-        mul = p_psLineMin(min, params, u, paramMask, coords, func);
+        mul = p_psLineMin(min, params, u, myParamMask, coords, func);
 
         // 6:
@@ -1413,4 +1432,7 @@
             psFree(pQP);
             psFree(Q);
+            if (paramMask == NULL) {
+                psFree(myParamMask);
+            }
             psTrace(".psLib.dataManip.psMinimizePowell", 4,
                     "---- psMinimizePowell() end (true) ----\n");
@@ -1419,5 +1441,5 @@
 
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i];
             } else {
@@ -1434,5 +1456,5 @@
         if (term1 < term2) {
             for (i=0;i<numDims;i++) {
-                if (paramMask->data.U8[i] == 0) {
+                if (myParamMask->data.U8[i] == 0) {
                     v[biggestIter]->data.F32[i] = u->data.F32[i];
                 }
@@ -1442,5 +1464,5 @@
         // 7: Set P to Q
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 params->data.F32[i] = Q->data.F32[i];
             }
@@ -1458,8 +1480,14 @@
             psTrace(".psLib.dataManip.psMinimizePowell", 4,
                     "---- psMinimizePowell() end (true) ----\n");
+            if (paramMask == NULL) {
+                psFree(myParamMask);
+            }
             return(true);
         }
     }
 
+    if (paramMask == NULL) {
+        psFree(myParamMask);
+    }
     for (i=0;i<numDims;i++) {
         psFree(v[i]);
Index: /trunk/psLib/src/math/psMinimize.c
===================================================================
--- /trunk/psLib/src/math/psMinimize.c	(revision 1990)
+++ /trunk/psLib/src/math/psMinimize.c	(revision 1991)
@@ -9,6 +9,6 @@
  *  @author GLF, MHPCC
  *
- *  @version $Revision: 1.55 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-10-06 21:30:53 $
+ *  @version $Revision: 1.56 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-10-06 23:29:16 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -1297,4 +1297,6 @@
  
 XXX: Define constants for default dummy number of iterations and tolerance.
+ 
+XXX: Must define behavior on various NULL inputs.
  *****************************************************************************/
 bool psMinimizePowell(psMinimization *min,
@@ -1304,4 +1306,10 @@
                       psMinimizePowellFunc func)
 {
+    PS_CHECK_NULL_VECTOR_RETURN_NULL(params);
+    PS_CHECK_EMPTY_VECTOR_RETURN_NULL(params);
+    PS_CHECK_NULL_PTR_RETURN_NULL(min);
+    PS_CHECK_NULL_PTR_RETURN_NULL(coords);
+    PS_CHECK_NULL_PTR_RETURN_NULL(func);
+
     int numDims = params->n;
     int i = 0;
@@ -1311,4 +1319,5 @@
     psVector *Q = NULL;
     psVector *u = NULL;
+    psVector *myParamMask = NULL;  // XXX: Use a recylced vector here.
     psMinimization dummyMin;
     float mul = 0.0;
@@ -1333,4 +1342,14 @@
     Q = psVectorAlloc(numDims, PS_TYPE_F32);
 
+    if (paramMask == NULL) {
+        myParamMask = psVectorAlloc(params->n, PS_TYPE_U8);
+        for (i=0;i<myParamMask->n;i++) {
+            myParamMask->data.U8[i] = 0;
+        }
+    } else {
+        myParamMask = (psVector *) paramMask;
+    }
+    PS_CHECK_VECTOR_SIZE_EQUAL_RETURN_NULL(params, myParamMask);
+
     // 1: Set v[i] to be the unit vectors for each dimension in params
     v = (psVector **) psAlloc(params->n * sizeof(psVector **));
@@ -1348,5 +1367,5 @@
     // 2: Set Q to be the initial params (P in the ADD)
     for (i=0;i<numDims;i++) {
-        if (paramMask->data.U8[i] == 0) {
+        if (myParamMask->data.U8[i] == 0) {
             Q->data.F32[i] = params->data.F32[i];
         }
@@ -1368,8 +1387,8 @@
         biggestIter = 0;
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 dummyMin.maxIter = 100;
                 dummyMin.tol = 0.01;
-                mul = p_psLineMin(&dummyMin, Q, v[i], paramMask, coords, func);
+                mul = p_psLineMin(&dummyMin, Q, v[i], myParamMask, coords, func);
                 if (fabs(dummyMin.value - currFuncVal) > biggestDiff) {
                     biggestDiff = fabs(dummyMin.value - currFuncVal);
@@ -1382,5 +1401,5 @@
         // 4: Set the vector u = Q - P
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 u->data.F32[i] = Q->data.F32[i] - params->data.F32[i];
 
@@ -1402,5 +1421,5 @@
         }
 
-        mul = p_psLineMin(min, params, u, paramMask, coords, func);
+        mul = p_psLineMin(min, params, u, myParamMask, coords, func);
 
         // 6:
@@ -1413,4 +1432,7 @@
             psFree(pQP);
             psFree(Q);
+            if (paramMask == NULL) {
+                psFree(myParamMask);
+            }
             psTrace(".psLib.dataManip.psMinimizePowell", 4,
                     "---- psMinimizePowell() end (true) ----\n");
@@ -1419,5 +1441,5 @@
 
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 pQP->data.F32[i] = (2 * Q->data.F32[i]) - params->data.F32[i];
             } else {
@@ -1434,5 +1456,5 @@
         if (term1 < term2) {
             for (i=0;i<numDims;i++) {
-                if (paramMask->data.U8[i] == 0) {
+                if (myParamMask->data.U8[i] == 0) {
                     v[biggestIter]->data.F32[i] = u->data.F32[i];
                 }
@@ -1442,5 +1464,5 @@
         // 7: Set P to Q
         for (i=0;i<numDims;i++) {
-            if (paramMask->data.U8[i] == 0) {
+            if (myParamMask->data.U8[i] == 0) {
                 params->data.F32[i] = Q->data.F32[i];
             }
@@ -1458,8 +1480,14 @@
             psTrace(".psLib.dataManip.psMinimizePowell", 4,
                     "---- psMinimizePowell() end (true) ----\n");
+            if (paramMask == NULL) {
+                psFree(myParamMask);
+            }
             return(true);
         }
     }
 
+    if (paramMask == NULL) {
+        psFree(myParamMask);
+    }
     for (i=0;i<numDims;i++) {
         psFree(v[i]);
Index: /trunk/psLib/test/dataManip/tst_psFunc05.c
===================================================================
--- /trunk/psLib/test/dataManip/tst_psFunc05.c	(revision 1990)
+++ /trunk/psLib/test/dataManip/tst_psFunc05.c	(revision 1991)
@@ -6,4 +6,6 @@
     psSpline1DEvalVector() on new data values and ensures that the results
     are correct.
+ 
+    XXX: Only F32 types are tested here.  F64 types are tested elsewhere.
  *****************************************************************************/
 #include <stdio.h>
Index: /trunk/psLib/test/dataManip/tst_psMinimize04.c
===================================================================
--- /trunk/psLib/test/dataManip/tst_psMinimize04.c	(revision 1990)
+++ /trunk/psLib/test/dataManip/tst_psMinimize04.c	(revision 1991)
@@ -27,5 +27,5 @@
 #define C 3.0
 #define ERROR_TOLERANCE 0.10
-#define YERR 10.0
+#define YERR 1.0
 double setData(double x)
 {
Index: /trunk/psLib/test/dataManip/tst_psMinimize05.c
===================================================================
--- /trunk/psLib/test/dataManip/tst_psMinimize05.c	(revision 1990)
+++ /trunk/psLib/test/dataManip/tst_psMinimize05.c	(revision 1991)
@@ -1,4 +1,8 @@
 /*****************************************************************************
     This routine must ensure that psMinimizePowell() works correctly.
+ 
+    We test with a NULL and non-NULL paramMask.
+ 
+    XXX: Must verify the stderr for the NULL parameter tests.
  *****************************************************************************/
 #include <stdio.h>
@@ -9,4 +13,5 @@
 #define MIN_VALUE 20.0
 #define NUM_PARAMS 10
+#define ERROR_TOLERANCE 0.10
 float expectedParm[NUM_PARAMS];
 int testStatus = true;
@@ -57,5 +62,5 @@
 
 
-int main()
+int t00()
 {
     int currentId = psMemGetId();
@@ -86,10 +91,30 @@
     }
 
-    psMinimizePowell(min, myParams, myParamMask, myCoords, (psMinimizePowellFunc) myFunc);
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizePowell()");
+
+    psMinimizePowell(min,
+                     myParams,
+                     myParamMask,
+                     myCoords,
+                     (psMinimizePowellFunc) myFunc);
+
     printf("\nThe minimum is %f (expected: %f)\n", min->value, MIN_VALUE);
+
     for (i=0;i<NUM_PARAMS;i++) {
         printf("Parameter %d at the minimum is %f (expected: %f)\n", i,
                myParams->data.F32[i], expectedParm[i]);
-    }
+
+        if (fabs(myParams->data.F32[i] - expectedParm[i]) > fabs(ERROR_TOLERANCE * expectedParm[i])) {
+            printf("ERROR: Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+            testStatus = false;
+        } else {
+            printf("Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+        }
+    }
+
 
     psFree(myCoords);
@@ -103,4 +128,145 @@
         psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
     }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizePowell()",
+                testStatus);
+
+
     return (!testStatus);
 }
+
+int t01()
+{
+    int currentId = psMemGetId();
+    int memLeaks = 0;
+    int i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psMinimization *min;
+
+    psTraceSetLevel(".psLib", 0);
+    /**************************************************************************
+     *************************************************************************/
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    min = psMinimizationAlloc(100, 0.01);
+
+    myCoords = psArrayAlloc(N);
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPTR *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10);
+        ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3);
+    }
+    for (i=0;i<NUM_PARAMS;i++) {
+        expectedParm[i] = 2.32 + (float) (2 * i);
+        myParams->data.F32[i] = 0.0;
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizePowell()");
+
+    psMinimizePowell(min,
+                     myParams,
+                     NULL,
+                     myCoords,
+                     (psMinimizePowellFunc) myFunc);
+
+    printf("\nThe minimum is %f (expected: %f)\n", min->value, MIN_VALUE);
+
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("Parameter %d at the minimum is %f (expected: %f)\n", i,
+               myParams->data.F32[i], expectedParm[i]);
+
+        if (fabs(myParams->data.F32[i] - expectedParm[i]) > fabs(ERROR_TOLERANCE * expectedParm[i])) {
+            printf("ERROR: Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+            testStatus = false;
+        } else {
+            printf("Parameter %d: (%.1f), expected was (%.1f)\n",
+                   i, myParams->data.F32[i], expectedParm[i]);
+        }
+    }
+
+
+    psFree(myCoords);
+    psFree(myParams);
+    psFree(min);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizePowell()",
+                testStatus);
+
+
+    return (!testStatus);
+}
+
+int t02()
+{
+    int currentId = psMemGetId();
+    int memLeaks = 0;
+    int i = 0;
+    psArray *myCoords;
+    psVector *myParams;
+    psVector *myParamMask;
+    psMinimization *min;
+
+    psTraceSetLevel(".psLib", 0);
+    /**************************************************************************
+     *************************************************************************/
+    myParams = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    myParamMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    min = psMinimizationAlloc(100, 0.01);
+
+    myCoords = psArrayAlloc(N);
+    for (i=0;i<N;i++) {
+        myCoords->data[i] = (psPTR *) psVectorAlloc(2, PS_TYPE_F32);
+        ((psVector *) (myCoords->data[i]))->data.F32[0] = (float) (i+10);
+        ((psVector *) (myCoords->data[i]))->data.F32[1] = (float) (i+3);
+    }
+    for (i=0;i<NUM_PARAMS;i++) {
+        expectedParm[i] = 2.32 + (float) (2 * i);
+        myParams->data.F32[i] = 0.0;
+        myParamMask->data.U8[i] = 0;
+    }
+
+    printPositiveTestHeader(stdout,
+                            "psMinimize functions",
+                            "psMinimizePowell(): various NULL inputs");
+
+    psMinimizePowell(NULL, myParams, myParamMask, myCoords, (psMinimizePowellFunc) myFunc);
+    psMinimizePowell(min, NULL, myParamMask, myCoords,(psMinimizePowellFunc) myFunc);
+    psMinimizePowell(min, myParams, myParamMask, NULL, (psMinimizePowellFunc) myFunc);
+    psMinimizePowell(min, myParams, myParamMask, myCoords, NULL);
+
+    psFree(myCoords);
+    psFree(myParams);
+    psFree(myParamMask);
+    psFree(min);
+
+    psMemCheckCorruption(1);
+    memLeaks = psMemCheckLeaks(currentId,NULL,stderr);
+    if (0 != memLeaks) {
+        psAbort(__func__,"Memory Leaks! (%d leaks)", memLeaks);
+    }
+    printFooter(stdout,
+                "psMinimize functions",
+                "psMinimizePowell(): various NULL inputs",
+                testStatus);
+
+
+    return (!testStatus);
+}
+
+int main()
+{
+    t00();
+    t01();
+    t02();
+}
