1ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger/* 2ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger * Experimental data distribution table generator 3ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger * Taken from the uncopyrighted NISTnet code (public domain). 4ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger * 5ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger * Rread in a series of "random" data values, either 6ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger * experimentally or generated from some probability distribution. 7ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger * From this, report statistics. 8ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger */ 9ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 10ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger#include <stdio.h> 11ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger#include <stdlib.h> 12ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger#include <math.h> 13ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger#include <malloc.h> 14ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger#include <sys/types.h> 15ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger#include <sys/stat.h> 16ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 17ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemmingervoid 18ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemmingerstats(FILE *fp) 19ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger{ 20ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger struct stat info; 21ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger double *x; 22ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger int limit; 23ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger int n=0, i; 24ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger double mu=0.0, sigma=0.0, sumsquare=0.0, sum=0.0, top=0.0, rho=0.0; 25ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger double sigma2=0.0; 26ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 27ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger fstat(fileno(fp), &info); 28ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger if (info.st_size > 0) { 29ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger limit = 2*info.st_size/sizeof(double); /* @@ approximate */ 30ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger } else { 31ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger limit = 10000; 32ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger } 33ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger x = (double *)malloc(limit*sizeof(double)); 34ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 35ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger for (i=0; i<limit; ++i){ 36ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger fscanf(fp, "%lf", &x[i]); 37ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger if (feof(fp)) 38ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger break; 39ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger sumsquare += x[i]*x[i]; 40ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger sum += x[i]; 41ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger ++n; 42ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger } 43ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger mu = sum/(double)n; 44ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger sigma = sqrt((sumsquare - (double)n*mu*mu)/(double)(n-1)); 45ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 46ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger for (i=1; i < n; ++i){ 47ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger top += ((double)x[i]-mu)*((double)x[i-1]-mu); 48ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger sigma2 += ((double)x[i-1] - mu)*((double)x[i-1] - mu); 49ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 50ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger } 51ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger rho = top/sigma2; 52ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 53ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger printf("mu = %12.6f\n", mu); 54ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger printf("sigma = %12.6f\n", sigma); 55ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger printf("rho = %12.6f\n", rho); 56ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger /*printf("sigma2 = %10.4f\n", sqrt(sigma2/(double)(n-1)));*/ 57ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger /*printf("correlation rho = %10.6f\n", top/((double)(n-1)*sigma*sigma));*/ 58ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger} 59ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 60ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 61ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemmingerint 62ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemmingermain(int argc, char **argv) 63ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger{ 64ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger FILE *fp; 65ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger 66ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger if (argc > 1) { 67ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger fp = fopen(argv[1], "r"); 68ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger if (!fp) { 69ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger perror(argv[1]); 70ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger exit(1); 71ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger } 72ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger } else { 73ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger fp = stdin; 74ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger } 75ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger stats(fp); 76ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger return 0; 77ebfd0f310306f10b96d7a9f7244f6a9b45b797e8Stephen Hemminger} 78