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