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