Track a series of values and provide access to smoothed values over a window or the global series average.
| 49 | |
| 50 | |
| 51 | class AverageMeter: |
| 52 | """Track a series of values and provide access to smoothed values over a |
| 53 | window or the global series average. |
| 54 | """ |
| 55 | |
| 56 | def __init__(self, window_size=50): |
| 57 | self._deque = deque(maxlen=window_size) |
| 58 | self._total = 0.0 |
| 59 | self._count = 0 |
| 60 | |
| 61 | def update(self, value): |
| 62 | self._deque.append(value) |
| 63 | self._count += 1 |
| 64 | self._total += value |
| 65 | |
| 66 | @property |
| 67 | def median(self): |
| 68 | d = np.array(list(self._deque)) |
| 69 | return np.median(d) |
| 70 | |
| 71 | @property |
| 72 | def avg(self): |
| 73 | # if deque is empty, nan will be returned. |
| 74 | d = np.array(list(self._deque)) |
| 75 | return d.mean() |
| 76 | |
| 77 | @property |
| 78 | def global_avg(self): |
| 79 | return self._total / max(self._count, 1e-5) |
| 80 | |
| 81 | @property |
| 82 | def latest(self): |
| 83 | return self._deque[-1] if len(self._deque) > 0 else None |
| 84 | |
| 85 | @property |
| 86 | def total(self): |
| 87 | return self._total |
| 88 | |
| 89 | def reset(self): |
| 90 | self._deque.clear() |
| 91 | self._total = 0.0 |
| 92 | self._count = 0 |
| 93 | |
| 94 | def clear(self): |
| 95 | self._deque.clear() |
| 96 | |
| 97 | |
| 98 | class MeterBuffer(defaultdict): |
nothing calls this directly
no outgoing calls
no test coverage detected