1c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger/*
2c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger * Paretoormal distribution table generator
3c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger *
4c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger * This distribution is simply .25*normal + .75*pareto; a combination
5c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger * which seems to match experimentally observed distributions reasonably
6c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger *  well, but is computationally easy to handle.
7c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger * The entries represent a scaled inverse of the cumulative distribution
8c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger * function.
9c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger *
10c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger * Taken from the uncopyrighted NISTnet code.
11c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger */
12c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <stdio.h>
13c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <stdlib.h>
14c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <stdlib.h>
15c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <string.h>
16c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <math.h>
17c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <limits.h>
18c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <malloc.h>
19c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
20c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <linux/types.h>
21c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#include <linux/pkt_sched.h>
22c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
23c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#define TABLESIZE	16384
24c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger#define TABLEFACTOR	NETEM_DIST_SCALE
25c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
26c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemmingerstatic double
27c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemmingernormal(double x, double mu, double sigma)
28c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger{
29c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	return .5 + .5*erf((x-mu)/(sqrt(2.0)*sigma));
30c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger}
31c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
32c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemmingerstatic const double a=3.0;
33c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
34c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemmingerstatic int
35c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemmingerparetovalue(int i)
36c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger{
37c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	double dvalue;
38c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
39c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	i = 65536-4*i;
40c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	dvalue = (double)i/(double)65536;
41c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	dvalue = 1.0/pow(dvalue, 1.0/a);
42c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	dvalue -= 1.5;
43c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	dvalue *= (4.0/3.0)*(double)TABLEFACTOR;
44c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	if (dvalue > 32767)
45c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		dvalue = 32767;
46c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	return (int)rint(dvalue);
47c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger}
48c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
49c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemmingerint
50c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemmingermain(int argc, char **argv)
51c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger{
52c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	int i,n;
53f8f9de56f2c75776cb103f35e6a788630add0a13osdl.net!shemminger	double x;
546864c1e7890c65dd2ee037809f772790b04792b4shemminger	double table[TABLESIZE+1];
55c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
56c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	for (x = -10.0; x < 10.05; x += .00005) {
57f8f9de56f2c75776cb103f35e6a788630add0a13osdl.net!shemminger		i = rint(TABLESIZE*normal(x, 0.0, 1.0));
58c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		table[i] = x;
59c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	}
60c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	printf(
61c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger"# This is the distribution table for the paretonormal distribution.\n"
62c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	);
63c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
64c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	for (i = n = 0; i < TABLESIZE; i += 4) {
65c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		int normvalue, parvalue, value;
66c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
67c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		normvalue = (int) rint(table[i]*TABLEFACTOR);
68c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		parvalue = paretovalue(i);
69c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
70c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		value = (normvalue+3*parvalue)/4;
71c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		if (value < SHRT_MIN) value = SHRT_MIN;
72c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		if (value > SHRT_MAX) value = SHRT_MAX;
73c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
74c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		printf(" %d", value);
75c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		if (++n == 8) {
76c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger			putchar('\n');
77c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger			n = 0;
78c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger		}
79c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	}
80c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger
81c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger	return 0;
82c2fdec53d05f13ad6fcbc2a43349c9c44b2155d3osdl.net!shemminger}
83