You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2017/04/09 11:34:02 UTC

[1/2] commons-rng git commit: Revert internal sampler class.

Repository: commons-rng
Updated Branches:
  refs/heads/master 6c8e3cbf9 -> 449458819


Revert internal sampler class.


Project: http://git-wip-us.apache.org/repos/asf/commons-rng/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-rng/commit/c1a2b82b
Tree: http://git-wip-us.apache.org/repos/asf/commons-rng/tree/c1a2b82b
Diff: http://git-wip-us.apache.org/repos/asf/commons-rng/diff/c1a2b82b

Branch: refs/heads/master
Commit: c1a2b82b78451f5be96c700cec5d43444a32a24f
Parents: 6c8e3cb
Author: Gilles <er...@apache.org>
Authored: Sat Apr 8 16:54:45 2017 +0200
Committer: Gilles <er...@apache.org>
Committed: Sat Apr 8 16:54:45 2017 +0200

----------------------------------------------------------------------
 .../rng/sampling/distribution/BoxMullerLogNormalSampler.java       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-rng/blob/c1a2b82b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/BoxMullerLogNormalSampler.java
----------------------------------------------------------------------
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 e793e38..354b8d4 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
@@ -43,7 +43,7 @@ public class BoxMullerLogNormalSampler
         super(null); // Not used.
         this.scale = scale;
         this.shape = shape;
-        gaussian = new MarsagliaNormalizedGaussianSampler(rng);
+        gaussian = new BoxMullerNormalizedGaussianSampler(rng);
     }
 
     /** {@inheritDoc} */


[2/2] commons-rng git commit: RNG-36: New log normal sampler implementation.

Posted by er...@apache.org.
RNG-36: New log normal sampler implementation.

The new class uses the (faster) polar method as the underlying Gaussian sampler.


Project: http://git-wip-us.apache.org/repos/asf/commons-rng/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-rng/commit/44945881
Tree: http://git-wip-us.apache.org/repos/asf/commons-rng/tree/44945881
Diff: http://git-wip-us.apache.org/repos/asf/commons-rng/diff/44945881

Branch: refs/heads/master
Commit: 4494588190d5fc8f84e93b79ba81780f6d91eefd
Parents: c1a2b82
Author: Gilles <er...@apache.org>
Authored: Sun Apr 9 13:14:00 2017 +0200
Committer: Gilles <er...@apache.org>
Committed: Sun Apr 9 13:14:00 2017 +0200

----------------------------------------------------------------------
 .../jmh/distribution/SamplersPerformance.java   | 11 ++++
 .../distribution/MarsagliaLogNormalSampler.java | 62 ++++++++++++++++++++
 .../distribution/ContinuousSamplersList.java    |  5 +-
 3 files changed, 77 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-rng/blob/44945881/commons-rng-jmh/src/main/java/org/apache/commons/rng/jmh/distribution/SamplersPerformance.java
----------------------------------------------------------------------
diff --git a/commons-rng-jmh/src/main/java/org/apache/commons/rng/jmh/distribution/SamplersPerformance.java b/commons-rng-jmh/src/main/java/org/apache/commons/rng/jmh/distribution/SamplersPerformance.java
index 4d338e6..d24664c 100644
--- a/commons-rng-jmh/src/main/java/org/apache/commons/rng/jmh/distribution/SamplersPerformance.java
+++ b/commons-rng-jmh/src/main/java/org/apache/commons/rng/jmh/distribution/SamplersPerformance.java
@@ -41,6 +41,7 @@ import org.apache.commons.rng.sampling.distribution.MarsagliaNormalizedGaussianS
 import org.apache.commons.rng.sampling.distribution.AhrensDieterExponentialSampler;
 import org.apache.commons.rng.sampling.distribution.AhrensDieterMarsagliaTsangGammaSampler;
 import org.apache.commons.rng.sampling.distribution.BoxMullerLogNormalSampler;
+import org.apache.commons.rng.sampling.distribution.MarsagliaLogNormalSampler;
 import org.apache.commons.rng.sampling.distribution.ChengBetaSampler;
 import org.apache.commons.rng.sampling.distribution.ContinuousUniformSampler;
 import org.apache.commons.rng.sampling.distribution.DiscreteUniformSampler;
