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