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-rng.git
commit 756c2512e788975384e1f6ea76744424f0dfd911 Author: Alex Herbert <aherb...@apache.org> AuthorDate: Sun Jul 21 11:50:31 2019 +0100 RNG-110: Provide factory constructors for released samplers. These samplers must maintain an instance constructor for binary compatibility. --- .../ContinuousSamplersPerformance.java | 24 ++++++------ .../distribution/DiscreteSamplersPerformance.java | 8 ++-- .../distribution/GeometricSamplersPerformance.java | 2 +- .../PoissonSamplerCachePerformance.java | 18 +++++---- .../distribution/PoissonSamplersPerformance.java | 4 +- .../commons/rng/examples/jpms/lib/DiceGame.java | 2 +- .../ProbabilityDensityApproximationCommand.java | 38 +++++++++---------- .../UniformSamplingVisualCheckCommand.java | 6 +-- .../commons/rng/sampling/UnitSphereSampler.java | 4 +- .../AhrensDieterExponentialSampler.java | 13 +++++++ .../AhrensDieterMarsagliaTsangGammaSampler.java | 29 +++++++++++--- .../distribution/BoxMullerLogNormalSampler.java | 2 +- .../BoxMullerNormalizedGaussianSampler.java | 13 +++++++ .../sampling/distribution/ChengBetaSampler.java | 15 ++++++++ .../distribution/ContinuousUniformSampler.java | 16 +++++++- .../distribution/DiscreteUniformSampler.java | 40 ++++++++++++++------ .../rng/sampling/distribution/GaussianSampler.java | 20 ++++++++++ .../sampling/distribution/GeometricSampler.java | 2 +- .../InverseTransformContinuousSampler.java | 17 +++++++++ .../InverseTransformDiscreteSampler.java | 17 +++++++++ .../InverseTransformParetoSampler.java | 15 ++++++++ .../distribution/LargeMeanPoissonSampler.java | 21 +++++++++-- .../sampling/distribution/LogNormalSampler.java | 20 ++++++++++ .../MarsagliaNormalizedGaussianSampler.java | 13 +++++++ .../rng/sampling/distribution/PoissonSampler.java | 25 ++++++++++-- .../sampling/distribution/PoissonSamplerCache.java | 6 +-- .../RejectionInversionZipfSampler.java | 16 ++++++++ .../distribution/SmallMeanPoissonSampler.java | 15 +++++++- .../ZigguratNormalizedGaussianSampler.java | 13 +++++++ .../AhrensDieterExponentialSamplerTest.java | 8 ++-- ...AhrensDieterMarsagliaTsangGammaSamplerTest.java | 25 ++++++++---- .../BoxMullerNormalisedGaussianSamplerTest.java | 4 +- .../distribution/ChengBetaSamplerTest.java | 12 ++---- .../distribution/ContinuousSamplersList.java | 44 +++++++++++----------- .../distribution/ContinuousUniformSamplerTest.java | 6 +-- .../distribution/DiscreteSamplersList.java | 22 +++++------ .../distribution/DiscreteUniformSamplerTest.java | 19 ++++++++-- .../sampling/distribution/GaussianSamplerTest.java | 20 +++++----- .../InverseTransformContinuousSamplerTest.java | 4 +- .../InverseTransformDiscreteSamplerTest.java | 4 +- .../InverseTransformParetoSamplerTest.java | 12 ++---- .../distribution/LargeMeanPoissonSamplerTest.java | 22 +++++------ .../distribution/LogNormalSamplerTest.java | 26 ++++++------- .../MarsagliaNormalisedGaussianSamplerTest.java | 4 +- .../distribution/PoissonSamplerCacheTest.java | 2 +- .../sampling/distribution/PoissonSamplerTest.java | 15 +++++++- .../RejectionInversionZipfSamplerTest.java | 12 ++---- .../distribution/SmallMeanPoissonSamplerTest.java | 12 +++--- .../ZigguratNormalizedGaussianSamplerTest.java | 6 +-- .../rng/simple/ThreadLocalRandomSource.java | 4 +- 50 files changed, 496 insertions(+), 221 deletions(-) diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/ContinuousSamplersPerformance.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/ContinuousSamplersPerformance.java index cb311cb..fea6cfa 100644 --- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/ContinuousSamplersPerformance.java +++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/ContinuousSamplersPerformance.java @@ -97,31 +97,31 @@ public class ContinuousSamplersPerformance { super.setup(); final UniformRandomProvider rng = getGenerator(); if ("BoxMullerNormalizedGaussianSampler".equals(samplerType)) { - sampler = new BoxMullerNormalizedGaussianSampler(rng); + sampler = BoxMullerNormalizedGaussianSampler.of(rng); } else if ("MarsagliaNormalizedGaussianSampler".equals(samplerType)) { - sampler = new MarsagliaNormalizedGaussianSampler(rng); + sampler = MarsagliaNormalizedGaussianSampler.of(rng); } else if ("ZigguratNormalizedGaussianSampler".equals(samplerType)) { - sampler = new ZigguratNormalizedGaussianSampler(rng); + sampler = ZigguratNormalizedGaussianSampler.of(rng); } else if ("AhrensDieterExponentialSampler".equals(samplerType)) { - sampler = new AhrensDieterExponentialSampler(rng, 4.56); + sampler = AhrensDieterExponentialSampler.of(rng, 4.56); } else if ("AhrensDieterGammaSampler".equals(samplerType)) { // This tests the Ahrens-Dieter algorithm since alpha < 1 - sampler = new AhrensDieterMarsagliaTsangGammaSampler(rng, 0.76, 9.8); + sampler = AhrensDieterMarsagliaTsangGammaSampler.of(rng, 0.76, 9.8); } else if ("MarsagliaTsangGammaSampler".equals(samplerType)) { // This tests the Marsaglia-Tsang algorithm since alpha > 1 - sampler = new AhrensDieterMarsagliaTsangGammaSampler(rng, 12.34, 9.8); + sampler = AhrensDieterMarsagliaTsangGammaSampler.of(rng, 12.34, 9.8); } else if ("LogNormalBoxMullerNormalizedGaussianSampler".equals(samplerType)) { - sampler = new LogNormalSampler(new BoxMullerNormalizedGaussianSampler(rng), 12.3, 4.6); + sampler = LogNormalSampler.of(BoxMullerNormalizedGaussianSampler.of(rng), 12.3, 4.6); } else if ("LogNormalMarsagliaNormalizedGaussianSampler".equals(samplerType)) { - sampler = new LogNormalSampler(new MarsagliaNormalizedGaussianSampler(rng), 12.3, 4.6); + sampler = LogNormalSampler.of(MarsagliaNormalizedGaussianSampler.of(rng), 12.3, 4.6); } else if ("LogNormalZigguratNormalizedGaussianSampler".equals(samplerType)) { - sampler = new LogNormalSampler(new ZigguratNormalizedGaussianSampler(rng), 12.3, 4.6); + sampler = LogNormalSampler.of(ZigguratNormalizedGaussianSampler.of(rng), 12.3, 4.6); } else if ("ChengBetaSampler".equals(samplerType)) { - sampler = new ChengBetaSampler(rng, 0.45, 6.7); + sampler = ChengBetaSampler.of(rng, 0.45, 6.7); } else if ("ContinuousUniformSampler".equals(samplerType)) { - sampler = new ContinuousUniformSampler(rng, 123.4, 5678.9); + sampler = ContinuousUniformSampler.of(rng, 123.4, 5678.9); } else if ("InverseTransformParetoSampler".equals(samplerType)) { - sampler = new InverseTransformParetoSampler(rng, 23.45, 0.1234); + sampler = InverseTransformParetoSampler.of(rng, 23.45, 0.1234); } } } diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/DiscreteSamplersPerformance.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/DiscreteSamplersPerformance.java index 03bae18..ef41587 100644 --- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/DiscreteSamplersPerformance.java +++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/DiscreteSamplersPerformance.java @@ -110,14 +110,14 @@ public class DiscreteSamplersPerformance { super.setup(); final UniformRandomProvider rng = getGenerator(); if ("DiscreteUniformSampler".equals(samplerType)) { - sampler = new DiscreteUniformSampler(rng, -98, 76); + sampler = DiscreteUniformSampler.of(rng, -98, 76); } else if ("RejectionInversionZipfSampler".equals(samplerType)) { - sampler = new RejectionInversionZipfSampler(rng, 43, 2.1); + sampler = RejectionInversionZipfSampler.of(rng, 43, 2.1); } else if ("SmallMeanPoissonSampler".equals(samplerType)) { - sampler = new SmallMeanPoissonSampler(rng, 8.9); + sampler = SmallMeanPoissonSampler.of(rng, 8.9); } else if ("LargeMeanPoissonSampler".equals(samplerType)) { // Note: Use with a fractional part to the mean includes a small mean sample - sampler = new LargeMeanPoissonSampler(rng, 41.7); + sampler = LargeMeanPoissonSampler.of(rng, 41.7); } else if ("GeometricSampler".equals(samplerType)) { sampler = GeometricSampler.of(rng, 0.21); } else if ("MarsagliaTsangWangDiscreteSampler".equals(samplerType)) { diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/GeometricSamplersPerformance.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/GeometricSamplersPerformance.java index 7fc3e57..954a3bd 100644 --- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/GeometricSamplersPerformance.java +++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/GeometricSamplersPerformance.java @@ -99,7 +99,7 @@ public class GeometricSamplersPerformance { } else { final DiscreteInverseCumulativeProbabilityFunction geometricFunction = new GeometricDiscreteInverseCumulativeProbabilityFunction(probabilityOfSuccess); - sampler = new InverseTransformDiscreteSampler(rng, geometricFunction); + sampler = InverseTransformDiscreteSampler.of(rng, geometricFunction); } } } diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplerCachePerformance.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplerCachePerformance.java index 7311cde..efe0113 100644 --- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplerCachePerformance.java +++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplerCachePerformance.java @@ -45,7 +45,7 @@ import org.openjdk.jmh.infra.Blackhole; * cache. * * <p>The benchmark is designed for a worse case scenario of Poisson means that are uniformly spread - * over a range and non-integer. A single sample is required per mean, E.g. + * over a range and non-integer. A single sample is required per mean, E.g.</p> * * <pre> * int min = 40; @@ -55,7 +55,7 @@ import org.openjdk.jmh.infra.Blackhole; * * // Compare ... * for (int i = 0; i < 1000; i++) { - * new PoissonSampler(rng, min + rng.nextDouble() * range).sample(); + * PoissonSampler.of(rng, min + rng.nextDouble() * range).sample(); * } * * // To ... @@ -67,7 +67,7 @@ import org.openjdk.jmh.infra.Blackhole; * * <p>The alternative scenario where the means are integer is not considered as this could be easily * handled by creating an array to hold the PoissonSamplers for each mean. This does not require any - * specialised caching of state and is simple enough to perform for single threaded applications: + * specialised caching of state and is simple enough to perform for single threaded applications:</p> * * <pre> * public class SimpleUnsafePoissonSamplerCache { @@ -77,12 +77,12 @@ import org.openjdk.jmh.infra.Blackhole; * * public PoissonSampler createPoissonSampler(UniformRandomProvider rng, int mean) { * if (mean < min || mean > max) { - * return new PoissonSampler(rng, mean); + * return PoissonSampler.of(rng, mean); * } * int index = mean - min; * PoissonSampler sample = samplers[index]; * if (sampler == null) { - * sampler = new PoissonSampler(rng, mean); + * sampler = PoissonSampler.of(rng, mean); * samplers[index] = sampler; * } * return sampler; @@ -90,8 +90,10 @@ import org.openjdk.jmh.infra.Blackhole; * } * </pre> * - * Note that in this example the UniformRandomProvider is also cached and so this is only - * applicable to a single threaded application. + * <p>Note that in this example the UniformRandomProvider is also cached and so this is only + * applicable to a single threaded application. Thread safety could be ensured using the + * {@link org.apache.commons.rng.sampling.SharedStateSampler SharedStateSampler} functionality + * of the cached sampler.</p> * * <p>Re-written to use the PoissonSamplerCache would provide a new PoissonSampler per call in a * thread-safe manner: @@ -308,7 +310,7 @@ public class PoissonSamplerCachePerformance { final PoissonSamplerFactory factory = new PoissonSamplerFactory() { @Override public DiscreteSampler createPoissonSampler(double mean) { - return new PoissonSampler(r, mean); + return PoissonSampler.of(r, mean); } }; runSample(factory, range, bh); diff --git a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplersPerformance.java b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplersPerformance.java index 2ef6f8b..4fab0a2 100644 --- a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplersPerformance.java +++ b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/distribution/PoissonSamplersPerformance.java @@ -178,7 +178,7 @@ public class PoissonSamplersPerformance { factory = new DiscreteSamplerFactory() { @Override public DiscreteSampler create() { - return new SmallMeanPoissonSampler(generator, mean); + return SmallMeanPoissonSampler.of(generator, mean); } }; } else if ("KempSmallMeanPoissonSampler".equals(samplerType)) { @@ -221,7 +221,7 @@ public class PoissonSamplersPerformance { @Override public DiscreteSampler create() { // Note this is not valid when mean < 1 - return new LargeMeanPoissonSampler(generator, mean); + return LargeMeanPoissonSampler.of(generator, mean); } }; } else if ("TinyMeanPoissonSampler".equals(samplerType)) { diff --git a/commons-rng-examples/examples-jpms/jpms-lib/src/main/java/org/apache/commons/rng/examples/jpms/lib/DiceGame.java b/commons-rng-examples/examples-jpms/jpms-lib/src/main/java/org/apache/commons/rng/examples/jpms/lib/DiceGame.java index c12d4f0..db91f72 100644 --- a/commons-rng-examples/examples-jpms/jpms-lib/src/main/java/org/apache/commons/rng/examples/jpms/lib/DiceGame.java +++ b/commons-rng-examples/examples-jpms/jpms-lib/src/main/java/org/apache/commons/rng/examples/jpms/lib/DiceGame.java @@ -50,7 +50,7 @@ public class DiceGame { this.rng = rng; this.rounds = rounds; this.players = players; - sampler = new GaussianSampler(new ZigguratNormalizedGaussianSampler(rng), mu, sigma); + sampler = GaussianSampler.of(ZigguratNormalizedGaussianSampler.of(rng), mu, sigma); } /** diff --git a/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximationCommand.java b/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximationCommand.java index 5dd0453..8a80405 100644 --- a/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximationCommand.java +++ b/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/ProbabilityDensityApproximationCommand.java @@ -187,18 +187,18 @@ class ProbabilityDensityApproximationCommand implements Callable<Void> { final double gaussMin = -9; final double gaussMax = 11; if (samplers.contains(Sampler.ZigguratGaussianSampler)) { - createDensity(new GaussianSampler(new ZigguratNormalizedGaussianSampler(rng), - gaussMean, gaussSigma), + createDensity(GaussianSampler.of(ZigguratNormalizedGaussianSampler.of(rng), + gaussMean, gaussSigma), gaussMin, gaussMax, "gauss.ziggurat.txt"); } if (samplers.contains(Sampler.MarsagliaGaussianSampler)) { - createDensity(new GaussianSampler(new MarsagliaNormalizedGaussianSampler(rng), - gaussMean, gaussSigma), + createDensity(GaussianSampler.of(MarsagliaNormalizedGaussianSampler.of(rng), + gaussMean, gaussSigma), gaussMin, gaussMax, "gauss.marsaglia.txt"); } if (samplers.contains(Sampler.BoxMullerGaussianSampler)) { - createDensity(new GaussianSampler(new BoxMullerNormalizedGaussianSampler(rng), - gaussMean, gaussSigma), + createDensity(GaussianSampler.of(BoxMullerNormalizedGaussianSampler.of(rng), + gaussMean, gaussSigma), gaussMin, gaussMax, "gauss.boxmuller.txt"); } @@ -207,13 +207,13 @@ class ProbabilityDensityApproximationCommand implements Callable<Void> { if (samplers.contains(Sampler.ChengBetaSamplerCase1)) { final double alphaBeta = 4.3; final double betaBeta = 2.1; - createDensity(new ChengBetaSampler(rng, alphaBeta, betaBeta), + createDensity(ChengBetaSampler.of(rng, alphaBeta, betaBeta), betaMin, betaMax, "beta.case1.txt"); } if (samplers.contains(Sampler.ChengBetaSamplerCase2)) { final double alphaBetaAlt = 0.5678; final double betaBetaAlt = 0.1234; - createDensity(new ChengBetaSampler(rng, alphaBetaAlt, betaBetaAlt), + createDensity(ChengBetaSampler.of(rng, alphaBetaAlt, betaBetaAlt), betaMin, betaMax, "beta.case2.txt"); } @@ -221,7 +221,7 @@ class ProbabilityDensityApproximationCommand implements Callable<Void> { final double meanExp = 3.45; final double expMin = 0; final double expMax = 60; - createDensity(new AhrensDieterExponentialSampler(rng, meanExp), + createDensity(AhrensDieterExponentialSampler.of(rng, meanExp), expMin, expMax, "exp.txt"); } @@ -230,13 +230,13 @@ class ProbabilityDensityApproximationCommand implements Callable<Void> { final double thetaGamma = 3.456; if (samplers.contains(Sampler.AhrensDieterMarsagliaTsangGammaSamplerCase1)) { final double alphaGammaSmallerThanOne = 0.1234; - createDensity(new AhrensDieterMarsagliaTsangGammaSampler(rng, alphaGammaSmallerThanOne, thetaGamma), + createDensity(AhrensDieterMarsagliaTsangGammaSampler.of(rng, alphaGammaSmallerThanOne, thetaGamma), gammaMin, gammaMax1, "gamma.case1.txt"); } if (samplers.contains(Sampler.AhrensDieterMarsagliaTsangGammaSamplerCase2)) { final double alphaGammaLargerThanOne = 2.345; final double gammaMax2 = 70; - createDensity(new AhrensDieterMarsagliaTsangGammaSampler(rng, alphaGammaLargerThanOne, thetaGamma), + createDensity(AhrensDieterMarsagliaTsangGammaSampler.of(rng, alphaGammaLargerThanOne, thetaGamma), gammaMin, gammaMax2, "gamma.case2.txt"); } @@ -245,14 +245,14 @@ class ProbabilityDensityApproximationCommand implements Callable<Void> { final double paretoMin = 23; final double paretoMax = 400; if (samplers.contains(Sampler.InverseTransformParetoSampler)) { - createDensity(new InverseTransformParetoSampler(rng, scalePareto, shapePareto), + createDensity(InverseTransformParetoSampler.of(rng, scalePareto, shapePareto), paretoMin, paretoMax, "pareto.txt"); } final double loUniform = -9.876; final double hiUniform = 5.432; if (samplers.contains(Sampler.ContinuousUniformSampler)) { - createDensity(new ContinuousUniformSampler(rng, loUniform, hiUniform), + createDensity(ContinuousUniformSampler.of(rng, loUniform, hiUniform), loUniform, hiUniform, "uniform.txt"); } @@ -261,18 +261,18 @@ class ProbabilityDensityApproximationCommand implements Callable<Void> { final double logNormalMin = 5; final double logNormalMax = 25; if (samplers.contains(Sampler.LogNormalZigguratGaussianSampler)) { - createDensity(new LogNormalSampler(new ZigguratNormalizedGaussianSampler(rng), - scaleLogNormal, shapeLogNormal), + createDensity(LogNormalSampler.of(ZigguratNormalizedGaussianSampler.of(rng), + scaleLogNormal, shapeLogNormal), logNormalMin, logNormalMax, "lognormal.ziggurat.txt"); } if (samplers.contains(Sampler.LogNormalMarsagliaGaussianSampler)) { - createDensity(new LogNormalSampler(new MarsagliaNormalizedGaussianSampler(rng), - scaleLogNormal, shapeLogNormal), + createDensity(LogNormalSampler.of(MarsagliaNormalizedGaussianSampler.of(rng), + scaleLogNormal, shapeLogNormal), logNormalMin, logNormalMax, "lognormal.marsaglia.txt"); } if (samplers.contains(Sampler.LogNormalBoxMullerGaussianSampler)) { - createDensity(new LogNormalSampler(new BoxMullerNormalizedGaussianSampler(rng), - scaleLogNormal, shapeLogNormal), + createDensity(LogNormalSampler.of(BoxMullerNormalizedGaussianSampler.of(rng), + scaleLogNormal, shapeLogNormal), logNormalMin, logNormalMax, "lognormal.boxmuller.txt"); } diff --git a/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/UniformSamplingVisualCheckCommand.java b/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/UniformSamplingVisualCheckCommand.java index c22b5e4..13a170d 100644 --- a/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/UniformSamplingVisualCheckCommand.java +++ b/commons-rng-examples/examples-sampling/src/main/java/org/apache/commons/rng/examples/sampling/UniformSamplingVisualCheckCommand.java @@ -64,9 +64,9 @@ class UniformSamplingVisualCheckCommand implements Callable<Void> { private final UniformRandomProvider rng = RandomSource.create(RandomSource.XOR_SHIFT_1024_S_PHI); /** Samplers. */ private final ContinuousSampler[] samplers = new ContinuousSampler[] { - new ZigguratNormalizedGaussianSampler(rng), - new MarsagliaNormalizedGaussianSampler(rng), - new BoxMullerNormalizedGaussianSampler(rng), + ZigguratNormalizedGaussianSampler.of(rng), + MarsagliaNormalizedGaussianSampler.of(rng), + BoxMullerNormalizedGaussianSampler.of(rng), }; // Allow System.out diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/UnitSphereSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/UnitSphereSampler.java index 67cecd1..10c1702 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/UnitSphereSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/UnitSphereSampler.java @@ -53,7 +53,7 @@ public class UnitSphereSampler implements SharedStateSampler<UnitSphereSampler> } this.dimension = dimension; - sampler = new ZigguratNormalizedGaussianSampler(rng); + sampler = ZigguratNormalizedGaussianSampler.of(rng); } /** @@ -63,7 +63,7 @@ public class UnitSphereSampler implements SharedStateSampler<UnitSphereSampler> private UnitSphereSampler(UniformRandomProvider rng, UnitSphereSampler source) { // The Gaussian sampler has no shared state so create a new instance - sampler = new ZigguratNormalizedGaussianSampler(rng); + sampler = ZigguratNormalizedGaussianSampler.of(rng); dimension = source.dimension; } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java index 0340a45..e8ad681 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSampler.java @@ -141,4 +141,17 @@ public class AhrensDieterExponentialSampler public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new AhrensDieterExponentialSampler(rng, this); } + + /** + * Create a new Exponential distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param mean Mean of the distribution. + * @return the sampler + * @throws IllegalArgumentException if {@code mean <= 0} + */ + public static SharedStateContinuousSampler of(UniformRandomProvider rng, + double mean) { + return new AhrensDieterExponentialSampler(rng, mean); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java index 24aa406..db52483 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSampler.java @@ -219,7 +219,7 @@ public class AhrensDieterMarsagliaTsangGammaSampler double alpha, double theta) { super(rng, alpha, theta); - gaussian = new ZigguratNormalizedGaussianSampler(rng); + gaussian = ZigguratNormalizedGaussianSampler.of(rng); dOptim = alpha - ONE_THIRD; cOptim = ONE_THIRD / Math.sqrt(dOptim); } @@ -231,7 +231,7 @@ public class AhrensDieterMarsagliaTsangGammaSampler MarsagliaTsangGammaSampler(UniformRandomProvider rng, MarsagliaTsangGammaSampler source) { super(rng, source); - gaussian = new ZigguratNormalizedGaussianSampler(rng); + gaussian = ZigguratNormalizedGaussianSampler.of(rng); dOptim = source.dOptim; cOptim = source.cOptim; } @@ -268,6 +268,9 @@ public class AhrensDieterMarsagliaTsangGammaSampler } /** + * This instance delegates sampling. Use the factory method + * {@link #of(UniformRandomProvider, double, double)} to create an optimal sampler. + * * @param rng Generator of uniformly distributed random numbers. * @param alpha Alpha parameter of the distribution (this is a shape parameter). * @param theta Theta parameter of the distribution (this is a scale parameter). @@ -277,9 +280,7 @@ public class AhrensDieterMarsagliaTsangGammaSampler double alpha, double theta) { super(null); - delegate = alpha < 1 ? - new AhrensDieterGammaSampler(rng, alpha, theta) : - new MarsagliaTsangGammaSampler(rng, alpha, theta); + delegate = of(rng, alpha, theta); } /** {@inheritDoc} */ @@ -300,4 +301,22 @@ public class AhrensDieterMarsagliaTsangGammaSampler // Direct return of the optimised sampler return delegate.withUniformRandomProvider(rng); } + + /** + * Creates a new Gamma distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param alpha Alpha parameter of the distribution (this is a shape parameter). + * @param theta Theta parameter of the distribution (this is a scale parameter). + * @return the sampler + * @throws IllegalArgumentException if {@code alpha <= 0} or {@code theta <= 0} + */ + public static SharedStateContinuousSampler of(UniformRandomProvider rng, + double alpha, + double theta) { + // Each sampler should check the input arguments. + return alpha < 1 ? + new AhrensDieterGammaSampler(rng, alpha, theta) : + new MarsagliaTsangGammaSampler(rng, alpha, theta); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerLogNormalSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerLogNormalSampler.java index de8fc29..d4177d1 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerLogNormalSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerLogNormalSampler.java @@ -46,7 +46,7 @@ public class BoxMullerLogNormalSampler double scale, double shape) { super(null); - sampler = new LogNormalSampler(new BoxMullerNormalizedGaussianSampler(rng), + sampler = LogNormalSampler.of(BoxMullerNormalizedGaussianSampler.of(rng), scale, shape); } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java index d707670..39422cf 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalizedGaussianSampler.java @@ -81,4 +81,17 @@ public class BoxMullerNormalizedGaussianSampler public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new BoxMullerNormalizedGaussianSampler(rng); } + + /** + * Create a new normalised Gaussian sampler. + * + * @param <S> Sampler type. + * @param rng Generator of uniformly distributed random numbers. + * @return the sampler + */ + @SuppressWarnings("unchecked") + public static <S extends NormalizedGaussianSampler & SharedStateContinuousSampler> S + of(UniformRandomProvider rng) { + return (S) new BoxMullerNormalizedGaussianSampler(rng); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java index 6fe83e7..1a01e1f 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java @@ -207,4 +207,19 @@ public class ChengBetaSampler double b) { return Math.abs(a - b) <= Double.MIN_VALUE; } + + /** + * Creates a new Beta distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param alpha Distribution first shape parameter. + * @param beta Distribution second shape parameter. + * @return the sampler + * @throws IllegalArgumentException if {@code alpha <= 0} or {@code beta <= 0} + */ + public static SharedStateContinuousSampler of(UniformRandomProvider rng, + double alpha, + double beta) { + return new ChengBetaSampler(rng, alpha, beta); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java index 43a7ec9..4aea1ab 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSampler.java @@ -64,7 +64,21 @@ public class ContinuousUniformSampler /** {@inheritDoc} */ @Override - public ContinuousUniformSampler withUniformRandomProvider(UniformRandomProvider rng) { + public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { + return new ContinuousUniformSampler(rng, lo, hi); + } + + /** + * Creates a new continuous uniform distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param lo Lower bound. + * @param hi Higher bound. + * @return the sampler + */ + public static SharedStateContinuousSampler of(UniformRandomProvider rng, + double lo, + double hi) { return new ContinuousUniformSampler(rng, lo, hi); } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java index b9f6fad..2814799 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSampler.java @@ -139,6 +139,9 @@ public class DiscreteUniformSampler } /** + * This instance delegates sampling. Use the factory method + * {@link #of(UniformRandomProvider, int, int)} to create an optimal sampler. + * * @param rng Generator of uniformly distributed random numbers. * @param lower Lower bound (inclusive) of the distribution. * @param upper Upper bound (inclusive) of the distribution. @@ -148,17 +151,7 @@ public class DiscreteUniformSampler int lower, int upper) { super(null); - if (lower > upper) { - throw new IllegalArgumentException(lower + " > " + upper); - } - // Choose the algorithm depending on the range - final int range = (upper - lower) + 1; - delegate = range <= 0 ? - // The range is too wide to fit in a positive int (larger - // than 2^31); use a simple rejection method. - new LargeRangeDiscreteUniformSampler(rng, lower, upper) : - // Use a sample from the range added to the lower bound. - new SmallRangeDiscreteUniformSampler(rng, lower, range); + delegate = of(rng, lower, upper); } /** {@inheritDoc} */ @@ -179,4 +172,29 @@ public class DiscreteUniformSampler // Direct return of the optimised sampler return delegate.withUniformRandomProvider(rng); } + + /** + * Creates a new discrete uniform distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param lower Lower bound (inclusive) of the distribution. + * @param upper Upper bound (inclusive) of the distribution. + * @return the sampler + * @throws IllegalArgumentException if {@code lower > upper}. + */ + public static SharedStateDiscreteSampler of(UniformRandomProvider rng, + int lower, + int upper) { + if (lower > upper) { + throw new IllegalArgumentException(lower + " > " + upper); + } + // Choose the algorithm depending on the range + final int range = (upper - lower) + 1; + return range <= 0 ? + // The range is too wide to fit in a positive int (larger + // than 2^31); use a simple rejection method. + new LargeRangeDiscreteUniformSampler(rng, lower, upper) : + // Use a sample from the range added to the lower bound. + new SmallRangeDiscreteUniformSampler(rng, lower, range); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java index 91c29e7..6b70b7c 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GaussianSampler.java @@ -88,4 +88,24 @@ public class GaussianSampler implements SharedStateContinuousSampler { public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new GaussianSampler(rng, this); } + + /** + * Create a new normalised Gaussian sampler. + * + * <p>Note: The shared-state functionality is available if the {@link NormalizedGaussianSampler} + * is a {@link SharedStateSampler}. Otherwise a run-time exception will be thrown when the + * sampler is used to share state.</p> + * + * @param normalized Generator of N(0,1) Gaussian distributed random numbers. + * @param mean Mean of the Gaussian distribution. + * @param standardDeviation Standard deviation of the Gaussian distribution. + * @return the sampler + * @throws IllegalArgumentException if {@code standardDeviation <= 0} + * @see #withUniformRandomProvider(UniformRandomProvider) + */ + public static SharedStateContinuousSampler of(NormalizedGaussianSampler normalized, + double mean, + double standardDeviation) { + return new GaussianSampler(normalized, mean, standardDeviation); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java index 7cbca6b..a3f3339 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/GeometricSampler.java @@ -100,7 +100,7 @@ public final class GeometricSampler { // is noted in the class Javadoc that the use of a small p leads to truncation so // no checks are made for this case. final double exponentialMean = 1.0 / (-Math.log1p(-probabilityOfSuccess)); - exponentialSampler = new AhrensDieterExponentialSampler(rng, exponentialMean); + exponentialSampler = AhrensDieterExponentialSampler.of(rng, exponentialMean); } /** diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java index 4401d9e..c0761d9 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSampler.java @@ -96,4 +96,21 @@ public class InverseTransformContinuousSampler public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new InverseTransformContinuousSampler(rng, function); } + + /** + * Create a new inverse-transform continuous sampler. + * + * <p>To use the sampler to + * {@link org.apache.commons.rng.sampling.SharedStateSampler share state} the function must be + * suitable for concurrent use.</p> + * + * @param rng Generator of uniformly distributed random numbers. + * @param function Inverse cumulative probability function. + * @return the sampler + * @see #withUniformRandomProvider(UniformRandomProvider) + */ + public static SharedStateContinuousSampler of(UniformRandomProvider rng, + ContinuousInverseCumulativeProbabilityFunction function) { + return new InverseTransformContinuousSampler(rng, function); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java index 6067a8c..da7ee63 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSampler.java @@ -96,4 +96,21 @@ public class InverseTransformDiscreteSampler public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) { return new InverseTransformDiscreteSampler(rng, function); } + + /** + * Create a new inverse-transform discrete sampler. + * + * <p>To use the sampler to + * {@link org.apache.commons.rng.sampling.SharedStateSampler share state} the function must be + * suitable for concurrent use.</p> + * + * @param rng Generator of uniformly distributed random numbers. + * @param function Inverse cumulative probability function. + * @return the sampler + * @see #withUniformRandomProvider(UniformRandomProvider) + */ + public static SharedStateDiscreteSampler of(UniformRandomProvider rng, + DiscreteInverseCumulativeProbabilityFunction function) { + return new InverseTransformDiscreteSampler(rng, function); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java index a7b6d7c..ff84cc6 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSampler.java @@ -85,4 +85,19 @@ public class InverseTransformParetoSampler public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new InverseTransformParetoSampler(rng, this); } + + /** + * Creates a new Pareto distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param scale Scale of the distribution. + * @param shape Shape of the distribution. + * @return the sampler + * @throws IllegalArgumentException if {@code scale <= 0} or {@code shape <= 0} + */ + public static SharedStateContinuousSampler of(UniformRandomProvider rng, + double scale, + double shape) { + return new InverseTransformParetoSampler(rng, scale, shape); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java index bc71e5b..72b3da5 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSampler.java @@ -132,8 +132,8 @@ public class LargeMeanPoissonSampler } this.rng = rng; - gaussian = new ZigguratNormalizedGaussianSampler(rng); - exponential = new AhrensDieterExponentialSampler(rng, 1); + gaussian = ZigguratNormalizedGaussianSampler.of(rng); + exponential = AhrensDieterExponentialSampler.of(rng, 1); // Plain constructor uses the uncached function. factorialLog = NO_CACHE_FACTORIAL_LOG; @@ -177,8 +177,8 @@ public class LargeMeanPoissonSampler } this.rng = rng; - gaussian = new ZigguratNormalizedGaussianSampler(rng); - exponential = new AhrensDieterExponentialSampler(rng, 1); + gaussian = ZigguratNormalizedGaussianSampler.of(rng); + exponential = AhrensDieterExponentialSampler.of(rng, 1); // Plain constructor uses the uncached function. factorialLog = NO_CACHE_FACTORIAL_LOG; @@ -307,6 +307,19 @@ public class LargeMeanPoissonSampler } /** + * Creates a new Poisson distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param mean Mean. + * @return the sampler + * @throws IllegalArgumentException if {@code mean < 1} or {@code mean > 0.5 *} + * {@link Integer#MAX_VALUE}. + */ + public static SharedStateDiscreteSampler of(UniformRandomProvider rng, + double mean) { + return new LargeMeanPoissonSampler(rng, mean); + } + /** * Gets the initialisation state of the sampler. * * <p>The state is computed using an integer {@code lambda} value of diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java index 9bf9568..9fbfd90 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LogNormalSampler.java @@ -89,4 +89,24 @@ public class LogNormalSampler implements SharedStateContinuousSampler { public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new LogNormalSampler(rng, this); } + + /** + * Create a new log-normal distribution sampler. + * + * <p>Note: The shared-state functionality is available if the {@link NormalizedGaussianSampler} + * is a {@link SharedStateSampler}. Otherwise a run-time exception will be thrown when the + * sampler is used to share state.</p> + * + * @param gaussian N(0,1) generator. + * @param scale Scale of the log-normal distribution. + * @param shape Shape of the log-normal distribution. + * @return the sampler + * @throws IllegalArgumentException if {@code scale < 0} or {@code shape <= 0}. + * @see #withUniformRandomProvider(UniformRandomProvider) + */ + public static SharedStateContinuousSampler of(NormalizedGaussianSampler gaussian, + double scale, + double shape) { + return new LogNormalSampler(gaussian, scale, shape); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java index 7068052..516f67c 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalizedGaussianSampler.java @@ -90,4 +90,17 @@ public class MarsagliaNormalizedGaussianSampler public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new MarsagliaNormalizedGaussianSampler(rng); } + + /** + * Create a new normalised Gaussian sampler. + * + * @param <S> Sampler type. + * @param rng Generator of uniformly distributed random numbers. + * @return the sampler + */ + @SuppressWarnings("unchecked") + public static <S extends NormalizedGaussianSampler & SharedStateContinuousSampler> S + of(UniformRandomProvider rng) { + return (S) new MarsagliaNormalizedGaussianSampler(rng); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java index 6834db9..7fe581c 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSampler.java @@ -63,6 +63,9 @@ public class PoissonSampler private final SharedStateDiscreteSampler poissonSamplerDelegate; /** + * This instance delegates sampling. Use the factory method + * {@link #of(UniformRandomProvider, double)} to create an optimal sampler. + * * @param rng Generator of uniformly distributed random numbers. * @param mean Mean. * @throws IllegalArgumentException if {@code mean <= 0} or @@ -73,10 +76,7 @@ public class PoissonSampler super(null); // Delegate all work to specialised samplers. - // These should check the input arguments. - poissonSamplerDelegate = mean < PIVOT ? - new SmallMeanPoissonSampler(rng, mean) : - new LargeMeanPoissonSampler(rng, mean); + poissonSamplerDelegate = of(rng, mean); } /** {@inheritDoc} */ @@ -97,4 +97,21 @@ public class PoissonSampler // Direct return of the optimised sampler return poissonSamplerDelegate.withUniformRandomProvider(rng); } + + /** + * Creates a new Poisson distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param mean Mean. + * @return the sampler + * @throws IllegalArgumentException if {@code mean <= 0} or {@code mean >} + * {@link Integer#MAX_VALUE}. + */ + public static SharedStateDiscreteSampler of(UniformRandomProvider rng, + double mean) { + // Each sampler should check the input arguments. + return mean < PIVOT ? + SmallMeanPoissonSampler.of(rng, mean) : + LargeMeanPoissonSampler.of(rng, mean); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java index 748b2ba..184f8d5 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCache.java @@ -157,20 +157,20 @@ public class PoissonSamplerCache { // Ensure the same functionality as the PoissonSampler by // using a SmallMeanPoissonSampler under the switch point. if (mean < PoissonSampler.PIVOT) { - return new SmallMeanPoissonSampler(rng, mean); + return SmallMeanPoissonSampler.of(rng, mean); } if (mean > maxN) { // Outside the range of the cache. // This avoids extra parameter checks and handles the case when // the cache is empty or if Math.floor(mean) is not an integer. - return new LargeMeanPoissonSampler(rng, mean); + return LargeMeanPoissonSampler.of(rng, mean); } // Convert the mean into an integer. final int n = (int) Math.floor(mean); if (n < minN) { // Outside the lower range of the cache. - return new LargeMeanPoissonSampler(rng, mean); + return LargeMeanPoissonSampler.of(rng, mean); } // Look in the cache for a state that can be reused. diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java index fb8cb9d..7459c7b 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java @@ -199,6 +199,22 @@ public class RejectionInversionZipfSampler } /** + * Creates a new Zipf distribution sampler. + * + * @param rng Generator of uniformly distributed random numbers. + * @param numberOfElements Number of elements. + * @param exponent Exponent. + * @return the sampler + * @throws IllegalArgumentException if {@code numberOfElements <= 0} or + * {@code exponent <= 0}. + */ + public static SharedStateDiscreteSampler of(UniformRandomProvider rng, + int numberOfElements, + double exponent) { + return new RejectionInversionZipfSampler(rng, numberOfElements, exponent); + } + + /** * {@code H(x)} is defined as * <ul> * <li>{@code (x^(1 - exponent) - 1) / (1 - exponent)}, if {@code exponent != 1}</li> diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java index 331b6b0..d444003 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSampler.java @@ -56,7 +56,7 @@ public class SmallMeanPoissonSampler /** * @param rng Generator of uniformly distributed random numbers. * @param mean Mean. - * @throws IllegalArgumentException if {@code mean <= 0} or {@code Math.exp(-mean)} is not positive. + * @throws IllegalArgumentException if {@code mean <= 0} or {@code Math.exp(-mean) == 0} */ public SmallMeanPoissonSampler(UniformRandomProvider rng, double mean) { @@ -113,4 +113,17 @@ public class SmallMeanPoissonSampler public SharedStateDiscreteSampler withUniformRandomProvider(UniformRandomProvider rng) { return new SmallMeanPoissonSampler(rng, this); } + + /** + * Creates a new sampler for the Poisson distribution. + * + * @param rng Generator of uniformly distributed random numbers. + * @param mean Mean of the distribution. + * @return the sampler + * @throws IllegalArgumentException if {@code mean <= 0} or {@code Math.exp(-mean) == 0}. + */ + public static SharedStateDiscreteSampler of(UniformRandomProvider rng, + double mean) { + return new SmallMeanPoissonSampler(rng, mean); + } } diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java index 6b8588a..96c3626 100644 --- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java +++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSampler.java @@ -166,4 +166,17 @@ public class ZigguratNormalizedGaussianSampler public SharedStateContinuousSampler withUniformRandomProvider(UniformRandomProvider rng) { return new ZigguratNormalizedGaussianSampler(rng); } + + /** + * Create a new normalised Gaussian sampler. + * + * @param <S> Sampler type. + * @param rng Generator of uniformly distributed random numbers. + * @return the sampler + */ + @SuppressWarnings("unchecked") + public static <S extends NormalizedGaussianSampler & SharedStateContinuousSampler> S + of(UniformRandomProvider rng) { + return (S) new ZigguratNormalizedGaussianSampler(rng); + } } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java index 6fe5139..e509d50 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterExponentialSamplerTest.java @@ -34,9 +34,7 @@ public class AhrensDieterExponentialSamplerTest { final RestorableUniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); final double mean = 0; - @SuppressWarnings("unused") - final AhrensDieterExponentialSampler sampler = - new AhrensDieterExponentialSampler(rng, mean); + AhrensDieterExponentialSampler.of(rng, mean); } /** @@ -47,8 +45,8 @@ public class AhrensDieterExponentialSamplerTest { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final double mean = 1.23; - final AhrensDieterExponentialSampler sampler1 = - new AhrensDieterExponentialSampler(rng1, mean); + final SharedStateContinuousSampler sampler1 = + AhrensDieterExponentialSampler.of(rng1, mean); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java index 27a4198..f1290d0 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/AhrensDieterMarsagliaTsangGammaSamplerTest.java @@ -20,6 +20,7 @@ import org.apache.commons.rng.RestorableUniformRandomProvider; import org.apache.commons.rng.UniformRandomProvider; import org.apache.commons.rng.sampling.RandomAssert; import org.apache.commons.rng.simple.RandomSource; +import org.junit.Assert; import org.junit.Test; /** @@ -32,12 +33,10 @@ public class AhrensDieterMarsagliaTsangGammaSamplerTest { @Test(expected = IllegalArgumentException.class) public void testConstructorThrowsWithZeroAlpha() { final RestorableUniformRandomProvider rng = - RandomSource.create(RandomSource.SPLIT_MIX_64); + RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final double alpha = 0; final double theta = 1; - @SuppressWarnings("unused") - final AhrensDieterMarsagliaTsangGammaSampler sampler = - new AhrensDieterMarsagliaTsangGammaSampler(rng, alpha, theta); + AhrensDieterMarsagliaTsangGammaSampler.of(rng, alpha, theta); } /** @@ -46,12 +45,10 @@ public class AhrensDieterMarsagliaTsangGammaSamplerTest { @Test(expected = IllegalArgumentException.class) public void testConstructorThrowsWithZeroTheta() { final RestorableUniformRandomProvider rng = - RandomSource.create(RandomSource.SPLIT_MIX_64); + RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final double alpha = 1; final double theta = 0; - @SuppressWarnings("unused") - final AhrensDieterMarsagliaTsangGammaSampler sampler = - new AhrensDieterMarsagliaTsangGammaSampler(rng, alpha, theta); + AhrensDieterMarsagliaTsangGammaSampler.of(rng, alpha, theta); } /** @@ -79,9 +76,21 @@ public class AhrensDieterMarsagliaTsangGammaSamplerTest { private static void testSharedStateSampler(double alpha, double theta) { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); + // Use instance constructor not factory constructor to exercise 1.X public API final AhrensDieterMarsagliaTsangGammaSampler sampler1 = new AhrensDieterMarsagliaTsangGammaSampler(rng1, alpha, theta); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } + + /** + * Test the toString method. This is added to ensure coverage as the factory constructor + * used in other tests does not create an instance of the wrapper class. + */ + @Test + public void testToString() { + final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); + Assert.assertTrue(new AhrensDieterMarsagliaTsangGammaSampler(rng, 1.0, 2.0).toString() + .toLowerCase().contains("gamma")); + } } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java index 6e21e62..e928bec 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/BoxMullerNormalisedGaussianSamplerTest.java @@ -32,8 +32,8 @@ public class BoxMullerNormalisedGaussianSamplerTest { public void testSharedStateSampler() { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final BoxMullerNormalizedGaussianSampler sampler1 = - new BoxMullerNormalizedGaussianSampler(rng1); + final SharedStateContinuousSampler sampler1 = + BoxMullerNormalizedGaussianSampler.of(rng1); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java index cb630aa..8325244 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ChengBetaSamplerTest.java @@ -35,9 +35,7 @@ public class ChengBetaSamplerTest { RandomSource.create(RandomSource.SPLIT_MIX_64); final double alpha = 0; final double beta = 1; - @SuppressWarnings("unused") - final ChengBetaSampler sampler = - new ChengBetaSampler(rng, alpha, beta); + ChengBetaSampler.of(rng, alpha, beta); } /** @@ -49,9 +47,7 @@ public class ChengBetaSamplerTest { RandomSource.create(RandomSource.SPLIT_MIX_64); final double alpha = 1; final double beta = 0; - @SuppressWarnings("unused") - final ChengBetaSampler sampler = - new ChengBetaSampler(rng, alpha, beta); + ChengBetaSampler.of(rng, alpha, beta); } /** @@ -63,8 +59,8 @@ public class ChengBetaSamplerTest { final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final double alpha = 1.23; final double beta = 4.56; - final ChengBetaSampler sampler1 = - new ChengBetaSampler(rng1, alpha, beta); + final SharedStateContinuousSampler sampler1 = + ChengBetaSampler.of(rng1, alpha, beta); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplersList.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplersList.java index 2cd8325..f4ff9ae 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplersList.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplersList.java @@ -52,16 +52,16 @@ public final class ContinuousSamplersList { new BoxMullerGaussianSampler(RandomSource.create(RandomSource.MT), meanNormal, sigmaNormal)); // Gaussian ("Box-Muller"). add(LIST, new org.apache.commons.math3.distribution.NormalDistribution(unusedRng, meanNormal, sigmaNormal), - new GaussianSampler(new BoxMullerNormalizedGaussianSampler(RandomSource.create(RandomSource.MT)), - meanNormal, sigmaNormal)); + GaussianSampler.of(BoxMullerNormalizedGaussianSampler.of(RandomSource.create(RandomSource.MT)), + meanNormal, sigmaNormal)); // Gaussian ("Marsaglia"). add(LIST, new org.apache.commons.math3.distribution.NormalDistribution(unusedRng, meanNormal, sigmaNormal), - new GaussianSampler(new MarsagliaNormalizedGaussianSampler(RandomSource.create(RandomSource.MT)), - meanNormal, sigmaNormal)); + GaussianSampler.of(MarsagliaNormalizedGaussianSampler.of(RandomSource.create(RandomSource.MT)), + meanNormal, sigmaNormal)); // Gaussian ("Ziggurat"). add(LIST, new org.apache.commons.math3.distribution.NormalDistribution(unusedRng, meanNormal, sigmaNormal), - new GaussianSampler(new ZigguratNormalizedGaussianSampler(RandomSource.create(RandomSource.MT)), - meanNormal, sigmaNormal)); + GaussianSampler.of(ZigguratNormalizedGaussianSampler.of(RandomSource.create(RandomSource.MT)), + meanNormal, sigmaNormal)); // Beta ("inverse method"). final double alphaBeta = 4.3; @@ -70,16 +70,16 @@ public final class ContinuousSamplersList { RandomSource.create(RandomSource.ISAAC)); // Beta ("Cheng"). add(LIST, new org.apache.commons.math3.distribution.BetaDistribution(unusedRng, alphaBeta, betaBeta), - new ChengBetaSampler(RandomSource.create(RandomSource.MWC_256), alphaBeta, betaBeta)); + ChengBetaSampler.of(RandomSource.create(RandomSource.MWC_256), alphaBeta, betaBeta)); add(LIST, new org.apache.commons.math3.distribution.BetaDistribution(unusedRng, betaBeta, alphaBeta), - new ChengBetaSampler(RandomSource.create(RandomSource.WELL_19937_A), betaBeta, alphaBeta)); + ChengBetaSampler.of(RandomSource.create(RandomSource.WELL_19937_A), betaBeta, alphaBeta)); // Beta ("Cheng", alternate algorithm). final double alphaBetaAlt = 0.5678; final double betaBetaAlt = 0.1234; add(LIST, new org.apache.commons.math3.distribution.BetaDistribution(unusedRng, alphaBetaAlt, betaBetaAlt), - new ChengBetaSampler(RandomSource.create(RandomSource.WELL_512_A), alphaBetaAlt, betaBetaAlt)); + ChengBetaSampler.of(RandomSource.create(RandomSource.WELL_512_A), alphaBetaAlt, betaBetaAlt)); add(LIST, new org.apache.commons.math3.distribution.BetaDistribution(unusedRng, betaBetaAlt, alphaBetaAlt), - new ChengBetaSampler(RandomSource.create(RandomSource.WELL_19937_C), betaBetaAlt, alphaBetaAlt)); + ChengBetaSampler.of(RandomSource.create(RandomSource.WELL_19937_C), betaBetaAlt, alphaBetaAlt)); // Cauchy ("inverse method"). final double medianCauchy = 0.123; @@ -98,7 +98,7 @@ public final class ContinuousSamplersList { RandomSource.create(RandomSource.WELL_44497_A)); // Exponential. add(LIST, new org.apache.commons.math3.distribution.ExponentialDistribution(unusedRng, meanExp), - new AhrensDieterExponentialSampler(RandomSource.create(RandomSource.MT), meanExp)); + AhrensDieterExponentialSampler.of(RandomSource.create(RandomSource.MT), meanExp)); // F ("inverse method"). final int numDofF = 4; @@ -114,11 +114,11 @@ public final class ContinuousSamplersList { RandomSource.create(RandomSource.SPLIT_MIX_64)); // Gamma (alpha < 1). add(LIST, new org.apache.commons.math3.distribution.GammaDistribution(unusedRng, alphaGammaSmallerThanOne, thetaGamma), - new AhrensDieterMarsagliaTsangGammaSampler(RandomSource.create(RandomSource.XOR_SHIFT_1024_S), + AhrensDieterMarsagliaTsangGammaSampler.of(RandomSource.create(RandomSource.XOR_SHIFT_1024_S), alphaGammaSmallerThanOne, thetaGamma)); // Gamma (alpha > 1). add(LIST, new org.apache.commons.math3.distribution.GammaDistribution(unusedRng, alphaGammaLargerThanOne, thetaGamma), - new AhrensDieterMarsagliaTsangGammaSampler(RandomSource.create(RandomSource.WELL_44497_B), + AhrensDieterMarsagliaTsangGammaSampler.of(RandomSource.create(RandomSource.WELL_44497_B), alphaGammaLargerThanOne, thetaGamma)); // Gumbel ("inverse method"). @@ -149,16 +149,16 @@ public final class ContinuousSamplersList { new BoxMullerLogNormalSampler(RandomSource.create(RandomSource.XOR_SHIFT_1024_S), scaleLogNormal, shapeLogNormal)); // Log-normal ("Box-Muller"). add(LIST, new org.apache.commons.math3.distribution.LogNormalDistribution(unusedRng, scaleLogNormal, shapeLogNormal), - new LogNormalSampler(new BoxMullerNormalizedGaussianSampler(RandomSource.create(RandomSource.XOR_SHIFT_1024_S)), - scaleLogNormal, shapeLogNormal)); + LogNormalSampler.of(BoxMullerNormalizedGaussianSampler.of(RandomSource.create(RandomSource.XOR_SHIFT_1024_S)), + scaleLogNormal, shapeLogNormal)); // Log-normal ("Marsaglia"). add(LIST, new org.apache.commons.math3.distribution.LogNormalDistribution(unusedRng, scaleLogNormal, shapeLogNormal), - new LogNormalSampler(new MarsagliaNormalizedGaussianSampler(RandomSource.create(RandomSource.MT_64)), - scaleLogNormal, shapeLogNormal)); + LogNormalSampler.of(MarsagliaNormalizedGaussianSampler.of(RandomSource.create(RandomSource.MT_64)), + scaleLogNormal, shapeLogNormal)); // Log-normal ("Ziggurat"). add(LIST, new org.apache.commons.math3.distribution.LogNormalDistribution(unusedRng, scaleLogNormal, shapeLogNormal), - new LogNormalSampler(new ZigguratNormalizedGaussianSampler(RandomSource.create(RandomSource.MWC_256)), - scaleLogNormal, shapeLogNormal)); + LogNormalSampler.of(ZigguratNormalizedGaussianSampler.of(RandomSource.create(RandomSource.MWC_256)), + scaleLogNormal, shapeLogNormal)); // Logistic ("inverse method"). final double muLogistic = -123.456; @@ -180,7 +180,7 @@ public final class ContinuousSamplersList { RandomSource.create(RandomSource.TWO_CMRES_SELECT, null, 9, 11)); // Pareto. add(LIST, new org.apache.commons.math3.distribution.ParetoDistribution(unusedRng, scalePareto, shapePareto), - new InverseTransformParetoSampler(RandomSource.create(RandomSource.XOR_SHIFT_1024_S), scalePareto, shapePareto)); + InverseTransformParetoSampler.of(RandomSource.create(RandomSource.XOR_SHIFT_1024_S), scalePareto, shapePareto)); // T ("inverse method"). final double dofT = 0.76543; @@ -201,7 +201,7 @@ public final class ContinuousSamplersList { RandomSource.create(RandomSource.TWO_CMRES)); // Uniform. add(LIST, new org.apache.commons.math3.distribution.UniformRealDistribution(unusedRng, loUniform, hiUniform), - new ContinuousUniformSampler(RandomSource.create(RandomSource.MT_64), loUniform, hiUniform)); + ContinuousUniformSampler.of(RandomSource.create(RandomSource.MT_64), loUniform, hiUniform)); // Weibull ("inverse method"). final double alphaWeibull = 678.9; @@ -231,7 +231,7 @@ public final class ContinuousSamplersList { final org.apache.commons.math3.distribution.RealDistribution dist, UniformRandomProvider rng) { final ContinuousSampler inverseMethodSampler = - new InverseTransformContinuousSampler(rng, + InverseTransformContinuousSampler.of(rng, new ContinuousInverseCumulativeProbabilityFunction() { @Override public double inverseCumulativeProbability(double p) { diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java index 36b9eba..5e04f8b 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousUniformSamplerTest.java @@ -40,7 +40,7 @@ public class ContinuousUniformSamplerTest { private static void testSampleInRange(UniformRandomProvider rng, double low, double high) { - ContinuousUniformSampler sampler = new ContinuousUniformSampler(rng, low, high); + final SharedStateContinuousSampler sampler = ContinuousUniformSampler.of(rng, low, high); final double min = Math.min(low, high); final double max = Math.max(low, high); for (int i = 0; i < 10; i++) { @@ -58,8 +58,8 @@ public class ContinuousUniformSamplerTest { final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final double low = 1.23; final double high = 4.56; - final ContinuousUniformSampler sampler1 = - new ContinuousUniformSampler(rng1, low, high); + final SharedStateContinuousSampler sampler1 = + ContinuousUniformSampler.of(rng1, low, high); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java index 73c7cb7..b2be61e 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java @@ -94,14 +94,14 @@ public final class DiscreteSamplersList { // Uniform. add(LIST, new org.apache.commons.math3.distribution.UniformIntegerDistribution(unusedRng, loUniform, hiUniform), MathArrays.sequence(8, -3, 1), - new DiscreteUniformSampler(RandomSource.create(RandomSource.MT_64), loUniform, hiUniform)); + DiscreteUniformSampler.of(RandomSource.create(RandomSource.MT_64), loUniform, hiUniform)); // Uniform (large range). final int halfMax = Integer.MAX_VALUE / 2; final int hiLargeUniform = halfMax + 10; final int loLargeUniform = -hiLargeUniform; add(LIST, new org.apache.commons.math3.distribution.UniformIntegerDistribution(unusedRng, loLargeUniform, hiLargeUniform), MathArrays.sequence(20, -halfMax, halfMax / 10), - new DiscreteUniformSampler(RandomSource.create(RandomSource.WELL_1024_A), loLargeUniform, hiLargeUniform)); + DiscreteUniformSampler.of(RandomSource.create(RandomSource.WELL_1024_A), loLargeUniform, hiLargeUniform)); // Zipf ("inverse method"). final int numElementsZipf = 5; @@ -112,12 +112,12 @@ public final class DiscreteSamplersList { // Zipf. add(LIST, new org.apache.commons.math3.distribution.ZipfDistribution(unusedRng, numElementsZipf, exponentZipf), MathArrays.sequence(5, 1, 1), - new RejectionInversionZipfSampler(RandomSource.create(RandomSource.WELL_19937_C), numElementsZipf, exponentZipf)); + RejectionInversionZipfSampler.of(RandomSource.create(RandomSource.WELL_19937_C), numElementsZipf, exponentZipf)); // Zipf (exponent close to 1). final double exponentCloseToOneZipf = 1 - 1e-10; add(LIST, new org.apache.commons.math3.distribution.ZipfDistribution(unusedRng, numElementsZipf, exponentCloseToOneZipf), MathArrays.sequence(5, 1, 1), - new RejectionInversionZipfSampler(RandomSource.create(RandomSource.WELL_19937_C), numElementsZipf, exponentCloseToOneZipf)); + RejectionInversionZipfSampler.of(RandomSource.create(RandomSource.WELL_19937_C), numElementsZipf, exponentCloseToOneZipf)); // Poisson ("inverse method"). final double epsilonPoisson = org.apache.commons.math3.distribution.PoissonDistribution.DEFAULT_EPSILON; @@ -129,11 +129,11 @@ public final class DiscreteSamplersList { // Poisson. add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, meanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(10, 0, 1), - new PoissonSampler(RandomSource.create(RandomSource.KISS), meanPoisson)); + PoissonSampler.of(RandomSource.create(RandomSource.KISS), meanPoisson)); // Dedicated small mean poisson sampler add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, meanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(10, 0, 1), - new SmallMeanPoissonSampler(RandomSource.create(RandomSource.XO_SHI_RO_256_PLUS), meanPoisson)); + SmallMeanPoissonSampler.of(RandomSource.create(RandomSource.XO_SHI_RO_256_PLUS), meanPoisson)); add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, meanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(10, 0, 1), KempSmallMeanPoissonSampler.of(RandomSource.create(RandomSource.XO_SHI_RO_128_PLUS), meanPoisson)); @@ -144,11 +144,11 @@ public final class DiscreteSamplersList { final double largeMeanPoisson = 67.89; add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, largeMeanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(50, (int) (largeMeanPoisson - 25), 1), - new PoissonSampler(RandomSource.create(RandomSource.SPLIT_MIX_64), largeMeanPoisson)); + PoissonSampler.of(RandomSource.create(RandomSource.SPLIT_MIX_64), largeMeanPoisson)); // Dedicated large mean poisson sampler add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, largeMeanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(50, (int) (largeMeanPoisson - 25), 1), - new LargeMeanPoissonSampler(RandomSource.create(RandomSource.SPLIT_MIX_64), largeMeanPoisson)); + LargeMeanPoissonSampler.of(RandomSource.create(RandomSource.SPLIT_MIX_64), largeMeanPoisson)); add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, largeMeanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(50, (int) (largeMeanPoisson - 25), 1), MarsagliaTsangWangDiscreteSampler.Poisson.of(RandomSource.create(RandomSource.XO_RO_SHI_RO_128_PLUS), largeMeanPoisson)); @@ -156,11 +156,11 @@ public final class DiscreteSamplersList { final double veryLargeMeanPoisson = 543.21; add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, veryLargeMeanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(100, (int) (veryLargeMeanPoisson - 50), 1), - new PoissonSampler(RandomSource.create(RandomSource.SPLIT_MIX_64), veryLargeMeanPoisson)); + PoissonSampler.of(RandomSource.create(RandomSource.SPLIT_MIX_64), veryLargeMeanPoisson)); // Dedicated large mean poisson sampler add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, veryLargeMeanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(100, (int) (veryLargeMeanPoisson - 50), 1), - new LargeMeanPoissonSampler(RandomSource.create(RandomSource.SPLIT_MIX_64), veryLargeMeanPoisson)); + LargeMeanPoissonSampler.of(RandomSource.create(RandomSource.SPLIT_MIX_64), veryLargeMeanPoisson)); add(LIST, new org.apache.commons.math3.distribution.PoissonDistribution(unusedRng, veryLargeMeanPoisson, epsilonPoisson, maxIterationsPoisson), MathArrays.sequence(100, (int) (veryLargeMeanPoisson - 50), 1), MarsagliaTsangWangDiscreteSampler.Poisson.of(RandomSource.create(RandomSource.XO_RO_SHI_RO_64_SS), veryLargeMeanPoisson)); @@ -198,7 +198,7 @@ public final class DiscreteSamplersList { int[] points, UniformRandomProvider rng) { final DiscreteSampler inverseMethodSampler = - new InverseTransformDiscreteSampler(rng, + InverseTransformDiscreteSampler.of(rng, new DiscreteInverseCumulativeProbabilityFunction() { @Override public int inverseCumulativeProbability(double p) { diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java index 9b76e7a..0fd662a 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteUniformSamplerTest.java @@ -19,6 +19,7 @@ package org.apache.commons.rng.sampling.distribution; import org.apache.commons.rng.UniformRandomProvider; import org.apache.commons.rng.sampling.RandomAssert; import org.apache.commons.rng.simple.RandomSource; +import org.junit.Assert; import org.junit.Test; /** @@ -32,9 +33,8 @@ public class DiscreteUniformSamplerTest { public void testConstructorThrowsWithLowerAboveUpper() { final int upper = 55; final int lower = upper + 1; - final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); - @SuppressWarnings("unused") - DiscreteUniformSampler sampler = new DiscreteUniformSampler(rng, lower, upper); + final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); + DiscreteUniformSampler.of(rng, lower, upper); } /** @@ -62,9 +62,20 @@ public class DiscreteUniformSamplerTest { private static void testSharedStateSampler(int lower, int upper) { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final DiscreteUniformSampler sampler1 = + // Use instance constructor not factory constructor to exercise 1.X public API + final SharedStateDiscreteSampler sampler1 = new DiscreteUniformSampler(rng1, lower, upper); final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } + + /** + * Test the toString method. This is added to ensure coverage as the factory constructor + * used in other tests does not create an instance of the wrapper class. + */ + @Test + public void testToString() { + final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); + Assert.assertTrue(new DiscreteUniformSampler(rng, 1, 2).toString().toLowerCase().contains("uniform")); + } } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java index 28ca3c0..cbf1606 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/GaussianSamplerTest.java @@ -34,12 +34,10 @@ public class GaussianSamplerTest { public void testConstructorThrowsWithZeroStandardDeviation() { final RestorableUniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); - final NormalizedGaussianSampler gauss = new ZigguratNormalizedGaussianSampler(rng); + final NormalizedGaussianSampler gauss = ZigguratNormalizedGaussianSampler.of(rng); final double mean = 1; final double standardDeviation = 0; - @SuppressWarnings("unused") - final GaussianSampler sampler = - new GaussianSampler(gauss, mean, standardDeviation); + GaussianSampler.of(gauss, mean, standardDeviation); } /** @@ -49,11 +47,11 @@ public class GaussianSamplerTest { public void testSharedStateSampler() { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final NormalizedGaussianSampler gauss = new ZigguratNormalizedGaussianSampler(rng1); + final NormalizedGaussianSampler gauss = ZigguratNormalizedGaussianSampler.of(rng1); final double mean = 1.23; final double standardDeviation = 4.56; - final GaussianSampler sampler1 = - new GaussianSampler(gauss, mean, standardDeviation); + final SharedStateContinuousSampler sampler1 = + GaussianSampler.of(gauss, mean, standardDeviation); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } @@ -73,8 +71,8 @@ public class GaussianSamplerTest { }; final double mean = 1.23; final double standardDeviation = 4.56; - final GaussianSampler sampler1 = - new GaussianSampler(gauss, mean, standardDeviation); + final SharedStateContinuousSampler sampler1 = + GaussianSampler.of(gauss, mean, standardDeviation); sampler1.withUniformRandomProvider(rng2); } @@ -88,8 +86,8 @@ public class GaussianSamplerTest { final NormalizedGaussianSampler gauss = new BadSharedStateNormalizedGaussianSampler(); final double mean = 1.23; final double standardDeviation = 4.56; - final GaussianSampler sampler1 = - new GaussianSampler(gauss, mean, standardDeviation); + final SharedStateContinuousSampler sampler1 = + GaussianSampler.of(gauss, mean, standardDeviation); sampler1.withUniformRandomProvider(rng2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java index 99938cf..ad4b033 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformContinuousSamplerTest.java @@ -39,8 +39,8 @@ public class InverseTransformContinuousSamplerTest { }; final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final InverseTransformContinuousSampler sampler1 = - new InverseTransformContinuousSampler(rng1, function); + final SharedStateContinuousSampler sampler1 = + InverseTransformContinuousSampler.of(rng1, function); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java index 778ffe5..1ed4475 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformDiscreteSamplerTest.java @@ -39,8 +39,8 @@ public class InverseTransformDiscreteSamplerTest { }; final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final InverseTransformDiscreteSampler sampler1 = - new InverseTransformDiscreteSampler(rng1, function); + final SharedStateDiscreteSampler sampler1 = + InverseTransformDiscreteSampler.of(rng1, function); final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java index 3837d1d..22c3303 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/InverseTransformParetoSamplerTest.java @@ -35,9 +35,7 @@ public class InverseTransformParetoSamplerTest { RandomSource.create(RandomSource.SPLIT_MIX_64); final double scale = 0; final double shape = 1; - @SuppressWarnings("unused") - final InverseTransformParetoSampler sampler = - new InverseTransformParetoSampler(rng, scale, shape); + InverseTransformParetoSampler.of(rng, scale, shape); } /** @@ -49,9 +47,7 @@ public class InverseTransformParetoSamplerTest { RandomSource.create(RandomSource.SPLIT_MIX_64); final double scale = 1; final double shape = 0; - @SuppressWarnings("unused") - final InverseTransformParetoSampler sampler = - new InverseTransformParetoSampler(rng, scale, shape); + InverseTransformParetoSampler.of(rng, scale, shape); } /** @@ -63,8 +59,8 @@ public class InverseTransformParetoSamplerTest { final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final double scale = 1.23; final double shape = 4.56; - final InverseTransformParetoSampler sampler1 = - new InverseTransformParetoSampler(rng1, scale, shape); + final SharedStateContinuousSampler sampler1 = + InverseTransformParetoSampler.of(rng1, scale, shape); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java index 9a8c674..034a8f1 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LargeMeanPoissonSamplerTest.java @@ -41,8 +41,7 @@ public class LargeMeanPoissonSamplerTest { final RestorableUniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); final double mean = Integer.MAX_VALUE / 2 + 1; - @SuppressWarnings("unused") - LargeMeanPoissonSampler sampler = new LargeMeanPoissonSampler(rng, mean); + LargeMeanPoissonSampler.of(rng, mean); } /** @@ -53,8 +52,7 @@ public class LargeMeanPoissonSamplerTest { final RestorableUniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); final double mean = Math.nextAfter(1, -1); - @SuppressWarnings("unused") - LargeMeanPoissonSampler sampler = new LargeMeanPoissonSampler(rng, mean); + LargeMeanPoissonSampler.of(rng, mean); } /** @@ -131,17 +129,15 @@ public class LargeMeanPoissonSamplerTest { final RestorableUniformRandomProvider rng1, final RestorableUniformRandomProvider rng2, double mean) { - final DiscreteSampler s1 = new LargeMeanPoissonSampler(rng1, mean); + final LargeMeanPoissonSampler s1 = new LargeMeanPoissonSampler(rng1, mean); final int n = (int) Math.floor(mean); final double lambdaFractional = mean - n; - final LargeMeanPoissonSamplerState state1 = ((LargeMeanPoissonSampler)s1).getState(); - final DiscreteSampler s2 = new LargeMeanPoissonSampler(rng2, state1, lambdaFractional); - final LargeMeanPoissonSamplerState state2 = ((LargeMeanPoissonSampler)s2).getState(); + final LargeMeanPoissonSamplerState state1 = s1.getState(); + final LargeMeanPoissonSampler s2 = new LargeMeanPoissonSampler(rng2, state1, lambdaFractional); + final LargeMeanPoissonSamplerState state2 = s2.getState(); Assert.assertEquals("State lambdas are not equal", state1.getLambda(), state2.getLambda()); Assert.assertNotSame("States are the same object", state1, state2); - for (int j = 0; j < 10; j++) { - Assert.assertEquals("Not the same sample", s1.sample(), s2.sample()); - } + RandomAssert.assertProduceSameSequence(s1, s2); } /** @@ -169,8 +165,8 @@ public class LargeMeanPoissonSamplerTest { private static void testSharedStateSampler(double mean) { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final LargeMeanPoissonSampler sampler1 = - new LargeMeanPoissonSampler(rng1, mean); + final SharedStateDiscreteSampler sampler1 = + LargeMeanPoissonSampler.of(rng1, mean); final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java index 3da6447..4bc093d 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LogNormalSamplerTest.java @@ -34,12 +34,10 @@ public class LogNormalSamplerTest { public void testConstructorThrowsWithNegativeScale() { final RestorableUniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); - final NormalizedGaussianSampler gauss = new ZigguratNormalizedGaussianSampler(rng); + final NormalizedGaussianSampler gauss = ZigguratNormalizedGaussianSampler.of(rng); final double scale = -1e-6; final double shape = 1; - @SuppressWarnings("unused") - final LogNormalSampler sampler = - new LogNormalSampler(gauss, scale, shape); + LogNormalSampler.of(gauss, scale, shape); } /** @@ -49,12 +47,10 @@ public class LogNormalSamplerTest { public void testConstructorThrowsWithZeroShape() { final RestorableUniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); - final NormalizedGaussianSampler gauss = new ZigguratNormalizedGaussianSampler(rng); + final NormalizedGaussianSampler gauss = ZigguratNormalizedGaussianSampler.of(rng); final double scale = 1; final double shape = 0; - @SuppressWarnings("unused") - final LogNormalSampler sampler = - new LogNormalSampler(gauss, scale, shape); + LogNormalSampler.of(gauss, scale, shape); } /** @@ -64,11 +60,11 @@ public class LogNormalSamplerTest { public void testSharedStateSampler() { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final NormalizedGaussianSampler gauss = new ZigguratNormalizedGaussianSampler(rng1); + final NormalizedGaussianSampler gauss = ZigguratNormalizedGaussianSampler.of(rng1); final double scale = 1.23; final double shape = 4.56; - final LogNormalSampler sampler1 = - new LogNormalSampler(gauss, scale, shape); + final SharedStateContinuousSampler sampler1 = + LogNormalSampler.of(gauss, scale, shape); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } @@ -88,8 +84,8 @@ public class LogNormalSamplerTest { }; final double scale = 1.23; final double shape = 4.56; - final LogNormalSampler sampler1 = - new LogNormalSampler(gauss, scale, shape); + final SharedStateContinuousSampler sampler1 = + LogNormalSampler.of(gauss, scale, shape); sampler1.withUniformRandomProvider(rng2); } @@ -103,8 +99,8 @@ public class LogNormalSamplerTest { final NormalizedGaussianSampler gauss = new BadSharedStateNormalizedGaussianSampler(); final double scale = 1.23; final double shape = 4.56; - final LogNormalSampler sampler1 = - new LogNormalSampler(gauss, scale, shape); + final SharedStateContinuousSampler sampler1 = + LogNormalSampler.of(gauss, scale, shape); sampler1.withUniformRandomProvider(rng2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java index 1155ce4..ae58bd0 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/MarsagliaNormalisedGaussianSamplerTest.java @@ -32,8 +32,8 @@ public class MarsagliaNormalisedGaussianSamplerTest { public void testSharedStateSampler() { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final MarsagliaNormalizedGaussianSampler sampler1 = - new MarsagliaNormalizedGaussianSampler(rng1); + final SharedStateContinuousSampler sampler1 = + MarsagliaNormalizedGaussianSampler.of(rng1); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java index 2fe8a00..54c6fbf 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerCacheTest.java @@ -384,7 +384,7 @@ public class PoissonSamplerCacheTest { final RestorableUniformRandomProvider rng2, PoissonSamplerCache cache, double mean) { - final DiscreteSampler s1 = new PoissonSampler(rng1, mean); + final DiscreteSampler s1 = PoissonSampler.of(rng1, mean); final DiscreteSampler s2 = cache.createPoissonSampler(rng2, mean); for (int j = 0; j < 10; j++) { Assert.assertEquals(s1.sample(), s2.sample()); diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java index 362397d..4f433f3 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/PoissonSamplerTest.java @@ -19,8 +19,10 @@ package org.apache.commons.rng.sampling.distribution; import org.apache.commons.rng.UniformRandomProvider; import org.apache.commons.rng.sampling.RandomAssert; import org.apache.commons.rng.simple.RandomSource; +import org.junit.Assert; import org.junit.Test; + /** * This test checks the {@link PoissonSampler} can be created * from a saved state. @@ -50,9 +52,20 @@ public class PoissonSamplerTest { private static void testSharedStateSampler(double mean) { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final PoissonSampler sampler1 = + // Use instance constructor not factory constructor to exercise 1.X public API + final SharedStateDiscreteSampler sampler1 = new PoissonSampler(rng1, mean); final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } + + /** + * Test the toString method. This is added to ensure coverage as the factory constructor + * used in other tests does not create an instance of the wrapper class. + */ + @Test + public void testToString() { + final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); + Assert.assertTrue(new PoissonSampler(rng, 1.23).toString().toLowerCase().contains("poisson")); + } } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java index 15621da..b75f70c 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSamplerTest.java @@ -35,9 +35,7 @@ public class RejectionInversionZipfSamplerTest { RandomSource.create(RandomSource.SPLIT_MIX_64); final int numberOfElements = 0; final double exponent = 1; - @SuppressWarnings("unused") - final RejectionInversionZipfSampler sampler = - new RejectionInversionZipfSampler(rng, numberOfElements, exponent); + RejectionInversionZipfSampler.of(rng, numberOfElements, exponent); } /** @@ -49,9 +47,7 @@ public class RejectionInversionZipfSamplerTest { RandomSource.create(RandomSource.SPLIT_MIX_64); final int numberOfElements = 1; final double exponent = 0; - @SuppressWarnings("unused") - final RejectionInversionZipfSampler sampler = - new RejectionInversionZipfSampler(rng, numberOfElements, exponent); + RejectionInversionZipfSampler.of(rng, numberOfElements, exponent); } /** @@ -63,8 +59,8 @@ public class RejectionInversionZipfSamplerTest { final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final int numberOfElements = 7; final double exponent = 1.23; - final RejectionInversionZipfSampler sampler1 = - new RejectionInversionZipfSampler(rng1, numberOfElements, exponent); + final SharedStateDiscreteSampler sampler1 = + RejectionInversionZipfSampler.of(rng1, numberOfElements, exponent); final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java index f21bf95..4b0f677 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/SmallMeanPoissonSamplerTest.java @@ -37,8 +37,7 @@ public class SmallMeanPoissonSamplerTest { // Note: p0 = Math.exp(-mean) => mean = -Math.log(p0). // Add to the limit on the mean to cause p0 to be zero. final double mean = -Math.log(p0) + 1; - @SuppressWarnings("unused") - SmallMeanPoissonSampler sampler = new SmallMeanPoissonSampler(rng, mean); + SmallMeanPoissonSampler.of(rng, mean); } /** @@ -49,8 +48,7 @@ public class SmallMeanPoissonSamplerTest { final UniformRandomProvider rng = RandomSource.create(RandomSource.SPLIT_MIX_64); final double mean = 0; - @SuppressWarnings("unused") - SmallMeanPoissonSampler sampler = new SmallMeanPoissonSampler(rng, mean); + SmallMeanPoissonSampler.of(rng, mean); } /** @@ -73,7 +71,7 @@ public class SmallMeanPoissonSamplerTest { // CHECKSTYLE: resume all }; for (double mean : new double[] {0.5, 1, 1.5, 2.2}) { - final SmallMeanPoissonSampler sampler = new SmallMeanPoissonSampler(rng, mean); + final SharedStateDiscreteSampler sampler = SmallMeanPoissonSampler.of(rng, mean); final int expected = (int) Math.ceil(1000 * mean); Assert.assertEquals(expected, sampler.sample()); } @@ -87,8 +85,8 @@ public class SmallMeanPoissonSamplerTest { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final double mean = 1.23; - final SmallMeanPoissonSampler sampler1 = - new SmallMeanPoissonSampler(rng1, mean); + final SharedStateDiscreteSampler sampler1 = + SmallMeanPoissonSampler.of(rng1, mean); final SharedStateDiscreteSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java index 1772de4..a223ebe 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ZigguratNormalizedGaussianSamplerTest.java @@ -45,7 +45,7 @@ public class ZigguratNormalizedGaussianSamplerTest { }; // Infinite loop (in v1.1). - new ZigguratNormalizedGaussianSampler(bad).sample(); + ZigguratNormalizedGaussianSampler.of(bad).sample(); } /** @@ -55,8 +55,8 @@ public class ZigguratNormalizedGaussianSamplerTest { public void testSharedStateSampler() { final UniformRandomProvider rng1 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); final UniformRandomProvider rng2 = RandomSource.create(RandomSource.SPLIT_MIX_64, 0L); - final ZigguratNormalizedGaussianSampler sampler1 = - new ZigguratNormalizedGaussianSampler(rng1); + final SharedStateContinuousSampler sampler1 = + ZigguratNormalizedGaussianSampler.of(rng1); final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2); RandomAssert.assertProduceSameSequence(sampler1, sampler2); } diff --git a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/ThreadLocalRandomSource.java b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/ThreadLocalRandomSource.java index ee6054c..8a2c7dd 100644 --- a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/ThreadLocalRandomSource.java +++ b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/ThreadLocalRandomSource.java @@ -37,7 +37,7 @@ import org.apache.commons.rng.UniformRandomProvider; * * // One-time Poisson sample * double mean = 12.3; - * int counts = new PoissonSampler(rng, mean).sample(); + * int counts = PoissonSampler.of(rng, mean).sample(); * </code></pre> * * <p>Note if the {@link RandomSource} requires additional arguments then it is not @@ -58,7 +58,7 @@ import org.apache.commons.rng.UniformRandomProvider; * * // One-time Poisson sample using a thread-safe random number generator * double mean = 12.3; - * int counts = new PoissonSampler(rng.get(), mean).sample(); + * int counts = PoissonSampler.of(rng.get(), mean).sample(); * </code></pre> * * @since 1.3