#!/usr/bin/env ruby
# Ruby/GSL implementation of GSL "randist/test.c"
require("rbgsl")
require("./gsl_test2.rb")
include GSL::Test
include Math
include GSL::Ran
N = 100000
MULTI_DIM = 10
GSL::IEEE::env_setup()
GSL::Rng::env_setup()
R_global = GSL::Rng.alloc()
def test_shuffle()
n = 10
status = 0
count = GSL::Matrix.calloc(n, n)
x = GSL::Permutation.alloc(n)
for i in 0...N
for j in 0...n
x[j] = j
end
GSL::Ran.shuffle(R_global, x)
for j in 0...n
count.set(x[j], j, count[x[j]][j]+1)
end
end
for i in 0...n
for j in 0...n
expected = N/10.0
d = (count[i][j] - expected).abs
sigma = d/sqrt(expected)
if sigma > 5 and d > 1
status = 1
GSL::Test::test(status,
"gsl_ran_shuffle #{i},#{j} (#{count[i][j]/N} observed vs 0.1 expected)")
end
end
end
test(status, "gsl_ran_shuffle on {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}")
end
def testMoments(name, a, b, pp)
count = 0
for i in 0...N
r = eval("R_global.#{name}")
if r < b and r > a; count += 1; end
end
expected = pp*N
sigma = (count - expected).abs/sqrt(expected)
status = (sigma > 3) ? 1 : 0
GSL::Test::test(status, "#{name} [#{a},#{b}] (#{count.to_f/N} observed vs #{pp} expected)")
end
BINS = 100
STEPS = 100
def testPDF(name, args)
a = -5.0
b = +5.0
dx = (b - a)/BINS
status = 0
status_i = 0
count = GSL::Vector.calloc(BINS)
pp = GSL::Vector.calloc(BINS)
for i in 0...N
r = eval("R_global.#{name}(#{args})")
if r < b and r > a
j = ((r - a)/dx).to_i
count[j] = count[j] + 1;
end
end
for i in 0...BINS
x = a + i*dx
sum = 0.0
if x.abs < 1e-10; x = 0.0; end
for j in 1...STEPS
sum += eval("GSL::Ran::#{name}_pdf(#{x+j*dx/STEPS}, #{args})")
end
pp[i] = 0.5*(eval("GSL::Ran::#{name}_pdf(#{x}, #{args})") + 2*sum + eval("GSL::Ran::#{name}_pdf(#{x+dx-1e-7}, #{args})"))*dx/STEPS
end
for i in 0...BINS
x = a + i*dx
d = (count[i] - N*pp[i])
if pp[i] != 0
s = d/sqrt(N*pp[i])
status_i = ((s > 5) && (d > 1)) ? 1 : 0
else
status_i = (count[i] != 0) ? 1 : 0
end
status |= status_i
if status_i == 1
GSL::Test::test(status_i, "#{name} [#{x},#{x+dx}) (#{count[i]}/#{N}=#{count.to_f/N} observed vs #{pp[i]} expected)")
end
end
if status == 0
GSL::Test::test(status, "#{name}, sampling against pdf over range [#{a},#{b})")
end
end
testMoments("ugaussian", 0.0, 100.0, 0.5)
testMoments("ugaussian", -1.0, 1.0, 0.6826895);
testMoments("ugaussian", 3.0, 3.5, 0.0011172689);
testMoments("ugaussian_tail(3.0)", 3.0, 3.5, 0.0011172689 / 0.0013498981);
testMoments("exponential(2.0)", 0.0, 1.0, 1 - exp(-0.5));
testMoments("cauchy(2.0)", 0.0, 10000.0, 0.5);
testMoments("discrete(GSL::Ran::Discrete.alloc(GSL::Vector.alloc(0.59, 0.4, 0.01)))", -0.5, 0.5, 0.59);
testMoments("discrete(GSL::Ran::Discrete.alloc(GSL::Vector.alloc(0.59, 0.4, 0.01)))", 0.5, 1.5, 0.40);
testMoments("discrete(GSL::Ran::Discrete.alloc(GSL::Vector.alloc(0.59, 0.4, 0.01)))", 1.5, 3.5, 0.01);
testMoments("discrete(GSL::Ran::Discrete.alloc(GSL::Vector.alloc(1, 9, 3, 4, 5, 8, 6, 7, 2, 0)))", -0.5, 0.5, 1.0/45.0 );
testMoments("discrete(GSL::Ran::Discrete.alloc(GSL::Vector.alloc(1, 9, 3, 4, 5, 8, 6, 7, 2, 0)))", 8.5, 9.5, 0 );
testPDF("beta", "2.0, 3.0")
testPDF("cauchy", "2.0")
testPDF("chisq", "2.0")
testPDF("exponential", "2.0")
testPDF("exppow", "3.7, 0.3")
testPDF("fdist", "3.0, 4.0")
testPDF("flat", "3.0, 4.0")
testPDF("gamma", "2.5, 2.17")
testPDF("gaussian", "3.0")
testPDF("ugaussian_tail", "0.1, 2.0")
syntax highlighted by Code2HTML, v. 0.9.1