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:
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);