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
The following commit(s) were added to refs/heads/master by this push:
new f1ddb11 Simplify shared state implementations using
NormalizedGaussianSampler.
f1ddb11 is described below
commit f1ddb11e5d5dee7e2657102d90ae681ba2aea958
Author: aherbert <[email protected]>
AuthorDate: Wed Jul 31 16:08:08 2019 +0100
Simplify shared state implementations using NormalizedGaussianSampler.
Throw an UnsupportedOperationException if the NormalizedGaussianSampler
cannot shared state.
---
.../rng/sampling/distribution/GaussianSampler.java | 12 ++++------
.../rng/sampling/distribution/InternalUtils.java | 28 ++++++++++++++++++++++
.../sampling/distribution/LogNormalSampler.java | 12 ++++------
.../sampling/distribution/GaussianSamplerTest.java | 2 +-
.../distribution/LogNormalSamplerTest.java | 2 +-
5 files changed, 38 insertions(+), 18 deletions(-)
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 e8cb095..8362387 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
@@ -57,13 +57,9 @@ public class GaussianSampler implements ContinuousSampler,
SharedStateSampler<Ga
*/
private GaussianSampler(UniformRandomProvider rng,
GaussianSampler source) {
- if (!(source.normalized instanceof SharedStateSampler<?>)) {
- throw new UnsupportedOperationException("The underlying sampler is
not a SharedStateSampler");
- }
this.mean = source.mean;
this.standardDeviation = source.standardDeviation;
- this.normalized = (NormalizedGaussianSampler)
-
((SharedStateSampler<?>)source.normalized).withUniformRandomProvider(rng);
+ this.normalized =
InternalUtils.newNormalizedGaussianSampler(source.normalized, rng);
}
/** {@inheritDoc} */
@@ -84,9 +80,9 @@ public class GaussianSampler implements ContinuousSampler,
SharedStateSampler<Ga
* <p>Note: This function is available if the underlying {@link
NormalizedGaussianSampler}
* is a {@link SharedStateSampler}. Otherwise a run-time exception is
thrown.</p>
*
- * @throws UnsupportedOperationException if the underlying sampler is not
a {@link SharedStateSampler}.
- * @throws ClassCastException if the underlying {@link SharedStateSampler}
does not return a
- * {@link NormalizedGaussianSampler}.
+ * @throws UnsupportedOperationException if the underlying sampler is not a
+ * {@link SharedStateSampler} or does not return a {@link
NormalizedGaussianSampler} when
+ * sharing state.
*/
@Override
public GaussianSampler withUniformRandomProvider(UniformRandomProvider
rng) {
diff --git
a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InternalUtils.java
b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InternalUtils.java
index b6ec3df..3807001 100644
---
a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InternalUtils.java
+++
b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/InternalUtils.java
@@ -17,6 +17,9 @@
package org.apache.commons.rng.sampling.distribution;
+import org.apache.commons.rng.UniformRandomProvider;
+import org.apache.commons.rng.sampling.SharedStateSampler;
+
/**
* Functions used by some of the samplers.
* This class is not part of the public API, as it would be
@@ -91,6 +94,31 @@ final class InternalUtils { // Class is package-private on
purpose; do not make
}
/**
+ * Create a new instance of the given sampler using
+ * {@link
SharedStateSampler#withUniformRandomProvider(UniformRandomProvider)}.
+ *
+ * @param sampler Source sampler.
+ * @param rng Generator of uniformly distributed random numbers.
+ * @return the new sampler
+ * @throws UnsupportedOperationException if the underlying sampler is not a
+ * {@link SharedStateSampler} or does not return a {@link
NormalizedGaussianSampler} when
+ * sharing state.
+ */
+ static NormalizedGaussianSampler newNormalizedGaussianSampler(
+ NormalizedGaussianSampler sampler,
+ UniformRandomProvider rng) {
+ if (!(sampler instanceof SharedStateSampler<?>)) {
+ throw new UnsupportedOperationException("The underlying sampler
cannot share state");
+ }
+ final Object newSampler = ((SharedStateSampler<?>)
sampler).withUniformRandomProvider(rng);
+ if (!(newSampler instanceof NormalizedGaussianSampler)) {
+ throw new UnsupportedOperationException(
+ "The underlying sampler did not create a normalized Gaussian
sampler");
+ }
+ return (NormalizedGaussianSampler) newSampler;
+ }
+
+ /**
* Class for computing the natural logarithm of the factorial of {@code n}.
* It allows to allocate a cache of precomputed values.
* In case of cache miss, computation is performed by a call to
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 3879cbc..55dab9e 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
@@ -58,13 +58,9 @@ public class LogNormalSampler implements ContinuousSampler,
SharedStateSampler<L
*/
private LogNormalSampler(UniformRandomProvider rng,
LogNormalSampler source) {
- if (!(source.gaussian instanceof SharedStateSampler<?>)) {
- throw new UnsupportedOperationException("The underlying sampler is
not a SharedStateSampler");
- }
this.scale = source.scale;
this.shape = source.shape;
- this.gaussian = (NormalizedGaussianSampler)
-
((SharedStateSampler<?>)source.gaussian).withUniformRandomProvider(rng);
+ this.gaussian =
InternalUtils.newNormalizedGaussianSampler(source.gaussian, rng);
}
/** {@inheritDoc} */
@@ -85,9 +81,9 @@ public class LogNormalSampler implements ContinuousSampler,
SharedStateSampler<L
* <p>Note: This function is available if the underlying {@link
NormalizedGaussianSampler}
* is a {@link SharedStateSampler}. Otherwise a run-time exception is
thrown.</p>
*
- * @throws UnsupportedOperationException if the underlying sampler is not
a {@link SharedStateSampler}.
- * @throws ClassCastException if the underlying {@link SharedStateSampler}
does not return a
- * {@link NormalizedGaussianSampler}.
+ * @throws UnsupportedOperationException if the underlying sampler is not a
+ * {@link SharedStateSampler} or does not return a {@link
NormalizedGaussianSampler} when
+ * sharing state.
*/
@Override
public LogNormalSampler withUniformRandomProvider(UniformRandomProvider
rng) {
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 63bbf88..f4afb63 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
@@ -82,7 +82,7 @@ public class GaussianSamplerTest {
* Test the SharedStateSampler implementation throws if the underlying
sampler is
* a SharedStateSampler that returns an incorrect type.
*/
- @Test(expected = ClassCastException.class)
+ @Test(expected = UnsupportedOperationException.class)
public void
testSharedStateSamplerThrowsIfUnderlyingSamplerReturnsWrongSharedState() {
final UniformRandomProvider rng2 =
RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
final NormalizedGaussianSampler gauss = new
BadSharedStateNormalizedGaussianSampler();
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 e708fc4..a8ec693 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
@@ -97,7 +97,7 @@ public class LogNormalSamplerTest {
* Test the SharedStateSampler implementation throws if the underlying
sampler is
* a SharedStateSampler that returns an incorrect type.
*/
- @Test(expected = ClassCastException.class)
+ @Test(expected = UnsupportedOperationException.class)
public void
testSharedStateSamplerThrowsIfUnderlyingSamplerReturnsWrongSharedState() {
final UniformRandomProvider rng2 =
RandomSource.create(RandomSource.SPLIT_MIX_64, 0L);
final NormalizedGaussianSampler gauss = new
BadSharedStateNormalizedGaussianSampler();