You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2021/08/07 13:36:03 UTC

[commons-math] 06/11: Standard test functions defined in a dedicated factory ("TestFunction" enum).

This is an automated email from the ASF dual-hosted git repository.

erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-math.git

commit b16796776704f8665d36da8d0cf6a9bc62dc973b
Author: Gilles Sadowski <gi...@gmail.com>
AuthorDate: Sun Aug 1 04:39:30 2021 +0200

    Standard test functions defined in a dedicated factory ("TestFunction" enum).
---
 .../optim/nonlinear/scalar/TestFunction.java       | 209 +++++++++
 .../scalar/noderiv/BOBYQAOptimizerTest.java        |  53 ++-
 .../scalar/noderiv/CMAESOptimizerTest.java         | 517 +++++----------------
 .../nonlinear/scalar/noderiv/OptimTestUtils.java   | 242 ----------
 .../SimplexOptimizerMultiDirectionalTest.java      |  67 ++-
 .../noderiv/SimplexOptimizerNelderMeadTest.java    |  44 +-
 6 files changed, 416 insertions(+), 716 deletions(-)

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
new file mode 100644
index 0000000..fe457d4
--- /dev/null
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/TestFunction.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.math4.legacy.optim.nonlinear.scalar;
+
+import java.util.function.Function;
+import org.apache.commons.math4.legacy.analysis.MultivariateFunction;
+import org.apache.commons.math4.legacy.core.jdkmath.AccurateMath;
+
+/**
+ * Multivariate scalar functions for testing an optimizer.
+ */
+public enum TestFunction {
+    SPHERE(dim -> {
+            return x -> {
+                double f = 0;
+                for (int i = 0; i < dim; i++) {
+                    f += x[i] * x[i];
+                }
+                return f;
+            };
+        }),
+    CIGAR(dim -> {
+            return x -> {
+                double f = x[0] * x[0];
+                for (int i = 1; i < dim; i++) {
+                    f += 1e3 * x[i] * x[i];
+                }
+                return f;
+            };
+        }),
+    TABLET(dim -> {
+            return x -> {
+                double f = 1e3 * x[0] * x[0];
+                for (int i = 1; i < dim; i++) {
+                    f += x[i] * x[i];
+                }
+                return f;
+            };
+        }),
+    CIG_TAB(dim -> {
+            final double factor = 1e4;
+            final int last = dim - 1;
+            return x -> {
+                double f = x[0] * x[0] / factor + factor * x[last] * x[last];
+                for (int i = 1; i < last; i++) {
+                    f += x[i] * x[i];
+                }
+                return f;
+            };
+        }),
+    TWO_AXES(dim -> {
+            return x -> {
+                double f = 0;
+                for (int i = 0; i < dim; i++) {
+                    f += (i < dim / 2 ? 1e6 : 1) * x[i] * x[i];
+                }
+                return f;
+            };
+        }),
+    ELLI(dim -> {
+            final double last = dim - 1;
+            return x -> {
+                double f = 0;
+                for (int i = 0; i < dim; i++) {
+                    f += Math.pow(1e3, i / last) * x[i] * x[i];
+                }
+                return f;
+            };
+        }),
+    MINUS_ELLI(dim -> {
+            final MultivariateFunction elli = ELLI.withDimension(dim);
+            return x -> {
+                return 1 - elli.value(x);
+            };
+        }),
+    DIFF_POW(dim -> {
+            final double A = 10d / (dim - 1);
+            return x -> {
+                double f = 0;
+                for (int i = 0; i < dim; i++) {
+                    f += AccurateMath.pow(Math.abs(x[i]), A * 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;
+            };
+        }),
+    ROSEN(dim -> {
+            final int last = dim - 1;
+            return x -> {
+                double f = 0;
+                for (int i = 0; i < last; i++) {
+                    final double xi = x[i];
+                    final double a = xi * xi - x[i + 1];
+                    final double b = xi - 1;
+                    f += 1e2 * a * a + b * b;
+                }
+                return f;
+            };
+        }),
+    ACKLEY(dim -> {
+            final double A = 20;
+            final double B = 0.2;
+            final double C = 2 * Math.PI;
+            return x -> {
+                double acc1 = 0;
+                double acc2 = 0;
+                for (int i = 0; i < dim; i++) {
+                    final double v = x[i];
+                    acc1 += v * v;
+                    acc2 += Math.cos(C * v);
+                }
+                acc1 = -B * Math.sqrt(acc1 / dim);
+                acc2 /= dim;
+
+                return -A * Math.exp(acc1) - Math.exp(acc2) + A + Math.E;
+            };
+        }),
+    // https://www.sfu.ca/~ssurjano/rastr.html
+    RASTRIGIN(dim -> {
+            final double A = 10;
+            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);
+                }
+                return A * dim + sum;
+            };
+        }),
+    // https://www.sfu.ca/~ssurjano/powell.html
+    POWELL(dim -> {
+            final int last = dim / 4;
+            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;
+                }
+                return f;
+            };
+        }),
+    ROSENBROCK(dim -> {
+            final int last = dim - 1;
+            return x -> {
+                double f = 0;
+                for (int i = 0; i < last; i++) {
+                    final double xi = x[i];
+                    final double xiP1 = x[i + 1];
+                    final double a = xiP1 - xi * xi;
+                    final double b = xi - 1;
+                    f += 100 * a * a + b * b;
+                }
+                return f;
+            };
+        });
+
+    /** Template for variable dimension. */
+    private final Function<Integer, MultivariateFunction> generator;
+
+    /**
+     * @param gen Template for variable dimension.
+     */
+    TestFunction(Function<Integer, MultivariateFunction> gen) {
+        generator = gen;
+    }
+
+    /**
+     * @param dim Dimension.
+     * @return the function for the given dimension.
+     */
+    public MultivariateFunction withDimension(final int dim) {
+        final MultivariateFunction f = generator.apply(dim);
+        return x -> {
+            if (x.length != dim) {
+                throw new IllegalArgumentException("Dimension mismatch: " + x.length +
+                                                   "(expected: " + dim + ")");
+            }
+            return f.value(x);
+        };
+    }
+}
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 04f373c..020c67d 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
@@ -27,6 +27,7 @@ import org.apache.commons.math4.legacy.optim.PointValuePair;
 import org.apache.commons.math4.legacy.optim.SimpleBounds;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.GoalType;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.ObjectiveFunction;
