diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-19 16:16:35 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-05-19 16:16:35 +0000 |
commit | 0133f958c893ef19d146cdab28ad8b070e56df44 (patch) | |
tree | 4dd8239214e1ab7e0509ac18f317234d016d4e57 /container-search | |
parent | 0882d70b3d9514c2efe49fafe7ecd2896b3334be (diff) |
The estimate is not bounded by [1, K] so it must be capped.
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/TopKEstimator.java | 4 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/dispatch/TopKEstimatorTest.java | 58 |
2 files changed, 60 insertions, 2 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/TopKEstimator.java b/container-search/src/main/java/com/yahoo/search/dispatch/TopKEstimator.java index 8003d9c6744..d3f222a9f3e 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/TopKEstimator.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/TopKEstimator.java @@ -31,12 +31,12 @@ public class TopKEstimator { } public int estimateK(int k, int n) { return (estimate && n > 1) - ? (int)Math.ceil(estimateExactK(k, n, defaultP)) + ? Math.min(k, (int)Math.ceil(estimateExactK(k, n, defaultP))) : k; } public int estimateK(int k, int n, double p) { return (needEstimate(p) && (n > 1)) - ? (int)Math.ceil(estimateExactK(k, n, p)) + ? Math.min(k, (int)Math.ceil(estimateExactK(k, n, p))) : k; } } diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/TopKEstimatorTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/TopKEstimatorTest.java index c14e4f984f1..5d978e6b592 100644 --- a/container-search/src/test/java/com/yahoo/search/dispatch/TopKEstimatorTest.java +++ b/container-search/src/test/java/com/yahoo/search/dispatch/TopKEstimatorTest.java @@ -25,4 +25,62 @@ public class TopKEstimatorTest { assertEquals(44.909040374464155, estimator.estimateExactK(200, 10, 0.99999), 0.0); assertEquals(45, estimator.estimateK(200, 10, 0.99999)); } + @Test + public void requireHitsAreEstimatedAccordingToPartitionsAndProbabilityForVaryingN_K200() { + TopKEstimator estimator = new TopKEstimator(30, 0.99999); + assertEquals(200, estimator.estimateExactK(200, 1), 0.0); + assertEquals(200, estimator.estimateK(200, 1)); + assertEquals(137.4727798056239, estimator.estimateExactK(200, 2), 0.0); + assertEquals(102.95409291533568, estimator.estimateExactK(200, 3), 0.0); + assertEquals(44.909040374464155, estimator.estimateExactK(200, 10), 0.0); + assertEquals(28.86025772029091, estimator.estimateExactK(200, 20), 0.0); + } + + @Test + public void requireHitsAreEstimatedAccordingToPartitionsAndProbabilityForVaryingN_K20() { + TopKEstimator estimator = new TopKEstimator(30, 0.99999); + assertEquals(20, estimator.estimateExactK(20, 1), 0.0); + assertEquals(20, estimator.estimateK(20, 1)); + assertEquals(21.849933444373328, estimator.estimateExactK(20, 2), 0.0); + assertEquals(18.14175840378403, estimator.estimateExactK(20, 3), 0.0); + assertEquals(9.87693019124002, estimator.estimateExactK(20, 10), 0.0); + assertEquals(6.964137165389415, estimator.estimateExactK(20, 20), 0.0); + } + + @Test + public void requireHitsAreEstimatedAccordingToPartitionsAndProbabilityForVaryingN_K10_Five9() { + TopKEstimator estimator = new TopKEstimator(30, 0.99999); + assertEquals(10, estimator.estimateExactK(10, 1), 0.0); + assertEquals(10, estimator.estimateK(10, 1)); + assertEquals(13.379168295125641, estimator.estimateExactK(10, 2), 0.0); + assertEquals(11.447448515386741, estimator.estimateExactK(10, 3), 0.0); + assertEquals(6.569830753158866, estimator.estimateExactK(10, 10), 0.0); + assertEquals(4.717281833573569, estimator.estimateExactK(10, 20), 0.0); + } + + @Test + public void requireHitsAreEstimatedAccordingToPartitionsAndProbabilityForVaryingN_K10_Four9() { + TopKEstimator estimator = new TopKEstimator(30, 0.9999); + assertEquals(10, estimator.estimateExactK(10, 1), 0.0); + assertEquals(10, estimator.estimateK(10, 1)); + assertEquals(12.087323848369289, estimator.estimateExactK(10, 2), 0.0); + assertEquals(10.230749855131009, estimator.estimateExactK(10, 3), 0.0); + assertEquals(5.794676146031378, estimator.estimateExactK(10, 10), 0.0); + assertEquals(4.152394782937266, estimator.estimateExactK(10, 20), 0.0); + } + + @Test + public void requireEstimatesAreRoundeUp() { + TopKEstimator estimator = new TopKEstimator(30, 0.9999); + assertEquals(5.794676146031378, estimator.estimateExactK(10, 10), 0.0); + assertEquals(6, estimator.estimateK(10, 10)); + } + + @Test + public void requireEstimatesAreCappedAtInputK() { + TopKEstimator estimator = new TopKEstimator(30, 0.9999); + assertEquals(12.087323848369289, estimator.estimateExactK(10, 2), 0.0); + assertEquals(10, estimator.estimateK(10, 2)); + } + } |