gsl 1.16.0.6 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -13
  3. data/ChangeLog +6 -0
  4. data/Gemfile +1 -0
  5. data/README.md +77 -1
  6. data/Rakefile +7 -1
  7. data/examples/linalg/QR_solve_narray.rb +2 -1
  8. data/examples/linalg/SV_narray.rb +10 -0
  9. data/examples/linalg/chol_narray.rb +3 -0
  10. data/examples/wavelet/wavelet1.rb +4 -2
  11. data/ext/gsl_native/array.c +10 -0
  12. data/ext/gsl_native/bspline.c +15 -2
  13. data/ext/gsl_native/cheb.c +76 -10
  14. data/ext/gsl_native/common.c +33 -0
  15. data/ext/gsl_native/dht.c +26 -0
  16. data/ext/gsl_native/eigen.c +129 -0
  17. data/ext/gsl_native/extconf.rb +60 -6
  18. data/ext/gsl_native/fft.c +42 -0
  19. data/ext/gsl_native/function.c +18 -0
  20. data/ext/gsl_native/gsl.c +5 -0
  21. data/ext/gsl_native/gsl_nmatrix.c +204 -0
  22. data/ext/gsl_native/histogram.c +42 -0
  23. data/ext/gsl_native/include/rb_gsl.h +4 -0
  24. data/ext/gsl_native/include/rb_gsl_array.h +4 -0
  25. data/ext/gsl_native/include/rb_gsl_common.h +5 -0
  26. data/ext/gsl_native/include/rb_gsl_interp.h +4 -0
  27. data/ext/gsl_native/include/rb_gsl_with_nmatrix.h +28 -0
  28. data/ext/gsl_native/interp.c +14 -0
  29. data/ext/gsl_native/linalg.c +414 -22
  30. data/ext/gsl_native/math.c +64 -0
  31. data/ext/gsl_native/multifit.c +61 -0
  32. data/ext/gsl_native/randist.c +42 -0
  33. data/ext/gsl_native/sf.c +6 -0
  34. data/ext/gsl_native/sf_ellint.c +4 -4
  35. data/ext/gsl_native/sf_mathieu.c +48 -0
  36. data/ext/gsl_native/spline.c +30 -0
  37. data/ext/gsl_native/tamu_anova.c +1 -1
  38. data/gsl.gemspec +8 -1
  39. data/lib/gsl.rb +5 -0
  40. data/lib/gsl/version.rb +1 -1
  41. data/rdoc/nmatrix.rdoc +129 -0
  42. data/rdoc/ref.rdoc +1 -0
  43. data/test.sh +21 -0
  44. data/test/gsl/bspline_test.rb +15 -14
  45. data/test/gsl/combination_test.rb +17 -6
  46. data/test/gsl/dht_test.rb +42 -33
  47. data/test/gsl/nmatrix_tests/nmatrix_cheb_test.rb +34 -0
  48. data/test/gsl/nmatrix_tests/nmatrix_eigen_test.rb +28 -0
  49. data/test/gsl/nmatrix_tests/nmatrix_gsl_test.rb +65 -0
  50. data/test/gsl/nmatrix_tests/nmatrix_interp_test.rb +45 -0
  51. data/test/gsl/nmatrix_tests/nmatrix_linalg_test.rb +100 -0
  52. data/test/gsl/nmatrix_tests/nmatrix_stats_test.rb +88 -0
  53. data/test/gsl/nmatrix_tests/nmatrix_wavelet_test.rb +5 -0
  54. data/test/gsl/randist_test.rb +43 -23
  55. data/test/test_helper.rb +30 -2
  56. metadata +191 -51
