docs: boolean handleOutliers(ThroughputDistribution distribution, double throughput) {
          if (throughput < 0.0) {
              resetStatistics(false);
              return true;
          } else if (throughput == 0.0) {
              return false;
          }
  
          double zScore = distribution.getZScore(throughput);
          boolean currentIsOutlier = zScore <= -3.0 || zScore >= 3.0;
  
          // 8/10/2012: Reset the data for this thread count when we hit an outlier
          // 1/20/2018: refine the distribution reset criteria
          if (currentIsOutlier) {
              /*
               * Decide whether to reset the distribution, which throws away the historical
               * ewma for the poolSize and replaces it with the new throughput.
               * We will use 3 criteria, any of which is sufficient to reset the distribution:
               *
               * 1) How much do we trust the historical data?
               * If the historical ewma is the result of many observations with similar throughput,
               * the standard deviation will be a small fraction of the ewma. If stddev/ewma is
               * greater than 10%, then the historical data is not really strong, let's reset.
               *
               * 2) How much different is the new tput from the ewma?
               * If the new throughput is very very different from the ewma, that suggests the workload
               * may have changed significantly, in which case the historical data would no longer be
               * valid. If the throughput change is greater than 50% of ewma, let's reset.
               *
               * 3) Is the throughput simply unstable?
               * If every new datapoint at this poolSize is more than 3 standard deviations off the
               * historical ewma, then we may as well follow the bouncing ball, rather than averaging
               * points which do not seem to want to cluster around a mean. If we get N outliers in a
               * row at this poolSize, let's reset.
               */
              double ewma = distribution.getMovingAverage();
              double stddev = distribution.getStddev();
              if ((stddev / ewma) > resetDistroStdDevEwmaRatio
                  || (Math.abs(throughput - ewma) / ewma) > resetDistroNewTputEwmaRatio
                  || distribution.incrementAndGetConsecutiveOutliers() >= resetDistroConsecutiveOutliers) {
                  if (tc.isEventEnabled()) {
                      Tr.event(tc, "reset distribution", (" distribution: " + distribution + ", new throughput: " + throughput));
                  }
                  distribution.reset(throughput, controllerCycle);
                  distributionReset = true;
              } else if (tc.isEventEnabled()) {
                  Tr.event(tc, "outlier detected", (" distribution: " + distribution + ", new throughput: " + throughput));
              }
          } else {
              distribution.resetConsecutiveOutliers();
          }
  
          // Check for repeated outliers
          // 1/20/2018: increment only after resetting a distribution, not a single outlier event
          if (lastAction != LastAction.NONE) {
              if (distributionReset) {
                  consecutiveOutlierAfterAdjustment++;
              } else {
                  consecutiveOutlierAfterAdjustment = 0;
              }
          }
  
          // If we repeatedly hit an outlier after changing the pool size
          // we should reset the statistics
          if (consecutiveOutlierAfterAdjustment >= MAX_OUTLIER_AFTER_CHANGE_BEFORE_RESET) {
              resetThreadPool();
              return true;
          }
  
          return false;
      }