static String toString()

in src/main/java/org/apache/datasketches/quantiles/ItemsUtil.java [99:171]


  static <T> String toString(final boolean sketchSummary, final boolean dataDetail,
      final ItemsSketch<T> sketch) {
    final StringBuilder sb = new StringBuilder();
    final String thisSimpleName = sketch.getClass().getSimpleName();
    final int bbCount = sketch.getBaseBufferCount();
    final int combAllocCount = sketch.getCombinedBufferAllocatedCount();
    final int k = sketch.getK();
    final long bitPattern = sketch.getBitPattern();

    if (dataDetail) {
      sb.append(ClassicUtil.LS).append("### ").append(thisSimpleName).append(" DATA DETAIL: ").append(ClassicUtil.LS);
      final Object[] items  = sketch.getCombinedBuffer();

      //output the base buffer
      sb.append("   BaseBuffer   :");
      if (bbCount > 0) {
        for (int i = 0; i < bbCount; i++) {
          sb.append(' ').append(items[i]);
        }
      }
      sb.append(ClassicUtil.LS);
      //output all the levels
      final int numItems = combAllocCount;
      if (numItems > (2 * k)) {
        sb.append("   Valid | Level");
        for (int j = 2 * k; j < numItems; j++) { //output level data starting at 2K
          if ((j % k) == 0) { //start output of new level
            final int levelNum = j > (2 * k) ? (j - (2 * k)) / k : 0;
            final String validLvl = ((1L << levelNum) & bitPattern) > 0 ? "    T  " : "    F  ";
            final String lvl = String.format("%5d", levelNum);
            sb.append(ClassicUtil.LS).append("   ").append(validLvl).append(" ").append(lvl).append(":");
          }
          sb.append(' ').append(items[j]);
        }
        sb.append(ClassicUtil.LS);
      }
      sb.append("### END DATA DETAIL").append(ClassicUtil.LS);
    }

    if (sketchSummary) {
      final long n = sketch.getN();
      final String nStr = String.format("%,d", n);
      final int numLevels = ClassicUtil.computeNumLevelsNeeded(k, n);
      final String bufCntStr = String.format("%,d", combAllocCount);
      final int preBytes = sketch.isEmpty() ? Long.BYTES : 2 * Long.BYTES;
      final double epsPmf = ClassicUtil.getNormalizedRankError(k, true);
      final String epsPmfPctStr = String.format("%.3f%%", epsPmf * 100.0);
      final double eps =  ClassicUtil.getNormalizedRankError(k, false);
      final String epsPctStr = String.format("%.3f%%", eps * 100.0);
      final int numSamples = sketch.getNumRetained();
      final String numSampStr = String.format("%,d", numSamples);
      final T minItem = sketch.isEmpty() ? null : sketch.getMinItem();
      final T maxItem = sketch.isEmpty() ? null : sketch.getMaxItem();
      sb.append(ClassicUtil.LS).append("### ").append(thisSimpleName).append(" SUMMARY: ").append(ClassicUtil.LS);
      sb.append("   K                            : ").append(k).append(ClassicUtil.LS);
      sb.append("   N                            : ").append(nStr).append(ClassicUtil.LS);
      sb.append("   BaseBufferCount              : ").append(bbCount).append(ClassicUtil.LS);
      sb.append("   CombinedBufferAllocatedCount : ").append(bufCntStr).append(ClassicUtil.LS);
      sb.append("   Total Levels                 : ").append(numLevels).append(ClassicUtil.LS);
      sb.append("   Valid Levels                 : ").append(ClassicUtil.computeValidLevels(bitPattern))
        .append(ClassicUtil.LS);
      sb.append("   Level Bit Pattern            : ").append(Long.toBinaryString(bitPattern))
        .append(ClassicUtil.LS);
      sb.append("   Valid Samples                : ").append(numSampStr).append(ClassicUtil.LS);
      sb.append("   Preamble Bytes               : ").append(preBytes).append(ClassicUtil.LS);
      sb.append("   Normalized Rank Error        : ").append(epsPctStr).append(LS);
      sb.append("   Normalized Rank Error (PMF)  : ").append(epsPmfPctStr).append(LS);
      sb.append("   Min Quantile                 : ").append(minItem).append(ClassicUtil.LS);
      sb.append("   Max Quantile                 : ").append(maxItem).append(ClassicUtil.LS);
      sb.append("### END SKETCH SUMMARY").append(ClassicUtil.LS);
    }
    return sb.toString();
  }