package edu.stanford.nlp.optimization;
/**
* Hybrid Minimizer is set up as a combination of two minimizers. The first minimizer will ideally
* quickly converge regardless of proximity to the true minimum, while the second minimizer would
* generally be a quadratic method, that is only fully quadratic near the solution.
*
* If you read this, send me an e-mail saying, "Alex! You should finish adding the description to
* the Hybrid Minimizer!"
*
* @author <a href="mailto:akleeman@stanford.edu">Alex Kleeman</a>
* @version 1.0
* @since 1.0
*/
public class HybridMinimizer implements Minimizer<DiffFunction>, HasEvaluators {
private final Minimizer<DiffFunction> firstMinimizer; // = new SMDMinimizer<DiffFunction>();
private final Minimizer<DiffFunction> secondMinimizer; // = new QNMinimizer(15);
private final int iterationCutoff; // = 1000;
public HybridMinimizer(Minimizer<DiffFunction> minimizerOne, Minimizer<DiffFunction> minimizerTwo, int iterationCutoff){
this.firstMinimizer = minimizerOne;
this.secondMinimizer = minimizerTwo;
this.iterationCutoff = iterationCutoff;
}
@Override
public void setEvaluators(int iters, Evaluator[] evaluators) {
if (firstMinimizer instanceof HasEvaluators) {
((HasEvaluators) firstMinimizer).setEvaluators(iters, evaluators);
}
if (secondMinimizer instanceof HasEvaluators) {
((HasEvaluators) secondMinimizer).setEvaluators(iters, evaluators);
}
}
/** {@inheritDoc} */
@Override
public double[] minimize(DiffFunction function, double functionTolerance, double[] initial) {
return minimize(function, functionTolerance, initial, -1);
}
/** {@inheritDoc} */
@Override
public double[] minimize(DiffFunction function, double functionTolerance, double[] initial, int maxIterations) {
double[] x = firstMinimizer.minimize(function,functionTolerance,initial,iterationCutoff);
return secondMinimizer.minimize(function,functionTolerance,x,maxIterations);
}
}