@Test public void wrapEmptyUpdateSketch() { final UpdateDoublesSketch s1 = DoublesSketch.builder().build(); final WritableMemory mem = WritableMemory.wrap(ByteBuffer.wrap(s1.toByteArray()).order(ByteOrder.nativeOrder())); final UpdateDoublesSketch s2 = DirectUpdateDoublesSketch.wrapInstance(mem); assertTrue(s2.isEmpty()); assertEquals(s2.getN(), 0); assertTrue(Double.isNaN(s2.getMinValue())); assertTrue(Double.isNaN(s2.getMaxValue())); s2.reset(); // empty: so should be a no-op assertEquals(s2.getN(), 0); }
@Test public void itemsToDoubles() { final ItemsSketch<Double> sketch1 = ItemsSketch.getInstance(Comparator.naturalOrder()); for (int i = 1; i <= 500; i++) { sketch1.update((double) i); } final byte[] bytes = sketch1.toByteArray(serDe); final UpdateDoublesSketch sketch2; sketch2 = UpdateDoublesSketch.heapify(Memory.wrap(bytes)); for (int i = 501; i <= 1000; i++) { sketch2.update(i); } Assert.assertEquals(sketch2.getN(), 1000); Assert.assertTrue(sketch2.getRetainedItems() < 1000); Assert.assertEquals(sketch2.getMinValue(), 1.0); Assert.assertEquals(sketch2.getMaxValue(), 1000.0); // based on ~1.7% normalized rank error for this particular case Assert.assertEquals(sketch2.getQuantile(0.5), 500.0, 17); }
@Test public void serializeDeserializeEmptyNonCompact() { UpdateDoublesSketch sketch1 = DoublesSketch.builder().build(); byte[] byteArr = sketch1.toByteArray(false); //Ordered, Not Compact, Empty assertEquals(byteArr.length, sketch1.getStorageBytes()); Memory mem = Memory.wrap(byteArr); UpdateDoublesSketch sketch2 = (UpdateDoublesSketch) DoublesSketch.heapify(mem); for (int i = 0; i < 1000; i++) { sketch2.update(i); } assertEquals(sketch2.getMinValue(), 0.0); assertEquals(sketch2.getMaxValue(), 999.0); assertEquals(sketch2.getQuantile(0.5), 500.0, 4.0); }
@Test public void wrapAndTryUpdatingSparseSketch() { UpdateDoublesSketch s1 = DoublesSketch.builder().build(); s1.update(1); s1.update(2); final byte[] bytes = s1.toByteArray(false); Assert.assertEquals(bytes.length, 64); // 32 + MIN_K(=2) * 2 * 8 = 64 //final Memory mem = Memory.wrap(ByteBuffer.wrap(bytes) // .asReadOnlyBuffer().order(ByteOrder.nativeOrder())); final Memory mem = Memory.wrap(bytes); final UpdateDoublesSketch s2 = (UpdateDoublesSketch) DoublesSketch.wrap(mem); Assert.assertEquals(s2.getMinValue(), 1.0); Assert.assertEquals(s2.getMaxValue(), 2.0); try { s2.update(3); fail(); } catch (final SketchesReadOnlyException e) { // expected } }
@Test public void checkPutCombinedBuffer() { final int k = PreambleUtil.DEFAULT_K; final int cap = 32 + ((2 * k) << 3); WritableMemory mem = WritableMemory.wrap(new byte[cap]); final UpdateDoublesSketch qs = DoublesSketch.builder().setK(k).build(mem); mem = qs.getMemory(); assertEquals(mem.getCapacity(), cap); assertTrue(qs.isEmpty()); final int n = 16; final double[] data = new double[n]; for (int i = 0; i < n; ++i) { data[i] = i + 1; } qs.putBaseBufferCount(n); qs.putN(n); qs.putCombinedBuffer(data); final double[] combBuf = qs.getCombinedBuffer(); assertEquals(combBuf, data); // shouldn't have changed min/max values assertTrue(Double.isNaN(qs.getMinValue())); assertTrue(Double.isNaN(qs.getMaxValue())); }
@Test public void heapifyAndUpdateSparseSketch() { UpdateDoublesSketch s1 = DoublesSketch.builder().build(); s1.update(1); s1.update(2); Memory mem = Memory.wrap(s1.toByteArray(false)); UpdateDoublesSketch s2 = (UpdateDoublesSketch) DoublesSketch.heapify(mem); s2.update(3); Assert.assertEquals(s2.getMinValue(), 1.0); Assert.assertEquals(s2.getMaxValue(), 3.0); }
@Test public void serializeDeserializeCompact() { UpdateDoublesSketch sketch1 = DoublesSketch.builder().build(); for (int i = 0; i < 1000; i++) { sketch1.update(i); } UpdateDoublesSketch sketch2; sketch2 = (UpdateDoublesSketch) DoublesSketch.heapify(Memory.wrap(sketch1.toByteArray())); for (int i = 0; i < 1000; i++) { sketch2.update(i + 1000); } assertEquals(sketch2.getMinValue(), 0.0); assertEquals(sketch2.getMaxValue(), 1999.0); assertEquals(sketch2.getQuantile(0.5), 1000.0, 10.0); }
@Test public void directToHeap() { int sizeBytes = 10000; UpdateDoublesSketch directSketch = DoublesSketch.builder().build(WritableMemory.wrap(new byte[sizeBytes])); for (int i = 0; i < 1000; i++) { directSketch.update(i); } UpdateDoublesSketch heapSketch; heapSketch = (UpdateDoublesSketch) DoublesSketch.heapify(WritableMemory.wrap(directSketch.toByteArray())); for (int i = 0; i < 1000; i++) { heapSketch.update(i + 1000); } assertEquals(heapSketch.getMinValue(), 0.0); assertEquals(heapSketch.getMaxValue(), 1999.0); assertEquals(heapSketch.getQuantile(0.5), 1000.0, 10.0); }
assert hcds.bitPattern_ == sketch.getBitPattern(); hcds.minValue_ = sketch.getMinValue(); hcds.maxValue_ = sketch.getMaxValue(); hcds.baseBufferCount_ = computeBaseBufferItems(k, n);
@Test public void checkPutMemory() { UpdateDoublesSketch qs1 = DoublesSketch.builder().build(); //k = 128 for (int i=0; i<1000; i++) { qs1.update(i); } int bytes = qs1.getUpdatableStorageBytes(); WritableMemory dstMem = WritableMemory.wrap(new byte[bytes]); qs1.putMemory(dstMem, false); Memory srcMem = dstMem; DoublesSketch qs2 = DoublesSketch.heapify(srcMem); assertEquals(qs1.getMinValue(), qs2.getMinValue(), 0.0); assertEquals(qs1.getMaxValue(), qs2.getMaxValue(), 0.0); }
@Test public void serializeDeserialize() { int sizeBytes = DoublesSketch.getUpdatableStorageBytes(128, 2000); WritableMemory mem = WritableMemory.wrap(new byte[sizeBytes]); UpdateDoublesSketch sketch1 = DoublesSketch.builder().build(mem); for (int i = 0; i < 1000; i++) { sketch1.update(i); } UpdateDoublesSketch sketch2 = UpdateDoublesSketch.wrap(mem); for (int i = 0; i < 1000; i++) { sketch2.update(i + 1000); } assertEquals(sketch2.getMinValue(), 0.0); assertEquals(sketch2.getMaxValue(), 1999.0); assertEquals(sketch2.getQuantile(0.5), 1000.0, 10.0); byte[] arr2 = sketch2.toByteArray(false); assertEquals(arr2.length, sketch2.getStorageBytes()); DoublesSketch sketch3 = DoublesSketch.wrap(WritableMemory.wrap(arr2)); assertEquals(sketch3.getMinValue(), 0.0); assertEquals(sketch3.getMaxValue(), 1999.0); assertEquals(sketch3.getQuantile(0.5), 1000.0, 10.0); }
double tgtMin = tgt.getMinValue(); tgtMin = Double.isNaN(tgtMin) ? Double.POSITIVE_INFINITY : tgtMin;
double tgtMin = tgt.getMinValue(); tgtMin = Double.isNaN(tgtMin) ? Double.POSITIVE_INFINITY : tgtMin;
insertFlags(dstMem, flags); insertN(dstMem, n); insertMinDouble(dstMem, sketch.getMinValue()); insertMaxDouble(dstMem, sketch.getMaxValue());
assert hcds.bitPattern_ == sketch.getBitPattern(); hcds.minValue_ = sketch.getMinValue(); hcds.maxValue_ = sketch.getMaxValue(); hcds.baseBufferCount_ = computeBaseBufferItems(k, n);
double tgtMin = tgt.getMinValue(); tgtMin = Double.isNaN(tgtMin) ? Double.POSITIVE_INFINITY : tgtMin;
double tgtMin = tgt.getMinValue(); tgtMin = Double.isNaN(tgtMin) ? Double.POSITIVE_INFINITY : tgtMin;
insertFlags(dstMem, flags); insertN(dstMem, n); insertMinDouble(dstMem, sketch.getMinValue()); insertMaxDouble(dstMem, sketch.getMaxValue());