/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.minimization;
import static com.opengamma.analytics.math.minimization.MinimizationTestFunctions.COUPLED_ROSENBROCK;
import static com.opengamma.analytics.math.minimization.MinimizationTestFunctions.ROSENBROCK;
import static com.opengamma.analytics.math.minimization.MinimizationTestFunctions.UNCOUPLED_ROSENBROCK;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.util.test.TestGroup;
/**
* Abstract test.
*/
@Test(groups = TestGroup.UNIT)
public abstract class MultidimensionalMinimizerTestCase {
private static final Function1D<DoubleMatrix1D, Double> F_2D = new Function1D<DoubleMatrix1D, Double>() {
@Override
public Double evaluate(final DoubleMatrix1D x) {
return (x.getEntry(0) + 3.4) * (x.getEntry(0) + 3.4) + (x.getEntry(1) - 1) * (x.getEntry(1) - 1);
}
};
protected void assertInputs(final Minimizer<Function1D<DoubleMatrix1D, Double>, DoubleMatrix1D> minimizer) {
try {
minimizer.minimize(null, new DoubleMatrix1D(new double[] {2., 3.}));
Assert.fail();
} catch (final IllegalArgumentException e) {
// Expected
}
try {
minimizer.minimize(F_2D, null);
Assert.fail();
} catch (final IllegalArgumentException e) {
// Expected
}
}
protected void assertMinimizer(final Minimizer<Function1D<DoubleMatrix1D, Double>, DoubleMatrix1D> minimizer, final double tol) {
DoubleMatrix1D r = minimizer.minimize(F_2D, new DoubleMatrix1D(new double[] {10., 10.}));
assertEquals(r.getEntry(0), -3.4, tol);
assertEquals(r.getEntry(1), 1, tol);
r = (minimizer.minimize(ROSENBROCK, new DoubleMatrix1D(new double[] {10, -5})));
assertEquals(r.getEntry(0), 1, tol);
assertEquals(r.getEntry(1), 1, tol);
}
protected void assertSolvingRosenbrock(final Minimizer<Function1D<DoubleMatrix1D, Double>, DoubleMatrix1D> minimizer, final double tol) {
final DoubleMatrix1D start = new DoubleMatrix1D(new double[] {-1.0, 1.0});
final DoubleMatrix1D solution = minimizer.minimize(ROSENBROCK, start);
assertEquals(1.0, solution.getEntry(0), tol);
assertEquals(1.0, solution.getEntry(1), tol);
}
protected void assertSolvingUncoupledRosenbrock(final Minimizer<Function1D<DoubleMatrix1D, Double>, DoubleMatrix1D> minimizer, final double tol) {
final DoubleMatrix1D start = new DoubleMatrix1D(new double[] {-1.0, 1.0, -1.0, 1.0, -1.0, 1.0});
final DoubleMatrix1D solution = minimizer.minimize(UNCOUPLED_ROSENBROCK, start);
for (int i = 0; i < solution.getNumberOfElements(); i++) {
assertEquals(1.0, solution.getEntry(i), tol);
}
}
protected void assertSolvingCoupledRosenbrock(final Minimizer<Function1D<DoubleMatrix1D, Double>, DoubleMatrix1D> minimizer, final double tol) {
final DoubleMatrix1D start = new DoubleMatrix1D(new double[] {-1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0});
final DoubleMatrix1D solution = minimizer.minimize(COUPLED_ROSENBROCK, start);
for (int i = 0; i < solution.getNumberOfElements(); i++) {
assertEquals(1.0, solution.getEntry(i), tol);
}
}
}