// LMfunc.java

package ZS.Solve;

/**
 * Caller implement this interface to specify the
 * function to be minimized and its gradient.
 * 
 * Optionally return an initial guess and some test data,
 * though the LM.java only uses this in its optional main() test program.
 * Return null if these are not needed.
 */
public interface LMfunc
{

  /**
   * x is a single point, but domain may be mulidimensional
   */
  double val(double[] x, double[] a);

  /**
   * return the kth component of the gradient df(x,a)/da_k
   */
  double grad(double[] x, double[] a, int ak);

  /**
   * return initial guess at a[]
   */
  double[] initial();

  /**
   * return an array[4] of x,a,y,s for a test case;
   * a is the desired final answer.
   */
  Object[] testdata();

} //LMfunc

