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
@@ -32,7 +32,7 @@ VALUE rb_tamu_anova_alloc(int argc, VALUE *argv, VALUE klass)
32
32
  VALUE rb_tamu_anova_printtable(VALUE *vTable)
33
33
  {
34
34
  struct tamu_anova_table *table;
35
- Data_Get_Struct(vTable, struct tamu_anova_table, table);
35
+ Data_Get_Struct(*vTable, struct tamu_anova_table, table);
36
36
  tamu_anova_printtable(*table);
37
37
  return Qtrue;
38
38
  }
@@ -21,9 +21,16 @@ Gem::Specification.new do |s|
21
21
  s.required_ruby_version = '>= 1.9.3'
22
22
  s.requirements = ['GSL (http://www.gnu.org/software/gsl/)']
23
23
 
24
- s.post_install_message = "#{s.name} can be installed with or without narray support. Please install narray before and reinstall #{s.name} if it is missing."
24
+ s.post_install_message = %{
25
+ #{s.name} can be installed with or without narray support. Please install
26
+ narray before and reinstall #{s.name} if it is missing.
27
+
28
+ #{s.name} is also now compatible with NMatrix. Please install nmatrix before
29
+ installing #{s.name}.
30
+ }
25
31
 
26
32
  s.add_development_dependency 'rake-compiler', '>= 0'
27
33
  s.add_development_dependency 'rake', '>= 0'
28
34
  s.add_development_dependency 'test-unit', '>= 0'
35
+ s.add_development_dependency 'bundler', '~> 1.11'
29
36
  end
data/lib/gsl.rb CHANGED
@@ -3,6 +3,11 @@ begin
3
3
  rescue LoadError
4
4
  end
5
5
 
6
+ begin
7
+ require 'nmatrix/nmatrix'
8
+ rescue LoadError
9
+ end
10
+
6
11
  require 'gsl_native'
7
12
  require 'gsl/version'
8
13
  require 'gsl/oper'
@@ -1,3 +1,3 @@
1
1
  module GSL
2
- RUBY_GSL_VERSION = RB_GSL_VERSION = '1.16.0.6'
2
+ RUBY_GSL_VERSION = RB_GSL_VERSION = '2.1.0'
3
3
  end
