gsl 1.12.108

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 (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
+ }