gsl 1.12.108

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. data/README.rdoc +29 -0
  2. data/Rakefile +54 -0
  3. data/VERSION +2 -0
  4. data/ext/MANIFEST +119 -0
  5. data/ext/alf.c +206 -0
  6. data/ext/array.c +666 -0
  7. data/ext/array_complex.c +247 -0
  8. data/ext/blas.c +29 -0
  9. data/ext/blas1.c +731 -0
  10. data/ext/blas2.c +1093 -0
  11. data/ext/blas3.c +881 -0
  12. data/ext/block.c +44 -0
  13. data/ext/block_source.c +886 -0
  14. data/ext/bspline.c +130 -0
  15. data/ext/bundle.c +3 -0
  16. data/ext/cdf.c +754 -0
  17. data/ext/cheb.c +542 -0
  18. data/ext/combination.c +283 -0
  19. data/ext/common.c +325 -0
  20. data/ext/complex.c +1004 -0
  21. data/ext/const.c +673 -0
  22. data/ext/const_additional.c +120 -0
  23. data/ext/cqp.c +283 -0
  24. data/ext/deriv.c +195 -0
  25. data/ext/dht.c +361 -0
  26. data/ext/diff.c +166 -0
  27. data/ext/dirac.c +395 -0
  28. data/ext/eigen.c +2373 -0
  29. data/ext/error.c +194 -0
  30. data/ext/extconf.rb +281 -0
  31. data/ext/fcmp.c +66 -0
  32. data/ext/fft.c +1092 -0
  33. data/ext/fit.c +205 -0
  34. data/ext/fresnel.c +312 -0
  35. data/ext/function.c +524 -0
  36. data/ext/geometry.c +139 -0
  37. data/ext/graph.c +1638 -0
  38. data/ext/gsl.c +271 -0
  39. data/ext/gsl_narray.c +653 -0
  40. data/ext/histogram.c +1995 -0
  41. data/ext/histogram2d.c +1068 -0
  42. data/ext/histogram3d.c +884 -0
  43. data/ext/histogram3d_source.c +750 -0
  44. data/ext/histogram_find.c +101 -0
  45. data/ext/histogram_oper.c +159 -0
  46. data/ext/ieee.c +98 -0
  47. data/ext/integration.c +1138 -0
  48. data/ext/interp.c +512 -0
  49. data/ext/jacobi.c +739 -0
  50. data/ext/linalg.c +4047 -0
  51. data/ext/linalg_complex.c +741 -0
  52. data/ext/math.c +725 -0
  53. data/ext/matrix.c +39 -0
  54. data/ext/matrix_complex.c +1732 -0
  55. data/ext/matrix_double.c +560 -0
  56. data/ext/matrix_int.c +256 -0
  57. data/ext/matrix_source.c +2733 -0
  58. data/ext/min.c +250 -0
  59. data/ext/monte.c +992 -0
  60. data/ext/multifit.c +1879 -0
  61. data/ext/multimin.c +808 -0
  62. data/ext/multimin_fsdf.c +156 -0
  63. data/ext/multiroots.c +955 -0
  64. data/ext/ndlinear.c +321 -0
  65. data/ext/nmf.c +167 -0
  66. data/ext/nmf_wrap.c +72 -0
  67. data/ext/ntuple.c +469 -0
  68. data/ext/odeiv.c +959 -0
  69. data/ext/ool.c +879 -0
  70. data/ext/oper_complex_source.c +253 -0
  71. data/ext/permutation.c +596 -0
  72. data/ext/poly.c +42 -0
  73. data/ext/poly2.c +265 -0
  74. data/ext/poly_source.c +1885 -0
  75. data/ext/qrng.c +171 -0
  76. data/ext/randist.c +1873 -0
  77. data/ext/rational.c +480 -0
  78. data/ext/rng.c +612 -0
  79. data/ext/root.c +408 -0
  80. data/ext/sf.c +1494 -0
  81. data/ext/sf_airy.c +200 -0
  82. data/ext/sf_bessel.c +867 -0
  83. data/ext/sf_clausen.c +28 -0
  84. data/ext/sf_coulomb.c +206 -0
  85. data/ext/sf_coupling.c +118 -0
  86. data/ext/sf_dawson.c +29 -0
  87. data/ext/sf_debye.c +157 -0
  88. data/ext/sf_dilog.c +42 -0
  89. data/ext/sf_elementary.c +44 -0
  90. data/ext/sf_ellint.c +206 -0
  91. data/ext/sf_elljac.c +29 -0
  92. data/ext/sf_erfc.c +93 -0
  93. data/ext/sf_exp.c +164 -0
  94. data/ext/sf_expint.c +211 -0
  95. data/ext/sf_fermi_dirac.c +148 -0
  96. data/ext/sf_gamma.c +344 -0
  97. data/ext/sf_gegenbauer.c +96 -0
  98. data/ext/sf_hyperg.c +197 -0
  99. data/ext/sf_laguerre.c +112 -0
  100. data/ext/sf_lambert.c +47 -0
  101. data/ext/sf_legendre.c +367 -0
  102. data/ext/sf_log.c +104 -0
  103. data/ext/sf_mathieu.c +238 -0
  104. data/ext/sf_power.c +46 -0
  105. data/ext/sf_psi.c +98 -0
  106. data/ext/sf_synchrotron.c +48 -0
  107. data/ext/sf_transport.c +76 -0
  108. data/ext/sf_trigonometric.c +207 -0
  109. data/ext/sf_zeta.c +119 -0
  110. data/ext/signal.c +310 -0
  111. data/ext/siman.c +718 -0
  112. data/ext/sort.c +208 -0
  113. data/ext/spline.c +395 -0
  114. data/ext/stats.c +799 -0
  115. data/ext/sum.c +168 -0
  116. data/ext/tamu_anova.c +56 -0
  117. data/ext/tensor.c +38 -0
  118. data/ext/tensor_source.c +1123 -0
  119. data/ext/vector.c +38 -0
  120. data/ext/vector_complex.c +2236 -0
  121. data/ext/vector_double.c +1433 -0
  122. data/ext/vector_int.c +204 -0
  123. data/ext/vector_source.c +3329 -0
  124. data/ext/wavelet.c +937 -0
  125. data/include/rb_gsl.h +151 -0
  126. data/include/rb_gsl_array.h +238 -0
  127. data/include/rb_gsl_cheb.h +21 -0
  128. data/include/rb_gsl_common.h +343 -0
  129. data/include/rb_gsl_complex.h +25 -0
  130. data/include/rb_gsl_const.h +29 -0
  131. data/include/rb_gsl_dirac.h +13 -0
  132. data/include/rb_gsl_eigen.h +17 -0
  133. data/include/rb_gsl_fft.h +62 -0
  134. data/include/rb_gsl_fit.h +25 -0
  135. data/include/rb_gsl_function.h +27 -0
  136. data/include/rb_gsl_graph.h +70 -0
  137. data/include/rb_gsl_histogram.h +63 -0
  138. data/include/rb_gsl_histogram3d.h +97 -0
  139. data/include/rb_gsl_integration.h +17 -0
  140. data/include/rb_gsl_interp.h +46 -0
  141. data/include/rb_gsl_linalg.h +25 -0
  142. data/include/rb_gsl_math.h +26 -0
  143. data/include/rb_gsl_odeiv.h +21 -0
  144. data/include/rb_gsl_poly.h +71 -0
  145. data/include/rb_gsl_rational.h +37 -0
  146. data/include/rb_gsl_rng.h +21 -0
  147. data/include/rb_gsl_root.h +22 -0
  148. data/include/rb_gsl_sf.h +119 -0
  149. data/include/rb_gsl_statistics.h +17 -0
  150. data/include/rb_gsl_tensor.h +45 -0
  151. data/include/rb_gsl_with_narray.h +22 -0
  152. data/include/templates_off.h +87 -0
  153. data/include/templates_on.h +241 -0
  154. data/lib/gsl/gnuplot.rb +41 -0
  155. data/lib/gsl/oper.rb +68 -0
  156. data/lib/ool.rb +22 -0
  157. data/lib/ool/conmin.rb +30 -0
  158. metadata +224 -0
