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.
- checksums.yaml +4 -4
- data/AUTHORS +2 -2
- data/ChangeLog +8 -0
- data/Rakefile +39 -96
- data/VERSION +1 -1
- data/ext/array.c +2 -2
- data/ext/block_source.c +1 -1
- data/ext/dirac.c +1 -1
- data/ext/eigen.c +13 -13
- data/ext/extconf.rb +17 -11
- data/ext/function.c +5 -5
- data/ext/gsl_narray.c +6 -6
- data/ext/histogram.c +7 -6
- data/ext/histogram2d.c +4 -4
- data/ext/interp.c +1 -1
- data/ext/linalg.c +13 -11
- data/ext/linalg_complex.c +8 -6
- data/ext/math.c +1 -1
- data/ext/matrix_complex.c +6 -6
- data/ext/matrix_source.c +10 -10
- data/ext/monte.c +2 -2
- data/ext/multimin.c +4 -4
- data/ext/multiroots.c +8 -8
- data/ext/nmf.c +6 -6
- data/ext/ntuple.c +4 -4
- data/ext/odeiv.c +2 -2
- data/ext/permutation.c +1 -1
- data/ext/poly2.c +6 -6
- data/ext/poly_source.c +9 -6
- data/ext/sf.c +31 -45
- data/ext/signal.c +2 -2
- data/ext/vector_complex.c +11 -10
- data/ext/vector_double.c +7 -4
- data/ext/vector_source.c +29 -26
- data/ext/wavelet.c +1 -1
- data/include/rb_gsl_common.h +12 -0
- data/include/rb_gsl_config.h +10 -1
- data/rdoc/blas.rdoc +4 -4
- data/rdoc/bspline.rdoc +8 -8
- data/rdoc/cheb.rdoc +9 -9
- data/rdoc/cholesky_complex.rdoc +1 -1
- data/rdoc/combi.rdoc +10 -10
- data/rdoc/complex.rdoc +12 -12
- data/rdoc/const.rdoc +21 -21
- data/rdoc/dht.rdoc +7 -7
- data/rdoc/diff.rdoc +7 -7
- data/rdoc/ehandling.rdoc +4 -4
- data/rdoc/eigen.rdoc +12 -12
- data/rdoc/fft.rdoc +27 -27
- data/rdoc/fit.rdoc +19 -19
- data/rdoc/function.rdoc +1 -1
- data/rdoc/graph.rdoc +3 -3
- data/rdoc/hist.rdoc +17 -17
- data/rdoc/hist2d.rdoc +5 -5
- data/rdoc/hist3d.rdoc +4 -4
- data/rdoc/index.rdoc +4 -4
- data/rdoc/integration.rdoc +17 -17
- data/rdoc/interp.rdoc +12 -12
- data/rdoc/intro.rdoc +4 -4
- data/rdoc/linalg.rdoc +21 -21
- data/rdoc/linalg_complex.rdoc +1 -1
- data/rdoc/math.rdoc +14 -14
- data/rdoc/matrix.rdoc +21 -21
- data/rdoc/min.rdoc +10 -10
- data/rdoc/monte.rdoc +4 -4
- data/rdoc/multimin.rdoc +13 -13
- data/rdoc/multiroot.rdoc +13 -13
- data/rdoc/narray.rdoc +10 -10
- data/rdoc/ndlinear.rdoc +5 -5
- data/rdoc/nonlinearfit.rdoc +18 -18
- data/rdoc/ntuple.rdoc +6 -6
- data/rdoc/odeiv.rdoc +13 -13
- data/rdoc/perm.rdoc +12 -12
- data/rdoc/poly.rdoc +18 -18
- data/rdoc/qrng.rdoc +10 -10
- data/rdoc/randist.rdoc +11 -11
- data/rdoc/ref.rdoc +50 -50
- data/rdoc/rng.rdoc +10 -10
- data/rdoc/rngextra.rdoc +5 -5
- data/rdoc/roots.rdoc +13 -13
- data/rdoc/sf.rdoc +36 -36
- data/rdoc/siman.rdoc +4 -4
- data/rdoc/sort.rdoc +7 -7
- data/rdoc/start.rdoc +1 -1
- data/rdoc/stats.rdoc +14 -14
- data/rdoc/sum.rdoc +5 -5
- data/rdoc/tensor.rdoc +4 -4
- data/rdoc/tut.rdoc +1 -1
- data/rdoc/use.rdoc +5 -5
- data/rdoc/vector.rdoc +29 -29
- data/rdoc/vector_complex.rdoc +6 -6
- data/rdoc/wavelet.rdoc +9 -9
- data/test/gsl/blas_test.rb +79 -0
- data/test/gsl/bspline_test.rb +63 -0
- data/test/gsl/cdf_test.rb +1512 -0
- data/test/gsl/cheb_test.rb +80 -0
- data/test/gsl/combination_test.rb +100 -0
- data/test/gsl/complex_test.rb +20 -0
- data/test/gsl/const_test.rb +29 -0
- data/test/gsl/deriv_test.rb +62 -0
- data/test/gsl/dht_test.rb +79 -0
- data/test/gsl/diff_test.rb +53 -0
- data/test/gsl/eigen_test.rb +563 -0
- data/test/gsl/err_test.rb +23 -0
- data/test/gsl/fit_test.rb +101 -0
- data/test/gsl/histo_test.rb +14 -0
- data/test/gsl/integration_test.rb +274 -0
- data/test/gsl/interp_test.rb +27 -0
- data/test/gsl/linalg_test.rb +463 -0
- data/test/gsl/matrix_nmf_test.rb +37 -0
- data/test/gsl/matrix_test.rb +77 -0
- data/test/gsl/min_test.rb +89 -0
- data/test/gsl/monte_test.rb +77 -0
- data/test/gsl/multifit_test.rb +753 -0
- data/test/gsl/multimin_test.rb +157 -0
- data/test/gsl/multiroot_test.rb +135 -0
- data/test/gsl/multiset_test.rb +52 -0
- data/test/gsl/odeiv_test.rb +275 -0
- data/test/gsl/poly_test.rb +338 -0
- data/test/gsl/qrng_test.rb +94 -0
- data/test/gsl/quartic_test.rb +28 -0
- data/test/gsl/randist_test.rb +122 -0
- data/test/gsl/rng_test.rb +303 -0
- data/test/gsl/roots_test.rb +78 -0
- data/test/gsl/sf_test.rb +2079 -0
- data/test/gsl/stats_test.rb +122 -0
- data/test/gsl/sum_test.rb +69 -0
- data/test/gsl/tensor_test.rb +396 -0
- data/test/gsl/vector_test.rb +223 -0
- data/test/gsl/wavelet_test.rb +130 -0
- data/test/gsl_test.rb +321 -0
- data/test/test_helper.rb +42 -0
- metadata +107 -150
- data/setup.rb +0 -1585
- data/tests/blas/amax.rb +0 -14
- data/tests/blas/asum.rb +0 -16
- data/tests/blas/axpy.rb +0 -25
- data/tests/blas/copy.rb +0 -23
- data/tests/blas/dot.rb +0 -23
- data/tests/bspline.rb +0 -53
- data/tests/cdf.rb +0 -1388
- data/tests/cheb.rb +0 -112
- data/tests/combination.rb +0 -123
- data/tests/complex.rb +0 -17
- data/tests/const.rb +0 -24
- data/tests/deriv.rb +0 -85
- data/tests/dht/dht1.rb +0 -17
- data/tests/dht/dht2.rb +0 -23
- data/tests/dht/dht3.rb +0 -23
- data/tests/dht/dht4.rb +0 -23
- data/tests/diff.rb +0 -78
- data/tests/eigen/eigen.rb +0 -220
- data/tests/eigen/gen.rb +0 -105
- data/tests/eigen/genherm.rb +0 -66
- data/tests/eigen/gensymm.rb +0 -68
- data/tests/eigen/nonsymm.rb +0 -53
- data/tests/eigen/nonsymmv.rb +0 -53
- data/tests/eigen/symm-herm.rb +0 -74
- data/tests/err.rb +0 -58
- data/tests/fit.rb +0 -124
- data/tests/gsl_test.rb +0 -118
- data/tests/gsl_test2.rb +0 -110
- data/tests/histo.rb +0 -12
- data/tests/integration/integration1.rb +0 -72
- data/tests/integration/integration2.rb +0 -71
- data/tests/integration/integration3.rb +0 -71
- data/tests/integration/integration4.rb +0 -71
- data/tests/interp.rb +0 -45
- data/tests/linalg/HH.rb +0 -64
- data/tests/linalg/LU.rb +0 -47
- data/tests/linalg/QR.rb +0 -77
- data/tests/linalg/SV.rb +0 -24
- data/tests/linalg/TDN.rb +0 -116
- data/tests/linalg/TDS.rb +0 -122
- data/tests/linalg/bidiag.rb +0 -73
- data/tests/linalg/cholesky.rb +0 -20
- data/tests/linalg/linalg.rb +0 -158
- data/tests/matrix/matrix_complex_test.rb +0 -36
- data/tests/matrix/matrix_nmf_test.rb +0 -39
- data/tests/matrix/matrix_test.rb +0 -48
- data/tests/min.rb +0 -99
- data/tests/monte/miser.rb +0 -31
- data/tests/monte/vegas.rb +0 -45
- data/tests/multifit/test_2dgauss.rb +0 -112
- data/tests/multifit/test_brown.rb +0 -90
- data/tests/multifit/test_enso.rb +0 -246
- data/tests/multifit/test_filip.rb +0 -155
- data/tests/multifit/test_gauss.rb +0 -97
- data/tests/multifit/test_longley.rb +0 -110
- data/tests/multifit/test_multifit.rb +0 -52
- data/tests/multimin.rb +0 -139
- data/tests/multiroot.rb +0 -131
- data/tests/multiset.rb +0 -52
- data/tests/narray/blas_dnrm2.rb +0 -20
- data/tests/odeiv.rb +0 -353
- data/tests/poly/poly.rb +0 -290
- data/tests/poly/special.rb +0 -65
- data/tests/qrng.rb +0 -131
- data/tests/quartic.rb +0 -29
- data/tests/randist.rb +0 -134
- data/tests/rng.rb +0 -305
- data/tests/roots.rb +0 -76
- data/tests/run-test.sh +0 -17
- data/tests/sf/gsl_test_sf.rb +0 -249
- data/tests/sf/test_airy.rb +0 -83
- data/tests/sf/test_bessel.rb +0 -306
- data/tests/sf/test_coulomb.rb +0 -17
- data/tests/sf/test_dilog.rb +0 -25
- data/tests/sf/test_gamma.rb +0 -209
- data/tests/sf/test_hyperg.rb +0 -356
- data/tests/sf/test_legendre.rb +0 -227
- data/tests/sf/test_mathieu.rb +0 -59
- data/tests/sf/test_mode.rb +0 -19
- data/tests/sf/test_sf.rb +0 -839
- data/tests/stats.rb +0 -174
- data/tests/stats_mt.rb +0 -16
- data/tests/sum.rb +0 -98
- data/tests/sys.rb +0 -323
- data/tests/tensor.rb +0 -419
- data/tests/vector/vector_complex_test.rb +0 -101
- data/tests/vector/vector_test.rb +0 -141
- 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
|