Codebase list golang-github-vbauerster-mpb / d037a3b
medianWindow type Vladimir Bauer 7 years ago
1 changed file(s) with 19 addition(s) and 26 deletion(s). Raw diff Collapse all Expand all
1414 Set(float64)
1515 }
1616
17 type median struct {
18 window [3]float64
19 dst []float64
17 type medianWindow [3]float64
18
19 func (s *medianWindow) Len() int { return len(s) }
20 func (s *medianWindow) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
21 func (s *medianWindow) Less(i, j int) bool { return s[i] < s[j] }
22
23 func (s *medianWindow) Add(value float64) {
24 s[0], s[1] = s[1], s[2]
25 s[2] = value
2026 }
2127
22 type sortable []float64
23
24 func (s sortable) Len() int { return len(s) }
25 func (s sortable) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
26 func (s sortable) Less(i, j int) bool { return s[i] < s[j] }
27
28 func (s *median) Add(v float64) {
29 s.window[0], s.window[1] = s.window[1], s.window[2]
30 s.window[2] = v
28 func (s *medianWindow) Value() float64 {
29 tmp := *s
30 sort.Sort(&tmp)
31 return tmp[1]
3132 }
3233
33 func (s *median) Value() float64 {
34 copy(s.dst, s.window[:])
35 sort.Sort(sortable(s.dst))
36 return s.dst[1]
37 }
38
39 func (s *median) Set(value float64) {
40 for i, _ := range s.window {
41 s.window[i] = value
34 func (s *medianWindow) Set(value float64) {
35 for i := 0; i < len(s); i++ {
36 s[i] = value
4237 }
4338 }
4439
4540 // NewMedian is fixed last 3 samples median MovingAverage.
4641 func NewMedian() MovingAverage {
47 return &median{
48 dst: make([]float64, 3),
49 }
42 return new(medianWindow)
5043 }
5144
5245 type medianEwma struct {
5750
5851 func (s *medianEwma) Add(v float64) {
5952 s.median.Add(v)
60 s.count++
61 if s.count >= 3 {
53 if s.count >= 2 {
6254 s.MovingAverage.Add(s.median.Value())
6355 }
56 s.count++
6457 }
6558
6659 // NewMedianEwma is ewma based MovingAverage, which gets its values from median MovingAverage.