Merge branch 'master' of https://gitbox.apache.org/repos/asf/commons-math
diff --git a/commons-math-legacy/src/test/gnuplot/legacy/optim/nonlinear/scalar/noderiv/simplex_2D.gnuplot b/commons-math-legacy/src/test/gnuplot/legacy/optim/nonlinear/scalar/noderiv/simplex_2D.gnuplot
index ece6416..83056b3 100644
--- a/commons-math-legacy/src/test/gnuplot/legacy/optim/nonlinear/scalar/noderiv/simplex_2D.gnuplot
+++ b/commons-math-legacy/src/test/gnuplot/legacy/optim/nonlinear/scalar/noderiv/simplex_2D.gnuplot
@@ -32,8 +32,9 @@
 numOptim = STATS_blocks
 evalColIndex = 1
 objColIndex = 2
-xColIndex = 3
-yColIndex = 4
+absObjDiffColIndex = 3
+xColIndex = 4
+yColIndex = 5
 
 set size 1, 1
 set origin 0, 0
@@ -46,7 +47,10 @@
   numEval = STATS_max
 
   # Objective function range.
-  stats file index iOptim u objColIndex nooutput
+  # Using the absolute value of the difference with the objective function
+  # at the optimum in order to be able to display the logarithm even if the
+  # objective function can be negative.
+  stats file index iOptim u absObjDiffColIndex nooutput
   numSpx = STATS_blank
   minObj = STATS_min
   maxObj = STATS_max
@@ -89,11 +93,11 @@
     plot \
        file index iOptim \
          every ::0::2 \
-         u 0:(log($2)) \
-         w l lc "black" title "log_{10}f", \
+         u 0:(log($3)) \
+         w l lc "black" title "log_{10}|f(x) - f(optimum)|", \
        '' index iOptim \
          every ::0::2:iSpx \
-         u 0:(log($2)) \
+         u 0:(log($3)) \
          w lp pt 1 lc "black" lw 2 notitle
 
     # Simplex.
@@ -107,10 +111,14 @@
         every :::(iSpx - showSpx < 0 ? 0 : iSpx - showSpx)::iSpx \
         u xColIndex:yColIndex \
         w l notitle, \
-      '' index "Optimum" u 1:2 ps 5 pt 4 notitle
+      '' index "Optimum" \
+        u 1:2 ps 2.5 pt 4 title "Expected", \
+      '' index iOptim \
+        every :::lastSpx::lastSpx \
+        u xColIndex:yColIndex ps 1.5 pt 6 title "Found"
 
     unset multiplot
-    pause 0.1
+    pause 0.15
   }
 
   pause 1
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/TestFunction.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/TestFunction.java
index 0292bd8..f28bf11 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/TestFunction.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/TestFunction.java
@@ -19,7 +19,6 @@
 import java.util.function.Function;
 import java.util.function.DoubleUnaryOperator;
 import org.apache.commons.math4.legacy.analysis.MultivariateFunction;