@@ -0,0 +1,129 @@
1
+ #
2
+ # = NMatrix compatibilities
3
+ # === Contents:
4
+ # 1. {Data type conversions}[link:rdoc/nmatrix_rdoc.html#label-Data+type+conversions]
5
+ # 1. {Methods which accepts NArray}[link:rdoc/narray_rdoc.html#label-Methods+which+accepts+NArray]
6
+ #
7
+ # == Data type conversions
8
+ # === GSL to NMatrix
9
+ #
10
+ # ---
11
+ # * GSL::Vector#to_nm
12
+ # * GSL::Vector::Complex#to_nm
13
+ # * GSL::Vector::Int#to_nm
14
+ # * GSL::Matrix#to_nm
15
+ # * GSL::Matrix::Complex#to_nm
16
+ # * GSL::Matrix::Int#to_nm
17
+ #
18
+ # Convert GSL objects to NMatrix. The data contained by the GSL objects
19
+ # are copied to a newly allocated memory block of the NMatrix objects created.
20
+ #
21
+ # === NMatrix to GSL
22
+ # ---
23
+ # * NMatrix#to_gslv
24
+ # * NMatrix#to_gslm
25
+ #
26
+ # <tt>NMatrix#to_gslv</tt> converts NMatrix objects to <tt>GSL::Vector</tt>,
27
+ # <tt>GSL::Vector::Complex</tt> or <tt>GSL::Vector::Int</tt>.
28
+ # <tt>NMatrix#to_gslm</tt> converts NMatrix objects to <tt>GSL::Matrix</tt>,
29
+ # <tt>GSL::Matrix::Int</tt> or <tt>GSL::Matrix::Complex</tt>.
30
+ #
31
+ # The data contained by the NMatrix objects are copied to a newly allocated
32
+ # memory block of the GSL objects created.
33
+ #
34
+ # == Methods which accepts NMatrix
35
+ # === <tt>GSL</tt> module
36
+ # ---
37
+ # * GSL::graph()
38
+ # * GSL::log1p(x)
39
+ # * GSL::expm1(x)
40
+ # * GSL::hypot(x, y)
41
+ # * GSL::acosh(x)
42
+ # * GSL::asinh(x)
43
+ # * GSL::atanh(x)
44
+ # * GSL::pow(x, a)
45
+ # * GSL::pow_int(x, n)
46
+ # * GSL::pow_2(x), ..., GSL::pow_9(x)
47
+ #
48
+ #
49
+ # === <tt>Sf</tt> module
50
+ # ---
51
+ # * {Any}[link:rdoc/sf_rdoc.html]
52
+ #
53
+ # === <tt>Linalg</tt> module
54
+ # ---
55
+ # * GSL::Linalg::LU.decomp(na)
56
+ # * GSL::Linalg::LU.solve(lu, b)
57
+ # * GSL::Linalg::LU.svx(lu, bx)
58
+ # * GSL::Linalg::LU.det(lu, sign)
59
+ # * GSL::Linalg::LU.invert(lu, perm)
60
+ # * GSL::Linalg::QR.decomp(m)
61
+ # * GSL::Linalg::QR.solve(qr, tau, b)
62
+ # * GSL::Linalg::QR.svx(qr, tau, bx)
63
+ # * GSL::Linalg::SV.decomp(m)
64
+ # * GSL::Linalg::SV.solve(u, v, s, b)
65
+ # * GSL::Linalg::SV.svx(u, v, s, bx)
66
+ # * GSL::Linalg::Cholesky.decomp(m)
67
+ # * GSL::Linalg::Cholesky.solve(u, v, s, b)
68
+ # * GSL::Linalg::Cholesky.svx(u, v, s, bx)
69
+ # * GSL::Linalg::HH.solve(m, b)
70
+ # * GSL::Linalg::HH.svx(m, bx)
71
+ #
72
+ #
73
+ # === <tt>Eigen</tt> module
74
+ # ---
75
+ # * GSL::Eigen::symm(na)
76
+ # * GSL::Eigen::symmv(na)
77
+ #
78
+ #
79
+ # === <tt>FFT</tt> module
80
+ # ---
81
+ # * {Many}[link:rdoc/fft_rdoc.html]
82
+ #
83
+ # === <tt>Function</tt> class
84
+ # ---
85
+ # * GSL::Function#eval
86
+ # * GSL::Function#deriv_central(x, h)
87
+ # * GSL::Function#deriv_forward(x, h)
88
+ # * GSL::Function#deriv_backward(x, h)
89
+ # * GSL::Function#diff_central(x, h)
90
+ # * GSL::Function#diff_forward(x, h)
91
+ # * GSL::Function#diff_backward(x, h)
92
+ #
93
+ #
94
+ # === <tt>Ran</tt> and <tt>Cdf</tt> module
95
+ # ---
96
+ # * {Many}[link:rdoc/randist_rdoc.html]
97
+ #
98
+ # === <tt>Stats</tt> module
99
+ # ---
100
+ # * {Any}[link:rdoc/stats_rdoc.html]
101
+ #
102
+ # === <tt>Interp</tt> and <tt>Spline</tt> class
103
+ # ---
104
+ # * GSL::Interp#init
105
+ # * GSL::Interp#eval
106
+ # * GSL::Spline#init
107
+ # * GSL::Spline#eval
108
+ #
109
+ #
110
+ # === <tt>Deriv</tt> and <tt>Diff</tt> module
111
+ # ---
112
+ # TODO
113
+ #
114
+ #
115
+ # === <tt>Cheb</tt> class
116
+ # ---
117
+ # * GSL::Cheb#eval(x)
118
+ # * GSL::Cheb#eval_n(n, x)
119
+ #
120
+ #
121
+ # === <tt>Wavelet</tt> class
122
+ # ---
123
+ # TODO
124
+ #
125
+ # {prev}[link:rdoc/tensor_rdoc.html]
126
+ #
127
+ # {Reference index}[link:rdoc/ref_rdoc.html]
128
+ # {top}[link:index.html]
129
+ #
@@ -84,6 +84,7 @@
84
84
  # 1. {NDLINEAR: multi-linear, multi-parameter least squares fitting}[link:rdoc/ndlinear_rdoc.html]
