Index: /trunk/psLib/src/dataManip/psMinimize.c
===================================================================
--- /trunk/psLib/src/dataManip/psMinimize.c	(revision 1122)
+++ /trunk/psLib/src/dataManip/psMinimize.c	(revision 1123)
@@ -122,11 +122,11 @@
 
     for (i=0;i<domain->numRows;i++) {
-        //        printf("Data item %d is ( ", i);
+        printf("Data item %d is ( ", i);
         for (j=0;j<domain->numCols;j++) {
             tmpVecPtr->data.F32[j] = domain->data.F32[i][j];
-            //            printf("%.1f ", tmpVecPtr->data.F32[j]);
+            printf("%.1f ", tmpVecPtr->data.F32[j]);
         }
         tmpf = evalModel(tmpVecPtr, inputParameterList);
-        //        printf(" ).  Output is %.1f\n", tmpf);
+        printf(" ).  Output is %.1f\n", tmpf);
 
         gsl_vector_set(outData, i, (tmpf - data->data.F32[i])/
Index: /trunk/psLib/src/math/psMinimize.c
===================================================================
--- /trunk/psLib/src/math/psMinimize.c	(revision 1122)
+++ /trunk/psLib/src/math/psMinimize.c	(revision 1123)
@@ -122,11 +122,11 @@
 
     for (i=0;i<domain->numRows;i++) {
-        //        printf("Data item %d is ( ", i);
+        printf("Data item %d is ( ", i);
         for (j=0;j<domain->numCols;j++) {
             tmpVecPtr->data.F32[j] = domain->data.F32[i][j];
-            //            printf("%.1f ", tmpVecPtr->data.F32[j]);
+            printf("%.1f ", tmpVecPtr->data.F32[j]);
         }
         tmpf = evalModel(tmpVecPtr, inputParameterList);
-        //        printf(" ).  Output is %.1f\n", tmpf);
+        printf(" ).  Output is %.1f\n", tmpf);
 
         gsl_vector_set(outData, i, (tmpf - data->data.F32[i])/
Index: /trunk/psLib/test/dataManip/tst_psMinimize00.c
===================================================================
--- /trunk/psLib/test/dataManip/tst_psMinimize00.c	(revision 1122)
+++ /trunk/psLib/test/dataManip/tst_psMinimize00.c	(revision 1123)
@@ -11,7 +11,42 @@
 #include "psFunctions.h"
 #include "psMinimize.h"
+#include <math.h>
 #define NUM_DATA 10
 #define DATA_WIDTH 2
 #define NUM_PARAMS 4
+
+// The function is f(x) = (A * e^(lambda x)) + b
+
+float myFunc2(const psVector *restrict myData,
+              const psVector *restrict myParams)
+{
+    float x = myData->data.F32[0];
+    float A = myParams->data.F32[0];
+    float lambda = myParams->data.F32[1];
+    float b = myParams->data.F32[2];
+
+    return(A * exp(-lambda * x) + b);
+}
+
+float myFunc2Deriv(const psVector *restrict myData,
+                   const psVector *restrict myParams,
+                   int whichParamDeriv)
+{
+    float x = myData->data.F32[0];
+    float A = myParams->data.F32[0];
+    float lambda = myParams->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = exp(-lambda * x);
+    } else if (whichParamDeriv == 1) {
+        tmp = -x * A * exp(-lambda * x);
+    } else if (whichParamDeriv == 2) {
+        tmp = 1.0;
+    }
+    return(tmp);
+}
+
+
 
 float myFunc(const psVector *restrict myData,
@@ -24,6 +59,11 @@
     float C = myParams->data.F32[2];
     float D = myParams->data.F32[3];
+    float tmp = 0.0;
 
-    return(A + (B*x) + (C*y) + (D*x*y));
+    tmp = A + (B*x) + (C*y) + (D*x*y);
+    printf("--------- myFunc((%.1f %.1f) %.1f %.1f %.1f %.1f) is %.1f ---------\n",
+           x, y, A, B, C, D, tmp);
+
+    return(tmp);
 }
 
@@ -45,4 +85,8 @@
         tmp = x * y;
     }
+
+    printf("--------- myFuncDeriv((%.1f %.1f) %.1f %.1f %.1f %.1f (%d)) is %.1f ---------\n",
+           x, y, myParams->data.F32[0], myParams->data.F32[1],
+           myParams->data.F32[2], myParams->data.F32[3], whichParamDeriv, tmp);
     return(tmp);
 }
@@ -63,4 +107,5 @@
     int testStatus = 0;
     int memLeaks = 0;
+    psVector *theParams = NULL;
 
     domain = psImageAlloc(DATA_WIDTH, NUM_DATA, PS_TYPE_F32);
@@ -71,5 +116,4 @@
     tmpVecPtr = psVectorAlloc(DATA_WIDTH, PS_TYPE_F32);
 
-    printf("FUCK: initialGuess->n is %d\n", initialGuess->n);
     // Build the data.
     initialGuess->data.F32[0] = 2.0;
@@ -77,4 +121,5 @@
     initialGuess->data.F32[2] = 4.0;
     initialGuess->data.F32[3] = 5.0;
+
     for (i = 0; i<NUM_DATA; i++) {
         for (j=0; j<DATA_WIDTH; j++) {
@@ -83,12 +128,18 @@
     }
     for (i = 0; i<NUM_DATA; i++) {
-        errors->data.F32[i] = 0.1;
+        errors->data.F32[i] = 1.0;
     }
 
+    printf("========== Setting Data Values ==========\n");
     for (i = 0; i<NUM_DATA; i++) {
         for (j=0; j<DATA_WIDTH; j++) {
-            tmpVecPtr->data.F32[i] = domain->data.F32[i][j];
+            tmpVecPtr->data.F32[j] = domain->data.F32[i][j];
         }
         data->data.F32[i] = myFunc(tmpVecPtr, initialGuess);
+    }
+
+    for (i=0;i<NUM_PARAMS;i++) {
+        initialGuess->data.F32[i] = 1.0;
+        initialGuess->data.F32[i]+= 10.0;
     }
 
@@ -97,12 +148,17 @@
                             "Calculate Histogram, no mask");
 
-    psMinimizeChi2(myFunc,
-                   myFuncDeriv,
-                   domain,
-                   data,
-                   errors,
-                   initialGuess,
-                   NULL,
-                   &chiSq);
+    theParams = psMinimizeChi2(myFunc2,
+                               myFunc2Deriv,
+                               domain,
+                               data,
+                               errors,
+                               initialGuess,
+                               NULL,
+                               &chiSq);
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("theParams[%d] is %.1f\n", i, theParams->data.F32[i]);
+    }
+
+
 
     printf("chiSq is %f\n", chiSq);
