@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 checkPuts() { long n1 = 1001; UpdateDoublesSketch qsk = buildAndLoadQS(32, (int)n1); long n2 = qsk.getN(); assertEquals(n2, n1); int bbCnt1 = qsk.getBaseBufferCount(); long pat1 = qsk.getBitPattern(); qsk.putBitPattern(pat1 + 1); //corrupt the pattern long pat2 = qsk.getBitPattern(); assertEquals(pat1 + 1, pat2); qsk.putBaseBufferCount(bbCnt1 + 1); //corrupt the bbCount int bbCnt2 = qsk.getBaseBufferCount(); assertEquals(bbCnt1 + 1, bbCnt2); qsk.putN(n1 + 1); //corrupt N long n3 = qsk.getN(); assertEquals(n1 + 1, n3); assertNull(qsk.getMemory()); }
@Test public void checkGrowFromWrappedEmptySketch() { final int k = 16; final int n = 0; final int initBytes = DoublesSketch.getUpdatableStorageBytes(k, n); //8 bytes final UpdateDoublesSketch usk1 = DoublesSketch.builder().setK(k).build(); final Memory origSketchMem = Memory.wrap(usk1.toByteArray()); try (WritableDirectHandle memHandle = WritableMemory.allocateDirect(initBytes)) { WritableMemory mem = memHandle.get(); origSketchMem.copyTo(0, mem, 0, initBytes); UpdateDoublesSketch usk2 = DirectUpdateDoublesSketch.wrapInstance(mem); assertTrue(mem.isSameResource(usk2.getMemory())); assertEquals(mem.getCapacity(), initBytes); assertTrue(mem.isDirect()); assertTrue(usk2.isEmpty()); //update the sketch forcing it to grow on-heap for (int i = 1; i <= 5; i++) { usk2.update(i); } assertEquals(usk2.getN(), 5); WritableMemory mem2 = usk2.getMemory(); assertFalse(mem.isSameResource(mem2)); assertFalse(mem2.isDirect()); //should now be on-heap final int expectedSize = COMBINED_BUFFER + ((2 * k) << 3); assertEquals(mem2.getCapacity(), expectedSize); } }
@Test public void checkMisc() { int k = PreambleUtil.DEFAULT_K; int n = 48; int cap = 32 + ((2 * k) << 3); WritableMemory mem = WritableMemory.wrap(new byte[cap]); UpdateDoublesSketch qs = DoublesSketch.builder().setK(k).build(mem); mem = qs.getMemory(); assertEquals(mem.getCapacity(), cap); double[] combBuf = qs.getCombinedBuffer(); assertEquals(combBuf.length, 2 * k); qs = buildAndLoadDQS(k, n); qs.update(Double.NaN); int n2 = (int)qs.getN(); assertEquals(n2, n); combBuf = qs.getCombinedBuffer(); assertEquals(combBuf.length, ceilingPowerOf2(n)); // since n < k println(qs.toString(true, true)); qs.reset(); assertEquals(qs.getN(), 0); qs.putBaseBufferCount(0); }
final WritableMemory mem = tgt.getMemory(); mem.clearBits(FLAGS_BYTE, (byte) EMPTY_FLAG_MASK);
final WritableMemory mem = tgt.getMemory(); mem.clearBits(FLAGS_BYTE, (byte) EMPTY_FLAG_MASK);
if (myQS.isEmpty()) { if (myQS.isDirect()) { final WritableMemory mem = myQS.getMemory(); //myQS is empty, ok to reconfigure other.putMemory(mem, false); // not compact, but BB ordered ret = DirectUpdateDoublesSketch.wrapInstance(mem); ? DoublesSketch.builder().setK(other.getK()).build(myQS.getMemory()) : DoublesSketch.builder().setK(other.getK()).build();
final WritableMemory mem = tgt.getMemory(); mem.clearBits(FLAGS_BYTE, (byte) EMPTY_FLAG_MASK);
final WritableMemory mem = tgt.getMemory(); mem.clearBits(FLAGS_BYTE, (byte) EMPTY_FLAG_MASK);
if (myQS.isEmpty()) { if (myQS.isDirect()) { final WritableMemory mem = myQS.getMemory(); //myQS is empty, ok to reconfigure other.putMemory(mem, false); // not compact, but BB ordered ret = DirectUpdateDoublesSketch.wrapInstance(mem); ? DoublesSketch.builder().setK(other.getK()).build(myQS.getMemory()) : DoublesSketch.builder().setK(other.getK()).build();