in src/main/java/org/apache/datasketches/kll/KllPreambleUtil.java [192:324]
static String toString(final Memory mem, final SketchType sketchType, final boolean includeData) {
final KllMemoryValidate memVal = new KllMemoryValidate(mem, sketchType);
final int flags = memVal.flags & 0XFF;
final String flagsStr = (flags) + ", 0x" + (Integer.toHexString(flags)) + ", "
+ zeroPad(Integer.toBinaryString(flags), 8);
final int preInts = memVal.preInts;
final boolean serialVersionUpdatable = getMemorySerVer(mem) == SERIAL_VERSION_UPDATABLE;
final boolean empty = memVal.empty;
final boolean singleItem = memVal.singleItem;
final int sketchBytes = memVal.sketchBytes;
final int typeBytes = sketchType == DOUBLES_SKETCH ? Double.BYTES : Float.BYTES;
final int familyID = getMemoryFamilyID(mem);
final String famName = idToFamily(familyID).toString();
final StringBuilder sb = new StringBuilder();
sb.append(Util.LS).append("### KLL SKETCH MEMORY SUMMARY:").append(LS);
sb.append("Byte 0 : Preamble Ints : ").append(preInts).append(LS);
sb.append("Byte 1 : SerVer : ").append(memVal.serVer).append(LS);
sb.append("Byte 2 : FamilyID : ").append(memVal.familyID).append(LS);
sb.append(" FamilyName : ").append(famName).append(LS);
sb.append("Byte 3 : Flags Field : ").append(flagsStr).append(LS);
sb.append(" Bit Flag Name").append(LS);
sb.append(" 0 EMPTY COMPACT : ").append(empty).append(LS);
sb.append(" 1 LEVEL_ZERO_SORTED : ").append(memVal.level0Sorted).append(LS);
sb.append(" 2 SINGLE_ITEM COMPACT : ").append(singleItem).append(LS);
sb.append(" 3 DOUBLES_SKETCH : ").append(sketchType == DOUBLES_SKETCH).append(LS);
sb.append(" 4 UPDATABLE : ").append(serialVersionUpdatable).append(LS);
sb.append("Bytes 4-5 : K : ").append(memVal.k).append(LS);
sb.append("Byte 6 : Min Level Cap, M : ").append(memVal.m).append(LS);
sb.append("Byte 7 : (Reserved) : ").append(LS);
final long n = memVal.n;
final int minK = memVal.minK;
final int numLevels = memVal.numLevels;
if (serialVersionUpdatable || (!empty && !singleItem)) {
sb.append("Bytes 8-15: N : ").append(n).append(LS);
sb.append("Bytes 16-17: MinK : ").append(minK).append(LS);
sb.append("Byte 18 : NumLevels : ").append(numLevels).append(LS);
}
else {
sb.append("Assumed : N : ").append(n).append(LS);
sb.append("Assumed : MinK : ").append(minK).append(LS);
sb.append("Assumed : NumLevels : ").append(numLevels).append(LS);
}
sb.append("PreambleBytes : ").append(preInts * 4).append(LS);
sb.append("Sketch Bytes : ").append(sketchBytes).append(LS);
sb.append("Memory Capacity Bytes : ").append(mem.getCapacity()).append(LS);
sb.append("### END KLL Sketch Memory Summary").append(LS);
if (includeData) {
sb.append(LS);
sb.append("### START KLL DATA:").append(LS);
int offsetBytes = 0;
if (serialVersionUpdatable) {
sb.append("LEVELS ARR:").append(LS);
offsetBytes = DATA_START_ADR;
for (int i = 0; i < numLevels + 1; i++) {
sb.append(i + ", " + mem.getInt(offsetBytes)).append(LS);
offsetBytes += Integer.BYTES;
}
sb.append("MIN/MAX:").append(LS);
if (sketchType == DOUBLES_SKETCH) {
sb.append(mem.getDouble(offsetBytes)).append(LS);
offsetBytes += typeBytes;
sb.append(mem.getDouble(offsetBytes)).append(LS);
offsetBytes += typeBytes;
} else { //floats
sb.append(mem.getFloat(offsetBytes)).append(LS);
offsetBytes += typeBytes;
sb.append(mem.getFloat(offsetBytes)).append(LS);
offsetBytes += typeBytes;
}
sb.append("ITEMS DATA").append(LS);
final int itemsSpace = (sketchBytes - offsetBytes) / typeBytes;
if (sketchType == DOUBLES_SKETCH) {
for (int i = 0; i < itemsSpace; i++) {
sb.append(i + ", " + mem.getDouble(offsetBytes)).append(LS);
offsetBytes += typeBytes;
}
} else { //floats
for (int i = 0; i < itemsSpace; i++) {
sb.append(mem.getFloat(offsetBytes)).append(LS);
offsetBytes += typeBytes;
}
}
} else if (!empty && !singleItem) { //compact full
sb.append("LEVELS ARR:").append(LS);
offsetBytes = DATA_START_ADR;
for (int i = 0; i < numLevels; i++) {
sb.append(i + ", " + mem.getInt(offsetBytes)).append(LS);
offsetBytes += Integer.BYTES;
}
sb.append("(top level of Levels arr is absent)").append(LS);
sb.append("MIN/MAX:").append(LS);
if (sketchType == DOUBLES_SKETCH) {
sb.append(mem.getDouble(offsetBytes)).append(LS);
offsetBytes += typeBytes;
sb.append(mem.getDouble(offsetBytes)).append(LS);
offsetBytes += typeBytes;
} else { //floats
sb.append(mem.getFloat(offsetBytes)).append(LS);
offsetBytes += typeBytes;
sb.append(mem.getFloat(offsetBytes)).append(LS);
offsetBytes += typeBytes;
}
sb.append("ITEMS DATA").append(LS);
final int itemSpace = (sketchBytes - offsetBytes) / typeBytes;
if (sketchType == DOUBLES_SKETCH) {
for (int i = 0; i < itemSpace; i++) {
sb.append(i + ", " + mem.getDouble(offsetBytes)).append(LS);
offsetBytes += typeBytes;
}
} else { //floats
for (int i = 0; i < itemSpace; i++) {
sb.append(i + ", " + mem.getFloat(offsetBytes)).append(LS);
offsetBytes += typeBytes;
}
}
} else { //single item
if (singleItem) {
sb.append("SINGLE ITEM DATA").append(LS);
sb.append(sketchType == DOUBLES_SKETCH
? mem.getDouble(DATA_START_ADR_SINGLE_ITEM)
: mem.getFloat(DATA_START_ADR_SINGLE_ITEM)).append(LS);
}
}
sb.append("### END KLL DATA:").append(LS);
}
return sb.toString();
}