From 78198aff4ce22b0f34e3159c082686b03ac1f939 Mon Sep 17 00:00:00 2001 From: Giorgos Stamatelatos Date: Sat, 27 Jan 2018 17:18:11 +0200 Subject: [PATCH] EfraimidisSampling can have weights 0.0 and 1.0 (#12) --- .../java/gr/james/sampling/EfraimidisSampling.java | 2 +- .../gr/james/sampling/WeightedRandomSamplingTest.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/gr/james/sampling/EfraimidisSampling.java b/src/main/java/gr/james/sampling/EfraimidisSampling.java index b7bf448..2515ab0 100644 --- a/src/main/java/gr/james/sampling/EfraimidisSampling.java +++ b/src/main/java/gr/james/sampling/EfraimidisSampling.java @@ -102,7 +102,7 @@ public EfraimidisSampling feed(T item, double weight) { // Calculate item weight final Weighted newItem = new Weighted<>(item, Math.pow(r, 1 / weight)); - assert newItem.weight > 0.0 && newItem.weight < 1.0; + assert newItem.weight >= 0.0 && newItem.weight <= 1.0; // weight can also be 0.0 or 1.0 because of double precision // Add item to reservoir if (pq.size() < sampleSize) { diff --git a/src/test/java/gr/james/sampling/WeightedRandomSamplingTest.java b/src/test/java/gr/james/sampling/WeightedRandomSamplingTest.java index 67d0620..98b98d1 100644 --- a/src/test/java/gr/james/sampling/WeightedRandomSamplingTest.java +++ b/src/test/java/gr/james/sampling/WeightedRandomSamplingTest.java @@ -95,4 +95,15 @@ public void stream() { } } + /** + * Pass very small and very large weights to check if algorithms fail. + */ + @Test + public void cornerWeights() { + final WeightedRandomSampling alg = impl.get(); + alg.feed(0, Double.MIN_VALUE); + alg.feed(1, Double.MAX_VALUE); + alg.sample(); + } + }