dnscrypt-proxy/vendor/github.com/lifenjoiner/ewma/ewma.go

45 lines
904 B
Go

// Package ewma: exponentially weighted moving averages
package ewma
// New EWMA by moving window size.
func NewMovingAverage(slide int) *EWMA {
return &EWMA{
slide: slide,
}
}
type EWMA struct {
// Too big slide is meaningless.
slide int
// Count before warmed up.
count int
// Decay by slide size.
decay float64
// The average.
value float64
}
// Add a value to the series and update the moving average.
func (a *EWMA) Add(value float64) {
switch {
case a.count <= a.slide:
a.count++
a.decay = 2 / float64(a.count + 1)
a.value = a.value * (1 - a.decay) + value * a.decay
default:
a.value = a.value * (1 - a.decay) + value * a.decay
}
}
// Return the current EWMA value.
func (a *EWMA) Value() float64 {
return a.value
}
// Set the EWMA value for continuing.
func (a *EWMA) Set(value float64) {
a.value = value
a.decay = 2 / float64(a.slide + 1)
a.count = a.slide + 1
}