| 
									
										
										
										
											2012-09-17 16:31:14 +08:00
										 |  |  | #include <math.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "stat.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void update_stats(struct stats *stats, u64 val) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double delta; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	stats->n++; | 
					
						
							|  |  |  | 	delta = val - stats->mean; | 
					
						
							|  |  |  | 	stats->mean += delta / stats->n; | 
					
						
							|  |  |  | 	stats->M2 += delta*(val - stats->mean); | 
					
						
							| 
									
										
										
										
											2013-08-02 14:05:40 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (val > stats->max) | 
					
						
							|  |  |  | 		stats->max = val; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (val < stats->min) | 
					
						
							|  |  |  | 		stats->min = val; | 
					
						
							| 
									
										
										
										
											2012-09-17 16:31:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double avg_stats(struct stats *stats) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return stats->mean; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *       (\Sum n_i^2) - ((\Sum n_i)^2)/n | 
					
						
							|  |  |  |  * s^2 = ------------------------------- | 
					
						
							|  |  |  |  *                  n - 1 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * http://en.wikipedia.org/wiki/Stddev
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The std dev of the mean is related to the std dev by: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *             s | 
					
						
							|  |  |  |  * s_mean = ------- | 
					
						
							|  |  |  |  *          sqrt(n) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | double stddev_stats(struct stats *stats) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double variance, variance_mean; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-25 18:24:48 -06:00
										 |  |  | 	if (stats->n < 2) | 
					
						
							| 
									
										
										
										
											2012-09-17 16:31:14 +08:00
										 |  |  | 		return 0.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	variance = stats->M2 / (stats->n - 1); | 
					
						
							|  |  |  | 	variance_mean = variance / stats->n; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return sqrt(variance_mean); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double rel_stddev_stats(double stddev, double avg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double pct = 0.0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (avg) | 
					
						
							|  |  |  | 		pct = 100.0 * stddev/avg; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return pct; | 
					
						
							|  |  |  | } |