Histogram constructor

Histogram(
  1. List<int> measurements, {
  2. int? forceRange,
})

Creates a histogram from a list of measurements.

If forceRange is specified, the histogram will only span from -x to +x, exactly. The measurements that fall outside this range will be added to the outermost buckets.

Implementation

Histogram(List<int> measurements, {int? forceRange}) {
  // Maximum distance from 0.
  var distance = forceRange ??
      measurements.fold<int>(
          0, (previousValue, element) => max(previousValue, element.abs()));

  lowestBound = (-distance - 1);
  highestBound = (distance + 1);

  bucketWidth = (highestBound - lowestBound) / bucketCount;

  for (final m in measurements) {
    var bucketIndex = ((m - lowestBound) / bucketWidth).floor();
    if (bucketIndex < 0) {
      assert(forceRange != null);
      bucketIndex = 0;
    }
    if (bucketIndex >= bucketCount) {
      assert(forceRange != null);
      bucketIndex = bucketCount - 1;
    }
    bucketMemberCounts[bucketIndex] += 1;
  }

  final highestCount = bucketMemberCounts.fold<int>(0, max);
  bucketsNormalized = List<double>.generate(
      bucketCount, (index) => bucketMemberCounts[index] / highestCount);
}