in src/main/java/org/apache/datasketches/characterization/kll/KllWorstCaseSketchAccuracyProfile.java [139:212]
public double doTrial() {
double worstNegRankError = 0;
double worstPosRankError = 0;
//DOUBLES SKETCH
if (sketchType == SketchType.DOUBLES_SKETCH) {
shuffle(inputDoubleValues);
doubleQueryValues = DoubleIntIntTriple.getValueArray(inputDoubleValues);
doubleRankValues = DoubleIntIntTriple.getRankArray(inputDoubleValues);
// reset then update sketch
dskUT.reset();
for (int i = 0; i < streamLength; i++) {
dskUT.update(inputDoubleValues[i].value);
}
// query sketch and gather results
worstNegRankError = 0;
worstPosRankError = 0;
final int queryLen = inputDoubleValues.length;
final int one = (criteria == EXCLUSIVE) ? 1 : 0;
if (useBulk) {
final double[] estRanks = dskUT.getRanks(doubleQueryValues);
for (int i = 0; i < queryLen; i++) {
final double trueNormRank = (double) (doubleRankValues[i] - one) / streamLength;
final double deltaRankErr = estRanks[i] - trueNormRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
} else {
for (int i = 0; i < queryLen; i++) {
final double estRank = dskUT.getRank(doubleRankValues[i]);
final double trueNormRank = (double) (doubleRankValues[i] - one) / streamLength;
final double deltaRankErr = estRank - trueNormRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
}
}
//FLOATS SKETCH
else {
shuffle(inputFloatValues);
floatQueryValues = FloatIntIntTriple.getValueArray(inputFloatValues);
floatRankValues = FloatIntIntTriple.getRankArray(inputFloatValues);
// reset then update sketch
fskUT.reset();
for (int i = 0; i < inputFloatValues.length; i++) {
fskUT.update(inputFloatValues[i].value);
}
// query sketch and gather results
worstNegRankError = 0;
worstPosRankError = 0;
final int queryLen = inputFloatValues.length;
final int one = (criteria == EXCLUSIVE) ? 1 : 0;
if (useBulk) {
final double[] estRanks = fskUT.getRanks(floatQueryValues);
for (int i = 0; i < queryLen; i++) {
final double normRank = (double) (floatRankValues[i] - one) / streamLength;
final double deltaRankErr = estRanks[i] - normRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
} else {
for (int i = 0; i < queryLen; i++) {
final double estRank = fskUT.getRank(floatRankValues[i]);
final double normRank = (double) (floatRankValues[i] - one) / streamLength;
final double deltaRankErr = estRank - normRank;
if (deltaRankErr < 0) { worstNegRankError = Math.min(worstNegRankError, deltaRankErr); }
else { worstPosRankError = Math.max(worstPosRankError, deltaRankErr); }
}
}
}
return (worstPosRankError > -worstNegRankError) ? worstPosRankError : worstNegRankError;
}