From 87c0ddbc6e6143680ded83b3b63a6029ebc3b8ba Mon Sep 17 00:00:00 2001
From: Luc Maisonobe
Date: Sun, 22 Mar 2009 13:00:00 +0000
Subject: [PATCH] separated iteration counter from function evaluation
counters, some optimizers are based on gradient/jacobian only and cannot
reliably be protected by monitoring the objective function calls.
We now have two or three counters for each algorithm:
- iteration counter, which is checked against a max allowance
to prevent infinite loops if no convergence is reached
- objective function evaluations, for user information only
- objective function gradient/jacobian if the function is
differentiable, for user information only
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@757181 13f79535-47bb-0310-9956-ffa450edef68
---
.../commons/math/MessagesResources_fr.java | 3 +-
...ltiStartScalarDifferentiableOptimizer.java | 62 +++++++++++------
.../MultiStartScalarOptimizer.java | 45 +++++++-----
...StartVectorialDifferentiableOptimizer.java | 47 ++++++++-----
.../optimization/OptimizationException.java | 10 ++-
.../ScalarDifferentiableOptimizer.java | 51 ++++++++------
.../math/optimization/ScalarOptimizer.java | 39 +++++------
.../VectorialDifferentiableOptimizer.java | 29 +++-----
.../direct/DirectSearchOptimizer.java | 64 ++++++++++-------
.../optimization/direct/MultiDirectional.java | 9 +--
.../math/optimization/direct/NelderMead.java | 5 +-
.../AbstractLeastSquaresOptimizer.java | 68 +++++++++++--------
.../general/GaussNewtonOptimizer.java | 9 +--
.../general/LevenbergMarquardtOptimizer.java | 6 +-
.../direct/MultiDirectionalTest.java | 14 ++--
.../optimization/direct/NelderMeadTest.java | 14 ++--
.../general/GaussNewtonOptimizerTest.java | 30 ++++----
.../LevenbergMarquardtOptimizerTest.java | 2 +-
.../optimization/general/MinpackTest.java | 4 +-
19 files changed, 293 insertions(+), 218 deletions(-)
diff --git a/src/java/org/apache/commons/math/MessagesResources_fr.java b/src/java/org/apache/commons/math/MessagesResources_fr.java
index 6492e4c98..4855b960c 100644
--- a/src/java/org/apache/commons/math/MessagesResources_fr.java
+++ b/src/java/org/apache/commons/math/MessagesResources_fr.java
@@ -118,8 +118,7 @@ public class MessagesResources_fr
{ "equals vertices {0} and {1} in simplex configuration",
"sommets {0} et {1} \u00e9gaux dans la configuration du simplex" },
- // org.apache.commons.math.optimization.direct.DirectSearchOptimizer
- // org.apache.commons.math.optimization.general.AbstractLeastSquaresOptimizer
+ // org.apache.commons.math.estimation.AbstractEstimation
{ "maximal number of evaluations exceeded ({0})",
"nombre maximal d''\u00e9valuations d\u00e9pass\u00e9 ({0})" },
diff --git a/src/java/org/apache/commons/math/optimization/MultiStartScalarDifferentiableOptimizer.java b/src/java/org/apache/commons/math/optimization/MultiStartScalarDifferentiableOptimizer.java
index 7ebd4db20..5aa7d2d9f 100644
--- a/src/java/org/apache/commons/math/optimization/MultiStartScalarDifferentiableOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/MultiStartScalarDifferentiableOptimizer.java
@@ -38,16 +38,22 @@ import org.apache.commons.math.random.RandomVectorGenerator;
public class MultiStartScalarDifferentiableOptimizer implements ScalarDifferentiableOptimizer {
/** Serializable version identifier. */
- private static final long serialVersionUID = 9008747186334431824L;
+ private static final long serialVersionUID = 6185821146433609962L;
/** Underlying classical optimizer. */
private final ScalarDifferentiableOptimizer optimizer;
+ /** Maximal number of iterations allowed. */
+ private int maxIterations;
+
+ /** Number of iterations already performed for all starts. */
+ private int totalIterations;
+
/** Number of evaluations already performed for all starts. */
private int totalEvaluations;
- /** Maximal number of evaluations allowed. */
- private int maxEvaluations;
+ /** Number of gradient evaluations already performed for all starts. */
+ private int totalGradientEvaluations;
/** Number of starts to go. */
private int starts;
@@ -69,12 +75,14 @@ public class MultiStartScalarDifferentiableOptimizer implements ScalarDifferenti
public MultiStartScalarDifferentiableOptimizer(final ScalarDifferentiableOptimizer optimizer,
final int starts,
final RandomVectorGenerator generator) {
- this.optimizer = optimizer;
- this.totalEvaluations = 0;
- this.maxEvaluations = Integer.MAX_VALUE;
- this.starts = starts;
- this.generator = generator;
- this.optima = null;
+ this.optimizer = optimizer;
+ this.maxIterations = Integer.MAX_VALUE;
+ this.totalIterations = 0;
+ this.totalEvaluations = 0;
+ this.totalGradientEvaluations = 0;
+ this.starts = starts;
+ this.generator = generator;
+ this.optima = null;
}
/** Get all the optima found during the last call to {@link
@@ -110,19 +118,29 @@ public class MultiStartScalarDifferentiableOptimizer implements ScalarDifferenti
return (ScalarPointValuePair[]) optima.clone();
}
+ /** {@inheritDoc} */
+ public void setMaxIterations(int maxIterations) {
+ this.maxIterations = maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getMaxIterations() {
+ return maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getIterations() {
+ return totalIterations;
+ }
+
/** {@inheritDoc} */
public int getEvaluations() {
return totalEvaluations;
}
/** {@inheritDoc} */
- public void setMaxEvaluations(int maxEvaluations) {
- this.maxEvaluations = maxEvaluations;
- }
-
- /** {@inheritDoc} */
- public int getMaxEvaluations() {
- return maxEvaluations;
+ public int getGradientEvaluations() {
+ return totalGradientEvaluations;
}
/** {@inheritDoc} */
@@ -141,14 +159,16 @@ public class MultiStartScalarDifferentiableOptimizer implements ScalarDifferenti
double[] startPoint)
throws ObjectiveException, OptimizationException {
- optima = new ScalarPointValuePair[starts];
- totalEvaluations = 0;
+ optima = new ScalarPointValuePair[starts];
+ totalIterations = 0;
+ totalEvaluations = 0;
+ totalGradientEvaluations = 0;
// multi-start loop
for (int i = 0; i < starts; ++i) {
try {
- optimizer.setMaxEvaluations(maxEvaluations - totalEvaluations);
+ optimizer.setMaxIterations(maxIterations - totalIterations);
optima[i] = optimizer.optimize(f, goalType,
(i == 0) ? startPoint : generator.nextVector());
} catch (ObjectiveException obe) {
@@ -157,7 +177,9 @@ public class MultiStartScalarDifferentiableOptimizer implements ScalarDifferenti
optima[i] = null;
}
- totalEvaluations += optimizer.getEvaluations();
+ totalIterations += optimizer.getIterations();
+ totalEvaluations += optimizer.getEvaluations();
+ totalGradientEvaluations += optimizer.getGradientEvaluations();
}
diff --git a/src/java/org/apache/commons/math/optimization/MultiStartScalarOptimizer.java b/src/java/org/apache/commons/math/optimization/MultiStartScalarOptimizer.java
index 234367c65..4c6043337 100644
--- a/src/java/org/apache/commons/math/optimization/MultiStartScalarOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/MultiStartScalarOptimizer.java
@@ -38,17 +38,20 @@ import org.apache.commons.math.random.RandomVectorGenerator;
public class MultiStartScalarOptimizer implements ScalarOptimizer {
/** Serializable version identifier. */
- private static final long serialVersionUID = 6648351778723282863L;
+ private static final long serialVersionUID = -7333253288301713047L;
/** Underlying classical optimizer. */
private final ScalarOptimizer optimizer;
+ /** Maximal number of iterations allowed. */
+ private int maxIterations;
+
+ /** Number of iterations already performed for all starts. */
+ private int totalIterations;
+
/** Number of evaluations already performed for all starts. */
private int totalEvaluations;
- /** Maximal number of evaluations allowed. */
- private int maxEvaluations;
-
/** Number of starts to go. */
private int starts;
@@ -69,8 +72,9 @@ public class MultiStartScalarOptimizer implements ScalarOptimizer {
public MultiStartScalarOptimizer(final ScalarOptimizer optimizer, final int starts,
final RandomVectorGenerator generator) {
this.optimizer = optimizer;
+ this.maxIterations = Integer.MAX_VALUE;
+ this.totalIterations = 0;
this.totalEvaluations = 0;
- this.maxEvaluations = Integer.MAX_VALUE;
this.starts = starts;
this.generator = generator;
this.optima = null;
@@ -109,21 +113,26 @@ public class MultiStartScalarOptimizer implements ScalarOptimizer {
return (ScalarPointValuePair[]) optima.clone();
}
+ /** {@inheritDoc} */
+ public void setMaxIterations(int maxIterations) {
+ this.maxIterations = maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getMaxIterations() {
+ return maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getIterations() {
+ return totalIterations;
+ }
+
/** {@inheritDoc} */
public int getEvaluations() {
return totalEvaluations;
}
- /** {@inheritDoc} */
- public void setMaxEvaluations(int maxEvaluations) {
- this.maxEvaluations = maxEvaluations;
- }
-
- /** {@inheritDoc} */
- public int getMaxEvaluations() {
- return maxEvaluations;
- }
-
/** {@inheritDoc} */
public void setConvergenceChecker(ScalarConvergenceChecker checker) {
optimizer.setConvergenceChecker(checker);
@@ -140,14 +149,15 @@ public class MultiStartScalarOptimizer implements ScalarOptimizer {
double[] startPoint)
throws ObjectiveException, OptimizationException {
- optima = new ScalarPointValuePair[starts];
+ optima = new ScalarPointValuePair[starts];
+ totalIterations = 0;
totalEvaluations = 0;
// multi-start loop
for (int i = 0; i < starts; ++i) {
try {
- optimizer.setMaxEvaluations(maxEvaluations - totalEvaluations);
+ optimizer.setMaxIterations(maxIterations - totalIterations);
optima[i] = optimizer.optimize(f, goalType,
(i == 0) ? startPoint : generator.nextVector());
} catch (ObjectiveException obe) {
@@ -156,6 +166,7 @@ public class MultiStartScalarOptimizer implements ScalarOptimizer {
optima[i] = null;
}
+ totalIterations += optimizer.getIterations();
totalEvaluations += optimizer.getEvaluations();
}
diff --git a/src/java/org/apache/commons/math/optimization/MultiStartVectorialDifferentiableOptimizer.java b/src/java/org/apache/commons/math/optimization/MultiStartVectorialDifferentiableOptimizer.java
index b92fb9c0e..31fe83cb7 100644
--- a/src/java/org/apache/commons/math/optimization/MultiStartVectorialDifferentiableOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/MultiStartVectorialDifferentiableOptimizer.java
@@ -38,20 +38,23 @@ import org.apache.commons.math.random.RandomVectorGenerator;
public class MultiStartVectorialDifferentiableOptimizer implements VectorialDifferentiableOptimizer {
/** Serializable version identifier. */
- private static final long serialVersionUID = -6671992853686531955L;
+ private static final long serialVersionUID = -9109278856437190136L;
/** Underlying classical optimizer. */
private final VectorialDifferentiableOptimizer optimizer;
+ /** Maximal number of iterations allowed. */
+ private int maxIterations;
+
+ /** Number of iterations already performed for all starts. */
+ private int totalIterations;
+
/** Number of evaluations already performed for all starts. */
private int totalEvaluations;
/** Number of jacobian evaluations already performed for all starts. */
private int totalJacobianEvaluations;
- /** Maximal number of evaluations allowed. */
- private int maxEvaluations;
-
/** Number of starts to go. */
private int starts;
@@ -73,9 +76,10 @@ public class MultiStartVectorialDifferentiableOptimizer implements VectorialDiff
final int starts,
final RandomVectorGenerator generator) {
this.optimizer = optimizer;
+ this.maxIterations = Integer.MAX_VALUE;
+ this.totalIterations = 0;
this.totalEvaluations = 0;
this.totalJacobianEvaluations = 0;
- this.maxEvaluations = Integer.MAX_VALUE;
this.starts = starts;
this.generator = generator;
this.optima = null;
@@ -114,6 +118,21 @@ public class MultiStartVectorialDifferentiableOptimizer implements VectorialDiff
return (VectorialPointValuePair[]) optima.clone();
}
+ /** {@inheritDoc} */
+ public void setMaxIterations(int maxIterations) {
+ this.maxIterations = maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getMaxIterations() {
+ return maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getIterations() {
+ return totalIterations;
+ }
+
/** {@inheritDoc} */
public int getEvaluations() {
return totalEvaluations;
@@ -124,16 +143,6 @@ public class MultiStartVectorialDifferentiableOptimizer implements VectorialDiff
return totalJacobianEvaluations;
}
- /** {@inheritDoc} */
- public void setMaxEvaluations(int maxEvaluations) {
- this.maxEvaluations = maxEvaluations;
- }
-
- /** {@inheritDoc} */
- public int getMaxEvaluations() {
- return maxEvaluations;
- }
-
/** {@inheritDoc} */
public void setConvergenceChecker(VectorialConvergenceChecker checker) {
optimizer.setConvergenceChecker(checker);
@@ -150,15 +159,16 @@ public class MultiStartVectorialDifferentiableOptimizer implements VectorialDiff
final double[] startPoint)
throws ObjectiveException, OptimizationException, IllegalArgumentException {
- optima = new VectorialPointValuePair[starts];
- totalEvaluations = 0;
+ optima = new VectorialPointValuePair[starts];
+ totalIterations = 0;
+ totalEvaluations = 0;
totalJacobianEvaluations = 0;
// multi-start loop
for (int i = 0; i < starts; ++i) {
try {
- optimizer.setMaxEvaluations(maxEvaluations - totalEvaluations);
+ optimizer.setMaxIterations(maxIterations - totalIterations);
optima[i] = optimizer.optimize(f, target, weights,
(i == 0) ? startPoint : generator.nextVector());
} catch (ObjectiveException obe) {
@@ -167,6 +177,7 @@ public class MultiStartVectorialDifferentiableOptimizer implements VectorialDiff
optima[i] = null;
}
+ totalIterations += optimizer.getIterations();
totalEvaluations += optimizer.getEvaluations();
totalJacobianEvaluations += optimizer.getJacobianEvaluations();
diff --git a/src/java/org/apache/commons/math/optimization/OptimizationException.java b/src/java/org/apache/commons/math/optimization/OptimizationException.java
index bf93cfec7..e44aa003d 100644
--- a/src/java/org/apache/commons/math/optimization/OptimizationException.java
+++ b/src/java/org/apache/commons/math/optimization/OptimizationException.java
@@ -30,7 +30,7 @@ import org.apache.commons.math.ConvergenceException;
public class OptimizationException extends ConvergenceException {
/** Serializable version identifier. */
- private static final long serialVersionUID = -781139167958631145L;
+ private static final long serialVersionUID = -357696069587075016L;
/**
* Simple constructor.
@@ -42,4 +42,12 @@ public class OptimizationException extends ConvergenceException {
super(specifier, parts);
}
+ /**
+ * Create an exception with a given root cause.
+ * @param cause the exception or error that caused this exception to be thrown
+ */
+ public OptimizationException(Throwable cause) {
+ super(cause);
+ }
+
}
diff --git a/src/java/org/apache/commons/math/optimization/ScalarDifferentiableOptimizer.java b/src/java/org/apache/commons/math/optimization/ScalarDifferentiableOptimizer.java
index b7cb6a36f..9385c30a1 100644
--- a/src/java/org/apache/commons/math/optimization/ScalarDifferentiableOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/ScalarDifferentiableOptimizer.java
@@ -29,38 +29,45 @@ import java.io.Serializable;
*/
public interface ScalarDifferentiableOptimizer extends Serializable {
- /** Set the maximal number of objective function calls.
- *
- * The number of objective function calls may be checked after a few
- * related calls have been made. This implies that in some cases this number may
- * be exceeded by a few units, depending on the dimension of the problem and kind
- * of optimizer.
- *
- * @param maxEvaluations maximal number of function calls
- * .
+ /** Set the maximal number of iterations of the algorithm.
+ * @param maxIterations maximal number of function calls
*/
- void setMaxEvaluations(int maxEvaluations);
+ void setMaxIterations(int maxIterations);
- /** Get the maximal number of objective function calls.
- *
- * The number of objective function calls may be checked after a few
- * related calls have been made. This implies that in some cases this number may
- * be exceeded by a few units, depending on the dimension of the problem and kind
- * of optimizer.
- *
- * @return maximal number of function calls
+ /** Get the maximal number of iterations of the algorithm.
+ * @return maximal number of iterations
*/
- int getMaxEvaluations();
+ int getMaxIterations();
+
+ /** Get the number of iterations realized by the algorithm.
+ *
+ * The number of evaluations corresponds to the last call to the
+ * {@link #optimize(ScalarDifferentiableObjectiveFunction, GoalType, double[]) optimize}
+ * method. It is 0 if the method has not been called yet.
+ *
+ * @return number of iterations
+ */
+ int getIterations();
/** Get the number of evaluations of the objective function.
*
- * The number of evaluation correspond to the last call to the
- * {@link #optimize(ScalarObjectiveFunction, GoalType, double[]) optimize}
+ * The number of evaluations corresponds to the last call to the
+ * {@link #optimize(ScalarDifferentiableObjectiveFunction, GoalType, double[]) optimize}
* method. It is 0 if the method has not been called yet.
*
* @return number of evaluations of the objective function
*/
- int getEvaluations();
+ int getEvaluations();
+
+ /** Get the number of evaluations of the objective function gradient.
+ *
+ * The number of evaluations corresponds to the last call to the
+ * {@link #optimize(ScalarDifferentiableObjectiveFunction, GoalType, double[]) optimize}
+ * method. It is 0 if the method has not been called yet.
+ *
+ * @return number of evaluations of the objective function gradient
+ */
+ int getGradientEvaluations();
/** Set the convergence checker.
* @param checker object to use to check for convergence
diff --git a/src/java/org/apache/commons/math/optimization/ScalarOptimizer.java b/src/java/org/apache/commons/math/optimization/ScalarOptimizer.java
index 95f821164..63f1292e3 100644
--- a/src/java/org/apache/commons/math/optimization/ScalarOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/ScalarOptimizer.java
@@ -29,38 +29,35 @@ import java.io.Serializable;
*/
public interface ScalarOptimizer extends Serializable {
- /** Set the maximal number of objective function calls.
- *
- * The number of objective function calls may be checked after a few
- * related calls have been made. This implies that in some cases this number may
- * be exceeded by a few units, depending on the dimension of the problem and kind
- * of optimizer.
- *
- * @param maxEvaluations maximal number of function calls
- * .
+ /** Set the maximal number of iterations of the algorithm.
+ * @param maxIterations maximal number of function calls
*/
- void setMaxEvaluations(int maxEvaluations);
+ void setMaxIterations(int maxIterations);
- /** Get the maximal number of objective function calls.
- *
- * The number of objective function calls may be checked after a few
- * related calls have been made. This implies that in some cases this number may
- * be exceeded by a few units, depending on the dimension of the problem and kind
- * of optimizer.
- *
- * @return maximal number of function calls
+ /** Get the maximal number of iterations of the algorithm.
+ * @return maximal number of iterations
*/
- int getMaxEvaluations();
+ int getMaxIterations();
+
+ /** Get the number of iterations realized by the algorithm.
+ *
+ * The number of evaluations corresponds to the last call to the
+ * {@link #optimize(ScalarObjectiveFunction, GoalType, double[]) optimize}
+ * method. It is 0 if the method has not been called yet.
+ *
+ * @return number of iterations
+ */
+ int getIterations();
/** Get the number of evaluations of the objective function.
*
- * The number of evaluation correspond to the last call to the
+ * The number of evaluations corresponds to the last call to the
* {@link #optimize(ScalarObjectiveFunction, GoalType, double[]) optimize}
* method. It is 0 if the method has not been called yet.
*
* @return number of evaluations of the objective function
*/
- int getEvaluations();
+ int getEvaluations();
/** Set the convergence checker.
* @param checker object to use to check for convergence
diff --git a/src/java/org/apache/commons/math/optimization/VectorialDifferentiableOptimizer.java b/src/java/org/apache/commons/math/optimization/VectorialDifferentiableOptimizer.java
index 73d27584e..788e079c7 100644
--- a/src/java/org/apache/commons/math/optimization/VectorialDifferentiableOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/VectorialDifferentiableOptimizer.java
@@ -29,28 +29,21 @@ import java.io.Serializable;
*/
public interface VectorialDifferentiableOptimizer extends Serializable {
- /** Set the maximal number of objective function calls.
- *
- * The number of objective function calls may be checked after a few
- * related calls have been made. This implies that in some cases this number may
- * be exceeded by a few units, depending on the dimension of the problem and kind
- * of optimizer.
- *
- * @param maxEvaluations maximal number of function calls
+ /** Set the maximal number of iterations of the algorithm.
+ * @param maxIterations maximal number of function calls
* .
*/
- void setMaxEvaluations(int maxEvaluations);
+ void setMaxIterations(int maxIterations);
- /** Get the maximal number of objective function calls.
- *
- * The number of objective function calls may be checked after a few
- * related calls have been made. This implies that in some cases this number may
- * be exceeded by a few units, depending on the dimension of the problem and kind
- * of optimizer.
- *
- * @return maximal number of function calls
+ /** Get the maximal number of iterations of the algorithm.
+ * @return maximal number of iterations
*/
- int getMaxEvaluations();
+ int getMaxIterations();
+
+ /** Get the number of iterations realized by the algorithm.
+ * @return number of iterations
+ */
+ int getIterations();
/** Get the number of evaluations of the objective function.
*
diff --git a/src/java/org/apache/commons/math/optimization/direct/DirectSearchOptimizer.java b/src/java/org/apache/commons/math/optimization/direct/DirectSearchOptimizer.java
index d69c856b3..c29c09e03 100644
--- a/src/java/org/apache/commons/math/optimization/direct/DirectSearchOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/direct/DirectSearchOptimizer.java
@@ -21,6 +21,7 @@ import java.util.Arrays;
import java.util.Comparator;
import org.apache.commons.math.MathRuntimeException;
+import org.apache.commons.math.MaxIterationsExceededException;
import org.apache.commons.math.optimization.ScalarConvergenceChecker;
import org.apache.commons.math.optimization.GoalType;
import org.apache.commons.math.optimization.ObjectiveException;
@@ -28,7 +29,7 @@ import org.apache.commons.math.optimization.ScalarObjectiveFunction;
import org.apache.commons.math.optimization.OptimizationException;
import org.apache.commons.math.optimization.ScalarOptimizer;
import org.apache.commons.math.optimization.ScalarPointValuePair;
-import org.apache.commons.math.optimization.SimpleValueChecker;
+import org.apache.commons.math.optimization.SimpleScalarValueChecker;
/**
* This class implements simplex-based direct search optimization
@@ -65,7 +66,7 @@ import org.apache.commons.math.optimization.SimpleValueChecker;
* will occur.
*
* If {@link #setConvergenceChecker(ScalarConvergenceChecker)} is not called,
- * a default {@link SimpleValueChecker} is used.
+ * a default {@link SimpleScalarValueChecker} is used.
*
* Convergence is checked by providing the worst points of
* previous and current simplex to the convergence checker, not the best ones.
@@ -95,11 +96,14 @@ public abstract class DirectSearchOptimizer implements ScalarOptimizer {
/** Convergence checker. */
private ScalarConvergenceChecker checker;
- /** Number of evaluations already performed for the current start. */
- private int evaluations;
+ /** Maximal number of iterations allowed. */
+ private int maxIterations;
- /** Maximal number of evaluations allowed. */
- private int maxEvaluations;
+ /** Number of iterations already performed. */
+ private int iterations;
+
+ /** Number of evaluations already performed. */
+ private int evaluations;
/** Start simplex configuration. */
private double[][] startConfiguration;
@@ -107,8 +111,8 @@ public abstract class DirectSearchOptimizer implements ScalarOptimizer {
/** Simple constructor.
*/
protected DirectSearchOptimizer() {
- setConvergenceChecker(new SimpleValueChecker());
- setMaxEvaluations(Integer.MAX_VALUE);
+ setConvergenceChecker(new SimpleScalarValueChecker());
+ setMaxIterations(Integer.MAX_VALUE);
}
/** Set start configuration for simplex.
@@ -208,13 +212,23 @@ public abstract class DirectSearchOptimizer implements ScalarOptimizer {
}
/** {@inheritDoc} */
- public void setMaxEvaluations(int maxEvaluations) {
- this.maxEvaluations = maxEvaluations;
+ public void setMaxIterations(int maxIterations) {
+ this.maxIterations = maxIterations;
}
/** {@inheritDoc} */
- public int getMaxEvaluations() {
- return maxEvaluations;
+ public int getMaxIterations() {
+ return maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getIterations() {
+ return iterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getEvaluations() {
+ return evaluations;
}
/** {@inheritDoc} */
@@ -229,7 +243,7 @@ public abstract class DirectSearchOptimizer implements ScalarOptimizer {
/** {@inheritDoc} */
public ScalarPointValuePair optimize(final ScalarObjectiveFunction f, final GoalType goalType,
- final double[] startPoint)
+ final double[] startPoint)
throws ObjectiveException, OptimizationException, IllegalArgumentException {
if (startConfiguration == null) {
@@ -251,15 +265,15 @@ public abstract class DirectSearchOptimizer implements ScalarOptimizer {
};
// initialize search
+ iterations = 0;
evaluations = 0;
buildSimplex(startPoint);
evaluateSimplex(comparator);
ScalarPointValuePair[] previous = new ScalarPointValuePair[simplex.length];
- int iterations = 0;
- while (evaluations <= maxEvaluations) {
+ while (true) {
- if (++iterations > 1) {
+ if (iterations > 0) {
boolean converged = true;
for (int i = 0; i < simplex.length; ++i) {
converged &= checker.converged(iterations, previous[i], simplex[i]);
@@ -276,22 +290,24 @@ public abstract class DirectSearchOptimizer implements ScalarOptimizer {
}
- throw new OptimizationException(
- "maximal number of evaluations exceeded ({0})",
- evaluations);
-
}
- /** {@inheritDoc} */
- public int getEvaluations() {
- return evaluations;
+ /** Increment the iterations counter by 1.
+ * @exception OptimizationException if the maximal number
+ * of iterations is exceeded
+ */
+ protected void incrementIterationsCounter()
+ throws OptimizationException {
+ if (++iterations > maxIterations) {
+ throw new OptimizationException(new MaxIterationsExceededException(maxIterations));
+ }
}
/** Compute the next simplex of the algorithm.
* @param comparator comparator to use to sort simplex vertices from best to worst
* @exception ObjectiveException if the function cannot be evaluated at
* some point
- * @exception OptimizationException if the algorithm failed to converge
+ * @exception OptimizationException if the algorithm fails to converge
* @exception IllegalArgumentException if the start point dimension is wrong
*/
protected abstract void iterateSimplex(final Comparator comparator)
diff --git a/src/java/org/apache/commons/math/optimization/direct/MultiDirectional.java b/src/java/org/apache/commons/math/optimization/direct/MultiDirectional.java
index b9d2e8ec8..51c587078 100644
--- a/src/java/org/apache/commons/math/optimization/direct/MultiDirectional.java
+++ b/src/java/org/apache/commons/math/optimization/direct/MultiDirectional.java
@@ -62,8 +62,9 @@ public class MultiDirectional extends DirectSearchOptimizer {
protected void iterateSimplex(final Comparator comparator)
throws ObjectiveException, OptimizationException, IllegalArgumentException {
- final int max = getMaxEvaluations();
- while (getEvaluations() < max) {
+ while (true) {
+
+ incrementIterationsCounter();
// save the original vertex
final ScalarPointValuePair[] original = simplex;
@@ -94,10 +95,6 @@ public class MultiDirectional extends DirectSearchOptimizer {
}
- throw new OptimizationException(
- "maximal number of evaluations exceeded ({0})",
- getEvaluations());
-
}
/** Compute and evaluate a new simplex.
diff --git a/src/java/org/apache/commons/math/optimization/direct/NelderMead.java b/src/java/org/apache/commons/math/optimization/direct/NelderMead.java
index 27bad982c..96fe7bddf 100644
--- a/src/java/org/apache/commons/math/optimization/direct/NelderMead.java
+++ b/src/java/org/apache/commons/math/optimization/direct/NelderMead.java
@@ -20,6 +20,7 @@ package org.apache.commons.math.optimization.direct;
import java.util.Comparator;
import org.apache.commons.math.optimization.ObjectiveException;
+import org.apache.commons.math.optimization.OptimizationException;
import org.apache.commons.math.optimization.ScalarPointValuePair;
/**
@@ -73,7 +74,9 @@ public class NelderMead extends DirectSearchOptimizer {
/** {@inheritDoc} */
protected void iterateSimplex(final Comparator comparator)
- throws ObjectiveException {
+ throws ObjectiveException, OptimizationException {
+
+ incrementIterationsCounter();
// the simplex has n+1 point if dimension is n
final int n = simplex.length - 1;
diff --git a/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java b/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java
index 642b76fa4..8f096ac68 100644
--- a/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/general/AbstractLeastSquaresOptimizer.java
@@ -17,6 +17,7 @@
package org.apache.commons.math.optimization.general;
+import org.apache.commons.math.MaxIterationsExceededException;
import org.apache.commons.math.linear.InvalidMatrixException;
import org.apache.commons.math.linear.MatrixUtils;
import org.apache.commons.math.linear.RealMatrix;
@@ -40,20 +41,23 @@ import org.apache.commons.math.optimization.VectorialPointValuePair;
public abstract class AbstractLeastSquaresOptimizer implements VectorialDifferentiableOptimizer {
/** Serializable version identifier */
- private static final long serialVersionUID = -3080152374642370722L;
+ private static final long serialVersionUID = 5413193243329026789L;
- /** Default maximal number of objective function evaluations allowed. */
- public static final int DEFAULT_MAX_EVALUATIONS = 100;
+ /** Default maximal number of iterations allowed. */
+ public static final int DEFAULT_MAX_ITERATIONS = 100;
- /** Number of evaluations already performed for the current start. */
+ /** Maximal number of iterations allowed. */
+ private int maxIterations;
+
+ /** Number of iterations already performed. */
+ private int iterations;
+
+ /** Number of evaluations already performed. */
private int objectiveEvaluations;
/** Number of jacobian evaluations. */
private int jacobianEvaluations;
- /** Maximal number of evaluations allowed. */
- private int maxEvaluations;
-
/** Convergence checker. */
protected VectorialConvergenceChecker checker;
@@ -99,17 +103,22 @@ public abstract class AbstractLeastSquaresOptimizer implements VectorialDifferen
*/
protected AbstractLeastSquaresOptimizer() {
setConvergenceChecker(new SimpleVectorialValueChecker());
- setMaxEvaluations(DEFAULT_MAX_EVALUATIONS);
+ setMaxIterations(DEFAULT_MAX_ITERATIONS);
}
/** {@inheritDoc} */
- public void setMaxEvaluations(int maxEvaluations) {
- this.maxEvaluations = maxEvaluations;
+ public void setMaxIterations(int maxIterations) {
+ this.maxIterations = maxIterations;
}
/** {@inheritDoc} */
- public int getMaxEvaluations() {
- return maxEvaluations;
+ public int getMaxIterations() {
+ return maxIterations;
+ }
+
+ /** {@inheritDoc} */
+ public int getIterations() {
+ return iterations;
}
/** {@inheritDoc} */
@@ -132,13 +141,26 @@ public abstract class AbstractLeastSquaresOptimizer implements VectorialDifferen
return checker;
}
+ /** Increment the iterations counter by 1.
+ * @exception OptimizationException if the maximal number
+ * of iterations is exceeded
+ */
+ protected void incrementIterationsCounter()
+ throws OptimizationException {
+ if (++iterations > maxIterations) {
+ if (++iterations > maxIterations) {
+ throw new OptimizationException(new MaxIterationsExceededException(maxIterations));
+ }
+ }
+ }
+
/**
* Update the jacobian matrix.
* @exception ObjectiveException if the function jacobian
* cannot be evaluated or its dimension doesn't match problem dimension
*/
protected void updateJacobian() throws ObjectiveException {
- incrementJacobianEvaluationsCounter();
+ ++jacobianEvaluations;
jacobian = f.jacobian(variables, objective);
if (jacobian.length != rows) {
throw new ObjectiveException("dimension mismatch {0} != {1}",
@@ -153,28 +175,13 @@ public abstract class AbstractLeastSquaresOptimizer implements VectorialDifferen
}
}
- /**
- * Increment the jacobian evaluations counter.
- */
- protected final void incrementJacobianEvaluationsCounter() {
- ++jacobianEvaluations;
- }
-
/**
* Update the residuals array and cost function value.
* @exception ObjectiveException if the function cannot be evaluated
* or its dimension doesn't match problem dimension
- * @exception OptimizationException if the number of cost evaluations
- * exceeds the maximum allowed
*/
protected void updateResidualsAndCost()
- throws ObjectiveException, OptimizationException {
-
- if (++objectiveEvaluations > maxEvaluations) {
- throw new OptimizationException(
- "maximal number of evaluations exceeded ({0})",
- objectiveEvaluations);
- }
+ throws ObjectiveException {
objective = f.objective(variables);
if (objective.length != rows) {
@@ -298,6 +305,7 @@ public abstract class AbstractLeastSquaresOptimizer implements VectorialDifferen
}
// reset counters
+ iterations = 0;
objectiveEvaluations = 0;
jacobianEvaluations = 0;
@@ -327,6 +335,6 @@ public abstract class AbstractLeastSquaresOptimizer implements VectorialDifferen
* @exception IllegalArgumentException if the start point dimension is wrong
*/
abstract protected VectorialPointValuePair doOptimize()
- throws ObjectiveException, OptimizationException, IllegalArgumentException;
+ throws ObjectiveException, OptimizationException, IllegalArgumentException;
}
\ No newline at end of file
diff --git a/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java b/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java
index a551b72ae..2d6e3929a 100644
--- a/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/general/GaussNewtonOptimizer.java
@@ -53,7 +53,7 @@ public class GaussNewtonOptimizer extends AbstractLeastSquaresOptimizer {
/** Simple constructor with default settings.
* The convergence check is set to a {@link SimpleVectorialValueChecker}
* and the maximal number of evaluation is set to
- * {@link AbstractLeastSquaresOptimizer#DEFAULT_MAX_EVALUATIONS}.
+ * {@link AbstractLeastSquaresOptimizer#DEFAULT_MAX_ITERATIONS}.
* @param useLU if true, the normal equations will be solved using LU
* decomposition, otherwise they will be solved using QR decomposition
*/
@@ -67,8 +67,9 @@ public class GaussNewtonOptimizer extends AbstractLeastSquaresOptimizer {
// iterate until convergence is reached
VectorialPointValuePair current = null;
- boolean converged = false;
- for (int iteration = 1; ! converged; ++iteration) {
+ for (boolean converged = false; !converged;) {
+
+ incrementIterationsCounter();
// evaluate the objective function and its jacobian
VectorialPointValuePair previous = current;
@@ -122,7 +123,7 @@ public class GaussNewtonOptimizer extends AbstractLeastSquaresOptimizer {
// check convergence
if (previous != null) {
- converged = checker.converged(++iteration, previous, current);
+ converged = checker.converged(getIterations(), previous, current);
}
}
diff --git a/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java b/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java
index 232901aaf..d36a5be0b 100644
--- a/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java
+++ b/src/java/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizer.java
@@ -146,7 +146,7 @@ public class LevenbergMarquardtOptimizer extends AbstractLeastSquaresOptimizer {
*
The default values for the algorithm settings are:
*
* - {@link #setInitialStepBoundFactor initial step bound factor}: 100.0
- * - {@link #setMaxCostEval maximal cost evaluations}: 1000
+ * - {@link #setMaxIterations maximal iterations}: 1000
* - {@link #setCostRelativeTolerance cost relative tolerance}: 1.0e-10
* - {@link #setParRelativeTolerance parameters relative tolerance}: 1.0e-10
* - {@link #setOrthoTolerance orthogonality tolerance}: 1.0e-10
@@ -156,7 +156,7 @@ public class LevenbergMarquardtOptimizer extends AbstractLeastSquaresOptimizer {
public LevenbergMarquardtOptimizer() {
// set up the superclass with a default max cost evaluations setting
- setMaxEvaluations(1000);
+ setMaxIterations(1000);
// default values for the tuning parameters
setInitialStepBoundFactor(100.0);
@@ -237,6 +237,8 @@ public class LevenbergMarquardtOptimizer extends AbstractLeastSquaresOptimizer {
boolean firstIteration = true;
while (true) {
+ incrementIterationsCounter();
+
// compute the Q.R. decomposition of the jacobian matrix
updateJacobian();
qrDecomposition();
diff --git a/src/test/org/apache/commons/math/optimization/direct/MultiDirectionalTest.java b/src/test/org/apache/commons/math/optimization/direct/MultiDirectionalTest.java
index 40b0f77ba..aea5aae21 100644
--- a/src/test/org/apache/commons/math/optimization/direct/MultiDirectionalTest.java
+++ b/src/test/org/apache/commons/math/optimization/direct/MultiDirectionalTest.java
@@ -27,7 +27,7 @@ import org.apache.commons.math.optimization.GoalType;
import org.apache.commons.math.optimization.ObjectiveException;
import org.apache.commons.math.optimization.ScalarObjectiveFunction;
import org.apache.commons.math.optimization.ScalarPointValuePair;
-import org.apache.commons.math.optimization.SimpleValueChecker;
+import org.apache.commons.math.optimization.SimpleScalarValueChecker;
public class MultiDirectionalTest
extends TestCase {
@@ -94,8 +94,8 @@ public class MultiDirectionalTest
};
MultiDirectional optimizer = new MultiDirectional();
- optimizer.setConvergenceChecker(new SimpleValueChecker(1.0e-10, 1.0e-30));
- optimizer.setMaxEvaluations(200);
+ optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-10, 1.0e-30));
+ optimizer.setMaxIterations(200);
optimizer.setStartConfiguration(new double[] { 0.2, 0.2 });
ScalarPointValuePair optimum;
@@ -147,8 +147,8 @@ public class MultiDirectionalTest
count = 0;
MultiDirectional optimizer = new MultiDirectional();
- optimizer.setConvergenceChecker(new SimpleValueChecker(-1, 1.0e-3));
- optimizer.setMaxEvaluations(100);
+ optimizer.setConvergenceChecker(new SimpleScalarValueChecker(-1, 1.0e-3));
+ optimizer.setMaxIterations(100);
optimizer.setStartConfiguration(new double[][] {
{ -1.2, 1.0 }, { 0.9, 1.2 } , { 3.5, -2.3 }
});
@@ -180,8 +180,8 @@ public class MultiDirectionalTest
count = 0;
MultiDirectional optimizer = new MultiDirectional();
- optimizer.setConvergenceChecker(new SimpleValueChecker(-1.0, 1.0e-3));
- optimizer.setMaxEvaluations(1000);
+ optimizer.setConvergenceChecker(new SimpleScalarValueChecker(-1.0, 1.0e-3));
+ optimizer.setMaxIterations(1000);
ScalarPointValuePair optimum =
optimizer.optimize(powell, GoalType.MINIMIZE, new double[] { 3.0, -1.0, 0.0, 1.0 });
assertEquals(count, optimizer.getEvaluations());
diff --git a/src/test/org/apache/commons/math/optimization/direct/NelderMeadTest.java b/src/test/org/apache/commons/math/optimization/direct/NelderMeadTest.java
index 580619cdf..80b22279a 100644
--- a/src/test/org/apache/commons/math/optimization/direct/NelderMeadTest.java
+++ b/src/test/org/apache/commons/math/optimization/direct/NelderMeadTest.java
@@ -27,7 +27,7 @@ import org.apache.commons.math.optimization.GoalType;
import org.apache.commons.math.optimization.ObjectiveException;
import org.apache.commons.math.optimization.ScalarObjectiveFunction;
import org.apache.commons.math.optimization.ScalarPointValuePair;
-import org.apache.commons.math.optimization.SimpleValueChecker;
+import org.apache.commons.math.optimization.SimpleScalarValueChecker;
public class NelderMeadTest
extends TestCase {
@@ -94,8 +94,8 @@ public class NelderMeadTest
};
NelderMead optimizer = new NelderMead();
- optimizer.setConvergenceChecker(new SimpleValueChecker(1.0e-10, 1.0e-30));
- optimizer.setMaxEvaluations(100);
+ optimizer.setConvergenceChecker(new SimpleScalarValueChecker(1.0e-10, 1.0e-30));
+ optimizer.setMaxIterations(100);
optimizer.setStartConfiguration(new double[] { 0.2, 0.2 });
ScalarPointValuePair optimum;
@@ -147,8 +147,8 @@ public class NelderMeadTest
count = 0;
NelderMead optimizer = new NelderMead();
- optimizer.setConvergenceChecker(new SimpleValueChecker(-1, 1.0e-3));
- optimizer.setMaxEvaluations(100);
+ optimizer.setConvergenceChecker(new SimpleScalarValueChecker(-1, 1.0e-3));
+ optimizer.setMaxIterations(100);
optimizer.setStartConfiguration(new double[][] {
{ -1.2, 1.0 }, { 0.9, 1.2 } , { 3.5, -2.3 }
});
@@ -180,8 +180,8 @@ public class NelderMeadTest
count = 0;
NelderMead optimizer = new NelderMead();
- optimizer.setConvergenceChecker(new SimpleValueChecker(-1.0, 1.0e-3));
- optimizer.setMaxEvaluations(200);
+ optimizer.setConvergenceChecker(new SimpleScalarValueChecker(-1.0, 1.0e-3));
+ optimizer.setMaxIterations(200);
ScalarPointValuePair optimum =
optimizer.optimize(powell, GoalType.MINIMIZE, new double[] { 3.0, -1.0, 0.0, 1.0 });
assertEquals(count, optimizer.getEvaluations());
diff --git a/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java b/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java
index 622155c61..ceb49405e 100644
--- a/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java
+++ b/src/test/org/apache/commons/math/optimization/general/GaussNewtonOptimizerTest.java
@@ -106,7 +106,7 @@ extends TestCase {
LinearProblem problem =
new LinearProblem(new double[][] { { 2 } }, new double[] { 3 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum =
optimizer.optimize(problem, problem.target, new double[] { 1 }, new double[] { 0 });
@@ -122,7 +122,7 @@ extends TestCase {
new double[] { 4.0, 6.0, 1.0 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum =
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 0, 0 });
@@ -145,7 +145,7 @@ extends TestCase {
{ 0, 0, 0, 0, 0, 2 }
}, new double[] { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum =
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1, 1, 1, 1 },
@@ -164,7 +164,7 @@ extends TestCase {
{ 0, -1, 1 }
}, new double[] { 1, 1, 1});
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum =
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 0, 0, 0 });
@@ -187,7 +187,7 @@ extends TestCase {
}, new double[] { 2, -9, 2, 2, 1 + epsilon * epsilon, 2});
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum =
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1, 1, 1, 1 },
@@ -210,7 +210,7 @@ extends TestCase {
{ -3, 0, -9 }
}, new double[] { 1, 1, 1 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
try {
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 0, 0, 0 });
@@ -230,7 +230,7 @@ extends TestCase {
{ 7.0, 5.0, 9.0, 10.0 }
}, new double[] { 32, 23, 33, 31 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum1 =
optimizer.optimize(problem1, problem1.target, new double[] { 1, 1, 1, 1 },
@@ -267,7 +267,7 @@ extends TestCase {
}, new double[] { 7.0, 3.0, 5.0 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
try {
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1 },
@@ -290,7 +290,7 @@ extends TestCase {
{ 0.0, 0.0, 0.0, -1.0, 1.0, 0.0 }
}, new double[] { 3.0, 12.0, -1.0, 7.0, 1.0 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
try {
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1, 1, 1 },
@@ -311,7 +311,7 @@ extends TestCase {
}, new double[] { 3.0, 1.0, 5.0 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum =
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1 },
@@ -330,7 +330,7 @@ extends TestCase {
}, new double[] { 3.0, 1.0, 4.0 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
optimizer.optimize(problem, problem.target, new double[] { 1, 1, 1 }, new double[] { 1, 1 });
assertTrue(optimizer.getRMS() > 0.1);
@@ -341,7 +341,7 @@ extends TestCase {
LinearProblem problem =
new LinearProblem(new double[][] { { 1, 0 }, { 0, 1 } }, new double[] { -1, 1 });
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
VectorialPointValuePair optimum =
@@ -382,7 +382,7 @@ extends TestCase {
circle.addPoint( 35.0, 15.0);
circle.addPoint( 45.0, 97.0);
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-15, 1.0e-15));
try {
optimizer.optimize(circle, new double[] { 0, 0, 0, 0, 0 },
@@ -404,7 +404,7 @@ extends TestCase {
circle.addPoint( 35.0, 15.0);
circle.addPoint( 45.0, 97.0);
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-13, 1.0e-13));
VectorialPointValuePair optimum =
optimizer.optimize(circle, new double[] { 0, 0, 0, 0, 0 },
@@ -458,7 +458,7 @@ extends TestCase {
circle.addPoint(points[i][0], points[i][1]);
}
GaussNewtonOptimizer optimizer = new GaussNewtonOptimizer(true);
- optimizer.setMaxEvaluations(100);
+ optimizer.setMaxIterations(100);
optimizer.setConvergenceChecker(new SimpleVectorialValueChecker(1.0e-6, 1.0e-6));
try {
optimizer.optimize(circle, target, weights, new double[] { -12, -12 });
diff --git a/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java b/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java
index 0b7a296a3..4d6f99e9a 100644
--- a/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java
+++ b/src/test/org/apache/commons/math/optimization/general/LevenbergMarquardtOptimizerTest.java
@@ -379,7 +379,7 @@ public class LevenbergMarquardtOptimizerTest
try {
LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
optimizer.setInitialStepBoundFactor(initialStepBoundFactor);
- optimizer.setMaxEvaluations(maxCostEval);
+ optimizer.setMaxIterations(maxCostEval);
optimizer.setCostRelativeTolerance(costRelativeTolerance);
optimizer.setParRelativeTolerance(parRelativeTolerance);
optimizer.setOrthoTolerance(orthoTolerance);
diff --git a/src/test/org/apache/commons/math/optimization/general/MinpackTest.java b/src/test/org/apache/commons/math/optimization/general/MinpackTest.java
index c3f451e05..3a648fad1 100644
--- a/src/test/org/apache/commons/math/optimization/general/MinpackTest.java
+++ b/src/test/org/apache/commons/math/optimization/general/MinpackTest.java
@@ -219,7 +219,7 @@ public class MinpackTest extends TestCase {
0.188053165007911,
0.122430604321144,
0.134575665392506
- }), true);
+ }), false);
}
public void testMinpackMeyer()
@@ -505,7 +505,7 @@ public class MinpackTest extends TestCase {
private void minpackTest(MinpackFunction function, boolean exceptionExpected) {
LevenbergMarquardtOptimizer optimizer = new LevenbergMarquardtOptimizer();
- optimizer.setMaxEvaluations(100 * (function.getN() + 1));
+ optimizer.setMaxIterations(100 * (function.getN() + 1));
optimizer.setCostRelativeTolerance(Math.sqrt(2.22044604926e-16));
optimizer.setParRelativeTolerance(Math.sqrt(2.22044604926e-16));
optimizer.setOrthoTolerance(2.22044604926e-16);