1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/*
2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Experimental data  distribution table generator
3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Taken from the uncopyrighted NISTnet code (public domain).
4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *
5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Read in a series of "random" data values, either
6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * experimentally or generated from some probability distribution.
7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * From this, create the inverse distribution table used to approximate
8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * the distribution.
9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */
10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h>
11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h>
12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <math.h>
13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <malloc.h>
14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h>
15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/types.h>
16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/stat.h>
17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatdouble *
20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatreaddoubles(FILE *fp, int *number)
21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	struct stat info;
23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	double *x;
24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int limit;
25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int n=0, i;
26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	fstat(fileno(fp), &info);
28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (info.st_size > 0) {
29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		limit = 2*info.st_size/sizeof(double);	/* @@ approximate */
30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	} else {
31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		limit = 10000;
32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	x = calloc(limit, sizeof(double));
35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (!x) {
36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		perror("double alloc");
37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		exit(3);
38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=0; i<limit; ++i){
41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		fscanf(fp, "%lf", &x[i]);
42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (feof(fp))
43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			break;
44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		++n;
45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	*number = n;
47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return x;
48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatvoid
51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatarraystats(double *x, int limit, double *mu, double *sigma, double *rho)
52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int n=0, i;
54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	double sumsquare=0.0, sum=0.0, top=0.0;
55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	double sigma2=0.0;
56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=0; i<limit; ++i){
58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		sumsquare += x[i]*x[i];
59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		sum += x[i];
60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		++n;
61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	*mu = sum/(double)n;
63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	*sigma = sqrt((sumsquare - (double)n*(*mu)*(*mu))/(double)(n-1));
64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=1; i < n; ++i){
66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		top += ((double)x[i]- *mu)*((double)x[i-1]- *mu);
67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		sigma2 += ((double)x[i-1] - *mu)*((double)x[i-1] - *mu);
68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	*rho = top/sigma2;
71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* Create a (normalized) distribution table from a set of observed
74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * values.  The table is fixed to run from (as it happens) -4 to +4,
75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * with granularity .00002.
76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */
77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define TABLESIZE	16384/4
79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define TABLEFACTOR	8192
80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifndef MINSHORT
81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define MINSHORT	-32768
82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define MAXSHORT	32767
83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif
84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* Since entries in the inverse are scaled by TABLEFACTOR, and can't be bigger
86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * than MAXSHORT, we don't bother looking at a larger domain than this:
87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */
88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define DISTTABLEDOMAIN ((MAXSHORT/TABLEFACTOR)+1)
89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define DISTTABLEGRANULARITY 50000
90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define DISTTABLESIZE (DISTTABLEDOMAIN*DISTTABLEGRANULARITY*2)
91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int *
93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatmakedist(double *x, int limit, double mu, double sigma)
94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int *table;
96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int i, index, first=DISTTABLESIZE, last=0;
97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	double input;
98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	table = calloc(DISTTABLESIZE, sizeof(int));
100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (!table) {
101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		perror("table alloc");
102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		exit(3);
103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=0; i < limit; ++i) {
106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		/* Normalize value */
107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		input = (x[i]-mu)/sigma;
108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		index = (int)rint((input+DISTTABLEDOMAIN)*DISTTABLEGRANULARITY);
110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (index < 0) index = 0;
111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (index >= DISTTABLESIZE) index = DISTTABLESIZE-1;
112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		++table[index];
113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (index > last)
114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			last = index +1;
115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (index < first)
116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			first = index;
117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return table;
119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* replace an array by its cumulative distribution */
122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void
123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatcumulativedist(int *table, int limit, int *total)
124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int accum=0;
126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	while (--limit >= 0) {
128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		accum += *table;
129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		*table++ = accum;
130dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
131dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	*total = accum;
132dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
133dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
134dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic short *
135dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatinverttable(int *table, int inversesize, int tablesize, int cumulative)
136dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
137dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int i, inverseindex, inversevalue;
138dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	short *inverse;
139dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	double findex, fvalue;
140dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
141dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	inverse = (short *)malloc(inversesize*sizeof(short));
142dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=0; i < inversesize; ++i) {
143dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		inverse[i] = MINSHORT;
144dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
145dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=0; i < tablesize; ++i) {
146dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		findex = ((double)i/(double)DISTTABLEGRANULARITY) - DISTTABLEDOMAIN;
147dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		fvalue = (double)table[i]/(double)cumulative;
148dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		inverseindex = (int)rint(fvalue*inversesize);
149dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		inversevalue = (int)rint(findex*TABLEFACTOR);
150dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (inversevalue <= MINSHORT) inversevalue = MINSHORT+1;
151dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (inversevalue > MAXSHORT) inversevalue = MAXSHORT;
152dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		inverse[inverseindex] = inversevalue;
153dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
154dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return inverse;
155dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
156dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
157dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
158dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* Run simple linear interpolation over the table to fill in missing entries */
159dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void
160dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatinterpolatetable(short *table, int limit)
161dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
162dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int i, j, last, lasti = -1;
163dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
164dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	last = MINSHORT;
165dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=0; i < limit; ++i) {
166dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (table[i] == MINSHORT) {
167dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			for (j=i; j < limit; ++j)
168dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat				if (table[j] != MINSHORT)
169dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat					break;
170dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			if (j < limit) {
171dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat				table[i] = last + (i-lasti)*(table[j]-last)/(j-lasti);
172dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			} else {
173dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat				table[i] = last + (i-lasti)*(MAXSHORT-last)/(limit-lasti);
174dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			}
175dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		} else {
176dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			last = table[i];
177dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			lasti = i;
178dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		}
179dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
180dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
181dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
182dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void
183dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatprinttable(const short *table, int limit)
184dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
185dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int i;
186dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
187dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	printf("# This is the distribution table for the experimental distribution.\n");
188dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
189dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	for (i=0 ; i < limit; ++i) {
190dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		printf("%d%c", table[i],
191dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		       (i % 8) == 7 ? '\n' : ' ');
192dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
193dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
194dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
195dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint
196dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatmain(int argc, char **argv)
197dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{
198dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	FILE *fp;
199dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	double *x;
200dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	double mu, sigma, rho;
201dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int limit;
202dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int *table;
203dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	short *inverse;
204dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	int total;
205dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
206dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (argc > 1) {
207dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		if (!(fp = fopen(argv[1], "r"))) {
208dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			perror(argv[1]);
209dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat			exit(1);
210dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		}
211dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	} else {
212dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		fp = stdin;
213dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
214dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	x = readdoubles(fp, &limit);
215dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	if (limit <= 0) {
216dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		fprintf(stderr, "Nothing much read!\n");
217dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		exit(2);
218dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	}
219dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	arraystats(x, limit, &mu, &sigma, &rho);
220dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#ifdef DEBUG
221dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	fprintf(stderr, "%d values, mu %10.4f, sigma %10.4f, rho %10.4f\n",
222dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat		limit, mu, sigma, rho);
223dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#endif
224dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat
225dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	table = makedist(x, limit, mu, sigma);
226dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	free((void *) x);
227dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	cumulativedist(table, DISTTABLESIZE, &total);
228dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	inverse = inverttable(table, TABLESIZE, DISTTABLESIZE, total);
229dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	interpolatetable(inverse, TABLESIZE);
230dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	printtable(inverse, TABLESIZE);
231dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat	return 0;
232dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}
233