in src/main/java/org/apache/datasketches/kll/KllHelper.java [822:917]
private static void addEmptyTopLevelToCompletelyFullSketch(final KllSketch sketch) {
final SketchType sketchType = sketch.sketchType;
final int[] myCurLevelsArr = sketch.getLevelsArray();
final int myCurNumLevels = sketch.getNumLevels();
final int myCurTotalItemsCapacity = myCurLevelsArr[myCurNumLevels];
double minDouble = Double.NaN;
double maxDouble = Double.NaN;
float minFloat = Float.NaN;
float maxFloat = Float.NaN;
double[] myCurDoubleItemsArr = null;
float[] myCurFloatItemsArr = null;
final int myNewNumLevels;
final int[] myNewLevelsArr;
final int myNewTotalItemsCapacity;
float[] myNewFloatItemsArr = null;
double[] myNewDoubleItemsArr = null;
if (sketchType == DOUBLES_SKETCH) {
final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
minDouble = dblSk.getMinDoubleItem();
maxDouble = dblSk.getMaxDoubleItem();
myCurDoubleItemsArr = dblSk.getDoubleItemsArray();
//assert we are following a certain growth scheme
assert myCurDoubleItemsArr.length == myCurTotalItemsCapacity;
} else if (sketchType == FLOATS_SKETCH) {
final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
minFloat = fltSk.getMinFloatItem();
maxFloat = fltSk.getMaxFloatItem();
myCurFloatItemsArr = fltSk.getFloatItemsArray();
assert myCurFloatItemsArr.length == myCurTotalItemsCapacity;
}
// else {
// //ITEMS_SKETCH //TODO
// }
assert myCurLevelsArr[0] == 0; //definition of full is part of the growth scheme
final int deltaItemsCap = levelCapacity(sketch.getK(), myCurNumLevels + 1, 0, sketch.getM());
myNewTotalItemsCapacity = myCurTotalItemsCapacity + deltaItemsCap;
// Check if growing the levels arr if required.
// Note that merging MIGHT over-grow levels_, in which case we might not have to grow it
final boolean growLevelsArr = myCurLevelsArr.length < myCurNumLevels + 2;
// GROW LEVELS ARRAY
if (growLevelsArr) {
//grow levels arr by one and copy the old data to the new array, extra space at the top.
myNewLevelsArr = Arrays.copyOf(myCurLevelsArr, myCurNumLevels + 2);
assert myNewLevelsArr.length == myCurLevelsArr.length + 1;
myNewNumLevels = myCurNumLevels + 1;
sketch.incNumLevels(); //increment the class member
} else {
myNewLevelsArr = myCurLevelsArr;
myNewNumLevels = myCurNumLevels;
}
// This loop updates all level indices EXCLUDING the "extra" index at the top
for (int level = 0; level <= myNewNumLevels - 1; level++) {
myNewLevelsArr[level] += deltaItemsCap;
}
myNewLevelsArr[myNewNumLevels] = myNewTotalItemsCapacity; // initialize the new "extra" index at the top
// GROW ITEMS ARRAY
if (sketchType == DOUBLES_SKETCH) {
myNewDoubleItemsArr = new double[myNewTotalItemsCapacity];
// copy and shift the current data into the new array
System.arraycopy(myCurDoubleItemsArr, 0, myNewDoubleItemsArr, deltaItemsCap, myCurTotalItemsCapacity);
} else if (sketchType == FLOATS_SKETCH) {
myNewFloatItemsArr = new float[myNewTotalItemsCapacity];
// copy and shift the current items data into the new array
System.arraycopy(myCurFloatItemsArr, 0, myNewFloatItemsArr, deltaItemsCap, myCurTotalItemsCapacity);
}
// else {
// //ITEMS_SKETCH // TODO
// }
//MEMORY SPACE MANAGEMENT
if (sketch.serialVersionUpdatable) {
sketch.wmem = memorySpaceMgmt(sketch, myNewLevelsArr.length, myNewTotalItemsCapacity);
}
//update our sketch with new expanded spaces
sketch.setNumLevels(myNewNumLevels);
sketch.setLevelsArray(myNewLevelsArr);
if (sketchType == DOUBLES_SKETCH) {
final KllDoublesSketch dblSk = (KllDoublesSketch) sketch;
dblSk.setMinDoubleItem(minDouble);
dblSk.setMaxDoubleItem(maxDouble);
dblSk.setDoubleItemsArray(myNewDoubleItemsArr);
} else { //Float sketch
final KllFloatsSketch fltSk = (KllFloatsSketch) sketch;
fltSk.setMinFloatItem(minFloat);
fltSk.setMaxFloatItem(maxFloat);
fltSk.setFloatItemsArray(myNewFloatItemsArr);
}
}