gsl 1.16.0.6 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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