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 df423bf RNG-152: Update samplers to use
ZigguratSampler.NormalizedGaussian
df423bf is described below
commit df423bf1bbd2679177095915242e724a1e625b4a
Author: aherbert <[email protected]>
AuthorDate: Thu Jul 8 11:29:40 2021 +0100
RNG-152: Update samplers to use ZigguratSampler.NormalizedGaussian
---
.../jmh/sampling/UnitSphereSamplerBenchmark.java | 10 ++---
.../sampling/shape/UnitBallSamplerBenchmark.java | 17 ++++----
.../commons/rng/sampling/UnitSphereSampler.java | 8 ++--
.../AhrensDieterMarsagliaTsangGammaSampler.java | 4 +-
.../distribution/LargeMeanPoissonSampler.java | 4 +-
.../rng/sampling/distribution/LevySampler.java | 4 +-
.../rng/sampling/shape/UnitBallSampler.java | 5 +--
.../sampling/distribution/GaussianSamplerTest.java | 4 +-
.../rng/sampling/distribution/LevySamplerTest.java | 50 +++++++++++++---------
.../distribution/LogNormalSamplerTest.java | 6 +--
src/changes/changes.xml | 3 ++
11 files changed, 62 insertions(+), 53 deletions(-)
diff --git
a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/UnitSphereSamplerBenchmark.java
b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/UnitSphereSamplerBenchmark.java
index 2911155..fce9d31 100644
---
a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/UnitSphereSamplerBenchmark.java
+++
b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/UnitSphereSamplerBenchmark.java
@@ -19,7 +19,7 @@ package org.apache.commons.rng.examples.jmh.sampling;
import org.apache.commons.rng.UniformRandomProvider;
import org.apache.commons.rng.sampling.distribution.NormalizedGaussianSampler;
-import
org.apache.commons.rng.sampling.distribution.ZigguratNormalizedGaussianSampler;
+import org.apache.commons.rng.sampling.distribution.ZigguratSampler;
import org.apache.commons.rng.simple.RandomSource;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
@@ -233,7 +233,7 @@ public class UnitSphereSamplerBenchmark {
* @param rng the source of randomness
*/
UnitSphereSampler2D(UniformRandomProvider rng) {
- sampler = new ZigguratNormalizedGaussianSampler(rng);
+ sampler = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -291,7 +291,7 @@ public class UnitSphereSamplerBenchmark {
* @param rng the source of randomness
*/
UnitSphereSampler3D(UniformRandomProvider rng) {
- sampler = new ZigguratNormalizedGaussianSampler(rng);
+ sampler = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -350,7 +350,7 @@ public class UnitSphereSamplerBenchmark {
* @param rng the source of randomness
*/
UnitSphereSampler4D(UniformRandomProvider rng) {
- sampler = new ZigguratNormalizedGaussianSampler(rng);
+ sampler = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -387,7 +387,7 @@ public class UnitSphereSamplerBenchmark {
*/
ArrayBasedUnitSphereSampler(int dimension, UniformRandomProvider rng) {
this.dimension = dimension;
- sampler = new ZigguratNormalizedGaussianSampler(rng);
+ sampler = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
diff --git
a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/shape/UnitBallSamplerBenchmark.java
b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/shape/UnitBallSamplerBenchmark.java
index f4523e0..04c098d 100644
---
a/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/shape/UnitBallSamplerBenchmark.java
+++
b/commons-rng-examples/examples-jmh/src/main/java/org/apache/commons/rng/examples/jmh/sampling/shape/UnitBallSamplerBenchmark.java
@@ -20,7 +20,6 @@ package org.apache.commons.rng.examples.jmh.sampling.shape;
import org.apache.commons.rng.UniformRandomProvider;
import org.apache.commons.rng.sampling.distribution.ContinuousSampler;
import org.apache.commons.rng.sampling.distribution.NormalizedGaussianSampler;
-import
org.apache.commons.rng.sampling.distribution.ZigguratNormalizedGaussianSampler;
import org.apache.commons.rng.sampling.distribution.ZigguratSampler;
import org.apache.commons.rng.simple.RandomSource;
import org.openjdk.jmh.annotations.Benchmark;
@@ -307,7 +306,7 @@ public class UnitBallSamplerBenchmark {
*/
HypersphereInternalSampler(UniformRandomProvider rng) {
super(rng);
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -340,7 +339,7 @@ public class UnitBallSamplerBenchmark {
*/
HypersphereDiscardSampler(UniformRandomProvider rng) {
super(rng);
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -434,7 +433,7 @@ public class UnitBallSamplerBenchmark {
*/
BallPointSampler(UniformRandomProvider rng) {
super(rng);
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
// Exponential(mean=2) == Chi-squared distribution(degrees
freedom=2)
// thus is the equivalent of the HypersphereDiscardSampler.
// Here we use mean = 1 and scale the output later.
@@ -472,7 +471,7 @@ public class UnitBallSamplerBenchmark {
*/
HypersphereInternalSampler(UniformRandomProvider rng) {
super(rng);
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -506,7 +505,7 @@ public class UnitBallSamplerBenchmark {
*/
HypersphereDiscardSampler(UniformRandomProvider rng) {
super(rng);
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -619,7 +618,7 @@ public class UnitBallSamplerBenchmark {
BallPointSampler(UniformRandomProvider rng, int dimension) {
super(rng);
this.dimension = dimension;
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
// Exponential(mean=2) == Chi-squared distribution(degrees
freedom=2)
// thus is the equivalent of the HypersphereDiscardSampler.
// Here we use mean = 1 and scale the output later.
@@ -670,7 +669,7 @@ public class UnitBallSamplerBenchmark {
super(rng);
this.dimension = dimension;
power = 1.0 / dimension;
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -714,7 +713,7 @@ public class UnitBallSamplerBenchmark {
HypersphereDiscardSampler(UniformRandomProvider rng, int
dimension) {
super(rng);
this.dimension = dimension;
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
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 76db7b0..53c81f9 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
@@ -19,7 +19,7 @@ package org.apache.commons.rng.sampling;
import org.apache.commons.rng.UniformRandomProvider;
import org.apache.commons.rng.sampling.distribution.NormalizedGaussianSampler;
-import
org.apache.commons.rng.sampling.distribution.ZigguratNormalizedGaussianSampler;
+import org.apache.commons.rng.sampling.distribution.ZigguratSampler;
/**
* Generate vectors <a
href="http://mathworld.wolfram.com/SpherePointPicking.html">
@@ -95,7 +95,7 @@ public class UnitSphereSampler implements
SharedStateObjectSampler<double[]> {
* @param rng Source of randomness.
*/
UnitSphereSampler2D(UniformRandomProvider rng) {
- sampler = new ZigguratNormalizedGaussianSampler(rng);
+ sampler = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -131,7 +131,7 @@ public class UnitSphereSampler implements
SharedStateObjectSampler<double[]> {
* @param rng Source of randomness.
*/
UnitSphereSampler3D(UniformRandomProvider rng) {
- sampler = new ZigguratNormalizedGaussianSampler(rng);
+ sampler = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
@@ -171,7 +171,7 @@ public class UnitSphereSampler implements
SharedStateObjectSampler<double[]> {
*/
UnitSphereSamplerND(int dimension, UniformRandomProvider rng) {
this.dimension = dimension;
- sampler = new ZigguratNormalizedGaussianSampler(rng);
+ sampler = ZigguratSampler.NormalizedGaussian.of(rng);
}
@Override
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 08c72b8..c3c884d 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 = ZigguratSampler.NormalizedGaussian.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 = ZigguratSampler.NormalizedGaussian.of(rng);
dOptim = source.dOptim;
cOptim = source.cOptim;
}
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 41f9eca..d56974f 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,7 +132,7 @@ public class LargeMeanPoissonSampler
}
this.rng = rng;
- gaussian = new ZigguratNormalizedGaussianSampler(rng);
+ gaussian = ZigguratSampler.NormalizedGaussian.of(rng);
exponential = ZigguratSampler.Exponential.of(rng);
// Plain constructor uses the uncached function.
factorialLog = NO_CACHE_FACTORIAL_LOG;
@@ -177,7 +177,7 @@ public class LargeMeanPoissonSampler
}
this.rng = rng;
- gaussian = new ZigguratNormalizedGaussianSampler(rng);
+ gaussian = ZigguratSampler.NormalizedGaussian.of(rng);
exponential = ZigguratSampler.Exponential.of(rng);
// Plain constructor uses the uncached function.
factorialLog = NO_CACHE_FACTORIAL_LOG;
diff --git
a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LevySampler.java
b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LevySampler.java
index f604604..5207755 100644
---
a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LevySampler.java
+++
b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/LevySampler.java
@@ -42,7 +42,7 @@ public final class LevySampler implements
SharedStateContinuousSampler {
private LevySampler(UniformRandomProvider rng,
double location,
double scale) {
- this.gaussian = new ZigguratNormalizedGaussianSampler(rng);
+ this.gaussian = ZigguratSampler.NormalizedGaussian.of(rng);
this.location = location;
this.scale = scale;
this.rng = rng;
@@ -54,7 +54,7 @@ public final class LevySampler implements
SharedStateContinuousSampler {
*/
private LevySampler(UniformRandomProvider rng,
LevySampler source) {
- this.gaussian = new ZigguratNormalizedGaussianSampler(rng);
+ this.gaussian = ZigguratSampler.NormalizedGaussian.of(rng);
this.location = source.location;
this.scale = source.scale;
this.rng = rng;
diff --git
a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/UnitBallSampler.java
b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/UnitBallSampler.java
index 80c836c..8e78c0f 100644
---
a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/UnitBallSampler.java
+++
b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/shape/UnitBallSampler.java
@@ -21,7 +21,6 @@ import org.apache.commons.rng.UniformRandomProvider;
import org.apache.commons.rng.sampling.SharedStateObjectSampler;
import org.apache.commons.rng.sampling.distribution.ContinuousSampler;
import org.apache.commons.rng.sampling.distribution.NormalizedGaussianSampler;
-import
org.apache.commons.rng.sampling.distribution.ZigguratNormalizedGaussianSampler;
import org.apache.commons.rng.sampling.distribution.ZigguratSampler;
/**
@@ -124,7 +123,7 @@ public abstract class UnitBallSampler implements
SharedStateObjectSampler<double
* @param rng Source of randomness.
*/
UnitBallSampler3D(UniformRandomProvider rng) {
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
// Require an Exponential(mean=2).
// Here we use mean = 1 and scale the output later.
exp = ZigguratSampler.Exponential.of(rng);
@@ -169,7 +168,7 @@ public abstract class UnitBallSampler implements
SharedStateObjectSampler<double
*/
UnitBallSamplerND(int dimension, UniformRandomProvider rng) {
this.dimension = dimension;
- normal = new ZigguratNormalizedGaussianSampler(rng);
+ normal = ZigguratSampler.NormalizedGaussian.of(rng);
// Require an Exponential(mean=2).
// Here we use mean = 1 and scale the output later.
exp = ZigguratSampler.Exponential.of(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 2ad15f8..9222f76 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,7 +34,7 @@ public class GaussianSamplerTest {
public void testConstructorThrowsWithZeroStandardDeviation() {
final RestorableUniformRandomProvider rng =
RandomSource.SPLIT_MIX_64.create(0L);
- final NormalizedGaussianSampler gauss = new
ZigguratNormalizedGaussianSampler(rng);
+ final NormalizedGaussianSampler gauss =
ZigguratSampler.NormalizedGaussian.of(rng);
final double mean = 1;
final double standardDeviation = 0;
GaussianSampler.of(gauss, mean, standardDeviation);
@@ -99,7 +99,7 @@ public class GaussianSamplerTest {
public void testSharedStateSampler() {
final UniformRandomProvider rng1 =
RandomSource.SPLIT_MIX_64.create(0L);
final UniformRandomProvider rng2 =
RandomSource.SPLIT_MIX_64.create(0L);
- final NormalizedGaussianSampler gauss = new
ZigguratNormalizedGaussianSampler(rng1);
+ final NormalizedGaussianSampler gauss =
ZigguratSampler.NormalizedGaussian.of(rng1);
final double mean = 1.23;
final double standardDeviation = 4.56;
final SharedStateContinuousSampler sampler1 =
diff --git
a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LevySamplerTest.java
b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LevySamplerTest.java
index 4678f36..7430f38 100644
---
a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LevySamplerTest.java
+++
b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/LevySamplerTest.java
@@ -71,7 +71,7 @@ public class LevySamplerTest {
public void testSupport() {
final double location = 0.0;
final double scale = 1.0;
- // Force the underlying ZigguratNormalizedGaussianSampler to create 0
+ // Force the underlying ZigguratSampler.NormalizedGaussian to create 0
final LevySampler s1 = LevySampler.of(
new SplitMix64(0L) {
@Override
@@ -81,34 +81,42 @@ public class LevySamplerTest {
}, location, scale);
Assert.assertEquals(Double.POSITIVE_INFINITY, s1.sample(), 0.0);
- // Force the underlying ZigguratNormalizedGaussianSampler to create
the largest value.
- // This is 14.11
+ // Force the underlying ZigguratSampler.NormalizedGaussian to create a
large
+ // sample in the tail of the distribution.
+ // The first three -1,-1,-1 values enters the tail of the distribution.
+ // Here an exponential is added to 3.6360066255.
+ // The exponential also requires -1,-1 to recurse. Each recursion adds
7.56927469415
+ // to the exponential. A value of 0 stops recursion with a sample of 0.
+ // Two exponentials are required: x and y.
+ // The exponential is multiplied by 0.275027001597525 to create x.
+ // The condition 2y >= x^x must be true to return x.
+ // Create x = 4 * 7.57 and y = 16 * 7.57
+ final long[] sequence = {
+ // Sample the Gaussian tail
+ -1, -1, -1,
+ // Exponential x = 4 * 7.57... * 0.275027001597525
+ -1, -1, -1, -1, -1, -1, -1, -1, 0,
+ // Exponential y = 16 * 7.57...
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
+ };
final LevySampler s2 = LevySampler.of(
new SplitMix64(0L) {
private int i;
@Override
public long next() {
- i++;
- if (i == 1) {
- // Set the first value to ensure we sample the tail of
the ziggurat.
- // The lowest 7 bits are zero to select rectangle 0
from the ziggurat.
- return (Long.MAX_VALUE << 7) & Long.MAX_VALUE;
+ if (i++ < sequence.length) {
+ return sequence[i - 1];
}
- if (i == 2) {
- // Set the second value to generate y as the largest
value possible by
- // ensuring Math.log is called with a small value.
- return 0L;
- }
- // The next value generates x which must be set to the
largest value x which
- // satisfies the condition:
- // 2y >= x^2
- return 1377L << 11;
+ return super.next();
}
}, location, scale);
- // The tail of the zigguart should be s=12.014118700751192
- // expected is 1/s^2 = 0.006928132149804786
- // This is as close to zero as the sampler can get.
- final double expected = 0.006928132149804786;
+ // The tail of the zigguart should be approximately s=11.963
+ final double s = 4 * 7.56927469415 * 0.275027001597525 + 3.6360066255;
+ // expected is 1/s^2 = 0.006987
+ // So the sampler never achieves the lower bound of zero.
+ // It requires an extreme deviate from the Gaussian.
+ final double expected = 1 / (s * s);
Assert.assertEquals(expected, s2.sample(), 0.0);
}
}
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 03554ab..a554fd1 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,7 +34,7 @@ public class LogNormalSamplerTest {
public void testConstructorThrowsWithNegativeScale() {
final RestorableUniformRandomProvider rng =
RandomSource.SPLIT_MIX_64.create(0L);
- final NormalizedGaussianSampler gauss = new
ZigguratNormalizedGaussianSampler(rng);
+ final NormalizedGaussianSampler gauss =
ZigguratSampler.NormalizedGaussian.of(rng);
final double scale = -1e-6;
final double shape = 1;
LogNormalSampler.of(gauss, scale, shape);
@@ -47,7 +47,7 @@ public class LogNormalSamplerTest {
public void testConstructorThrowsWithZeroShape() {
final RestorableUniformRandomProvider rng =
RandomSource.SPLIT_MIX_64.create(0L);
- final NormalizedGaussianSampler gauss = new
ZigguratNormalizedGaussianSampler(rng);
+ final NormalizedGaussianSampler gauss =
ZigguratSampler.NormalizedGaussian.of(rng);
final double scale = 1;
final double shape = 0;
LogNormalSampler.of(gauss, scale, shape);
@@ -60,7 +60,7 @@ public class LogNormalSamplerTest {
public void testSharedStateSampler() {
final UniformRandomProvider rng1 =
RandomSource.SPLIT_MIX_64.create(0L);
final UniformRandomProvider rng2 =
RandomSource.SPLIT_MIX_64.create(0L);
- final NormalizedGaussianSampler gauss = new
ZigguratNormalizedGaussianSampler(rng1);
+ final NormalizedGaussianSampler gauss =
ZigguratSampler.NormalizedGaussian.of(rng1);
final double scale = 1.23;
final double shape = 4.56;
final SharedStateContinuousSampler sampler1 =
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c71270f..38970b7 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -77,6 +77,9 @@ re-run tests that fail, and pass the build if they succeed
within the allotted number of reruns (the test will be marked
as 'flaky' in the report).
">
+ <action dev="aherbert" type="update" issue="152">
+ Update samplers to use ZigguratSampler.NormalizedGaussian for Gaussian
deviates.
+ </action>
<action dev="aherbert" type="fix" issue="146">
"GaussianSampler": Prevent infinite mean and standard deviation.
</action>