docs: public SampleSubsetSummary estimateSubsetSum(final Predicate<T> predicate) {
      if (itemsSeen_ == 0) {
        return new SampleSubsetSummary(0.0, 0.0, 0.0, 0.0);
      }
  
      final long numSamples = getNumSamples();
      final double samplingRate = numSamples / (double) itemsSeen_;
      assert samplingRate >= 0.0;
      assert samplingRate <= 1.0;
  
      int trueCount = 0;
      for (int i = 0; i < numSamples; ++i) {
        if (predicate.test(data_.get(i))) {
          ++trueCount;
        }
      }
  
      // if in exact mode, we can return an exact answer
      if (itemsSeen_ <= reservoirSize_) {
        return new SampleSubsetSummary(trueCount, trueCount, trueCount, numSamples);
      }
  
      final double lbTrueFraction = pseudoHypergeometricLBonP(numSamples, trueCount, samplingRate);
      final double estimatedTrueFraction = (1.0 * trueCount) / numSamples;
      final double ubTrueFraction = pseudoHypergeometricUBonP(numSamples, trueCount, samplingRate);
      return new SampleSubsetSummary(
              itemsSeen_ * lbTrueFraction,
              itemsSeen_ * estimatedTrueFraction,
              itemsSeen_ * ubTrueFraction,
              itemsSeen_);
    }