Codebase list golang-github-vbauerster-mpb / 6188f03
TimeNormalizer interface Vladimir Bauer 7 years ago
1 changed file(s) with 24 addition(s) and 15 deletion(s). Raw diff Collapse all Expand all
77 "github.com/VividCortex/ewma"
88 )
99
10 type TimeNormalizer func(time.Duration) time.Duration
10 // TimeNormalizer interface
11 // Implementors meant to normalize ETA.
12 type TimeNormalizer interface {
13 Normalize(time.Duration) time.Duration
14 }
15
16 // TimeNormalizerFunc is function type adapter to convert function
17 // into TimeNormalizer.
18 type TimeNormalizerFunc func(time.Duration) time.Duration
19
20 func (f TimeNormalizerFunc) Normalize(src time.Duration) time.Duration {
21 return f(src)
22 }
1123
1224 // EwmaETA exponential-weighted-moving-average based ETA decorator.
1325 //
1729 //
1830 // `wcc` optional WC config
1931 func EwmaETA(style TimeStyle, age float64, wcc ...WC) Decorator {
20 return MovingAverageETA(style, ewma.NewMovingAverage(age), NopNormalizer(), wcc...)
32 return MovingAverageETA(style, ewma.NewMovingAverage(age), nil, wcc...)
2133 }
2234
2335 // MovingAverageETA decorator relies on MovingAverage implementation to calculate its average.
2638 //
2739 // `average` available implementations of MovingAverage [ewma.MovingAverage|NewMedian|NewMedianEwma]
2840 //
29 // `normalizer` available implementations are [NopNormalizer|FixedIntervalTimeNormalizer|MaxTolerateTimeNormalizer]
41 // `normalizer` available implementations are [FixedIntervalTimeNormalizer|MaxTolerateTimeNormalizer]
3042 //
3143 // `wcc` optional WC config
3244 func MovingAverageETA(style TimeStyle, average MovingAverage, normalizer TimeNormalizer, wcc ...WC) Decorator {
5870 }
5971
6072 v := math.Round(d.average.Value())
61 remaining := d.normalizer(time.Duration((st.Total - st.Current) * int64(v)))
73 remaining := time.Duration((st.Total - st.Current) * int64(v))
74 if d.normalizer != nil {
75 remaining = d.normalizer.Normalize(remaining)
76 }
6277 hours := int64((remaining / time.Hour) % 60)
6378 minutes := int64((remaining / time.Minute) % 60)
6479 seconds := int64((remaining / time.Second) % 60)
165180 func MaxTolerateTimeNormalizer(maxTolerate time.Duration) TimeNormalizer {
166181 var normalized time.Duration
167182 var lastCall time.Time
168 return func(remaining time.Duration) time.Duration {
183 return TimeNormalizerFunc(func(remaining time.Duration) time.Duration {
169184 if diff := normalized - remaining; diff <= 0 || diff > maxTolerate || remaining < maxTolerate/2 {
170185 normalized = remaining
171186 lastCall = time.Now()
174189 normalized -= time.Since(lastCall)
175190 lastCall = time.Now()
176191 return normalized
177 }
192 })
178193 }
179194
180195 func FixedIntervalTimeNormalizer(updInterval int) TimeNormalizer {
181196 var normalized time.Duration
182197 var lastCall time.Time
183198 var count int
184 return func(remaining time.Duration) time.Duration {
199 return TimeNormalizerFunc(func(remaining time.Duration) time.Duration {
185200 if count == 0 || remaining <= time.Duration(15*time.Second) {
186201 count = updInterval
187202 normalized = remaining
195210 return normalized
196211 }
197212 return remaining
198 }
199 }
200
201 func NopNormalizer() TimeNormalizer {
202 return func(remaining time.Duration) time.Duration {
203 return remaining
204 }
205 }
213 })
214 }