Drop repeated tests inside "SimplexOptimizerTest.Task" class.
Explicitly specify the initial simplex side (as test parameter).
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerTest.java
index d748508..25dd7c8 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerTest.java
@@ -17,7 +17,6 @@
package org.apache.commons.math4.legacy.optim.nonlinear.scalar.noderiv;
import java.util.Arrays;
-import org.opentest4j.AssertionFailedError;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ParameterContext;
@@ -83,6 +82,7 @@
@ParameterizedTest
@CsvFileSource(resources = NELDER_MEAD_INPUT_FILE)
void testFunctionWithNelderMead(@AggregateWith(TaskAggregator.class) Task task) {
+ // task.checkAlongLine(1000, true);
task.run(new NelderMeadTransform());
}
@@ -106,8 +106,6 @@
private static final int FUNC_EVAL_DEBUG = 80000;
/** Default convergence criterion. */
private static final double CONVERGENCE_CHECK = 1e-9;
- /** Default simplex size. */
- private static final double SIDE_LENGTH = 1;
/** Default cooling factor. */
private static final double SA_COOL_FACTOR = 0.5;
/** Default acceptance probability at beginning of SA. */
@@ -115,7 +113,7 @@
/** Default acceptance probability at end of SA. */
private static final double SA_END_PROB = 1e-20;
/** Function. */
- private final MultivariateFunction f;
+ private final MultivariateFunction function;
/** Initial value. */
private final double[] start;
/** Optimum. */
@@ -124,46 +122,45 @@
private final double pointTolerance;
/** Allowed function evaluations. */
private final int functionEvaluations;
- /** Repeats on failure. */
- private final int repeatsOnFailure;
+ /** Side length of initial simplex. */
+ private final double simplexSideLength;
/** Range of random noise. */
private final double jitter;
/** Whether to perform simulated annealing. */
private final boolean withSA;
/**
- * @param f Test function.
+ * @param function Test function.
* @param start Start point.
* @param optimum Optimum.
* @param pointTolerance Allowed distance between result and
* {@code optimum}.
* @param functionEvaluations Allowed number of function evaluations.
- * @param repeatsOnFailure Maximum number of times to rerun when an
- * {@link AssertionFailedError} is thrown.
+ * @param simplexSideLength Side length of initial simplex.
* @param jitter Size of random jitter.
* @param withSA Whether to perform simulated annealing.
*/
- Task(MultivariateFunction f,
+ Task(MultivariateFunction function,
double[] start,
double[] optimum,
double pointTolerance,
int functionEvaluations,
- int repeatsOnFailure,
+ double simplexSideLength,
double jitter,
boolean withSA) {
- this.f = f;
+ this.function = function;
this.start = start;
this.optimum = optimum;
this.pointTolerance = pointTolerance;
this.functionEvaluations = functionEvaluations;
- this.repeatsOnFailure = repeatsOnFailure;
+ this.simplexSideLength = simplexSideLength;
this.jitter = jitter;
this.withSA = withSA;
}
@Override
public String toString() {
- return f.toString();
+ return function.toString();
}
/**
@@ -176,67 +173,54 @@
// required by the current code.
final int maxEval = Math.max(functionEvaluations, FUNC_EVAL_DEBUG);
- int currentRetry = -1;
- AssertionFailedError lastFailure = null;
- while (currentRetry++ <= repeatsOnFailure) {
- try {
- final String name = f.toString();
- final int dim = start.length;
+ final String name = function.toString();
+ final int dim = start.length;
- final SimulatedAnnealing sa;
- final PopulationSize popSize;
- if (withSA) {
- final SimulatedAnnealing.CoolingSchedule coolSched =
- SimulatedAnnealing.CoolingSchedule.decreasingExponential(SA_COOL_FACTOR);
+ final SimulatedAnnealing sa;
+ final PopulationSize popSize;
+ if (withSA) {
+ final SimulatedAnnealing.CoolingSchedule coolSched =
+ SimulatedAnnealing.CoolingSchedule.decreasingExponential(SA_COOL_FACTOR);
- sa = new SimulatedAnnealing(dim,
- SA_START_PROB,
- SA_END_PROB,
- coolSched,
- RandomSource.KISS.create());
+ sa = new SimulatedAnnealing(dim,
+ SA_START_PROB,
+ SA_END_PROB,
+ coolSched,
+ RandomSource.KISS.create());
- popSize = new PopulationSize(dim);
- } else {
- sa = null;
- popSize = null;
- }
-
- final SimplexOptimizer optim = new SimplexOptimizer(-1, CONVERGENCE_CHECK);
- final Simplex initialSimplex =
- Simplex.alongAxes(OptimTestUtils.point(dim,
- SIDE_LENGTH,
- jitter));
- final double[] startPoint = OptimTestUtils.point(start, jitter);
- final PointValuePair result =
- optim.optimize(new MaxEval(maxEval),
- new ObjectiveFunction(f),
- GoalType.MINIMIZE,
- new InitialGuess(startPoint),
- initialSimplex,
- factory,
- sa,
- popSize);
-
- final double[] endPoint = result.getPoint();
- final double funcValue = result.getValue();
- final double dist = MathArrays.distance(optimum, endPoint);
- Assertions.assertEquals(0d, dist, pointTolerance,
- name + ": distance to optimum" +
- " f(" + Arrays.toString(endPoint) + ")=" +
- funcValue);
-
- final int nEval = optim.getEvaluations();
- Assertions.assertTrue(nEval < functionEvaluations,
- name + ": nEval=" + nEval);
-
- break; // Assertions passed: Retry not neccessary.
- } catch (AssertionFailedError e) {
- if (currentRetry >= repeatsOnFailure) {
- // Allowed repeats have been exhausted: Bail out.
- throw e;
- }
- }
+ popSize = new PopulationSize(dim);
+ } else {
+ sa = null;
+ popSize = null;
}
+
+ final SimplexOptimizer optim = new SimplexOptimizer(-1, CONVERGENCE_CHECK);
+ final Simplex initialSimplex =
+ Simplex.alongAxes(OptimTestUtils.point(dim,
+ simplexSideLength,
+ jitter));
+ final double[] startPoint = OptimTestUtils.point(start, jitter);
+ final PointValuePair result =
+ optim.optimize(new MaxEval(maxEval),
+ new ObjectiveFunction(function),
+ GoalType.MINIMIZE,
+ new InitialGuess(startPoint),
+ initialSimplex,
+ factory,
+ sa,
+ popSize);
+
+ final double[] endPoint = result.getPoint();
+ final double funcValue = result.getValue();
+ final double dist = MathArrays.distance(optimum, endPoint);
+ Assertions.assertEquals(0d, dist, pointTolerance,
+ name + ": distance to optimum" +
+ " f(" + Arrays.toString(endPoint) + ")=" +
+ funcValue);
+
+ final int nEval = optim.getEvaluations();
+ Assertions.assertTrue(nEval < functionEvaluations,
+ name + ": nEval=" + nEval);
}
}
@@ -257,7 +241,7 @@
final double[] optimum = toArrayOfDoubles(a.getString(index++), dim);
final double pointTol = a.getDouble(index++);
final int funcEval = a.getInteger(index++);
- final int repeat = a.getInteger(index++);
+ final double sideLength = a.getDouble(index++);
final double jitter = a.getDouble(index++);
final boolean withSA = a.getBoolean(index++);
@@ -266,7 +250,7 @@
optimum,
pointTol,
funcEval,
- repeat,
+ sideLength,
jitter,
withSA);
}