/* * MinuitOptimizerConfiguration.java * * Created on May 22, 2002, 10:18 PM */ package hep.aida.ref.optimizer.fminuit; import hep.aida.ext.*; /** * * Implementation of IOptimizerConfiguration * * @author Tony Johnson, Victor Serbo, Max Turri * */ public class MinuitOptimizerConfiguration extends hep.aida.ref.optimizer.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"; protected double errorDefinition = 1; private int errorDefinitionInt = DEFAULT_ERROR; private MinuitOptimizer optimizer; /** * Creates a new instance of MinuitOptimizerConfiguration * */ public MinuitOptimizerConfiguration(MinuitOptimizer optimizer) { this.optimizer = optimizer; setTolerance(0.00001); setMaxIterations(500); } protected void setDefaults() { 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); } optimizer.commands().setErrorDef(errorDefinitionInt); } /** * Get the optimizer's error definition. * @return The error definition. * */ public int errorDefinition() { return errorDefinitionInt; } /** * 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 setUseFunctionGradient(boolean useFunctionGradient) { super.setUseFunctionGradient(useFunctionGradient); optimizer.commands().setUseFunctionGradient( useFunctionGradient ); } public void setPrintLevel(int printLevel) { super.setPrintLevel(printLevel); if ( printLevel == IOptimizerConfiguration.NO_OUTPUT ) optimizer.commands().setPrintLevel( MinuitCommands.NO_OUTPUT ); else if ( printLevel == IOptimizerConfiguration.NORMAL_OUTPUT ) optimizer.commands().setPrintLevel( MinuitCommands.NORMAL_OUTPUT ); else if ( printLevel == IOptimizerConfiguration.DETAILED_OUTPUT ) optimizer.commands().setPrintLevel( MinuitCommands.MAXIMAL_OUTPUT ); else throw new IllegalArgumentException("Unknown Print Level "+printLevel); } public void setUseFunctionHessian(boolean useHessian) { throw new UnsupportedOperationException(); } }