85
85
  # 1. {ALF: associated Legendre polynomials}[link:rdoc/alf_rdoc.html]
86
86
  # 1. {NArray compatibilities}[link:rdoc/narray_rdoc.html]
87
+ # 1. {NMatrix compatibilities}[link:rdoc/nmatrix_rdoc.html]
87
88
  # 1. {Changes since Ruby/GSL 1.10.3}[link:rdoc/changes_rdoc.html]
88
89
  # 1. {GNU Free Documentation Licence}[https://gnu.org/software/gsl/manual/html_node/GNU-Free-Documentation-License.html]
89
90
  #
data/test.sh ADDED
@@ -0,0 +1,21 @@
1
+ #!/bin/bash
2
+ function compile_and_test {
3
+ bundle install
4
+ rake clobber
5
+ rake compile --silent --quiet
6
+ rake test
7
+ }
8
+ echo "Testing without NMATRIX or NARRAY...\n\n"
9
+ unset NMATRIX
10
+ unset NARRAY
11
+ compile_and_test
12
+
13
+ echo "Testing with NMATRIX=1...\n\n"
14
+ export NMATRIX=1
15
+ compile_and_test
16
+ unset NMATRIX
17
+
18
+ echo "Testing with NARRAY=1...\n\n"
19
+ export NARRAY=1
20
+ compile_and_test
21
+ unset NARRAY
@@ -42,22 +42,23 @@ class BsplineTest < GSL::TestCase
42
42
  end
43
43
 
44
44
  def test_bspline_knots
45
- 1.upto(NMAX) { |order|
46
- 2.upto(BMAX) { |breakpoints|
45
+ 1.upto(NMAX) do |order|
46
+ 2.upto(BMAX) do |breakpoints|
47
47
  a, b = -1.23 * order, 45.6 * order
48
48
 
49
49
  bw = GSL::BSpline.alloc(order, breakpoints)
50
- k = GSL::Vector.alloc(breakpoints)
51
-
52
- breakpoints.times { |i|
53
- f = GSL.sqrt(i.to_f / (breakpoints - 1.0))
54
- k[i] = (1 - f) * a + f * b
55
- }
56
-
57
- bw.knots(k)
58
- _test_bspline(bw)
59
- }
60
- }
50
+ test_data = [GSL::Vector.alloc(breakpoints)]
51
+ test_data << NMatrix.new([breakpoints], dtype: :float64) if ENV['NMATRIX']
52
+ test_data.each do |k|
53
+ breakpoints.times do |i|
54
+ f = GSL.sqrt(i.to_f / (breakpoints - 1.0))
55
+ k[i] = (1 - f) * a + f * b
56
+ end
57
+
58
+ bw.knots(k)
59
+ _test_bspline(bw)
60
+ end
61
+ end
62
+ end
61
63
  end
62
-
63
64
  end
@@ -4,14 +4,25 @@ class CombinationTest < GSL::TestCase
4
4
 
5
5
  def setup
6
6
  @c63 = GSL::Matrix.alloc(
7
- [0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 5],
8
- [0, 2, 3], [0, 2, 4], [0, 2, 5],
9
- [0, 3, 4], [0, 3, 5],
7
+ [0, 1, 2],
8
+ [0, 1, 3],
9
+ [0, 1, 4],
10
+ [0, 1, 5],
11
+ [0, 2, 3],
12
+ [0, 2, 4],
13
+ [0, 2, 5],
14
+ [0, 3, 4],
15
+ [0, 3, 5],
10
16
  [0, 4, 5],
11
- [1, 2, 3], [1, 2, 4], [1, 2, 5],
12
- [1, 3, 4], [1, 3, 5],
17
+ [1, 2, 3],
18
+ [1, 2, 4],
19
+ [1, 2, 5],
20
+ [1, 3, 4],
21
+ [1, 3, 5],
13
22
  [1, 4, 5],
14
- [2, 3, 4], [2, 3, 5], [2, 4, 5],
23
+ [2, 3, 4],
24
+ [2, 3, 5],
25
+ [2, 4, 5],
15
26
  [3, 4, 5]
16
27
  )
17
28
  end
@@ -4,26 +4,38 @@ class DhtTest < GSL::TestCase
4
4
 
5
5
  N = 128
