1import TestLib;
2import gsl;
3
4StartTest("random number generators");
5rng_init();
6assert(rng_min() == 0);
7assert(rng_max() == 4294967295);
8assert(rng_get() == 4293858116);
9rng_init("taus2");
10assert(rng_min() == 0);
11assert(rng_max() == 4294967295);
12assert(rng_get() == 802792108);
13rng_init("gfsr4");
14assert(rng_min() == 0);
15assert(rng_max() == 4294967295);
16assert(rng_get() == 2901276280);
17string[] list = rng_list();
18for(string name: list)
19{
20  rng_init(name);
21  rng_min();
22  rng_max();
23  rng_get();
24}
25assert(list.length >= 62);
26rng_init();
27rng_set(1);
28assert(rng_get() == 1791095845);
29rng_set(1);
30assert(rng_get() == 1791095845);
31EndTest();
32
33StartTest("Bernoulli distribution");
34assert(close(pdf_bernoulli(0,0.3), 0.7));
35assert(close(pdf_bernoulli(1,0.3), 0.3));
36//rng_init();
37//assert(rng_bernoulli(0.3) == 0);
38EndTest();
39
40StartTest("beta distribution");
41assert(close(cdf_beta_P(0.3,5,5), 0.09880866));
42assert(close(cdf_beta_Q(0.3,5,5) + cdf_beta_P(0.3,5,5), 1));
43assert(close(cdf_beta_Pinv(cdf_beta_P(0.3,5,5),5,5), 0.3));
44assert(close(cdf_beta_Qinv(cdf_beta_Q(0.3,5,5),5,5), 0.3));
45assert(close(pdf_beta(0.3,5,5), 1.2252303));
46//rng_init();
47//assert(close(rng_beta(5,5), 0.533021338130471));
48EndTest();
49
50StartTest("binomial distribution");
51assert(close(cdf_binomial_P(5,0.3,10), 0.9526510126));
52assert(close(cdf_binomial_P(5,0.3,10) + cdf_binomial_Q(5,0.3,10), 1));
53assert(close(pdf_binomial(5,0.3,10), 0.1029193452));
54//rng_init();
55//assert(rng_binomial(0.3,10) == 8);
56EndTest();
57
58StartTest("bivariate Gaussian distribution");
59assert(close(pdf_bivariate_gaussian((1,1),(0,2),(4,6),0.5),
60             0.00675758392382108));
61//rng_init();
62//pair z = (-0.260388644979556,2.50057001628669);
63//pair r = rng_bivariate_gaussian((0,2),(4,6),0.5);
64//assert(close(length(r - z), 0));
65EndTest();
66
67StartTest("cauchy distribution");
68assert(close(cdf_cauchy_P(1,3), 0.602416382349567));
69assert(close(cdf_cauchy_P(1,3) + cdf_cauchy_Q(1,3), 1));
70assert(close(cdf_cauchy_Pinv(cdf_cauchy_P(1,3),3), 1));
71assert(close(cdf_cauchy_Qinv(cdf_cauchy_Q(1,3),3), 1));
72assert(close(pdf_cauchy(1,3), 0.0954929658551372));
73//rng_init();
74//assert(close(rng_cauchy(3), -0.0024339597467863));
75EndTest();
76
77StartTest("chi-squared distribution");
78assert(close(cdf_chisq_P(4,6), 0.323323583816936));
79assert(close(cdf_chisq_P(4,6) + cdf_chisq_Q(4, 6), 1));
80assert(close(cdf_chisq_Pinv(cdf_chisq_P(4,6),6), 4));
81assert(close(cdf_chisq_Qinv(cdf_chisq_Q(4,6),6), 4));
82assert(close(pdf_chisq(4,6), 0.135335283236613));
83//rng_init();
84//assert(close(rng_chisq(6), 8.24171826270279));
85EndTest();
86
87StartTest("Dirichlet distribution");
88real[] alpha = {1,2,3,4};
89real[] theta = {0.1,0.2,0.3,0.4};
90assert(close(pdf_dirichlet(alpha,theta), 34.83648));
91//rng_init();
92//real[] z = {0.124480735441317,
93//            0.191823537067349,
94//            0.460543885448264,
95//            0.22315184204307};
96//real[] r = rng_dirichlet(alpha);
97//assert(close(norm(r - z), 0));
98EndTest();
99
100StartTest("exponential distribution");
101assert(close(cdf_exponential_P(2,3), 0.486582880967408));
102assert(close(cdf_exponential_P(2,3) + cdf_exponential_Q(2,3), 1));
103assert(close(cdf_exponential_Pinv(cdf_exponential_P(2,3),3), 2));
104assert(close(cdf_exponential_Qinv(cdf_exponential_Q(2,3),3), 2));
105assert(close(pdf_exponential(2,3), 0.171139039677531));
106//rng_init();
107//assert(close(rng_exponential(3), 24.7847346491112));
108EndTest();
109
110StartTest("exponential power distribution");
111assert(close(cdf_exppow_P(2,3,2), 0.82711070692442));
112assert(close(cdf_exppow_P(2,3,2) + cdf_exppow_Q(2,3,2), 1));
113assert(close(pdf_exppow(2,3,2), 0.120582432109095));
114//rng_init();
115//assert(close(rng_exppow(3,2), 0.284084267783339));
116EndTest();
117
118StartTest("F-distribution");
119assert(close(cdf_fdist_P(1,5,4), 0.485657196759213));
120assert(close(cdf_fdist_P(1,5,4) + cdf_fdist_Q(1,5,4), 1));
121//rng_init();
122//assert(close(rng_fdist(5,4), 1.20570928490019));
123EndTest();
124
125StartTest("flat (uniform) distribution");
126assert(close(cdf_flat_P(2,0,5), 0.4));
127assert(close(cdf_flat_P(2,0,5) + cdf_flat_Q(2,0,5), 1));
128assert(close(cdf_flat_Pinv(cdf_flat_P(2,0,5),0,5), 2));
129assert(close(cdf_flat_Qinv(cdf_flat_Q(2,0,5),0,5), 2));
130assert(close(pdf_flat(2,0,5), 0.2));
131//rng_init();
132//assert(close(rng_flat(0,5), 4.99870874453336));
133EndTest();
134
135StartTest("Gamma-distribution");
136assert(close(cdf_gamma_P(6,5,1), 0.71494349968337));
137assert(close(cdf_gamma_P(6,5,1) + cdf_gamma_Q(6,5,1), 1));
138assert(close(cdf_gamma_Pinv(cdf_gamma_P(6,5,1),5,1), 6));
139assert(close(cdf_gamma_Qinv(cdf_gamma_Q(6,5,1),5,1), 6));
140assert(close(pdf_gamma(6,5,1), 0.133852617539983));
141//rng_init();
142//assert(close(rng_gamma(5,1), 6.52166444209317));
143//assert(close(rng_gamma(5,1,"mt"), 5.71361391461836));
144//assert(close(rng_gamma(5,1,"knuth"), 1.53054227085541));
145EndTest();
146
147StartTest("Gaussian distribution");
148assert(close(cdf_gaussian_P(1,0,1), 0.841344746068543));
149assert(close(cdf_gaussian_P(1,0,1) + cdf_gaussian_Q(1,0,1), 1));
150assert(close(cdf_gaussian_Pinv(cdf_gaussian_P(1,0,1),0,1), 1));
151assert(close(cdf_gaussian_Qinv(cdf_gaussian_Q(1,0,1),0,1), 1));
152assert(close(pdf_gaussian(1,0,1), 0.241970724519143));
153//rng_init();
154//assert(close(rng_gaussian(0,1), 0.133918608118676));
155//assert(close(rng_gaussian(1,2,"ziggurat"), 1.90467233084303));
156//assert(close(rng_gaussian(1,2,"ratio"), 4.04779517509342));
157//assert(close(rng_gaussian(1,2,"polar"), 1.54245166575101));
158EndTest();
159
160StartTest("Gaussian tail distribution");
161assert(close(pdf_gaussian_tail(2,1,1), 0.34030367841782));
162//rng_init();
163//assert(close(rng_gaussian_tail(1,1), 1.0528474462339));
164EndTest();
165
166StartTest("geometric distribution");
167assert(close(cdf_geometric_P(6,0.1), 0.468559));
168assert(close(cdf_geometric_P(6,0.1) + cdf_geometric_Q(6,0.1), 1));
169assert(close(pdf_geometric(6,0.1), 0.059049));
170//rng_init();
171//assert(rng_geometric(0.1) == 1);
172EndTest();
173
174StartTest("Gumbel1 distribution");
175assert(close(cdf_gumbel1_P(1,3,8), 0.671462877871127));
176assert(close(cdf_gumbel1_P(1,3,8) + cdf_gumbel1_Q(1,3,8), 1));
177assert(close(cdf_gumbel1_Pinv(cdf_gumbel1_P(1,3,8),3,8), 1));
178assert(close(cdf_gumbel1_Qinv(cdf_gumbel1_Q(1,3,8),3,8), 1));
179assert(close(pdf_gumbel1(1,3,8), 0.80232403696926));
180//rng_init();
181//assert(close(rng_gumbel1(3,8), 3.44696353953564));
182EndTest();
183
184StartTest("Gumbel2 distribution");
185assert(close(cdf_gumbel2_P(2,2,3), 0.472366552741015));
186assert(close(cdf_gumbel2_P(2,2,3) + cdf_gumbel2_Q(2,2,3), 1));
187assert(close(cdf_gumbel2_Pinv(cdf_gumbel2_P(2,2,3),2,3), 2));
188assert(close(cdf_gumbel2_Qinv(cdf_gumbel2_Q(2,2,3),2,3), 2));
189assert(close(pdf_gumbel2(2,2,3), 0.354274914555761));
190//rng_init();
191//assert(close(rng_gumbel2(2,3), 107.773379309453));
192EndTest();
193
194StartTest("hypergeometric distribution");
195assert(close(cdf_hypergeometric_P(4,10,10,8), 0.675041676589664));
196assert(close(cdf_hypergeometric_P(4,10,10,8) +
197             cdf_hypergeometric_Q(4,10,10,8), 1));
198assert(close(pdf_hypergeometric(4,10,10,8), 0.350083353179329));
199//rng_init();
200//assert(rng_hypergeometric(10,10,8) == 3);
201EndTest();
202
203StartTest("Laplace distribution");
204assert(close(cdf_laplace_P(1,2), 0.696734670143683));
205assert(close(cdf_laplace_P(1,2) + cdf_laplace_Q(1,2), 1));
206assert(close(cdf_laplace_Pinv(cdf_laplace_P(1,2),2), 1));
207assert(close(cdf_laplace_Qinv(cdf_laplace_Q(1,2),2), 1));
208assert(close(pdf_laplace(1,2), 0.151632664928158));
209//rng_init();
210//assert(close(rng_laplace(2), 0.00103327123971616));
211EndTest();
212
213StartTest("Landau distribution");
214assert(close(pdf_landau(1), 0.145206637130862));
215//rng_init();
216//assert(close(rng_landau(), 3880.0374262546));
217EndTest();
218
219//StartTest("Levy stable distribution");
220//rng_init();
221//assert(close(rng_levy(1,1,0), 1232.55941432972));
222//assert(close(rng_levy(1,1,1), -0.13781830409645));
223//EndTest();
224
225StartTest("logistic distribution");
226assert(close(cdf_logistic_P(1,2), 0.622459331201855));
227assert(close(cdf_logistic_P(1,2) + cdf_logistic_Q(1,2), 1));
228assert(close(cdf_logistic_Pinv(cdf_logistic_P(1,2),2), 1));
229assert(close(cdf_logistic_Qinv(cdf_logistic_Q(1,2),2), 1));
230assert(close(pdf_logistic(1,2), 0.117501856100797));
231//rng_init();
232//assert(close(rng_logistic(2), 16.522639863849));
233EndTest();
234
235StartTest("lognormal distribution");
236assert(close(cdf_lognormal_P(6,2,1), 0.417520581602749));
237assert(close(cdf_lognormal_P(6,2,1) + cdf_lognormal_Q(6,2,1), 1));
238assert(close(cdf_lognormal_Pinv(cdf_lognormal_P(6,2,1),2,1), 6));
239assert(close(cdf_lognormal_Qinv(cdf_lognormal_Q(6,2,1),2,1), 6));
240assert(close(pdf_lognormal(6,2,1), 0.0650642483079156));
241//rng_init();
242//assert(close(rng_lognormal(2,1), 6.92337133931968));
243EndTest();
244
245StartTest("multinomial distribution");
246real[] p = {0.1,0.2,0.3,0.4};
247int[] n = {1,2,3,4};
248assert(close(pdf_multinomial(p,n), 0.03483648));
249//rng_init();
250//int[] r = {5, 0, 1, 4};
251//assert(all(rng_multinomial(10,p) == r));
252EndTest();
253
254StartTest("negative binomial distribution");
255assert(close(cdf_negative_binomial_P(6,0.5,10), 0.227249145507813));
256assert(close(cdf_negative_binomial_P(6,0.5,10) +
257             cdf_negative_binomial_Q(6,0.5,10), 1));
258assert(close(pdf_negative_binomial(6,0.5,10), 0.076370239257812));
259//rng_init();
260//assert(rng_negative_binomial(0.5,10) == 15);
261EndTest();
262
263StartTest("Pareto distribution");
264assert(close(cdf_pareto_P(4,2,2), 0.75));
265assert(close(cdf_pareto_P(4,2,2) + cdf_pareto_Q(4,2,2), 1));
266assert(close(cdf_pareto_Pinv(cdf_pareto_P(4,2,2),2,2), 4));
267assert(close(cdf_pareto_Qinv(cdf_pareto_Q(4,2,2),2,2), 4));
268assert(close(pdf_pareto(4,2,2), 0.125));
269//rng_init();
270//assert(close(rng_pareto(2,2), 2.00025830112432));
271EndTest();
272
273StartTest("Poisson distribution");
274assert(close(cdf_poisson_P(5,6), 0.445679641364611));
275assert(close(cdf_poisson_P(5,6) + cdf_poisson_Q(5,6), 1));
276assert(close(pdf_poisson(5,6), 0.16062314104798));
277//rng_init();
278//assert(rng_poisson(6) == 8);
279EndTest();
280
281StartTest("Rayleigh distribution");
282assert(close(cdf_rayleigh_P(3,2), 0.67534753264165));
283assert(close(cdf_rayleigh_P(3,2) + cdf_rayleigh_Q(3,2), 1));
284assert(close(cdf_rayleigh_Pinv(cdf_rayleigh_P(3,2),2), 3));
285assert(close(cdf_rayleigh_Qinv(cdf_rayleigh_Q(3,2),2), 3));
286assert(close(pdf_rayleigh(3,2), 0.243489350518762));
287//rng_init();
288//assert(close(rng_rayleigh(2), 0.0454563039310455));
289EndTest();
290
291StartTest("Rayleigh tail distribution");
292assert(close(pdf_rayleigh_tail(5,4,1), 0.0555449826912115));
293//rng_init();
294//assert(close(rng_rayleigh_tail(4,1), 4.0000645705903));
295EndTest();
296
297//StartTest("spherical distributions");
298//rng_init();
299//pair z = (-0.617745613497854,-0.786377998804748);
300//pair r = rng_dir2d();
301//assert(close(length(r - z), 0));
302//pair z = (0.993748310886084,0.111643605329884);
303//pair r = rng_dir2d("neumann");
304//assert(close(length(r - z), 0));
305//pair z = (0.964519203132591,-0.264012701945327);
306//pair r = rng_dir2d("trig");
307//assert(close(length(r - z), 0));
308//triple z = (0.849028025629996,0.139162687752509,-0.509691237939527);
309//triple r = rng_dir3d();
310//assert(close(length(r - z), 0));
311//real[] z = {0.420990368676528,
312//            -0.626782975357296,
313//            0.0441585572224004,
314//            -0.0458388920727644,
315//            -0.652578753164271};
316//real[] r = rng_dir(5);
317//assert(close(norm(r - z), 0));
318//EndTest();
319
320StartTest("t-distribution");
321assert(close(cdf_tdist_P(0.6,2), 0.695283366471236));
322assert(close(cdf_tdist_P(0.6,2) + cdf_tdist_Q(0.6,2), 1));
323assert(close(cdf_tdist_Pinv(cdf_tdist_P(0.6,2),2), 0.6));
324assert(close(cdf_tdist_Qinv(cdf_tdist_Q(0.6,2),2), 0.6));
325assert(close(pdf_tdist(0.6,2), 0.275823963942424));
326//rng_init();
327//assert(close(rng_tdist(2), 0.127201714006725));
328EndTest();
329
330StartTest("Weibull distribution");
331assert(close(cdf_weibull_P(1,2,2), 0.221199216928595));
332assert(close(cdf_weibull_P(1,2,2) + cdf_weibull_Q(1,2,2), 1));
333assert(close(cdf_weibull_Pinv(cdf_weibull_P(1,2,2),2,2), 1));
334assert(close(cdf_weibull_Qinv(cdf_weibull_Q(1,2,2),2,2), 1));
335assert(close(pdf_weibull(1,2,2), 0.389400391535702));
336//rng_init();
337//assert(close(rng_weibull(2,2), 0.032142460757319));
338EndTest();
339