rb-gsl 1.15.3.1 → 1.15.3.2

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 (222) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS +2 -2
  3. data/ChangeLog +8 -0
  4. data/Rakefile +39 -96
  5. data/VERSION +1 -1
  6. data/ext/array.c +2 -2
  7. data/ext/block_source.c +1 -1
  8. data/ext/dirac.c +1 -1
  9. data/ext/eigen.c +13 -13
  10. data/ext/extconf.rb +17 -11
  11. data/ext/function.c +5 -5
  12. data/ext/gsl_narray.c +6 -6
  13. data/ext/histogram.c +7 -6
  14. data/ext/histogram2d.c +4 -4
  15. data/ext/interp.c +1 -1
  16. data/ext/linalg.c +13 -11
  17. data/ext/linalg_complex.c +8 -6
  18. data/ext/math.c +1 -1
  19. data/ext/matrix_complex.c +6 -6
  20. data/ext/matrix_source.c +10 -10
  21. data/ext/monte.c +2 -2
  22. data/ext/multimin.c +4 -4
  23. data/ext/multiroots.c +8 -8
  24. data/ext/nmf.c +6 -6
  25. data/ext/ntuple.c +4 -4
  26. data/ext/odeiv.c +2 -2
  27. data/ext/permutation.c +1 -1
  28. data/ext/poly2.c +6 -6
  29. data/ext/poly_source.c +9 -6
  30. data/ext/sf.c +31 -45
  31. data/ext/signal.c +2 -2
  32. data/ext/vector_complex.c +11 -10
  33. data/ext/vector_double.c +7 -4
  34. data/ext/vector_source.c +29 -26
  35. data/ext/wavelet.c +1 -1
  36. data/include/rb_gsl_common.h +12 -0
  37. data/include/rb_gsl_config.h +10 -1
  38. data/rdoc/blas.rdoc +4 -4
  39. data/rdoc/bspline.rdoc +8 -8
  40. data/rdoc/cheb.rdoc +9 -9
  41. data/rdoc/cholesky_complex.rdoc +1 -1
  42. data/rdoc/combi.rdoc +10 -10
  43. data/rdoc/complex.rdoc +12 -12
  44. data/rdoc/const.rdoc +21 -21
  45. data/rdoc/dht.rdoc +7 -7
  46. data/rdoc/diff.rdoc +7 -7
  47. data/rdoc/ehandling.rdoc +4 -4
  48. data/rdoc/eigen.rdoc +12 -12
  49. data/rdoc/fft.rdoc +27 -27
  50. data/rdoc/fit.rdoc +19 -19
  51. data/rdoc/function.rdoc +1 -1
  52. data/rdoc/graph.rdoc +3 -3
  53. data/rdoc/hist.rdoc +17 -17
  54. data/rdoc/hist2d.rdoc +5 -5
  55. data/rdoc/hist3d.rdoc +4 -4
  56. data/rdoc/index.rdoc +4 -4
  57. data/rdoc/integration.rdoc +17 -17
  58. data/rdoc/interp.rdoc +12 -12
  59. data/rdoc/intro.rdoc +4 -4
  60. data/rdoc/linalg.rdoc +21 -21
  61. data/rdoc/linalg_complex.rdoc +1 -1
  62. data/rdoc/math.rdoc +14 -14
  63. data/rdoc/matrix.rdoc +21 -21
  64. data/rdoc/min.rdoc +10 -10
  65. data/rdoc/monte.rdoc +4 -4
  66. data/rdoc/multimin.rdoc +13 -13
  67. data/rdoc/multiroot.rdoc +13 -13
  68. data/rdoc/narray.rdoc +10 -10
  69. data/rdoc/ndlinear.rdoc +5 -5
  70. data/rdoc/nonlinearfit.rdoc +18 -18
  71. data/rdoc/ntuple.rdoc +6 -6
  72. data/rdoc/odeiv.rdoc +13 -13
  73. data/rdoc/perm.rdoc +12 -12
  74. data/rdoc/poly.rdoc +18 -18
  75. data/rdoc/qrng.rdoc +10 -10
  76. data/rdoc/randist.rdoc +11 -11
  77. data/rdoc/ref.rdoc +50 -50
  78. data/rdoc/rng.rdoc +10 -10
  79. data/rdoc/rngextra.rdoc +5 -5
  80. data/rdoc/roots.rdoc +13 -13
  81. data/rdoc/sf.rdoc +36 -36
  82. data/rdoc/siman.rdoc +4 -4
  83. data/rdoc/sort.rdoc +7 -7
  84. data/rdoc/start.rdoc +1 -1
  85. data/rdoc/stats.rdoc +14 -14
  86. data/rdoc/sum.rdoc +5 -5
  87. data/rdoc/tensor.rdoc +4 -4
  88. data/rdoc/tut.rdoc +1 -1
  89. data/rdoc/use.rdoc +5 -5
  90. data/rdoc/vector.rdoc +29 -29
  91. data/rdoc/vector_complex.rdoc +6 -6
  92. data/rdoc/wavelet.rdoc +9 -9
  93. data/test/gsl/blas_test.rb +79 -0
  94. data/test/gsl/bspline_test.rb +63 -0
  95. data/test/gsl/cdf_test.rb +1512 -0
  96. data/test/gsl/cheb_test.rb +80 -0
  97. data/test/gsl/combination_test.rb +100 -0
  98. data/test/gsl/complex_test.rb +20 -0
  99. data/test/gsl/const_test.rb +29 -0
  100. data/test/gsl/deriv_test.rb +62 -0
  101. data/test/gsl/dht_test.rb +79 -0
  102. data/test/gsl/diff_test.rb +53 -0
  103. data/test/gsl/eigen_test.rb +563 -0
  104. data/test/gsl/err_test.rb +23 -0
  105. data/test/gsl/fit_test.rb +101 -0
  106. data/test/gsl/histo_test.rb +14 -0
  107. data/test/gsl/integration_test.rb +274 -0
  108. data/test/gsl/interp_test.rb +27 -0
  109. data/test/gsl/linalg_test.rb +463 -0
  110. data/test/gsl/matrix_nmf_test.rb +37 -0
  111. data/test/gsl/matrix_test.rb +77 -0
  112. data/test/gsl/min_test.rb +89 -0
  113. data/test/gsl/monte_test.rb +77 -0
  114. data/test/gsl/multifit_test.rb +753 -0
  115. data/test/gsl/multimin_test.rb +157 -0
  116. data/test/gsl/multiroot_test.rb +135 -0
  117. data/test/gsl/multiset_test.rb +52 -0
  118. data/test/gsl/odeiv_test.rb +275 -0
  119. data/test/gsl/poly_test.rb +338 -0
  120. data/test/gsl/qrng_test.rb +94 -0
  121. data/test/gsl/quartic_test.rb +28 -0
  122. data/test/gsl/randist_test.rb +122 -0
  123. data/test/gsl/rng_test.rb +303 -0
  124. data/test/gsl/roots_test.rb +78 -0
  125. data/test/gsl/sf_test.rb +2079 -0
  126. data/test/gsl/stats_test.rb +122 -0
  127. data/test/gsl/sum_test.rb +69 -0
  128. data/test/gsl/tensor_test.rb +396 -0
  129. data/test/gsl/vector_test.rb +223 -0
  130. data/test/gsl/wavelet_test.rb +130 -0
  131. data/test/gsl_test.rb +321 -0
  132. data/test/test_helper.rb +42 -0
  133. metadata +107 -150
  134. data/setup.rb +0 -1585
  135. data/tests/blas/amax.rb +0 -14
  136. data/tests/blas/asum.rb +0 -16
  137. data/tests/blas/axpy.rb +0 -25
  138. data/tests/blas/copy.rb +0 -23
  139. data/tests/blas/dot.rb +0 -23
  140. data/tests/bspline.rb +0 -53
  141. data/tests/cdf.rb +0 -1388
  142. data/tests/cheb.rb +0 -112
  143. data/tests/combination.rb +0 -123
  144. data/tests/complex.rb +0 -17
  145. data/tests/const.rb +0 -24
  146. data/tests/deriv.rb +0 -85
  147. data/tests/dht/dht1.rb +0 -17
  148. data/tests/dht/dht2.rb +0 -23
  149. data/tests/dht/dht3.rb +0 -23
  150. data/tests/dht/dht4.rb +0 -23
  151. data/tests/diff.rb +0 -78
  152. data/tests/eigen/eigen.rb +0 -220
  153. data/tests/eigen/gen.rb +0 -105
  154. data/tests/eigen/genherm.rb +0 -66
  155. data/tests/eigen/gensymm.rb +0 -68
  156. data/tests/eigen/nonsymm.rb +0 -53
  157. data/tests/eigen/nonsymmv.rb +0 -53
  158. data/tests/eigen/symm-herm.rb +0 -74
  159. data/tests/err.rb +0 -58
  160. data/tests/fit.rb +0 -124
  161. data/tests/gsl_test.rb +0 -118
  162. data/tests/gsl_test2.rb +0 -110
  163. data/tests/histo.rb +0 -12
  164. data/tests/integration/integration1.rb +0 -72
  165. data/tests/integration/integration2.rb +0 -71
  166. data/tests/integration/integration3.rb +0 -71
  167. data/tests/integration/integration4.rb +0 -71
  168. data/tests/interp.rb +0 -45
  169. data/tests/linalg/HH.rb +0 -64
  170. data/tests/linalg/LU.rb +0 -47
  171. data/tests/linalg/QR.rb +0 -77
  172. data/tests/linalg/SV.rb +0 -24
  173. data/tests/linalg/TDN.rb +0 -116
  174. data/tests/linalg/TDS.rb +0 -122
  175. data/tests/linalg/bidiag.rb +0 -73
  176. data/tests/linalg/cholesky.rb +0 -20
  177. data/tests/linalg/linalg.rb +0 -158
  178. data/tests/matrix/matrix_complex_test.rb +0 -36
  179. data/tests/matrix/matrix_nmf_test.rb +0 -39
  180. data/tests/matrix/matrix_test.rb +0 -48
  181. data/tests/min.rb +0 -99
  182. data/tests/monte/miser.rb +0 -31
  183. data/tests/monte/vegas.rb +0 -45
  184. data/tests/multifit/test_2dgauss.rb +0 -112
  185. data/tests/multifit/test_brown.rb +0 -90
  186. data/tests/multifit/test_enso.rb +0 -246
  187. data/tests/multifit/test_filip.rb +0 -155
  188. data/tests/multifit/test_gauss.rb +0 -97
  189. data/tests/multifit/test_longley.rb +0 -110
  190. data/tests/multifit/test_multifit.rb +0 -52
  191. data/tests/multimin.rb +0 -139
  192. data/tests/multiroot.rb +0 -131
  193. data/tests/multiset.rb +0 -52
  194. data/tests/narray/blas_dnrm2.rb +0 -20
  195. data/tests/odeiv.rb +0 -353
  196. data/tests/poly/poly.rb +0 -290
  197. data/tests/poly/special.rb +0 -65
  198. data/tests/qrng.rb +0 -131
  199. data/tests/quartic.rb +0 -29
  200. data/tests/randist.rb +0 -134
  201. data/tests/rng.rb +0 -305
  202. data/tests/roots.rb +0 -76
  203. data/tests/run-test.sh +0 -17
  204. data/tests/sf/gsl_test_sf.rb +0 -249
  205. data/tests/sf/test_airy.rb +0 -83
  206. data/tests/sf/test_bessel.rb +0 -306
  207. data/tests/sf/test_coulomb.rb +0 -17
  208. data/tests/sf/test_dilog.rb +0 -25
  209. data/tests/sf/test_gamma.rb +0 -209
  210. data/tests/sf/test_hyperg.rb +0 -356
  211. data/tests/sf/test_legendre.rb +0 -227
  212. data/tests/sf/test_mathieu.rb +0 -59
  213. data/tests/sf/test_mode.rb +0 -19
  214. data/tests/sf/test_sf.rb +0 -839
  215. data/tests/stats.rb +0 -174
  216. data/tests/stats_mt.rb +0 -16
  217. data/tests/sum.rb +0 -98
  218. data/tests/sys.rb +0 -323
  219. data/tests/tensor.rb +0 -419
  220. data/tests/vector/vector_complex_test.rb +0 -101
  221. data/tests/vector/vector_test.rb +0 -141
  222. data/tests/wavelet.rb +0 -142
