/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.math.impl.minimization;
import static com.opengamma.strata.math.impl.minimization.MinimizationTestFunctions.COUPLED_ROSENBROCK;
import static com.opengamma.strata.math.impl.minimization.MinimizationTestFunctions.ROSENBROCK;
import static com.opengamma.strata.math.impl.minimization.MinimizationTestFunctions.UNCOUPLED_ROSENBROCK;
import static org.testng.AssertJUnit.assertEquals;
import java.util.function.Function;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.opengamma.strata.collect.array.DoubleArray;
/**
* Abstract test.
*/
@Test
public abstract class MultidimensionalMinimizerTestCase {
private static final Function<DoubleArray, Double> F_2D = new Function<DoubleArray, Double>() {
@Override
public Double apply(final DoubleArray x) {
return (x.get(0) + 3.4) * (x.get(0) + 3.4) + (x.get(1) - 1) * (x.get(1) - 1);
}
};
protected void assertInputs(final Minimizer<Function<DoubleArray, Double>, DoubleArray> minimizer) {
try {
minimizer.minimize(null, DoubleArray.of(2d, 3d));
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<Function<DoubleArray, Double>, DoubleArray> minimizer, final double tol) {
DoubleArray r = minimizer.minimize(F_2D, DoubleArray.of(10d, 10d));
assertEquals(r.get(0), -3.4, tol);
assertEquals(r.get(1), 1, tol);
r = (minimizer.minimize(ROSENBROCK, DoubleArray.of(10d, -5d)));
assertEquals(r.get(0), 1, tol);
assertEquals(r.get(1), 1, tol);
}
protected void assertSolvingRosenbrock(final Minimizer<Function<DoubleArray, Double>, DoubleArray> minimizer, final double tol) {
final DoubleArray start = DoubleArray.of(-1d, 1d);
final DoubleArray solution = minimizer.minimize(ROSENBROCK, start);
assertEquals(1.0, solution.get(0), tol);
assertEquals(1.0, solution.get(1), tol);
}
protected void assertSolvingUncoupledRosenbrock(final Minimizer<Function<DoubleArray, Double>, DoubleArray> minimizer, final double tol) {
final DoubleArray start = DoubleArray.of(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
final DoubleArray solution = minimizer.minimize(UNCOUPLED_ROSENBROCK, start);
for (int i = 0; i < solution.size(); i++) {
assertEquals(1.0, solution.get(i), tol);
}
}
protected void assertSolvingCoupledRosenbrock(final Minimizer<Function<DoubleArray, Double>, DoubleArray> minimizer, final double tol) {
final DoubleArray start = DoubleArray.of(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0);
final DoubleArray solution = minimizer.minimize(COUPLED_ROSENBROCK, start);
for (int i = 0; i < solution.size(); i++) {
assertEquals(1.0, solution.get(i), tol);
}
}
}