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 2019/12/24 12:14:46 UTC
[commons-math] 04/07: MATH-1362: Use "IntegerSequence.Incrementor".
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 22da2300b824b508047880be840c6e89efa871b1
Author: Gilles Sadowski <gi...@harfang.homelinux.org>
AuthorDate: Tue Dec 24 12:32:15 2019 +0100
MATH-1362: Use "IntegerSequence.Incrementor".
---
.../fitting/leastsquares/GaussNewtonOptimizer.java | 10 ++--
.../fitting/leastsquares/LeastSquaresAdapter.java | 6 +--
.../fitting/leastsquares/LeastSquaresFactory.java | 6 +--
.../leastsquares/LevenbergMarquardtOptimizer.java | 12 ++---
.../math4/optim/AbstractOptimizationProblem.java | 18 +++++---
.../apache/commons/math4/optim/BaseOptimizer.java | 53 ++++++++++++++--------
.../commons/math4/optim/OptimizationProblem.java | 6 +--
.../math4/optim/linear/SimplexSolverTest.java | 2 +-
.../math4/optim/univariate/BrentOptimizerTest.java | 2 +-
9 files changed, 67 insertions(+), 48 deletions(-)
diff --git a/src/main/java/org/apache/commons/math4/fitting/leastsquares/GaussNewtonOptimizer.java b/src/main/java/org/apache/commons/math4/fitting/leastsquares/GaussNewtonOptimizer.java
index 8ef5c89..677c581 100644
--- a/src/main/java/org/apache/commons/math4/fitting/leastsquares/GaussNewtonOptimizer.java
+++ b/src/main/java/org/apache/commons/math4/fitting/leastsquares/GaussNewtonOptimizer.java
@@ -31,7 +31,7 @@ import org.apache.commons.math4.linear.RealVector;
import org.apache.commons.math4.linear.SingularMatrixException;
import org.apache.commons.math4.linear.SingularValueDecomposition;
import org.apache.commons.math4.optim.ConvergenceChecker;
-import org.apache.commons.math4.util.Incrementor;
+import org.apache.commons.math4.util.IntegerSequence;
import org.apache.commons.math4.util.Pair;
/**
@@ -207,8 +207,8 @@ public class GaussNewtonOptimizer implements LeastSquaresOptimizer {
@Override
public Optimum optimize(final LeastSquaresProblem lsp) {
//create local evaluation and iteration counts
- final Incrementor evaluationCounter = lsp.getEvaluationCounter();
- final Incrementor iterationCounter = lsp.getIterationCounter();
+ final IntegerSequence.Incrementor evaluationCounter = lsp.getEvaluationCounter();
+ final IntegerSequence.Incrementor iterationCounter = lsp.getIterationCounter();
final ConvergenceChecker<Evaluation> checker
= lsp.getConvergenceChecker();
@@ -222,12 +222,12 @@ public class GaussNewtonOptimizer implements LeastSquaresOptimizer {
// iterate until convergence is reached
Evaluation current = null;
while (true) {
- iterationCounter.incrementCount();
+ iterationCounter.increment();
// evaluate the objective function and its jacobian
Evaluation previous = current;
// Value of the objective function at "currentPoint".
- evaluationCounter.incrementCount();
+ evaluationCounter.increment();
current = lsp.evaluate(currentPoint);
final RealVector currentResiduals = current.getResiduals();
final RealMatrix weightedJacobian = current.getJacobian();
diff --git a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresAdapter.java b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresAdapter.java
index 94e6a90..af6043a 100644
--- a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresAdapter.java
+++ b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresAdapter.java
@@ -18,7 +18,7 @@ package org.apache.commons.math4.fitting.leastsquares;
import org.apache.commons.math4.linear.RealVector;
import org.apache.commons.math4.optim.ConvergenceChecker;
-import org.apache.commons.math4.util.Incrementor;
+import org.apache.commons.math4.util.IntegerSequence;
/**
* An adapter that delegates to another implementation of {@link LeastSquaresProblem}.
@@ -66,13 +66,13 @@ public class LeastSquaresAdapter implements LeastSquaresProblem {
/** {@inheritDoc} */
@Override
- public Incrementor getEvaluationCounter() {
+ public IntegerSequence.Incrementor getEvaluationCounter() {
return problem.getEvaluationCounter();
}
/** {@inheritDoc} */
@Override
- public Incrementor getIterationCounter() {
+ public IntegerSequence.Incrementor getIterationCounter() {
return problem.getIterationCounter();
}
diff --git a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresFactory.java b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresFactory.java
index 8c0db8a..c4efc13 100644
--- a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresFactory.java
+++ b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LeastSquaresFactory.java
@@ -31,7 +31,7 @@ import org.apache.commons.math4.optim.AbstractOptimizationProblem;
import org.apache.commons.math4.optim.ConvergenceChecker;
import org.apache.commons.math4.optim.PointVectorValuePair;
import org.apache.commons.math4.util.FastMath;
-import org.apache.commons.math4.util.Incrementor;
+import org.apache.commons.math4.util.IntegerSequence;
import org.apache.commons.math4.util.Pair;
/**
@@ -224,13 +224,13 @@ public class LeastSquaresFactory {
* @return a least squares problem that tracks evaluations
*/
public static LeastSquaresProblem countEvaluations(final LeastSquaresProblem problem,
- final Incrementor counter) {
+ final IntegerSequence.Incrementor counter) {
return new LeastSquaresAdapter(problem) {
/** {@inheritDoc} */
@Override
public Evaluation evaluate(final RealVector point) {
- counter.incrementCount();
+ counter.increment();
return super.evaluate(point);
}
diff --git a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizer.java b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizer.java
index 1cf0c58..8c667c4 100644
--- a/src/main/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizer.java
+++ b/src/main/java/org/apache/commons/math4/fitting/leastsquares/LevenbergMarquardtOptimizer.java
@@ -25,7 +25,7 @@ import org.apache.commons.math4.linear.ArrayRealVector;
import org.apache.commons.math4.linear.RealMatrix;
import org.apache.commons.math4.optim.ConvergenceChecker;
import org.apache.commons.math4.util.FastMath;
-import org.apache.commons.math4.util.Incrementor;
+import org.apache.commons.math4.util.IntegerSequence;
import org.apache.commons.numbers.core.Precision;
@@ -299,8 +299,8 @@ public class LevenbergMarquardtOptimizer implements LeastSquaresOptimizer {
final int nR = problem.getObservationSize(); // Number of observed data.
final int nC = problem.getParameterSize(); // Number of parameters.
// Counters.
- final Incrementor iterationCounter = problem.getIterationCounter();
- final Incrementor evaluationCounter = problem.getEvaluationCounter();
+ final IntegerSequence.Incrementor iterationCounter = problem.getIterationCounter();
+ final IntegerSequence.Incrementor evaluationCounter = problem.getEvaluationCounter();
// Convergence criterion.
final ConvergenceChecker<Evaluation> checker = problem.getConvergenceChecker();
@@ -324,7 +324,7 @@ public class LevenbergMarquardtOptimizer implements LeastSquaresOptimizer {
// Evaluate the function at the starting point and calculate its norm.
- evaluationCounter.incrementCount();
+ evaluationCounter.increment();
//value will be reassigned in the loop
Evaluation current = problem.evaluate(problem.getStart());
double[] currentResiduals = current.getResiduals().toArray();
@@ -334,7 +334,7 @@ public class LevenbergMarquardtOptimizer implements LeastSquaresOptimizer {
// Outer loop.
boolean firstIteration = true;
while (true) {
- iterationCounter.incrementCount();
+ iterationCounter.increment();
final Evaluation previous = current;
@@ -443,7 +443,7 @@ public class LevenbergMarquardtOptimizer implements LeastSquaresOptimizer {
}
// Evaluate the function at x + p and calculate its norm.
- evaluationCounter.incrementCount();
+ evaluationCounter.increment();
current = problem.evaluate(new ArrayRealVector(currentPoint));
currentResiduals = current.getResiduals().toArray();
currentCost = current.getCost();
diff --git a/src/main/java/org/apache/commons/math4/optim/AbstractOptimizationProblem.java b/src/main/java/org/apache/commons/math4/optim/AbstractOptimizationProblem.java
index 488e4f7..0e079f3 100644
--- a/src/main/java/org/apache/commons/math4/optim/AbstractOptimizationProblem.java
+++ b/src/main/java/org/apache/commons/math4/optim/AbstractOptimizationProblem.java
@@ -18,7 +18,7 @@ package org.apache.commons.math4.optim;
import org.apache.commons.math4.exception.TooManyEvaluationsException;
import org.apache.commons.math4.exception.TooManyIterationsException;
-import org.apache.commons.math4.util.Incrementor;
+import org.apache.commons.math4.util.IntegerSequence;
/**
* Base class for implementing optimization problems. It contains the boiler-plate code
@@ -60,14 +60,18 @@ public abstract class AbstractOptimizationProblem<PAIR>
/** {@inheritDoc} */
@Override
- public Incrementor getEvaluationCounter() {
- return new Incrementor(this.maxEvaluations, MAX_EVAL_CALLBACK);
+ public IntegerSequence.Incrementor getEvaluationCounter() {
+ return IntegerSequence.Incrementor.create()
+ .withMaximalCount(maxEvaluations)
+ .withCallback(MAX_EVAL_CALLBACK);
}
/** {@inheritDoc} */
@Override
- public Incrementor getIterationCounter() {
- return new Incrementor(this.maxIterations, MAX_ITER_CALLBACK);
+ public IntegerSequence.Incrementor getIterationCounter() {
+ return IntegerSequence.Incrementor.create()
+ .withMaximalCount(maxIterations)
+ .withCallback(MAX_ITER_CALLBACK);
}
/** {@inheritDoc} */
@@ -78,7 +82,7 @@ public abstract class AbstractOptimizationProblem<PAIR>
/** Defines the action to perform when reaching the maximum number of evaluations. */
private static class MaxEvalCallback
- implements Incrementor.MaxCountExceededCallback {
+ implements IntegerSequence.Incrementor.MaxCountExceededCallback {
/**
* {@inheritDoc}
*
@@ -92,7 +96,7 @@ public abstract class AbstractOptimizationProblem<PAIR>
/** Defines the action to perform when reaching the maximum number of evaluations. */
private static class MaxIterCallback
- implements Incrementor.MaxCountExceededCallback {
+ implements IntegerSequence.Incrementor.MaxCountExceededCallback {
/**
* {@inheritDoc}
*
diff --git a/src/main/java/org/apache/commons/math4/optim/BaseOptimizer.java b/src/main/java/org/apache/commons/math4/optim/BaseOptimizer.java
index 1a3ae4c..323c4ef 100644
--- a/src/main/java/org/apache/commons/math4/optim/BaseOptimizer.java
+++ b/src/main/java/org/apache/commons/math4/optim/BaseOptimizer.java
@@ -18,7 +18,7 @@ package org.apache.commons.math4.optim;
import org.apache.commons.math4.exception.TooManyEvaluationsException;
import org.apache.commons.math4.exception.TooManyIterationsException;
-import org.apache.commons.math4.util.Incrementor;
+import org.apache.commons.math4.util.IntegerSequence;
/**
* Base class for implementing optimizers.
@@ -33,12 +33,21 @@ import org.apache.commons.math4.util.Incrementor;
* @since 3.1
*/
public abstract class BaseOptimizer<PAIR> {
- /** Evaluations counter. */
- protected final Incrementor evaluations;
- /** Iterations counter. */
- protected final Incrementor iterations;
+ /** Callback to use for the evaluation counter. */
+ private static final MaxEvalCallback MAX_EVAL_CALLBACK = new MaxEvalCallback();
+ /** Callback to use for the iteration counter. */
+ private static final MaxIterCallback MAX_ITER_CALLBACK = new MaxIterCallback();
+
/** Convergence checker. */
private final ConvergenceChecker<PAIR> checker;
+ /** Maximum number of evaluations. */
+ private int maxEvaluations;
+ /** Maximum number of iterations. */
+ private int maxIterations;
+ /** Evaluations counter. */
+ private IntegerSequence.Incrementor evaluations;
+ /** Iterations counter. */
+ private IntegerSequence.Incrementor iterations;
/**
* @param checker Convergence checker.
@@ -56,9 +65,8 @@ public abstract class BaseOptimizer<PAIR> {
int maxEval,
int maxIter) {
this.checker = checker;
-
- evaluations = new Incrementor(maxEval, new MaxEvalCallback());
- iterations = new Incrementor(maxIter, new MaxIterCallback());
+ this.maxEvaluations = maxEval;
+ this.maxIterations = maxIter;
}
/**
@@ -145,10 +153,8 @@ public abstract class BaseOptimizer<PAIR> {
TooManyIterationsException {
// Parse options.
parseOptimizationData(optData);
-
// Reset counters.
- evaluations.resetCount();
- iterations.resetCount();
+ resetCounters();
// Perform optimization.
return doOptimize();
}
@@ -166,8 +172,7 @@ public abstract class BaseOptimizer<PAIR> {
throws TooManyEvaluationsException,
TooManyIterationsException {
// Reset counters.
- evaluations.resetCount();
- iterations.resetCount();
+ resetCounters();
// Perform optimization.
return doOptimize();
}
@@ -188,7 +193,7 @@ public abstract class BaseOptimizer<PAIR> {
*/
protected void incrementEvaluationCount()
throws TooManyEvaluationsException {
- evaluations.incrementCount();
+ evaluations.increment();
}
/**
@@ -199,7 +204,7 @@ public abstract class BaseOptimizer<PAIR> {
*/
protected void incrementIterationCount()
throws TooManyIterationsException {
- iterations.incrementCount();
+ iterations.increment();
}
/**
@@ -218,22 +223,32 @@ public abstract class BaseOptimizer<PAIR> {
// not provided in the argument list.
for (OptimizationData data : optData) {
if (data instanceof MaxEval) {
- evaluations.setMaximalCount(((MaxEval) data).getMaxEval());
+ maxEvaluations = ((MaxEval) data).getMaxEval();
continue;
}
if (data instanceof MaxIter) {
- iterations.setMaximalCount(((MaxIter) data).getMaxIter());
+ maxIterations = ((MaxIter) data).getMaxIter();
continue;
}
}
}
+ /** Reset counters. */
+ private void resetCounters() {
+ evaluations = IntegerSequence.Incrementor.create()
+ .withMaximalCount(maxEvaluations)
+ .withCallback(MAX_EVAL_CALLBACK);
+ iterations = IntegerSequence.Incrementor.create()
+ .withMaximalCount(maxIterations)
+ .withCallback(MAX_ITER_CALLBACK);
+ }
+
/**
* Defines the action to perform when reaching the maximum number
* of evaluations.
*/
private static class MaxEvalCallback
- implements Incrementor.MaxCountExceededCallback {
+ implements IntegerSequence.Incrementor.MaxCountExceededCallback {
/**
* {@inheritDoc}
* @throws TooManyEvaluationsException
@@ -249,7 +264,7 @@ public abstract class BaseOptimizer<PAIR> {
* of evaluations.
*/
private static class MaxIterCallback
- implements Incrementor.MaxCountExceededCallback {
+ implements IntegerSequence.Incrementor.MaxCountExceededCallback {
/**
* {@inheritDoc}
* @throws TooManyIterationsException
diff --git a/src/main/java/org/apache/commons/math4/optim/OptimizationProblem.java b/src/main/java/org/apache/commons/math4/optim/OptimizationProblem.java
index 35623b4..1bbec93 100644
--- a/src/main/java/org/apache/commons/math4/optim/OptimizationProblem.java
+++ b/src/main/java/org/apache/commons/math4/optim/OptimizationProblem.java
@@ -16,7 +16,7 @@
*/
package org.apache.commons.math4.optim;
-import org.apache.commons.math4.util.Incrementor;
+import org.apache.commons.math4.util.IntegerSequence;
/**
* Common settings for all optimization problems. Includes divergence and convergence
@@ -34,7 +34,7 @@ public interface OptimizationProblem<PAIR> {
*
* @return a counter for the evaluations.
*/
- Incrementor getEvaluationCounter();
+ IntegerSequence.Incrementor getEvaluationCounter();
/**
* Get a independent Incrementor that counts up to the maximum number of iterations
@@ -42,7 +42,7 @@ public interface OptimizationProblem<PAIR> {
*
* @return a counter for the evaluations.
*/
- Incrementor getIterationCounter();
+ IntegerSequence.Incrementor getIterationCounter();
/**
* Gets the convergence checker.
diff --git a/src/test/java/org/apache/commons/math4/optim/linear/SimplexSolverTest.java b/src/test/java/org/apache/commons/math4/optim/linear/SimplexSolverTest.java
index c540652..ecac904 100644
--- a/src/test/java/org/apache/commons/math4/optim/linear/SimplexSolverTest.java
+++ b/src/test/java/org/apache/commons/math4/optim/linear/SimplexSolverTest.java
@@ -779,7 +779,7 @@ public class SimplexSolverTest {
Assert.assertFalse(callback.isSolutionOptimal());
try {
- solver.optimize(new MaxIter(3), f, new LinearConstraintSet(constraints),
+ solver.optimize(new MaxIter(4), f, new LinearConstraintSet(constraints),
GoalType.MAXIMIZE, new NonNegativeConstraint(true), callback);
Assert.fail("expected TooManyIterationsException");
} catch (TooManyIterationsException ex) {
diff --git a/src/test/java/org/apache/commons/math4/optim/univariate/BrentOptimizerTest.java b/src/test/java/org/apache/commons/math4/optim/univariate/BrentOptimizerTest.java
index cb778a8..dde5a95 100644
--- a/src/test/java/org/apache/commons/math4/optim/univariate/BrentOptimizerTest.java
+++ b/src/test/java/org/apache/commons/math4/optim/univariate/BrentOptimizerTest.java
@@ -228,7 +228,7 @@ public final class BrentOptimizerTest {
};
UnivariateOptimizer optimizer = new BrentOptimizer(1e-10, 1e-8);
- final double result = optimizer.optimize(new MaxEval(1483),
+ final double result = optimizer.optimize(new MaxEval(1484),
new UnivariateObjectiveFunction(f),
GoalType.MINIMIZE,
new SearchInterval(Double.MIN_VALUE,