forked from arminbiere/gimsatul
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaverage.c
30 lines (28 loc) · 846 Bytes
/
average.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "average.h"
#include "logging.h"
#include "message.h"
#ifdef LOGGING
#include "ring.h"
#endif
void update_average (struct ring *ring, struct average *average,
const char *name, double alpha, double y) {
double old_biased = average->biased;
double delta = y - old_biased;
double scaled_delta = alpha * delta;
double new_biased = old_biased + scaled_delta;
average->biased = new_biased;
double old_exp = average->exp;
double new_value;
if (old_exp) {
double beta = 1 - alpha;
double new_exp = old_exp * beta;
average->exp = new_exp;
double div = 1 - new_exp;
new_value = new_biased / div;
} else
new_value = new_biased;
LOG ("update %s average with %g to %g from %g", name, y, new_value,
average->value);
average->value = new_value;
(void) ring, (void) name;
}