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 2018/02/25 16:15:51 UTC
commons-rng git commit: Named constants.
Repository: commons-rng
Updated Branches:
refs/heads/master 1b0e32ec0 -> 410f2d4b7
Named constants.
Project: http://git-wip-us.apache.org/repos/asf/commons-rng/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-rng/commit/410f2d4b
Tree: http://git-wip-us.apache.org/repos/asf/commons-rng/tree/410f2d4b
Diff: http://git-wip-us.apache.org/repos/asf/commons-rng/diff/410f2d4b
Branch: refs/heads/master
Commit: 410f2d4b7dd224d8e1a42ce12652fbc68f02814a
Parents: 1b0e32e
Author: Gilles <er...@apache.org>
Authored: Sun Feb 25 17:15:06 2018 +0100
Committer: Gilles <er...@apache.org>
Committed: Sun Feb 25 17:15:06 2018 +0100
----------------------------------------------------------------------
.../RejectionInversionZipfSampler.java | 22 +++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-rng/blob/410f2d4b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/RejectionInversionZipfSampler.java
----------------------------------------------------------------------
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 90ef8b9..d8eafb2 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
@@ -27,6 +27,14 @@ import org.apache.commons.rng.UniformRandomProvider;
public class RejectionInversionZipfSampler
extends SamplerBase
implements DiscreteSampler {
+ /** Threshold below which Taylor series will be used. */
+ private static final double TAYLOR_THRESHOLD = 1e-8;
+ /** 1/2 */
+ private static final double F_1_2 = 0.5;
+ /** 1/3 */
+ private static final double F_1_3 = 1d / 3;
+ /** 1/4 */
+ private static final double F_1_4 = 0.25;
/** Number of elements. */
private final int numberOfElements;
/** Exponent parameter of the distribution. */
@@ -59,7 +67,7 @@ public class RejectionInversionZipfSampler
this.numberOfElements = numberOfElements;
this.exponent = exponent;
this.hIntegralX1 = hIntegral(1.5) - 1;
- this.hIntegralNumberOfElements = hIntegral(numberOfElements + 0.5);
+ this.hIntegralNumberOfElements = hIntegral(numberOfElements + F_1_2);
this.s = 2 - hIntegralInverse(hIntegral(2.5) - h(2));
}
@@ -98,7 +106,7 @@ public class RejectionInversionZipfSampler
// u is uniformly distributed in (hIntegralX1, hIntegralNumberOfElements]
double x = hIntegralInverse(u);
- int k = (int) (x + 0.5);
+ int k = (int) (x + F_1_2);
// Limit k to the range [1, numberOfElements] if it would be outside
// due to numerical inaccuracies.
@@ -115,7 +123,7 @@ public class RejectionInversionZipfSampler
//
// where C = 1 / (hIntegralNumberOfElements - hIntegralX1)
- if (k - x <= s || u >= hIntegral(k + 0.5) - h(k)) {
+ if (k - x <= s || u >= hIntegral(k + F_1_2) - h(k)) {
// Case k = 1:
//
@@ -216,10 +224,10 @@ public class RejectionInversionZipfSampler
* @return {@code log(1 + x) / x}.
*/
private static double helper1(final double x) {
- if (Math.abs(x) > 1e-8) {
+ if (Math.abs(x) > TAYLOR_THRESHOLD) {
return Math.log1p(x) / x;
} else {
- return 1 - x * (0.5 - x * (0.33333333333333333 - 0.25 * x));
+ return 1 - x * (F_1_2 - x * (F_1_3 - F_1_4 * x));
}
}
@@ -233,10 +241,10 @@ public class RejectionInversionZipfSampler
* @return {@code (exp(x) - 1) / x} if x is non-zero, or 1 if x = 0.
*/
private static double helper2(final double x) {
- if (Math.abs(x) > 1e-8) {
+ if (Math.abs(x) > TAYLOR_THRESHOLD) {
return Math.expm1(x) / x;
} else {
- return 1 + x * 0.5 * (1 + x * 0.33333333333333333 * (1 + 0.25 * x));
+ return 1 + x * F_1_2 * (1 + x * F_1_3 * (1 + F_1_4 * x));
}
}
}