-import org.apache.commons.math4.legacy.core.jdkmath.AccurateMath;
 
 /**
  * Generators of {@link MultivariateFunction multivariate scalar functions}.
@@ -71,20 +70,26 @@
             };
         }),
     TWO_AXES(dim -> {
+            final int halfDim = dim / 2;
             return x -> {
                 double f = 0;
-                for (int i = 0; i < dim; i++) {
-                    f += (i < dim / 2 ? 1e6 : 1) * x[i] * x[i];
+                for (int i = 0; i < halfDim; i++) {
+                    f += 1e6 * x[i] * x[i];
+                }
+                for (int i = halfDim; i < dim; i++) {
+                    f += x[i] * x[i];
                 }
                 return f;
             };
         }),
     ELLI(dim -> {
-            final double last = dim - 1;
+            final double M = Math.pow(1e3, 1d / (dim - 1));
             return x -> {
+                double factor = 1;
                 double f = 0;
                 for (int i = 0; i < dim; i++) {
-                    f += Math.pow(1e3, i / last) * x[i] * x[i];
+                    f += factor * x[i] * x[i];
+                    factor *= M;
                 }
                 return f;
             };
@@ -96,22 +101,15 @@
             };
         }),
     // https://www.sfu.ca/~ssurjano/sumpow.html
-    DIFF_POW(dim -> {
+    SUM_POW(dim -> {
             return x -> {
                 double f = 0;
                 for (int i = 0; i < dim; i++) {
-                    f += AccurateMath.pow(Math.abs(x[i]), i + 2);
+                    f += Math.pow(Math.abs(x[i]), i + 2);
                 }
                 return f;
             };
         }),
-    SS_DIFF_POW(dim -> {
-            final MultivariateFunction diffPow = DIFF_POW.withDimension(dim);
-            return x -> {
-                double f = Math.pow(diffPow.value(x), 0.25);
-                return f;
-            };
-        }),
     // https://www.sfu.ca/~ssurjano/ackley.html
     ACKLEY(dim -> {
             final double A = 20;
@@ -134,33 +132,26 @@
     // https://www.sfu.ca/~ssurjano/rastr.html
     RASTRIGIN(dim -> {
             final double A = 10;
+            final double twopi = 2 * Math.PI;
             return x -> {
                 double sum = 0;
                 for (int i = 0; i < dim; i++) {
                     final double xi = x[i];
-                    sum += xi * xi - A * Math.cos(2 * Math.PI * xi);
+                    sum += xi * xi - A * Math.cos(twopi * xi);
                 }
                 return A * dim + sum;
             };
         }),
-    // https://www.sfu.ca/~ssurjano/powell.html
-    POWELL(dim -> {
-            final int last = dim / 4;
+    // http://benchmarkfcns.xyz/benchmarkfcns/salomonfcn.html
+    SALOMON(dim -> {
             return x -> {
-                double f = 0;
-                for (int i = 0; i < last; i++) {
-                    final int fourI = 4 * i;
-                    final double x4i = x[fourI];
-                    final double x4iP1 = x[fourI + 1];
-                    final double x4iP2 = x[fourI + 2];
-                    final double x4iP3 = x[fourI + 3];
-                    final double a = x4i + 10 * x4iP1;
-                    final double b = x4iP2 - x4iP3;
-                    final double c = x4iP1 - 2 * x4iP2;
-                    final double d = x4i - x4iP3;
-                    f += a * a + 5 * b * b + c * c * c * c + 10 * d * d * d * d;
+                double sum = 0;
+                for (int i = 0; i < dim; i++) {
+                    final double xi = x[i];
+                    sum += xi * xi;
                 }
-                return f;
+                final double sqrtSum = Math.sqrt(sum);
+                return 1 - Math.cos(2 * Math.PI * sqrtSum) + 0.1 * sqrtSum;
             };
         }),
     ROSENBROCK(dim -> {
@@ -177,6 +168,20 @@
                 return f;
             };
         }),
+    // http://benchmarkfcns.xyz/benchmarkfcns/happycatfcn.html
+    HAPPY_CAT(dim -> {
+            final double alpha = 0.125;
+            return x -> {
+                double sum = 0;
+                double sumSq = 0;
+                for (int i = 0; i < dim; i++) {
+                    final double xi = x[i];
+                    sum += xi;
+                    sumSq += xi * xi;
+                }
+                return Math.pow(sumSq - dim, 2 * alpha) + (0.5 * sumSq + sum) / dim + 0.5;
+            };
+        }),
     PARABOLA(dim -> {
             return x -> {
                 double f = 0;
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/BOBYQAOptimizerTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/BOBYQAOptimizerTest.java
index bd6cd3a..98cc641 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/BOBYQAOptimizerTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/BOBYQAOptimizerTest.java
@@ -177,27 +177,15 @@
     }
 
     @Test
-    public void testDiffPow() {
+    public void testSumPow() {
         final int dim = DIM / 2;
         double[] startPoint = OptimTestUtils.point(dim, 1.0);
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(dim, 0.0), 0.0);
-        doTest(TestFunction.DIFF_POW.withDimension(dim), startPoint, boundaries,
+        doTest(TestFunction.SUM_POW.withDimension(dim), startPoint, boundaries,
                 GoalType.MINIMIZE,
-                1e-8, 1e-1, 21000, expected);
-    }
-
-    @Test
-    public void testSsDiffPow() {
-        final int dim = DIM / 2;
-        double[] startPoint = OptimTestUtils.point(dim, 1.0);
-        double[][] boundaries = null;
-        PointValuePair expected =
-            new PointValuePair(OptimTestUtils.point(dim, 0.0), 0.0);
-        doTest(TestFunction.SS_DIFF_POW.withDimension(dim), startPoint, boundaries,
-                GoalType.MINIMIZE,
-                1e-2, 1.3e-1, 50000, expected);
+                1e-8, 1e-1, 21720, expected);
     }
 
     @Test
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java
index bf9bdb4..9724e27 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizerTest.java
@@ -299,36 +299,21 @@
     }
 
     @Test
-    public void testDiffPow() {
+    public void testSumPow() {
         double[] startPoint = OptimTestUtils.point(DIM,1.0);
         double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(TestFunction.DIFF_POW.withDimension(DIM), startPoint, insigma, boundaries,
+        doTest(TestFunction.SUM_POW.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 10, true, 0, 1e-13,
                 1e-8, 1e-1, 100000, expected);
-        doTest(TestFunction.DIFF_POW.withDimension(DIM), startPoint, insigma, boundaries,
+        doTest(TestFunction.SUM_POW.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 10, false, 0, 1e-13,
                 1e-8, 2e-1, 100000, expected);
     }
 
     @Test
-    public void testSsDiffPow() {
-        double[] startPoint = OptimTestUtils.point(DIM,1.0);
-        double[] insigma = OptimTestUtils.point(DIM,0.1);
-        double[][] boundaries = null;
-        PointValuePair expected =
-            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(TestFunction.SS_DIFF_POW.withDimension(DIM), startPoint, insigma, boundaries,
-                GoalType.MINIMIZE, 10, true, 0, 1e-13,
-                1e-4, 1e-1, 200000, expected);
-        doTest(TestFunction.SS_DIFF_POW.withDimension(DIM), startPoint, insigma, boundaries,
-                GoalType.MINIMIZE, 10, false, 0, 1e-13,
-                1e-4, 1e-1, 200000, expected);
-    }
-
-    @Test
     public void testAckley() {
         double[] startPoint = OptimTestUtils.point(DIM,1.0);
         double[] insigma = OptimTestUtils.point(DIM,1.0);
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 23cc75f..a8fc3ff 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
@@ -33,7 +33,10 @@
 import org.junit.jupiter.params.aggregator.ArgumentsAggregationException;
 import org.junit.jupiter.params.aggregator.AggregateWith;
 import org.junit.jupiter.params.provider.CsvFileSource;
+import org.apache.commons.rng.UniformRandomProvider;
 import org.apache.commons.rng.simple.RandomSource;
+import org.apache.commons.rng.sampling.distribution.ContinuousUniformSampler;
+import org.apache.commons.rng.sampling.UnitSphereSampler;
 import org.apache.commons.math4.legacy.core.MathArrays;
 import org.apache.commons.math4.legacy.exception.MathUnsupportedOperationException;
 import org.apache.commons.math4.legacy.exception.TooManyEvaluationsException;
@@ -89,7 +92,7 @@
     @ParameterizedTest
     @CsvFileSource(resources = NELDER_MEAD_INPUT_FILE)
     void testFunctionWithNelderMead(@AggregateWith(TaskAggregator.class) Task task) {
-        // task.checkAlongLine(1000, true);
+        // task.checkAlongLine(1000);
         task.run(new NelderMeadTransform());
     }
 
@@ -114,7 +117,7 @@
         /** Default convergence criterion. */
         private static final double CONVERGENCE_CHECK = 1e-9;
         /** Default cooling factor. */
