quantile method

double quantile(
  1. double q
)

Estimates the value at quantile q where q is in 0,1.

Implementation

double quantile(double q) {
  if (_centroids.isEmpty) return double.nan;
  if (q <= 0) return _centroids.first.mean;
  if (q >= 1) return _centroids.last.mean;
  final target = q * _count;

  // Precompute boundaries for interpolation
  final lowerBounds = List<double>.filled(_centroids.length, 0);
  final upperBounds = List<double>.filled(_centroids.length, 0);
  for (var i = 0; i < _centroids.length; i++) {
    final c = _centroids[i];
    final prev = i > 0 ? _centroids[i - 1] : null;
    final next = i + 1 < _centroids.length ? _centroids[i + 1] : null;
    lowerBounds[i] = prev == null ? c.mean : (prev.mean + c.mean) / 2;
    upperBounds[i] = next == null ? c.mean : (c.mean + next.mean) / 2;
  }

  var cum = 0.0;
  for (var i = 0; i < _centroids.length; i++) {
    final c = _centroids[i];
    final nextCum = cum + c.weight;
    if (target <= nextCum) {
      final prop = ((target - cum) / c.weight).clamp(0.0, 1.0);
      final lo = lowerBounds[i];
      final hi = upperBounds[i];
      return lo + (hi - lo) * prop;
    }
    cum = nextCum;
  }
  return _centroids.last.mean;
}