It calculates the incremental weighted mean using kahan-neumaier summation and a delta approach. By adding incremental values we prevent overflow
(interval int, mean float64, weight float64)
| 257 | // It calculates the incremental weighted mean using kahan-neumaier summation and a delta approach. |
| 258 | // By adding incremental values we prevent overflow |
| 259 | func (k *averageSeries) addWeigthedMean(interval int, mean float64, weight float64) { |
| 260 | currentMean := k.values[interval] |
| 261 | if math.IsNaN(currentMean.mean) && !math.IsNaN(mean) { |
| 262 | k.values[interval] = averageValue{mean: mean, weight: weight} |
| 263 | return |
| 264 | } |
| 265 | |
| 266 | sumWeights := currentMean.weight + weight |
| 267 | meanDelta := ((mean - currentMean.mean) * weight) / sumWeights |
| 268 | meanDelta -= currentMean.compensation |
| 269 | |
| 270 | currentMean.add(meanDelta) |
| 271 | currentMean.weight = sumWeights |
| 272 | k.values[interval] = currentMean |
| 273 | } |
| 274 | |
| 275 | var ( |
| 276 | _ SeriesAggregator = (*averageOverTimeSeriesAggregator)(nil) |