/*
* MinuitOptimizer.java
*
* Created on May 23, 2002, 9:17 AM
*/
package hep.aida.ref.optimizer.fminuit;
import hep.aida.IFunction;
import hep.aida.ref.optimizer.OptimizerResult;
/**
*
* Minuit implementation of IOptimizer
*
* @author Tony Johnson, Victor Serbo, Max Turri
*
*/
public class MinuitOptimizer extends hep.aida.ref.optimizer.AbstractOptimizer {
private MinuitCommands minuitCommands;
/**
* Creates a new instance of MinuitOptimizer
*
*/
public MinuitOptimizer() {
configuration = new MinuitOptimizerConfiguration(this);
minuitCommands = new MinuitCommands(this);
result = new OptimizerResult();
domainConstraint = null;
}
/**
* Perform the optimization.
* @return <code>true</code> if the optimization was
* successfull, <code>false</code> otherwise.
*
*/
public void optimize() {
// First reset Minuit
minuitCommands.resetMinuit();
// Load the function in Minuit. This will load all the variables.
if ( function == null ) throw new IllegalArgumentException("Cannot optimize!! The function was not set correctely!");
minuitCommands.setFunction( function, this );
String method = configuration.method();
int maxIterations = configuration.maxIterations();
double tolerance = configuration.tolerance();
// Perform the actual optimization
minuitCommands.optimize( method, maxIterations, tolerance );
minuitCommands.updateFunction(this);
String[] varNames = function.variableNames();
double[] pars = new double[varNames.length];
for ( int i = 0; i<varNames.length; i++ )
pars[i] = variableSettings(varNames[i]).value();
result.setParameters(pars);
result.setCovarianceMatrix( minuitCommands.getCovarianceMatrix() );
result.setOptimizationStatus( minuitCommands.getStatus() );
}
public void minosAnalysis() {
minuitCommands.minos();
}
public void setFunction(IFunction function) {
super.setFunction(function);
minuitCommands.setFunction( function, this );
}
protected MinuitCommands commands() {
return minuitCommands;
}
public boolean canCalculateContours() {
return true;
}
public double[][] calculateContour( String parName1, String parName2, int nPoints, double nSigmas ) {
return commands().calculateContour( parName1, parName2, nPoints, nSigmas );
}
public void reset() {
super.reset();
minuitCommands.resetMinuit();
}
public boolean acceptsConstraints() {
return true;
}
}