/*
 *
 *  User level interface to the result of an optimization.
 *
 * @author Tony Johnson, Victor Serbo, Max Turri
 *
 */
package hep.aida.ext;

import hep.aida.*;

public interface IOptimizerResult {
        
    public final static int UNDEFINED = 0, APPROXIMATE = 1, CONVERGED_NEG_MATRIX = 2, CONVERGED = 3, CONVERGED_SMALL_GRADIENT = 4,
    CONVERGED_SMALL_STEP_SIZE = 5, NOT_CONVERGED = 6, REACHED_MAX_ITER = 7, TOO_MANY_LARGE_STEPS = 8;

    
    /**
     * The constraints used in the optimization.
     * @return The domain of constraints.
     *
     */
    public IDomainConstraint constraints();
    
    /**
     * The optimizer's configuration.
     * @return The optimizer's configuration.
     *
     */
    public IOptimizerConfiguration configuration();
    
    public double[] parameters();
    
    /**
     * The covariance matrix.
     * Still under discussion
     *
     */
    public double[][] covarianceMatrix();
    
    /**
     * The correlation matrix.
     * Still under discussion.
     *
     */
    public double[][] correlationMatrix();
    
    /**
     * Get the contour with respec to two variables.
     * @param nSigma The number of sigmas at which the contour should be calculated.
     * @param nPoints The maximum number of points on the contour (might be less).
     * @param var1 The first variable.
     * @param var2 The second variable.
     * @return The Object containing the contour (to be fixed).
     *
     */
    public Object contour(int nSigma, int nPoints, IVariable var1, IVariable var2);
    
    /**
     * Scan the function with respect to two variables.
     * @param nPoints The number of points to be used in the scan.
     * @param var1 The first variable.
     * @param var2 The second variable.
     * @return The Object containing the scan (to be fixed).
     *
     */
    public Object scan(int nPoints, IVariable var1, IVariable var2);

    /**
     * Scan the function with respect to a variable.
     * @param nPoints The number of points to be used in the scan.
     * @param var The variable.
     * @return The Object containing the scan (to be fixed).
     *
     */
    public Object scan(int nPoints, IVariable var);

    /**
     * The status of the optimizer after the optimization procedure.
     * @return The status of the optimization.
     *
     */
    public int optimizationStatus();
    
}
