This is an automated email from the ASF dual-hosted git repository. aherbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-math.git
commit a80eefc21a6d8f1343fe87a5453ab4aec6855ed2 Author: aherbert <aherb...@apache.org> AuthorDate: Thu Oct 13 15:13:50 2022 +0100 Update the CircleProblem to use the latest commons RNG objects --- .../legacy/fitting/leastsquares/CircleProblem.java | 4 +- .../LevenbergMarquardtOptimizerTest.java | 9 +--- .../leastsquares/RandomCirclePointGenerator.java | 48 +++++++--------------- 3 files changed, 19 insertions(+), 42 deletions(-) diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/CircleProblem.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/CircleProblem.java index bab9e1b7f..9b3f9868c 100644 --- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/CircleProblem.java +++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/CircleProblem.java @@ -71,8 +71,8 @@ class CircleProblem { this(xError, yError, 500); } - public void addPoint(double px, double py) { - points.add(new double[] { px, py }); + public void addPoint(double[] p) { + points.add(p); } public double[] target() { diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java index ba3960549..a3b2bc152 100644 --- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java +++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/LevenbergMarquardtOptimizerTest.java @@ -17,7 +17,6 @@ package org.apache.commons.math4.legacy.fitting.leastsquares; -import org.apache.commons.geometry.euclidean.twod.Vector2D; import org.apache.commons.math4.legacy.exception.DimensionMismatchException; import org.apache.commons.math4.legacy.exception.TooManyEvaluationsException; import org.apache.commons.math4.legacy.fitting.leastsquares.LeastSquaresOptimizer.Optimum; @@ -255,9 +254,7 @@ public class LevenbergMarquardtOptimizerTest final CircleProblem circle = new CircleProblem(xSigma, ySigma); final int numPoints = 10; - for (Vector2D p : factory.generate(numPoints)) { - circle.addPoint(p.getX(), p.getY()); - } + factory.samples(numPoints).forEach(circle::addPoint); // First guess for the center's coordinates and radius. final double[] init = { 90, 659, 115 }; @@ -290,9 +287,7 @@ public class LevenbergMarquardtOptimizerTest final CircleProblem circle = new CircleProblem(xSigma, ySigma); final int numPoints = 10; - for (Vector2D p : factory.generate(numPoints)) { - circle.addPoint(p.getX(), p.getY()); - } + factory.samples(numPoints).forEach(circle::addPoint); // First guess for the center's coordinates and radius. final double[] init = { 90, 659, 115 }; diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/RandomCirclePointGenerator.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/RandomCirclePointGenerator.java index d85921c60..5fcf5350d 100644 --- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/RandomCirclePointGenerator.java +++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/fitting/leastsquares/RandomCirclePointGenerator.java @@ -16,24 +16,23 @@ */ package org.apache.commons.math4.legacy.fitting.leastsquares; -import org.apache.commons.geometry.euclidean.twod.Vector2D; import org.apache.commons.statistics.distribution.NormalDistribution; import org.apache.commons.statistics.distribution.ContinuousDistribution; -import org.apache.commons.statistics.distribution.UniformContinuousDistribution; import org.apache.commons.rng.UniformRandomProvider; +import org.apache.commons.rng.sampling.ObjectSampler; +import org.apache.commons.rng.sampling.UnitSphereSampler; import org.apache.commons.rng.simple.RandomSource; -import org.apache.commons.math4.core.jdkmath.JdkMath; /** * Factory for generating a cloud of points that approximate a circle. */ -public class RandomCirclePointGenerator { +public class RandomCirclePointGenerator implements ObjectSampler<double[]> { /** RNG for the x-coordinate of the center. */ private final ContinuousDistribution.Sampler cX; /** RNG for the y-coordinate of the center. */ private final ContinuousDistribution.Sampler cY; - /** RNG for the parametric position of the point. */ - private final ContinuousDistribution.Sampler tP; + /** Sampler for the unit circle position of the point. */ + private final UnitSphereSampler sampler; /** Radius of the circle. */ private final double radius; @@ -49,37 +48,20 @@ public class RandomCirclePointGenerator { double radius, double xSigma, double ySigma) { - final UniformRandomProvider rng = RandomSource.WELL_44497_B.create(); + final UniformRandomProvider rng = RandomSource.XO_SHI_RO_256_PP.create(); this.radius = radius; cX = NormalDistribution.of(x, xSigma).createSampler(rng); cY = NormalDistribution.of(y, ySigma).createSampler(rng); - tP = UniformContinuousDistribution.of(0, 2 * Math.PI).createSampler(rng); + sampler = UnitSphereSampler.of(rng, 2); } - /** - * Point generator. - * - * @param n Number of points to create. - * @return the cloud of {@code n} points. - */ - public Vector2D[] generate(int n) { - final Vector2D[] cloud = new Vector2D[n]; - for (int i = 0; i < n; i++) { - cloud[i] = create(); - } - return cloud; - } - - /** - * Create one point. - * - * @return a point. - */ - private Vector2D create() { - final double t = tP.sample(); - final double pX = cX.sample() + radius * JdkMath.cos(t); - final double pY = cY.sample() + radius * JdkMath.sin(t); - - return Vector2D.of(pX, pY); + @Override + public double[] sample() { + // Sample on a unit circle + final double[] xy = sampler.sample(); + // Scale the circle and add error + xy[0] = radius * xy[0] + cX.sample(); + xy[1] = radius * xy[1] + cY.sample(); + return xy; } }