@Test public void estimationModeWithSamplingNoResizing() { UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<>( new DoubleSummaryFactory()) .setSamplingProbability(0.5f) .setResizeFactor(ResizeFactor.X1).build(); for (int i = 0; i < 16384; i++) { sketch.update(i, 1.0); } Assert.assertTrue(sketch.isEstimationMode()); Assert.assertEquals(sketch.getEstimate(), 16384, 16384 * 0.01); Assert.assertTrue(sketch.getEstimate() >= sketch.getLowerBound(1)); Assert.assertTrue(sketch.getEstimate() < sketch.getUpperBound(1)); }
@Test public void isEmptyWithSampling() { float samplingProbability = 0.1f; UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<>(new DoubleSummaryFactory()) .setSamplingProbability(samplingProbability).build(); Assert.assertTrue(sketch.isEmpty()); Assert.assertFalse(sketch.isEstimationMode()); Assert.assertEquals(sketch.getEstimate(), 0.0); Assert.assertEquals(sketch.getUpperBound(1), 0.0); Assert.assertEquals(sketch.getLowerBound(1), 0.0); Assert.assertEquals(sketch.getThetaLong() / (double) Long.MAX_VALUE, (double) samplingProbability); Assert.assertEquals(sketch.getTheta(), (double) samplingProbability); }
@Test public void serialVersion1Compatibility() throws Exception { byte[] bytes = TestUtil.readBytesFromFile(getClass().getClassLoader() .getResource("UpdatableSketchWithDoubleSummary4K_serialVersion1.bin").getFile()); UpdatableSketch<Double, DoubleSummary> sketch = Sketches.heapifyUpdatableSketch( Memory.wrap(bytes), new DoubleSummaryDeserializer(), new DoubleSummaryFactory()); Assert.assertTrue(sketch.isEstimationMode()); Assert.assertEquals(sketch.getEstimate(), 8192, 8192 * 0.99); Assert.assertEquals(sketch.getRetainedEntries(), 4096); int count = 0; SketchIterator<DoubleSummary> it = sketch.iterator(); while (it.next()) { Assert.assertEquals(it.getSummary().getValue(), 10.0); count++; } Assert.assertEquals(count, 4096); }
new UpdatableSketchBuilder<>( new DoubleSummaryFactory()).build(); Assert.assertEquals(sketch.getEstimate(), 0.0); for (int i = 1; i <= 8192; i++) { sketch.update(i, 1.0); Assert.assertEquals(sketch.getEstimate(), 8192, 8192 * 0.01); Assert.assertTrue(sketch.getEstimate() >= sketch.getLowerBound(1)); Assert.assertTrue(sketch.getEstimate() < sketch.getUpperBound(1)); Assert.assertTrue(sketch.isEmpty()); Assert.assertFalse(sketch.isEstimationMode()); Assert.assertEquals(sketch.getEstimate(), 0.0); Assert.assertEquals(sketch.getUpperBound(1), 0.0); Assert.assertEquals(sketch.getLowerBound(1), 0.0);
@Test public void isEmpty() { UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<>(new DoubleSummaryFactory()).build(); Assert.assertTrue(sketch.isEmpty()); Assert.assertFalse(sketch.isEstimationMode()); Assert.assertEquals(sketch.getEstimate(), 0.0); Assert.assertEquals(sketch.getUpperBound(1), 0.0); Assert.assertEquals(sketch.getLowerBound(1), 0.0); Assert.assertEquals(sketch.getThetaLong(), Long.MAX_VALUE); Assert.assertEquals(sketch.getTheta(), 1.0); Assert.assertNotNull(sketch.toString()); SketchIterator<DoubleSummary> it = sketch.iterator(); Assert.assertNotNull(it); Assert.assertFalse(it.next()); }
@Test public void sampling() { float samplingProbability = 0.001f; UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<>( new DoubleSummaryFactory()).setSamplingProbability(samplingProbability).build(); sketch.update("a", 1.0); Assert.assertFalse(sketch.isEmpty()); Assert.assertTrue(sketch.isEstimationMode()); Assert.assertEquals(sketch.getEstimate(), 0.0); Assert.assertTrue(sketch.getUpperBound(1) > 0.0); Assert.assertEquals(sketch.getLowerBound(1), 0.0, 0.0000001); Assert.assertEquals(sketch.getThetaLong() / (double) Long.MAX_VALUE, (double) samplingProbability); Assert.assertEquals(sketch.getTheta(), (double) samplingProbability); }
@Test public void serializeDeserializeExact() throws Exception { UpdatableSketch<Double, DoubleSummary> sketch1 = new UpdatableSketchBuilder<>(new DoubleSummaryFactory()).build(); sketch1.update(1, 1.0); UpdatableSketch<Double, DoubleSummary> sketch2 = Sketches.heapifyUpdatableSketch( Memory.wrap(sketch1.toByteArray()), new DoubleSummaryDeserializer(), new DoubleSummaryFactory()); Assert.assertEquals(sketch2.getEstimate(), 1.0); SketchIterator<DoubleSummary> it = sketch2.iterator(); Assert.assertTrue(it.next()); Assert.assertEquals(it.getSummary().getValue(), 1.0); Assert.assertFalse(it.next()); // the same key, so still one unique sketch2.update(1, 1.0); Assert.assertEquals(sketch2.getEstimate(), 1.0); sketch2.update(2, 1.0); Assert.assertEquals(sketch2.getEstimate(), 2.0); }
new DoubleSummaryFactory()).build(); Assert.assertTrue(sketch.isEmpty()); Assert.assertEquals(sketch.getEstimate(), 0.0); for (int i = 1; i <= 4096; i++) { sketch.update(i, 1.0); Assert.assertEquals(sketch.getEstimate(), 4096.0); Assert.assertEquals(sketch.getUpperBound(1), 4096.0); Assert.assertEquals(sketch.getLowerBound(1), 4096.0); Assert.assertTrue(sketch.isEmpty()); Assert.assertFalse(sketch.isEstimationMode()); Assert.assertEquals(sketch.getEstimate(), 0.0); Assert.assertEquals(sketch.getUpperBound(1), 0.0); Assert.assertEquals(sketch.getLowerBound(1), 0.0);
@Test public void filledSketchShouldBehaveTheSame() { UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<>(new DoubleSummaryFactory()).build(); fillSketch(sketch, numberOfElements, 0.0); Filter<DoubleSummary> filter = new Filter<>(o -> true); Sketch<DoubleSummary> filteredSketch = filter.filter(sketch); Assert.assertEquals(filteredSketch.getEstimate(), sketch.getEstimate()); Assert.assertEquals(filteredSketch.getThetaLong(), sketch.getThetaLong()); Assert.assertFalse(filteredSketch.isEmpty()); Assert.assertEquals(filteredSketch.getLowerBound(1), sketch.getLowerBound(1)); Assert.assertEquals(filteredSketch.getUpperBound(1), sketch.getUpperBound(1)); }
@Test public void nonEmptySketchWithNoEntries() { UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<>( new DoubleSummaryFactory()).setSamplingProbability(0.0001f).build(); sketch.update(0, 0.0); Assert.assertFalse(sketch.isEmpty()); Assert.assertEquals(sketch.getRetainedEntries(), 0); Filter<DoubleSummary> filter = new Filter<>(o -> true); Sketch<DoubleSummary> filteredSketch = filter.filter(sketch); Assert.assertFalse(filteredSketch.isEmpty()); Assert.assertEquals(filteredSketch.getEstimate(), sketch.getEstimate()); Assert.assertEquals(filteredSketch.getThetaLong(), sketch.getThetaLong()); Assert.assertEquals(filteredSketch.getLowerBound(1), sketch.getLowerBound(1)); Assert.assertEquals(filteredSketch.getUpperBound(1), sketch.getUpperBound(1)); }
@Test public void updatesOfAllKeyTypes() { UpdatableSketch<Double, DoubleSummary> sketch = new UpdatableSketchBuilder<>(new DoubleSummaryFactory()).build(); sketch.update(1L, 1.0); sketch.update(2.0, 1.0); byte[] bytes = { 3 }; sketch.update(bytes, 1.0); int[] ints = { 4 }; sketch.update(ints, 1.0); long[] longs = { 5L }; sketch.update(longs, 1.0); sketch.update("a", 1.0); Assert.assertEquals(sketch.getEstimate(), 6.0); }