@@ -0,0 +1,122 @@
1
+ require 'test_helper'
2
+
3
+ class StatsTest < GSL::TestCase
4
+
5
+ def test_stats
6
+ lew = GSL::Vector.alloc(
7
+ -213, -564, -35, -15, 141, 115, -420, -360, 203, -338, -431, 194,
8
+ -220, -513, 154, -125, -559, 92, -21, -579, -52, 99, -543, -175,
9
+ 162, -457, -346, 204, -300, -474, 164, -107, -572, -8, 83, -541,
10
+ -224, 180, -420, -374, 201, -236, -531, 83, 27, -564, -112, 131,
11
+ -507, -254, 199, -311, -495, 143, -46, -579, -90, 136, -472, -338,
12
+ 202, -287, -477, 169, -124, -568, 17, 48, -568, -135, 162, -430,
13
+ -422, 172, -74, -577, -13, 92, -534, -243, 194, -355, -465, 156,
14
+ -81, -578, -64, 139, -449, -384, 193, -198, -538, 110, -44, -577,
15
+ -6, 66, -552, -164, 161, -460, -344, 205, -281, -504, 134, -28,
16
+ -576, -118, 156, -437, -381, 200, -220, -540, 83, 11, -568, -160,
17
+ 172, -414, -408, 188, -125, -572, -32, 139, -492, -321, 205, -262,
18
+ -504, 142, -83, -574, 0, 48, -571, -106, 137, -501, -266, 190,
19
+ -391, -406, 194, -186, -553, 83, -13, -577, -49, 103, -515, -280,
20
+ 201, 300, -506, 131, -45, -578, -80, 138, -462, -361, 201, -211,
21
+ -554, 32, 74, -533, -235, 187, -372, -442, 182, -147, -566, 25,
22
+ 68, -535, -244, 194, -351, -463, 174, -125, -570, 15, 72, -550,
23
+ -190, 172, -424, -385, 198, -218, -536, 96
24
+ )
25
+
26
+ mean = lew.mean
27
+ sd = lew.sd
28
+ lag1 = lew.lag1_autocorrelation
29
+
30
+ assert_rel mean, -177.435000000000, 1e-15, 'lew gsl_stats_mean'
31
+ assert_rel sd, 277.332168044316, 1e-15, 'lew gsl_stats_sd'
32
+ assert_rel lag1, -0.307304800605679, 1e-14, 'lew autocorrelation'
33
+
34
+ rel = 1e-10
35
+
36
+ rawa = GSL::Vector.alloc(
37
+ 0.0421, 0.0941, 0.1064, 0.0242, 0.1331,
38
+ 0.0773, 0.0243, 0.0815, 0.1186, 0.0356,
39
+ 0.0728, 0.0999, 0.0614, 0.0479
40
+ )
41
+
42
+ rawb = GSL::Vector.alloc(
43
+ 0.1081, 0.0986, 0.1566, 0.1961, 0.1125,
44
+ 0.1942, 0.1079, 0.1021, 0.1583, 0.1673,
45
+ 0.1675, 0.1856, 0.1688, 0.1512
46
+ )
47
+
48
+ raww = GSL::Vector.alloc(
49
+ 0.0000, 0.0000, 0.0000, 3.000, 0.0000,
50
+ 1.0000, 1.0000, 1.0000, 0.000, 0.5000,
51
+ 7.0000, 5.0000, 4.0000, 0.123
52
+ )
53
+
54
+ assert_rel mean = rawa.mean, 0.0728, rel, 'gsl_stats_mean'
55
+
56
+ assert_rel rawa.variance_with_fixed_mean(mean), 0.00113837428571429,
57
+ rel, 'gsl_stats_variance_with_fixed_mean'
58
+
59
+ assert_rel rawa.sd_with_fixed_mean(mean), 0.0337398026922845,
60
+ rel, 'gsl_stats_sd_with_fixed_mean'
61
+
62
+ assert_rel rawb.variance, 0.00124956615384615, rel, 'gsl_stats_variance'
63
+ assert_rel rawa.sd, 0.0350134479659107, rel, 'gsl_stats_sd'
64
+ assert_rel rawa.absdev, 0.0287571428571429, rel, 'gsl_stats_absdev'
65
+ assert_rel rawa.skew, 0.0954642051479004, rel, 'gsl_stats_skew'
66
+ assert_rel rawa.kurtosis, -1.38583851548909, rel, 'gsl_stats_kurtosis'
67
+ assert_rel rawa.wmean(raww), 0.0678111523670601, rel, 'gsl_stats_wmean'
68
+ assert_rel rawa.wvariance(raww), 0.000769562962860317, rel, 'gsl_stats_wvariance'
69
+ assert_rel rawa.wsd(raww), 0.0277409978706664, rel, 'gsl_stats_wsd'
70
+ assert_rel rawa.wabsdev(raww), 0.0193205027504008, rel, 'gsl_stats_wabsdev'
71
+ assert_rel rawa.wskew(raww), -0.373631000307076, rel, 'gsl_stats_wskew'
72
+ assert_rel rawa.wkurtosis(raww), -1.48114233353963, rel, 'gsl_stats_wkurtosis'
73
+
74
+ assert_rel GSL::Stats.covariance(rawa, rawb), -0.000139021538461539, rel, 'gsl_stats_covariance'
75
+
76
+ if GSL::GSL_VERSION >= '1.9.90'
77
+ assert_rel GSL::Stats.correlation(rawa, rawb), -0.112322712666074171, rel, 'gsl_stats_correlation'
78
+ assert_rel GSL::Stats.pvariance(rawa, rawb), 0.00123775384615385, rel, 'gsl_stats_pvariance'
79
+ assert_rel GSL::Stats.ttest(rawa, rawb), -5.67026326985851, rel, 'gsl_stats_ttest'
80
+ end
81
+
82
+ assert_rel rawa.max, 0.1331, rel, 'gsl_stats_max'
83
+ assert_rel rawa.min, 0.0242, rel, 'gsl_stats_min'
84
+
85
+ min, max = rawa.minmax
86
+ assert_rel max, 0.1331, rel, 'gsl_stats_minmax: max'
87
+ assert_rel min, 0.0242, rel, 'gsl_stats_minmax: min'
88
+
89
+ assert rawa.max_index == 4, 'gsl_stats_max_index'
90
+ assert rawa.min_index == 3, 'gsl_stats_min_index'
91
+
92
+ min_index, max_index = rawa.minmax_index
93
+ assert max_index == 4, 'gsl_stats_minmax_index: max'
94
+ assert min_index == 3, 'gsl_stats_minmax_index: min'
95
+
96
+ rawa.sort!
97
+
98
+ assert_rel rawa.median_from_sorted_data, 0.07505,
99
+ rel, 'gsl_stats_median_from_sorted_data'
100
+
101
+ assert_rel rawa.subvector(0, rawa.size - 1).median_from_sorted_data, 0.0728,
102
+ rel, 'gsl_stats_median_from_sorted_data'
103
+
104
+ assert_rel rawa.quantile_from_sorted_data(0.0), 0.0242,
105
+ rel, 'gsl_stats_quantile_from_sorted_data'
106
+
107
+ assert_rel rawa.quantile_from_sorted_data(1.0), 0.1331,
108
+ rel, 'gsl_stats_quantile_from_sorted_data (100)'
109
+
110
+ assert_rel rawa.quantile_from_sorted_data(0.5), 0.07505,
111
+ rel, 'gsl_stats_quantile_from_sorted_data (50even)'
112
+
113
+ assert_rel rawa.subvector(0, rawa.size-1).quantile_from_sorted_data(0.5), 0.0728,
114
+ rel, 'gsl_stats_quantile_from_sorted_data (50odd)'
115
+ end
116
+
117
+ def test_variance_with_fixed_mean
118
+ v = GSL::Vector[1..8]
119
+ assert_raises(ArgumentError, 'check for no args') { v.variance_with_fixed_mean }
120
+ end
121
+
122
+ end
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ class SumTest < GSL::TestCase
4
+
5
+ N = 50
6
+
7
+ def setup
8
+ @t = GSL::Vector.alloc(N)
9
+ N.times { |n| @t[n] = 1.0 / (n + 1.0) ** 2 }
10
+ end
11
+
12
+ def _fill_vector(x = 1.0)
13
+ @t[0] = x
14
+ 1.upto(N - 1) { |n| @t[n] = yield n, @t[n - 1] }
15
+ end
16
+
17
+ def _test_sum(expected, desc)
18
+ sum_accel, _ = GSL::Sum::Levin_utrunc.alloc(N).accel(@t)
19
+ assert_rel sum_accel, expected, 1e-8, 'trunc result, %s' % desc
20
+
21
+ sum_accel, err_est, = GSL::Sum::Levin_u.alloc(N).accel(@t)
22
+ assert_rel sum_accel, expected, 1e-8, 'full result, %s' % desc
23
+
24
+ sd_est = -Math.log10(err_est / sum_accel.abs)
25
+ sd_actual = -Math.log10(GSL::DBL_EPSILON + ((sum_accel - expected) / expected).abs)
26
+
27
+ refute sd_est > sd_actual + 1.0,
28
+ 'full significant digits, %s (%g vs %g)' % [desc, sd_est, sd_actual]
29
+ end
30
+
31
+ def test_zeta_2
32
+ _test_sum(GSL::M_PI ** 2 / 6.0, 'zeta(2)')
33
+ end
34
+
35
+ def test_exp_10(x = 10.0)
36
+ _fill_vector { |n, t| t * (x / n) }
37
+ _test_sum(Math.exp(x), 'exp(%d)' % x)
38
+ end
39
+
40
+ def test_exp_neg_10
41
+ test_exp_10(-10.0)
42
+ end
43
+
44
+ def test_log(x = 0.5)
45
+ _fill_vector(x) { |n, t| t * (x * n) / (n + 1.0) }
46
+ _test_sum(-Math.log(1 - x), "-log(#{1 - x})")
47
+ end
48
+
49
+ def test_log2
50
+ test_log(-1.0)
51
+ end
52
+
53
+ def test_asymptotic_series
54
+ m = GSL::M_PI ** 2
55
+ _fill_vector(3.0 / m) { |n, t| -t * (4.0 * (n + 1.0) - 1.0) / m }
56
+ _test_sum(0.192594048773, 'asymptotic series')
57
+ end
58
+
59
+ def test_eulers_constant
60
+ _fill_vector { |n, _| 1 / (n + 1.0) + Math.log(n / (n + 1.0)) }
61
+ _test_sum(0.5772156649015328606065120900824, "Euler's constant")
62
+ end
63
+
64
+ def test_eta
65
+ N.times { |n| @t[n] = (n % 2 == 1 ? -1 : 1) * 1.0 / GSL.sqrt(n + 1.0) }
66
+ _test_sum(0.6048986434216305, 'eta(1/2)')
67
+ end
68
+
69
+ end
@@ -0,0 +1,396 @@
1
+ require 'test_helper'
2
+
3
+ class TensorTest < GSL::TestCase
4
+
5
+ RANK = 3
6
+ DIMENSION = 5
7
+
8
+ def test_tensor
9
+ return unless GSL.const_defined?(:Tensor)
10
+
11
+ t = GSL::Tensor.alloc(RANK, DIMENSION)
12
+
13
+ assert t.rank == RANK, "#{t.class}.alloc returns valid rank"
14
+ assert t.dimension == DIMENSION, "#{t.class}_alloc returns valid dimension"
15
+
16
+ counter = 0
17
+ for i in 0...DIMENSION do
18
+ for j in 0...DIMENSION do
19
+ for k in 0...DIMENSION do
20
+ counter += 1
21
+ t.set(i, j, k, counter)
22
+ # t[i, j, k] = counter
23
+ end
24
+ end
25
+ end
26
+
27
+ status = 0
28
+ counter = 0
29
+ data = t.data # GSL::Vector::View
30
+ for i in 0...DIMENSION do
31
+ for j in 0...DIMENSION do
32
+ for k in 0...DIMENSION do
33
+ counter += 1
34
+ if data[DIMENSION * DIMENSION * i + DIMENSION * j + k] != counter
35
+ status += 1
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ assert status.zero?, "#{t.class}#set writes into array"
42
+
43
+ status = 0
44
+ counter = 0
45
+ data = t.data
46
+ for i in 0...DIMENSION do
47
+ for j in 0...DIMENSION do
48
+ for k in 0...DIMENSION do
49
+ counter += 1
50
+ # if t.get(i, j, k) != counter
51
+ if t[i, j, k] != counter
52
+ status += 1
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ assert status.zero?, "#{t.class}#get reads from array"
59
+
60
+ t = GSL::Tensor.calloc(RANK, DIMENSION)
61
+
62
+ counter = 0
63
+ for i in 0...DIMENSION do
64
+ for j in 0...DIMENSION do
65
+ for k in 0...DIMENSION do
66
+ counter += 1
67
+ t.set(i, j, k, counter)
68
+ end
69
+ end
70
+ end
71
+
72
+ exp_max = t[0, 0, 0]
73
+ exp_min = t[0, 0, 0]
74
+ exp_imax = exp_jmax = exp_kmax = 0
75
+ exp_imin = exp_jmin = exp_kmin = 0
76
+
77
+ for i in 0...DIMENSION do
78
+ for j in 0...DIMENSION do
79
+ for k in 0...DIMENSION do
80
+ value = t[i, j, k]
81
+ if value > exp_max
82
+ exp_max = value
83
+ exp_imax = i; exp_jmax = j; exp_kmax = k
84
+ end
85
+ if value < exp_min
86
+ exp_min = t[i, j, k]
87
+ exp_imin = i; exp_jmin = j; exp_kmin = k
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ max = t.max
94
+ assert max == exp_max, "#{t.class}#max returns correct maximum value"
95
+ min = t.min
96
+ assert min == exp_min, "#{t.class}#min returns correct minimum value"
97
+
98
+ min, max = t.minmax
99
+ assert max == exp_max, "#{t.class}#minmax returns correct maximum value"
100
+ assert min == exp_min, "#{t.class}#minmax returns correct minimum value"
101
+
102
+ imax = t.max_index
103
+ status = 0
104
+ if imax[0] != exp_imax; status += 1; end
105
+ if imax[1] != exp_jmax; status += 1; end
106
+ if imax[2] != exp_kmax; status += 1; end
107
+ assert status.zero?, "#{t.class}#max_index returns correct maximum indices"
108
+
109
+ imin = t.min_index
110
+ status = 0
111
+ if imin[0] != exp_imin; status += 1; end
112
+ if imin[1] != exp_jmin; status += 1; end
113
+ if imin[2] != exp_kmin; status += 1; end
114
+ assert status.zero?, "#{t.class}#min_index returns correct minimum indices"
115
+
116
+
117
+ imin, imax = t.minmax_index
118
+ status = 0
119
+ if imin[0] != exp_imin; status += 1; end
120
+ if imin[1] != exp_jmin; status += 1; end
121
+ if imin[2] != exp_kmin; status += 1; end
122
+ if imax[0] != exp_imax; status += 1; end
123
+ if imax[1] != exp_jmax; status += 1; end
124
+ if imax[2] != exp_kmax; status += 1; end
125
+ assert status.zero?, "#{t.class}#minmax_index returns correct indices"
126
+
127
+ ##### Operations
128
+ a = GSL::Tensor.new(RANK, DIMENSION)
129
+ b = GSL::Tensor.new(RANK, DIMENSION)
130
+ for i in 0...DIMENSION do
131
+ for j in 0...DIMENSION do
132
+ for k in 0...DIMENSION do
133
+ a[i, j, k] = 3 + i + 5 * j + 2 * k
134
+ b[i, j, k] = 3 + 2 * i + 4 * j + k
135
+ end
136
+ end
137
+ end
138
+
139
+ # Addition
140
+ c = a + b
141
+ #c = a.add(b)
142
+ status = 0
143
+ for i in 0...DIMENSION do
144
+ for j in 0...DIMENSION do
145
+ for k in 0...DIMENSION do
146
+ r = c[i, j, k]
147
+ x = a[i, j, k]
148
+ y = b[i, j, k]
149
+ z = x + y
150
+ status += 1 if r != z
151
+ end
152
+ end
153
+ end
154
+ assert status.zero?, "#{t.class}#add tensor addition"
155
+
156
+ # Subtraction
157
+ c = a - b
158
+ # c = a.sub(b)
159
+ status = 0
160
+ for i in 0...DIMENSION do
161
+ for j in 0...DIMENSION do
162
+ for k in 0...DIMENSION do
163
+ r = c[i, j, k]
164
+ x = a[i, j, k]
165
+ y = b[i, j, k]
166
+ z = x - y
167
+ status += 1 if r != z
168
+ end
169
+ end
170
+ end
171
+ assert status.zero?, "#{t.class}#sub tensor subtraction"
172
+
173
+ # Element multiplication
174
+ c = a.mul_elements(b)
175
+ status = 0
176
+ for i in 0...DIMENSION do
177
+ for j in 0...DIMENSION do
178
+ for k in 0...DIMENSION do
179
+ r = c[i, j, k]
180
+ x = a[i, j, k]
181
+ y = b[i, j, k]
182
+ z = x * y
183
+ status += 1 if r != z
184
+ end
185
+ end
186
+ end
187
+ assert status.zero?, "#{t.class}#mul_elements element multiplication"
188
+
189
+ # Element division
190
+ c = a.div_elements(b)
191
+ status = 0
192
+ for i in 0...DIMENSION do
193
+ for j in 0...DIMENSION do
194
+ for k in 0...DIMENSION do
195
+ r = c[i, j, k]
196
+ x = a[i, j, k]
197
+ y = b[i, j, k]
198
+ z = x / y
199
+ if (r - z).abs > 2 * GSL::FLT_EPSILON * z.abs; status += 1; end
200
+ end
201
+ end
202
+ end
203
+ assert status.zero?, "#{t.class}#div_elements element division"
204
+
205
+ ### Tensor product
206
+ c = a * b
207
+ status = 0
208
+ for i in 0...DIMENSION do
209
+ for j in 0...DIMENSION do
210
+ for k in 0...DIMENSION do
211
+ for l in 0...DIMENSION do
212
+ for m in 0...DIMENSION do
213
+ for n in 0...DIMENSION do
214
+ r = c[i, j, k, l, m, n]
215
+ x = a[i, j, k]
216
+ y = b[l, m, n]
217
+ z = x * y
218
+ if r != z; status += 1; end
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
225
+ assert status.zero?, "#{t.class}#product tensorial product"
226
+
227
+ ### Index contraction
228
+ tt = a.contract(0, 1)
229
+ assert tt.rank == RANK - 2, "#{t.class}.contract returns valid rank"
230
+ assert tt.dimension == DIMENSION, "#{t.class}_contract returns valid dimension"
231
+
232
+ ### Swap indices
233
+ a_102 = a.swap_indices(0, 1)
234
+ a_210 = a.swap_indices(0, 2)
235
+ a_021 = a.swap_indices(1, 2)
236
+ status = 0
237
+ for i in 0...DIMENSION do
238
+ for j in 0...DIMENSION do
239
+ for k in 0...DIMENSION do
240
+ x = a[i, j, k]
241
+ x_102 = a_102[j, i, k]
242
+ x_210 = a_210[k, j, i]
243
+ x_021 = a_021[i, k, j]
244
+ if x != x_102 or x != x_210 or x != x_021; status += 1; end
245
+ end
246
+ end
247
+ end
248
+ assert status.zero?, "#{t.class}#swap_indices swap indices"
249
+
250
+ ### Test text IO
251
+ file = 'tensor_test.txt'
252
+
253
+ t = GSL::Tensor.alloc(RANK, DIMENSION)
254
+ counter = 0
255
+ for i in 0...DIMENSION do
256
+ for j in 0...DIMENSION do
257
+ for k in 0...DIMENSION do
258
+ counter += 1
259
+ t[i, j, k] = counter
260
+ end
261
+ end
262
+ end
263
+
264
+ t.fprintf(file, '%g')
265
+ tt = GSL::Tensor.alloc(RANK, DIMENSION)
266
+ status = 0
267
+ tt.fscanf(file)
268
+ counter = 0
269
+ data = tt.data
270
+ for i in 0...DIMENSION do
271
+ for j in 0...DIMENSION do
272
+ for k in 0...DIMENSION do
273
+ counter += 1
274
+ if data[DIMENSION * DIMENSION * i + DIMENSION * j + k] != counter
275
+ status += 1
276
+ end
277
+ end
278
+ end
279
+ end
280
+ assert status.zero?, "#{t.class}#fprintf and fscanf"
281
+ File.delete(file)
282
+
283
+ ### Test binary IO
284
+ file = 'tensor_test.dat'
285
+ t.fwrite(file)
286
+ tt = GSL::Tensor.alloc(RANK, DIMENSION)
287
+ status = 0
288
+ tt.fread(file)
289
+ counter = 0
290
+ data = tt.data
291
+ for i in 0...DIMENSION do
292
+ for j in 0...DIMENSION do
293
+ for k in 0...DIMENSION do
294
+ counter += 1
295
+ if data[DIMENSION * DIMENSION * i + DIMENSION * j + k] != counter
296
+ status += 1
297
+ end
298
+ end
299
+ end
300
+ end
301
+ assert status.zero?, "#{t.class}#fwrite and fread"
302
+ File.delete(file)
303
+
304
+ ### Trap
305
+ i = j = k = 0
306
+ t = GSL::Tensor.calloc(RANK, DIMENSION)
307
+ assert_nothing_raised("#{t.class}#set traps 1st index above upper bound") {
308
+ t[DIMENSION + 1, 0, 0] = 1.2
309
+ }
310
+
311
+ assert_nothing_raised("#{t.class}#set traps 2nd index above upper bound") {
312
+ t[0, DIMENSION + 1, 0] = 1.2
313
+ }
314
+
315
+ assert_nothing_raised("#{t.class}#set traps 3rd index above upper bound") {
316
+ t[0, 0, DIMENSION + 1] = 1.2
317
+ }
318
+
319
+ assert_nothing_raised("#{t.class}#set traps 2nd index at upper bound") {
320
+ t[0, DIMENSION, 0] = 1.2
321
+ }
322
+
323
+ assert_nothing_raised("#{t.class}#set traps 2nd index below lower bound") {
324
+ t[0, i - 1, 0] = 1.2
325
+ }
326
+
327
+ assert_nothing_raised("#{t.class}#get traps 1st index above upper bound") {
328
+ t[DIMENSION + 1, 0, 0]
329
+ }
330
+
331
+ assert_nothing_raised("#{t.class}#get traps 2nd index above upper bound") {
332
+ t[0, DIMENSION + 1, 0]
333
+ }
334
+
335
+ assert_nothing_raised("#{t.class}#get traps 3rd index above upper bound") {
336
+ t[0, 0, DIMENSION + 1]
337
+ }
338
+
339
+ assert_nothing_raised("#{t.class}#get traps 2nd index at upper bound") {
340
+ t[0, DIMENSION, 0]
341
+ }
342
+
343
+ assert_nothing_raised("#{t.class}#get traps 2nd index below lower bound") {
344
+ t[0, i - 1, 0]
345
+ }
346
+
347
+ #####
348
+ # Vector and Tensor, subtensors
349
+ #v = GSL::Vector.new(0...125)
350
+ v = GSL::Vector.indgen(125)
351
+ t = v.to_tensor(3, 5)
352
+ assert t.rank == RANK, "#{v.class}.to_tensor(#{RANK}, #{DIMENSION}) returns valid rank"
353
+ assert t.dimension == DIMENSION, "#{v.class}.to_tensor(#{RANK}, #{DIMENSION}) returns valid dimension"
354
+
355
+ m0_exp = GSL::Matrix[0...25, 5, 5]
356
+ m1_exp = GSL::Matrix[25...50, 5, 5]
357
+ m2_exp = GSL::Matrix[50...75, 5, 5]
358
+ m3_exp = GSL::Matrix[75...100, 5, 5]
359
+ m4_exp = GSL::Matrix[100...125, 5, 5]
360
+
361
+ # Create tensors of rank 2
362
+ t0 = t.subtensor(0)
363
+ t1 = t[1]
364
+ t2 = t.subtensor(2)
365
+ t3 = t[3]
366
+ t4 = t.subtensor(4)
367
+
368
+ # 2-tensors can be compared directly with matrices
369
+ assert t0 == m0_exp, "#{t.class}#subtensor(0) returns valid tensor"
370
+ assert t1 == m1_exp, "#{t.class}#subtensor(1) returns valid tensor"
371
+ assert t2 == m2_exp, "#{t.class}#subtensor(2) returns valid tensor"
372
+ assert t3 == m3_exp, "#{t.class}#subtensor(3) returns valid tensor"
373
+ assert t4 == m4_exp, "#{t.class}#subtensor(4) returns valid tensor"
374
+
375
+ v0_exp = GSL::Vector[100...105]
376
+ v1_exp = GSL::Vector[105...110]
377
+ v2_exp = GSL::Vector[110...115]
378
+ v3_exp = GSL::Vector[115...120]
379
+ v4_exp = GSL::Vector[120...125]
380
+
381
+ # Create tensors of rank1
382
+ v0 = t[4, 0]
383
+ v1 = t[4][1]
384
+ v2 = t.subtensor(4, 2)
385
+ v3 = t4[3]
386
+ v4 = t4.subtensor(4)
387
+
388
+ # 1-tensors can be compared directly with vectors
389
+ assert v0 == v0_exp, "#{t.class}#subtensor(4,0) returns valid tensor"
390
+ assert v1 == v1_exp, "#{t.class}#subtensor(4,1) returns valid tensor"
391
+ assert v2 == v2_exp, "#{t.class}#subtensor(4,2) returns valid tensor"
392
+ assert v3 == v3_exp, "#{t.class}#subtensor(4,3) returns valid tensor"
393
+ assert v4 == v4_exp, "#{t.class}#subtensor(4,4) returns valid tensor"
394
+ end
395
+
396
+ end