LaundrySorcery

Log | Files | Refs

commit 412d7e9bdf15cf23ac867239f5123ceb618001c9
parent 9fde11575a775949dc32e7038805bc8d4d830c83
Author: Dominik Schmidt <das1993@hotmail.com>
Date:   Fri, 29 Jun 2018 14:42:47 +0000

Don't add the outliers to the current gaussian right away.

Diffstat:
src/laundrysorcery.c | 29++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/laundrysorcery.c b/src/laundrysorcery.c @@ -23,10 +23,14 @@ void update_gaussian_lambda(Gaussian *g, double value, double lambda){ #define MIN_MEASURES 100 -void update_gaussian(Gaussian *g, double value){ +double calculate_lambda(Gaussian *g){ double lambda=0.75+0.25/MIN_MEASURES*g->measurements; lambda=fmin(lambda,0.999995); - update_gaussian_lambda(g,value,lambda); + return lambda; +} + +void update_gaussian(Gaussian *g, double value){ + update_gaussian_lambda(g,value,calculate_lambda(g)); } @@ -110,18 +114,37 @@ int guess_if_toggle(double delta_t){ return guess_is_on(delta_t)^on; } +void merge_gaussian(Gaussian *a, Gaussian b, double factor){ + factor=pow(factor, b.measurements); + a->mean*=factor; + a->mean+=b.mean; + a->variance*=factor; + a->variance+=b.variance; + a->measurements+=b.measurements; +} + void process_datapoint(double delta_t){ static unsigned int consecutive_outliers=0; + static Gaussian tmp={0,0,0}; running_mean=(running_mean+delta_t)/2; if(current->measurements>MIN_MEASURES){ if(guess_if_toggle(delta_t)){ + if(conescutive_outliers == 0){ + tmp=*current; + } if(consecutive_outliers++>100){ toggle_on_off(); consecutive_outliers=0; } + update_gaussian(&tmp,delta_t); + return; } else{ - consecutive_outliers=0; + if(consecutive_outliers>0){ + tmp->measurements=consecutive_outliers; + merge_gaussians(current, tmp, calculate_lambda(current)); + consecutive_outliers=0; + } } } update_gaussian(current,delta_t);