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,