Index: trunk/psphot/src/psMinimize.c
===================================================================
--- trunk/psphot/src/psMinimize.c	(revision 5048)
+++ trunk/psphot/src/psMinimize.c	(revision 5049)
@@ -3,6 +3,6 @@
 
 // XXX EAM : this file contains my alternate implementations of psMinimizeLMChi2
-
 // XXX EAM this implementation of MinLM includes limits on params & dparams
+
 psBool psMinimizeLMChi2_EAM(psMinimization *min,
 			    psImage *covar,
@@ -11,5 +11,5 @@
 			    const psArray *x,
 			    const psVector *y,
-			    const psVector *yErr,
+			    const psVector *yWt,
 			    psMinimizeLMChi2Func func)
 {
@@ -60,18 +60,12 @@
     // the user provides the error or NULL.  we need to convert
     // to appropriate weights
-    dy = psVectorAlloc (y->n, PS_TYPE_F32);
-    if (yErr != NULL) {
-        for (int i = 0; i < dy->n; i++) {
-	    if (yErr->data.F32[i] == 0.0) {
-		dy->data.F32[i] = 1.0;
-		// mask this?  bad pixel, obviously...
-	    } else {
-		dy->data.F32[i] = 1.0 / PS_SQR (yErr->data.F32[i]);
-	    }
-        }
+    if (yWt != NULL) {
+	dy = (psVector *) yWt;
     } else {
-        for (int i = 0; i < dy->n; i++) {
-            dy->data.F32[i] = 1.0;
-        }
+	dy = psVectorAlloc (y->n, PS_TYPE_F32);
+	psVectorInit (dy, 1.0);
+//	for (int i = 0; i < dy->n; i++) {
+//            dy->data.F32[i] = 1.0;
+//        }
     }
 
@@ -82,5 +76,5 @@
 	return (false);
     }
-    # ifndef PS_NO_TRACE
+# ifndef PS_NO_TRACE
     // dump some useful info if trace is defined
     if (psTraceGetLevel (".psLib.dataManip.psMinimizeLMChi2") >= 5) {
@@ -92,5 +86,5 @@
 	p_psVectorPrintRow (psTraceGetDestination(), Params, "params guess");
     }
-    # endif /* PS_NO_TRACE */
+# endif /* PS_NO_TRACE */
 
     // iterate until the tolerance is reached, or give up
@@ -103,5 +97,5 @@
         psF64 dLinear = p_psMinLM_dLinear (Beta, beta, lambda);
 
-        # ifndef PS_NO_TRACE
+# ifndef PS_NO_TRACE
         // dump some useful info if trace is defined
         if (psTraceGetLevel (".psLib.dataManip.psMinimizeLMChi2") >= 5) {
@@ -113,5 +107,5 @@
             p_psVectorPrintRow (psTraceGetDestination(), Params, "params guess");
         }
-        # endif /* PS_NO_TRACE */
+# endif /* PS_NO_TRACE */
 
         // calculate Chisq for new guess, update Alpha & Beta
@@ -125,5 +119,5 @@
 
         psTrace (".psLib.dataManip.psMinimizeLMChi2", 4, "last chisq: %f, new chisq %f, delta: %f, rho: %f\n", min->value, Chisq, min->lastDelta, rho);
-        # ifndef PS_NO_TRACE
+# ifndef PS_NO_TRACE
         // dump some useful info if trace is defined
         if (psTraceGetLevel (".psLib.dataManip.psMinimizeLMChi2") >= 5) {
@@ -132,5 +126,5 @@
             p_psVectorPrint (psTraceGetDestination(), Params, "params guess");
         }
-        # endif /* PS_NO_TRACE */
+# endif /* PS_NO_TRACE */
 
         /* if (Chisq < min->value) {  */
@@ -151,5 +145,5 @@
     // construct & return the covariance matrix (if requested)
     if (covar != NULL) {
-      p_psMinLM_GuessABP_EAM (covar, Beta, Params, alpha, beta, params, paramMask, beta_lim, param_min, param_max, 0.0);
+	p_psMinLM_GuessABP_EAM (covar, Beta, Params, alpha, beta, params, paramMask, beta_lim, param_min, param_max, 0.0);
     }      
 
@@ -160,8 +154,10 @@
     psFree (Beta);
     psFree (Params);
-    psFree (dy);
+    if (yWt == NULL) {
+	psFree (dy);
+    }
 
     if (min->iter == min->maxIter) {
-      return (false);
+	return (false);
     } 
     return (true);
@@ -182,6 +178,6 @@
 {
 
-    # define USE_LU_DECOMP 1
-    # if (USE_LU_DECOMP)
+# define USE_LU_DECOMP 1
+# if (USE_LU_DECOMP)
     psVector *LUv = NULL;
     psImage  *LUm = NULL;
@@ -205,5 +201,5 @@
     Alpha = psMatrixInvert (Alpha, A, &det);
 
-    # else
+# else
     // gauss-jordan version
     psTrace (".psLib.dataManip.psMinLM_GuessABP", 5, "using Gauss-J version");
@@ -218,5 +214,5 @@
 
     psGaussJordan (Alpha, Beta);
-    # endif
+# endif
 
     // apply Beta to get new Params values
@@ -241,11 +237,53 @@
     }
 
-    # if (USE_LU_DECOMP)
+# if (USE_LU_DECOMP)
     psFree (A);
     psFree (LUm);
     psFree (LUv);
-    # endif
+# endif
 
     return true;
 }
 
+bool psMinimizeGaussNewtonDelta_EAM (psVector *delta,
+				     const psVector *params,
+				     const psVector *paramMask,
+				     const psArray  *x,
+				     const psVector *y,
+				     const psVector *yWt,
+				     psMinimizeLMChi2Func func)
+{
+
+    // allocate internal arrays (current vs Guess)
+    psImage  *alpha  = psImageAlloc  (params->n, params->n, PS_TYPE_F64);
+    psImage  *Alpha  = psImageAlloc  (params->n, params->n, PS_TYPE_F64);
+    psVector *beta   = psVectorAlloc (params->n, PS_TYPE_F64);
+    psVector *Params = psVectorAlloc (params->n, PS_TYPE_F64);
+    psVector *dy     = NULL;
+
+    // the user provides the error or NULL.  we need to convert
+    // to appropriate weights
+    if (yWt != NULL) {
+	dy = (psVector *) yWt;
+    } else {
+	dy = psVectorAlloc (y->n, PS_TYPE_F32);
+	psVectorInit (dy, 1.0);
+//        for (int i = 0; i < dy->n; i++) {
+//            dy->data.F32[i] = 1.0;
+//        }
+    }
+
+    p_psMinLM_SetABX (alpha, beta, params, paramMask, x, y, dy, func);
+    p_psMinLM_GuessABP (Alpha, delta, Params, alpha, beta, params, paramMask, 0.0);
+
+    psFree (alpha);
+    psFree (Alpha);
+    psFree (beta);
+    psFree (Params);
+    if (yWt == NULL) {
+	psFree (dy);
+    }
+    return (true);
+}
+
+
