/src/tor/src/lib/math/stats.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright (c) 2022, The Tor Project, Inc. */ |
2 | | /* See LICENSE for licensing information */ |
3 | | |
4 | | /** |
5 | | * \file stats.h |
6 | | * |
7 | | * \brief Header for stats.c |
8 | | **/ |
9 | | |
10 | | #ifndef TOR_STATS_H |
11 | | #define TOR_STATS_H |
12 | | |
13 | | /** |
14 | | * Compute an N-count EWMA, aka N-EWMA. N-EWMA is defined as: |
15 | | * EWMA = alpha*value + (1-alpha)*EWMA_prev |
16 | | * with alpha = 2/(N+1). |
17 | | * |
18 | | * This works out to: |
19 | | * EWMA = value*2/(N+1) + EMA_prev*(N-1)/(N+1) |
20 | | * = (value*2 + EWMA_prev*(N-1))/(N+1) |
21 | | */ |
22 | | static inline double |
23 | | n_count_ewma_double(double avg, double value, uint64_t N) |
24 | 0 | { |
25 | | /* If the average was not previously computed, return value. |
26 | | * The less than is because we have stupid C warning flags that |
27 | | * prevent exact comparison to 0.0, so we can't do an exact |
28 | | * check for uninitialized double values. Yay pedantry! |
29 | | * Love it when it introduces surprising edge case bugs like |
30 | | * this will. */ |
31 | 0 | if (avg < 0.0000002) |
32 | 0 | return value; |
33 | 0 | else |
34 | 0 | return (2*value + (N-1)*avg)/(N+1); |
35 | 0 | } Unexecuted instantiation: circuitlist.c:n_count_ewma_double Unexecuted instantiation: congestion_control_flow.c:n_count_ewma_double Unexecuted instantiation: congestion_control_vegas.c:n_count_ewma_double |
36 | | |
37 | | /* For most stats, an N_EWMA of 100 is sufficient */ |
38 | 0 | #define DEFAULT_STATS_N_EWMA_COUNT 100 |
39 | | #define stats_update_running_avg(avg, value) \ |
40 | 0 | n_count_ewma_double(avg, value, DEFAULT_STATS_N_EWMA_COUNT) |
41 | | |
42 | | #endif /* !defined(TOR_STATS_H) */ |