quantile method
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;
}