#!/usr/bin/env ruby
require("rbgsl")
require("./gsl_test2.rb")
include GSL::Test
include Math
N_BS = 11
def urand()
x = 1
x = (1103515245 * x + 12345) & 0x7fffffff
return x / 2147483648.0
end
def test_1d(n, stride, type, member)
nn = n*stride
data = GSL::Vector.alloc(nn)
for i in 0...nn
data[i] = 12345.0 + i
end
v1 = data.view_with_stride(0, stride, n)
for i in 0...n
v1[i] = urand()
end
v2 = GSL::Vector.alloc(n)
GSL::Vector.memcpy(v2, v1)
vdelta = GSL::Vector.alloc(n)
work = GSL::Wavelet::Workspace.alloc(n)
w = GSL::Wavelet.alloc(type, member)
w.transform_forward(v2, work)
w.transform_inverse(v2, work)
for i in 0...n
x1 = v1[i]
x2 = v2[i]
vdelta[i] = (x1 - x2).abs
end
i = vdelta.max_index
x1 = v1[i]
x2 = v2[i]
GSL::Test::test((x2 - x1).abs > n*1e-15 ? 1 : 0, "#{w.name}(#{member}), n = #{n}, stride = #{stride}, maxerr = #{(x2 - x1).abs}")
if stride > 1
status = 0
for i in 0...nn
next if i%stride == 0
status |= (data[i] != 12345.0 + i) ? 1 : 0
end
GSL::Test::test(status, "#{w.name}(#{member}) other data untouched, n = #{n}, stride = #{stride}")
end
end
def test_2d(n, tda, t, member, type)
nn = n*tda
data = GSL::Vector.alloc(nn)
typename = (type == 1) ? "standard" : "nonstd"
for i in 0...nn
data[i] = 12345.0 + i
end
m1 = data.matrix_view_with_tda(n, n, tda)
for i in 0...n
for j in 0...n
m1.set(i, j, urand())
end
end
m2 = GSL::Matrix.alloc(n, n)
GSL::Matrix.memcpy(m2, m1)
mdelta = GSL::Matrix.alloc(n, n)
work = GSL::Wavelet::Workspace.alloc(n)
w = GSL::Wavelet.alloc(t, member)
case type
when 1
GSL::Wavelet2d::transform_matrix_forward(w, m2, work)
GSL::Wavelet2d::transform_matrix_inverse(w, m2, work)
when 2
GSL::Wavelet2d::nstransform_matrix_forward(w, m2, work)
GSL::Wavelet2d::nstransform_matrix_inverse(w, m2, work)
end
for i in 0...n
for j in 0...n
x1 = m1[i][j]
x2 = m2[i][j]
mdelta.set(i, j, (x1 - x2).abs)
end
end
i, j = mdelta.max_index
x1 = m1[i][j]
x2 = m1[i][j]
GSL::Test::test((x2 - x1).abs > n*1e-15 ? 1 : 0, "#{w.name}(#{member})-2d #{typename}, n = #{n}, tda = #{tda}, maxerr = #{(x2 - x1).abs}")
if tda > n
status = 0
for i in 0...n
for j in n...tda
status |= (data[i*tda+j] != (12345.0 + (i*tda+j))) ? 1 : 0
end
end
GSL::Test::test(status, "#{w.name}(#{member})-2d #{typename} other data untouched, n = #{n}, tda = #{tda}")
end
end
Member = [309, 307, 305, 303, 301, 208, 206, 204, 202, 105, 103]
S = 1
NS = 2
n = 1
while n <= 16384
for stride in 1..1
for i in 0...N_BS
test_1d(n, stride, "bspline", Member[i]);
test_1d(n, stride, "bspline_centered", Member[i]);
end
i = 4
while i <= 20
test_1d(n, stride, "daubechies", i)
test_1d(n, stride, "daubechies_centered", i)
i += 2
end
test_1d(n, stride, "haar", 2)
test_1d(n, stride, "haar_centered", 2)
end
n *= 2
end
n = 1
while n <= 64
for tda in n..n
for i in 0...N_BS
test_2d(n, tda, "bspline", Member[i], S);
test_2d(n, tda, "bspline_centered", Member[i], S);
test_2d(n, tda, "bspline", Member[i], NS);
test_2d(n, tda, "bspline_centered", Member[i], NS);
end
end
n *= 2
end
syntax highlighted by Code2HTML, v. 0.9.1