Index: /trunk/psLib/test/dataManip/tst_psMinimize01.c
===================================================================
--- /trunk/psLib/test/dataManip/tst_psMinimize01.c	(revision 1123)
+++ /trunk/psLib/test/dataManip/tst_psMinimize01.c	(revision 1123)
@@ -0,0 +1,143 @@
+/*****************************************************************************
+    This routine must ensure that the psMinimizeChi2 function correctly
+    minimizes an arbitrary function.
+ *****************************************************************************/
+#include <stdio.h>
+#include "pslib.h"
+#include "psTest.h"
+#include "psMemory.h"
+#include "psVector.h"
+#include "psImage.h"
+#include "psFunctions.h"
+#include "psMinimize.h"
+#include <math.h>
+#define NUM_DATA 40
+#define DATA_WIDTH 1
+#define NUM_PARAMS 3
+
+// The function is f(x) = (A * e^(lambda x)) + b
+
+float myFunc(const psVector *restrict myData,
+             const psVector *restrict myParams)
+{
+    float x = myData->data.F32[0];
+    float A = myParams->data.F32[0];
+    float lambda = myParams->data.F32[1];
+    float b = myParams->data.F32[2];
+    float tmp = A * exp(-lambda * x) + b;
+
+    //    printf("--------- myFunc((%.1f) %.1f %.1f %.1f) is %.1f ---------\n",
+    //           x, A, lambda, b, tmp);
+
+    return(tmp);
+}
+
+float myFuncDeriv(const psVector *restrict myData,
+                  const psVector *restrict myParams,
+                  int whichParamDeriv)
+{
+    float x = myData->data.F32[0];
+    float A = myParams->data.F32[0];
+    float lambda = myParams->data.F32[1];
+    float tmp = 0.0;
+
+    if (whichParamDeriv == 0) {
+        tmp = exp(-lambda * x);
+    } else if (whichParamDeriv == 1) {
+        tmp = -x * A * exp(-lambda * x);
+    } else if (whichParamDeriv == 2) {
+        tmp = 1.0;
+    }
+
+    //    printf("--------- myFuncDeriv((%.1f) %.1f %.1f %.1f, %d) is %.1f ---------\n",
+    //           x, A, lambda, myParams->data.F32[2], whichParamDeriv, tmp);
+
+    return(tmp);
+}
+
+int main()
+{
+    psImage *domain = NULL;
+    psVector *data = NULL;
+    psVector *errors = NULL;
+    psVector *initialGuess = NULL;
+    psVector *paramMask = NULL;
+    psVector *tmpVecPtr = NULL;
+    float chiSq = 0.0;
+    int i = 0;
+    psVector *theParams = NULL;
+
+    domain = psImageAlloc(DATA_WIDTH, NUM_DATA, PS_TYPE_F32);
+    data = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    errors = psVectorAlloc(NUM_DATA, PS_TYPE_F32);
+    initialGuess = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    paramMask = psVectorAlloc(NUM_PARAMS, PS_TYPE_F32);
+    tmpVecPtr = psVectorAlloc(DATA_WIDTH, PS_TYPE_F32);
+
+    // Build the data.
+    initialGuess->data.F32[0] = 1.0;
+    initialGuess->data.F32[1] = 0.0;
+    initialGuess->data.F32[2] = 0.0;
+
+    for (i = 0; i<NUM_DATA; i++) {
+        errors->data.F32[i] = 0.1;
+        domain->data.F32[i][0] = (float) i;
+    }
+
+    printf("========== Setting Data Values ==========\n");
+    data->data.F32[0] = 6.013392;
+    data->data.F32[1] = 5.515377;
+    data->data.F32[2] = 5.261095;
+    data->data.F32[3] = 4.777455;
+    data->data.F32[4] = 4.451353;
+    data->data.F32[5] = 3.904903;
+    data->data.F32[6] = 3.504387;
+    data->data.F32[7] = 3.414999;
+    data->data.F32[8] = 3.242736;
+    data->data.F32[9] = 3.122204;
+    data->data.F32[10] = 2.837632;
+    data->data.F32[11] = 2.534700;
+    data->data.F32[12] = 2.439173;
+    data->data.F32[13] = 2.380830;
+    data->data.F32[14] = 2.316090;
+    data->data.F32[15] = 2.060826;
+    data->data.F32[16] = 1.945679;
+    data->data.F32[17] = 1.914126;
+    data->data.F32[18] = 1.759509;
+    data->data.F32[19] = 1.665067;
+    data->data.F32[20] = 1.737926;
+    data->data.F32[21] = 1.575523;
+    data->data.F32[22] = 1.525066;
+    data->data.F32[23] = 1.409607;
+    data->data.F32[24] = 1.395209;
+    data->data.F32[25] = 1.416887;
+    data->data.F32[26] = 1.376042;
+    data->data.F32[27] = 1.260955;
+    data->data.F32[28] = 1.289627;
+    data->data.F32[29] = 1.422672;
+    data->data.F32[30] = 1.228287;
+    data->data.F32[31] = 1.199176;
+    data->data.F32[32] = 1.189989;
+    data->data.F32[33] = 0.930076;
+    data->data.F32[34] = 1.224608;
+    data->data.F32[35] = 1.147376;
+    data->data.F32[36] = 1.114001;
+    data->data.F32[37] = 1.195118;
+    data->data.F32[38] = 1.269581;
+    data->data.F32[39] = 1.061982;
+
+    theParams = psMinimizeChi2(myFunc,
+                               myFuncDeriv,
+                               domain,
+                               data,
+                               errors,
+                               initialGuess,
+                               NULL,
+                               &chiSq);
+
+    for (i=0;i<NUM_PARAMS;i++) {
+        printf("theParams[%d] is %.1f\n", i, theParams->data.F32[i]);
+    }
+
+    printf("chiSq is %f\n", chiSq);
+}