@@ -197,6 +198,16 @@ public class SamplersPerformance {
      * @param bh Data sink.
      */
     @Benchmark
+    public void runMarsagliaLogNormalSampler(Sources sources,
+                                             Blackhole bh) {
+        runSample(new MarsagliaLogNormalSampler(sources.getGenerator(), 12.3, 4.6), bh);
+    }
+
+    /**
+     * @param sources Source of randomness.
+     * @param bh Data sink.
+     */
+    @Benchmark
     public void runChengBetaSampler(Sources sources,
                                     Blackhole bh) {
         runSample(new ChengBetaSampler(sources.getGenerator(), 0.45, 6.7), bh);

http://git-wip-us.apache.org/repos/asf/commons-rng/blob/44945881/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaLogNormalSampler.java
----------------------------------------------------------------------
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaLogNormalSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaLogNormalSampler.java
new file mode 100644
index 0000000..885aeb9
--- /dev/null
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaLogNormalSampler.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rng.sampling.distribution;
+
+import org.apache.commons.rng.UniformRandomProvider;
+
+/**
+ * <a href="https://en.wikipedia.org/wiki/Marsaglia_polar_method">
+ * polar method</a> for sampling from a Log normal distribution.
+ *
+ * @since 1.1
+ */
+public class MarsagliaLogNormalSampler
+    extends SamplerBase
+    implements ContinuousSampler {
+    /** Scale. */
+    private final double scale;
+    /** Shape. */
+    private final double shape;
+    /** Gaussian sampling. */
+    private final NormalizedGaussianSampler gaussian;
+
+    /**
+     * @param rng Generator of uniformly distributed random numbers.
+     * @param scale Scale of the Log normal distribution.
+     * @param shape Shape of the Log normal distribution.
+     */
+    public MarsagliaLogNormalSampler(UniformRandomProvider rng,
+                                     double scale,
+                                     double shape) {
+        super(null); // Not used.
+        this.scale = scale;
+        this.shape = shape;
+        gaussian = new MarsagliaNormalizedGaussianSampler(rng);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public double sample() {
+        return Math.exp(scale + shape * gaussian.sample());
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String toString() {
+        return "Marsaglia Log Normal [" + gaussian.toString() + "]";
+    }
+}

http://git-wip-us.apache.org/repos/asf/commons-rng/blob/44945881/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/ContinuousSamplersList.java
----------------------------------------------------------------------
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 0383928..cf89a4d 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
@@ -48,7 +48,7 @@ public class ContinuousSamplersList {
             add(LIST, new org.apache.commons.math3.distribution.NormalDistribution(meanNormal, sigmaNormal),
                 new GaussianSampler(new BoxMullerNormalizedGaussianSampler(RandomSource.create(RandomSource.MT)),
                                     meanNormal, sigmaNormal));
-            // Gaussian ("Box-Muller" with rejection).
+            // Gaussian ("Marsaglia").
             add(LIST, new org.apache.commons.math3.distribution.NormalDistribution(meanNormal, sigmaNormal),
                 new GaussianSampler(new MarsagliaNormalizedGaussianSampler(RandomSource.create(RandomSource.MT)),
                                     meanNormal, sigmaNormal));
@@ -137,6 +137,9 @@ public class ContinuousSamplersList {
             // Log normal ("Box-Muller").
             add(LIST, new org.apache.commons.math3.distribution.LogNormalDistribution(scaleLogNormal, shapeLogNormal),
                 new BoxMullerLogNormalSampler(RandomSource.create(RandomSource.XOR_SHIFT_1024_S), scaleLogNormal, shapeLogNormal));
+            // Log normal ("Marsaglia").
+            add(LIST, new org.apache.commons.math3.distribution.LogNormalDistribution(scaleLogNormal, shapeLogNormal),
+                new MarsagliaLogNormalSampler(RandomSource.create(RandomSource.MT_64), scaleLogNormal, shapeLogNormal));
 
             // Logistic ("inverse method").
             final double muLogistic = -123.456;