Version 1.10.0.
[libguestfs.git] / fish / rmsd.h
1 /* libguestfs - guestfish shell
2  * Copyright (C) 2010 Red Hat Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18
19 #ifndef FISH_RMSD_H
20 #define FISH_RMSD_H
21
22 /* Compute the running mean and standard deviation from the
23  * series of estimated values.
24  *
25  * Method:
26  * http://en.wikipedia.org/wiki/Standard_deviation#Rapid_calculation_methods
27  * Checked in a test program against answers given by Wolfram Alpha.
28  */
29 struct rmsd {
30   double a;                     /* mean */
31   double i;                     /* number of samples */
32   double q;
33 };
34
35 static void
36 rmsd_init (struct rmsd *r)
37 {
38   r->a = 0;
39   r->i = 1;
40   r->q = 0;
41 }
42
43 static void
44 rmsd_add_sample (struct rmsd *r, double x)
45 {
46   double a_next, q_next;
47
48   a_next = r->a + (x - r->a) / r->i;
49   q_next = r->q + (x - r->a) * (x - a_next);
50   r->a = a_next;
51   r->q = q_next;
52   r->i += 1.0;
53 }
54
55 static double
56 rmsd_get_mean (const struct rmsd *r)
57 {
58   return r->a;
59 }
60
61 static double
62 rmsd_get_standard_deviation (const struct rmsd *r)
63 {
64   return sqrt (r->q / (r->i - 1.0));
65 }
66
67 #endif /* FISH_RMSD_H */