package edu.stanford.nlp.optimization;
import java.util.Arrays;
import junit.framework.TestCase;
/**
* @author Christopher Manning
*/
public class MinimizerTest extends TestCase {
/** H.H. Rosenbrock. 1960. An Automatic Method for Finding the Greatest or
* Least Value of a Function. Computer Journal 3, 175-184.
*/
private static class RosenbrockFunction implements DiffFunction {
@Override
public double[] derivativeAt(double[] x) {
double[] derivatives = new double[2];
// df/dx = -400x(y-x^2) - 2(1-x)
derivatives[0] = -400.0 * x[0] * (x[1] - x[0] * x[0]) - 2 * (1.0 - x[0]);
// df/dy = 200(y-x^2)
derivatives[1] = 200.0 * (x[1] - x[0] * x[0]);
return derivatives;
}
/** f(x,y) = (1-x)^2 + 100(y-x^2)^2 */
@Override
public double valueAt(double[] x) {
double t1 = (1.0 - x[0]);
double t2 = x[1] - x[0] * x[0];
return t1 * t1 + 100.0 * t2 * t2;
}
@Override
public int domainDimension() {
return 2;
}
}
public void testRosenbrock() {
DiffFunction rf = new RosenbrockFunction();
DiffFunctionTest.gradientCheck(rf);
}
public void testQNMinimizerRosenbrock() {
double[] initial = { 0.0, 0.0 };
DiffFunction rf = new RosenbrockFunction();
QNMinimizer qn = new QNMinimizer();
double[] answer = qn.minimize(rf, 1e-10, initial);
System.err.println("Answer is: " + Arrays.toString(answer));
assertEquals(1.0, answer[0], 1e-8);
assertEquals(1.0, answer[1], 1e-8);
}
}