-        private static final double SA_COOL_FACTOR = 0.5;
+        private static final double SA_COOL_FACTOR = 0.7;
         /** Default acceptance probability at beginning of SA. */
         private static final double SA_START_PROB = 0.9;
         /** Default acceptance probability at end of SA. */
@@ -131,8 +134,6 @@
         private final int functionEvaluations;
         /** 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;
         /** File prefix (for saving debugging info). */
@@ -148,7 +149,6 @@
          * {@code optimum}.
          * @param functionEvaluations Allowed number of function evaluations.
          * @param simplexSideLength Side length of initial simplex.
-         * @param jitter Size of random jitter.
          * @param withSA Whether to perform simulated annealing.
          * @param tracePrefix Prefix of the file where to save simplex
          * transformations during the optimization.
@@ -162,7 +162,6 @@
              double pointTolerance,
              int functionEvaluations,
              double simplexSideLength,
-             double jitter,
              boolean withSA,
              String tracePrefix,
              int[] traceIndices) {
@@ -172,7 +171,6 @@
             this.pointTolerance = pointTolerance;
             this.functionEvaluations = functionEvaluations;
             this.simplexSideLength = simplexSideLength;
-            this.jitter = jitter;
             this.withSA = withSA;
             this.tracePrefix = tracePrefix;
             this.traceIndices = traceIndices;
@@ -219,16 +217,12 @@
                 optim.addObserver(createCallback(factory));
             }
 
-            final Simplex initialSimplex =
-                Simplex.alongAxes(OptimTestUtils.point(dim,
-                                                       simplexSideLength,
-                                                       jitter));
-            final double[] startPoint = OptimTestUtils.point(start, jitter);
+            final Simplex initialSimplex = Simplex.equalSidesAlongAxes(dim, simplexSideLength);
             final PointValuePair result =
                 optim.optimize(new MaxEval(maxEval),
                                new ObjectiveFunction(function),
                                GoalType.MINIMIZE,
-                               new InitialGuess(startPoint),
+                               new InitialGuess(start),
                                initialSimplex,
                                factory,
                                sa,
@@ -258,6 +252,7 @@
 
             final String sep = "__";
             final String name = tracePrefix + sanitizeBasename(function + sep +
+                                                               Arrays.toString(start) + sep +
                                                                factory + sep);
 
             // Create file; write first data block (optimum) and columns header.
@@ -274,15 +269,17 @@
                 out.println();
 
                 out.println("#");
-                out.print("# <1: evaluations> <2: objective>");
+                out.print("# <1: evaluations> <2: f(x)> <3: |f(x) - f(optimum)|>");
                 for (int i = 0; i < start.length; i++) {
-                    out.print(" <" + (i + 3) + ": coordinate " + i + ">");
+                    out.print(" <" + (i + 4) + ": x[" + i + "]>");
                 }
                 out.println();
             } catch (IOException e) {
                 Assertions.fail(e.getMessage());
             }
 