+import org.apache.commons.math4.legacy.optim.nonlinear.scalar.TestFunction;
 import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -41,7 +42,7 @@ public class BOBYQAOptimizerTest {
     public void testInitOutOfBounds() {
         double[] startPoint = OptimTestUtils.point(DIM, 3);
         double[][] boundaries = boundaries(DIM, -1, 2);
-        doTest(new OptimTestUtils.Rosen(), startPoint, boundaries,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 2000, null);
     }
@@ -50,7 +51,7 @@ public class BOBYQAOptimizerTest {
     public void testBoundariesDimensionMismatch() {
         double[] startPoint = OptimTestUtils.point(DIM, 0.5);
         double[][] boundaries = boundaries(DIM + 1, -1, 2);
-        doTest(new OptimTestUtils.Rosen(), startPoint, boundaries,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, boundaries,
                GoalType.MINIMIZE,
                1e-13, 1e-6, 2000, null);
     }
@@ -58,7 +59,7 @@ public class BOBYQAOptimizerTest {
     @Test(expected=NumberIsTooSmallException.class)
     public void testProblemDimensionTooSmall() {
         double[] startPoint = OptimTestUtils.point(1, 0.5);
-        doTest(new OptimTestUtils.Rosen(), startPoint, null,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, null,
                GoalType.MINIMIZE,
                1e-13, 1e-6, 2000, null);
     }
@@ -68,7 +69,7 @@ public class BOBYQAOptimizerTest {
         final int lowMaxEval = 2;
         double[] startPoint = OptimTestUtils.point(DIM, 0.1);
         double[][] boundaries = null;
-        doTest(new OptimTestUtils.Rosen(), startPoint, boundaries,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, boundaries,
                GoalType.MINIMIZE,
                1e-13, 1e-6, lowMaxEval, null);
      }
@@ -78,7 +79,7 @@ public class BOBYQAOptimizerTest {
         double[] startPoint = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected = new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
-        doTest(new OptimTestUtils.Rosen(), startPoint, boundaries,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 2000, expected);
      }
@@ -88,12 +89,12 @@ public class BOBYQAOptimizerTest {
         double[] startPoint = OptimTestUtils.point(DIM,1.0);
         double[][] boundaries = null;
         PointValuePair expected = new PointValuePair(OptimTestUtils.point(DIM,0.0),1.0);
-        doTest(new OptimTestUtils.MinusElli(), startPoint, boundaries,
+        doTest(TestFunction.MINUS_ELLI.withDimension(DIM), startPoint, boundaries,
                 GoalType.MAXIMIZE,
                 2e-10, 5e-6, 1000, expected);
         boundaries = boundaries(DIM,-0.3,0.3);
         startPoint = OptimTestUtils.point(DIM,0.1);
-        doTest(new OptimTestUtils.MinusElli(), startPoint, boundaries,
+        doTest(TestFunction.MINUS_ELLI.withDimension(DIM), startPoint, boundaries,
                 GoalType.MAXIMIZE,
                 2e-10, 5e-6, 1000, expected);
     }
@@ -104,7 +105,7 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.Elli(), startPoint, boundaries,
+        doTest(TestFunction.ELLI.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 1000, expected);
      }
@@ -126,7 +127,7 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.Cigar(), startPoint, boundaries,
+        doTest(TestFunction.CIGAR.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 100, expected);
     }
@@ -137,9 +138,9 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.TwoAxes(), startPoint, boundaries,
-                GoalType.MINIMIZE, 2*
-                1e-13, 1e-6, 100, expected);
+        doTest(TestFunction.TWO_AXES.withDimension(DIM), startPoint, boundaries,
+                GoalType.MINIMIZE,
+                2e-13, 1e-6, 100, expected);
      }
 
     @Test
@@ -148,7 +149,7 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.CigTab(), startPoint, boundaries,
+        doTest(TestFunction.CIG_TAB.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 5e-5, 100, expected);
      }
@@ -159,7 +160,7 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.Sphere(), startPoint, boundaries,
+        doTest(TestFunction.CIG_TAB.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 100, expected);
     }
@@ -170,29 +171,31 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.Tablet(), startPoint, boundaries,
+        doTest(TestFunction.TABLET.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 100, expected);
     }
 
     @Test
     public void testDiffPow() {
-        double[] startPoint = OptimTestUtils.point(DIM/2,1.0);
+        final int dim = DIM / 2;
+        double[] startPoint = OptimTestUtils.point(dim, 1.0);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(OptimTestUtils.point(DIM/2,0.0),0.0);
-        doTest(new OptimTestUtils.DiffPow(), startPoint, boundaries,
+            new PointValuePair(OptimTestUtils.point(dim, 0.0), 0.0);
+        doTest(TestFunction.DIFF_POW.withDimension(dim), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-8, 1e-1, 21000, expected);
     }
 
     @Test
     public void testSsDiffPow() {
-        double[] startPoint = OptimTestUtils.point(DIM/2,1.0);
+        final int dim = DIM / 2;
+        double[] startPoint = OptimTestUtils.point(dim, 1.0);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(OptimTestUtils.point(DIM/2,0.0),0.0);
-        doTest(new OptimTestUtils.SsDiffPow(), startPoint, boundaries,
+            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);
     }
@@ -203,7 +206,7 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.Ackley(), startPoint, boundaries,
+        doTest(TestFunction.ACKLEY.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-7, 1e-5, 1000, expected);
     }
@@ -215,7 +218,7 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = null;
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
-        doTest(new OptimTestUtils.Rastrigin(), startPoint, boundaries,
+        doTest(TestFunction.RASTRIGIN.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 1000, expected);
     }