6
6
 
7
+ def test_dht
8
+ test_data = [GSL::Vector.alloc(N)]
9
+ test_data << NMatrix.new([N], dtype: :float64) if ENV['NMATRIX']
10
+ test_data.each do |vin|
11
+ dht2 vin
12
+ dht3 vin
13
+ dht4 vin
14
+ end
15
+ end
16
+
7
17
  def test_dht1
8
- vin = GSL::Vector.alloc(1, 2, 3)
9
- dht = GSL::Dht.alloc(3, 1.0, 1.0)
18
+ test_data = [GSL::Vector.alloc(1, 2, 3)]
19
+ test_data << NMatrix.new([3], [1,2,3], dtype: :float64) if ENV['NMATRIX']
20
+ test_data.each do |vin|
21
+ dht = GSL::Dht.alloc(3, 1.0, 1.0)
10
22
 
11
- vout = dht.apply(vin)
23
+ vout = dht.apply(vin)
12
24
 
13
- assert_equal 0.3752546494075203, vout[0]
14
- assert_equal(-0.13350787269556064, vout[1])
15
- assert_equal 0.0446799251438404, vout[2]
25
+ assert_in_delta 0.3752546494075203, vout[0], 0.001
26
+ assert_in_delta(-0.13350787269556064, vout[1], 0.001)
27
+ assert_in_delta 0.0446799251438404, vout[2], 0.001
16
28
 
17
- vin2 = dht.apply(vout)
18
- vin2.scale!(13.323691936314223 ** 2)
29
+ vin2 = dht.apply(vout)
30
+ vin2 = vin2 * (13.323691936314223 ** 2)
19
31
 
20
- assert_equal 1.0000119186762644, vin2[0]
21
- assert_equal 1.9999790476647084, vin2[1]
22
- assert_equal 3.000035803234503, vin2[2]
32
+ assert_in_delta 1.0000119186762644, vin2[0], 0.001
33
+ assert_in_delta 1.9999790476647084, vin2[1], 0.001
34
+ assert_in_delta 3.000035803234503, vin2[2], 0.001
35
+ end
23
36
  end
24
37
 
25
- def test_dht2
26
- vin = GSL::Vector.alloc(N)
38
+ def dht2 vin
27
39
  dht = GSL::Dht.alloc(N, 0.0, 100.0)
28
40
 
