public long readFirst() { long value = in.getLong(Long.SIZE); predictor.update(value); return value; }
public long readFirst() { long value = in.getLong(Long.SIZE); predictor.update(value); return value; }
void writeFirst(long value) { predictor.update(value); out.writeBits(value, 64); }
void writeFirst(long value) { predictor.update(value); out.writeBits(value, 64); }
protected void compressValue(long value) { // In original Gorilla, Last-Value predictor is used long diff = predictor.predict() ^ value; predictor.update(value); if(diff == 0) { // Write 0 out.skipBit(); } else { int leadingZeros = Long.numberOfLeadingZeros(diff); int trailingZeros = Long.numberOfTrailingZeros(diff); out.writeBit(); // Optimize to writeNewLeading / writeExistingLeading? if(leadingZeros >= storedLeadingZeros && trailingZeros >= storedTrailingZeros) { writeExistingLeading(diff); } else { writeNewLeading(diff, leadingZeros, trailingZeros); } } }
protected void compressValue(long value) { // In original Gorilla, Last-Value predictor is used long diff = predictor.predict() ^ value; predictor.update(value); if(diff == 0) { // Write 0 out.skipBit(); } else { int leadingZeros = Long.numberOfLeadingZeros(diff); int trailingZeros = Long.numberOfTrailingZeros(diff); out.writeBit(); // Optimize to writeNewLeading / writeExistingLeading? if(leadingZeros >= storedLeadingZeros && trailingZeros >= storedTrailingZeros) { writeExistingLeading(diff); } else { writeNewLeading(diff, leadingZeros, trailingZeros); } } }
public long nextValue() { int val = in.nextClearBit(2); switch(val) { case 3: // New leading and trailing zeros storedLeadingZeros = (int) in.getLong(6); byte significantBits = (byte) in.getLong(6); significantBits++; storedTrailingZeros = Long.SIZE - significantBits - storedLeadingZeros; // missing break is intentional, we want to overflow to next one case 2: long value = in.getLong(Long.SIZE - storedLeadingZeros - storedTrailingZeros); value <<= storedTrailingZeros; value = predictor.predict() ^ value; predictor.update(value); return value; } return predictor.predict(); } }
public long nextValue() { int val = in.nextClearBit(2); switch(val) { case 3: // New leading and trailing zeros storedLeadingZeros = (int) in.getLong(6); byte significantBits = (byte) in.getLong(6); significantBits++; storedTrailingZeros = Long.SIZE - significantBits - storedLeadingZeros; // missing break is intentional, we want to overflow to next one case 2: long value = in.getLong(Long.SIZE - storedLeadingZeros - storedTrailingZeros); value <<= storedTrailingZeros; value = predictor.predict() ^ value; predictor.update(value); return value; } return predictor.predict(); } }