From 0e76bbbe7844307ef192f2f3830f5b41eddffa8b Mon Sep 17 00:00:00 2001 From: Giorgos Stamatelatos Date: Mon, 2 Jul 2018 15:06:22 +0300 Subject: [PATCH] Fix LiLSampling skip becoming Long.MIN_VALUE --- src/main/java/gr/james/sampling/LiLSampling.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/gr/james/sampling/LiLSampling.java b/src/main/java/gr/james/sampling/LiLSampling.java index 3367890..8ba5ca2 100644 --- a/src/main/java/gr/james/sampling/LiLSampling.java +++ b/src/main/java/gr/james/sampling/LiLSampling.java @@ -51,14 +51,18 @@ public static RandomSamplingCollector collector(int sampleSize, Random ra @Override void init(int sampleSize, Random random) { - W = Math.exp(Math.log(random.nextDouble()) / sampleSize); + W = Math.exp(Math.log(RandomSamplingUtils.randomExclusive(random)) / sampleSize); } @Override long skipLength(long streamSize, int sampleSize, Random random) { final double random1 = RandomSamplingUtils.randomExclusive(random); final double random2 = RandomSamplingUtils.randomExclusive(random); - final long skip = (long) (Math.log(random1) / Math.log(1 - W)); + long skip = (long) (Math.log(random1) / Math.log(1 - W)); + assert skip >= 0 || skip == Long.MIN_VALUE; + if (skip == Long.MIN_VALUE) { // Sometimes when W is very small, 1 - W = 1 and Math.log(1) = +0 instead of -0 + skip = Long.MAX_VALUE; // This results in negative infinity skip + } W = W * Math.exp(Math.log(random2) / sampleSize); return skip; }