in src/main/java/org/apache/datasketches/tdigest/TDigestDouble.java [393:445]
public static TDigestDouble heapify(final Memory mem, final boolean isFloat) {
final Buffer buff = mem.asBuffer();
final byte preambleLongs = buff.getByte();
final byte serialVersion = buff.getByte();
final byte sketchType = buff.getByte();
if (sketchType != (byte) Family.TDIGEST.getID()) {
if (preambleLongs == 0 && serialVersion == 0 && sketchType == 0) { return heapifyCompat(mem); }
throw new SketchesArgumentException("Sketch type mismatch: expected " + Family.TDIGEST.getID() + ", actual " + sketchType);
}
if (serialVersion != SERIAL_VERSION) {
throw new SketchesArgumentException("Serial version mismatch: expected " + SERIAL_VERSION + ", actual " + serialVersion);
}
final short k = buff.getShort();
final byte flagsByte = buff.getByte();
final boolean isEmpty = (flagsByte & (1 << Flags.IS_EMPTY.ordinal())) > 0;
final boolean isSingleValue = (flagsByte & (1 << Flags.IS_SINGLE_VALUE.ordinal())) > 0;
final byte expectedPreambleLongs = isEmpty || isSingleValue ? PREAMBLE_LONGS_EMPTY_OR_SINGLE : PREAMBLE_LONGS_MULTIPLE;
if (preambleLongs != expectedPreambleLongs) {
throw new SketchesArgumentException("Preamble longs mismatch: expected " + expectedPreambleLongs + ", actual " + preambleLongs);
}
buff.getShort(); // unused
if (isEmpty) { return new TDigestDouble(k); }
final boolean reverseMerge = (flagsByte & (1 << Flags.REVERSE_MERGE.ordinal())) > 0;
if (isSingleValue) {
final double value;
if (isFloat) {
value = buff.getFloat();
} else {
value = buff.getDouble();
}
return new TDigestDouble(reverseMerge, k, value, value, new double[] {value}, new long[] {1}, 1, null);
}
final int numCentroids = buff.getInt();
buff.getInt(); // unused
final double min;
final double max;
if (isFloat) {
min = buff.getFloat();
max = buff.getFloat();
} else {
min = buff.getDouble();
max = buff.getDouble();
}
final double[] means = new double[numCentroids];
final long[] weights = new long[numCentroids];
long totalWeight = 0;
for (int i = 0; i < numCentroids; i++) {
means[i] = isFloat ? buff.getFloat() : buff.getDouble();
weights[i] = isFloat ? buff.getInt() : buff.getLong();
totalWeight += weights[i];
}
return new TDigestDouble(reverseMerge, k, min, max, means, weights, totalWeight, null);
}