in src/main/java/org/apache/datasketches/characterization/kll/KllSketchAccuracyProfile.java [138:202]
public double doTrial() {
double worstNegRankError = 0;
double worstPosRankError = 0;
if (useDouble) {
shuffle(inputDoubleValues);
// reset then update sketch
dskUT.reset();
for (int i = 0; i < streamLength; i++) {
dskUT.update(inputDoubleValues[i]);
}
// query sketch and gather results
worstNegRankError = 0;
worstPosRankError = 0;
final int queryLen = trueRanks.length;
if (useBulk) {
final double[] estRanks = dskUT.getCDF(doubleQueryValues);
for (int i = 0; i < queryLen; i++) {
final double trueRank = (double) trueRanks[i] / streamLength;
final double deltaRankErr = estRanks[i] - trueRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
} else {
for (int i = 0; i < queryLen; i++) {
final double trueRank = (double) trueRanks[i] / streamLength;
final double deltaRankErr = dskUT.getRank(i) - trueRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
}
}
else { //use Float
shuffle(inputFloatValues);
// reset then update sketch
fskUT.reset();
for (int i = 0; i < inputFloatValues.length; i++) {
fskUT.update(inputFloatValues[i]);
}
// query sketch and gather results
worstNegRankError = 0;
worstPosRankError = 0;
final int qLen = trueRanks.length;
if (useBulk) {
final double[] estRanks = fskUT.getCDF(floatQueryValues);
for (int i = 0; i < qLen; i++) {
final double trueRank = (double) trueRanks[i] / streamLength;
final double deltaRankErr = estRanks[i] - trueRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
} else {
for (int i = 0; i < qLen; i++) {
final double trueRank = (double) trueRanks[i] / streamLength;
final double deltaRankErr = fskUT.getRank(i) - trueRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
}
}
return (worstPosRankError > -worstNegRankError) ? worstPosRankError : worstNegRankError;
}