@@ -0,0 +1,65 @@
1
+ require 'test_helper'
2
+
3
+ class NMatrixGslTest < GSL::TestCase
4
+ def setup
5
+ @gsl_vector = GSL::Vector.alloc(2.354, 4.443, 6.776)
6
+ @nm_vector = NMatrix.new([3], [2.354, 4.443, 6.776], dtype: :float64)
7
+
8
+ @gsl_int_vector = GSL::Vector::Int[1,2,3,4,5]
9
+ @nm_int_vector = NMatrix.new([5], [1,2,3,4,5], dtype: :int32)
10
+
11
+ @gsl_complex_vector = GSL::Vector::Complex.alloc([[1,0], [2,0], [3,0]])
12
+ @nm_complex_vector = NMatrix.new([3], [1,2,3], dtype: :complex128)
13
+
14
+ @gsl_matrix = GSL::Matrix.alloc(
15
+ [1,2,3],
16
+ [4,5,6],
17
+ [7,8,9]
18
+ )
19
+ @nm_matrix = NMatrix.new([3,3], [1,2,3,4,5,6,7,8,9], dtype: :float64)
20
+
21
+ @gsl_int_matrix = GSL::Matrix::Int.alloc(
22
+ [1,2,3],
23
+ [4,5,6],
24
+ [7,8,9]
25
+ )
26
+ @nm_int_matrix = NMatrix.new([3,3], [1,2,3,4,5,6,7,8,9], dtype: :int32)
27
+
28
+ @gsl_complex_matrix = GSL::Matrix::Complex.alloc(2,2)
29
+ @gsl_complex_matrix.set(0,0, [1.1,1.1])
30
+ @gsl_complex_matrix.set(0,1, [2.2,2.2])
31
+ @gsl_complex_matrix.set(1,0, [3.3,3.3])
32
+ @gsl_complex_matrix.set(1,1, [4.4,4.4])
33
+
34
+ @nm_complex_matrix = NMatrix.new([2,2],
35
+ [Complex(1.1,1.1), Complex(2.2,2.2), Complex(3.3,3.3), Complex(4.4,4.4)], dtype: :complex128)
36
+ end
37
+
38
+ # GSL::Vector to 1D NMatrix
39
+ def test_gsl_vector_to_nmatrix
40
+ assert_equal @nm_vector , @gsl_vector.to_nm , 'floating point GSL::Vector to NMatrix'
41
+ assert_equal @nm_int_vector , @gsl_int_vector.to_nm , 'integer GSL::Vector to NMatrix'
42
+ assert_equal @nm_complex_vector, @gsl_complex_vector.to_nm, 'complex GSL::Vector to NMatrix'
43
+ end
44
+
45
+ # GSL::Matrix to NMatrix
46
+ def test_gsl_matrix_to_nmatrix
47
+ assert_equal @nm_matrix, @gsl_matrix.to_nm, 'floating point GSL::Matrix to 2D NMatrix'
48
+ assert_equal @nm_int_matrix, @gsl_int_matrix.to_nm, 'GSL::Matrix::Int to 2D NMatrix'
49
+ assert_equal @nm_complex_matrix, @gsl_complex_matrix.to_nm, 'GSL::Matrix::Complex to 2D NMatrix'
50
+ end
51
+
52
+ # NMatrix to GSL::Vector
53
+ def test_nmatrix_to_gsl_vector
54
+ assert_equal @gsl_vector , @nm_vector.to_gslv , 'floating point NMatrix to GSL::Vector'
55
+ assert_equal @gsl_int_vector , @nm_int_vector.to_gslv , 'int NMatrix to GSL::Vector::Int'
56
+ assert_equal @gsl_complex_vector, @nm_complex_vector.to_gslv, 'complex NMatrix to GSL::Vector::Complex'
57
+ end
58
+
59
+ # NMatrix to GSL::Matrix
60
+ def test_nmatrix_to_gsl_matrix
61
+ assert_equal @gsl_matrix , @nm_matrix.to_gslm , 'floating NMatrix to GSL::Matrix'
62
+ assert_equal @gsl_int_matrix , @nm_int_matrix.to_gslm , 'int NMatrix to GSL::Matrix::Int'
63
+ assert_equal @gsl_complex_matrix, @nm_complex_matrix.to_gslm, 'complex NMatrix to GSL::Matrix::Complex'
64
+ end
65
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ class NMatrixInterpTest < GSL::TestCase
4
+ def test_interp_init_eval
5
+ n = 10
6
+ x = NMatrix.new([n], dtype: :float64)
7
+ y = x.clone_structure
8
+
9
+ 0.upto(n-1) do |i|
10
+ a = i.to_f
11
+ x[i] = i + 0.5*Math::sin(a)
12
+ y[i] = i + Math::cos(a*a)
13
+ end
14
+
15
+ interp = GSL::Interp.alloc("akima", n)
16
+ interp.init(x, y)
17
+
18
+ yi = []
19
+ xi = x[0]
20
+ r = []
21
+ while xi < x[9]
22
+ r << xi
23
+ xi += 0.01
24
+ end
25
+
26
+ yi = interp.eval(x,y,NMatrix.new([r.size], r, dtype: :float64))
27
+
28
+ assert_rel yi[1] , 1.0066, 0.001, 'yi[1]'
29
+ assert_rel yi.to_a.last, 9.7618, 0.001, 'yi.last'
30
+ end
31
+
32
+ def test_spline_init_eval
33
+ n = 10
34
+ x = NMatrix.new([n], (1..10).to_a, dtype: :float64)
35
+ y = x.dup
36
+
37
+ spline = GSL::Spline.alloc(x, y)
38
+
39
+ xi = NMatrix.new([n], (1..9).map { |a| a += 0.5 }, dtype: :float64)
40
+ yi = spline.eval(xi)
41
+
42
+ assert yi.class == NMatrix
43
+ assert_rel yi[0], 1.5, 0.0001, 'yi[0]'
44
+ end
45
+ end
@@ -0,0 +1,100 @@
1
+ require 'test_helper'
2
+
3
+ class NMatrixLinalgTest < GSL::TestCase
4
+ def setup
5
+ @nm = NMatrix.new([4,4],
6
+ [
7
+ 0.18, 0.60, 0.57, 0.96,
8
+ 0.41, 0.24, 0.99, 0.58,
9
+ 0.14, 0.30, 0.97, 0.66,
10
+ 0.51, 0.13, 0.19, 0.85
11
+ ], dtype: :float64)
12
+ @b = NMatrix.new([4], [1,2,3,4], dtype: :float64)
13
+ @x_exp = NMatrix.new([4], [-4.05205022957397, -12.6056113959069, 1.66091162670884, 8.69376692879523], dtype: :float64)
14
+ end
15
+
16
+ def test_lu
17
+ lu, perm, signum = GSL::Linalg::LU.decomp(@nm)
18
+
19
+ lu_exp = NMatrix.new([4,4],
20
+ [0.51, 0.13, 0.19, 0.85,
21
+ 0.352941176470588, 0.554117647058823, 0.502941176470588, 0.66,
22
+ 0.803921568627451, 0.244515215852796, 0.71427813163482, -0.264713375796178,
23
+ 0.274509803921569, 0.476999292285916, 0.949126848480345, 0.363093705877982],
24
+ dtype: :float64)
25
+
26
+ assert_enum_abs lu, lu_exp, 0.0001, "GSL::Linalg::LU.decomp(A) with NMatrix"
27
+ assert_enum_abs GSL::Linalg::LU.solve(lu, perm, @b), @x_exp, 0.0001, "GSL::Linalg::LU.solve(lu, perm, b) with NMatrix"
28
+
29
+ ##########################################################################
30
+
31
+ nm = NMatrix.new([2,2], [1,1,14,1], dtype: :float64)
32
+ lu, perm, sign = GSL::Linalg::LU.decomp(nm)
33
+ inverted = NMatrix.new([2,2],
34
+ [
35
+ -0.076923, 0.076923,
36
+ 1.076923, -0.076923
37
+ ], dtype: :float64)
38
+
39
+ assert_enum_abs GSL::Linalg::LU.invert(lu, perm), inverted, 0.001, "GSL::Linalg::LU.invert(lu, perm) with NMatrix"
40
+ assert GSL::Linalg::LU.det(lu, sign) == -13, "GSL::Linalg::LU.det(lu, sign) with NMatrix"
41
+ end
42
+
43
+ def test_qr
44
+ qr_answer = NMatrix.new([4,4],
45
+ [-0.692965, -0.454136, -1.06961 , -1.35144,
46
+ 0.469664 , 0.564146, 0.72597 , 0.726696,
47
+ 0.160373 , -0.159838, -0.781606, 0.063932,
48
+ 0.584216 , 0.593044, -0.332286, 0.239865], dtype: :float64)
49
+ tau_answer = NMatrix.new([4], [1.25975, 1.45217, 1.80113, 0.0], dtype: :float64)
50
+ qr, tau = GSL::Linalg::QR.decomp(@nm)
51
+
52
+ assert_enum_abs qr_answer , qr , 0.001, "GSL::Linalg::QR.decomp(nmatrix)"
53
+ assert_enum_abs tau_answer, tau, 0.001, "GSL::Linalg::QR.decomp(nmatrix)"
54
+
55
+ assert_enum_abs GSL::Linalg::QR.solve(qr, tau, @b), @x_exp, 0.001,
56
+ "GSL::Linalg::QR.solve(qr, tau, b)"
57
+ end
58
+
59
+ def test_sv
60
+ u_answer = NMatrix.new([4,4],
61
+ [-0.545591,-0.312561, 0.709796,-0.317529,
62
+ -0.5298 , 0.418583,-0.475268,-0.564111,
63
+ -0.524621, 0.436573, 0.112083, 0.722229,
64
+ -0.382642,-0.73246 ,-0.507688, 0.243598 ], dtype: :float64)
65
+ v_answer = NMatrix.new([4,4],
66
+ [-0.260024,-0.288729 ,-0.732277,-0.559279 ,
67
+ -0.294582,-0.0751933, 0.659393,-0.687581 ,
68
+ -0.630928, 0.762631 ,-0.12665 , 0.0654517,
69
+ -0.668983,-0.573912 , 0.113712, 0.458427 ], dtype: :float64)
70
+ s_answer = NMatrix.new([4], [2.24602,0.682566,0.423782,0.112813], dtype: :float64)
71
+
72
+ u, v, s = GSL::Linalg::SV.decomp(@nm)
73
+
74
+ assert_enum_abs u, u_answer, 0.001, "GSL::Linalg::SV.decomp(nmatrix) -> u"
75
+ assert_enum_abs v, v_answer, 0.001, "GSL::Linalg::SV.decomp(nmatrix) -> v"
76
+ assert_enum_abs s, s_answer, 0.001, "GSL::Linalg::SV.decomp(nmatrix) -> s"
77
+
78
+ assert_enum_abs GSL::Linalg::SV.solve(u, v, s, @b), @x_exp, 0.001,
79
+ "GSL::Linalg::SV.solve(u,v,s,b)"
80
+ end
81
+
82
+ def test_cholesky
83
+ m = NMatrix.new([2,2], [4.0, 2, 2, 3], dtype: :float64)
84
+ b = NMatrix.new([2], [1,2], dtype: :float64)
85
+
86
+ cholesky = NMatrix.new([2,2], [2.0, 1.0, 1.0, 1.41421], dtype: :float64)
87
+ x_exp = NMatrix.new([2], [-0.125, 0.75], dtype: :float64)
88
+
89
+ c = GSL::Linalg::Cholesky
90
+ assert_enum_abs c.decomp(m) , cholesky, 0.001, "GSL::Linalg::Cholesky.decomp"
91
+ assert_enum_abs c.solve(cholesky, b), x_exp , 0.001, "GSL::Linalg::Cholesky.solve"
92
+ assert_enum_abs c.svx(cholesky, b) , x_exp , 0.001, "GSL::Linalg::Cholesky.svx"
93
+ end
94
+
95
+ def test_hh
96
+ hh = GSL::Linalg::HH
97
+ assert_enum_abs hh.solve(@nm, @b), @x_exp, 0.001, "GSL::Linalg::HH.solve(m, b)"
98
+ assert_enum_abs hh.svx(@nm, @b) , @x_exp, 0.001, "GSL::Linalg::HH.svx(m, b)"
99
+ end
100
+ end
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+
3
+ class NMatrixStatsTest < GSL::TestCase
4
+ def setup
5
+ @lew = NMatrix.new([200],
6
+ [-213, -564, -35, -15, 141, 115, -420, -360, 203, -338, -431, 194,
7
+ -220, -513, 154, -125, -559, 92, -21, -579, -52, 99, -543, -175,
8
+ 162, -457, -346, 204, -300, -474, 164, -107, -572, -8, 83, -541,
9
+ -224, 180, -420, -374, 201, -236, -531, 83, 27, -564, -112, 131,
10
+ -507, -254, 199, -311, -495, 143, -46, -579, -90, 136, -472, -338,
11
+ 202, -287, -477, 169, -124, -568, 17, 48, -568, -135, 162, -430,
12
+ -422, 172, -74, -577, -13, 92, -534, -243, 194, -355, -465, 156,
13
+ -81, -578, -64, 139, -449, -384, 193, -198, -538, 110, -44, -577,
14
+ -6, 66, -552, -164, 161, -460, -344, 205, -281, -504, 134, -28,
15
+ -576, -118, 156, -437, -381, 200, -220, -540, 83, 11, -568, -160,
16
+ 172, -414, -408, 188, -125, -572, -32, 139, -492, -321, 205, -262,
17
+ -504, 142, -83, -574, 0, 48, -571, -106, 137, -501, -266, 190,
18
+ -391, -406, 194, -186, -553, 83, -13, -577, -49, 103, -515, -280,
19
+ 201, 300, -506, 131, -45, -578, -80, 138, -462, -361, 201, -211,
20
+ -554, 32, 74, -533, -235, 187, -372, -442, 182, -147, -566, 25,
21
+ 68, -535, -244, 194, -351, -463, 174, -125, -570, 15, 72, -550,
22
+ -190, 172, -424, -385, 198, -218, -536, 96], dtype: :float64
23
+ )
24
+
25
+ @rawa = NMatrix.new([14],
26
+ [0.0421, 0.0941, 0.1064, 0.0242, 0.1331,
27
+ 0.0773, 0.0243, 0.0815, 0.1186, 0.0356,
28
+ 0.0728, 0.0999, 0.0614, 0.0479], dtype: :float64
29
+ )
30
+
31
+ @rawb = NMatrix.new([14],
32
+ [0.1081, 0.0986, 0.1566, 0.1961, 0.1125,
33
+ 0.1942, 0.1079, 0.1021, 0.1583, 0.1673,
34
+ 0.1675, 0.1856, 0.1688, 0.1512], dtype: :float64
35
+ )
36
+
37
+ @raww = NMatrix.new([14],
38
+ [0.0000, 0.0000, 0.0000, 3.000, 0.0000,
39
+ 1.0000, 1.0000, 1.0000, 0.000, 0.5000,
40
+ 7.0000, 5.0000, 4.0000, 0.123], dtype: :float64
41
+ )
42
+ end
43
+
44
+ def test_stats
45
+ assert_rel GSL::Stats.mean(@lew), -177.435000000000, 1e-15, 'lew gsl_stats_mean'
46
+ assert_rel GSL::Stats.sd(@lew), 277.332168044316, 1e-15, 'lew gsl_stats_sd'
47
+ assert_rel GSL::Stats.lag1_autocorrelation(@lew), -0.307304800605679, 1e-14, 'lew autocorrelation'
48
+
49
+ rel = 1e-10
50
+ rawa_mean = GSL::Stats.mean(@rawa)
51
+
52
+ assert_rel GSL::Stats.variance_with_fixed_mean(@rawa, rawa_mean), 0.00113837428571429,
53
+ rel, 'gsl_stats_variance_with_fixed_mean'
54
+
55
+ assert_rel GSL::Stats.sd_with_fixed_mean(@rawa, rawa_mean), 0.0337398026922845,
56
+ rel, 'gsl_stats_sd_with_fixed_mean'
57
+
58
+ assert_rel GSL::Stats.variance(@rawb), 0.00124956615384615, rel, 'gsl_stats_variance'
59
+ assert_rel GSL::Stats.sd(@rawa), 0.0350134479659107, rel, 'gsl_stats_sd'
60
+ assert_rel GSL::Stats.absdev(@rawa), 0.0287571428571429, rel, 'gsl_stats_absdev'
61
+ assert_rel GSL::Stats.skew(@rawa), 0.0954642051479004, rel, 'gsl_stats_skew'
62
+ assert_rel GSL::Stats.kurtosis(@rawa), -1.38583851548909, rel, 'gsl_stats_kurtosis'
63
+ assert_rel GSL::Stats.covariance(@rawa,@rawb),-0.000139021538461539, rel, 'gsl_stats_covariance'
64
+
65
+ if GSL::GSL_VERSION >= '1.9.90'
66
+ assert_rel GSL::Stats.correlation(@rawa, @rawb), -0.112322712666074171, rel, 'gsl_stats_correlation'
67
+ assert_rel GSL::Stats.pvariance(@rawa, @rawb), 0.00123775384615385, rel, 'gsl_stats_pvariance'
68
+ assert_rel GSL::Stats.ttest(@rawa, @rawb), -5.67026326985851, rel, 'gsl_stats_ttest'
69
+ end
70
+
71
+ assert_rel GSL::Stats.max(@rawa), 0.1331, rel, 'gsl_stats_max'
72
+ assert_rel GSL::Stats.min(@rawa), 0.0242, rel, 'gsl_stats_min'
73
+
74
+ assert GSL::Stats.max_index(@rawa) == 4, 'gsl_stats_max'
75
+ assert GSL::Stats.min_index(@rawa) == 3, 'gsl_stats_min'
76
+
77
+ rawa_sorted = NMatrix.new([@rawa.size], @rawa.sort, dtype: :float64)
78
+
79
+ sorted = NMatrix.new([@rawa.size], @rawa.to_a.sort, dtype: :float64)
80
+ assert_rel GSL::Stats.median_from_sorted_data(sorted), 0.07505,
81
+ rel, 'gsl_stats_median_from_sorted_data'
82
+
83
+ assert_rel GSL::Stats.median_from_sorted_data(sorted[0..(sorted.size - 2)]), 0.0728,
84
+ rel, 'gsl_stats_median_from_sorted_data'
85
+
86
+ #TODO: Expose quantile_from_sorted_data
87
+ end
88
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper.rb'
2
+
3
+ class NMatrixWaveletTest < GSL::TestCase
4
+ # TODO
5
+ end
@@ -10,28 +10,34 @@ class RandistTest < GSL::TestCase
10
10
 