+            final double fAtOptimum = function.value(optimum);
+
             // Return callback function.
             return (simplex, isInit, numEval) -> {
                 try (PrintWriter out = new PrintWriter(Files.newBufferedWriter(Paths.get(name),
@@ -300,7 +297,8 @@
                     for (int index : traceIndices) {
                         final PointValuePair p = points.get(index);
                         out.print(numEval + fieldSep +
-                                  p.getValue() + fieldSep);
+                                  p.getValue() + fieldSep +
+                                  Math.abs(p.getValue() - fAtOptimum) + fieldSep);
 
                         final double[] coord = p.getPoint();
                         for (int i = 0; i < coord.length; i++) {
@@ -321,12 +319,10 @@
          * {@link #start} is reached at the {@link #optimum}.
          *
          * @param numPoints Number of points at which to evaluate the function.
-         * @param plot Whether to generate a file (for visual debugging).
          */
-        public void checkAlongLine(int numPoints,
-                                   boolean plot) {
-            if (plot) {
-                final String name = createPlotBasename(function, start, optimum);
+        public void checkAlongLine(int numPoints) {
+            if (tracePrefix != null) {
+                final String name = tracePrefix + createPlotBasename(function, start, optimum);
                 try (PrintWriter out = new PrintWriter(Files.newBufferedWriter(Paths.get(name)))) {
                     checkAlongLine(numPoints, out);
                 } catch (IOException e) {
@@ -448,14 +444,29 @@
 
             final TestFunction funcGen = a.get(index++, TestFunction.class);
             final int dim = a.getInteger(index++);
-            final double[] start = toArrayOfDoubles(a.getString(index++), dim);
             final double[] optimum = toArrayOfDoubles(a.getString(index++), dim);
+            final double minRadius = a.getDouble(index++);
+            final double maxRadius = a.getDouble(index++);
+            if (minRadius < 0 ||
+                maxRadius < 0 ||
+                minRadius >= maxRadius) {
+                throw new ArgumentsAggregationException("radii");
+            }
             final double pointTol = a.getDouble(index++);
             final int funcEval = a.getInteger(index++);
-            final double sideLength = a.getDouble(index++);
-            final double jitter = a.getDouble(index++);
             final boolean withSA = a.getBoolean(index++);
 
+            // Generate a start point within a spherical shell around the optimum.
+            final UniformRandomProvider rng = OptimTestUtils.rng();
+            final double radius = ContinuousUniformSampler.of(rng, minRadius, maxRadius).sample();
+            final double[] start = UnitSphereSampler.of(rng, dim).sample();
+            for (int i = 0; i < dim; i++) {
+                start[i] *= radius;
+                start[i] += optimum[i];
+            }
+            // Simplex side.
+            final double sideLength = 0.5 * (maxRadius - minRadius);
+
             if (index == a.size()) {
                 // No more arguments.
                 return new Task(funcGen.withDimension(dim),
@@ -464,7 +475,6 @@
                                 pointTol,
                                 funcEval,
                                 sideLength,
-                                jitter,
                                 withSA,
                                 null,
                                 null);
@@ -481,7 +491,6 @@
                                 pointTol,
                                 funcEval,
                                 sideLength,
-                                jitter,
                                 withSA,
                                 tracePrefix,
                                 spxIndices);
diff --git a/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.hedar_fukushima.csv b/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.hedar_fukushima.csv
index fdd2fb4..3e6fa4c 100644
--- a/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.hedar_fukushima.csv
+++ b/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.hedar_fukushima.csv
@@ -17,42 +17,35 @@
 #
 # Format (CSV) defined in "SimplexOptimizerTest.Task" class.
 # Columns are:
-#  0: function name (value from "TestFunction" enum)
-#  1: space dimension (n)
-#  2: nominal start point ("n" space-separated values)
-#  3: optimum ("n" space-separated values)
-#  4: maximum expected distance from the result to the optimum
-#  5: expected number of function evaluations
-#  6: length of the sides of the initial simplex
-#  7: size of the random noise (to generate slightly different initial conditions)
-#  8: whether to perform simulated annealing
-#  9: [optional] File prefix for debugging (or empty slot for no debugging)
-# 10: [optional] Indices (space-separated) of simplex points to save (empty means "all points")
+#  0: Function name (value from "TestFunction" enum)
+#  1: Space dimension (n)
+#  2: Optimum ("n" space-separated values)
+#  3: Minimal radius of the spherical shell around the optimum (within which to randomly select a start point)
+#  4: Minimal radius of the spherical shell around the optimum (within which to randomly select a start point)
+#  5: Maximum expected distance from the result to the optimum
+#  6: Expected number of function evaluations
+#  7: Whether to perform simulated annealing
+#  8: [optional] File prefix for debugging (or empty slot for no debugging)
+#  9: [optional] Indices (space-separated) of simplex points to save (empty means "all points")
 #
 # Caveat: Some tests are commented out (cf. JIRA: MATH-1552).
 #
-PARABOLA, 2, 4.6 5.8, 0 0, 1e-4, 820, 1, 2e-1, true
-PARABOLA, 4, 2.5 3.1 4.6 5.8, 0 0 0 0, 1e-4, 820, 1, 2e-1, true
-ROSENBROCK, 2, -1.2 1, 1 1, 1e-4, 380, 1, 1e-1, true
-ROSENBROCK, 5, -4.4 -3.5 -2.6 -1.7 -0.8, 1 1 1 1 1, 1e-4, 3800, 5e-1, 1e-1, true
-ROSENBROCK, 10, -0.1 0.1 0.2 -0.1 -0.2 0.3 0.2 -0.1 0.2 -0.3, 1 1 1 1 1 1 1 1 1 1, 5e-5, 38000, 3, 5e-2, true
-POWELL, 4, 3 -1 -2 1, 0 0 0 0, 5e-3, 1100, 3, 1e-1, true
-CIGAR, 13, -1.2 2.3 -3.2 2.1 1.2 -2.3 3.2 -2.1 -1.2 2.3 -3.2 2.1 -1.2, 0 0 0 0 0 0 0 0 0 0 0 0 0, 5e-5, 75000, 3, 1e-1, true
-SPHERE, 13, -1.2 2.3 -3.2 2.1 1.2 -2.3 3.2 -2.1 -1.2 2.3 -3.2 2.1 -1.2, 0 0 0 0 0 0 0 0 0 0 0 0 0, 5e-4, 47000, 3, 1e-1, true
-ELLI, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-4, 25000, 3, 1e-1, true
-#TWO_AXES, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-4, 1000, 3, 1e-1, true
-#CIG_TAB, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-4, 1000, 3, 1e-1, true
-TABLET, 11, 2 3 4 -3 -2 -1 2 3 4 3 -1, 0 0 0 0 0 0 0 0 0 0 0, 2e-4, 41000, 3, 1e-1, true
-#DIFF_POW, 7, 1 -1 1 -1 1 -1 1, 0 0 0 0 0 0 0, 1e-2, 2500, 3, 1e-1, true
-SS_DIFF_POW, 6, -3.2 2.1 1.2 -2.3 3.2 -2.1, 0 0 0 0 0 0, 1e-3, 10500, 3, 1e-1, true
-#ACKLEY, 4, 3 4 -3 -2, 0 0 0 0, 1e-6, 1100, 3, 5e-1, true
-#RASTRIGIN, 4, 3 4 -3 -2, 0 0 0 0, 1e-6, 10000, 3, 5e-1, true
-#GRIEWANK, 3, -210 123 -456, 0 0 0, 1e-1, 1000, 50, 100, true
-#LEVY, 4, 4 -6 -2 8, 1 1 1 1, 1e-3, 3000, 1, 1, true
-#SCHWEFEL, 2, 100 -200, 420.9687 420.9687, 1, 300, 100, 100, true
-ZAKHAROV, 5, -4 -2 3 5 7, 0 0 0 0 0, 1e-4, 2200, 1.5, 1, true
-PERM, 2, -2 -1, 1 2, 2e-3, 210, 5e-1, 1e-1, true
-#PERM, 3, -2 -3 -1, 1 2 3, 5e-5, 200, 5e-1, 1e-1, true
-#PERM, 4, -2 -3 -4 -1, 1 2 3 4, 5e-4, 2200, 5e-1, 1e-1, true
-#PERM, 5, -2 -3 -4 -5 -1, 1 2 3 4 5, 5e-4, 200, 5e-1, 1e-1, true
-#STYBLINSKI_TANG, 4, 1 2 3 4, -2.903534 -2.903534 -2.903534 -2.903534, 1e-4, 500, 1, 5e-1, true
+PARABOLA, 8, 0 0 0 0 0 0 0 0, 20, 40, 1e-4, 7200, true
+ROSENBROCK, 2, 1 1, 0.9, 1.1, 1e-4, 420, true
+CIGAR, 2, 0 0, 2, 3, 5e-5, 240, true
+SPHERE, 2, 0 0, 2, 3, 5e-4, 200, true
+ELLI, 2, 0 0, 3, 4, 1e-4, 350, true
+TWO_AXES, 2, 0 0, 3, 4, 1e-4, 400, true
+CIG_TAB, 2, 0 0, 3, 4, 1e-3, 280, true
+TABLET, 2, 0 0, 3, 4, 2e-4, 340, true
+SUM_POW, 2, 0 0, 3, 4, 1e-2, 190,  true
+ACKLEY, 2, 0 0, 2, 4, 1e-6, 310, true
+#RASTRIGIN, 2, 0 0, 0.9, 1.1, 5e-5, 1000, true
+GRIEWANK, 2, 0 0, 2, 3, 1e-1, 500, true
+LEVY, 2, 1 1, 0.9, 1.1, 1e-3, 200, true
+SCHWEFEL, 2, 420.9687 420.9687, 9, 11, 1, 200, true
+ZAKHAROV, 2, 0 0, 3, 4, 1e-4, 1000, true
+PERM, 2, 1 2, 0.9, 1.1, 2e-3, 260, true
+STYBLINSKI_TANG, 2, -2.903534 -2.903534, 1, 2, 1e-4, 210, true
+#HAPPY_CAT, 2, -1 -1, 2, 3, 1e-4, 500, true
+#SALOMON, 2, 0 0, 2, 3, 1e-4, 500, true
diff --git a/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.multidirectional.csv b/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.multidirectional.csv
index 66824f0..f13c7eb 100644
--- a/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.multidirectional.csv
+++ b/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.multidirectional.csv
@@ -17,41 +17,35 @@
 #
 # Format (CSV) defined in "SimplexOptimizerTest.Task" class.
 # Columns are:
-#  0: function name (value from "TestFunction" enum)
-#  1: space dimension (n)
-#  2: nominal start point ("n" space-separated values)
-#  3: optimum ("n" space-separated values)
-#  4: maximum expected distance from the result to the optimum
-#  5: expected number of function evaluations
-#  6: length of the sides of the initial simplex
-#  7: size of the random noise (to generate slightly different initial conditions)
-#  8: whether to perform simulated annealing
-#  9: [optional] File prefix for debugging (or empty slot for no debugging)
-# 10: [optional] Indices (space-separated) of simplex points to save (empty means "all points")
+#  0: Function name (value from "TestFunction" enum)
+#  1: Space dimension (n)
+#  2: Optimum ("n" space-separated values)
+#  3: Minimal radius of the spherical shell around the optimum (within which to randomly select a start point)
+#  4: Minimal radius of the spherical shell around the optimum (within which to randomly select a start point)
+#  5: Maximum expected distance from the result to the optimum
+#  6: Expected number of function evaluations
+#  7: Whether to perform simulated annealing
+#  8: [optional] File prefix for debugging (or empty slot for no debugging)
+#  9: [optional] Indices (space-separated) of simplex points to save (empty means "all points")
 #
 # Caveat: Some tests are commented out (cf. JIRA: MATH-1552).
 #
-PARABOLA, 4, 2.5 3.1 4.6 5.8, 0 0 0 0, 1e-4, 380, 1, 2e-1, false
-ROSENBROCK, 2, -1.2 1, 1 1, 2e-3, 11100, 1, 1e-1, false
-#ROSENBROCK, 5, -4.4 -3.5 -2.6 -1.7 -0.8, 1 1 1 1 1, 1e-4, 180, 5e-1, 1e-1, false
-ROSENBROCK, 10, -0.1 0.1 0.2 -0.1 -0.2 0.3 0.2 -0.1 0.2 -0.3, 1 1 1 1 1 1 1 1 1 1, 3e-3, 100000, 1, 5e-2, false
-#POWELL, 4, 3 -1 -2 1, 0 0 0 0, 5e-3, 420, 1, 1e-1, false
-CIGAR, 13, -1.2 2.3 -3.2 2.1 1.2 -2.3 3.2 -2.1 -1.2 2.3 -3.2 2.1 -1.2, 0 0 0 0 0 0 0 0 0 0 0 0 0, 5e-6, 7000, 1, 1e-1, false
-SPHERE, 13, -1.2 2.3 -3.2 2.1 1.2 -2.3 3.2 -2.1 -1.2 2.3 -3.2 2.1 -1.2, 0 0 0 0 0 0 0 0 0 0 0 0 0, 5e-5, 3600, 1, 1e-1, false
-ELLI, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-4, 50000, 1, 1e-1, false
-TWO_AXES, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-6, 3200, 1, 1e-1, false
-CIG_TAB, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 5e-6, 2900, 1, 1e-1, false
-TABLET, 11, 2 3 4 -3 -2 -1 2 3 4 3 -1, 0 0 0 0 0 0 0 0 0 0 0, 5e-6, 3200, 1, 1e-1, false
-DIFF_POW, 7, 1 -1 1 -1 1 -1 1, 0 0 0 0 0 0 0, 5e-4, 2500, 1, 1e-1, false
-SS_DIFF_POW, 6, -3.2 2.1 1.2 -2.3 3.2 -2.1, 0 0 0 0 0 0, 1e-3, 4000, 1, 1e-1, false
-ACKLEY, 4, 3 4 -3 -2, 0 0 0 0, 1e-6, 770, 1, 5e-1, false
-#RASTRIGIN, 4, 3 4 -3 -2, 0 0 0 0, 1e-6, 10000, 1, 5e-1, false
-#GRIEWANK, 3, -210 123 -456, 0 0 0, 1e-1, 1000, 50, 100, false
-#LEVY, 4, 4 -6 -2 8, 1 1 1 1, 1e-3, 3000, 1, 1, false
-#SCHWEFEL, 2, 100 -200, 420.9687 420.9687, 1, 300, 100, 100, false
-ZAKHAROV, 5, -4 -2 3 5 7, 0 0 0 0 0, 1e-4, 3100, 1.5, 1, false
-PERM, 2, -2 -1, 1 2, 3e-2, 25000, 5e-1, 1e-1, false
-#PERM, 3, -2 -3 -1, 1 2 3, 5e-5, 200, 5e-1, 1e-1, false
-#PERM, 4, -2 -3 -4 -1, 1 2 3 4, 5e-4, 2200, 5e-1, 1e-1, false
-#PERM, 5, -2 -3 -4 -5 -1, 1 2 3 4 5, 5e-4, 200, 5e-1, 1e-1, false
-#STYBLINSKI_TANG, 4, 1 2 3 4, -2.903534 -2.903534 -2.903534 -2.903534, 1e-4, 500, 1, 5e-1, false
+PARABOLA, 8, 0 0 0 0 0 0 0 0, 20, 40, 1e-4, 7200, false
+ROSENBROCK, 2, 1 1, 0.9, 1.1, 2e-3, 600, true
+CIGAR, 2, 0 0, 2, 3, 5e-5, 240, false
+SPHERE, 2, 0 0, 2, 3, 5e-4, 200, false
+ELLI, 2, 0 0, 3, 4, 1e-4, 350, false
+TWO_AXES, 2, 0 0, 3, 4, 1e-4, 400, false
+CIG_TAB, 2, 0 0, 3, 4, 1e-3, 280, false
+TABLET, 2, 0 0, 3, 4, 2e-4, 340, false
+SUM_POW, 2, 0 0, 3, 4, 1e-2, 190, false
+ACKLEY, 2, 0 0, 2, 4, 1e-6, 310, false
+#RASTRIGIN, 2, 0 0, 0.9, 1.1, 5e-5, 1000, false
+GRIEWANK, 2, 0 0, 2, 3, 1e-1, 500, false
+LEVY, 2, 1 1, 0.9, 1.1, 1e-3, 200, false
+SCHWEFEL, 2, 420.9687 420.9687, 9, 11, 1, 200, false
+ZAKHAROV, 2, 0 0, 3, 4, 1e-4, 1000, false
+PERM, 2, 1 2, 0.9, 1.1, 2e-3, 540, true
+STYBLINSKI_TANG, 2, -2.903534 -2.903534, 1, 2, 1e-4, 210, false
+#HAPPY_CAT, 2, -1 -1, 2, 3, 1e-4, 500, false
+#SALOMON, 2, 0 0, 2, 3, 1e-4, 500, false
diff --git a/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.nelder_mead.csv b/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.nelder_mead.csv
index 86dc3ab..457ae74 100644
--- a/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.nelder_mead.csv
+++ b/commons-math-legacy/src/test/resources/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/std_test_func.simplex.nelder_mead.csv
@@ -17,41 +17,35 @@
 #
 # Format (CSV) defined in "SimplexOptimizerTest.Task" class.
 # Columns are:
-#  0: function name (value from "TestFunction" enum)
-#  1: space dimension (n)
-#  2: nominal start point ("n" space-separated values)
-#  3: optimum ("n" space-separated values)
-#  4: maximum expected distance from the result to the optimum
-#  5: expected number of function evaluations
-#  6: length of the sides of the initial simplex
-#  7: size of the random noise (to generate slightly different initial conditions)
-#  8: whether to perform simulated annealing
-#  9: [optional] File prefix for debugging (or empty slot for no debugging)
-# 10: [optional] Indices (space-separated) of simplex points to save (empty means "all points")
+#  0: Function name (value from "TestFunction" enum)
+#  1: Space dimension (n)
+#  2: Optimum ("n" space-separated values)
+#  3: Minimal radius of the spherical shell around the optimum (within which to randomly select a start point)
+#  4: Minimal radius of the spherical shell around the optimum (within which to randomly select a start point)
+#  5: Maximum expected distance from the result to the optimum
+#  6: Expected number of function evaluations
+#  7: Whether to perform simulated annealing
+#  8: [optional] File prefix for debugging (or empty slot for no debugging)
+#  9: [optional] Indices (space-separated) of simplex points to save (empty means "all points")
 #
 # Caveat: Some tests are commented out (cf. JIRA: MATH-1552).
 #
-PARABOLA, 4, 2.5 3.1 4.6 5.8, 0 0 0 0, 1e-4, 200, 1, 2e-1, false
-ROSENBROCK, 2, -1.2 1, 1 1, 1e-4, 180, 1, 1e-1, false
-ROSENBROCK, 5, -4.4 -3.5 -2.6 -1.7 -0.8, 1 1 1 1 1, 1e-4, 800, 5e-1, 1e-1, false
-ROSENBROCK, 10, -0.1 0.1 0.2 -0.1 -0.2 0.3 0.2 -0.1 0.2 -0.3, 1 1 1 1 1 1 1 1 1 1, 5e-5, 9000, 1, 5e-2, false
-POWELL, 4, 3 -1 -2 1, 0 0 0 0, 5e-3, 420, 1, 1e-1, false
-CIGAR, 13, -1.2 2.3 -3.2 2.1 1.2 -2.3 3.2 -2.1 -1.2 2.3 -3.2 2.1 -1.2, 0 0 0 0 0 0 0 0 0 0 0 0 0, 5e-5, 7000, 1, 1e-1, false
-SPHERE, 13, -1.2 2.3 -3.2 2.1 1.2 -2.3 3.2 -2.1 -1.2 2.3 -3.2 2.1 -1.2, 0 0 0 0 0 0 0 0 0 0 0 0 0, 5e-4, 3000, 1, 1e-1, false
-ELLI, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-4, 50000, 1, 1e-1, false
-#TWO_AXES, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-4, 5000, 1, 1e-1, false
-#CIG_TAB, 10, 2 3 4 -3 -2 -1 2 3 4 3, 0 0 0 0 0 0 0 0 0 0, 1e-4, 7000, 1, 1e-1, false
-TABLET, 11, 2 3 4 -3 -2 -1 2 3 4 3 -1, 0 0 0 0 0 0 0 0 0 0 0, 2e-4, 3600, 1, 1e-1, false
-#DIFF_POW, 7, 1 -1 1 -1 1 -1 1, 0 0 0 0 0 0 0, 5e-4, 2500, 1, 1e-1, false
-SS_DIFF_POW, 6, -3.2 2.1 1.2 -2.3 3.2 -2.1, 0 0 0 0 0 0, 1e-3, 4000, 1, 1e-1, false
-ACKLEY, 4, 3 4 -3 -2, 0 0 0 0, 1e-6, 430, 1, 5e-1, false
-#RASTRIGIN, 4, 3 4 -3 -2, 0 0 0 0, 1e-6, 10000, 1, 5e-1, false
-#GRIEWANK, 3, -210 123 -456, 0 0 0, 1e-1, 1000, 50, 100, false
-#LEVY, 4, 4 -6 -2 8, 1 1 1 1, 1e-3, 3000, 1, 1, false
-#SCHWEFEL, 2, 100 -200, 420.9687 420.9687, 1, 300, 100, 100, false
-ZAKHAROV, 5, -4 -2 3 5 7, 0 0 0 0 0, 5e-5, 500, 1.5, 1, false
-PERM, 2, -2 -1, 1 2, 5e-5, 200, 5e-1, 1e-1, false
-#PERM, 3, -2 -3 -1, 1 2 3, 5e-5, 200, 5e-1, 1e-1, false
-PERM, 4, -2 -3 -4 -1, 1 2 3 4, 5e-3, 2800, 5e-1, 1e-1, false
-#PERM, 5, -2 -3 -4 -5 -1, 1 2 3 4 5, 5e-4, 200, 5e-1, 1e-1, false
-#STYBLINSKI_TANG, 4, 1 2 3 4, -2.903534 -2.903534 -2.903534 -2.903534, 1e-4, 500, 1, 5e-1, false
+PARABOLA, 8, 0 0 0 0 0 0 0 0, 20, 40, 1e-4, 7200, false
+ROSENBROCK, 2, 1 1, 0.9, 1.1, 1e-4, 420, false
+CIGAR, 2, 0 0, 2, 3, 5e-5, 240, false
+SPHERE, 2, 0 0, 2, 3, 5e-4, 200, false
+ELLI, 2, 0 0, 3, 4, 1e-4, 350, false
+TWO_AXES, 2, 0 0, 3, 4, 1e-4, 400, false
+CIG_TAB, 2, 0 0, 3, 4, 1e-3, 280, false
+TABLET, 2, 0 0, 3, 4, 2e-4, 340, false
+SUM_POW, 2, 0 0, 3, 4, 1e-2, 190,  true
+ACKLEY, 2, 0 0, 2, 4, 1e-6, 310, false
+#RASTRIGIN, 2, 0 0, 0.9, 1.1, 5e-5, 1000, false
+GRIEWANK, 2, 0 0, 2, 3, 1e-1, 500, false
+LEVY, 2, 1 1, 0.9, 1.1, 1e-3, 200, false
+SCHWEFEL, 2, 420.9687 420.9687, 9, 11, 1, 200, false
+ZAKHAROV, 2, 0 0, 3, 4, 1e-4, 1000, false
+PERM, 2, 1 2, 0.9, 1.1, 2e-3, 260, false
+STYBLINSKI_TANG, 2, -2.903534 -2.903534, 1, 2, 1e-4, 210, false
+#HAPPY_CAT, 2, -1 -1, 2, 3, 1e-4, 500, false
+#SALOMON, 2, 0 0, 2, 3, 1e-4, 500, false