From e71d63ce1bfa9784e18852fec264357bda5e3671 Mon Sep 17 00:00:00 2001 From: Nick Hollinghurst Date: Wed, 6 Dec 2023 17:27:43 +0000 Subject: ipa: rpi: Allow the mean of an empty histogram interval Don't assert when taking the weighted mean of a zero-width or zero-weight interval; return its upper bound. That is certainly correct in the zero-width case, and plausible otherwise. Signed-off-by: Nick Hollinghurst Reviewed-by: David Plowman Reviewed-by: Naushir Patuck Signed-off-by: Kieran Bingham --- src/ipa/rpi/controller/histogram.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/ipa/rpi') diff --git a/src/ipa/rpi/controller/histogram.cpp b/src/ipa/rpi/controller/histogram.cpp index 0a27ba2c..78116141 100644 --- a/src/ipa/rpi/controller/histogram.cpp +++ b/src/ipa/rpi/controller/histogram.cpp @@ -47,7 +47,7 @@ double Histogram::quantile(double q, int first, int last) const double Histogram::interBinMean(double binLo, double binHi) const { - assert(binHi > binLo); + assert(binHi >= binLo); double sumBinFreq = 0, cumulFreq = 0; for (double binNext = floor(binLo) + 1.0; binNext <= ceil(binHi); binLo = binNext, binNext += 1.0) { @@ -57,13 +57,19 @@ double Histogram::interBinMean(double binLo, double binHi) const sumBinFreq += bin * freq; cumulFreq += freq; } + + if (cumulFreq == 0) { + /* interval had zero width or contained no weight? */ + return binHi; + } + /* add 0.5 to give an average for bin mid-points */ return sumBinFreq / cumulFreq + 0.5; } double Histogram::interQuantileMean(double qLo, double qHi) const { - assert(qHi > qLo); + assert(qHi >= qLo); double pLo = quantile(qLo); double pHi = quantile(qHi, (int)pLo); return interBinMean(pLo, pHi); -- cgit v1.2.1