diff --git a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java
index d6573306a..7606cee33 100644
--- a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java
+++ b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/nonlinear/scalar/noderiv/CMAESOptimizer.java
@@ -22,7 +22,6 @@ import java.util.Arrays;
import java.util.List;
import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
-import org.apache.commons.math4.legacy.exception.NotPositiveException;
import org.apache.commons.math4.legacy.exception.NotStrictlyPositiveException;
import org.apache.commons.math4.legacy.exception.OutOfRangeException;
import org.apache.commons.math4.legacy.exception.TooManyEvaluationsException;
@@ -35,6 +34,7 @@ import org.apache.commons.math4.legacy.optim.OptimizationData;
import org.apache.commons.math4.legacy.optim.PointValuePair;
import org.apache.commons.math4.legacy.optim.nonlinear.scalar.GoalType;
import org.apache.commons.math4.legacy.optim.nonlinear.scalar.PopulationSize;
+import org.apache.commons.math4.legacy.optim.nonlinear.scalar.Sigma;
import org.apache.commons.math4.legacy.optim.nonlinear.scalar.MultivariateOptimizer;
import org.apache.commons.rng.UniformRandomProvider;
import org.apache.commons.statistics.distribution.ContinuousDistribution;
@@ -78,14 +78,6 @@ import org.apache.commons.math4.core.jdkmath.JdkMath;
*
Wikipedia
*
*
- *
- * The {@link PopulationSize number of offsprings} is the primary strategy
- * parameter. In the absence of better clues, a good default could be an integer
- * close to {@code 4 + 3 ln(n)}, where {@code n} is the number of optimized
- * parameters. Increasing the population size improves global search properties
- * at the expense of speed (which in general decreases at most linearly with
- * increasing population size).
- *
* @since 3.0
*/
public class CMAESOptimizer
@@ -278,44 +270,6 @@ public class CMAESOptimizer
return statisticsDHistory;
}
- /**
- * Input sigma values.
- * They define the initial coordinate-wise standard deviations for
- * sampling new search points around the initial guess.
- * It is suggested to set them to the estimated distance from the
- * initial to the desired optimum.
- * Small values induce the search to be more local (and very small
- * values are more likely to find a local optimum close to the initial
- * guess).
- * Too small values might however lead to early termination.
- */
- public static class Sigma implements OptimizationData {
- /** Sigma values. */
- private final double[] sigma;
-
- /**
- * @param s Sigma values.
- * @throws NotPositiveException if any of the array entries is smaller
- * than zero.
- */
- public Sigma(double[] s) {
- for (int i = 0; i < s.length; i++) {
- if (s[i] < 0) {
- throw new NotPositiveException(s[i]);
- }
- }
-
- sigma = s.clone();
- }
-
- /**
- * @return the sigma values.
- */
- public double[] getSigma() {
- return sigma.clone();
- }
- }
-
/**
* {@inheritDoc}
*
@@ -323,14 +277,32 @@ public class CMAESOptimizer
* {@link MultivariateOptimizer#parseOptimizationData(OptimizationData[])
* MultivariateOptimizer}, this method will register the following data:
*
- * - {@link Sigma}
- * - {@link PopulationSize}
+ * -
+ * {@link Sigma} values define the initial coordinate-wise standard
+ * deviations for sampling new search points around the initial guess.
+ * It is suggested to set them to the estimated distance from the
+ * initial to the desired optimum.
+ * Small values induce the search to be more local (and very small
+ * values are more likely to find a local optimum close to the initial
+ * guess).
+ * Too small values might however lead to early termination.
+ *
+ * -
+ * {@link PopulationSize} is the number of offsprings and the primary
+ * strategy parameter.
+ * In the absence of better clues, a good default could be an integer
+ * close to {@code 4 + 3 ln(n)}, where {@code n} is the number of
+ * optimized parameters.
+ * Increasing the population size improves global search properties at
+ * the expense of speed (which in general decreases at most linearly
+ * with increasing population size).
+ *
*
* @return {@inheritDoc}
- * @throws TooManyEvaluationsException if the maximal number of
- * evaluations is exceeded.
- * @throws DimensionMismatchException if the initial guess, target, and weight
- * arguments have inconsistent dimensions.
+ * @throws TooManyEvaluationsException if the maximal number of evaluations
+ * is exceeded.
+ * @throws DimensionMismatchException if the initial guess, target, and
+ * weight arguments have inconsistent dimensions.
*/
@Override
public PointValuePair optimize(OptimizationData... optData) {
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 830b75345..bf2a609df 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
@@ -18,7 +18,7 @@ package org.apache.commons.math4.legacy.optim.nonlinear.scalar.noderiv;
import org.apache.commons.math4.legacy.analysis.MultivariateFunction;
import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
-import org.apache.commons.math4.legacy.exception.NotPositiveException;
+import org.apache.commons.math4.legacy.exception.NotStrictlyPositiveException;
import org.apache.commons.math4.legacy.exception.NumberIsTooLargeException;
import org.apache.commons.math4.legacy.exception.NumberIsTooSmallException;
import org.apache.commons.math4.legacy.exception.OutOfRangeException;
@@ -28,6 +28,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.PopulationSize;
+import org.apache.commons.math4.legacy.optim.nonlinear.scalar.Sigma;
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;
@@ -81,7 +82,7 @@ public class CMAESOptimizerTest {
1e-13, 1e-6, 100000, expected);
}
- @Test(expected = NotPositiveException.class)
+ @Test(expected = NotStrictlyPositiveException.class)
public void testInputSigmaNegative() {
final int dim = 12;
double[] startPoint = OptimTestUtils.point(dim, 0.5);
@@ -175,7 +176,7 @@ public class CMAESOptimizerTest {
SimpleBounds.unbounded(1),
GoalType.MINIMIZE,
new PopulationSize(5),
- new CMAESOptimizer.Sigma(sigma),
+ new Sigma(sigma),
new InitialGuess(start)).getPoint();
Assert.assertEquals(0, result[0], 1e-7);
}
@@ -396,7 +397,7 @@ public class CMAESOptimizerTest {
new ObjectiveFunction(fitnessFunction),
GoalType.MINIMIZE,
new PopulationSize(5),
- new CMAESOptimizer.Sigma(sigma),
+ new Sigma(sigma),
new InitialGuess(start),
new SimpleBounds(lower, upper)).getPoint();
Assert.assertTrue("Out of bounds (" + result[0] + " > " + upper[0] + ")",
@@ -428,7 +429,7 @@ public class CMAESOptimizerTest {
GoalType.MINIMIZE,
SimpleBounds.unbounded(1),
new PopulationSize(5),
- new CMAESOptimizer.Sigma(new double[] { 1e-1 }),
+ new Sigma(new double[] { 1e-1 }),
new InitialGuess(start));
final double resNoBound = result.getPoint()[0];
@@ -440,7 +441,7 @@ public class CMAESOptimizerTest {
new ObjectiveFunction(fitnessFunction),
GoalType.MINIMIZE,
new PopulationSize(5),
- new CMAESOptimizer.Sigma(sigma),
+ new Sigma(sigma),
new InitialGuess(start),
new SimpleBounds(lower, upper));
final double resNearLo = result.getPoint()[0];
@@ -452,7 +453,7 @@ public class CMAESOptimizerTest {
new ObjectiveFunction(fitnessFunction),
GoalType.MINIMIZE,
new PopulationSize(5),
- new CMAESOptimizer.Sigma(sigma),
+ new Sigma(sigma),
new InitialGuess(start),
new SimpleBounds(lower, upper));
final double resNearHi = result.getPoint()[0];
@@ -505,7 +506,7 @@ public class CMAESOptimizerTest {
goal,
new InitialGuess(startPoint),
SimpleBounds.unbounded(dim),
- new CMAESOptimizer.Sigma(inSigma),
+ new Sigma(inSigma),
new PopulationSize(lambda)) :
optim.optimize(new MaxEval(maxEvaluations),
new ObjectiveFunction(func),
@@ -513,7 +514,7 @@ public class CMAESOptimizerTest {
new SimpleBounds(boundaries[0],
boundaries[1]),
new InitialGuess(startPoint),
- new CMAESOptimizer.Sigma(inSigma),
+ new Sigma(inSigma),
new PopulationSize(lambda));
Assert.assertEquals(expected.getValue(), result.getValue(), fTol);