@@ -0,0 +1,29 @@
1
+ == Description
2
+ Ruby/GSL, a ruby interface to GSL (GNU Scientific library)
3
+
4
+ == Installation
5
+ (0) Make sure the command "gsl-config" is in search path.
6
+ (1) % ruby setup.rb config
7
+ (2) % ruby setup.rb setup
8
+ (3) % ruby setup.rb install (as root)
9
+
10
+ See also html/index.html.
11
+
12
+ == Reference
13
+
14
+ See ((<URL:http://rb-gsl.rubyforge.org/ref.html>)).
15
+
16
+ == Licence
17
+ Ruby/GSL is free software: you can redistribute it and/or modify it
18
+ under the terms of the GNU General Public License.
19
+ This library is distributed in the hope that it will be useful, but
20
+ WITHOUT ANY WARRANTY.
21
+
22
+ == Bug Report
23
+ Any bug reports are welcome.
24
+ If you encounter bugs in Ruby/GSL, please e-mail to me, or
25
+ submit reports from http://rubyforge.org/projects/rb-gsl/.
26
+
27
+ == Author
28
+ Yoshiki Tsunesada
29
+ y-tsunesada at mm dot em-net dot ne dot jp
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+
4
+ spec = Gem::Specification.new do |s|
5
+ # Basics
6
+ s.name = 'gsl'
7
+ s.version = File.readlines('VERSION')[0].chomp
8
+ s.summary = 'Ruby interface to GSL'
9
+ s.description = 'RubyGSL is a Ruby interface to the GNU Scientific Library, for numerical computing with Ruby'
10
+ #s.platform = Gem::Platform::Ruby
11
+ s.required_ruby_version = '>= 1.8.1'
12
+ s.requirements << 'GSL (http://www.gnu.org/software/gsl/)'
13
+ # plotlib?
14
+ s.add_dependency('narray', '>= 0.5.9')
15
+
16
+ # About
17
+ s.authors = ['Yoshiki Tsunesada', 'David MacMahon']
18
+ s.email = 'y-tsunesada@mm.em-net.ne.jp'
19
+ s.homepage = 'http://rb-gsl.rubyforge.org/'
20
+ s.rubyforge_project = 'rb-gsl'
21
+
22
+ # Files, Libraries, and Extensions
23
+ s.files = FileList[
24
+ 'README.rdoc',
25
+ 'VERSION',
26
+ 'Rakefile',
27
+ 'ext/*',
28
+ 'lib/**/*',
29
+ 'include/*'
30
+ ].to_a
31
+ s.require_paths = ['lib', 'lib/gsl', 'lib/ool', 'ext']
32
+ #s.autorequire = nil
33
+ #s.bindir = 'bin'
34
+ #s.executables = []
35
+ #s.default_executable = nil
36
+
37
+ # C compilation
38
+ s.extensions = %w[ ext/extconf.rb ]
39
+
40
+ # Documentation TODO
41
+ #s.rdoc_options = []
42
+ #s.has_rdoc = false
43
+ #s.extra_rdoc_files = []
44
+
45
+ # Testing TODO
46
+ #s.test_files = []
47
+ end
48
+
49
+ Rake::GemPackageTask.new(spec) do |pkg|
50
+ pkg.need_zip = true
51
+ pkg.need_tar = true
52
+ end
53
+
54
+ task :default => :gem
data/VERSION ADDED
@@ -0,0 +1,2 @@
1
+ 1.12.90
2
+
@@ -0,0 +1,119 @@
1
+ alf.c
2
+ array.c
3
+ array_complex.c
4
+ blas.c
5
+ blas1.c
6
+ blas2.c
7
+ blas3.c
8
+ block.c
9
+ block_source.c
10
+ bspline.c
11
+ bundle.c
12
+ cdf.c
13
+ cheb.c
14
+ combination.c
15
+ common.c
16
+ complex.c
17
+ const.c
18
+ const_additional.c
19
+ cqp.c
20
+ deriv.c
21
+ dht.c
22
+ diff.c
23
+ dirac.c
24
+ eigen.c
25
+ error.c
26
+ fcmp.c
27
+ fft.c
28
+ fit.c
29
+ fresnel.c
30
+ function.c
31
+ geometry.c
32
+ graph.c
33
+ gsl.c
34
+ gsl_narray.c
35
+ histogram.c
36
+ histogram2d.c
37
+ histogram3d.c
38
+ histogram3d_source.c
39
+ histogram_find.c
40
+ histogram_oper.c
41
+ ieee.c
42
+ integration.c
43
+ interp.c
44
+ jacobi.c
45
+ linalg.c
46
+ linalg_complex.c
47
+ math.c
48
+ matrix.c
49
+ matrix_complex.c
50
+ matrix_double.c
51
+ matrix_int.c
52
+ matrix_source.c
53
+ min.c
54
+ monte.c
55
+ multifit.c
56
+ multimin.c
57
+ multimin_fsdf.c
58
+ multiroots.c
59
+ ndlinear.c
60
+ nmf.c
61
+ nmf_wrap.c
62
+ ntuple.c
63
+ odeiv.c
64
+ ool.c
65
+ oper_complex_source.c
66
+ permutation.c
67
+ poly.c
68
+ poly2.c
69
+ poly_source.c
70
+ qrng.c
71
+ randist.c
72
+ rational.c
73
+ rng.c
74
+ root.c
75
+ sf.c
76
+ sf_airy.c
77
+ sf_bessel.c
78
+ sf_clausen.c
79
+ sf_coulomb.c
80
+ sf_coupling.c
81
+ sf_dawson.c
82
+ sf_debye.c
83
+ sf_dilog.c
84
+ sf_elementary.c
85
+ sf_ellint.c
86
+ sf_elljac.c
87
+ sf_erfc.c
88
+ sf_exp.c
89
+ sf_expint.c
90
+ sf_fermi_dirac.c
91
+ sf_gamma.c
92
+ sf_gegenbauer.c
93
+ sf_hyperg.c
94
+ sf_laguerre.c
95
+ sf_lambert.c
96
+ sf_legendre.c
97
+ sf_log.c
98
+ sf_mathieu.c
99
+ sf_power.c
100
+ sf_psi.c
101
+ sf_synchrotron.c
102
+ sf_transport.c
103
+ sf_trigonometric.c
104
+ sf_zeta.c
105
+ signal.c
106
+ siman.c
107
+ sort.c
108
+ spline.c
109
+ stats.c
110
+ sum.c
111
+ tamu_anova.c
112
+ tensor.c
113
+ tensor_source.c
114
+ vector.c
115
+ vector_complex.c
116
+ vector_double.c
117
+ vector_int.c
118
+ vector_source.c
119
+ wavelet.c
@@ -0,0 +1,206 @@
1
+ /*
2
+ * Ruby interface for ALF, a library to calculate associated Legendre functions by Patrick Alken
3
+ * Based on ALF-0.1
4
+ */
5
+ #ifdef HAVE_ALF_ALF_H
6
+ #include "rb_gsl.h"
7
+
8
+ static VALUE cWspace;
9
+ static VALUE rb_alf_alloc(VALUE klass, VALUE lmax)
10
+ {
11
+ alf_workspace *w = NULL;
12
+ w = alf_alloc(FIX2INT(lmax));
13
+ return Data_Wrap_Struct(cWspace, 0, alf_free, w);
14
+ }
15
+
16
+ static VALUE rb_alf_params(VALUE obj, VALUE csphase, VALUE cnorm, VALUE norm)
17
+ {
18
+ alf_workspace *w;
19
+ int ret;
20
+ Data_Get_Struct(obj, alf_workspace, w);
21
+ ret = alf_params(FIX2INT(csphase), FIX2INT(cnorm), (alf_norm_t) FIX2INT(norm), w);
22
+ return INT2FIX(ret);
23
+ }
24
+
25
+ static void define_constants(VALUE klass)
26
+ {
27
+ rb_define_const(klass, "NORM_NONE", INT2FIX((int) ALF_NORM_NONE));
28
+ rb_define_const(klass, "NORM_SPHARM", INT2FIX((int) ALF_NORM_SPHARM));
29
+ rb_define_const(klass, "NORM_ORTHO", INT2FIX((int) ALF_NORM_ORTHO));
30
+ rb_define_const(klass, "NORM_SCHMIDT", INT2FIX((int) ALF_NORM_SCHMIDT));
31
+ }
32
+
33
+ /**
34
+ * arguments:
35
+ * - Plm_array(x) : lmax = w->lmax, A new vector is created
36
+ * - Plm_array(x, result) : lmax = w->lmax, the given vector is used
37
+ * - Plm_array(lmax, x) : A new vector is created
38
+ * - Plm_array(lmax, x, result) : Same as C Plm_array()
39
+ * - Plm_array(x, result, deriv) : lmax = w->lmax, calcurate Plm_deriv_array(lmax, x, result, deriv)
40
+ * - Plm_array(lmax, x, result, deriv) : Same as C alf_Plm_deriv_array
41
+ */
42
+ static VALUE rb_alf_Plm_array(int argc, VALUE *argv, VALUE obj)
43
+ {
44
+ alf_workspace *w = NULL;
45
+ gsl_vector *res = NULL, *deriv = NULL;
46
+ int lmax;
47
+ double x;
48
+ VALUE ret;
49
+ Data_Get_Struct(obj, alf_workspace, w);
50
+ switch (argc) {
51
+ case 1:
52
+ x = NUM2DBL(argv[0]);
53
+ lmax = w->lmax;
54
+ res = gsl_vector_alloc(alf_array_size(lmax));
55
+ ret = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, res);
56
+ break;
57
+ case 2: // Plm_array(x, result) or Plm_array(lmax, x)
58
+ if (VECTOR_P(argv[1])) {
59
+ x = NUM2DBL(argv[0]);
60
+ Data_Get_Struct(argv[1], gsl_vector, res);
61
+ lmax = w->lmax;
62
+ if (res->size < alf_array_size(lmax)) {
63
+ rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
64
+ (int) alf_array_size(lmax));
65
+ }
66
+ ret = argv[1];
67
+ } else {
68
+ lmax = FIX2INT(argv[0]);
69
+ x = NUM2DBL(argv[1]);
70
+ res = gsl_vector_alloc(alf_array_size(lmax));
71
+ ret = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, res);
72
+ }
73
+ break;
74
+ case 3: // Plm_array(lmax, x, result) or Plm_array(x, result, deriv)
75
+ if (VECTOR_P(argv[1])) {
76
+ CHECK_VECTOR(argv[2]);
77
+ lmax = w->lmax;
78
+ x = NUM2DBL(argv[0]);
79
+ Data_Get_Struct(argv[1], gsl_vector, res);
80
+ Data_Get_Struct(argv[2], gsl_vector, deriv);
81
+ ret = argv[1];
82
+ } else {
83
+ lmax = FIX2INT(argv[0]);
84
+ x = NUM2DBL(argv[1]);
85
+ CHECK_VECTOR(argv[2]);
86
+ Data_Get_Struct(argv[2], gsl_vector, res);
87
+ if (res->size < alf_array_size(lmax)) {
88
+ rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
89
+ (int) alf_array_size(lmax));
90
+ }
91
+ ret = argv[2];
92
+ }
93
+ break;
94
+ case 4:
95
+ CHECK_VECTOR(argv[2]); CHECK_VECTOR(argv[3])
96
+ lmax = FIX2INT(argv[0]);
97
+ x = NUM2DBL(argv[1]);
98
+ Data_Get_Struct(argv[2], gsl_vector, res);
99
+ Data_Get_Struct(argv[3], gsl_vector, deriv);
100
+ ret = argv[2];
101
+ break;
102
+ default:
103
+ rb_raise(rb_eArgError, "Wrong number of argumentso (%d for 1-3)\n", argc);
104
+ }
105
+ if (argc == 4 && deriv != NULL) alf_Plm_deriv_array(lmax, x, res->data, deriv->data, w);
106
+ else alf_Plm_array(lmax, x, res->data, w);
107
+ return ret;
108
+ }
109
+
110
+ /**
111
+ * arguments:
112
+ * - Plm_deriv_array(x) : lmax = w->lmax, two new vectors are created and returned as an array
113
+ * - Plm_array(lmax, x) : Two new vectors are created and returned as an array
114
+ * - Plm_array(lmax, x, result, deriv) : Same as C alf_Plm_deriv_array()
115
+ */
116
+ static VALUE rb_alf_Plm_deriv_array(int argc, VALUE *argv, VALUE obj)
117
+ {
118
+ alf_workspace *w = NULL;
119
+ gsl_vector *res = NULL, *deriv = NULL;
120
+ int lmax;
121
+ double x;
122
+ VALUE ret1, ret2, ary;
123
+ Data_Get_Struct(obj, alf_workspace, w);
124
+ switch (argc) {
125
+ case 1:
126
+ x = NUM2DBL(argv[0]);
127
+ lmax = w->lmax;
128
+ res = gsl_vector_alloc(alf_array_size(lmax));
129
+ deriv = gsl_vector_alloc(alf_array_size(lmax));
130
+ ret1 = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, res);
131
+ ret2 = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, deriv);
132
+ break;
133
+ case 2:
134
+ lmax = FIX2INT(argv[1]);
135
+ x = NUM2DBL(argv[1]);
136
+ res = gsl_vector_alloc(alf_array_size(lmax));
137
+ deriv = gsl_vector_alloc(alf_array_size(lmax));
138
+ ret1 = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, res);
139
+ ret2 = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, deriv);
140
+ break;
141
+ case 3:
142
+ CHECK_VECTOR(argv[1]);
143
+ CHECK_VECTOR(argv[2]);
144
+ ret1 = argv[1];
145
+ ret2 = argv[2];
146
+ lmax = w->lmax;
147
+ x = NUM2DBL(argv[0]);
148
+ break;
149
+ case 4:
150
+ lmax = FIX2INT(argv[0]);
151
+ x = NUM2DBL(argv[1]);
152
+ CHECK_VECTOR(argv[2]);
153
+ CHECK_VECTOR(argv[3]);
154
+ Data_Get_Struct(argv[2], gsl_vector, res);
155
+ Data_Get_Struct(argv[3], gsl_vector, deriv);
156
+ if (res->size < alf_array_size(lmax)) {
157
+ rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
158
+ (int) alf_array_size(lmax));
159
+ }
160
+ if (deriv->size < alf_array_size(lmax)) {
161
+ rb_raise(rb_eRuntimeError, "Vector length is too small. (%d for >= %d\n", (int) res->size,
162
+ (int) alf_array_size(lmax));
163
+ }
164
+ ret1 = argv[2];
165
+ ret2 = argv[3];
166
+ break;
167
+ default:
168
+ rb_raise(rb_eArgError, "Wrong number of argumentso (%d for 1-4)\n", argc);
169
+ }
170
+ alf_Plm_deriv_array(lmax, x, res->data, deriv->data, w);
171
+ ary = rb_ary_new2(2);
172
+ rb_ary_store(ary, 0, ret1);
173
+ rb_ary_store(ary, 1, ret2);
174
+ return ary;
175
+ }
176
+
177
+ static VALUE rb_alf_array_size(VALUE module, VALUE lmax)
178
+ {
179
+ return INT2FIX(alf_array_size(FIX2INT(lmax)));
180
+
181
+ }
182
+ static VALUE rb_alf_array_index(VALUE module, VALUE l, VALUE m)
183
+ {
184
+ return INT2FIX(alf_array_index(FIX2INT(l), FIX2INT(m)));
185
+ }
186
+
187
+ void Init_alf(VALUE module)
188
+ {
189
+ VALUE mALF;
190
+ mALF = rb_define_module_under(module, "ALF");
191
+ cWspace = rb_define_class_under(mALF, "Workspace", cGSL_Object);
192
+ rb_define_singleton_method(cWspace, "alloc", rb_alf_alloc, 1);
193
+ rb_define_singleton_method(mALF, "alloc", rb_alf_alloc, 1);
194
+ rb_define_module_function(module, "alf_alloc", rb_alf_alloc, 1);
195
+
196
+ rb_define_method(cWspace, "params", rb_alf_params, 3);
197
+
198
+ rb_define_method(cWspace, "Plm_array", rb_alf_Plm_array, -1);
199
+ rb_define_method(cWspace, "Plm_deriv_array", rb_alf_Plm_deriv_array, -1);
200
+
201
+ rb_define_module_function(mALF, "array_size", rb_alf_array_size, 1);
202
+ rb_define_module_function(mALF, "array_index", rb_alf_array_index, 2);
203
+
204
+ define_constants(mALF);
205
+ }
206
+ #endif
@@ -0,0 +1,666 @@
1
+ /*
2
+ array.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2001-2006 by Yoshiki Tsunesada
5
+
6
+ Ruby/GSL is free software: you can redistribute it and/or modify it
7
+ under the terms of the GNU General Public License.
8
+ This library is distributed in the hope that it will be useful, but
9
+ WITHOUT ANY WARRANTY.
10
+ */
11
+
12
+ #include "rb_gsl_config.h"
13
+
14
+ #include "rb_gsl_common.h"
15
+ #include "rb_gsl_array.h"
16
+ #include "rb_gsl_complex.h"
17
+ #ifdef HAVE_NARRAY_H
18
+ #include "rb_gsl_with_narray.h"
19
+ #endif
20
+
21
+ /* global variables */
22
+ VALUE cgsl_block, cgsl_block_int;
23
+ VALUE cgsl_block_uchar;
24
+ VALUE cgsl_block_complex;
25
+ VALUE cgsl_vector, cgsl_vector_view;
26
+ VALUE cgsl_vector_view_ro;
27
+ VALUE cgsl_vector_col_view_ro;
28
+ VALUE cgsl_matrix_view_ro;
29
+ VALUE cgsl_vector_complex;
30
+ VALUE cgsl_vector_complex_view;
31
+ VALUE cgsl_matrix;
32
+ VALUE cgsl_matrix_view;
33
+ VALUE cgsl_matrix_complex;
34
+ VALUE cgsl_matrix_complex_view;
35
+ VALUE cgsl_vector_complex_view_ro;
36
+ VALUE cgsl_matrix_complex_view_ro;
37
+ VALUE cgsl_permutation;
38
+ VALUE cgsl_index;
39
+ VALUE cgsl_vector_col, cgsl_vector_col_view;
40
+ VALUE cgsl_vector_complex_col, cgsl_vector_complex_col_view;
41
+
42
+ VALUE cgsl_vector_int, cgsl_vector_int_col;
43
+ VALUE cgsl_vector_int_view, cgsl_vector_int_col_view;
44
+ VALUE cgsl_vector_int_view_ro, cgsl_vector_int_col_view_ro;
45
+ VALUE cgsl_matrix_int, cgsl_matrix_int_view, cgsl_matrix_int_view_ro;
46
+
47
+ double* get_vector_ptr(VALUE ary, size_t *stride, size_t *n)
48
+ {
49
+ gsl_vector *v = NULL;
50
+ gsl_vector_complex *vc = NULL;
51
+ gsl_matrix *m;
52
+ #ifdef HAVE_NARRAY_H
53
+ VALUE ary2;
54
+ #endif
55
+ if (VECTOR_P(ary)) {
56
+ Data_Get_Struct(ary, gsl_vector, v);
57
+ *stride = v->stride;
58
+ *n = v->size;
59
+ return v->data;
60
+ } else if (VECTOR_COMPLEX_P(ary)) {
61
+ Data_Get_Struct(ary, gsl_vector_complex, vc);
62
+ *stride = vc->stride;
63
+ *n = vc->size*2;
64
+ return vc->data;
65
+ } else if (MATRIX_P(ary)) {
66
+ Data_Get_Struct(ary, gsl_matrix, m);
67
+ *stride = 1;
68
+ *n = m->size1*m->size2;
69
+ return m->data;
70
+ #ifdef HAVE_NARRAY_H
71
+ } else if (NA_IsNArray(ary)) {
72
+ *n = NA_TOTAL(ary);
73
+ *stride = 1;
74
+ ary2 = na_change_type(ary, NA_DFLOAT);
75
+ return NA_PTR_TYPE(ary2,double*);
76
+ #endif
77
+ } else {
78
+ rb_raise(rb_eTypeError,
79
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
80
+ }
81
+ }
82
+
83
+ gsl_vector* get_cvector(VALUE obj)
84
+ {
85
+ gsl_vector *v = NULL;
86
+ if (rb_obj_is_kind_of(obj, cgsl_vector)) {
87
+ Data_Get_Struct(obj, gsl_vector, v);
88
+ #ifdef HAVE_NARRAY_H
89
+ } else if (NA_IsArray(obj)) {
90
+ v = make_cvector_from_rarrays(obj);
91
+ #endif
92
+ } else {
93
+ rb_raise(rb_eTypeError,
94
+ "wrong argument type %s", rb_class2name(CLASS_OF(obj)));
95
+ }
96
+ return v;
97
+ }
98
+
99
+ VALUE make_rarray_from_cvector(const gsl_vector *v)
100
+ {
101
+ size_t i;
102
+ VALUE ary;
103
+ ary = rb_ary_new2(v->size);
104
+ for (i = 0; i < v->size; i++) {
105
+ rb_ary_store(ary, i, rb_float_new(gsl_vector_get(v, i)));
106
+ }
107
+ return ary;
108
+ }
109
+
110
+ VALUE make_rarray_from_cvector_int(const gsl_vector_int *v)
111
+ {
112
+ size_t i;
113
+ VALUE ary;
114
+ ary = rb_ary_new2(v->size);
115
+ for (i = 0; i < v->size; i++) {
116
+ rb_ary_store(ary, i, INT2FIX(gsl_vector_int_get(v, i)));
117
+ }
118
+ return ary;
119
+ }
120
+
121
+ VALUE make_rarray_from_cpermutation(const gsl_permutation *v)
122
+ {
123
+ size_t i;
124
+ VALUE ary;
125
+ ary = rb_ary_new2(v->size);
126
+ for (i = 0; i < v->size; i++) {
127
+ rb_ary_store(ary, i, rb_float_new(gsl_permutation_get(v, i)));
128
+ }
129
+ return ary;
130
+ }
131
+
132
+ gsl_vector* get_vector(VALUE ary)
133
+ {
134
+ gsl_vector *v = NULL;
135
+ if (CLASS_OF(ary) == rb_cRange) ary = rb_gsl_range2ary(ary);
136
+ if (TYPE(ary) == T_ARRAY) {
137
+ return make_cvector_from_rarray(ary);
138
+ #ifdef HAVE_NARRAY_H
139
+ } else if (NA_IsNArray(ary)) {
140
+ return make_cvector_from_narray(ary);
141
+ #endif
142
+ } else if (VECTOR_P(ary)) {
143
+ Data_Get_Struct(ary, gsl_vector, v);
144
+ return v;
145
+ } else {
146
+ rb_raise(rb_eTypeError,
147
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
148
+ }
149
+ }
150
+
151
+ gsl_vector* make_cvector_from_rarrays(VALUE ary)
152
+ {
153
+ if (CLASS_OF(ary) == rb_cRange) ary = rb_gsl_range2ary(ary);
154
+ if (TYPE(ary) == T_ARRAY) {
155
+ return make_cvector_from_rarray(ary);
156
+ #ifdef HAVE_NARRAY_H
157
+ } else if (NA_IsNArray(ary)) {
158
+ return make_cvector_from_narray(ary);
159
+ #endif
160
+ } else {
161
+ rb_raise(rb_eTypeError,
162
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
163
+ }
164
+ }
165
+
166
+ void cvector_set_from_carray(gsl_vector *v, const double *a)
167
+ {
168
+ size_t i;
169
+ for (i = 0; i < v->size; i++) gsl_vector_set(v, i, a[i]);
170
+ }
171
+
172
+ void cvector_set_from_rarrays(gsl_vector *v, VALUE ary)
173
+ {
174
+ if (CLASS_OF(ary) == rb_cRange) ary = rb_gsl_range2ary(ary);
175
+ if (TYPE(ary) == T_ARRAY) {
176
+ return cvector_set_from_rarray(v, ary);
177
+ #ifdef HAVE_NARRAY_H
178
+ } else if (NA_IsNArray(ary)) {
179
+ return cvector_set_from_narray(v, ary);
180
+ #endif
181
+ } else {
182
+ rb_raise(rb_eTypeError,
183
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
184
+ }
185
+ }
186
+
187
+ void carray_set_from_cvector(double *a, const gsl_vector *v)
188
+ {
189
+ size_t i;
190
+ for (i = 0; i < v->size; i++) a[i] = gsl_vector_get(v, i);
191
+ }
192
+
193
+ void carray_set_from_rarrays(double *a, VALUE ary)
194
+ {
195
+ if (CLASS_OF(ary) == rb_cRange) ary = rb_gsl_range2ary(ary);
196
+ if (TYPE(ary) == T_ARRAY) {
197
+ return carray_set_from_rarray(a, ary);
198
+ #ifdef HAVE_NARRAY_H
199
+ } else if (NA_IsNArray(ary)) {
200
+ return carray_set_from_narray(a, ary);
201
+ #endif
202
+ } else {
203
+ rb_raise(rb_eTypeError,
204
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
205
+ }
206
+ }
207
+
208
+ void carray_set_from_rarray(double *a, VALUE ary)
209
+ {
210
+ size_t i, size;
211
+ VALUE val;
212
+ if (CLASS_OF(ary) == rb_cRange) ary = rb_gsl_range2ary(ary);
213
+ Check_Type(ary, T_ARRAY);
214
+ // size = RARRAY(ary)->len;
215
+ size = RARRAY_LEN(ary);
216
+ if (size == 0) return;
217
+ for (i = 0; i < size; i++) {
218
+ val = rb_ary_entry(ary, i);
219
+ Need_Float(val);
220
+ a[i] = NUM2DBL(val);
221
+ // a[i] = RFLOAT(val)->value;
222
+ }
223
+ }
224
+
225
+ #ifdef HAVE_NARRAY_H
226
+ /* NArray -> CArray */
227
+ void carray_set_from_narray(double *a, VALUE ary)
228
+ {
229
+ int size;
230
+ VALUE ary2;
231
+ if (!NA_IsNArray(ary))
232
+ rb_raise(rb_eTypeError,
233
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
234
+ size = NA_TOTAL(ary);
235
+ if (size == 0) return;
236
+ ary2 = na_change_type(ary, NA_DFLOAT);
237
+ memcpy(a, NA_PTR_TYPE(ary2,double*), size*sizeof(double));
238
+ }
239
+
240
+ /* NArray -> GSL::Vector */
241
+ gsl_vector* make_cvector_from_narray(VALUE ary)
242
+ {
243
+ gsl_vector *v = NULL;
244
+ size_t size;
245
+ VALUE ary2;
246
+ if (!NA_IsNArray(ary))
247
+ rb_raise(rb_eTypeError,
248
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
249
+ size = NA_TOTAL(ary);
250
+ v = gsl_vector_alloc(size);
251
+ if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
252
+ ary2 = na_change_type(ary, NA_DFLOAT);
253
+ memcpy(v->data, NA_PTR_TYPE(ary2,double*), size*sizeof(double));
254
+ /* cvector_set_from_narray(v, ary);*/
255
+ return v;
256
+ }
257
+
258
+ void cvector_set_from_narray(gsl_vector *v, VALUE ary)
259
+ {
260
+ int size;
261
+ if (!NA_IsNArray(ary))
262
+ rb_raise(rb_eTypeError,
263
+ "wrong argument type %s", rb_class2name(CLASS_OF(ary)));
264
+ size = NA_TOTAL(ary);
265
+ carray_set_from_narray(v->data, ary);
266
+ }
267
+ #endif
268
+
269
+ gsl_vector_complex* make_vector_complex_clone(const gsl_vector_complex *v)
270
+ {
271
+ gsl_vector_complex *vnew = NULL;
272
+ vnew = gsl_vector_complex_alloc(v->size);
273
+ if (vnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
274
+ gsl_vector_complex_memcpy(vnew, v);
275
+ return vnew;
276
+ }
277
+
278
+ gsl_matrix* make_matrix_clone(const gsl_matrix *m)
279
+ {
280
+ gsl_matrix *mnew = NULL;
281
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
282
+ if (mnew == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_alloc failed");
283
+ gsl_matrix_memcpy(mnew, m);
284
+ return mnew;
285
+ }
286
+
287
+ gsl_matrix_int* make_matrix_int_clone(const gsl_matrix_int *m)
288
+ {
289
+ gsl_matrix_int *mnew = NULL;
290
+ mnew = gsl_matrix_int_alloc(m->size1, m->size2);
291
+ if (mnew == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_alloc failed");
292
+ gsl_matrix_int_memcpy(mnew, m);
293
+ return mnew;
294
+ }
295
+
296
+ VALUE make_matrix_clone2(VALUE vm)
297
+ {
298
+ gsl_matrix *m = NULL, *mnew = NULL;
299
+ Data_Get_Struct(vm, gsl_matrix, m);
300
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
301
+ if (mnew == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_alloc failed");
302
+ gsl_matrix_memcpy(mnew, m);
303
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);;
304
+ }
305
+
306
+ gsl_matrix_complex* make_matrix_complex_clone(const gsl_matrix_complex *m)
307
+ {
308
+ gsl_matrix_complex *mnew = NULL;
309
+ mnew = gsl_matrix_complex_alloc(m->size1, m->size2);
310
+ if (mnew == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_complex_alloc failed");
311
+ gsl_matrix_complex_memcpy(mnew, m);
312
+ return mnew;
313
+ }
314
+
315
+ gsl_vector_complex* vector_to_complex(const gsl_vector *v)
316
+ {
317
+ gsl_vector_complex *cv = NULL;
318
+ gsl_complex z;
319
+ size_t i;
320
+ cv = gsl_vector_complex_alloc(v->size);
321
+ if (cv == NULL) rb_raise(rb_eNoMemError, "gsl_vector_complex_alloc failed");
322
+ for (i = 0; i < v->size; i++) {
323
+ z = gsl_complex_rect(gsl_vector_get(v, i), 0.0);
324
+ gsl_vector_complex_set(cv, i, z);
325
+ }
326
+ return cv;
327
+ }
328
+
329
+ gsl_matrix_complex* matrix_to_complex(const gsl_matrix *m)
330
+ {
331
+ gsl_matrix_complex *cm = NULL;
332
+ gsl_complex z;
333
+ size_t i, j;
334
+ cm = gsl_matrix_complex_alloc(m->size1, m->size2);
335
+ if (cm == NULL) rb_raise(rb_eNoMemError, "gsl_matrix_complex_alloc failed");
336
+ for (i = 0; i < m->size1; i++) {
337
+ for (j = 0; j < m->size2; j++) {
338
+ z = gsl_complex_rect(gsl_matrix_get(m, i, j), 0.0);
339
+ gsl_matrix_complex_set(cm, i, j, z);
340
+ }
341
+ }
342
+ return cm;
343
+ }
344
+
345
+ void gsl_matrix_complex_mul(gsl_matrix_complex *mnew, const gsl_matrix_complex *m,
346
+ const gsl_matrix_complex *mb)
347
+ {
348
+ gsl_complex a, b, c, sum;
349
+ size_t i, j, k;
350
+ for (i = 0; i < m->size1; i++) {
351
+ for (j = 0; j < m->size2; j++) {
352
+ sum = gsl_complex_rect(0.0, 0.0);
353
+ for (k = 0; k < m->size2; k++) {
354
+ a = gsl_matrix_complex_get(m, j, k);
355
+ b = gsl_matrix_complex_get(mb, k, i);
356
+ c = gsl_complex_mul(a, b);
357
+ sum = gsl_complex_add(sum, c);
358
+ }
359
+ gsl_matrix_complex_set(mnew, j, i, sum);
360
+ }
361
+ }
362
+ }
363
+
364
+ void gsl_matrix_mul_vector(gsl_vector *vnew,
365
+ const gsl_matrix *m, const gsl_vector *v)
366
+ {
367
+ size_t i, j;
368
+ double val;
369
+ for (i = 0; i < m->size1; i++) {
370
+ val = 0;
371
+ for (j = 0; j < m->size2; j++)
372
+ val += gsl_matrix_get(m, i, j)*gsl_vector_get(v, j);
373
+ gsl_vector_set(vnew, i, val);
374
+ }
375
+ }
376
+
377
+ void gsl_matrix_int_mul_vector(gsl_vector_int *vnew,
378
+ const gsl_matrix_int *m, const gsl_vector_int *v)
379
+ {
380
+ size_t i, j;
381
+ int val;
382
+ for (i = 0; i < m->size1; i++) {
383
+ val = 0;
384
+ for (j = 0; j < m->size2; j++)
385
+ val += gsl_matrix_int_get(m, i, j)*gsl_vector_int_get(v, j);
386
+ gsl_vector_int_set(vnew, i, val);
387
+ }
388
+ }
389
+
390
+ void gsl_matrix_complex_mul_vector(gsl_vector_complex *vnew,
391
+ const gsl_matrix_complex *m,
392
+ const gsl_vector_complex *v)
393
+ {
394
+ gsl_complex a, b, c, sum;
395
+ size_t i, j;
396
+ for (i = 0; i < m->size1; i++) {
397
+ sum = gsl_complex_rect(0.0, 0.0);
398
+ for (j = 0; j < m->size2; j++) {
399
+ a = gsl_matrix_complex_get(m, i, j);
400
+ b = gsl_vector_complex_get(v, j);
401
+ c = gsl_complex_mul(a, b);
402
+ sum = gsl_complex_add(sum, c);
403
+ }
404
+ gsl_vector_complex_set(vnew, i, sum);
405
+ }
406
+
407
+ }
408
+
409
+ /*****/
410
+ #ifndef GSL_1_12_LATER
411
+ int gsl_vector_complex_add(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
412
+ {
413
+ size_t i;
414
+ gsl_complex a, b, c;
415
+ for (i = 0; i < cv->size; i++) {
416
+ a = gsl_vector_complex_get(cv, i);
417
+ b = gsl_vector_complex_get(cv2, i);
418
+ c = gsl_complex_add(a, b);
419
+ gsl_vector_complex_set(cv, i, c);
420
+ }
421
+ return 0;
422
+ }
423
+
424
+ int gsl_vector_complex_add_constant(gsl_vector_complex *cv, gsl_complex b)
425
+ {
426
+ size_t i;
427
+ gsl_complex a, c;
428
+ for (i = 0; i < cv->size; i++) {
429
+ a = gsl_vector_complex_get(cv, i);
430
+ c = gsl_complex_add(a, b);
431
+ gsl_vector_complex_set(cv, i, c);
432
+ }
433
+ return 0;
434
+ }
435
+
436
+ int gsl_vector_complex_scale(gsl_vector_complex *cv, gsl_complex b)
437
+ {
438
+ size_t i;
439
+ gsl_complex a, c;
440
+ for (i = 0; i < cv->size; i++) {
441
+ a = gsl_vector_complex_get(cv, i);
442
+ c = gsl_complex_mul(a, b);
443
+ gsl_vector_complex_set(cv, i, c);
444
+ }
445
+ return 0;
446
+ }
447
+
448
+
449
+ int gsl_vector_complex_sub(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
450
+ {
451
+ size_t i;
452
+ gsl_complex a, b, c;
453
+ for (i = 0; i < cv->size; i++) {
454
+ a = gsl_vector_complex_get(cv, i);
455
+ b = gsl_vector_complex_get(cv2, i);
456
+ c = gsl_complex_sub(a, b);
457
+ gsl_vector_complex_set(cv, i, c);
458
+ }
459
+ return 0;
460
+ }
461
+
462
+ int gsl_vector_complex_mul(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
463
+ {
464
+ size_t i;
465
+ gsl_complex a, b, c;
466
+ for (i = 0; i < cv->size; i++) {
467
+ a = gsl_vector_complex_get(cv, i);
468
+ b = gsl_vector_complex_get(cv2, i);
469
+ c = gsl_complex_mul(a, b);
470
+ gsl_vector_complex_set(cv, i, c);
471
+ }
472
+ return 0;
473
+ }
474
+
475
+ int gsl_vector_complex_div(gsl_vector_complex *cv, const gsl_vector_complex *cv2)
476
+ {
477
+ size_t i;
478
+ gsl_complex a, b, c;
479
+ for (i = 0; i < cv->size; i++) {
480
+ a = gsl_vector_complex_get(cv, i);
481
+ b = gsl_vector_complex_get(cv2, i);
482
+ c = gsl_complex_div(a, b);
483
+ gsl_vector_complex_set(cv, i, c);
484
+ }
485
+ return 0;
486
+ }
487
+ #endif
488
+
489
+ VALUE rb_gsl_range2ary(VALUE obj)
490
+ {
491
+ // double beg, en;
492
+ // size_t n;
493
+ // int step;
494
+ VALUE ary;
495
+ if (CLASS_OF(obj) != rb_cRange)
496
+ rb_raise(rb_eTypeError, "wrong argument type %s (Range expected)",
497
+ rb_class2name(CLASS_OF(obj)));
498
+ ary = rb_funcall(obj, rb_gsl_id_to_a, 0);
499
+ return ary;
500
+ }
501
+
502
+ void get_range_beg_en_n(VALUE range, double *beg, double *en, size_t *n, int *step);
503
+ VALUE rb_gsl_range2vector(VALUE obj)
504
+ {
505
+ double beg, en;
506
+ size_t n;
507
+ int i, step;
508
+ gsl_vector *v;
509
+ if (CLASS_OF(obj) != rb_cRange)
510
+ rb_raise(rb_eTypeError, "wrong argument type %s (Range expected)",
511
+ rb_class2name(CLASS_OF(obj)));
512
+ get_range_beg_en_n(obj, &beg, &en, &n, &step);
513
+ v = gsl_vector_alloc(n);
514
+ for (i = 0; i < n; i++) gsl_vector_set(v, i, (double) (beg+i));
515
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
516
+ }
517
+
518
+ void get_range_int_beg_en_n(VALUE range, int *beg, int *en, size_t *n, int *step);
519
+ VALUE rb_gsl_range2vector_int(VALUE obj)
520
+ {
521
+ int beg, en, i, step;
522
+ size_t n;
523
+ gsl_vector_int *v;
524
+ if (CLASS_OF(obj) != rb_cRange)
525
+ rb_raise(rb_eTypeError, "wrong argument type %s (Range expected)",
526
+ rb_class2name(CLASS_OF(obj)));
527
+ get_range_int_beg_en_n(obj, &beg, &en, &n, &step);
528
+ v = gsl_vector_int_alloc(n);
529
+ for (i = 0; i < n; i++) gsl_vector_int_set(v, i, beg+i);
530
+ return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, v);
531
+ }
532
+
533
+ gsl_vector_int_view* rb_gsl_vector_int_view_alloc(size_t n)
534
+ {
535
+ gsl_vector_int_view *v;
536
+ v = ALLOC(gsl_vector_int_view);
537
+ v->vector.size = n;
538
+ v->vector.stride = 1;
539
+ v->vector.owner = 0;
540
+ return v;
541
+ }
542
+
543
+ void rb_gsl_vector_int_view_free(gsl_vector_int_view *v)
544
+ {
545
+ free((gsl_vector_int_view *) v);
546
+ }
547
+
548
+ gsl_matrix_view* rb_gsl_matrix_view_alloc()
549
+ {
550
+ gsl_matrix_view *mv = NULL;
551
+ mv = ALLOC(gsl_matrix_view);
552
+ if (mv == NULL) rb_raise(rb_eRuntimeError, "malloc failed");
553
+ return mv;
554
+ }
555
+
556
+ void rb_gsl_matrix_view_free(gsl_matrix_view * mv)
557
+ {
558
+ free((gsl_matrix_view *) mv);
559
+ }
560
+
561
+ gsl_matrix_int_view* rb_gsl_matrix_int_view_alloc()
562
+ {
563
+ gsl_matrix_int_view *mv = NULL;
564
+ mv = ALLOC(gsl_matrix_int_view);
565
+ if (mv == NULL) rb_raise(rb_eRuntimeError, "malloc failed");
566
+ return mv;
567
+ }
568
+
569
+ void rb_gsl_matrix_int_view_free(gsl_matrix_int_view * mv)
570
+ {
571
+ free((gsl_matrix_int_view *) mv);
572
+ }
573
+
574
+ void Init_gsl_array(VALUE module)
575
+ {
576
+ cgsl_block = rb_define_class_under(module, "Block",
577
+ cGSL_Object);
578
+ cgsl_block_int = rb_define_class_under(cgsl_block, "Int",
579
+ cGSL_Object);
580
+ cgsl_block_uchar = rb_define_class_under(cgsl_block, "Byte",
581
+ cGSL_Object);
582
+
583
+ cgsl_block_complex = rb_define_class_under(cgsl_block, "Complex", cgsl_block);
584
+ cgsl_vector = rb_define_class_under(module, "Vector",
585
+ cGSL_Object);
586
+ cgsl_vector_col = rb_define_class_under(cgsl_vector, "Col",
587
+ cgsl_vector);
588
+ cgsl_vector_complex = rb_define_class_under(cgsl_vector, "Complex",
589
+ cGSL_Object);
590
+ cgsl_vector_complex_col = rb_define_class_under(cgsl_vector_complex, "Col",
591
+ cgsl_vector_complex);
592
+ cgsl_matrix = rb_define_class_under(module, "Matrix", cGSL_Object);
593
+ cgsl_matrix_complex = rb_define_class_under(cgsl_matrix, "Complex", cGSL_Object);
594
+
595
+ cgsl_vector_view = rb_define_class_under(cgsl_vector, "View", cgsl_vector);
596
+ cgsl_vector_col_view = rb_define_class_under(cgsl_vector_col, "View", cgsl_vector_col);
597
+
598
+ cgsl_vector_complex_view = rb_define_class_under(cgsl_vector_complex, "View",
599
+ cgsl_vector_complex);
600
+ cgsl_vector_complex_col_view = rb_define_class_under(cgsl_vector_complex_col, "View",
601
+ cgsl_vector_complex_col);
602
+
603
+ cgsl_vector_int = rb_define_class_under(cgsl_vector, "Int", cGSL_Object);
604
+ cgsl_vector_int_col = rb_define_class_under(cgsl_vector_int, "Col", cgsl_vector_int);
605
+ cgsl_vector_int_view = rb_define_class_under(cgsl_vector_int, "View", cgsl_vector_int);
606
+ cgsl_vector_int_col_view = rb_define_class_under(cgsl_vector_int_col, "View", cgsl_vector_int_col);
607
+
608
+
609
+ /*****/
610
+
611
+ cgsl_matrix_view = rb_define_class_under(cgsl_matrix, "View",
612
+ cgsl_matrix);
613
+ cgsl_matrix_complex_view = rb_define_class_under(cgsl_matrix_complex, "View",
614
+ cgsl_matrix_complex);
615
+ cgsl_permutation = rb_define_class_under(module, "Permutation", cGSL_Object);
616
+ cgsl_index = rb_define_class_under(module, "Index", cgsl_permutation);
617
+
618
+ cgsl_vector_view_ro = rb_define_class_under(cgsl_vector_view, "ReadOnly",
619
+ cgsl_vector_view);
620
+ cgsl_vector_col_view_ro = rb_define_class_under(cgsl_vector_col_view, "ReadOnly",
621
+ cgsl_vector_col_view);
622
+ cgsl_vector_int_view_ro = rb_define_class_under(cgsl_vector_int_view, "ReadOnly",
623
+ cgsl_vector_int_view);
624
+ cgsl_vector_int_col_view_ro = rb_define_class_under(cgsl_vector_int_col_view, "ReadOnly",
625
+ cgsl_vector_int_col_view);
626
+ cgsl_matrix_view_ro = rb_define_class_under(cgsl_matrix_view, "ReadOnly",
627
+ cgsl_matrix_view);
628
+
629
+ cgsl_vector_complex_view_ro = rb_define_class_under(cgsl_vector_complex_view,
630
+ "ReadOnly",
631
+ cgsl_vector_complex_view);
632
+ cgsl_matrix_complex_view_ro = rb_define_class_under(cgsl_matrix_complex_view,
633
+ "ReadOnly",
634
+ cgsl_matrix_complex_view);
635
+
636
+ /*****/
637
+ cgsl_matrix_int = rb_define_class_under(cgsl_matrix, "Int", cGSL_Object);
638
+ cgsl_matrix_int_view = rb_define_class_under(cgsl_matrix_int, "View", cgsl_matrix_int);
639
+ cgsl_matrix_int_view_ro = rb_define_class_under(cgsl_matrix_int_view, "ReadOnly",
640
+ cgsl_matrix_int_view);
641
+ /*****/
642
+ Init_gsl_block_init(module);
643
+ Init_gsl_block_int_init(module);
644
+ Init_gsl_block_uchar_init(module);
645
+ Init_gsl_vector(module);
646
+ Init_gsl_vector_int(module);
647
+
648
+ Init_gsl_vector_complex(module);
649
+ Init_gsl_matrix(module);
650
+ Init_gsl_matrix_int(module);
651
+ Init_gsl_matrix_complex(module);
652
+ Init_gsl_permutation(module);
653
+ #ifdef GSL_1_1_LATER
654
+ Init_gsl_combination(module);
655
+ #endif
656
+ Init_gsl_array_complex(module);
657
+ Init_gsl_matrix_nmf();
658
+
659
+ rb_define_method(cgsl_vector_view_ro, "set", rb_gsl_obj_read_only, -1);
660
+ rb_define_method(cgsl_matrix_view_ro, "set", rb_gsl_obj_read_only, -1);
661
+ rb_define_method(cgsl_vector_int_view_ro, "set", rb_gsl_obj_read_only, -1);
662
+ rb_define_method(cgsl_matrix_int_view_ro, "set", rb_gsl_obj_read_only, -1);
663
+ rb_define_method(cgsl_vector_complex_view_ro, "set", rb_gsl_obj_read_only, -1);
664
+ rb_define_method(cgsl_matrix_complex_view_ro, "set", rb_gsl_obj_read_only, -1);
665
+
666
+ }