public double doTrial()

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;
  }