You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2021/12/24 15:10:21 UTC

[commons-statistics] 02/04: Sample Nakagami using a related gamma distribution

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-statistics.git

commit 563ec02e424f7d856683999b6df3096515555560
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Fri Dec 24 14:29:14 2021 +0000

    Sample Nakagami using a related gamma distribution
---
 .../statistics/distribution/NakagamiDistribution.java      | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
index 77f9b66..3bde611 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
@@ -20,6 +20,9 @@ import org.apache.commons.numbers.gamma.Gamma;
 import org.apache.commons.numbers.gamma.GammaRatio;
 import org.apache.commons.numbers.gamma.LogGamma;
 import org.apache.commons.numbers.gamma.RegularizedGamma;
+import org.apache.commons.rng.UniformRandomProvider;
+import org.apache.commons.rng.sampling.distribution.AhrensDieterMarsagliaTsangGammaSampler;
+import org.apache.commons.rng.sampling.distribution.SharedStateContinuousSampler;
 
 /**
  * Implementation of the Nakagami distribution.
@@ -189,4 +192,15 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
     public double getSupportUpperBound() {
         return SUPPORT_HI;
     }
+
+    @Override
+    public Sampler createSampler(UniformRandomProvider rng) {
+        // Generate using a related Gamma distribution
+        // See https://en.wikipedia.org/wiki/Nakagami_distribution#Generation
+        final double shape = mu;
+        final double scale = omega / mu;
+        final SharedStateContinuousSampler sampler =
+            AhrensDieterMarsagliaTsangGammaSampler.of(rng, shape, scale);
+        return () -> Math.sqrt(sampler.sample());
+    }
 }