29
41
  N.times { |i|
@@ -33,15 +45,14 @@ class DhtTest < GSL::TestCase
33
45
 
34
46
  vout = dht.apply(vin)
35
47
 
36
- assert_equal 3.999613382195876, vout[0]
37
- assert_equal 1.8387637474026606, vout[5]
38
- assert_equal 1.2677885358829588, vout[10]
39
- assert_equal 0.3521910403797792, vout[35]
40
- assert_equal 0.02373661279695407, vout[100]
48
+ assert_in_delta 3.999613382195876, vout[0], 0.001
49
+ assert_in_delta 1.8387637474026606, vout[5], 0.001
50
+ assert_in_delta 1.2677885358829588, vout[10], 0.001
51
+ assert_in_delta 0.3521910403797792, vout[35], 0.001
52
+ assert_in_delta 0.02373661279695407, vout[100], 0.001
41
53
  end
42
54
 
43
- def test_dht3
44
- vin = GSL::Vector.alloc(N)
55
+ def dht3 vin
45
56
  dht = GSL::Dht.alloc(N, 1.0, 20.0)
46
57
 
47
58
  N.times { |i|
@@ -51,15 +62,14 @@ class DhtTest < GSL::TestCase
51
62
 
52
63
  vout = dht.apply(vin)
53
64
 
54
- assert_equal 0.18148296716239096, vout[0]
55
- assert_equal 0.35680451269699853, vout[5]
56
- assert_equal 0.21101009980456306, vout[10]
57
- assert_equal 0.02892068100516861, vout[35]
58
- assert_equal 0.0022121119664674426, vout[100]
65
+ assert_in_delta 0.18148296716239096, vout[0], 0.001
66
+ assert_in_delta 0.35680451269699853, vout[5], 0.001
67
+ assert_in_delta 0.21101009980456306, vout[10], 0.001
68
+ assert_in_delta 0.02892068100516861, vout[35], 0.001
69
+ assert_in_delta 0.0022121119664674426, vout[100], 0.001
59
70
  end
60
71
 
61
- def test_dht4
62
- vin = GSL::Vector.alloc(N)
72
+ def dht4 vin
63
73
  dht = GSL::Dht.alloc(N, 1.0, 1.0)
64
74
 
65
75
  N.times { |i|
@@ -69,11 +79,10 @@ class DhtTest < GSL::TestCase
69
79
 
70
80
  vout = dht.apply(vin)
71
81
 
72
- assert_equal 0.05727421417071144, vout[0]
73
- assert_equal(-0.0001908501261051786, vout[5])
74
- assert_equal 2.434180086051901e-05, vout[10]
75
- assert_equal(-4.0392713194195724e-07, vout[35])
76
- assert_equal 8.255662619348403e-09, vout[100]
82
+ assert_in_delta 0.05727421417071144, vout[0], 0.001
83
+ assert_in_delta -0.0001908501261051786, vout[5], 0.001
84
+ assert_in_delta 2.434180086051901e-05, vout[10], 0.001
85
+ assert_in_delta -4.0392713194195724e-07, vout[35], 0.001
86
+ assert_in_delta 8.255662619348403e-09, vout[100], 0.001
77
87
  end
78
-
79
88
  end
@@ -0,0 +1,34 @@
1
+ require_relative '../../test_helper'
2
+
3
+ class NMatrixChebTest < GSL::TestCase
4
+ def test_eval
5
+ f = GSL::Function.alloc do |x|
6
+ if x < 0.5
7
+ 0.25
8
+ else
9
+ 0.75
10
+ end
11
+ end
12
+
13
+ n = 1000
14
+ order = 40
15
+ cs = GSL::Cheb.alloc(order)
16
+ x = NMatrix.new([n], GSL::Vector.linspace(0, 1, n).to_a, dtype: :float64)
17
+
18
+ ff = f.eval(x)
19
+
20
+ assert ff.class == NMatrix
21
+
22
+ cs.init(f, 0, 1)
23
+ r10 = cs.eval_n(10, x)
24
+ r40 = cs.eval(x)
25
+
26
+ assert r10.class == NMatrix
27
+ assert_rel r10.to_a.last, 0.758879, 0.001, 'test r10.last'
28
+ assert_rel r10[5] , 0.247816, 0.001, 'test r10[5]'
29
+
30
+ assert r40.class == NMatrix
31
+ assert_rel r40[5] , 0.255682, 0.001, 'test r40[5]'
32
+ assert_rel r40.first, 0.25633 , 0.001, 'test r40.first'
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ class NMatrixEigenTest < GSL::TestCase
4
+ def setup
5
+ @nmatrix = NMatrix.new([4,4],
6
+ [1.0, 1/2.0, 1/3.0, 1/4.0,
7
+ 1/2.0, 1/3.0, 1/4.0, 1/5.0,
8
+ 1/3.0, 1/4.0, 1/5.0, 1/6.0,
9
+ 1/4.0, 1/5.0, 1/6.0, 1/7.0], dtype: :float64)
10
+ end
11
+
12
+ def test_symm_symmv
13
+ eigen_values = NMatrix.new([4],
14
+ [1.50021, 0.169141, 0.00673827, 9.67023e-05], dtype: :float64)
15
+ eigen_vectors = NMatrix.new([4,4],
16
+ [0.792608, 0.582076,-0.179186,-0.0291933,
17
+ 0.451923,-0.370502, 0.741918, 0.328712 ,
18
+ 0.322416,-0.509579,-0.100228,-0.791411 ,
19
+ 0.252161,-0.514048,-0.638283, 0.514553], dtype: :float64)
20
+
21
+ assert_enum_abs GSL::Eigen.symm(@nmatrix), eigen_values, 0.001, "GSL::Eigen.symm(nmatrix)"
22
+
23
+ # val, vec = GSL::Eigen.symmv(@nmatrix)
24
+
25
+ # assert_enum_abs val, eigen_values , 0.001, "GSL::Eigen.symmv(nmatrix)"
26
+ # assert_enum_abs vec, eigen_vectors, 0.001, "GSL::Eigen.symmv(nmatrix)"
27
+ end
28
+ end