RNG-53: Deprecate class "SamplerBase".
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 c3b2387..7927d35 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
@@ -20,6 +20,8 @@
/**
* Sampling from an <a href="http://mathworld.wolfram.com/ExponentialDistribution.html">exponential distribution</a>.
+ *
+ * @since 1.0
*/
public class AhrensDieterExponentialSampler
extends SamplerBase
@@ -39,6 +41,8 @@
private static final double[] EXPONENTIAL_SA_QI = new double[16];
/** The mean of this distribution. */
private final double mean;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* Initialize tables.
@@ -63,7 +67,8 @@
*/
public AhrensDieterExponentialSampler(UniformRandomProvider rng,
double mean) {
- super(rng);
+ super(null);
+ this.rng = rng;
this.mean = mean;
}
@@ -72,7 +77,7 @@
public double sample() {
// Step 1:
double a = 0;
- double u = nextDouble();
+ double u = rng.nextDouble();
// Step 2 and 3:
while (u < 0.5) {
@@ -90,13 +95,13 @@
// Step 6:
int i = 0; // Should be 1, be we iterate before it in while using 0.
- double u2 = nextDouble();
+ double u2 = rng.nextDouble();
double umin = u2;
// Step 7 and 8:
do {
++i;
- u2 = nextDouble();
+ u2 = rng.nextDouble();
if (u2 < umin) {
umin = u2;
@@ -111,6 +116,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Ahrens-Dieter Exponential deviate [" + super.toString() + "]";
+ return "Ahrens-Dieter Exponential deviate [" + rng.toString() + "]";
}
}
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 cbe327c..d34902d 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
@@ -38,6 +38,8 @@
* </blockquote>
* </li>
* </ul>
+ *
+ * @since 1.0
*/
public class AhrensDieterMarsagliaTsangGammaSampler
extends SamplerBase
@@ -58,6 +60,8 @@
private final double cOptim;
/** Gaussian sampling. */
private final NormalizedGaussianSampler gaussian;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -67,7 +71,8 @@
public AhrensDieterMarsagliaTsangGammaSampler(UniformRandomProvider rng,
double alpha,
double theta) {
- super(rng);
+ super(null);
+ this.rng = rng;
this.alpha = alpha;
this.theta = theta;
gaussian = new ZigguratNormalizedGaussianSampler(rng);
@@ -85,14 +90,14 @@
while (true) {
// Step 1:
- final double u = nextDouble();
+ final double u = rng.nextDouble();
final double p = bGSOptim * u;
if (p <= 1) {
// Step 2:
final double x = Math.pow(p, oneOverTheta);
- final double u2 = nextDouble();
+ final double u2 = rng.nextDouble();
if (u2 > Math.exp(-x)) {
// Reject.
@@ -104,7 +109,7 @@
// Step 3:
final double x = -Math.log((bGSOptim - p) * oneOverTheta);
- final double u2 = nextDouble();
+ final double u2 = rng.nextDouble();
if (u2 > Math.pow(x, theta - 1)) {
// Reject.
@@ -125,7 +130,7 @@
}
final double x2 = x * x;
- final double u = nextDouble();
+ final double u = rng.nextDouble();
// Squeeze.
if (u < 1 - 0.0331 * x2 * x2) {
@@ -142,6 +147,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Ahrens-Dieter-Marsaglia-Tsang Gamma deviate [" + super.toString() + "]";
+ return "Ahrens-Dieter-Marsaglia-Tsang Gamma deviate [" + rng.toString() + "]";
}
}
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerGaussianSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerGaussianSampler.java
index 489cda3..acddb03 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerGaussianSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerGaussianSampler.java
@@ -22,7 +22,9 @@
* <a href="https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform">
* Box-Muller algorithm</a> for sampling from a Gaussian distribution.
*
- * @deprecated since v1.1. Please use {@link BoxMullerNormalizedGaussianSampler}
+ * @since 1.0
+ *
+ * @deprecated Since v1.1. Please use {@link BoxMullerNormalizedGaussianSampler}
* and {@link GaussianSampler} instead.
*/
@Deprecated
@@ -35,6 +37,8 @@
private final double mean;
/** standardDeviation. */
private final double standardDeviation;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -44,7 +48,8 @@
public BoxMullerGaussianSampler(UniformRandomProvider rng,
double mean,
double standardDeviation) {
- super(rng);
+ super(null);
+ this.rng = rng;
this.mean = mean;
this.standardDeviation = standardDeviation;
}
@@ -56,8 +61,8 @@
if (Double.isNaN(nextGaussian)) {
// Generate a pair of Gaussian numbers.
- final double x = nextDouble();
- final double y = nextDouble();
+ final double x = rng.nextDouble();
+ final double y = rng.nextDouble();
final double alpha = 2 * Math.PI * x;
final double r = Math.sqrt(-2 * Math.log(y));
@@ -81,6 +86,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Box-Muller Gaussian deviate [" + super.toString() + "]";
+ return "Box-Muller Gaussian deviate [" + rng.toString() + "]";
}
}
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 4be25fd..34953ad 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
@@ -27,7 +27,11 @@
*/
@Deprecated
public class BoxMullerLogNormalSampler
- extends LogNormalSampler {
+ extends SamplerBase
+ implements ContinuousSampler {
+ /** Delegate. */
+ private final ContinuousSampler sampler;
+
/**
* @param rng Generator of uniformly distributed random numbers.
* @param scale Scale of the log-normal distribution.
@@ -36,7 +40,20 @@
public BoxMullerLogNormalSampler(UniformRandomProvider rng,
double scale,
double shape) {
- super(new BoxMullerNormalizedGaussianSampler(rng),
- scale, shape);
+ super(null);
+ sampler = new LogNormalSampler(new BoxMullerNormalizedGaussianSampler(rng),
+ scale, shape);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public double sample() {
+ return sampler.sample();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return sampler.toString();
}
}
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 43882fb..78a6b74 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
@@ -26,16 +26,17 @@
* @since 1.1
*/
public class BoxMullerNormalizedGaussianSampler
- extends SamplerBase
implements NormalizedGaussianSampler {
/** Next gaussian. */
private double nextGaussian = Double.NaN;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
*/
public BoxMullerNormalizedGaussianSampler(UniformRandomProvider rng) {
- super(rng);
+ this.rng = rng;
}
/** {@inheritDoc} */
@@ -45,8 +46,8 @@
if (Double.isNaN(nextGaussian)) {
// Generate a pair of Gaussian numbers.
- final double x = nextDouble();
- final double y = nextDouble();
+ final double x = rng.nextDouble();
+ final double y = rng.nextDouble();
final double alpha = 2 * Math.PI * x;
final double r = Math.sqrt(-2 * Math.log(y));
@@ -70,6 +71,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Box-Muller normalized Gaussian deviate [" + super.toString() + "]";
+ return "Box-Muller normalized Gaussian deviate [" + rng.toString() + "]";
}
}
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 1b4249a..ccee2c5 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
@@ -38,6 +38,8 @@
private final double alphaShape;
/** Second shape parameter. */
private final double betaShape;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* Creates a sampler instance.
@@ -49,7 +51,8 @@
public ChengBetaSampler(UniformRandomProvider rng,
double alpha,
double beta) {
- super(rng);
+ super(null);
+ this.rng = rng;
alphaShape = alpha;
betaShape = beta;
}
@@ -70,7 +73,7 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Cheng Beta deviate [" + super.toString() + "]";
+ return "Cheng Beta deviate [" + rng.toString() + "]";
}
/**
@@ -91,8 +94,8 @@
double w;
double t;
do {
- final double u1 = nextDouble();
- final double u2 = nextDouble();
+ final double u1 = rng.nextDouble();
+ final double u2 = rng.nextDouble();
final double v = beta * (Math.log(u1) - Math.log1p(-u1));
w = a * Math.exp(v);
final double z = u1 * u1 * u2;
@@ -131,8 +134,8 @@
double w;
while (true) {
- final double u1 = nextDouble();
- final double u2 = nextDouble();
+ final double u1 = rng.nextDouble();
+ final double u2 = rng.nextDouble();
final double y = u1 * u2;
final double z = u1 * y;
if (u1 < 0.5) {
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 4b59e99..57b7488 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
@@ -28,6 +28,8 @@
private final double lo;
/** Higher bound. */
private final double hi;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -37,7 +39,8 @@
public ContinuousUniformSampler(UniformRandomProvider rng,
double lo,
double hi) {
- super(rng);
+ super(null);
+ this.rng = rng;
this.lo = lo;
this.hi = hi;
}
@@ -45,13 +48,13 @@
/** {@inheritDoc} */
@Override
public double sample() {
- final double u = nextDouble();
+ final double u = rng.nextDouble();
return u * hi + (1 - u) * lo;
}
/** {@inheritDoc} */
@Override
public String toString() {
- return "Uniform deviate [" + super.toString() + "]";
+ return "Uniform deviate [" + rng.toString() + "]";
}
}
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 5ee69be..6ff5ec7 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
@@ -29,6 +29,8 @@
private final int lower;
/** Upper bound. */
private final int upper;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -39,7 +41,8 @@
public DiscreteUniformSampler(UniformRandomProvider rng,
int lower,
int upper) {
- super(rng);
+ super(null);
+ this.rng = rng;
if (lower > upper) {
throw new IllegalArgumentException(lower + " > " + upper);
}
@@ -57,7 +60,7 @@
// than 2^31); as it covers more than half the integer range,
// we use a simple rejection method.
while (true) {
- final int r = nextInt();
+ final int r = rng.nextInt();
if (r >= lower &&
r <= upper) {
return r;
@@ -65,13 +68,13 @@
}
} else {
// We can shift the range and directly generate a positive int.
- return lower + nextInt(max);
+ return lower + rng.nextInt(max);
}
}
/** {@inheritDoc} */
@Override
public String toString() {
- return "Uniform deviate [" + super.toString() + "]";
+ return "Uniform deviate [" + rng.toString() + "]";
}
}
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 c95bcec..ccaa138 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
@@ -50,12 +50,16 @@
* // Generate random deviate.
* double random = chiSquareSampler.sample();
* </code></pre>
+ *
+ * @since 1.0
*/
public class InverseTransformContinuousSampler
extends SamplerBase
implements ContinuousSampler {
/** Inverse cumulative probability function. */
private final ContinuousInverseCumulativeProbabilityFunction function;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -63,19 +67,20 @@
*/
public InverseTransformContinuousSampler(UniformRandomProvider rng,
ContinuousInverseCumulativeProbabilityFunction function) {
- super(rng);
+ super(null);
+ this.rng = rng;
this.function = function;
}
/** {@inheritDoc} */
@Override
public double sample() {
- return function.inverseCumulativeProbability(nextDouble());
+ return function.inverseCumulativeProbability(rng.nextDouble());
}
/** {@inheritDoc} */
@Override
public String toString() {
- return function.toString() + " (inverse method) [" + super.toString() + "]";
+ return function.toString() + " (inverse method) [" + rng.toString() + "]";
}
}
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 4b5b0e7..5c43b58 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
@@ -50,12 +50,16 @@
* // Generate random deviate.
* int random = binomialSampler.sample();
* </code></pre>
+ *
+ * @since 1.0
*/
public class InverseTransformDiscreteSampler
extends SamplerBase
implements DiscreteSampler {
/** Inverse cumulative probability function. */
private final DiscreteInverseCumulativeProbabilityFunction function;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -63,19 +67,20 @@
*/
public InverseTransformDiscreteSampler(UniformRandomProvider rng,
DiscreteInverseCumulativeProbabilityFunction function) {
- super(rng);
+ super(null);
+ this.rng = rng;
this.function = function;
}
/** {@inheritDoc} */
@Override
public int sample() {
- return function.inverseCumulativeProbability(nextDouble());
+ return function.inverseCumulativeProbability(rng.nextDouble());
}
/** {@inheritDoc} */
@Override
public String toString() {
- return function.toString() + " (inverse method) [" + super.toString() + "]";
+ return function.toString() + " (inverse method) [" + rng.toString() + "]";
}
}
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 93be592..15a1c90 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
@@ -28,6 +28,8 @@
private final double scale;
/** Shape. */
private final double shape;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -37,7 +39,8 @@
public InverseTransformParetoSampler(UniformRandomProvider rng,
double scale,
double shape) {
- super(rng);
+ super(null);
+ this.rng = rng;
this.scale = scale;
this.shape = shape;
}
@@ -45,12 +48,12 @@
/** {@inheritDoc} */
@Override
public double sample() {
- return scale / Math.pow(nextDouble(), 1 / shape);
+ return scale / Math.pow(rng.nextDouble(), 1 / shape);
}
/** {@inheritDoc} */
@Override
public String toString() {
- return "[Inverse method for Pareto distribution " + super.toString() + "]";
+ return "[Inverse method for Pareto distribution " + rng.toString() + "]";
}
}
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 a729686..6a70113 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
@@ -32,10 +32,11 @@
* </li>
* </ul>
*
+ * @since 1.1
+ *
* This sampler is suitable for {@code mean >= 40}.
*/
public class LargeMeanPoissonSampler
- extends SamplerBase
implements DiscreteSampler {
/** Class to compute {@code log(n!)}. This has no cached values. */
@@ -46,6 +47,8 @@
NO_CACHE_FACTORIAL_LOG = FactorialLog.create();
}
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/** Exponential. */
private final ContinuousSampler exponential;
/** Gaussian. */
@@ -98,7 +101,7 @@
*/
public LargeMeanPoissonSampler(UniformRandomProvider rng,
double mean) {
- super(rng);
+ this.rng = rng;
if (mean <= 0) {
throw new IllegalArgumentException(mean + " <= " + 0);
}
@@ -145,7 +148,7 @@
double qr = 0;
double qa = 0;
while (true) {
- final double u = nextDouble();
+ final double u = rng.nextDouble();
if (u <= p1) {
final double n = gaussian.sample();
x = n * Math.sqrt(lambda + halfDelta) - 0.5d;
@@ -202,6 +205,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Large Mean Poisson deviate [" + super.toString() + "]";
+ return "Large Mean Poisson deviate [" + rng.toString() + "]";
}
}
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 a20d3be..4b64461 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
@@ -28,16 +28,17 @@
* @since 1.1
*/
public class MarsagliaNormalizedGaussianSampler
- extends SamplerBase
implements NormalizedGaussianSampler {
/** Next gaussian. */
private double nextGaussian = Double.NaN;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
*/
public MarsagliaNormalizedGaussianSampler(UniformRandomProvider rng) {
- super(rng);
+ this.rng = rng;
}
/** {@inheritDoc} */
@@ -47,8 +48,8 @@
// Rejection scheme for selecting a pair that lies within the unit circle.
while (true) {
// Generate a pair of numbers within [-1 , 1).
- final double x = 2 * nextDouble() - 1;
- final double y = 2 * nextDouble() - 1;
+ final double x = 2 * rng.nextDouble() - 1;
+ final double y = 2 * rng.nextDouble() - 1;
final double r2 = x * x + y * y;
if (r2 < 1 && r2 > 0) {
@@ -79,6 +80,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Box-Muller (with rejection) normalized Gaussian deviate [" + super.toString() + "]";
+ return "Box-Muller (with rejection) normalized Gaussian deviate [" + rng.toString() + "]";
}
}
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 d0733ba..246d2cf 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
@@ -35,6 +35,8 @@
* </blockquote>
* </li>
* </ul>
+ *
+ * @since 1.0
*/
public class PoissonSampler
extends SamplerBase
@@ -52,7 +54,7 @@
*/
public PoissonSampler(UniformRandomProvider rng,
double mean) {
- super(rng);
+ super(null);
// Delegate all work to specialised samplers.
// These should check the input arguments.
@@ -70,6 +72,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Poisson deviate [" + super.toString() + "]";
+ return poissonSampler.toString();
}
}
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 d8eafb2..2e25934 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
@@ -45,6 +45,8 @@
private final double hIntegralNumberOfElements;
/** {@code 2 - hIntegralInverse(hIntegral(2.5) - h(2)}. */
private final double s;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -56,7 +58,8 @@
public RejectionInversionZipfSampler(UniformRandomProvider rng,
int numberOfElements,
double exponent) {
- super(rng);
+ super(null);
+ this.rng = rng;
if (numberOfElements <= 0) {
throw new IllegalArgumentException("number of elements is not strictly positive: " + numberOfElements);
}
@@ -102,7 +105,7 @@
// This explains why the implementation looks slightly different.
while(true) {
- final double u = hIntegralNumberOfElements + nextDouble() * (hIntegralX1 - hIntegralNumberOfElements);
+ final double u = hIntegralNumberOfElements + rng.nextDouble() * (hIntegralX1 - hIntegralNumberOfElements);
// u is uniformly distributed in (hIntegralX1, hIntegralNumberOfElements]
double x = hIntegralInverse(u);
@@ -169,7 +172,7 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Rejection inversion Zipf deviate [" + super.toString() + "]";
+ return "Rejection inversion Zipf deviate [" + rng.toString() + "]";
}
/**
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SamplerBase.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SamplerBase.java
index eb74f75..2b1e0a1 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SamplerBase.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/SamplerBase.java
@@ -20,7 +20,12 @@
/**
* Base class for a sampler.
+ *
+ * @since 1.0
+ *
+ * @deprecated Since version 1.1. Class intended for internal use only.
*/
+@Deprecated
public class SamplerBase {
/** RNG. */
private final UniformRandomProvider rng;
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 283594e..170a85b 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
@@ -29,10 +29,11 @@
* </li>
* </ul>
*
+ * @since 1.1
+ *
* This sampler is suitable for {@code mean < 40}.
*/
public class SmallMeanPoissonSampler
- extends SamplerBase
implements DiscreteSampler {
/**
@@ -42,6 +43,8 @@
private final double p0;
/** Pre-compute {@code 1000 * mean} as the upper limit of the sample. */
private final int limit;
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
/**
* @param rng Generator of uniformly distributed random numbers.
@@ -50,7 +53,7 @@
*/
public SmallMeanPoissonSampler(UniformRandomProvider rng,
double mean) {
- super(rng);
+ this.rng = rng;
if (mean <= 0) {
throw new IllegalArgumentException(mean + " <= " + 0);
}
@@ -67,7 +70,7 @@
double r = 1;
while (n < limit) {
- r *= nextDouble();
+ r *= rng.nextDouble();
if (r >= p0) {
n++;
} else {
@@ -80,6 +83,6 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Small Mean Poisson deviate [" + super.toString() + "]";
+ return "Small Mean Poisson deviate [" + rng.toString() + "]";
}
}
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 3571f3b..b52c926 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
@@ -31,7 +31,6 @@
* @since 1.1
*/
public class ZigguratNormalizedGaussianSampler
- extends SamplerBase
implements NormalizedGaussianSampler {
/** Start of tail. */
private static final double R = 3.442619855899;
@@ -53,6 +52,8 @@
private static final double[] W = new double[LEN];
/** Auxiliary table. */
private static final double[] F = new double[LEN];
+ /** Underlying source of randomness. */
+ private final UniformRandomProvider rng;
static {
// Filling the tables.
@@ -88,13 +89,13 @@
* @param rng Generator of uniformly distributed random numbers.
*/
public ZigguratNormalizedGaussianSampler(UniformRandomProvider rng) {
- super(rng);
+ this.rng = rng;
}
/** {@inheritDoc} */
@Override
public double sample() {
- final long j = nextLong();
+ final long j = rng.nextLong();
final int i = (int) (j & LAST);
if (Math.abs(j) < K[i]) {
return j * W[i];
@@ -106,7 +107,7 @@
/** {@inheritDoc} */
@Override
public String toString() {
- return "Ziggurat normalized Gaussian deviate [" + super.toString() + "]";
+ return "Ziggurat normalized Gaussian deviate [" + rng.toString() + "]";
}
/**
@@ -126,18 +127,18 @@
if (iz == 0) {
// Base strip.
do {
- y = -Math.log(nextDouble());
- x = -Math.log(nextDouble()) * ONE_OVER_R;
+ y = -Math.log(rng.nextDouble());
+ x = -Math.log(rng.nextDouble()) * ONE_OVER_R;
} while (y + y < x * x);
final double out = R + x;
return hz > 0 ? out : -out;
} else {
// Wedge of other strips.
- if (F[iz] + nextDouble() * (F[iz - 1] - F[iz]) < gauss(x)) {
+ if (F[iz] + rng.nextDouble() * (F[iz - 1] - F[iz]) < gauss(x)) {
return x;
} else {
- final long hzNew = nextLong();
+ final long hzNew = rng.nextLong();
final int izNew = (int) (hzNew & LAST);
if (Math.abs(hzNew) < K[izNew]) {
return hzNew * W[izNew];
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 262d7f6..0849bc3 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -73,7 +73,7 @@
">
</release>
- <release version="1.1" date="2018-08-05" description="
+ <release version="1.1" date="2018-08-15" description="
This is a minor release of Apache Commons RNG, containing a
few new features and performance improvements.
@@ -98,11 +98,16 @@
to re-run tests that fail and pass the build if they succeed (the test will
be marked as 'flaky' in the report).
">
+ <action dev="erans" type="fix" issue="RNG-53">
+ Class "SamplerBase" has been deprecated. It was meant for internal use
+ only but, through inheritance, it allows incorrect usage of the sampler
+ classes.
+ </action>
<action dev="erans" type="update" issue="RNG-50" due-to="Alex D. Herbert">
- "PoissonSampler": Algorithms for small mean and large mean have
- been separated into dedicated classes. Cache precomputation has
- been disabled as it is only marginally used and is a performance
- hit for small sampling sets.
+ "PoissonSampler": Algorithms for small mean and large mean have
+ been separated into dedicated classes. Cache precomputation has
+ been disabled as it is only marginally used and is a performance
+ hit for small sampling sets.
</action>
<action dev="erans" type="add" issue="RNG-37">
Implementation of the "Ziggurat" algorithm for Gaussian sampling.
@@ -119,10 +124,6 @@
</action>
<action dev="erans" type="update" issue="RNG-46">
Following RNG-43, "BoxMullerLogNormalSampler" has been deprecated.
- Furthermore, its base class has been removed; although it is a binary
- incompatibility, it cannot cause any problem that were not already
- present in code using v1.0 of the library: Calls to the base class
- would have raised a NPE.
</action>
<action dev="erans" type="add" issue="RNG-39">
"UnitSphereSampler": generate random vectors isotropically located