11
11
  R_GLOBAL = GSL::Rng.alloc
12
12
 
13
+ @@use_nmatrix = false
14
+
13
15
  def test_shuffle
14
16
  n = 10
15
17
 
16
- count = GSL::Matrix.calloc(n, n)
17
- x = GSL::Permutation.alloc(n)
18
+ input = [GSL::Matrix.calloc(n, n)]
19
+ input << NMatrix.new([n,n], 0, dtype: :float64) if @@use_nmatrix
18
20
 
19
- N.times { |i|
20
- n.times { |j| x[j] = j }
21
- GSL::Ran.shuffle(R_GLOBAL, x)
22
- n.times { |j| count.set(x[j], j, count[x[j], j] + 1) }
23
- }
21
+ input.each do |count|
22
+ x = GSL::Permutation.alloc(n)
24
23
 
25
- expected = N / 10.0
24
+ N.times { |i|
25
+ n.times { |j| x[j] = j }
26
+ GSL::Ran.shuffle(R_GLOBAL, x)
27
+ n.times { |j| count[x[j], j] += 1 }
28
+ }
29
+
30
+ expected = N / 10.0
26
31
 
27
- n.times { |i|
28
- n.times { |j|
29
- d = (count[i, j] - expected).abs
32
+ n.times { |i|
33
+ n.times { |j|
34
+ d = (count[i, j] - expected).abs
30
35
 
31
- refute d > 1 && d / Math.sqrt(expected) > 5,
32
- "gsl_ran_shuffle #{i},#{j} (#{count[i, j] / N} observed vs 0.1 expected)"
36
+ refute d > 1 && d / Math.sqrt(expected) > 5,
37
+ "gsl_ran_shuffle #{i},#{j} (#{count[i, j] / N} observed vs 0.1 expected)"
38
+ }
33
39
  }
34
- }
40
+ end
35
41
  end
36
42
 
37
43
  def _test_moments(name, arg, a, b, pp)
@@ -54,8 +60,9 @@ class RandistTest < GSL::TestCase
54
60
 
55
61
  status = status_i = 0
56
62
 
57
- count = GSL::Vector.calloc(BINS)
58
- pp = GSL::Vector.calloc(BINS)
63
+ count = @@use_nmatrix ? NMatrix.new([BINS], 0 ,dtype: :float64) :
64
+ GSL::Vector.calloc(BINS)
65
+ pp = @@use_nmatrix ? NMatrix.new([BINS], 0 ,dtype: :float64) : GSL::Vector.calloc(BINS)
59
66
 
60
67
  N.times { |i|
61
68
  r = R_GLOBAL.send(name, *args)
@@ -85,13 +92,13 @@ class RandistTest < GSL::TestCase
85
92
  status |= status_i
86
93
 
87
94
  refute status_i == 1,
88
- "#{name} [#{x},#{x + dx}) (#{count[i]}/#{N}=#{count.to_f / N} observed vs #{pp[i]} expected)"
95
+ "#{name} [#{x},#{x + dx}) (#{count[i]}/#{N}=#{count[i].to_f / N} observed vs #{pp[i]} expected)"
89
96
  }
90
97
 
91
98
  assert status.zero?, "#{name}, sampling against pdf over range [#{a},#{b})"
92
99
  end
93
100
 
94
- def test_randist
101
+ def _test_randist
95
102
  _test_moments(:ugaussian, nil, 0.0, 100.0, 0.5)
96
103
  _test_moments(:ugaussian, nil, -1.0, 1.0, 0.6826895)
97
104
  _test_moments(:ugaussian, nil, 3.0, 3.5, 0.0011172689)
@@ -99,12 +106,16 @@ class RandistTest < GSL::TestCase
99
106
  _test_moments(:exponential, 2.0, 0.0, 1.0, 1 - Math.exp(-0.5))
100
107
  _test_moments(:cauchy, 2.0, 0.0, 10000.0, 0.5)
101
108
 
102
- _test_moments(:discrete, GSL::Ran::Discrete.alloc(GSL::Vector.alloc(0.59, 0.4, 0.01)), -0.5, 0.5, 0.59)
103
- _test_moments(:discrete, GSL::Ran::Discrete.alloc(GSL::Vector.alloc(0.59, 0.4, 0.01)), 0.5, 1.5, 0.40)
104
- _test_moments(:discrete, GSL::Ran::Discrete.alloc(GSL::Vector.alloc(0.59, 0.4, 0.01)), 1.5, 3.5, 0.01)
109
+ v = GSL::Vector.alloc(0.59, 0.4, 0.01)
110
+
111
+ _test_moments(:discrete, GSL::Ran::Discrete.alloc(v), -0.5, 0.5, 0.59)
112
+ _test_moments(:discrete, GSL::Ran::Discrete.alloc(v), 0.5, 1.5, 0.40)
113
+ _test_moments(:discrete, GSL::Ran::Discrete.alloc(v), 1.5, 3.5, 0.01)
114
+
115
+ v = GSL::Vector.alloc(1, 9, 3, 4, 5, 8, 6, 7, 2, 0)
105
116
 
106
- _test_moments(: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)
107
- _test_moments(:discrete, GSL::Ran::Discrete.alloc(GSL::Vector.alloc(1, 9, 3, 4, 5, 8, 6, 7, 2, 0)), 8.5, 9.5, 0)
117
+ _test_moments(:discrete, GSL::Ran::Discrete.alloc(v), -0.5, 0.5, 1.0 / 45.0)
118
+ _test_moments(:discrete, GSL::Ran::Discrete.alloc(v), 8.5, 9.5, 0)
108
119
 
109
120
  _test_pdf(:beta, 2.0, 3.0)
110
121
  _test_pdf(:cauchy, 2.0)
@@ -119,4 +130,13 @@ class RandistTest < GSL::TestCase
119
130
  _test_pdf(:ugaussian_tail, 0.1, 2.0)
120
131
  end
121
132
 
133
+ def test_randist
134
+ @@use_nmatrix = false
135
+ _test_randist
136
+
137
+ if ENV['NMATRIX']
138
+ @@use_nmatrix = true
139
+ _test_randist;
140
+ end
141
+ end
122
142
  end
@@ -1,4 +1,13 @@
1
1
  require 'test/unit'
2
+ begin
3
+ require 'narray'
4
+ rescue LoadError => e
5
+ end
6
+
7
+ begin
8
+ require 'nmatrix/nmatrix'
9
+ rescue LoadError => e
10
+ end
2
11
  require 'gsl'
3
12
 
4
13
  GSL::IEEE.env_setup
@@ -7,8 +16,9 @@ GSL::Rng.env_setup
7
16
  class GSL::TestCase < Test::Unit::TestCase
8
17
 
9
18
  def assert_factor(result, expected, factor, desc)
10
- refute result == expected ? false : expected.zero? ? result != expected :
11
- (u = result / expected; u > factor || u < 1.0 / factor),
19
+ refute result == expected ? false : (
20
+ expected.zero? ? result != expected :
21
+ (u = result / expected; u > factor || u < 1.0 / factor)),
12
22
  '%s (%.18g observed vs %.18g expected)' % [desc, result, expected]
13
23
  end
14
24
 
@@ -39,4 +49,22 @@ class GSL::TestCase < Test::Unit::TestCase
39
49
  assert((a - b).abs < (self.class::EPSREL * GSL.MIN(a.abs, b.abs) + self.class::EPSABS), msg)
40
50
  end
41
51
 
52
+ # Assert each element in an enumerable with absolute error.
53
+ def assert_enum_abs(result, expected, abserr, desc)
54
+ assert result.size == expected.size, 'size mismatch.'
55
+
56
+ r_enum = result.each
57
+ e_enum = expected.each
58
+
59
+ while true
60
+ begin
61
+ res_value = r_enum.next
62
+ exp_value = e_enum.next
63
+ assert_abs res_value, exp_value, abserr, "value mismatch. #{res_value} should be #{exp_value}"
64
+ rescue StopIteration
65
+ break
66
+ end
67
+ end
68
+ end
69
+
42
70
  end