package hep.aida.ref.optimizer.jminuit;
import hep.aida.ref.optimizer.AbstractOptimizerConfiguration;
/**
*
* @author The AIDA team @SLAC.
*/
class JMinuitConfiguration extends AbstractOptimizerConfiguration
{
/**
* The kind of strategies available in Minuit.
*
*/
public final static int LOW_CALL_STRATEGY = 0;
public final static int MEDIUM_CALL_STRATEGY = 1;
public final static int HIGH_CALL_STRATEGY = 2;
/**
* The methods available in Minuit.
*
*/
public final static String IMPROVE = "IMP";
public final static String MIGRAD = "MIG";
public final static String MINIMIZE = "MINI";
public final static String SIMPLEX = "SIMP";
public final static String SEEK = "SEE";
private double errorDefinition = 1;
private int errorDefinitionInt = DEFAULT_ERROR;
/**
* Creates a new instance of MinuitOptimizerConfiguration
*
*/
JMinuitConfiguration()
{
setTolerance(0.00001);
setMaxIterations(0);
setPrintLevel(NO_OUTPUT);
// setPrintLevel(DETAILED_OUTPUT);
setErrorDefinition(DEFAULT_ERROR);
setStrategy(MEDIUM_CALL_STRATEGY);
setMethod(MIGRAD);
}
/**
* Tell the optmizer what kind of errors to calculate.
* @param errorDefinition The type of error to be calculated.
*
*/
public void setErrorDefinition(int errorDefinition)
{
switch( errorDefinition )
{
case CHI2_FIT_ERROR:
case DEFAULT_ERROR:
this.errorDefinition = 1;
this.errorDefinitionInt = errorDefinition;
break;
case LOGL_FIT_ERROR:
this.errorDefinition = 0.5;
this.errorDefinitionInt = errorDefinition;
break;
default:
throw new IllegalArgumentException("Unsupported error definition" + errorDefinition);
}
}
/**
* Get the optimizer's error definition.
* @return The error definition.
*
*/
public int errorDefinition()
{
return errorDefinitionInt;
}
public double errorDef() {
return errorDefinition;
}
/**
* Set the method to be used by the optimizer in the optimization procedure.
* @param method The method to be adapted.
*
*/
public void setMethod(String method)
{
method.toUpperCase();
if ( method.startsWith(IMPROVE) || method.startsWith(MIGRAD) || method.startsWith(SIMPLEX) || method.startsWith(MINIMIZE) || method.startsWith(SEEK) )
super.setMethod(method);
else
throw new IllegalArgumentException("Unsupported method : "+method);
}
/**
* Set the precision required in the optimizer's calculations.
* The highest possible is the machine's precision.
* @param precision The precision.
* @return <code>true</code> if the precision was set succesfully,
* <code>false</code> otherwise.
*
*/
public void setPrecision(double precision)
{
super.setPrecision(precision);
//optimizer.commands().setPrecision( precision );
}
/**
* Set the strategy to be used by the optimizer in the optimization procedure.
* @param strategy The strategy.
*
*/
public void setStrategy(int strategy)
{
switch ( strategy )
{
case LOW_CALL_STRATEGY:
case MEDIUM_CALL_STRATEGY:
case HIGH_CALL_STRATEGY:
super.setStrategy(strategy);
break;
default:
throw new IllegalArgumentException("Unsupported strategy : "+strategy);
}
//optimizer.commands().setStrategy( strategy );
}
/**
* Specify if the optimizer has to use the gradient as provided by the IFunction.
* @param useFunctionGradient <code>true</code> if the Optimizer has to use the IFunction's
* calculation of the gradient, <code>false</code> otherwise.
*
*/
public void setUseFunctionHessian(boolean useHessian)
{
throw new UnsupportedOperationException();
}
}