Index: /trunk/archive/pslib/include/psMinimize.h
===================================================================
--- /trunk/archive/pslib/include/psMinimize.h	(revision 1453)
+++ /trunk/archive/pslib/include/psMinimize.h	(revision 1454)
@@ -12,23 +12,73 @@
  */
 
-/** Find the minimum of a particular non-linear function */
-psVector *
-psMinimize(psVector *restrict initialGuess, ///< Initial guess and answer
-	   float (*myFunction)(const psVector *restrict, const psVector *restrict), ///< Function to minimize
-	   float (*myFuncDeriv)(const psVector *restrict, const psVector *restrict), ///< Derivatives of function, or NULL
-	   const psVector *restrict paramMask) ///< 1 = fit for parameter, 0 = hold parameter constant
-;
+
+/** Specification and return structure for a minimization */
+typedef struct {
+    const int maxIter;			///< Maximum number of iterations
+    const float tol;			///< Tolerance to reach
+    float value;			///< Value after minimization
+    int iter;				///< Actual number of iterations performed
+    float lastDelta;			///< Last change before quitting
+} psMinimization;
 
 
-/** Minimize chi^2 for input data */
-psVector *
-psMinimizeChi2(psVector *restrict initialGuess,	///< Initial guess and answer
-	       float (*evalModel)(const psVector *restrict, const psVector *restrict), ///< Model to fit; (domain and params)
-	       const psVector *restrict domain, ///< The domain values for the corresponding measurements
-	       const psVector *restrict data, ///< Data to fit
-	       const psVector *restrict errors, ///< Errors in the data
-	       const psVector *restrict paramMask, ///< 1 = fit for parameter, 0 = hold parameter constant
-	       float ChiSq)		///< calculated chisq of fit
-;
+psMinimization *psMinimizationAlloc(int maxIter, ///< Maximum number of iterations
+				    float tol ///< Tolerance to reach
+    );
+
+/** Function format for LM minimization: requires derivatives */
+typedef float (*psMinimizeLMFunc)(
+    psVector *deriv,			///< Derivatives to return
+    const psVector *params,		///< Parameters for which to evaluate
+    const psArray *coords		///< Array of vectors of coordinates at which to evaluate
+    );
+
+/** Minimize a function using the LM method: requires derivatives.  Returns false if there were errors. */
+bool
+psMinimizeLM(psMinimization *min,	///< Minimization specification, and output
+	     psMatrix *covar,		///< Covariance matrix to return
+	     psVector *params,		///< Best guess input parameters, and output
+	     const psVector *paramMask,	///< Parameter mask: 1 = fit for parameter, 0 = hold constant.
+	     const psArray *coords,	///< Coordinates at which to evaluate function
+	     psMinimizeLMFunc func	///< Function to minimize
+    );
+
+/** Pre-defined functions for LM minimization */
+psMinimizeLMFunc psMinimizeLMChi2Gauss1D;
+psMinimizeLMFunc psMinimizeLMChi2Gauss2D;
+
+/** Function format for Powell minimization: does not require derivatives */
+typedef float (*psMinimizePowellFunc)(
+    const psVector *params,		///< Parameters for which to evaluate
+    const psArray *coords		///< Array of vectors of coordinates at which to evaluate
+    );
+
+/** Minimize a function using Powell: doesn't require derivatives.  Returns false if there were errors. */
+bool
+psMinimizePowell(psMinimization *min,	///< Minimization specification, and output
+		 psVector *params,	///< Best guess input parameters, and output
+		 const psVector *paramMask, ///< Parameter mask: 1 = fit for parameter, 0 = hold constant.
+		 const psArray *coords, ///< Coordinates at which to evaluate function
+		 psMinimizePowellFunc func ///< Function to minimize
+    );
+
+/** Model function format for Powell Chi2 minimization */
+typedef psVector* (*psMinimizeChi2PowellFunc)(
+    const psVector *params,		///< Parameters for which to evaluate
+    const psArray *coords		///< Array of vectors of coordinates at which to evaluate
+    );
+
+/** Minimize Chi^2 for a data set given a model: using Powell method.  Returns false if there were errors. */
+bool
+psMinimizeChi2Powell(psMinimization *min,	///< Minimization specification, and output
+		     psVector *params,	///< Best guess input parameters, and output
+		     const psVector *paramMask, ///< Parameter mask: 1 = fit for parameter, 0 = hold constant.
+		     const psArray *coords, ///< Coordinates at which to evaluate function
+		     const psVector *value, ///< Measured values at coordinates
+		     const psVector *error, ///< Errors in measured values at coordinates
+		     psMinimizePowellChi2Func model ///< Model to fit
+    );
+
+/************************************************************************************************************/
 
 /** Derive a polynomial fit by chi^2 minimisation --- can be done analytically */
