2 * This file is part of GNUnet
3 * (C) 2013 Christian Grothoff (and other contributing authors)
5 * GNUnet is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published
7 * by the Free Software Foundation; either version 3, or (at your
8 * option) any later version.
10 * GNUnet is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GNUnet; see the file COPYING. If not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * @file sensor/plugin_sensor_model_gaussian.c
23 * @brief Gaussian model for sensor analysis
24 * @author Omar Tarabai
28 #include "gnunet_sensor_model_plugin.h"
29 #include "gnunet_sensor_service.h"
32 #define LOG(kind,...) GNUNET_log_from (kind, "sensor-model-gaussian", __VA_ARGS__)
35 * Plugin state information
41 * Configuration handle
43 const struct GNUNET_CONFIGURATION_Handle *cfg;
46 * Number of initial readings to be used for training only
51 * Number of standard deviations considered within "normal"
53 int confidence_interval;
58 * State of single model instance
64 * Pointer to the plugin state
66 struct Plugin *plugin;
69 * Number of readings so far
79 * Sum square of readings
86 update_sums (struct Model *model, double val)
89 model->sumsq += val * val;
94 * Feed a new value to a model
96 * @param cls closure (model state)
97 * @param val value to be fed to the model
98 * @return #GNUNET_YES in case of a detected outlier, #GNUNET_NO otherwise
101 sensor_gaussian_model_feed (void *cls, double val)
103 struct Model *model = cls;
104 struct Plugin *plugin = model->plugin;
107 long double allowed_variance;
109 if (model->n < plugin->training_window)
111 update_sums(model, val);
114 mean = model->sum / model->n;
116 (model->sumsq - 2 * mean * model->sum + model->n * mean * mean)
120 allowed_variance = (plugin->confidence_interval * stddev);
121 if ((val < (mean - allowed_variance)) ||
122 (val > (mean + allowed_variance)))
128 * Destroy a model instance
130 * @param cls closure (model state)
133 sensor_gaussian_model_destroy_model (void *cls)
135 struct Model *model = cls;
141 * Create a model instance
143 * @param cls closure (plugin state)
144 * @return model state to be used for later calls
147 sensor_gaussian_model_create_model (void *cls)
149 struct Plugin *plugin = cls;
152 model = GNUNET_new(struct Model);
153 model->plugin = plugin;
158 * Entry point for the plugin.
160 * @param cls The struct GNUNET_CONFIGURATION_Handle.
161 * @return NULL on error, otherwise the plugin context
164 libgnunet_plugin_sensor_model_gaussian_init (void *cls)
166 static struct Plugin plugin;
167 const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
168 struct GNUNET_SENSOR_ModelFunctions *api;
169 unsigned long long num;
171 if (NULL != plugin.cfg)
172 return NULL; /* can only initialize once! */
173 memset (&plugin, 0, sizeof (struct Plugin));
175 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg,
176 "sensor-model-gaussian", "TRAINING_WINDOW", &num))
178 LOG (GNUNET_ERROR_TYPE_ERROR,
179 _("Missing `TRAINING_WINDOW' value in configuration.\n"));
182 plugin.training_window = (int) num;
183 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number(cfg,
184 "sensor-model-gaussian", "CONFIDENCE_INTERVAL", &num))
186 LOG (GNUNET_ERROR_TYPE_ERROR,
187 _("Missing `CONFIDENCE_INTERVAL' value in configuration.\n"));
190 plugin.confidence_interval = (int) num;
191 api = GNUNET_new (struct GNUNET_SENSOR_ModelFunctions);
193 api->create_model = &sensor_gaussian_model_create_model;
194 api->destroy_model = &sensor_gaussian_model_destroy_model;
195 api->feed_model = &sensor_gaussian_model_feed;
196 LOG(GNUNET_ERROR_TYPE_DEBUG, "Gaussian model plugin is running.\n");
201 * Exit point from the plugin.
203 * @param cls The plugin context (as returned by "init")
204 * @return Always NULL
207 libgnunet_plugin_sensor_model_gaussian_done (void *cls)
209 struct GNUNET_SENSOR_ModelFunctions *api = cls;
210 struct Plugin *plugin = api->cls;
214 LOG (GNUNET_ERROR_TYPE_DEBUG, "Guassian model plugin is finished\n");
219 /* end of plugin_sensor_model_gaussian.c */