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