@@ -227,7 +230,7 @@ public class BOBYQAOptimizerTest {
         double[][] boundaries = boundaries(DIM,-1,2);
         PointValuePair expected =
             new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
-        doTest(new OptimTestUtils.Rosen(), startPoint, boundaries,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, boundaries,
                 GoalType.MINIMIZE,
                 1e-13, 1e-6, 2000, expected);
     }
@@ -249,7 +252,7 @@ public class BOBYQAOptimizerTest {
         final int maxAdditionalPoints = 47;
 
         for (int num = 1; num <= maxAdditionalPoints; num++) {
-            doTest(new OptimTestUtils.Rosen(), startPoint, boundaries,
+            doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, boundaries,
                    GoalType.MINIMIZE,
                    1e-12, 1e-6, 2000,
                    num,
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 af13f36..92d823c 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
@@ -16,9 +16,6 @@
  */
 package org.apache.commons.math4.legacy.optim.nonlinear.scalar.noderiv;
 
-import java.util.Arrays;
-import java.util.Random;
-
 import org.apache.commons.math4.legacy.Retry;
 import org.apache.commons.math4.legacy.RetryRunner;
 import org.apache.commons.math4.legacy.analysis.MultivariateFunction;
@@ -33,6 +30,7 @@ import org.apache.commons.math4.legacy.optim.PointValuePair;
 import org.apache.commons.math4.legacy.optim.SimpleBounds;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.GoalType;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.ObjectiveFunction;
+import org.apache.commons.math4.legacy.optim.nonlinear.scalar.TestFunction;
 import org.apache.commons.rng.simple.RandomSource;
 import org.apache.commons.math4.legacy.core.jdkmath.AccurateMath;
 import org.junit.Assert;
@@ -50,71 +48,71 @@ public class CMAESOptimizerTest {
 
     @Test(expected = NumberIsTooLargeException.class)
     public void testInitOutofbounds1() {
-        double[] startPoint = point(DIM,3);
-        double[] insigma = point(DIM, 0.3);
+        double[] startPoint = OptimTestUtils.point(DIM,3);
+        double[] insigma = OptimTestUtils.point(DIM, 0.3);
         double[][] boundaries = boundaries(DIM,-1,2);
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
     @Test(expected = NumberIsTooSmallException.class)
     public void testInitOutofbounds2() {
-        double[] startPoint = point(DIM, -2);
-        double[] insigma = point(DIM, 0.3);
+        double[] startPoint = OptimTestUtils.point(DIM, -2);
+        double[] insigma = OptimTestUtils.point(DIM, 0.3);
         double[][] boundaries = boundaries(DIM,-1,2);
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test(expected = DimensionMismatchException.class)
     public void testBoundariesDimensionMismatch() {
-        double[] startPoint = point(DIM,0.5);
-        double[] insigma = point(DIM, 0.3);
+        double[] startPoint = OptimTestUtils.point(DIM,0.5);
+        double[] insigma = OptimTestUtils.point(DIM, 0.3);
         double[][] boundaries = boundaries(DIM+1,-1,2);
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test(expected = NotPositiveException.class)
     public void testInputSigmaNegative() {
-        double[] startPoint = point(DIM,0.5);
-        double[] insigma = point(DIM,-0.5);
+        double[] startPoint = OptimTestUtils.point(DIM,0.5);
+        double[] insigma = OptimTestUtils.point(DIM,-0.5);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test(expected = OutOfRangeException.class)
     public void testInputSigmaOutOfRange() {
-        double[] startPoint = point(DIM,0.5);
-        double[] insigma = point(DIM, 1.1);
+        double[] startPoint = OptimTestUtils.point(DIM,0.5);
+        double[] insigma = OptimTestUtils.point(DIM, 1.1);
         double[][] boundaries = boundaries(DIM,-0.5,0.5);
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test(expected = DimensionMismatchException.class)
     public void testInputSigmaDimensionMismatch() {
-        double[] startPoint = point(DIM,0.5);
-        double[] insigma = point(DIM + 1, 0.5);
+        double[] startPoint = OptimTestUtils.point(DIM,0.5);
+        double[] insigma = OptimTestUtils.point(DIM + 1, 0.5);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
@@ -122,15 +120,15 @@ public class CMAESOptimizerTest {
     @Test
     @Retry(3)
     public void testRosen() {
-        double[] startPoint = point(DIM,0.1);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,0.1);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
@@ -138,20 +136,20 @@ public class CMAESOptimizerTest {
     @Test
     @Retry(3)
     public void testMaximize() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),1.0);
-        doTest(new MinusElli(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),1.0);
+        doTest(TestFunction.MINUS_ELLI.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MAXIMIZE, LAMBDA, true, 0, 1.0-1e-13,
                 2e-10, 5e-6, 100000, expected);
-        doTest(new MinusElli(), startPoint, insigma, boundaries,
+        doTest(TestFunction.MINUS_ELLI.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MAXIMIZE, LAMBDA, false, 0, 1.0-1e-13,
                 2e-10, 5e-6, 100000, expected);
         boundaries = boundaries(DIM,-0.3,0.3);
-        startPoint = point(DIM,0.1);
-        doTest(new MinusElli(), startPoint, insigma, boundaries,
+        startPoint = OptimTestUtils.point(DIM,0.1);
+        doTest(TestFunction.MINUS_ELLI.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MAXIMIZE, LAMBDA, true, 0, 1.0-1e-13,
                 2e-10, 5e-6, 100000, expected);
     }
@@ -182,207 +180,207 @@ public class CMAESOptimizerTest {
 
     @Test
     public void testEllipse() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new Elli(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.ELLI.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
-        doTest(new Elli(), startPoint, insigma, boundaries,
+        doTest(TestFunction.ELLI.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test
     public void testElliRotated() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new ElliRotated(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(new OptimTestUtils.ElliRotated(), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
-        doTest(new ElliRotated(), startPoint, insigma, boundaries,
+        doTest(new OptimTestUtils.ElliRotated(), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test
     public void testCigar() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new Cigar(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.CIGAR.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 200000, expected);
-        doTest(new Cigar(), startPoint, insigma, boundaries,
+        doTest(TestFunction.CIGAR.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test
     public void testCigarWithBoundaries() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = boundaries(DIM, -1e100, Double.POSITIVE_INFINITY);
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new Cigar(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.CIGAR.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 200000, expected);
-        doTest(new Cigar(), startPoint, insigma, boundaries,
+        doTest(TestFunction.CIGAR.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test
     public void testTwoAxes() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new TwoAxes(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.TWO_AXES.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 2*LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 200000, expected);
-        doTest(new TwoAxes(), startPoint, insigma, boundaries,
+        doTest(TestFunction.TWO_AXES.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 2*LAMBDA, false, 0, 1e-13,
                 1e-8, 1e-3, 200000, expected);
     }
 
     @Test
     public void testCigTab() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.3);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.3);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new CigTab(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.CIG_TAB.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 5e-5, 100000, expected);
-        doTest(new CigTab(), startPoint, insigma, boundaries,
+        doTest(TestFunction.CIG_TAB.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 5e-5, 100000, expected);
     }
 
     @Test
     public void testSphere() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new Sphere(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.SPHERE.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
-        doTest(new Sphere(), startPoint, insigma, boundaries,
+        doTest(TestFunction.SPHERE.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test
     public void testTablet() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new Tablet(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.TABLET.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
-        doTest(new Tablet(), startPoint, insigma, boundaries,
+        doTest(TestFunction.TABLET.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test
     public void testDiffPow() {
-        double[] startPoint = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new DiffPow(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.DIFF_POW.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 10, true, 0, 1e-13,
                 1e-8, 1e-1, 100000, expected);
-        doTest(new DiffPow(), startPoint, insigma, boundaries,
+        doTest(TestFunction.DIFF_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 = point(DIM,1.0);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new SsDiffPow(), startPoint, insigma, boundaries,
+            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(new SsDiffPow(), startPoint, insigma, boundaries,
+        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 = point(DIM,1.0);
-        double[] insigma = point(DIM,1.0);
+        double[] startPoint = OptimTestUtils.point(DIM,1.0);
+        double[] insigma = OptimTestUtils.point(DIM,1.0);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new Ackley(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.ACKLEY.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 2*LAMBDA, true, 0, 1e-13,
                 1e-9, 1e-5, 100000, expected);
-        doTest(new Ackley(), startPoint, insigma, boundaries,
+        doTest(TestFunction.ACKLEY.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 2*LAMBDA, false, 0, 1e-13,
                 1e-9, 1e-5, 100000, expected);
     }
 
     @Test
     public void testRastrigin() {
-        double[] startPoint = point(DIM,0.1);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,0.1);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,0.0),0.0);
-        doTest(new Rastrigin(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,0.0),0.0);
+        doTest(TestFunction.RASTRIGIN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, (int)(200*AccurateMath.sqrt(DIM)), true, 0, 1e-13,
                 1e-13, 1e-6, 200000, expected);
-        doTest(new Rastrigin(), startPoint, insigma, boundaries,
+        doTest(TestFunction.RASTRIGIN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, (int)(200*AccurateMath.sqrt(DIM)), false, 0, 1e-13,
                 1e-13, 1e-6, 200000, expected);
     }
 
     @Test
     public void testConstrainedRosen() {
-        double[] startPoint = point(DIM, 0.1);
-        double[] insigma = point(DIM, 0.1);
+        double[] startPoint = OptimTestUtils.point(DIM, 0.1);
+        double[] insigma = OptimTestUtils.point(DIM, 0.1);
         double[][] boundaries = boundaries(DIM, -1, 2);
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 2*LAMBDA, true, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, 2*LAMBDA, false, 0, 1e-13,
                 1e-13, 1e-6, 100000, expected);
     }
 
     @Test
     public void testDiagonalRosen() {
-        double[] startPoint = point(DIM,0.1);
-        double[] insigma = point(DIM,0.1);
+        double[] startPoint = OptimTestUtils.point(DIM,0.1);
+        double[] insigma = OptimTestUtils.point(DIM,0.1);
         double[][] boundaries = null;
         PointValuePair expected =
-            new PointValuePair(point(DIM,1.0),0.0);
-        doTest(new Rosen(), startPoint, insigma, boundaries,
+            new PointValuePair(OptimTestUtils.point(DIM,1.0),0.0);
+        doTest(TestFunction.ROSEN.withDimension(DIM), startPoint, insigma, boundaries,
                 GoalType.MINIMIZE, LAMBDA, false, 1, 1e-13,
                 1e-10, 1e-4, 1000000, expected);
      }
@@ -529,7 +527,6 @@ public class CMAESOptimizerTest {
                            new CMAESOptimizer.Sigma(inSigma),
                            new CMAESOptimizer.PopulationSize(lambda));
 
-        // System.out.println("sol=" + Arrays.toString(result.getPoint()));
         Assert.assertEquals(expected.getValue(), result.getValue(), fTol);
         for (int i = 0; i < dim; i++) {
             Assert.assertEquals(expected.getPoint()[i], result.getPoint()[i], pointTol);
@@ -538,12 +535,6 @@ public class CMAESOptimizerTest {
         Assert.assertTrue(optim.getIterations() > 0);
     }
 
-    private static double[] point(int n, double value) {
-        double[] ds = new double[n];
-        Arrays.fill(ds, value);
-        return ds;
-    }
-
     private static double[][] boundaries(int dim,
             double lower, double upper) {
         double[][] boundaries = new double[2][dim];
@@ -555,300 +546,4 @@ public class CMAESOptimizerTest {
         }
         return boundaries;
     }
-
-    private static class Sphere implements MultivariateFunction {
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    private static class Cigar implements MultivariateFunction {
-        private double factor;
-
-        Cigar() {
-            this(1e3);
-        }
-
-        Cigar(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = x[0] * x[0];
-            for (int i = 1; i < x.length; ++i) {
-                f += factor * x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    private static class Tablet implements MultivariateFunction {
-        private double factor;
-
-        Tablet() {
-            this(1e3);
-        }
-
-        Tablet(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = factor * x[0] * x[0];
-            for (int i = 1; i < x.length; ++i) {
-                f += x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    private static class CigTab implements MultivariateFunction {
-        private double factor;
-
-        CigTab() {
-            this(1e4);
-        }
-
-        CigTab(double axisratio) {
-            factor = axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            int end = x.length - 1;
-            double f = x[0] * x[0] / factor + factor * x[end] * x[end];
-            for (int i = 1; i < end; ++i) {
-                f += x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    private static class TwoAxes implements MultivariateFunction {
-
-        private double factor;
-
-        TwoAxes() {
-            this(1e6);
-        }
-
-        TwoAxes(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += (i < x.length / 2 ? factor : 1) * x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    private static class ElliRotated implements MultivariateFunction {
-        private Basis B = new Basis();
-        private double factor;
-
-        ElliRotated() {
-            this(1e3);
-        }
-
-        ElliRotated(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            x = B.Rotate(x);
-            for (int i = 0; i < x.length; ++i) {
-                f += AccurateMath.pow(factor, i / (x.length - 1.)) * x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    private static class Elli implements MultivariateFunction {
-
-        private double factor;
-
-        Elli() {
-            this(1e3);
-        }
-
-        Elli(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += AccurateMath.pow(factor, i / (x.length - 1.)) * x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    private static class MinusElli implements MultivariateFunction {
-
-        @Override
-        public double value(double[] x) {
-            return 1.0-(new Elli().value(x));
-        }
-    }
-
-    private static class DiffPow implements MultivariateFunction {
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += AccurateMath.pow(AccurateMath.abs(x[i]), 2. + 10 * (double) i
-                        / (x.length - 1.));
-            }
-            return f;
-        }
-    }
-
-    private static class SsDiffPow implements MultivariateFunction {
-
-        @Override
-        public double value(double[] x) {
-            double f = AccurateMath.pow(new DiffPow().value(x), 0.25);
-            return f;
-        }
-    }
-
-    private static class Rosen implements MultivariateFunction {
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length - 1; ++i) {
-                f += 1e2 * (x[i] * x[i] - x[i + 1]) * (x[i] * x[i] - x[i + 1])
-                + (x[i] - 1.) * (x[i] - 1.);
-            }
-            return f;
-        }
-    }
-
-    private static class Ackley implements MultivariateFunction {
-        private double axisratio;
-
-        Ackley(double axra) {
-            axisratio = axra;
-        }
-
-        Ackley() {
-            this(1);
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            double res2 = 0;
-            double fac = 0;
-            for (int i = 0; i < x.length; ++i) {
-                fac = AccurateMath.pow(axisratio, (i - 1.) / (x.length - 1.));
-                f += fac * fac * x[i] * x[i];
-                res2 += AccurateMath.cos(2. * AccurateMath.PI * fac * x[i]);
-            }
-            f = 20. - 20. * AccurateMath.exp(-0.2 * AccurateMath.sqrt(f / x.length))
-                    + AccurateMath.exp(1.) - AccurateMath.exp(res2 / x.length);
-            return f;
-        }
-    }
-
-    private static class Rastrigin implements MultivariateFunction {
-
-        private double axisratio;
-        private double amplitude;
-
-        Rastrigin() {
-            this(1, 10);
-        }
-
-        Rastrigin(double axisratio, double amplitude) {
-            this.axisratio = axisratio;
-            this.amplitude = amplitude;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            double fac;
-            for (int i = 0; i < x.length; ++i) {
-                fac = AccurateMath.pow(axisratio, (i - 1.) / (x.length - 1.));
-                if (i == 0 && x[i] < 0) {
-                    fac *= 1.;
-                }
-                f += fac * fac * x[i] * x[i] + amplitude
-                * (1. - AccurateMath.cos(2. * AccurateMath.PI * fac * x[i]));
-            }
-            return f;
-        }
-    }
-
-    private static class Basis {
-        private double[][] basis;
-        private Random rand = new Random(2); // use not always the same basis
-
-        double[] Rotate(double[] x) {
-            GenBasis(x.length);
-            double[] y = new double[x.length];
-            for (int i = 0; i < x.length; ++i) {
-                y[i] = 0;
-                for (int j = 0; j < x.length; ++j) {
-                    y[i] += basis[i][j] * x[j];
-                }
-            }
-            return y;
-        }
-
-        void GenBasis(int dim) {
-            if (basis != null ? basis.length == dim : false) {
-                return;
-            }
-
-            double sp;
-            int i;
-            int j;
-            int k;
-
-            /* generate orthogonal basis */
-            basis = new double[dim][dim];
-            for (i = 0; i < dim; ++i) {
-                /* sample components gaussian */
-                for (j = 0; j < dim; ++j) {
-                    basis[i][j] = rand.nextGaussian();
-                }
-                /* substract projection of previous vectors */
-                for (j = i - 1; j >= 0; --j) {
-                    for (sp = 0., k = 0; k < dim; ++k) {
-                        sp += basis[i][k] * basis[j][k]; /* scalar product */
-                    }
-                    for (k = 0; k < dim; ++k) {
-                        basis[i][k] -= sp * basis[j][k]; /* substract */
-                    }
-                }
-                /* normalize */
-                for (sp = 0., k = 0; k < dim; ++k) {
-                    sp += basis[i][k] * basis[i][k]; /* squared norm */
-                }
-                for (k = 0; k < dim; ++k) {
-                    basis[i][k] /= AccurateMath.sqrt(sp);
-                }
-            }
-        }
-    }
 }
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/OptimTestUtils.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/OptimTestUtils.java
index 2f5d9cb..2522218 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/OptimTestUtils.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/OptimTestUtils.java
@@ -32,103 +32,6 @@ final class OptimTestUtils {
     /** No instances. */
     private OptimTestUtils() {}
 
-    static class Sphere implements MultivariateFunction {
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    static class Cigar implements MultivariateFunction {
-        private double factor;
-
-        Cigar() {
-            this(1e3);
-        }
-
-        Cigar(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = x[0] * x[0];
-            for (int i = 1; i < x.length; ++i) {
-                f += factor * x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    static class Tablet implements MultivariateFunction {
-        private double factor;
-
-        Tablet() {
-            this(1e3);
-        }
-
-        Tablet(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = factor * x[0] * x[0];
-            for (int i = 1; i < x.length; ++i) {
-                f += x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    static class CigTab implements MultivariateFunction {
-        private double factor;
-
-        CigTab() {
-            this(1e4);
-        }
-
-        CigTab(double axisratio) {
-            factor = axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            int end = x.length - 1;
-            double f = x[0] * x[0] / factor + factor * x[end] * x[end];
-            for (int i = 1; i < end; ++i) {
-                f += x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    static class TwoAxes implements MultivariateFunction {
-
-        private double factor;
-
-        TwoAxes() {
-            this(1e6);
-        }
-
-        TwoAxes(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += (i < x.length / 2 ? factor : 1) * x[i] * x[i];
-            }
-            return f;
-        }
-    }
 
     static class ElliRotated implements MultivariateFunction {
         private Basis B = new Basis();
@@ -153,105 +56,6 @@ final class OptimTestUtils {
         }
     }
 
-    static class Elli implements MultivariateFunction {
-
-        private double factor;
-
-        Elli() {
-            this(1e3);
-        }
-
-        Elli(double axisratio) {
-            factor = axisratio * axisratio;
-        }
-
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += AccurateMath.pow(factor, i / (x.length - 1.)) * x[i] * x[i];
-            }
-            return f;
-        }
-    }
-
-    static class MinusElli implements MultivariateFunction {
-        private final Elli elli = new Elli();
-        @Override
-        public double value(double[] x) {
-            return 1.0 - elli.value(x);
-        }
-    }
-
-    static class DiffPow implements MultivariateFunction {
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length; ++i) {
-                f += AccurateMath.pow(AccurateMath.abs(x[i]), 2. + 10 * (double) i
-                        / (x.length - 1.));
-            }
-            return f;
-        }
-    }
-
-    static class SsDiffPow implements MultivariateFunction {
-        @Override
-        public double value(double[] x) {
-            double f = AccurateMath.pow(new DiffPow().value(x), 0.25);
-            return f;
-        }
-    }
-
-    static class Rosen implements MultivariateFunction {
-        @Override
-        public double value(double[] x) {
-            double f = 0;
-            for (int i = 0; i < x.length - 1; i++) {
-                final double a = x[i] * x[i] - x[i + 1];
-                final double b = x[i] - 1;
-                f += 1e2 * a * a + b * b;
-            }
-            return f;
-        }
-    }
-
-    static class Ackley implements MultivariateFunction {
-        private static final double A = 20;
-        private static final double B = 0.2;
-        private static final double C = 2 * Math.PI;
-
-        @Override
-        public double value(double[] x) {
-            final int dim = x.length;
-            double acc1 = 0;
-            double acc2 = 0;
-            for (int i = 0; i < dim; i++) {
-                final double v = x[i];
-                acc1 += v * v;
-                acc2 += Math.cos(C * v);
-            }
-            acc1 = -B * Math.sqrt(acc1 / dim);
-            acc2 /= dim;
-
-            return -A * Math.exp(acc1) - Math.exp(acc2) + A + Math.E;
-        }
-    }
-
-    // https://www.sfu.ca/~ssurjano/rastr.html
-    static class Rastrigin implements MultivariateFunction {
-        private static final double A = 10;
-        @Override
-        public double value(double[] x) {
-            double sum = 0;
-            for (int i = 0; i < x.length; i++) {
-                final double xi = x[i];
-                sum += xi * xi - A * AccurateMath.cos(2 * Math.PI * xi);
-            }
-            return A * x.length + sum;
-        }
-    }
-
     static class FourExtrema implements MultivariateFunction {
         // The following function has 4 local extrema.
         static final double xM = -3.841947088256863675365;
@@ -272,52 +76,6 @@ final class OptimTestUtils {
         }
     }
 
-    static class Rosenbrock implements MultivariateFunction {
-        @Override
-        public double value(double[] x) {
-            double a = x[1] - x[0] * x[0];
-            double b = 1.0 - x[0];
-            return 100 * a * a + b * b;
-        }
-    }
-
-    static class Powell implements MultivariateFunction {
-        @Override
-        public double value(double[] x) {
-            double a = x[0] + 10 * x[1];
-            double b = x[2] - x[3];
-            double c = x[1] - 2 * x[2];
-            double d = x[0] - x[3];
-            return a * a + 5 * b * b + c * c * c * c + 10 * d * d * d * d;
-        }
-    }
-
-    static class Gaussian2D implements MultivariateFunction {
-        private final double[] maximumPosition;
-        private final double std;
-
-        Gaussian2D(double xOpt, double yOpt, double std) {
-            maximumPosition = new double[] { xOpt, yOpt };
-            this.std = std;
-        }
-
-        public double getMaximum() {
-            return value(maximumPosition);
-        }
-
-        public double[] getMaximumPosition() {
-            return maximumPosition.clone();
-        }
-
-        @Override
-        public double value(double[] point) {
-            final double x = point[0];
-            final double y = point[1];
-            final double twoS2 = 2.0 * std * std;
-            return 1.0 / (twoS2 * AccurateMath.PI) * AccurateMath.exp(-(x * x + y * y) / twoS2);
-        }
-    }
-
     static double[] point(int n, double value) {
         final double[] ds = new double[n];
         Arrays.fill(ds, value);
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java
index 412772b..5bde7d8 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerMultiDirectionalTest.java
@@ -26,7 +26,9 @@ import org.apache.commons.math4.legacy.optim.PointValuePair;
 import org.apache.commons.math4.legacy.optim.SimpleBounds;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.GoalType;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.ObjectiveFunction;
+import org.apache.commons.math4.legacy.optim.nonlinear.scalar.TestFunction;
 import org.apache.commons.math4.legacy.core.MathArrays;
+import org.apache.commons.math4.legacy.core.jdkmath.AccurateMath;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.Ignore;
@@ -52,7 +54,7 @@ public class SimplexOptimizerMultiDirectionalTest {
     @Test
     public void testMath283() {
         SimplexOptimizer optimizer = new SimplexOptimizer(1e-14, 1e-14);
-        final OptimTestUtils.Gaussian2D function = new OptimTestUtils.Gaussian2D(0, 0, 1);
+        final Gaussian2D function = new Gaussian2D(0, 0, 1);
         PointValuePair estimate = optimizer.optimize(new MaxEval(1000),
                                                      new ObjectiveFunction(function),
                                                      GoalType.MAXIMIZE,
@@ -117,27 +119,29 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Test
     public void testRosenbrock() {
-        doTest(new OptimTestUtils.Rosenbrock(),
+        final int dim = 2;
+        doTest(TestFunction.ROSENBROCK.withDimension(dim),
                OptimTestUtils.point(new double[] { -1.2, 1 }, 1e-1),
                GoalType.MINIMIZE,
                190,
-               new PointValuePair(OptimTestUtils.point(2, 1.0), 0.0),
+               new PointValuePair(OptimTestUtils.point(dim, 1.0), 0.0),
                1e-4);
     }
 
     @Test
     public void testPowell() {
-        doTest(new OptimTestUtils.Powell(),
+        final int dim =4;
+        doTest(TestFunction.POWELL.withDimension(dim),
                OptimTestUtils.point(new double[] { 3, -1, 0, 1 }, 1e-1),
                GoalType.MINIMIZE,
                420,
-               new PointValuePair(OptimTestUtils.point(4, 0.0), 0.0),
+               new PointValuePair(OptimTestUtils.point(dim, 0.0), 0.0),
                2e-4);
     }
 
     @Test
     public void testRosen() {
-        doTest(new OptimTestUtils.Rosen(),
+        doTest(TestFunction.ROSEN.withDimension(DIM),
                OptimTestUtils.point(DIM, 0.1),
                GoalType.MINIMIZE,
                186915,
@@ -147,7 +151,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Ignore("See MATH-1552")@Test
     public void testEllipse() {
-        doTest(new OptimTestUtils.Elli(),
+        doTest(TestFunction.ELLI.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                911,
@@ -167,7 +171,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Test
     public void testCigar() {
-        doTest(new OptimTestUtils.Cigar(),
+        doTest(TestFunction.CIGAR.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                7000,
@@ -177,7 +181,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Ignore("See MATH-1552")@Test
     public void testTwoAxes() {
-        doTest(new OptimTestUtils.TwoAxes(),
+        doTest(TestFunction.TWO_AXES.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                1219,
@@ -187,7 +191,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Ignore("See MATH-1552")@Test
     public void testCigTab() {
-        doTest(new OptimTestUtils.CigTab(),
+        doTest(TestFunction.CIG_TAB.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                827,
@@ -197,7 +201,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Test
     public void testSphere() {
-        doTest(new OptimTestUtils.Sphere(),
+        doTest(TestFunction.SPHERE.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                2580,
@@ -207,7 +211,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Ignore("See MATH-1552")@Test
     public void testTablet() {
-        doTest(new OptimTestUtils.Tablet(),
+        doTest(TestFunction.TABLET.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                911,
@@ -217,7 +221,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Ignore("See MATH-1552")@Test
     public void testDiffPow() {
-        doTest(new OptimTestUtils.DiffPow(),
+        doTest(TestFunction.DIFF_POW.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                631,
@@ -227,17 +231,18 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Test
     public void testSsDiffPow() {
-        doTest(new OptimTestUtils.SsDiffPow(),
-               OptimTestUtils.point(DIM / 2, 1.0, 1e-1),
+        final int dim = DIM / 2;
+        doTest(TestFunction.SS_DIFF_POW.withDimension(dim),
+               OptimTestUtils.point(dim, 1.0, 1e-1),
                GoalType.MINIMIZE,
                4000,
-               new PointValuePair(OptimTestUtils.point(DIM / 2, 0.0), 0.0),
+               new PointValuePair(OptimTestUtils.point(dim, 0.0), 0.0),
                1e-3);
     }
 
     @Ignore("See MATH-1552")@Test
     public void testAckley() {
-        doTest(new OptimTestUtils.Ackley(),
+        doTest(TestFunction.ACKLEY.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                7900,
@@ -247,7 +252,7 @@ public class SimplexOptimizerMultiDirectionalTest {
 
     @Ignore("See MATH-1552")@Test
     public void testRastrigin() {
-        doTest(new OptimTestUtils.Rastrigin(),
+        doTest(TestFunction.RASTRIGIN.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 2e-1),
                GoalType.MINIMIZE,
                4600,
@@ -318,4 +323,30 @@ public class SimplexOptimizerMultiDirectionalTest {
         Assert.assertTrue(name + ": nEval=" + nEval,
                           nEval < maxEvaluations);
     }
+
+    private static class Gaussian2D implements MultivariateFunction {
+        private final double[] maximumPosition;
+        private final double std;
+
+        Gaussian2D(double xOpt, double yOpt, double std) {
+            maximumPosition = new double[] { xOpt, yOpt };
+            this.std = std;
+        }
+
+        public double getMaximum() {
+            return value(maximumPosition);
+        }
+
+        public double[] getMaximumPosition() {
+            return maximumPosition.clone();
+        }
+
+        @Override
+        public double value(double[] point) {
+            final double x = point[0];
+            final double y = point[1];
+            final double twoS2 = 2.0 * std * std;
+            return 1.0 / (twoS2 * AccurateMath.PI) * AccurateMath.exp(-(x * x + y * y) / twoS2);
+        }
+    }
 }
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java
index 7bf0383..acc1ede 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/SimplexOptimizerNelderMeadTest.java
@@ -31,6 +31,7 @@ import org.apache.commons.math4.legacy.optim.SimpleBounds;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.GoalType;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.LeastSquaresConverter;
 import org.apache.commons.math4.legacy.optim.nonlinear.scalar.ObjectiveFunction;
+import org.apache.commons.math4.legacy.optim.nonlinear.scalar.TestFunction;
 import org.apache.commons.math4.legacy.core.MathArrays;
 import org.junit.Assert;
 import org.junit.Test;
@@ -145,13 +146,13 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Test(expected=TooManyEvaluationsException.class)
     public void testMaxIterations() {
-        OptimTestUtils.Powell powell = new OptimTestUtils.Powell();
+        final int dim = 4;
         SimplexOptimizer optimizer = new SimplexOptimizer(-1, 1e-3);
         optimizer.optimize(new MaxEval(20),
-                           new ObjectiveFunction(powell),
+                           new ObjectiveFunction(TestFunction.POWELL.withDimension(dim)),
                            GoalType.MINIMIZE,
                            new InitialGuess(new double[] { 3, -1, 0, 1 }),
-                           Simplex.of(4),
+                           Simplex.of(dim),
                            new NelderMeadTransform());
     }
 
@@ -202,27 +203,29 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Test
     public void testRosenbrock() {
-        doTest(new OptimTestUtils.Rosenbrock(),
+        final int dim = 2;
+        doTest(TestFunction.ROSENBROCK.withDimension(dim),
                OptimTestUtils.point(new double[] { -1.2, 1 }, 1e-1),
                GoalType.MINIMIZE,
                180,
-               new PointValuePair(OptimTestUtils.point(2, 1.0), 0.0),
+               new PointValuePair(OptimTestUtils.point(dim, 1.0), 0.0),
                1e-4);
     }
 
     @Test
     public void testPowell() {
-        doTest(new OptimTestUtils.Powell(),
+        final int dim = 4;
+        doTest(TestFunction.POWELL.withDimension(dim),
                OptimTestUtils.point(new double[] { 3, -1, 0, 1 }, 1e-1),
                GoalType.MINIMIZE,
                420,
-               new PointValuePair(OptimTestUtils.point(4, 0.0), 0.0),
+               new PointValuePair(OptimTestUtils.point(dim, 0.0), 0.0),
                2e-4);
     }
 
     @Test
     public void testRosen() {
-        doTest(new OptimTestUtils.Rosen(),
+        doTest(TestFunction.ROSEN.withDimension(DIM),
                OptimTestUtils.point(DIM, 0.1),
                GoalType.MINIMIZE,
                9078,
@@ -232,7 +235,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Ignore("See MATH-1552")@Test
     public void testEllipse() {
-        doTest(new OptimTestUtils.Elli(),
+        doTest(TestFunction.ELLI.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 2e-1),
                GoalType.MINIMIZE,
                15000,
@@ -252,7 +255,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Test
     public void testCigar() {
-        doTest(new OptimTestUtils.Cigar(),
+        doTest(TestFunction.CIGAR.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 2e-1),
                GoalType.MINIMIZE,
                7000,
@@ -262,7 +265,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Ignore("See MATH-1552")@Test
     public void testTwoAxes() {
-        doTest(new OptimTestUtils.TwoAxes(),
+        doTest(TestFunction.TWO_AXES.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                3451,
@@ -272,7 +275,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Ignore("See MATH-1552")@Test
     public void testCigTab() {
-        doTest(new OptimTestUtils.CigTab(),
+        doTest(TestFunction.CIG_TAB.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                7000,
@@ -282,7 +285,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Test
     public void testSphere() {
-        doTest(new OptimTestUtils.Sphere(),
+        doTest(TestFunction.SPHERE.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                3000,
@@ -292,7 +295,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Ignore("See MATH-1552")@Test
     public void testTablet() {
-        doTest(new OptimTestUtils.Tablet(),
+        doTest(TestFunction.TABLET.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 1e-1),
                GoalType.MINIMIZE,
                10000,
@@ -302,7 +305,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Ignore("See MATH-1552")@Test
     public void testDiffPow() {
-        doTest(new OptimTestUtils.DiffPow(),
+        doTest(TestFunction.DIFF_POW.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 2e-1),
                GoalType.MINIMIZE,
                7000,
@@ -312,17 +315,18 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Test
     public void testSsDiffPow() {
-        doTest(new OptimTestUtils.SsDiffPow(),
-               OptimTestUtils.point(DIM / 2, 1.0, 2e-1),
+        final int dim = DIM / 2;
+        doTest(TestFunction.SS_DIFF_POW.withDimension(dim),
+               OptimTestUtils.point(dim, 1.0, 2e-1),
                GoalType.MINIMIZE,
                4000,
-               new PointValuePair(OptimTestUtils.point(DIM / 2, 0.0), 0.0),
+               new PointValuePair(OptimTestUtils.point(dim, 0.0), 0.0),
                1e-3);
     }
 
     @Ignore("See MATH-1552")@Test
     public void testAckley() {
-        doTest(new OptimTestUtils.Ackley(),
+        doTest(TestFunction.ACKLEY.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 2e-1),
                GoalType.MINIMIZE,
                7900,
@@ -332,7 +336,7 @@ public class SimplexOptimizerNelderMeadTest {
 
     @Ignore("See MATH-1552")@Test
     public void testRastrigin() {
-        doTest(new OptimTestUtils.Rastrigin(),
+        doTest(TestFunction.RASTRIGIN.withDimension(DIM),
                OptimTestUtils.point(DIM, 1.0, 2e-1),
                GoalType.MINIMIZE,
                4600,