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,204 @@
1
+ /*
2
+ vector_int.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2004 by Yoshiki Tsunesada
5
+ Modified by Seiya Nishizawa 14/Apr/2004
6
+
7
+ Ruby/GSL is free software: you can redistribute it and/or modify it
8
+ under the terms of the GNU General Public License.
9
+ This library is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY.
11
+ */
12
+ #include "rb_gsl_config.h"
13
+ #include "rb_gsl_array.h"
14
+ #include "rb_gsl_complex.h"
15
+ #ifdef HAVE_NARRAY_H
16
+ #include "rb_gsl_with_narray.h"
17
+ #endif
18
+
19
+ VALUE rb_gsl_vector_int_inner_product(int argc, VALUE *argv, VALUE obj);
20
+ VALUE rb_gsl_vector_int_do_something(VALUE obj, void (*func)(gsl_vector_int*));
21
+
22
+ static VALUE rb_gsl_vector_int_to_i(VALUE obj)
23
+ {
24
+ return obj;
25
+ }
26
+
27
+ VALUE rb_gsl_vector_int_to_f(VALUE obj)
28
+ {
29
+ gsl_vector_int *v;
30
+ gsl_vector *vnew;
31
+ size_t i;
32
+ Data_Get_Struct(obj, gsl_vector_int, v);
33
+ vnew = gsl_vector_alloc(v->size);
34
+ for (i = 0; i < v->size; i++)
35
+ gsl_vector_set(vnew, i, (double) gsl_vector_int_get(v, i));
36
+ if (VECTOR_INT_COL_P(obj))
37
+ return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, vnew);
38
+ else
39
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
40
+ }
41
+
42
+ static VALUE rb_gsl_vector_int_to_complex(VALUE obj)
43
+ {
44
+ gsl_vector_int *v;
45
+ gsl_vector_complex *vnew;
46
+ gsl_complex z;
47
+ size_t i;
48
+ Data_Get_Struct(obj, gsl_vector_int, v);
49
+ vnew = gsl_vector_complex_alloc(v->size);
50
+ for (i = 0; i < v->size; i++) {
51
+ GSL_SET_REAL(&z, (double) gsl_vector_int_get(v, i));
52
+ GSL_SET_IMAG(&z, 0.0);
53
+ gsl_vector_complex_set(vnew, i, z);
54
+ }
55
+ if (VECTOR_INT_COL_P(obj))
56
+ return Data_Wrap_Struct(cgsl_vector_complex_col, 0, gsl_vector_complex_free, vnew);
57
+ else
58
+ return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
59
+ }
60
+
61
+ static VALUE rb_gsl_vector_int_coerce(VALUE obj, VALUE other)
62
+ {
63
+ gsl_vector_int *v = NULL, *vnew = NULL;
64
+ VALUE vv;
65
+ Data_Get_Struct(obj, gsl_vector_int, v);
66
+ switch (TYPE(other)) {
67
+ case T_FIXNUM:
68
+ vnew = gsl_vector_int_alloc(v->size);
69
+ if (vnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_int_alloc failed");
70
+ gsl_vector_int_set_all(vnew, FIX2INT(other));
71
+ vv = Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
72
+ return rb_ary_new3(2, vv, obj);
73
+ break;
74
+ default:
75
+ return rb_ary_new3(2, other, rb_gsl_vector_int_to_f(obj));
76
+ }
77
+ // return rb_ary_new3(2, other, rb_gsl_vector_int_to_f(obj));
78
+ }
79
+
80
+ VALUE rb_gsl_vector_add(VALUE obj, VALUE b);
81
+ VALUE rb_gsl_vector_sub(VALUE obj, VALUE b);
82
+ VALUE rb_gsl_vector_mul(VALUE obj, VALUE b);
83
+ VALUE rb_gsl_vector_div(VALUE obj, VALUE b);
84
+ static VALUE rb_gsl_vector_int_add(VALUE obj, VALUE b)
85
+ {
86
+ gsl_vector_int *v, *vnew, *vb;
87
+ switch (TYPE(b)) {
88
+ case T_FIXNUM:
89
+ return rb_gsl_vector_int_add_constant(obj, b);
90
+ break;
91
+ case T_FLOAT:
92
+ return rb_gsl_vector_add_constant(rb_gsl_vector_int_to_f(obj), b);
93
+ break;
94
+ default:
95
+ if (rb_obj_is_kind_of(b, cgsl_vector_int)) {
96
+ Data_Get_Struct(obj, gsl_vector_int, v);
97
+ Data_Get_Struct(b, gsl_vector_int, vb);
98
+ vnew = gsl_vector_int_alloc(v->size);
99
+ gsl_vector_int_memcpy(vnew, v);
100
+ gsl_vector_int_add(vnew, vb);
101
+ return Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
102
+ } else {
103
+ return rb_gsl_vector_add(rb_gsl_vector_int_to_f(obj), b);
104
+ }
105
+ break;
106
+ }
107
+ }
108
+
109
+
110
+ static VALUE rb_gsl_vector_int_sub(VALUE obj, VALUE b)
111
+ {
112
+ gsl_vector_int *v, *vnew, *vb;
113
+ switch (TYPE(b)) {
114
+ case T_FIXNUM:
115
+ return rb_gsl_vector_int_add_constant(obj, INT2FIX(-FIX2INT(b)));
116
+ break;
117
+ case T_FLOAT:
118
+ return rb_gsl_vector_add_constant(rb_gsl_vector_int_to_f(obj), rb_float_new(-NUM2DBL(b)));
119
+ break;
120
+ default:
121
+ if (rb_obj_is_kind_of(b, cgsl_vector_int)) {
122
+ Data_Get_Struct(obj, gsl_vector_int, v);
123
+ Data_Get_Struct(b, gsl_vector_int, vb);
124
+ vnew = gsl_vector_int_alloc(v->size);
125
+ gsl_vector_int_memcpy(vnew, v);
126
+ gsl_vector_int_sub(vnew, vb);
127
+ return Data_Wrap_Struct(VECTOR_INT_ROW_COL(obj), 0, gsl_vector_int_free, vnew);
128
+ } else {
129
+ return rb_gsl_vector_sub(rb_gsl_vector_int_to_f(obj), b);
130
+ }
131
+ break;
132
+ }
133
+ }
134
+
135
+ gsl_vector_int* mygsl_vector_int_mul_matrix(gsl_vector_int *v, gsl_matrix_int *m);
136
+
137
+ static VALUE rb_gsl_vector_int_mul(VALUE obj, VALUE b)
138
+ {
139
+ VALUE argv[2];
140
+ gsl_vector_int *v, *vnew, *v2;
141
+ gsl_matrix_int *m;
142
+ int val;
143
+ size_t i, j;
144
+ switch (TYPE(b)) {
145
+ case T_FIXNUM:
146
+ case T_FLOAT:
147
+ return rb_gsl_vector_int_scale(obj, b);
148
+ break;
149
+ default:
150
+ if (VECTOR_INT_ROW_P(obj) && VECTOR_INT_COL_P(b)) {
151
+ argv[0] = obj;
152
+ argv[1] = b;
153
+ return rb_gsl_vector_int_inner_product(2, argv, CLASS_OF(obj));
154
+ } else if (VECTOR_INT_ROW_P(obj) && MATRIX_INT_P(b)) {
155
+ Data_Get_Struct(obj, gsl_vector_int, v);
156
+ Data_Get_Struct(b, gsl_matrix_int, m);
157
+ vnew = mygsl_vector_int_mul_matrix(v, m);
158
+ return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, vnew);
159
+ } else if (VECTOR_INT_COL_P(obj) && VECTOR_INT_ROW_P(b)) {
160
+ Data_Get_Struct(obj, gsl_vector_int, v);
161
+ Data_Get_Struct(b, gsl_vector_int, v2);
162
+ if (v->size != v2->size) rb_raise(rb_eIndexError, "Vector sizes does not match.");
163
+ m = gsl_matrix_int_alloc(v->size, v2->size);
164
+ for (i = 0; i < v->size; i++) {
165
+ for (j = 0; j < v2->size; j++) {
166
+ val = gsl_vector_int_get(v, i)*gsl_vector_int_get(v2, j);
167
+ gsl_matrix_int_set(m, i, j, val);
168
+ }
169
+ }
170
+ return Data_Wrap_Struct(cgsl_matrix_int, 0, gsl_matrix_int_free, m);
171
+ } else {
172
+ return rb_gsl_vector_mul(rb_gsl_vector_int_to_f(obj), b);
173
+ }
174
+ break;
175
+ }
176
+ }
177
+
178
+ static VALUE rb_gsl_vector_int_div(VALUE obj, VALUE b)
179
+ {
180
+ return rb_gsl_vector_div(rb_gsl_vector_int_to_f(obj), b);
181
+ }
182
+
183
+ void Init_gsl_vector_int(VALUE module)
184
+ {
185
+ rb_define_method(cgsl_vector_int, "to_f", rb_gsl_vector_int_to_f, 0);
186
+ rb_define_method(cgsl_vector_int, "to_i", rb_gsl_vector_int_to_i, 0);
187
+ rb_define_method(cgsl_vector_int, "to_complex", rb_gsl_vector_int_to_complex, 0);
188
+
189
+ /*****/
190
+ rb_define_method(cgsl_vector_int, "coerce", rb_gsl_vector_int_coerce, 1);
191
+
192
+ rb_define_method(cgsl_vector_int, "add", rb_gsl_vector_int_add, 1);
193
+ rb_define_method(cgsl_vector_int, "sub", rb_gsl_vector_int_sub, 1);
194
+ rb_define_method(cgsl_vector_int, "mul", rb_gsl_vector_int_mul, 1);
195
+ rb_define_method(cgsl_vector_int, "div", rb_gsl_vector_int_div, 1);
196
+
197
+ rb_define_alias(cgsl_vector_int, "+", "add");
198
+ rb_define_alias(cgsl_vector_int, "-", "sub");
199
+ rb_define_alias(cgsl_vector_int, "*", "mul");
200
+ rb_define_alias(cgsl_vector_int, "/", "div");
201
+
202
+ Init_gsl_vector_int_init(module);
203
+ }
204
+
@@ -0,0 +1,3329 @@
1
+ /*
2
+ vector_source.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2001-2005 by Yoshiki Tsunesada
5
+ Cameron McBride
6
+
7
+ Ruby/GSL is free software: you can redistribute it and/or modify it
8
+ under the terms of the GNU General Public License.
9
+ This library is distributed in the hope that it will be useful, but
10
+ WITHOUT ANY WARRANTY.
11
+ */
12
+
13
+ #ifdef BASE_DOUBLE
14
+ #define NUMCONV(x) NUM2DBL(x)
15
+ #define NUMCONV2(x) NUM2DBL(x)
16
+ #define PRINTF_FORMAT "%5.3e "
17
+ #define VEC_ROW_COL VECTOR_ROW_COL
18
+ #define VEC_P VECTOR_P
19
+ #define VEC_ROW_P VECTOR_ROW_P
20
+ #define VEC_COL_P VECTOR_COL_P
21
+ #define C_TO_VALUE rb_float_new
22
+ #define C_TO_VALUE2 rb_float_new
23
+ #define CHECK_VEC CHECK_VECTOR
24
+ #define VEC_VIEW_P VECTOR_VIEW_P
25
+ #elif defined(BASE_INT)
26
+ #define NUMCONV(x) FIX2INT(x)
27
+ #define NUMCONV2(x) NUM2INT(x)
28
+ #define PRINTF_FORMAT "%d "
29
+ #define VEC_ROW_COL VECTOR_INT_ROW_COL
30
+ #define VEC_P VECTOR_INT_P
31
+ #define C_TO_VALUE INT2FIX
32
+ #define C_TO_VALUE2 INT2NUM
33
+ #define VEC_ROW_P VECTOR_INT_ROW_P
34
+ #define VEC_COL_P VECTOR_INT_COL_P
35
+ #define CHECK_VEC CHECK_VECTOR_INT
36
+ #define VEC_VIEW_P VECTOR_INT_VIEW_P
37
+ #endif
38
+
39
+ void FUNCTION(get_range,beg_en_n)(VALUE range, BASE *beg, BASE *en, size_t *n, int *step);
40
+
41
+ void get_range_beg_en_n_for_size(VALUE range,
42
+ int *beg, int *en, size_t *n, int *step, size_t size);
43
+
44
+ void parse_subvector_args(int argc, VALUE *argv, size_t size,
45
+ size_t *offset, size_t *stride, size_t *n);
46
+
47
+ void FUNCTION(get_range,beg_en_n)(VALUE range, BASE *beg, BASE *en, size_t *n, int *step)
48
+ {
49
+ *beg = NUMCONV2(rb_ivar_get(range, rb_gsl_id_beg));
50
+ *en = NUMCONV2(rb_ivar_get(range, rb_gsl_id_end));
51
+ *n = (size_t) fabs(*en - *beg);
52
+ if (!RTEST(rb_ivar_get(range, rb_gsl_id_excl))) *n += 1;
53
+ if (*en < *beg) *step = -1; else *step = 1;
54
+ }
55
+
56
+ #ifdef BASE_INT
57
+ void get_range_beg_en_n_for_size(VALUE range, int *beg, int *en, size_t *n, int *step, size_t size)
58
+ {
59
+ *beg = NUM2INT(rb_ivar_get(range, rb_gsl_id_beg));
60
+ if(*beg < 0) *beg += size;
61
+ *en = NUM2INT(rb_ivar_get(range, rb_gsl_id_end));
62
+ if(*en < 0) *en += size;
63
+ *n = (size_t) fabs(*en - *beg);
64
+ if (!RTEST(rb_ivar_get(range, rb_gsl_id_excl))) *n += 1;
65
+ if (*en < *beg) *step = -1; else *step = 1;
66
+ }
67
+
68
+ void parse_subvector_args(int argc, VALUE *argv, size_t size,
69
+ size_t *offset, size_t *stride, size_t *n)
70
+ {
71
+ int begin = 0, end, step, length;
72
+ *stride = 1;
73
+ switch (argc) {
74
+ case 0:
75
+ *n = size;
76
+ break;
77
+ case 1:
78
+ if(rb_obj_is_kind_of(argv[0], rb_cRange)) {
79
+ get_range_beg_en_n_for_size(argv[0], &begin, &end, n, &step, size);
80
+ // TODO Should we do bounds checking or risk letting GSL do it?
81
+ // On one hand, it seems like we should do as little as possible to stay as
82
+ // thin and fast as possible. On the other hand, it seems like we don't
83
+ // want to let Ruby crash if GSL does not have bounds checking enabled.
84
+ if(begin < 0 || (size_t)begin >= size) {
85
+ rb_raise(rb_eRangeError,
86
+ "begin value %d is out of range for Vector of length %d",
87
+ begin, (int) size);
88
+ }
89
+ if(end < 0 || (size_t)end >= size) {
90
+ rb_raise(rb_eRangeError,
91
+ "end value %d is out of range for Vector of length %d",
92
+ end, (int) size);
93
+ }
94
+ *stride = (size_t)step;
95
+ } else {
96
+ CHECK_FIXNUM(argv[0]);
97
+ length = FIX2INT(argv[0]);
98
+ if((length < 0 && -length > size) || (length > 0 && length > size)) {
99
+ rb_raise(rb_eRangeError,
100
+ "length %d is out of range for Vector of length %d",
101
+ length, (int) size);
102
+ } else if(length < 0) {
103
+ begin = length;
104
+ *n = (size_t)(-length);
105
+ } else {
106
+ // begin was initialized to 0
107
+ *n = (size_t)length;
108
+ }
109
+ }
110
+ break;
111
+ case 2:
112
+ if(rb_obj_is_kind_of(argv[0], rb_cRange)) {
113
+ get_range_beg_en_n_for_size(argv[0], &begin, &end, n, &step, size);
114
+ if(begin < 0 || (size_t)begin >= size) {
115
+ rb_raise(rb_eRangeError,
116
+ "begin value %d is out of range for Vector of length %d",
117
+ (int) begin, (int) size);
118
+ }
119
+ if(end < 0 || (size_t)end >= size) {
120
+ rb_raise(rb_eRangeError,
121
+ "end value %d is out of range for Vector of length %d",
122
+ (int) end, (int) size);
123
+ }
124
+ CHECK_FIXNUM(argv[1]);
125
+ step = FIX2INT(argv[1]);
126
+ if(step == 0 && begin != end) {
127
+ rb_raise(rb_eArgError, "stride must be non-zero");
128
+ } else if((step < 0 && begin <= end) || (step > 0 && end < begin)) {
129
+ step = -step;
130
+ }
131
+ if(step < 0) {
132
+ *n = (*n-1)/(-step) + 1;
133
+ } else if(step > 0) {
134
+ *n = (*n-1)/step + 1;
135
+ }
136
+ *stride = (size_t)step;
137
+ } else {
138
+ CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]);
139
+ begin = FIX2INT(argv[0]);
140
+ length = FIX2INT(argv[1]);
141
+ if(length < 0) {
142
+ length = -length;
143
+ *stride = -1;
144
+ }
145
+ *n = (size_t)length;
146
+ }
147
+ break;
148
+ case 3:
149
+ CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
150
+ begin = FIX2INT(argv[0]);
151
+ step = FIX2INT(argv[1]);
152
+ length = FIX2INT(argv[2]);
153
+ if(length < 0) {
154
+ step = -step;
155
+ length = -length;
156
+ }
157
+ *stride = (size_t)step;
158
+ *n = (size_t)length;
159
+ break;
160
+ default:
161
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0-3)", argc);
162
+ break;
163
+ }
164
+ if(begin < 0) {
165
+ begin += size;
166
+ }
167
+ *offset = (size_t)begin;
168
+ }
169
+
170
+ #endif
171
+
172
+ void FUNCTION(set_ptr_data,by_range)(BASE *ptr, size_t n, VALUE range)
173
+ {
174
+ size_t n2, i;
175
+ BASE beg, en, val;
176
+ int step;
177
+ FUNCTION(get_range,beg_en_n)(range, &beg, &en, &n2, &step);
178
+ val = beg;
179
+ for (i = 0; i < n; i++) {
180
+ if (i < n2) ptr[i] = val;
181
+ else ptr[i] = (BASE) 0;
182
+ val += step;
183
+ }
184
+ }
185
+
186
+ void FUNCTION(cvector,set_from_rarray)(GSL_TYPE(gsl_vector) *v, VALUE ary)
187
+ {
188
+ size_t i;
189
+ if (CLASS_OF(ary) == rb_cRange) ary = rb_gsl_range2ary(ary);
190
+ Check_Type(ary, T_ARRAY);
191
+ #ifdef RUBY_1_9_LATER
192
+ if (RARRAY_LEN(ary) == 0) return;
193
+ #else
194
+ if (RARRAY_LEN(ary) == 0) return;
195
+ #endif
196
+ for (i = 0; i < v->size; i++) FUNCTION(gsl_vector,set)(v, i, NUMCONV(rb_ary_entry(ary, i)));
197
+ }
198
+
199
+ GSL_TYPE(gsl_vector)* FUNCTION(make_cvector,from_rarray)(VALUE ary)
200
+ {
201
+ GSL_TYPE(gsl_vector) *v = NULL;
202
+ if (CLASS_OF(ary) == rb_cRange) ary = rb_gsl_range2ary(ary);
203
+ Check_Type(ary, T_ARRAY);
204
+ v = FUNCTION(gsl_vector,alloc)(RARRAY_LEN(ary));
205
+ if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
206
+ FUNCTION(cvector,set_from_rarray)(v, ary);
207
+ return v;
208
+ }
209
+
210
+ VALUE FUNCTION(rb_gsl_vector,new)(int argc, VALUE *argv, VALUE klass)
211
+ {
212
+ GSL_TYPE(gsl_vector) *v = NULL, *vtmp = NULL;
213
+ BASE xnative;
214
+ size_t n, i;
215
+ BASE beg, en;
216
+ int step;
217
+ #ifdef HAVE_NARRAY_H
218
+ VALUE ary2;
219
+ #endif
220
+ switch (argc) {
221
+ case 1:
222
+ #ifdef HAVE_NARRAY_H
223
+ if (NA_IsNArray(argv[0])) {
224
+ n = NA_TOTAL(argv[0]);
225
+ v = FUNCTION(gsl_vector,alloc)(n);
226
+ if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
227
+ #ifdef BASE_DOUBLE
228
+ ary2 = na_change_type(argv[0], NA_DFLOAT);
229
+ #else
230
+ ary2 = na_change_type(argv[0], NA_LINT);
231
+ #endif
232
+ memcpy(v->data, NA_PTR_TYPE(ary2,BASE*), n*sizeof(BASE));
233
+ return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_vector,free), v);
234
+ }
235
+ #endif
236
+ switch (TYPE(argv[0])) {
237
+ case T_FIXNUM:
238
+ /*! if an integer n is given, create an empty vector of length n */
239
+ CHECK_FIXNUM(argv[0]);
240
+ n = FIX2INT(argv[0]);
241
+ v = FUNCTION(gsl_vector,calloc)(n);
242
+ if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
243
+ break;
244
+ case T_BIGNUM:
245
+ rb_raise(rb_eRangeError, "vector length is limited within the range of Fixnum.");
246
+ break;
247
+ case T_FLOAT:
248
+ v = FUNCTION(gsl_vector,alloc)(1);
249
+ switch(TYPE(argv[0])) {
250
+ case T_FIXNUM: case T_BIGNUM: case T_FLOAT:
251
+ xnative = NUMCONV2(argv[0]);
252
+ break;
253
+ default:
254
+ xnative = (BASE)0;
255
+ }
256
+ FUNCTION(gsl_vector,set)(v, 0, xnative);
257
+ break;
258
+ #ifdef BASE_DOUBLE
259
+ case T_ARRAY:
260
+ v = make_cvector_from_rarrays(argv[0]);
261
+ break;
262
+ #endif
263
+ default:
264
+ if (CLASS_OF(argv[0]) == rb_cRange) {
265
+ FUNCTION(get_range,beg_en_n)(argv[0], &beg, &en, &n, &step);
266
+ v = FUNCTION(gsl_vector,alloc)(n);
267
+ FUNCTION(set_ptr_data,by_range)(v->data, v->size, argv[0]);
268
+ return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_vector,free), v);
269
+ } else if (VEC_P(argv[0])) {
270
+ /*! Create a new vector with the same elements of the vector given */
271
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), vtmp);
272
+ v = FUNCTION(gsl_vector,alloc)(vtmp->size);
273
+ for (i = 0; i < vtmp->size; i++)
274
+ FUNCTION(gsl_vector,set)(v, i, FUNCTION(gsl_vector,get)(vtmp, i));
275
+ return Data_Wrap_Struct(VEC_ROW_COL(argv[0]), 0, FUNCTION(gsl_vector,free), v);
276
+ } else {
277
+ rb_raise(rb_eTypeError,
278
+ "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
279
+ }
280
+ break;
281
+ }
282
+ break;
283
+ default:
284
+ v = FUNCTION(gsl_vector,alloc)(argc);
285
+ if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
286
+ for (i = 0; i < argc; i++) {
287
+ switch(TYPE(argv[i])) {
288
+ case T_FIXNUM: case T_BIGNUM: case T_FLOAT:
289
+ xnative = NUMCONV2(argv[i]);
290
+ break;
291
+ default:
292
+ xnative = (BASE)0;
293
+ }
294
+ FUNCTION(gsl_vector,set)(v, i, xnative);
295
+ }
296
+ break;
297
+ }
298
+ return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_vector,free), v);
299
+ }
300
+
301
+ static VALUE FUNCTION(rb_gsl_vector,calloc)(VALUE klass, VALUE nn)
302
+ {
303
+ GSL_TYPE(gsl_vector) *v = NULL;
304
+ CHECK_FIXNUM(nn);
305
+ v = FUNCTION(gsl_vector,calloc)(FIX2INT(nn));
306
+ if (v == NULL) rb_raise(rb_eNoMemError, "gsl_vector_calloc failed");
307
+ return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_vector,free), v);
308
+ }
309
+
310
+ static VALUE FUNCTION(rb_gsl_vector,subvector)(int argc, VALUE *argv, VALUE obj);
311
+ static VALUE FUNCTION(rb_gsl_vector,get)(int argc, VALUE *argv, VALUE obj)
312
+ {
313
+ VALUE retval = Qnil;
314
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
315
+ // QUALIFIED_VIEW(gsl_vector,view) *vv;
316
+ gsl_index *p;
317
+ int i; /*! not size_t, since a negative index is allowed */
318
+ size_t j, k;
319
+ // If argc is not 1 or argv[0] is a Range
320
+ if( argc != 1 || rb_obj_is_kind_of(argv[0], rb_cRange)) {
321
+ // Treat as call to subvector
322
+ retval = FUNCTION(rb_gsl_vector,subvector)(argc, argv, obj);
323
+ } else {
324
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
325
+
326
+ switch (TYPE(argv[0])) {
327
+ case T_FIXNUM:
328
+ i = FIX2INT(argv[0]);
329
+ if (i < 0)
330
+ retval = C_TO_VALUE2(FUNCTION(gsl_vector,get)(v, (size_t) (v->size + i)));
331
+ else
332
+ retval = C_TO_VALUE2(FUNCTION(gsl_vector,get)(v, (size_t) (i)));
333
+ break;
334
+ case T_ARRAY:
335
+ vnew = FUNCTION(gsl_vector,alloc)(RARRAY_LEN(argv[0]));
336
+ for (j = 0; j < vnew->size; j++) {
337
+ i = NUMCONV(rb_ary_entry(argv[0], j));
338
+ if (i < 0) k = v->size + i;
339
+ // else k = j;
340
+ else k = i;
341
+ FUNCTION(gsl_vector,set)(vnew, j, FUNCTION(gsl_vector,get)(v, k));
342
+ }
343
+ retval = Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
344
+ break;
345
+ default:
346
+ if (PERMUTATION_P(argv[0])) {
347
+ Data_Get_Struct(argv[0], gsl_index, p);
348
+ vnew = FUNCTION(gsl_vector,alloc)(p->size);
349
+ for (j = 0; j < p->size; j++) {
350
+ k = p->data[j];
351
+ if (k < 0) k = p->size + j;
352
+ FUNCTION(gsl_vector,set)(vnew, j, FUNCTION(gsl_vector,get)(v, k));
353
+ }
354
+ retval = Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
355
+ } else {
356
+ // TODO Support Vector::Int (and even Vector?)
357
+ rb_raise(rb_eTypeError, "wrong argument type %s (Array, Range, GSL::Permutation, or Fixnum expected)", rb_class2name(CLASS_OF(argv[0])));
358
+ }
359
+ break;
360
+ }
361
+ }
362
+ return retval;
363
+ }
364
+
365
+ static VALUE FUNCTION(rb_gsl_vector,size)(VALUE obj)
366
+ {
367
+ GSL_TYPE(gsl_vector) *v = NULL;
368
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
369
+ return INT2FIX(v->size);
370
+ }
371
+
372
+ static VALUE FUNCTION(rb_gsl_vector,stride)(VALUE obj)
373
+ {
374
+ GSL_TYPE(gsl_vector) *v = NULL;
375
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
376
+ return INT2FIX(v->stride);
377
+ }
378
+
379
+ static VALUE FUNCTION(rb_gsl_vector,set_stride)(VALUE obj, VALUE ss)
380
+ {
381
+ GSL_TYPE(gsl_vector) *v = NULL;
382
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
383
+ v->stride = (size_t) FIX2INT(ss);
384
+ return obj;
385
+ }
386
+
387
+ static VALUE FUNCTION(rb_gsl_vector,owner)(VALUE obj)
388
+ {
389
+ GSL_TYPE(gsl_vector) *v = NULL;
390
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
391
+ return INT2FIX(v->owner);
392
+ }
393
+
394
+ void FUNCTION(rb_gsl_vector,set_subvector)(int argc, VALUE *argv, GSL_TYPE(gsl_vector) *v, VALUE other)
395
+ {
396
+ GSL_TYPE(gsl_vector) *vother;
397
+ QUALIFIED_VIEW(gsl_vector,view) vv;
398
+ int step;
399
+ size_t i, offset, stride, n, nother;
400
+ BASE beg, end;
401
+
402
+ // assignment to v.subvector(...)
403
+ parse_subvector_args(argc, argv, v->size, &offset, &stride, &n);
404
+ vv = FUNCTION(gsl_vector,subvector_with_stride)(v, offset, stride, n);
405
+ if(rb_obj_is_kind_of(other, GSL_TYPE(cgsl_vector))) {
406
+ Data_Get_Struct(other, GSL_TYPE(gsl_vector), vother);
407
+ if(n != vother->size) {
408
+ rb_raise(rb_eRangeError, "lengths do not match (%d != %d)",(int) n, (int) vother->size);
409
+ }
410
+ // TODO Change to gsl_vector_memmove if/when GSL has such a function
411
+ // because gsl_vector_memcpy does not handle overlapping regions (e.g.
412
+ // Views) well.
413
+ FUNCTION(gsl_vector,memcpy)(&vv.vector, vother);
414
+ } else if(rb_obj_is_kind_of(other, rb_cArray)) {
415
+ if(n != RARRAY_LEN(other)) {
416
+ rb_raise(rb_eRangeError, "lengths do not match (%d != %d)", (int) n, (int) RARRAY_LEN(other));
417
+ }
418
+ for(i = 0; i < n; i++) {
419
+ FUNCTION(gsl_vector,set)(&vv.vector, i, NUMCONV2(rb_ary_entry(other, i)));
420
+ }
421
+ } else if(rb_obj_is_kind_of(other, rb_cRange)) {
422
+ FUNCTION(get_range,beg_en_n)(other, &beg, &end, &nother, &step);
423
+ if(n != nother) {
424
+ rb_raise(rb_eRangeError, "lengths do not match (%d != %d)", (int) n, (int) nother);
425
+ }
426
+ for(i = 0; i < n; i++) {
427
+ FUNCTION(gsl_vector,set)(&vv.vector, i, beg);
428
+ beg += step;
429
+ }
430
+ } else {
431
+ FUNCTION(gsl_vector,set_all)(&vv.vector, NUMCONV2(other));
432
+ }
433
+ }
434
+
435
+ static VALUE FUNCTION(rb_gsl_vector,set)(int argc, VALUE *argv, VALUE obj)
436
+ {
437
+ GSL_TYPE(gsl_vector) *v;
438
+ VALUE other;
439
+ int ii;
440
+
441
+ if(argc < 1 || argc > 4) {
442
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-4)", argc);
443
+ }
444
+
445
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
446
+ other = argv[argc-1];
447
+
448
+ if(argc == 1) {
449
+ FUNCTION(gsl_vector,set_all)(v, NUMCONV2(other));
450
+ } else if(argc == 2 && TYPE(argv[0]) == T_FIXNUM) {
451
+ // v[i] = x
452
+ ii = FIX2INT(argv[0]);
453
+ if(ii < 0) ii += v->size;
454
+ FUNCTION(gsl_vector,set)(v, (size_t)ii, NUMCONV2(other));
455
+ } else {
456
+ // assignment to v.subvector(...)
457
+ FUNCTION(rb_gsl_vector,set_subvector)(argc-1, argv, v, other);
458
+ }
459
+
460
+ return obj;
461
+ }
462
+
463
+ static VALUE FUNCTION(rb_gsl_vector,set_all)(VALUE obj, VALUE xx)
464
+ {
465
+ GSL_TYPE(gsl_vector) *v = NULL;
466
+ BASE xnative = NUMCONV2(xx);
467
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
468
+ FUNCTION(gsl_vector,set_all)(v, xnative);
469
+ return obj;
470
+ }
471
+
472
+ VALUE FUNCTION(rb_gsl_vector,do_something)(VALUE obj, void (*func)(GSL_TYPE(gsl_vector)*))
473
+ {
474
+ GSL_TYPE(gsl_vector) *v = NULL;
475
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
476
+ (*func)(v);
477
+ return obj;
478
+ }
479
+
480
+ static VALUE FUNCTION(rb_gsl_vector,set_zero)(VALUE obj)
481
+ {
482
+ return FUNCTION(rb_gsl_vector,do_something)(obj, FUNCTION(gsl_vector,set_zero));
483
+ }
484
+
485
+ static VALUE FUNCTION(rb_gsl_vector,set_basis)(VALUE obj, VALUE ii)
486
+ {
487
+ GSL_TYPE(gsl_vector) *v = NULL;
488
+ CHECK_FIXNUM(ii);
489
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
490
+ FUNCTION(gsl_vector,set_basis)(v, (size_t) FIX2INT(ii));
491
+ return obj;
492
+ }
493
+
494
+ static VALUE FUNCTION(rb_gsl_vector,each)(VALUE obj)
495
+ {
496
+ GSL_TYPE(gsl_vector) *v = NULL;
497
+ size_t i;
498
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
499
+ for (i = 0; i < v->size; i++) rb_yield(C_TO_VALUE2(FUNCTION(gsl_vector,get)(v, i)));
500
+ return Qnil;
501
+ }
502
+
503
+ static VALUE FUNCTION(rb_gsl_vector,reverse_each)(VALUE obj)
504
+ {
505
+ GSL_TYPE(gsl_vector) *v = NULL;
506
+ size_t i;
507
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
508
+ for (i = v->size-1; i >= 0; i--) {
509
+ rb_yield(C_TO_VALUE2(FUNCTION(gsl_vector,get)(v, i)));
510
+ if (i == 0) break;
511
+ }
512
+ return Qnil;
513
+ }
514
+
515
+ static VALUE FUNCTION(rb_gsl_vector,each_index)(VALUE obj)
516
+ {
517
+ GSL_TYPE(gsl_vector) *v = NULL;
518
+ size_t i;
519
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
520
+ for (i = 0; i < v->size; i++) rb_yield(INT2FIX(i));
521
+ return Qnil;
522
+ }
523
+
524
+ static VALUE FUNCTION(rb_gsl_vector,reverse_each_index)(VALUE obj)
525
+ {
526
+ GSL_TYPE(gsl_vector) *v = NULL;
527
+ size_t i;
528
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
529
+ for (i = v->size-1; i >= 0; i--) {
530
+ rb_yield(INT2FIX(i));
531
+ if (i == 0) break;
532
+ }
533
+ return Qnil;
534
+ }
535
+
536
+ static VALUE FUNCTION(rb_gsl_vector,to_a)(VALUE obj)
537
+ {
538
+ GSL_TYPE(gsl_vector) *v = NULL;
539
+ size_t i;
540
+ VALUE ary;
541
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
542
+ ary = rb_ary_new2(v->size);
543
+ for (i = 0; i < v->size; i++)
544
+ rb_ary_store(ary, i, C_TO_VALUE2(FUNCTION(gsl_vector,get)(v, i)));
545
+ return ary;
546
+ }
547
+
548
+ static VALUE FUNCTION(rb_gsl_vector,reverse_bang)(VALUE obj)
549
+ {
550
+ GSL_TYPE(gsl_vector) *v = NULL;
551
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
552
+ FUNCTION(gsl_vector,reverse)(v);
553
+ return obj;
554
+ }
555
+
556
+ static VALUE FUNCTION(rb_gsl_vector,reverse)(VALUE obj)
557
+ {
558
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
559
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
560
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
561
+ if (vnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_int_alloc failed");
562
+ FUNCTION(gsl_vector,memcpy)(vnew, v);
563
+ FUNCTION(gsl_vector,reverse)(vnew);
564
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
565
+ }
566
+
567
+ static VALUE FUNCTION(rb_gsl_vector,max)(VALUE obj)
568
+ {
569
+ GSL_TYPE(gsl_vector) *v = NULL;
570
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
571
+ return C_TO_VALUE2(FUNCTION(gsl_vector,max)(v));
572
+ }
573
+
574
+ static VALUE FUNCTION(rb_gsl_vector,min)(VALUE obj)
575
+ {
576
+ GSL_TYPE(gsl_vector) *v = NULL;
577
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
578
+ return C_TO_VALUE2(FUNCTION(gsl_vector,min)(v));
579
+ }
580
+
581
+ static VALUE FUNCTION(rb_gsl_vector,minmax)(VALUE obj)
582
+ {
583
+ GSL_TYPE(gsl_vector) *v = NULL;
584
+ BASE min, max;
585
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
586
+ FUNCTION(gsl_vector,minmax)(v, &min, &max);
587
+ return rb_ary_new3(2, C_TO_VALUE2(min), C_TO_VALUE2(max));
588
+ }
589
+
590
+ static VALUE FUNCTION(rb_gsl_vector,maxmin)(VALUE obj)
591
+ {
592
+ GSL_TYPE(gsl_vector) *v = NULL;
593
+ BASE min, max;
594
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
595
+ FUNCTION(gsl_vector,minmax)(v, &min, &max);
596
+ return rb_ary_new3(2, C_TO_VALUE2(max), C_TO_VALUE2(min));
597
+ }
598
+
599
+ static VALUE FUNCTION(rb_gsl_vector,max_index)(VALUE obj)
600
+ {
601
+ GSL_TYPE(gsl_vector) *v = NULL;
602
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
603
+ return INT2FIX(FUNCTION(gsl_vector,max_index)(v));
604
+ }
605
+
606
+ static VALUE FUNCTION(rb_gsl_vector,min_index)(VALUE obj)
607
+ {
608
+ GSL_TYPE(gsl_vector) *v = NULL;
609
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
610
+ return INT2FIX(FUNCTION(gsl_vector,min_index)(v));
611
+ }
612
+
613
+ static VALUE FUNCTION(rb_gsl_vector,minmax_index)(VALUE obj)
614
+ {
615
+ GSL_TYPE(gsl_vector) *v = NULL;
616
+ size_t imin, imax;
617
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
618
+ FUNCTION(gsl_vector,minmax_index)(v, &imin, &imax);
619
+ return rb_ary_new3(2, INT2FIX(imin), INT2FIX(imax));
620
+ }
621
+
622
+ static VALUE FUNCTION(rb_gsl_vector,maxmin_index)(VALUE obj)
623
+ {
624
+ GSL_TYPE(gsl_vector) *v = NULL;
625
+ size_t imin, imax;
626
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
627
+ FUNCTION(gsl_vector,minmax_index)(v, &imin, &imax);
628
+ return rb_ary_new3(2, INT2FIX(imax), INT2FIX(imin));
629
+ }
630
+
631
+ static VALUE FUNCTION(rb_gsl_vector,isnull)(VALUE obj)
632
+ {
633
+ GSL_TYPE(gsl_vector) *v = NULL;
634
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
635
+ return INT2FIX(FUNCTION(gsl_vector,isnull)(v));
636
+ }
637
+
638
+ static VALUE FUNCTION(rb_gsl_vector,isnull2)(VALUE obj)
639
+ {
640
+ GSL_TYPE(gsl_vector) *v = NULL;
641
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
642
+ if (FUNCTION(gsl_vector,isnull)(v)) return Qtrue;
643
+ else return Qfalse;
644
+ }
645
+
646
+ static VALUE FUNCTION(rb_gsl_vector,trans)(VALUE obj)
647
+ {
648
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
649
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
650
+ vnew = FUNCTION(make_vector,clone)(v);
651
+ #ifdef BASE_DOUBLE
652
+ if (VECTOR_COL_P(obj))
653
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
654
+ else return Data_Wrap_Struct(cgsl_vector_col, 0, gsl_vector_free, vnew);
655
+ #elif defined(BASE_INT)
656
+ if (VECTOR_INT_ROW_P(obj))
657
+ return Data_Wrap_Struct(cgsl_vector_int_col, 0, gsl_vector_int_free, vnew);
658
+ else if (VECTOR_INT_COL_P(obj))
659
+ return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, vnew);
660
+ else rb_raise(rb_eTypeError,
661
+ "wrong type %s (Vector::Int or Vector::Int::Col expected)",
662
+ rb_class2name(CLASS_OF(obj)));
663
+ #endif
664
+ return Qnil;
665
+ }
666
+
667
+ static VALUE FUNCTION(rb_gsl_vector,trans_bang)(VALUE obj)
668
+ {
669
+ #ifdef BASE_DOUBLE
670
+ if (CLASS_OF(obj) == cgsl_vector) RBASIC(obj)->klass = cgsl_vector_col;
671
+ else if (CLASS_OF(obj) == cgsl_vector_col) RBASIC(obj)->klass = cgsl_vector;
672
+ else {
673
+ rb_raise(rb_eRuntimeError, "method trans! for %s is not permitted.",
674
+ rb_class2name(CLASS_OF(obj)));
675
+ }
676
+ #elif defined(BASE_INT)
677
+ if (CLASS_OF(obj) == cgsl_vector_int) RBASIC(obj)->klass = cgsl_vector_int_col;
678
+ else if (CLASS_OF(obj) == cgsl_vector_int_col) RBASIC(obj)->klass = cgsl_vector_int;
679
+ else {
680
+ rb_raise(rb_eRuntimeError, "method trans! for %s is not permitted.",
681
+ rb_class2name(CLASS_OF(obj)));
682
+ }
683
+ #endif
684
+ return obj;
685
+ }
686
+
687
+ static VALUE FUNCTION(rb_gsl_vector,uplus)(VALUE obj)
688
+ {
689
+ return obj;
690
+ }
691
+
692
+ EXTERN VALUE cgsl_poly;
693
+
694
+ VALUE FUNCTION(rb_gsl_vector,uminus)(VALUE obj)
695
+ {
696
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
697
+ size_t i;
698
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
699
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
700
+ for (i = 0; i < v->size; i++) {
701
+ FUNCTION(gsl_vector,set)(vnew, i, -FUNCTION(gsl_vector,get)(v, i));
702
+ }
703
+ if (CLASS_OF(obj) == GSL_TYPE(cgsl_poly))
704
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), vnew);
705
+ else
706
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
707
+ }
708
+
709
+ static VALUE FUNCTION(rb_gsl_vector,sum)(VALUE obj)
710
+ {
711
+ GSL_TYPE(gsl_vector) *v = NULL;
712
+ BASE sum = 0;
713
+ size_t i;
714
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
715
+ for (i = 0; i < v->size; i++) sum += FUNCTION(gsl_vector,get)(v, i);
716
+ return C_TO_VALUE2(sum);
717
+ }
718
+
719
+ /* Vector#sumsq is defined in blas1.c */
720
+ #ifdef BASE_INT
721
+ static VALUE FUNCTION(rb_gsl_vector,sumsq)(VALUE obj)
722
+ {
723
+ GSL_TYPE(gsl_vector) *v = NULL;
724
+ BASE sum = 0, x;
725
+ size_t i;
726
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
727
+ for (i = 0; i < v->size; i++) {
728
+ x = FUNCTION(gsl_vector,get)(v, i);
729
+ sum += x*x;
730
+ }
731
+ return C_TO_VALUE2(sum);
732
+ }
733
+ #endif
734
+
735
+ static VALUE FUNCTION(rb_gsl_vector,prod)(VALUE obj)
736
+ {
737
+ GSL_TYPE(gsl_vector) *v = NULL;
738
+ BASE x = 1;
739
+ size_t i;
740
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
741
+ for (i = 0; i < v->size; i++) x *= FUNCTION(gsl_vector,get)(v, i);
742
+ return C_TO_VALUE(x);
743
+ }
744
+
745
+ static VALUE FUNCTION(rb_gsl_vector,connect)(int argc, VALUE *argv, VALUE obj)
746
+ {
747
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
748
+ BASE *ptr = NULL;
749
+ size_t i, total = 0;
750
+ if (VEC_P(obj)) {
751
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
752
+ total += v->size;
753
+ }
754
+ for (i = 0; i < argc; i++) {
755
+ CHECK_VEC(argv[i]);
756
+ Data_Get_Struct(argv[i], GSL_TYPE(gsl_vector), v);
757
+ total += v->size;
758
+ }
759
+ vnew = FUNCTION(gsl_vector,alloc)(total);
760
+ ptr = vnew->data;
761
+ if (VEC_P(obj)) {
762
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
763
+ memcpy(ptr, v->data, sizeof(BASE)*v->size);
764
+ ptr += v->size;
765
+ }
766
+ for (i = 0; i < argc; i++) {
767
+ Data_Get_Struct(argv[i], GSL_TYPE(gsl_vector), v);
768
+ memcpy(ptr, v->data, sizeof(BASE)*v->size);
769
+ ptr += v->size;
770
+ }
771
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
772
+ }
773
+
774
+ GSL_TYPE(gsl_vector)* FUNCTION(mygsl_vector,up)(GSL_TYPE(gsl_vector) *p)
775
+ {
776
+ GSL_TYPE(gsl_vector) *pnew;
777
+ pnew = FUNCTION(gsl_vector,alloc)(p->size + 1);
778
+ FUNCTION(gsl_vector,set)(pnew, 0, 0);
779
+ memcpy(pnew->data+1, p->data, sizeof(BASE)*p->size);
780
+ return pnew;
781
+ }
782
+
783
+ void FUNCTION(mygsl_vector,up2)(GSL_TYPE(gsl_vector) *pnew, GSL_TYPE(gsl_vector) *p)
784
+ {
785
+ FUNCTION(gsl_vector,set_all)(pnew, 0);
786
+ memcpy(pnew->data+1, p->data, sizeof(BASE)*p->size);
787
+ }
788
+
789
+ GSL_TYPE(gsl_vector)* FUNCTION(mygsl_vector,down)(GSL_TYPE(gsl_vector) *p)
790
+ {
791
+ GSL_TYPE(gsl_vector) *pnew;
792
+ if (p->size <= 1) {
793
+ rb_raise(rb_eRangeError, "Length <= 1, cannot be shortened.");
794
+ }
795
+ pnew = FUNCTION(gsl_vector,alloc)(p->size - 1);
796
+ memcpy(pnew->data, p->data + 1, sizeof(BASE)*(p->size-1));
797
+ return pnew;
798
+ }
799
+
800
+ static VALUE FUNCTION(rb_gsl_vector,sgn)(VALUE obj)
801
+ {
802
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
803
+ BASE x;
804
+ size_t i;
805
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
806
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
807
+ for (i = 0; i < v->size; i++) {
808
+ x = FUNCTION(gsl_vector,get)(v, i);
809
+ FUNCTION(gsl_vector,set)(vnew, i, (BASE)(x>0 ? 1 : (x<0 ? -1 : 0)));
810
+ }
811
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
812
+ }
813
+
814
+ static VALUE FUNCTION(rb_gsl_vector,abs)(VALUE obj)
815
+ {
816
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
817
+ size_t i;
818
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
819
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
820
+ for (i = 0; i < v->size; i++) {
821
+ FUNCTION(gsl_vector,set)(vnew, i, (BASE) fabs(FUNCTION(gsl_vector,get)(v, i)));
822
+ }
823
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
824
+ }
825
+
826
+ static VALUE FUNCTION(rb_gsl_vector,square)(VALUE obj)
827
+ {
828
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
829
+ size_t i;
830
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
831
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
832
+ for (i = 0; i < v->size; i++) {
833
+ FUNCTION(gsl_vector,set)(vnew, i, gsl_pow_2(FUNCTION(gsl_vector,get)(v, i)));
834
+ }
835
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
836
+ }
837
+
838
+ static VALUE FUNCTION(rb_gsl_vector,sqrt)(VALUE obj)
839
+ {
840
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
841
+ size_t i;
842
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
843
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
844
+ for (i = 0; i < v->size; i++) {
845
+ FUNCTION(gsl_vector,set)(vnew, i, sqrt(FUNCTION(gsl_vector,get)(v, i)));
846
+ }
847
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
848
+ }
849
+
850
+ static VALUE FUNCTION(rb_gsl_vector,memcpy)(VALUE obj, VALUE dest, VALUE src)
851
+ {
852
+ GSL_TYPE(gsl_vector) *vdest = NULL, *vsrc = NULL;
853
+ Data_Get_Struct(dest, GSL_TYPE(gsl_vector), vdest);
854
+ Data_Get_Struct(src, GSL_TYPE(gsl_vector), vsrc);
855
+ FUNCTION(gsl_vector,memcpy)(vdest, vsrc);
856
+ return dest;
857
+ }
858
+
859
+ static VALUE FUNCTION(rb_gsl_vector,clone)(VALUE obj)
860
+ {
861
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
862
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
863
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
864
+ if (vnew == NULL) rb_raise(rb_eNoMemError, "gsl_vector_alloc failed");
865
+ FUNCTION(gsl_vector,memcpy)(vnew, v);
866
+ if (!VEC_VIEW_P(obj))
867
+ return Data_Wrap_Struct(CLASS_OF(obj), 0, FUNCTION(gsl_vector,free), vnew);
868
+ else
869
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
870
+ }
871
+
872
+ /* singleton */
873
+ static VALUE FUNCTION(rb_gsl_vector,swap)(VALUE obj, VALUE vv, VALUE ww)
874
+ {
875
+ GSL_TYPE(gsl_vector) *v = NULL, *w = NULL;
876
+ Data_Get_Struct(vv, GSL_TYPE(gsl_vector), v);
877
+ Data_Get_Struct(ww, GSL_TYPE(gsl_vector), w);
878
+ FUNCTION(gsl_vector,swap)(v, w);
879
+ return obj;
880
+ }
881
+
882
+ static VALUE FUNCTION(rb_gsl_vector,swap_elements)(VALUE obj, VALUE i, VALUE j)
883
+ {
884
+ GSL_TYPE(gsl_vector) *v = NULL;
885
+ CHECK_FIXNUM(i); CHECK_FIXNUM(j);
886
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
887
+ FUNCTION(gsl_vector,swap_elements)(v, FIX2INT(i), FIX2INT(j));
888
+ return obj;
889
+ }
890
+
891
+ static VALUE FUNCTION(rb_gsl_vector,fwrite)(VALUE obj, VALUE io)
892
+ {
893
+ GSL_TYPE(gsl_vector) *h = NULL;
894
+ FILE *f = NULL;
895
+ int status, flag = 0;
896
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), h);
897
+ f = rb_gsl_open_writefile(io, &flag);
898
+ status = FUNCTION(gsl_vector,fwrite)(f, h);
899
+ if (flag == 1) fclose(f);
900
+ return INT2FIX(status);
901
+ }
902
+
903
+ static VALUE FUNCTION(rb_gsl_vector,fread)(VALUE obj, VALUE io)
904
+ {
905
+ GSL_TYPE(gsl_vector) *h = NULL;
906
+ FILE *f = NULL;
907
+ int status, flag = 0;
908
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), h);
909
+ f = rb_gsl_open_readfile(io, &flag);
910
+ status = FUNCTION(gsl_vector,fread)(f, h);
911
+ if (flag == 1) fclose(f);
912
+ return INT2FIX(status);
913
+ }
914
+
915
+ static VALUE FUNCTION(rb_gsl_vector,fprintf)(int argc, VALUE *argv, VALUE obj)
916
+ {
917
+ GSL_TYPE(gsl_vector) *h = NULL;
918
+ FILE *fp = NULL;
919
+ int status, flag = 0;
920
+ if (argc != 1 && argc != 2)
921
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
922
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), h);
923
+ fp = rb_gsl_open_writefile(argv[0], &flag);
924
+ if (argc == 2) {
925
+ if (TYPE(argv[1]) == T_STRING)
926
+ status = FUNCTION(gsl_vector,fprintf)(fp, h, STR2CSTR(argv[1]));
927
+ else
928
+ rb_raise(rb_eTypeError, "argv 2 String expected");
929
+ } else {
930
+ status = FUNCTION(gsl_vector,fprintf)(fp, h, "%g");
931
+ }
932
+ if (flag == 1) fclose(fp);
933
+ return INT2FIX(status);
934
+ }
935
+
936
+ static VALUE FUNCTION(rb_gsl_vector,printf)(int argc, VALUE *argv, VALUE obj)
937
+ {
938
+ GSL_TYPE(gsl_vector) *h = NULL;
939
+ int status;
940
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), h);
941
+ if (argc == 1) {
942
+ if (TYPE(argv[0]) != T_STRING)
943
+ rb_raise(rb_eTypeError, "String expected");
944
+ else
945
+ status = FUNCTION(gsl_vector,fprintf)(stdout, h, STR2CSTR(argv[0]));
946
+ } else {
947
+ status = FUNCTION(gsl_vector,fprintf)(stdout, h, "%g");
948
+ }
949
+ return INT2FIX(status);
950
+ }
951
+
952
+ static VALUE FUNCTION(rb_gsl_vector,fscanf)(VALUE obj, VALUE io)
953
+ {
954
+ GSL_TYPE(gsl_vector) *h = NULL;
955
+ FILE *fp = NULL;
956
+ int status, flag = 0;
957
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), h);
958
+ fp = rb_gsl_open_readfile(io, &flag);
959
+ status = FUNCTION(gsl_vector,fscanf)(fp, h);
960
+ if (flag == 1) fclose(fp);
961
+ return INT2FIX(status);
962
+ }
963
+
964
+ /* 2.Aug.2004 */
965
+ VALUE FUNCTION(rb_gsl_vector,inner_product)(int argc, VALUE *argv, VALUE obj)
966
+ {
967
+ GSL_TYPE(gsl_vector) *v = NULL, *v2 = NULL;
968
+ BASE prod = 0;
969
+ #ifndef BASE_DOUBLE
970
+ size_t i;
971
+ #endif
972
+ switch (TYPE(obj)) {
973
+ case T_MODULE: case T_CLASS: case T_OBJECT:
974
+ if (argc != 2) rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)",
975
+ argc);
976
+ CHECK_VEC(argv[0]);
977
+ CHECK_VEC(argv[1]);
978
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v);
979
+ Data_Get_Struct(argv[1], GSL_TYPE(gsl_vector), v2);
980
+ break;
981
+ default:
982
+ if (argc != 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
983
+ argc);
984
+ CHECK_VEC(argv[0]);
985
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
986
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v2);
987
+ break;
988
+ }
989
+ if (v->size != v2->size) rb_raise(rb_eRangeError, "vector lengths are different.");
990
+ #ifdef BASE_DOUBLE
991
+ gsl_blas_ddot(v, v2, &prod);
992
+ #else
993
+ for (i = 0; i < v->size; i++) {
994
+ prod += FUNCTION(gsl_vector,get)(v, i)*FUNCTION(gsl_vector,get)(v2, i);
995
+ }
996
+ #endif
997
+ return C_TO_VALUE2(prod);
998
+ }
999
+
1000
+ int FUNCTION(rbgsl_vector,equal)(const GSL_TYPE(gsl_vector) *v1, const GSL_TYPE(gsl_vector) *v2, double eps)
1001
+ {
1002
+ size_t i;
1003
+ BASE x, y;
1004
+ if (v1->size != v2->size) return 0;
1005
+ for (i = 0; i < v2->size; i++) {
1006
+ x = FUNCTION(gsl_vector,get)(v1, i);
1007
+ y = FUNCTION(gsl_vector,get)(v2, i);
1008
+ if (fabs(x - y) > eps) return 0;
1009
+ }
1010
+ return 1;
1011
+ }
1012
+
1013
+ #ifdef HAVE_TENSOR_TENSOR_H
1014
+ EXTERN VALUE cgsl_tensor, cgsl_tensor_int;
1015
+ VALUE rb_gsl_tensor_equal(int argc, VALUE *argv, VALUE obj);
1016
+ VALUE rb_gsl_tensor_int_equal(int argc, VALUE *argv, VALUE obj);
1017
+ #ifdef BASE_DOUBLE
1018
+ #define TEN_P(x) TENSOR_P(x)
1019
+ #else
1020
+ #define TEN_P(x) TENSOR_INT_P(x)
1021
+ #endif
1022
+ #endif
1023
+
1024
+ static VALUE FUNCTION(rb_gsl_vector,equal)(int argc, VALUE *argv, VALUE obj)
1025
+ {
1026
+ GSL_TYPE(gsl_vector) *v1, *v2;
1027
+ VALUE other;
1028
+ size_t i;
1029
+ double eps = 1e-10;
1030
+ double x;
1031
+ switch (argc) {
1032
+ case 2:
1033
+ other = argv[0];
1034
+ eps = NUM2DBL(argv[1]);
1035
+ break;
1036
+ case 1:
1037
+ other = argv[0];
1038
+ break;
1039
+ default:
1040
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
1041
+ break;
1042
+ }
1043
+ #ifdef HAVE_TENSOR_TENSOR_H
1044
+ if (TEN_P(other)) {
1045
+ return FUNCTION(rb_gsl_tensor,equal)(argc, argv, obj);
1046
+ }
1047
+ #endif
1048
+ switch (TYPE(other)) {
1049
+ case T_FIXNUM:
1050
+ case T_FLOAT:
1051
+ x = NUM2DBL(other);
1052
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v1);
1053
+ for (i = 0; i < v1->size; i++)
1054
+ if (fabs(x-FUNCTION(gsl_vector,get)(v1, i)) > eps) return Qfalse;
1055
+ return Qtrue;
1056
+ break;
1057
+ default:
1058
+ CHECK_VEC(other);
1059
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v1);
1060
+ Data_Get_Struct(other, GSL_TYPE(gsl_vector), v2);
1061
+ if (FUNCTION(rbgsl_vector,equal)(v1, v2, eps)) return Qtrue;
1062
+ else return Qfalse;
1063
+ break;
1064
+ }
1065
+ return Qnil;
1066
+ }
1067
+
1068
+ #ifdef HAVE_TENSOR_TENSOR_H
1069
+ #ifdef TEN_P
1070
+ #undef TEN_P
1071
+ #endif
1072
+ #endif
1073
+
1074
+ static VALUE FUNCTION(rb_gsl_vector,to_poly)(VALUE obj)
1075
+ {
1076
+ GSL_TYPE(gsl_vector) *v = NULL;
1077
+ GSL_TYPE(gsl_poly) *p = NULL;
1078
+ if (CLASS_OF(obj) == GSL_TYPE(cgsl_poly)) return obj;
1079
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1080
+ p = FUNCTION(make_vector,clone)(v);
1081
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_poly), 0, FUNCTION(gsl_vector,free), p);
1082
+ }
1083
+
1084
+ static VALUE FUNCTION(rb_gsl_vector,graph)(int argc, VALUE *argv, VALUE obj)
1085
+ {
1086
+ #ifdef HAVE_GNU_GRAPH
1087
+ GSL_TYPE(gsl_vector) *x = NULL, *y = NULL;
1088
+ FILE *fp = NULL;
1089
+ size_t i;
1090
+ char command[1024];
1091
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), y);
1092
+ switch (argc) {
1093
+ case 0:
1094
+ strcpy(command, "graph -T X -g 3");
1095
+ break;
1096
+ case 1:
1097
+ if (TYPE(argv[0]) == T_STRING) {
1098
+ make_graphcommand(command, argv[0]);
1099
+ } else if (VEC_P(argv[0])) {
1100
+ strcpy(command, "graph -T X -g 3");
1101
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
1102
+ } else {
1103
+ }
1104
+ break;
1105
+ case 2:
1106
+ if (TYPE(argv[1]) == T_STRING) {
1107
+ make_graphcommand(command, argv[1]);
1108
+ if (VEC_P(argv[0])) {
1109
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
1110
+ } else {
1111
+ rb_raise(rb_eTypeError, "argv[0] wrong type %s (String or Vector expected)",
1112
+ rb_class2name(CLASS_OF(argv[0])));
1113
+ }
1114
+ } else {
1115
+ rb_raise(rb_eTypeError, "argv[1] wrong type %s (String or Vector expected)",
1116
+ rb_class2name(CLASS_OF(argv[1])));
1117
+ }
1118
+ break;
1119
+ default:
1120
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
1121
+ break;
1122
+ }
1123
+ if (y == NULL) rb_raise(rb_eRuntimeError, "ydata not given");
1124
+ fp = popen(command, "w");
1125
+ for (i = 0; i < y->size; i++) {
1126
+ if (x == NULL)
1127
+ fprintf(fp, "%d %e\n", (int) i, (double) FUNCTION(gsl_vector,get)(y, i));
1128
+ else
1129
+ fprintf(fp, "%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i), (double) FUNCTION(gsl_vector,get)(y, i));
1130
+ }
1131
+ fflush(fp);
1132
+ pclose(fp);
1133
+ fp = NULL;
1134
+ return Qtrue;
1135
+ #else
1136
+ rb_raise(rb_eNoMethodError, "not implemented");
1137
+ return Qfalse;
1138
+ #endif
1139
+ }
1140
+
1141
+ static VALUE FUNCTION(rb_gsl_vector,graph_step)(int argc, VALUE *argv, VALUE obj)
1142
+ {
1143
+ #ifdef HAVE_GNU_GRAPH
1144
+ GSL_TYPE(gsl_vector) *x = NULL, *y = NULL;
1145
+ FILE *fp = NULL;
1146
+ size_t i;
1147
+ char command[1024];
1148
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), y);
1149
+ switch (argc) {
1150
+ case 0:
1151
+ strcpy(command, "graph -T X -g 3");
1152
+ break;
1153
+ case 1:
1154
+ if (TYPE(argv[0]) == T_STRING) {
1155
+ make_graphcommand(command, argv[0]);
1156
+ } else if (VECTOR_P(argv[0])) {
1157
+ strcpy(command, "graph -T X -g 3");
1158
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
1159
+ } else {
1160
+ }
1161
+ break;
1162
+ case 2:
1163
+ if (TYPE(argv[1]) == T_STRING) {
1164
+ make_graphcommand(command, argv[1]);
1165
+ if (VEC_P(argv[0])) {
1166
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
1167
+ } else {
1168
+ rb_raise(rb_eTypeError, "argv[0] wrong type %s (String or Vector expected)",
1169
+ rb_class2name(CLASS_OF(argv[0])));
1170
+ }
1171
+ } else {
1172
+ rb_raise(rb_eTypeError, "argv[1] wrong type %s (String or Vector expected)",
1173
+ rb_class2name(CLASS_OF(argv[1])));
1174
+ }
1175
+ break;
1176
+ default:
1177
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
1178
+ break;
1179
+ }
1180
+ if (y == NULL) rb_raise(rb_eRuntimeError, "ydata not given");
1181
+ fp = popen(command, "w");
1182
+ for (i = 0; i < y->size; i++) {
1183
+ if (x == NULL) {
1184
+ fprintf(fp, "%d %e\n%d %e\n", (int) i, (double) FUNCTION(gsl_vector,get)(y, i),
1185
+ (int) (i+1), (double) FUNCTION(gsl_vector,get)(y, i));
1186
+ } else {
1187
+ if (i != y->size-1)
1188
+ fprintf(fp, "%e %e\n%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i),
1189
+ (double) FUNCTION(gsl_vector,get)(y, i),
1190
+ (double) FUNCTION(gsl_vector,get)(x, i+1),
1191
+ (double) FUNCTION(gsl_vector,get)(y, i));
1192
+ else
1193
+ fprintf(fp, "%e %e\n%e %e",
1194
+ (double) FUNCTION(gsl_vector,get)(x, i),
1195
+ (double) FUNCTION(gsl_vector,get)(y, i),
1196
+ 2.0*FUNCTION(gsl_vector,get)(x, i)-FUNCTION(gsl_vector,get)(x, i-1),
1197
+ (double) FUNCTION(gsl_vector,get)(y, i));
1198
+ }
1199
+ }
1200
+ fflush(fp);
1201
+ pclose(fp);
1202
+ fp = NULL;
1203
+ return Qtrue;
1204
+ #else
1205
+ rb_raise(rb_eNoMethodError, "not implemented");
1206
+ return Qfalse;
1207
+ #endif
1208
+ }
1209
+
1210
+ static VALUE FUNCTION(rb_gsl_vector,plot)(int argc, VALUE *argv, VALUE obj)
1211
+ {
1212
+ GSL_TYPE(gsl_vector) *x = NULL, *y = NULL;
1213
+ FILE *fp = NULL;
1214
+ size_t i;
1215
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), y);
1216
+ fp = popen("gnuplot -persist", "w");
1217
+ switch (argc) {
1218
+ case 0:
1219
+ fprintf(fp, "plot '-'\n");
1220
+ break;
1221
+ case 1:
1222
+ if (TYPE(argv[0]) == T_STRING) {
1223
+ fprintf(fp, "plot '-' %s\n", STR2CSTR(argv[0]));
1224
+ } else if (VEC_P(argv[0])) {
1225
+ fprintf(fp, "plot '-'\n");
1226
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
1227
+ } else {
1228
+ rb_raise(rb_eTypeError, "wrong argument type %s (String or Vector expected)",
1229
+ rb_class2name(CLASS_OF(argv[0])));
1230
+ }
1231
+ break;
1232
+ case 2:
1233
+ if (TYPE(argv[1]) == T_STRING)
1234
+ fprintf(fp, "plot '-' %s\n", STR2CSTR(argv[1]));
1235
+ if (VEC_P(argv[0]))
1236
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), x);
1237
+ break;
1238
+ default:
1239
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
1240
+ break;
1241
+ }
1242
+ if (y == NULL) rb_raise(rb_eRuntimeError, "ydata not given");
1243
+ for (i = 0; i < y->size; i++) {
1244
+ if (x == NULL)
1245
+ fprintf(fp, "%d %e\n", (int) i, (double) FUNCTION(gsl_vector,get)(y, i));
1246
+ else
1247
+ fprintf(fp, "%e %e\n", (double) FUNCTION(gsl_vector,get)(x, i),
1248
+ (double) FUNCTION(gsl_vector,get)(y, i));
1249
+ }
1250
+ fprintf(fp, "e\n");
1251
+ fflush(fp);
1252
+ pclose(fp);
1253
+ fp = NULL;
1254
+ return Qtrue;
1255
+ }
1256
+
1257
+ void FUNCTION(gsl_vector,print)(const GSL_TYPE(gsl_vector) *v, VALUE klass)
1258
+ {
1259
+ size_t i;
1260
+ printf("[ ");
1261
+ if (klass == cgsl_vector_col || klass == cgsl_vector_col_view
1262
+ || klass == cgsl_vector_col_view_ro
1263
+ || klass == cgsl_vector_int_col || klass == cgsl_vector_int_col_view
1264
+ || klass == cgsl_vector_int_col_view_ro) {
1265
+ printf(PRINTF_FORMAT, FUNCTION(gsl_vector,get)(v, 0));
1266
+ for (i = 1; i < v->size; i++) {
1267
+ printf(PRINTF_FORMAT, FUNCTION(gsl_vector,get)(v, i));
1268
+ if (i != v->size-1) printf("\n");
1269
+ }
1270
+ } else {
1271
+ for (i = 0; i < v->size; i++) printf(PRINTF_FORMAT, FUNCTION(gsl_vector,get)(v, i));
1272
+ }
1273
+ printf("]\n");
1274
+ }
1275
+
1276
+ VALUE FUNCTION(rb_gsl_vector,print)(VALUE obj)
1277
+ {
1278
+ GSL_TYPE(gsl_vector) *v = NULL;
1279
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1280
+ FUNCTION(gsl_vector,print)(v, CLASS_OF(obj));
1281
+ return Qnil;
1282
+ }
1283
+
1284
+ #ifdef BASE_DOUBLE
1285
+ #define SHOW_ELM 6
1286
+ #else
1287
+ #define SHOW_ELM 15
1288
+ #endif
1289
+
1290
+ VALUE FUNCTION(rb_gsl_vector,to_s)(VALUE obj)
1291
+ {
1292
+ GSL_TYPE(gsl_vector) *v = NULL;
1293
+ char buf[32], format[32], format2[32];
1294
+ size_t i;
1295
+ VALUE str;
1296
+ BASE x, min;
1297
+ int dig = 8;
1298
+ #ifdef BASE_INT
1299
+ BASE max;
1300
+ dig = 1;
1301
+ #endif
1302
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1303
+ if (v->size == 0) return rb_str_new2("[ ]");
1304
+ min = FUNCTION(gsl_vector,min)(v);
1305
+ str = rb_str_new2("[ ");
1306
+ if (VEC_COL_P(obj)) {
1307
+ #ifdef BASE_INT
1308
+ max = gsl_vector_int_max(v);
1309
+ dig = (int) GSL_MAX(fabs(max),fabs(min));
1310
+ if (dig > 0) dig = ceil(log10(dig+1e-10));
1311
+ else dig = 1;
1312
+ if (min < 0) dig += 1;
1313
+ sprintf(format, "%%%dd ", (int) dig);
1314
+ strcpy(format2, format);
1315
+ #else
1316
+ strcpy(format, PRINTF_FORMAT);
1317
+ strcpy(format2, " "PRINTF_FORMAT);
1318
+ #endif
1319
+ for (i = 0; i < v->size; i++) {
1320
+ if (i != 0) {
1321
+ strcpy(buf, " ");
1322
+ rb_str_cat(str, buf, strlen(buf));
1323
+ }
1324
+ x = FUNCTION(gsl_vector,get)(v, i);
1325
+ if (x < 0) sprintf(buf, format, x);
1326
+ else sprintf(buf, format2, x);
1327
+ if (i != v->size-1) strcat(buf, "\n");
1328
+ rb_str_cat(str, buf, strlen(buf));
1329
+ if (i >= 20 && i != v->size-1) {
1330
+ strcpy(buf, " ...");
1331
+ rb_str_cat(str, buf, strlen(buf));
1332
+ break;
1333
+ }
1334
+ }
1335
+ } else {
1336
+ sprintf(buf, PRINTF_FORMAT, FUNCTION(gsl_vector,get)(v, 0));
1337
+ rb_str_cat(str, buf, strlen(buf));
1338
+ for (i = 1; i < v->size; i++) {
1339
+ sprintf(buf, PRINTF_FORMAT, FUNCTION(gsl_vector,get)(v, i));
1340
+ rb_str_cat(str, buf, strlen(buf));
1341
+ if (i >= (55/dig) && i != v->size-1) {
1342
+ strcpy(buf, "... ");
1343
+ rb_str_cat(str, buf, strlen(buf));
1344
+ break;
1345
+ }
1346
+ }
1347
+ }
1348
+ sprintf(buf, "]");
1349
+ rb_str_cat(str, buf, strlen(buf));
1350
+ return str;
1351
+ }
1352
+ #undef SHOW_ELM
1353
+
1354
+ static VALUE FUNCTION(rb_gsl_vector,inspect)(VALUE obj)
1355
+ {
1356
+ VALUE str;
1357
+ char buf[64];
1358
+ sprintf(buf, "%s\n", rb_class2name(CLASS_OF(obj)));
1359
+ str = rb_str_new2(buf);
1360
+ return rb_str_concat(str, FUNCTION(rb_gsl_vector,to_s)(obj));
1361
+ }
1362
+
1363
+ static VALUE FUNCTION(rb_gsl_vector,subvector)(int argc, VALUE *argv, VALUE obj)
1364
+ {
1365
+ GSL_TYPE(gsl_vector) *v = NULL;
1366
+ QUALIFIED_VIEW(gsl_vector,view) *vv = NULL;
1367
+ size_t offset, stride, n;
1368
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1369
+ parse_subvector_args(argc, argv, v->size, &offset, &stride, &n);
1370
+ vv = ALLOC(QUALIFIED_VIEW(gsl_vector,view));
1371
+ *vv = FUNCTION(gsl_vector,subvector_with_stride)(v, offset, stride, n);
1372
+ if (VEC_COL_P(obj))
1373
+ return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,col_view), 0, free, vv);
1374
+ else
1375
+ return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,view), 0, free, vv);
1376
+ }
1377
+
1378
+ static VALUE FUNCTION(rb_gsl_vector,subvector_with_stride)(int argc, VALUE *argv, VALUE obj)
1379
+ {
1380
+ GSL_TYPE(gsl_vector) *v = NULL;
1381
+ QUALIFIED_VIEW(gsl_vector,view) *vv = NULL;
1382
+ int offset = 0, step, length;
1383
+ size_t stride = 1, n;
1384
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1385
+ switch (argc) {
1386
+ case 1:
1387
+ CHECK_FIXNUM(argv[0]);
1388
+ step = FIX2INT(argv[0]);
1389
+ if(step == 0) {
1390
+ rb_raise(rb_eArgError, "stride must be non-zero");
1391
+ }
1392
+ stride = (size_t)step;
1393
+ //n = v->size/stride;
1394
+ n = (v->size-1)/stride + 1;
1395
+ break;
1396
+ case 2:
1397
+ CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]);
1398
+ offset = FIX2INT(argv[0]);
1399
+ step = FIX2INT(argv[1]);
1400
+ if(offset < 0) {
1401
+ offset += v->size;
1402
+ if(offset < 0) {
1403
+ rb_raise(rb_eRangeError, "offset %d out of range", offset - (int)v->size);
1404
+ }
1405
+ } else if(offset >= v->size) {
1406
+ rb_raise(rb_eRangeError, "offset %d out of range", offset);
1407
+ }
1408
+ if(step == 0) {
1409
+ rb_raise(rb_eArgError, "stride must be non-zero");
1410
+ }
1411
+ stride = (size_t)step;
1412
+ //n = (v->size-(size_t)offset)/stride;
1413
+ n = (v->size-(size_t)offset-1)/stride + 1;
1414
+ break;
1415
+ case 3:
1416
+ CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[2]);
1417
+ offset = FIX2INT(argv[0]);
1418
+ step = FIX2INT(argv[1]);
1419
+ length = FIX2INT(argv[2]);
1420
+ if(offset < 0) {
1421
+ offset += v->size;
1422
+ if(offset < 0) {
1423
+ rb_raise(rb_eRangeError, "offset %d out of range", offset - (int)v->size);
1424
+ }
1425
+ }
1426
+ if(step == 0) {
1427
+ rb_raise(rb_eArgError, "stride must be non-zero");
1428
+ }
1429
+ if(length < 0) {
1430
+ rb_raise(rb_eArgError, "length must be non-negative");
1431
+ }
1432
+ stride = (size_t)step;
1433
+ n = (size_t)length;
1434
+ break;
1435
+ default:
1436
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 - 3)", argc);
1437
+ break;
1438
+ }
1439
+ vv = ALLOC(QUALIFIED_VIEW(gsl_vector,view));
1440
+ *vv = FUNCTION(gsl_vector,subvector_with_stride)(v, (size_t)offset, stride, n);
1441
+ if (VEC_COL_P(obj))
1442
+ return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,col_view), 0, free, vv);
1443
+ else
1444
+ return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_vector,view), 0, free, vv);
1445
+ }
1446
+
1447
+ static VALUE FUNCTION(rb_gsl_vector,matrix_view)(int argc, VALUE *argv, VALUE obj)
1448
+ {
1449
+ GSL_TYPE(gsl_vector) *v = NULL;
1450
+ QUALIFIED_VIEW(gsl_matrix,view) *mv = NULL;
1451
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1452
+ switch (argc) {
1453
+ case 2:
1454
+ mv = ALLOC(QUALIFIED_VIEW(gsl_matrix,view));
1455
+ *mv = FUNCTION(gsl_matrix,view_vector)(v, FIX2INT(argv[0]), FIX2INT(argv[1]));
1456
+ break;
1457
+ case 3:
1458
+ mv = ALLOC(QUALIFIED_VIEW(gsl_matrix,view));
1459
+ *mv = FUNCTION(gsl_matrix,view_vector_with_tda)(v, FIX2INT(argv[0]), FIX2INT(argv[1]),
1460
+ FIX2INT(argv[2]));
1461
+ break;
1462
+ default:
1463
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
1464
+ break;
1465
+ }
1466
+ return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_matrix,view), 0, free, mv);
1467
+ }
1468
+
1469
+ static VALUE FUNCTION(rb_gsl_vector,matrix_view_with_tda)(VALUE obj, VALUE nn1, VALUE nn2,
1470
+ VALUE tda)
1471
+ {
1472
+ GSL_TYPE(gsl_vector) *v = NULL;
1473
+ QUALIFIED_VIEW(gsl_matrix,view) *mv = NULL;
1474
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1475
+ mv = ALLOC(QUALIFIED_VIEW(gsl_matrix,view));
1476
+ *mv = FUNCTION(gsl_matrix,view_vector_with_tda)(v, FIX2INT(nn1), FIX2INT(nn2), FIX2INT(tda));
1477
+ return Data_Wrap_Struct(QUALIFIED_VIEW(cgsl_matrix,view), 0, free, mv);
1478
+ }
1479
+
1480
+ void FUNCTION(mygsl_vector,shift)(GSL_TYPE(gsl_vector) *p, size_t n)
1481
+ {
1482
+ size_t i;
1483
+ for (i = n; i >= 0; i--) {
1484
+ FUNCTION(gsl_vector,set)(p, i+1, FUNCTION(gsl_vector,get)(p, i));
1485
+ if (i == 0) break;
1486
+ }
1487
+ FUNCTION(gsl_vector,set)(p, 0, 0);
1488
+ }
1489
+
1490
+ void FUNCTION(mygsl_vector,shift_scale2)(GSL_TYPE(gsl_vector) *p, size_t n)
1491
+ {
1492
+ size_t i;
1493
+ for (i = n; i >= 0; i--) {
1494
+ FUNCTION(gsl_vector,set)(p, i+1, 2*FUNCTION(gsl_vector,get)(p, i));
1495
+ if (i == 0) break;
1496
+ }
1497
+ FUNCTION(gsl_vector,set)(p, 0, 0);
1498
+ }
1499
+
1500
+ GSL_TYPE(gsl_vector)* FUNCTION(make_vector,clone)(const GSL_TYPE(gsl_vector) *v)
1501
+ {
1502
+ GSL_TYPE(gsl_vector) *vnew = NULL;
1503
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
1504
+ if (v->stride == 1) memcpy(vnew->data, v->data, sizeof(BASE)*v->size);
1505
+ else FUNCTION(gsl_vector,memcpy)(vnew, v);
1506
+ return vnew;
1507
+ }
1508
+
1509
+ VALUE FUNCTION(rb_gsl_vector,scale)(VALUE obj, VALUE x)
1510
+ {
1511
+ GSL_TYPE(gsl_vector) *v, *vnew;
1512
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1513
+ vnew = FUNCTION(make_vector,clone)(v);
1514
+ FUNCTION(gsl_vector,scale)(vnew, NUMCONV(x));
1515
+ // return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
1516
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
1517
+ }
1518
+
1519
+ VALUE FUNCTION(rb_gsl_vector,scale_bang)(VALUE obj, VALUE x)
1520
+ {
1521
+ GSL_TYPE(gsl_vector) *v = NULL;
1522
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1523
+ FUNCTION(gsl_vector,scale)(v, NUMCONV(x));
1524
+ return obj;
1525
+ }
1526
+
1527
+ VALUE FUNCTION(rb_gsl_vector,add_constant)(VALUE obj, VALUE x)
1528
+ {
1529
+ GSL_TYPE(gsl_vector) *v, *vnew;
1530
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1531
+ vnew = FUNCTION(make_vector,clone)(v);
1532
+ FUNCTION(gsl_vector,add_constant)(vnew, NUMCONV(x));
1533
+ // return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
1534
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
1535
+ }
1536
+
1537
+ VALUE FUNCTION(rb_gsl_vector,add_constant_bang)(VALUE obj, VALUE x)
1538
+ {
1539
+ GSL_TYPE(gsl_vector) *v = NULL;
1540
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1541
+ FUNCTION(gsl_vector,add_constant)(v, NUMCONV(x));
1542
+ return obj;
1543
+ }
1544
+
1545
+ QUALIFIED_VIEW(gsl_vector,view)* FUNCTION(rb_gsl_make_vector,view)(BASE *data, size_t size, size_t stride)
1546
+ {
1547
+ QUALIFIED_VIEW(gsl_vector,view) *v = NULL;
1548
+ v = ALLOC(QUALIFIED_VIEW(gsl_vector,view));
1549
+ v->vector.size = size;
1550
+ v->vector.stride = stride;
1551
+ v->vector.owner = 0;
1552
+ v->vector.data = data;
1553
+ return v;
1554
+ }
1555
+
1556
+ #ifdef HAVE_TENSOR_TENSOR_H
1557
+ #include "rb_gsl_tensor.h"
1558
+ static VALUE FUNCTION(rb_gsl_vector,to_tensor)(int argc, VALUE *argv, VALUE obj)
1559
+ {
1560
+ GSL_TYPE(gsl_vector) *v = NULL;
1561
+ GSL_TYPE(rbgsl_tensor) *t;
1562
+ unsigned int rank;
1563
+ size_t dim;
1564
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1565
+ switch (argc) {
1566
+ case 0:
1567
+ rank = 1;
1568
+ dim = v->size;
1569
+ break;
1570
+ case 2:
1571
+ rank = FIX2UINT(argv[0]);
1572
+ dim = FIX2UINT(argv[1]);
1573
+ break;
1574
+ default:
1575
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 2)", argc);
1576
+ break;
1577
+ }
1578
+ t = FUNCTION(rbgsl_tensor,alloc)(rank, dim);
1579
+ memcpy(t->tensor->data, v->data, sizeof(BASE)*v->size);
1580
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_tensor), 0, FUNCTION(rbgsl_tensor,free), t);
1581
+ }
1582
+ #endif
1583
+
1584
+ #ifdef BASE_DOUBLE
1585
+ #define PRINTF_FORMAT2 "%g "
1586
+ #else
1587
+ #define PRINTF_FORMAT2 "%d "
1588
+ #endif
1589
+ static VALUE FUNCTION(rb_gsl_vector,to_gplot)(int argc, VALUE *argv, VALUE obj)
1590
+ {
1591
+ char buf[1024] = "";
1592
+ size_t i, j, len = 0, nv, istart;
1593
+ VALUE str, tmp;
1594
+ GSL_TYPE(gsl_vector) *v, **vp;
1595
+ switch (TYPE(obj)) {
1596
+ case T_MODULE: case T_CLASS: case T_OBJECT:
1597
+ if (argc < 1) rb_raise(rb_eArgError, "no vectors given");
1598
+ if (TYPE(argv[0]) == T_ARRAY) nv = RARRAY_LEN(argv[0]);
1599
+ else nv = argc;
1600
+ vp = (GSL_TYPE(gsl_vector)**) ALLOC_N(GSL_TYPE(gsl_vector)*, nv);
1601
+ istart = 0;
1602
+ break;
1603
+ default:
1604
+ CHECK_VEC(obj);
1605
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1606
+ if (argc >= 1 && TYPE(argv[0]) == T_ARRAY) nv = 1 + RARRAY_LEN(argv[0]);
1607
+ else nv = argc + 1;
1608
+ vp = (GSL_TYPE(gsl_vector)**) ALLOC_N(GSL_TYPE(gsl_vector)*, nv);
1609
+ vp[0] = v; len = v->size;
1610
+ istart = 1;
1611
+ break;
1612
+ }
1613
+ for (i = 0; i < argc; i++) {
1614
+ if (TYPE(argv[0]) == T_ARRAY) tmp = rb_ary_entry(argv[0], i);
1615
+ else tmp = argv[i];
1616
+ CHECK_VEC(tmp);
1617
+ Data_Get_Struct(tmp, GSL_TYPE(gsl_vector), v);
1618
+ if (len == 0) len = v->size;
1619
+ if (len != v->size)
1620
+ rb_raise(rb_eRuntimeError, "vectors must have equal lengths");
1621
+ vp[i+istart] = v;
1622
+ }
1623
+ str = rb_str_new2(buf);
1624
+ for (j = 0; j < len; j++) {
1625
+ for (i = 0; i < nv; i++) {
1626
+ sprintf(buf, PRINTF_FORMAT2, FUNCTION(gsl_vector,get)(vp[i], j));
1627
+ rb_str_buf_cat(str, buf, strlen(buf));
1628
+ }
1629
+ rb_str_buf_cat2(str, "\n");
1630
+ }
1631
+ rb_str_buf_cat2(str, "\n");
1632
+ free((GSL_TYPE(gsl_vector)**)vp);
1633
+ return str;
1634
+ }
1635
+ #undef PRINTF_FORMAT2
1636
+
1637
+ static VALUE FUNCTION(rb_gsl_vector,to_m_diagonal)(VALUE obj)
1638
+ {
1639
+ GSL_TYPE(gsl_vector) *v = NULL;
1640
+ GSL_TYPE(gsl_matrix) *m = NULL;
1641
+ size_t i;
1642
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1643
+ m = FUNCTION(gsl_matrix,calloc)(v->size, v->size);
1644
+ for (i = 0; i < v->size; i++)
1645
+ FUNCTION(gsl_matrix,set)(m, i, i, FUNCTION(gsl_vector,get)(v, i));
1646
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_matrix), 0, FUNCTION(gsl_matrix,free), m);
1647
+ }
1648
+
1649
+ static VALUE FUNCTION(rb_gsl_vector,collect)(VALUE obj)
1650
+ {
1651
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew;
1652
+ size_t i;
1653
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1654
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
1655
+ for (i = 0; i < v->size; i++) {
1656
+ FUNCTION(gsl_vector,set)(vnew, i, NUMCONV(rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))));
1657
+ }
1658
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
1659
+ }
1660
+
1661
+ /* 2004/May/03 */
1662
+ static VALUE FUNCTION(rb_gsl_vector,collect_bang)(VALUE obj)
1663
+ {
1664
+ GSL_TYPE(gsl_vector) *v = NULL;
1665
+ size_t i;
1666
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1667
+ for (i = 0; i < v->size; i++) {
1668
+ FUNCTION(gsl_vector,set)(v, i, NUMCONV(rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))));
1669
+ }
1670
+ return obj;
1671
+ }
1672
+
1673
+ /* Modified 2006/Sep/26 */
1674
+ GSL_TYPE(gsl_vector)* FUNCTION(mygsl_vector,mul_matrix)(GSL_TYPE(gsl_vector) *v,
1675
+ GSL_TYPE(gsl_matrix) *m)
1676
+ {
1677
+ GSL_TYPE(gsl_vector) *vnew;
1678
+ size_t i, j;
1679
+ BASE sum;
1680
+ if (v->size != m->size1) rb_raise(rb_eRuntimeError, "vector/matrix sizes are different.");
1681
+ vnew = FUNCTION(gsl_vector,alloc)(m->size2);
1682
+ for (i = 0; i < m->size2; i++) {
1683
+ sum = 0;
1684
+ for (j = 0; j < m->size1; j++) {
1685
+ sum += FUNCTION(gsl_vector,get)(v, j)*FUNCTION(gsl_matrix,get)(m, j, i);
1686
+ }
1687
+ FUNCTION(gsl_vector,set)(vnew, i, sum);
1688
+ }
1689
+ return vnew;
1690
+ }
1691
+
1692
+ void FUNCTION(mygsl_vector,to_m_circulant)(GSL_TYPE(gsl_matrix) *m, GSL_TYPE(gsl_vector) *v)
1693
+ {
1694
+ size_t i, j;
1695
+ for (i = v->size-1; i >= 0; i--) {
1696
+ for (j = 0; j < v->size; j++) {
1697
+ if (j <= i) FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, v->size-1-i+j));
1698
+ else FUNCTION(gsl_matrix,set)(m, i, j, FUNCTION(gsl_vector,get)(v, j-i-1));
1699
+ }
1700
+ if (i == 0) break;
1701
+ }
1702
+ }
1703
+
1704
+ static VALUE FUNCTION(rb_gsl_vector,to_m_circulant)(VALUE obj)
1705
+ {
1706
+ GSL_TYPE(gsl_matrix) *m;
1707
+ GSL_TYPE(gsl_vector) *v = NULL;
1708
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1709
+ m = FUNCTION(gsl_matrix,alloc)(v->size, v->size);
1710
+ FUNCTION(mygsl_vector,to_m_circulant)(m, v);
1711
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_matrix), 0, FUNCTION(gsl_matrix,free), m);
1712
+ }
1713
+
1714
+ static void FUNCTION(mygsl_vector,indgen)(GSL_TYPE(gsl_vector) *v,
1715
+ BASE start, BASE step)
1716
+ {
1717
+ size_t k = 0;
1718
+ BASE i;
1719
+ i = start;
1720
+ for (k = 0; k < v->size; k++) {
1721
+ FUNCTION(gsl_vector,set)(v, k, i);
1722
+ i += step;
1723
+ }
1724
+ }
1725
+
1726
+ static VALUE FUNCTION(rb_gsl_vector,indgen_singleton)(int argc, VALUE *argv, VALUE obj)
1727
+ {
1728
+ GSL_TYPE(gsl_vector) *v = NULL;
1729
+ size_t n;
1730
+ BASE start = 0, step = 1;
1731
+ switch (argc) {
1732
+ case 3:
1733
+ step = NUMCONV2(argv[2]);
1734
+ /* no break */
1735
+ case 2:
1736
+ start = NUMCONV2(argv[1]);
1737
+ /* no break */
1738
+ case 1:
1739
+ n = NUM2INT(argv[0]);
1740
+ break;
1741
+ default:
1742
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1-3)", argc);
1743
+ break;
1744
+ }
1745
+ v = FUNCTION(gsl_vector,alloc)(n);
1746
+ FUNCTION(mygsl_vector,indgen)(v, start, step);
1747
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), v);
1748
+ }
1749
+
1750
+ static VALUE FUNCTION(rb_gsl_vector,indgen)(int argc, VALUE *argv, VALUE obj)
1751
+ {
1752
+ GSL_TYPE(gsl_vector) *v, *vnew;
1753
+ BASE start = 0, step = 1;
1754
+ switch (argc) {
1755
+ case 2:
1756
+ step = NUMCONV2(argv[1]);
1757
+ /* no break */
1758
+ case 1:
1759
+ start = NUMCONV2(argv[0]);
1760
+ break;
1761
+ case 0:
1762
+ break;
1763
+ default:
1764
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0-2)", argc);
1765
+ break;
1766
+ }
1767
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1768
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
1769
+ FUNCTION(mygsl_vector,indgen)(vnew, start, step);
1770
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
1771
+ }
1772
+
1773
+ static VALUE FUNCTION(rb_gsl_vector,indgen_bang)(int argc, VALUE *argv, VALUE obj)
1774
+ {
1775
+ GSL_TYPE(gsl_vector) *v = NULL;
1776
+ BASE start = 0, step = 1;
1777
+ switch (argc) {
1778
+ case 2:
1779
+ step = NUMCONV2(argv[1]);
1780
+ /* no break */
1781
+ case 1:
1782
+ start = NUMCONV2(argv[0]);
1783
+ break;
1784
+ case 0:
1785
+ break;
1786
+ default:
1787
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0-2)", argc);
1788
+ break;
1789
+ }
1790
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1791
+ FUNCTION(mygsl_vector,indgen)(v, start, step);
1792
+ return obj;
1793
+ }
1794
+
1795
+ static VALUE FUNCTION(rb_gsl_vector,to_m)(VALUE obj, VALUE ii, VALUE jj)
1796
+ {
1797
+ GSL_TYPE(gsl_matrix) *m;
1798
+ GSL_TYPE(gsl_vector) *v = NULL;
1799
+ size_t i, j, n;
1800
+ CHECK_FIXNUM(ii); CHECK_FIXNUM(jj);
1801
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1802
+ i = (size_t) FIX2INT(ii); j = (size_t) FIX2INT(jj);
1803
+ n = i*j;
1804
+ m = FUNCTION(gsl_matrix,alloc)(i, j);
1805
+ memcpy(m->data, v->data, sizeof(BASE)*v->size);
1806
+ for (i = n; i < v->size; i++) m->data[i] = (BASE) 0;
1807
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_matrix), 0, FUNCTION(gsl_matrix,free), m);
1808
+ }
1809
+
1810
+ static VALUE FUNCTION(rb_gsl_vector,block)(VALUE obj)
1811
+ {
1812
+ GSL_TYPE(gsl_vector) *v = NULL;
1813
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1814
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, NULL, v->block);
1815
+ }
1816
+
1817
+ /*****/
1818
+ static VALUE GSL_TYPE(rb_gsl_sort_vector)(VALUE obj)
1819
+ {
1820
+ GSL_TYPE(gsl_vector) *v = NULL;
1821
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1822
+ GSL_TYPE(gsl_sort_vector)(v);
1823
+ return obj;
1824
+ }
1825
+
1826
+ static VALUE GSL_TYPE(rb_gsl_sort_vector2)(VALUE obj)
1827
+ {
1828
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
1829
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1830
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
1831
+ FUNCTION(gsl_vector,memcpy)(vnew, v);
1832
+ GSL_TYPE(gsl_sort_vector)(vnew);
1833
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
1834
+ }
1835
+
1836
+ static VALUE FUNCTION(rb_gsl_sort_vector,index)(VALUE obj)
1837
+ {
1838
+ GSL_TYPE(gsl_vector) *v = NULL;
1839
+ gsl_index *p = NULL;
1840
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1841
+ p = gsl_permutation_alloc(v->size);
1842
+ FUNCTION(gsl_sort_vector,index)(p, v);
1843
+ return Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, p);
1844
+ }
1845
+
1846
+ static VALUE FUNCTION(rb_gsl_sort_vector,smallest)(VALUE obj, VALUE kk)
1847
+ {
1848
+ GSL_TYPE(gsl_vector) *v = NULL, *v2 = NULL;
1849
+ size_t k;
1850
+ CHECK_FIXNUM(kk);
1851
+ k = FIX2INT(kk);
1852
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1853
+ v2 = FUNCTION(gsl_vector,alloc)(k);
1854
+ FUNCTION(gsl_sort_vector,smallest)(v2->data, k, v);
1855
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), v2);
1856
+ }
1857
+
1858
+ static VALUE FUNCTION(rb_gsl_sort_vector,largest)(VALUE obj, VALUE kk)
1859
+ {
1860
+ GSL_TYPE(gsl_vector) *v = NULL, *v2 = NULL;
1861
+ size_t k;
1862
+ CHECK_FIXNUM(kk);
1863
+ k = FIX2INT(kk);
1864
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1865
+ v2 = FUNCTION(gsl_vector,alloc)(k);
1866
+ FUNCTION(gsl_sort_vector,largest)(v2->data, k, v);
1867
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), v2);
1868
+ }
1869
+
1870
+ static VALUE FUNCTION(rb_gsl_sort_vector,smallest_index)(VALUE obj, VALUE kk)
1871
+ {
1872
+ GSL_TYPE(gsl_vector) *v = NULL;
1873
+ gsl_index *p = NULL;
1874
+ size_t k;
1875
+ CHECK_FIXNUM(kk);
1876
+ k = FIX2INT(kk);
1877
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1878
+ p = gsl_permutation_alloc(k);
1879
+ FUNCTION(gsl_sort_vector,smallest_index)(p->data, k, v);
1880
+ return Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, p);
1881
+ }
1882
+
1883
+ static VALUE FUNCTION(rb_gsl_sort_vector,largest_index)(VALUE obj, VALUE kk)
1884
+ {
1885
+ GSL_TYPE(gsl_vector) *v = NULL;
1886
+ gsl_index *p = NULL;
1887
+ size_t k;
1888
+ CHECK_FIXNUM(kk);
1889
+ k = FIX2INT(kk);
1890
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1891
+ p = gsl_permutation_alloc(k);
1892
+ FUNCTION(gsl_sort_vector,largest_index)(p->data, k, v);
1893
+ return Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, p);
1894
+ }
1895
+
1896
+ static VALUE FUNCTION(rb_gsl_vector,histogram)(int argc, VALUE *argv, VALUE obj)
1897
+ {
1898
+ GSL_TYPE(gsl_vector) *v = NULL;
1899
+ gsl_histogram *h;
1900
+ gsl_vector *ranges;
1901
+ double min, max;
1902
+ size_t i, n;
1903
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1904
+ switch (argc) {
1905
+ case 1:
1906
+ if (rb_obj_is_kind_of(argv[0], rb_cRange))
1907
+ argv[0] = rb_gsl_range2ary(argv[0]);
1908
+ switch (TYPE(argv[0])) {
1909
+ case T_FIXNUM:
1910
+ n = NUM2INT(argv[0]);
1911
+ min = FUNCTION(gsl_vector,min)(v) - 4*GSL_DBL_EPSILON;
1912
+ max = FUNCTION(gsl_vector,max)(v) + 4*GSL_DBL_EPSILON;
1913
+ h = gsl_histogram_alloc(n);
1914
+ gsl_histogram_set_ranges_uniform(h, min, max);
1915
+ break;
1916
+ case T_ARRAY:
1917
+ n = RARRAY_LEN(argv[0]) - 1;
1918
+ h = gsl_histogram_alloc(n);
1919
+ for (i = 0; i <= n; i++) h->range[i] = NUM2DBL(rb_ary_entry(argv[0], i));
1920
+ break;
1921
+ default:
1922
+ CHECK_VECTOR(argv[0]);
1923
+ Data_Get_Struct(argv[0], gsl_vector, ranges);
1924
+ n = ranges->size - 1;
1925
+ h = gsl_histogram_alloc(n);
1926
+ gsl_histogram_set_ranges(h, ranges->data, ranges->size);
1927
+ break;
1928
+ }
1929
+ break;
1930
+ case 2:
1931
+ n = NUM2INT(argv[0]);
1932
+ switch (TYPE(argv[1])) {
1933
+ case T_ARRAY:
1934
+ min = NUM2DBL(rb_ary_entry(argv[1], 0));
1935
+ max = NUM2DBL(rb_ary_entry(argv[1], 1));
1936
+ break;
1937
+ default:
1938
+ rb_raise(rb_eTypeError, "wrong argument type %s (Array expected)",
1939
+ rb_class2name(CLASS_OF(argv[1])));
1940
+ break;
1941
+ }
1942
+ h = gsl_histogram_alloc(n);
1943
+ gsl_histogram_set_ranges_uniform(h, min, max);
1944
+ break;
1945
+ case 3:
1946
+ n = NUM2INT(argv[0]);
1947
+ min = NUM2DBL(argv[1]); max = NUM2DBL(argv[2]);
1948
+ h = gsl_histogram_alloc(n);
1949
+ gsl_histogram_set_ranges_uniform(h, min, max);
1950
+ break;
1951
+ default:
1952
+ rb_raise(rb_eArgError, "wrong number of arguments %d", argc);
1953
+ break;
1954
+ }
1955
+ for (i = 0; i < v->size; i++)
1956
+ gsl_histogram_increment(h, FUNCTION(gsl_vector,get)(v, i));
1957
+ return Data_Wrap_Struct(cgsl_histogram, 0, gsl_histogram_free, h);
1958
+ }
1959
+
1960
+ static VALUE FUNCTION(rb_gsl_vector,last)(VALUE obj)
1961
+ {
1962
+ GSL_TYPE(gsl_vector) *v = NULL;
1963
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1964
+ return C_TO_VALUE(FUNCTION(gsl_vector,get)(v, v->size-1));
1965
+ }
1966
+
1967
+ static VALUE FUNCTION(rb_gsl_vector,first)(VALUE obj)
1968
+ {
1969
+ GSL_TYPE(gsl_vector) *v = NULL;
1970
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1971
+ return C_TO_VALUE(FUNCTION(gsl_vector,get)(v, 0));
1972
+ }
1973
+
1974
+ static VALUE FUNCTION(rb_gsl_vector,concat)(VALUE obj, VALUE other)
1975
+ {
1976
+ GSL_TYPE(gsl_vector) *v = NULL, *v2 = NULL, *vnew = NULL;
1977
+ QUALIFIED_VIEW(gsl_vector,view) vv;
1978
+ VALUE x;
1979
+ BASE beg, end;
1980
+ int step;
1981
+ size_t i, size2;
1982
+
1983
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
1984
+
1985
+ switch(TYPE(other)) {
1986
+ case T_FIXNUM:
1987
+ case T_BIGNUM:
1988
+ case T_FLOAT:
1989
+ vnew = FUNCTION(gsl_vector,alloc)(v->size + 1);
1990
+ vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
1991
+ FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
1992
+ FUNCTION(gsl_vector,set)(vnew, v->size, NUMCONV2(other));
1993
+ break;
1994
+
1995
+ case T_ARRAY:
1996
+ size2 = RARRAY_LEN(other);
1997
+ vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
1998
+ vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
1999
+ FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
2000
+ for (i = 0; i < size2; i++) {
2001
+ x = rb_ary_entry(other, i);
2002
+ FUNCTION(gsl_vector,set)(vnew, v->size + i, NUMCONV2(x));
2003
+ }
2004
+ break;
2005
+
2006
+ default:
2007
+ if(rb_obj_is_kind_of(other, rb_cRange)) {
2008
+ FUNCTION(get_range,beg_en_n)(other, &beg, &end, &size2, &step);
2009
+ vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
2010
+ vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
2011
+ FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
2012
+ for (i = 0; i < size2; i++) {
2013
+ FUNCTION(gsl_vector,set)(vnew, v->size + i, beg);
2014
+ beg += step;
2015
+ }
2016
+ } else if (rb_obj_is_kind_of(other, GSL_TYPE(cgsl_vector))) {
2017
+ Data_Get_Struct(other, GSL_TYPE(gsl_vector), v2);
2018
+ size2 = v2->size;
2019
+ vnew = FUNCTION(gsl_vector,alloc)(v->size + size2);
2020
+ vv = FUNCTION(gsl_vector,subvector)(vnew, 0, v->size);
2021
+ FUNCTION(gsl_vector,memcpy)(&vv.vector, v);
2022
+ vv = FUNCTION(gsl_vector,subvector)(vnew, v->size, size2);
2023
+ FUNCTION(gsl_vector,memcpy)(&vv.vector, v2);
2024
+ } else {
2025
+ rb_raise(rb_eTypeError, "wrong argument type %s (Array, Numeric, Range, or %s expected)",
2026
+ rb_class2name(CLASS_OF(other)), rb_class2name(GSL_TYPE(cgsl_vector)));
2027
+ }
2028
+ break;
2029
+ }
2030
+
2031
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
2032
+ }
2033
+
2034
+ void FUNCTION(mygsl_vector,diff)(GSL_TYPE(gsl_vector) *vdst,
2035
+ GSL_TYPE(gsl_vector) *vsrc, size_t n)
2036
+ {
2037
+ BASE a, b;
2038
+ int coef, fac, nn, ff;
2039
+ size_t i, k;
2040
+ nn = gsl_sf_fact((unsigned int) n);
2041
+ if (GSL_IS_EVEN(n)) ff = 1;
2042
+ else ff = -1;
2043
+ for (i = 0; i < vsrc->size-n; i++) {
2044
+ fac = ff;
2045
+ a = 0;
2046
+ for (k = 0; k <= n; k++) {
2047
+ b = FUNCTION(gsl_vector,get)(vsrc, i+k);
2048
+ coef = nn/gsl_sf_fact(k)/gsl_sf_fact(n-k);
2049
+ a += fac*coef*b;
2050
+ fac *= -1;
2051
+ }
2052
+ FUNCTION(gsl_vector,set)(vdst, i, a);
2053
+ }
2054
+ }
2055
+
2056
+ static VALUE FUNCTION(rb_gsl_vector,diff)(int argc, VALUE *argv, VALUE obj)
2057
+ {
2058
+ GSL_TYPE(gsl_vector) *v = NULL, *vnew = NULL;
2059
+ size_t n;
2060
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2061
+ switch (argc) {
2062
+ case 0:
2063
+ n = 1;
2064
+ break;
2065
+ case 1:
2066
+ n = FIX2INT(argv[0]);
2067
+ break;
2068
+ default:
2069
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
2070
+ break;
2071
+ }
2072
+ if (n <= 0) return obj;
2073
+ if (v->size <= n) return obj;
2074
+ vnew = FUNCTION(gsl_vector,alloc)(v->size - n);
2075
+ FUNCTION(mygsl_vector,diff)(vnew, v, n);
2076
+ return Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew);
2077
+ }
2078
+
2079
+ static VALUE FUNCTION(rb_gsl_vector,test)(VALUE obj, int (*f)(const double))
2080
+ {
2081
+ GSL_TYPE(gsl_vector) *v = NULL;
2082
+ gsl_vector_int *vi = NULL;
2083
+ size_t i;
2084
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2085
+ vi = gsl_vector_int_alloc(v->size);
2086
+ for (i = 0; i < v->size; i++)
2087
+ gsl_vector_int_set(vi, i, (*f)(FUNCTION(gsl_vector,get)(v, i)));
2088
+ return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, vi);
2089
+ }
2090
+
2091
+ static VALUE FUNCTION(rb_gsl_vector,test2)(VALUE obj, int (*f)(const double))
2092
+ {
2093
+ GSL_TYPE(gsl_vector) *v = NULL;
2094
+ VALUE ary;
2095
+ size_t i;
2096
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2097
+ ary = rb_ary_new2(v->size);
2098
+ for (i = 0; i < v->size; i++) {
2099
+ if ((*f)(FUNCTION(gsl_vector,get)(v, i)))
2100
+ rb_ary_store(ary, i, Qtrue);
2101
+ else
2102
+ rb_ary_store(ary, i, Qfalse);
2103
+ }
2104
+ return ary;
2105
+ }
2106
+
2107
+ static VALUE FUNCTION(rb_gsl_vector,isnan)(VALUE obj)
2108
+ {
2109
+ return FUNCTION(rb_gsl_vector,test)(obj, gsl_isnan);
2110
+ }
2111
+
2112
+ static VALUE FUNCTION(rb_gsl_vector,isinf)(VALUE obj)
2113
+ {
2114
+ return FUNCTION(rb_gsl_vector,test)(obj, gsl_isinf);
2115
+ }
2116
+
2117
+ static VALUE FUNCTION(rb_gsl_vector,finite)(VALUE obj)
2118
+ {
2119
+ return FUNCTION(rb_gsl_vector,test)(obj, gsl_finite);
2120
+ }
2121
+
2122
+ static VALUE FUNCTION(rb_gsl_vector,isnan2)(VALUE obj)
2123
+ {
2124
+ return FUNCTION(rb_gsl_vector,test2)(obj, gsl_isnan);
2125
+ }
2126
+
2127
+ static VALUE FUNCTION(rb_gsl_vector,isinf2)(VALUE obj)
2128
+ {
2129
+ return FUNCTION(rb_gsl_vector,test2)(obj, gsl_isinf);
2130
+ }
2131
+
2132
+ static VALUE FUNCTION(rb_gsl_vector,finite2)(VALUE obj)
2133
+ {
2134
+ return FUNCTION(rb_gsl_vector,test2)(obj, gsl_finite);
2135
+ }
2136
+
2137
+ static VALUE FUNCTION(rb_gsl_vector,delete_at)(VALUE obj, VALUE ii)
2138
+ {
2139
+ int i2;
2140
+ size_t i;
2141
+ GSL_TYPE(gsl_vector) *v;
2142
+ BASE x;
2143
+ if (rb_obj_is_kind_of(obj,QUALIFIED_VIEW(cgsl_vector,view)))
2144
+ rb_raise(rb_eRuntimeError, "prohibited for %s", rb_class2name(CLASS_OF(obj)));
2145
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2146
+ if (v->stride != 1) rb_raise(rb_eRuntimeError, "vector must have stride 1");
2147
+ if (v->size == 0) return Qnil;
2148
+ CHECK_FIXNUM(ii);
2149
+ i2 = FIX2INT(ii);
2150
+ if (i2 < 0) {
2151
+ i2 += v->size;
2152
+ }
2153
+ if (i2 < 0 || i2 > v->size-1) return Qnil;
2154
+ i = (size_t) i2;
2155
+ x = FUNCTION(gsl_vector,get)(v, i);
2156
+ memmove(v->data+i, v->data+i+1, sizeof(BASE)*(v->size-1-i));
2157
+ v->size -= 1;
2158
+ return C_TO_VALUE(x);
2159
+ }
2160
+
2161
+ static VALUE FUNCTION(rb_gsl_vector,delete_if)(VALUE obj)
2162
+ {
2163
+ GSL_TYPE(gsl_vector) *v;
2164
+ BASE x;
2165
+ VALUE val;
2166
+ size_t i, count = 0;
2167
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "block is not given");
2168
+ if (rb_obj_is_kind_of(obj,QUALIFIED_VIEW(cgsl_vector,view)))
2169
+ rb_raise(rb_eRuntimeError, "prohibited for %s", rb_class2name(CLASS_OF(obj)));
2170
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2171
+ if (v->stride != 1) rb_raise(rb_eRuntimeError, "vector must have stride 1");
2172
+ for (i = 0; i < v->size; i++) {
2173
+ x = FUNCTION(gsl_vector,get)(v, i);
2174
+ val = rb_yield(C_TO_VALUE(x));
2175
+ if(RTEST(val)) {
2176
+ count++;
2177
+ } else if(count > 0) {
2178
+ FUNCTION(gsl_vector,set)(v, i-count, x);
2179
+ }
2180
+ }
2181
+ v->size -= count;
2182
+ return obj;
2183
+ }
2184
+
2185
+ static VALUE FUNCTION(rb_gsl_vector,delete)(VALUE obj, VALUE yy)
2186
+ {
2187
+ GSL_TYPE(gsl_vector) *v;
2188
+ BASE x, y;
2189
+ size_t i, count = 0;
2190
+ y = NUMCONV(yy);
2191
+ if (rb_obj_is_kind_of(obj,QUALIFIED_VIEW(cgsl_vector,view)))
2192
+ rb_raise(rb_eRuntimeError, "prohibited for %s", rb_class2name(CLASS_OF(obj)));
2193
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2194
+ if (v->stride != 1) rb_raise(rb_eRuntimeError, "vector must have stride 1");
2195
+ if (v->size == 0) return obj;
2196
+ for (i = 0; i < v->size; i++) {
2197
+ x = FUNCTION(gsl_vector,get)(v, i);
2198
+ if (x == y) {
2199
+ count++;
2200
+ } else if(count > 0) {
2201
+ FUNCTION(gsl_vector,set)(v, i-count, x);
2202
+ }
2203
+ }
2204
+ v->size -= count;
2205
+ return count ? y : Qnil;
2206
+ }
2207
+
2208
+ /* singleton method */
2209
+ #ifdef BASE_INT
2210
+ #define FORMAT_TMP "%d"
2211
+ #else
2212
+ #define FORMAT_TMP "%lf"
2213
+ #endif
2214
+ static VALUE FUNCTION(rb_gsl_vector,filescan)(VALUE klass, VALUE file)
2215
+ {
2216
+ FILE *fp = NULL;
2217
+ int nn, k;
2218
+ char buf[1024], filename[1024];
2219
+ size_t n, lines, i, j, ii = 0, jj;
2220
+ long pos;
2221
+ GSL_TYPE(gsl_vector) **x;
2222
+ BASE val;
2223
+ VALUE ary;
2224
+ Check_Type(file, T_STRING);
2225
+ strcpy(filename, STR2CSTR(file));
2226
+ sprintf(buf, "sed '/^#/d' %s | wc", filename);
2227
+ if ((fp = popen(buf, "r")) == NULL)
2228
+ rb_raise(rb_eIOError, "popen failed.");
2229
+ fgets(buf, 1024, fp);
2230
+ pclose(fp);
2231
+ sscanf(buf, "%d", &nn);
2232
+ lines = (size_t) nn; /* vector length */
2233
+ if ((fp = fopen(filename, "r")) == NULL)
2234
+ rb_raise(rb_eIOError, "cannot open file %s.", filename);
2235
+ while (1) {
2236
+ fgets(buf, 1024, fp); /* read the first line to count number of columns */
2237
+ if (buf[0] == '#') continue;
2238
+ else break;
2239
+ }
2240
+ n = count_columns(buf); /* number of vectors to be created */
2241
+ x = (GSL_TYPE(gsl_vector)**) xmalloc(sizeof(GSL_TYPE(gsl_vector)*)*n);
2242
+ ary = rb_ary_new2(n);
2243
+ for (j = 0; j < n; j++) {
2244
+ x[j] = FUNCTION(gsl_vector,alloc)(lines);
2245
+ rb_ary_store(ary, j, Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), x[j]));
2246
+ }
2247
+ rewind(fp);
2248
+ for (i = 0, ii = 0; ii < lines; i++) {
2249
+ pos = ftell(fp);
2250
+ fgets(buf, 1024, fp);
2251
+ if (buf[0] == '#') continue;
2252
+ fseek(fp, pos, SEEK_SET);
2253
+ for (j = 0, jj = 0; jj < n; j++) {
2254
+ k = fscanf(fp, FORMAT_TMP, &val);
2255
+ if (k != 1) continue;
2256
+ FUNCTION(gsl_vector,set)(x[jj++], ii, val);
2257
+ }
2258
+ ii += 1;
2259
+ }
2260
+ fclose(fp);
2261
+ free(x);
2262
+ return ary;
2263
+ }
2264
+ #undef FORMAT_TMP
2265
+
2266
+ static int FUNCTION(gsl_vector,eq)(const GSL_TYPE(gsl_vector) *a,
2267
+ const GSL_TYPE(gsl_vector) *b,
2268
+ gsl_block_uchar *c)
2269
+ {
2270
+ size_t i;
2271
+ BASE x, y;
2272
+ if (a->size != b->size) return -1;
2273
+ if (a->size != c->size) return -2;
2274
+ for (i = 0; i < a->size; i++) {
2275
+ x = a->data[i*a->stride];
2276
+ y = b->data[i*b->stride];
2277
+ c->data[i] = (x > y || x < y) ? 0 : 1;
2278
+ }
2279
+ return 0;
2280
+ }
2281
+
2282
+ static int FUNCTION(gsl_vector,ne)(const GSL_TYPE(gsl_vector) *a,
2283
+ const GSL_TYPE(gsl_vector) *b,
2284
+ gsl_block_uchar *c)
2285
+ {
2286
+ size_t i;
2287
+ BASE x, y;
2288
+ if (a->size != b->size) return -1;
2289
+ if (a->size != c->size) return -2;
2290
+ for (i = 0; i < a->size; i++) {
2291
+ x = a->data[i*a->stride];
2292
+ y = b->data[i*b->stride];
2293
+ c->data[i] = (x > y || x < y) ? 1 : 0;
2294
+ }
2295
+ return 0;
2296
+ }
2297
+
2298
+ static int FUNCTION(gsl_vector,gt)(const GSL_TYPE(gsl_vector) *a,
2299
+ const GSL_TYPE(gsl_vector) *b,
2300
+ gsl_block_uchar *c)
2301
+ {
2302
+ size_t i;
2303
+ BASE x, y;
2304
+ if (a->size != b->size) return -1;
2305
+ if (a->size != c->size) return -2;
2306
+ for (i = 0; i < a->size; i++) {
2307
+ x = a->data[i*a->stride];
2308
+ y = b->data[i*b->stride];
2309
+ c->data[i] = (x > y) ? 1 : 0;
2310
+ }
2311
+ return 0;
2312
+ }
2313
+
2314
+ static int FUNCTION(gsl_vector,ge)(const GSL_TYPE(gsl_vector) *a,
2315
+ const GSL_TYPE(gsl_vector) *b,
2316
+ gsl_block_uchar *c)
2317
+ {
2318
+ size_t i;
2319
+ BASE x, y;
2320
+ if (a->size != b->size) return -1;
2321
+ if (a->size != c->size) return -2;
2322
+ for (i = 0; i < a->size; i++) {
2323
+ x = a->data[i*a->stride];
2324
+ y = b->data[i*b->stride];
2325
+ c->data[i] = (x >= y) ? 1 : 0;
2326
+ }
2327
+ return 0;
2328
+ }
2329
+
2330
+ static int FUNCTION(gsl_vector,lt)(const GSL_TYPE(gsl_vector) *a,
2331
+ const GSL_TYPE(gsl_vector) *b,
2332
+ gsl_block_uchar *c)
2333
+ {
2334
+ size_t i;
2335
+ BASE x, y;
2336
+ if (a->size != b->size) return -1;
2337
+ if (a->size != c->size) return -2;
2338
+ for (i = 0; i < a->size; i++) {
2339
+ x = a->data[i*a->stride];
2340
+ y = b->data[i*b->stride];
2341
+ c->data[i] = (x < y) ? 1 : 0;
2342
+ }
2343
+ return 0;
2344
+ }
2345
+
2346
+ static int FUNCTION(gsl_vector,le)(const GSL_TYPE(gsl_vector) *a,
2347
+ const GSL_TYPE(gsl_vector) *b,
2348
+ gsl_block_uchar *c)
2349
+ {
2350
+ size_t i;
2351
+ BASE x, y;
2352
+ if (a->size != b->size) return -1;
2353
+ if (a->size != c->size) return -2;
2354
+ for (i = 0; i < a->size; i++) {
2355
+ x = a->data[i*a->stride];
2356
+ y = b->data[i*b->stride];
2357
+ c->data[i] = (x <= y) ? 1 : 0;
2358
+ }
2359
+ return 0;
2360
+ }
2361
+
2362
+ static int FUNCTION(gsl_vector,and)(const GSL_TYPE(gsl_vector) *a,
2363
+ const GSL_TYPE(gsl_vector) *b,
2364
+ gsl_block_uchar *c)
2365
+ {
2366
+ size_t i;
2367
+ BASE x, y;
2368
+ if (a->size != b->size) return -1;
2369
+ if (a->size != c->size) return -2;
2370
+ for (i = 0; i < a->size; i++) {
2371
+ x = a->data[i*a->stride];
2372
+ y = b->data[i*b->stride];
2373
+ c->data[i] = (x != 0 && y != 0) ? 1 : 0;
2374
+ }
2375
+ return 0;
2376
+ }
2377
+
2378
+ static int FUNCTION(gsl_vector,or)(const GSL_TYPE(gsl_vector) *a,
2379
+ const GSL_TYPE(gsl_vector) *b,
2380
+ gsl_block_uchar *c)
2381
+ {
2382
+ size_t i;
2383
+ BASE x, y;
2384
+ if (a->size != b->size) return -1;
2385
+ if (a->size != c->size) return -2;
2386
+ for (i = 0; i < a->size; i++) {
2387
+ x = a->data[i*a->stride];
2388
+ y = b->data[i*b->stride];
2389
+ c->data[i] = (x != 0 || y != 0) ? 1 : 0;
2390
+ }
2391
+ return 0;
2392
+ }
2393
+
2394
+ static int FUNCTION(gsl_vector,xor)(const GSL_TYPE(gsl_vector) *a,
2395
+ const GSL_TYPE(gsl_vector) *b,
2396
+ gsl_block_uchar *c)
2397
+ {
2398
+ size_t i;
2399
+ BASE x, y;
2400
+ if (a->size != b->size) return -1;
2401
+ if (a->size != c->size) return -2;
2402
+ for (i = 0; i < a->size; i++) {
2403
+ x = a->data[i*a->stride];
2404
+ y = b->data[i*b->stride];
2405
+ c->data[i] = ((x != 0) == (y != 0)) ? 0 : 1;
2406
+ }
2407
+ return 0;
2408
+ }
2409
+
2410
+ static int FUNCTION(gsl_vector,eq2)(const GSL_TYPE(gsl_vector) *a,
2411
+ BASE b, gsl_block_uchar *c)
2412
+ {
2413
+ size_t i;
2414
+ BASE x, y;
2415
+ if (a->size != c->size) return -2;
2416
+ for (i = 0; i < a->size; i++) {
2417
+ x = a->data[i*a->stride];
2418
+ y = b;
2419
+ c->data[i] = (x > y || x < y) ? 0 : 1;
2420
+ }
2421
+ return 0;
2422
+ }
2423
+
2424
+ static int FUNCTION(gsl_vector,ne2)(const GSL_TYPE(gsl_vector) *a,
2425
+ BASE b,
2426
+ gsl_block_uchar *c)
2427
+ {
2428
+ size_t i;
2429
+ BASE x, y;
2430
+ if (a->size != c->size) return -2;
2431
+ for (i = 0; i < a->size; i++) {
2432
+ x = a->data[i*a->stride];
2433
+ y = b;
2434
+ c->data[i] = (x > y || x < y) ? 1 : 0;
2435
+ }
2436
+ return 0;
2437
+ }
2438
+
2439
+ static int FUNCTION(gsl_vector,gt2)(const GSL_TYPE(gsl_vector) *a,
2440
+ BASE b,
2441
+ gsl_block_uchar *c)
2442
+ {
2443
+ size_t i;
2444
+ BASE x, y;
2445
+ if (a->size != c->size) return -2;
2446
+ for (i = 0; i < a->size; i++) {
2447
+ x = a->data[i*a->stride];
2448
+ y = b;
2449
+ c->data[i] = (x > y) ? 1 : 0;
2450
+ }
2451
+ return 0;
2452
+ }
2453
+
2454
+ static int FUNCTION(gsl_vector,ge2)(const GSL_TYPE(gsl_vector) *a,
2455
+ BASE b,
2456
+ gsl_block_uchar *c)
2457
+ {
2458
+ size_t i;
2459
+ BASE x, y;
2460
+ if (a->size != c->size) return -2;
2461
+ for (i = 0; i < a->size; i++) {
2462
+ x = a->data[i*a->stride];
2463
+ y = b;
2464
+ c->data[i] = (x >= y) ? 1 : 0;
2465
+ }
2466
+ return 0;
2467
+ }
2468
+
2469
+ static int FUNCTION(gsl_vector,lt2)(const GSL_TYPE(gsl_vector) *a,
2470
+ BASE b,
2471
+ gsl_block_uchar *c)
2472
+ {
2473
+ size_t i;
2474
+ BASE x, y;
2475
+ if (a->size != c->size) return -2;
2476
+ for (i = 0; i < a->size; i++) {
2477
+ x = a->data[i*a->stride];
2478
+ y = b;
2479
+ c->data[i] = (x < y) ? 1 : 0;
2480
+ }
2481
+ return 0;
2482
+ }
2483
+
2484
+ static int FUNCTION(gsl_vector,le2)(const GSL_TYPE(gsl_vector) *a,
2485
+ BASE b,
2486
+ gsl_block_uchar *c)
2487
+ {
2488
+ size_t i;
2489
+ BASE x, y;
2490
+ if (a->size != c->size) return -2;
2491
+ for (i = 0; i < a->size; i++) {
2492
+ x = a->data[i*a->stride];
2493
+ y = b;
2494
+ c->data[i] = (x <= y) ? 1 : 0;
2495
+ }
2496
+ return 0;
2497
+ }
2498
+
2499
+ static int FUNCTION(gsl_vector,and2)(const GSL_TYPE(gsl_vector) *a,
2500
+ BASE b,
2501
+ gsl_block_uchar *c)
2502
+ {
2503
+ size_t i;
2504
+ BASE x, y;
2505
+ if (a->size != c->size) return -2;
2506
+ for (i = 0; i < a->size; i++) {
2507
+ x = a->data[i*a->stride];
2508
+ y = b;
2509
+ c->data[i] = (x != 0 && y != 0) ? 1 : 0;
2510
+ }
2511
+ return 0;
2512
+ }
2513
+
2514
+ static int FUNCTION(gsl_vector,or2)(const GSL_TYPE(gsl_vector) *a,
2515
+ BASE b,
2516
+ gsl_block_uchar *c)
2517
+ {
2518
+ size_t i;
2519
+ BASE x, y;
2520
+ if (a->size != c->size) return -2;
2521
+ for (i = 0; i < a->size; i++) {
2522
+ x = a->data[i*a->stride];
2523
+ y = b;
2524
+ c->data[i] = (x != 0 || y != 0) ? 1 : 0;
2525
+ }
2526
+ return 0;
2527
+ }
2528
+
2529
+ static int FUNCTION(gsl_vector,xor2)(const GSL_TYPE(gsl_vector) *a,
2530
+ BASE b,
2531
+ gsl_block_uchar *c)
2532
+ {
2533
+ size_t i;
2534
+ BASE x, y;
2535
+ if (a->size != c->size) return -2;
2536
+ for (i = 0; i < a->size; i++) {
2537
+ x = a->data[i*a->stride];
2538
+ y = b;
2539
+ c->data[i] = ((x != 0) == (y != 0)) ? 0 : 1;
2540
+ }
2541
+ return 0;
2542
+ }
2543
+
2544
+
2545
+ static VALUE FUNCTION(rb_gsl_vector,compare)(VALUE aa, VALUE bb,
2546
+ int (*cmp)(const GSL_TYPE(gsl_vector)*,
2547
+ const GSL_TYPE(gsl_vector)*,
2548
+ gsl_block_uchar*),
2549
+ int (*cmp2)(const GSL_TYPE(gsl_vector)*,
2550
+ BASE,
2551
+ gsl_block_uchar*))
2552
+ {
2553
+ GSL_TYPE(gsl_vector) *a, *b;
2554
+ /* gsl_vector_int *c;*/
2555
+ gsl_block_uchar *c;
2556
+ int status;
2557
+ Data_Get_Struct(aa, GSL_TYPE(gsl_vector), a);
2558
+ c = gsl_block_uchar_alloc(a->size);
2559
+ if (VEC_P(bb)) {
2560
+ Data_Get_Struct(bb, GSL_TYPE(gsl_vector), b);
2561
+ if (a->size != b->size)
2562
+ rb_raise(rb_eRuntimeError, "Vector size mismatch, %d and %d", (int) a->size,
2563
+ (int) b->size);
2564
+ status = (*cmp)(a, b, c);
2565
+ } else {
2566
+ status = (*cmp2)(a, NUMCONV(bb), c);
2567
+ }
2568
+ return Data_Wrap_Struct(cgsl_block_uchar, 0, gsl_block_uchar_free, c);
2569
+ }
2570
+
2571
+ static VALUE FUNCTION(rb_gsl_vector,eq)(VALUE aa, VALUE bb)
2572
+ {
2573
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,eq),
2574
+ FUNCTION(gsl_vector,eq2));
2575
+ }
2576
+
2577
+ static VALUE FUNCTION(rb_gsl_vector,ne)(VALUE aa, VALUE bb)
2578
+ {
2579
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,ne),
2580
+ FUNCTION(gsl_vector,ne2));
2581
+ }
2582
+
2583
+ static VALUE FUNCTION(rb_gsl_vector,gt)(VALUE aa, VALUE bb)
2584
+ {
2585
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,gt),
2586
+ FUNCTION(gsl_vector,gt2));
2587
+ }
2588
+
2589
+ static VALUE FUNCTION(rb_gsl_vector,ge)(VALUE aa, VALUE bb)
2590
+ {
2591
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,ge),
2592
+ FUNCTION(gsl_vector,ge2));
2593
+ }
2594
+
2595
+ static VALUE FUNCTION(rb_gsl_vector,lt)(VALUE aa, VALUE bb)
2596
+ {
2597
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,lt),
2598
+ FUNCTION(gsl_vector,lt2));
2599
+ }
2600
+
2601
+ static VALUE FUNCTION(rb_gsl_vector,le)(VALUE aa, VALUE bb)
2602
+ {
2603
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,le),
2604
+ FUNCTION(gsl_vector,le2));
2605
+ }
2606
+
2607
+ static VALUE FUNCTION(rb_gsl_vector,and)(VALUE aa, VALUE bb)
2608
+ {
2609
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,and),
2610
+ FUNCTION(gsl_vector,and2));
2611
+ }
2612
+
2613
+ static VALUE FUNCTION(rb_gsl_vector,or)(VALUE aa, VALUE bb)
2614
+ {
2615
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,or),
2616
+ FUNCTION(gsl_vector,or2));
2617
+ }
2618
+
2619
+ static VALUE FUNCTION(rb_gsl_vector,xor)(VALUE aa, VALUE bb)
2620
+ {
2621
+ return FUNCTION(rb_gsl_vector,compare)(aa, bb, FUNCTION(gsl_vector,xor),
2622
+ FUNCTION(gsl_vector,xor2));
2623
+ }
2624
+
2625
+ static VALUE FUNCTION(rb_gsl_vector,not)(VALUE obj)
2626
+ {
2627
+ GSL_TYPE(gsl_vector) *v;
2628
+ gsl_block_uchar *vv;
2629
+ size_t i;
2630
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2631
+ vv = gsl_block_uchar_alloc(v->size);
2632
+ for (i = 0; i < v->size; i++) vv->data[i] = (v->data[i*v->stride] != 0) ? 0 : 1;
2633
+ return Data_Wrap_Struct(cgsl_block_uchar, 0, gsl_block_uchar_free, vv);
2634
+ }
2635
+
2636
+ static VALUE FUNCTION(rb_gsl_vector,any)(VALUE obj)
2637
+ {
2638
+ GSL_TYPE(gsl_vector) *v = NULL;
2639
+ size_t i;
2640
+
2641
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2642
+ if (rb_block_given_p()) {
2643
+ for (i = 0; i < v->size; i++) {
2644
+ if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) return INT2FIX(1);
2645
+ }
2646
+ return INT2FIX(0);
2647
+ } else {
2648
+ if (FUNCTION(gsl_vector,isnull)(v)) return INT2FIX(0);
2649
+ return INT2FIX(1);
2650
+ }
2651
+ }
2652
+
2653
+ static VALUE FUNCTION(rb_gsl_vector,any2)(VALUE obj)
2654
+ {
2655
+ GSL_TYPE(gsl_vector) *v = NULL;
2656
+ size_t i;
2657
+
2658
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2659
+ if (rb_block_given_p()) {
2660
+ for (i = 0; i < v->size; i++)
2661
+ if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) return Qtrue;
2662
+ return Qfalse;
2663
+ } else {
2664
+ for (i = 0; i < v->size; i++)
2665
+ if (v->data[i*v->stride]) return Qtrue;
2666
+ return Qfalse;
2667
+ }
2668
+ }
2669
+
2670
+ static VALUE FUNCTION(rb_gsl_vector,none)(VALUE obj)
2671
+ {
2672
+ GSL_TYPE(gsl_vector) *v;
2673
+ size_t i;
2674
+
2675
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2676
+ if (rb_block_given_p()) {
2677
+ for (i = 0; i < v->size; i++)
2678
+ if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) return Qfalse;
2679
+ return Qtrue;
2680
+ } else {
2681
+ for (i = 0; i < v->size; i++)
2682
+ if (v->data[i*v->stride]) return Qfalse;
2683
+ return Qtrue;
2684
+ }
2685
+ }
2686
+
2687
+ static VALUE FUNCTION(rb_gsl_vector,all)(VALUE obj)
2688
+ {
2689
+ GSL_TYPE(gsl_vector) *v;
2690
+ size_t i;
2691
+
2692
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2693
+ if (rb_block_given_p()) {
2694
+ for (i = 0; i < v->size; i++)
2695
+ if (!rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) return Qfalse;
2696
+ return Qtrue;
2697
+ } else {
2698
+ for (i = 0; i < v->size; i++)
2699
+ if (!v->data[i*v->stride]) return Qfalse;
2700
+ return Qtrue;
2701
+ }
2702
+ }
2703
+
2704
+ static VALUE FUNCTION(rb_gsl_vector,where)(VALUE obj)
2705
+ {
2706
+ GSL_TYPE(gsl_vector) *v;
2707
+ gsl_index *vv;
2708
+ gsl_block_uchar *btmp = NULL;
2709
+ size_t i, j, n = 0;
2710
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2711
+ /* count true elements */
2712
+ if (rb_block_given_p()) {
2713
+ btmp = gsl_block_uchar_alloc(v->size);
2714
+ for (i = 0; i < v->size; i++) {
2715
+ if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) {
2716
+ btmp->data[i] = 1;
2717
+ n++;
2718
+ } else {
2719
+ btmp->data[i] = 0;
2720
+ }
2721
+ } /* for */
2722
+ } else { /* block is not given */
2723
+ for (i = 0; i < v->size; i++) { if (FUNCTION(gsl_vector,get)(v, i)) n++; }
2724
+ }
2725
+ if (n == 0) {
2726
+ if (btmp) gsl_block_uchar_free(btmp);
2727
+ return Qnil;
2728
+ }
2729
+ vv = gsl_permutation_alloc(n);
2730
+ for (i = 0, j = 0; i < v->size; i++) {
2731
+ if ((!btmp && FUNCTION(gsl_vector,get)(v, i)) || (btmp && btmp->data[i])) {
2732
+ vv->data[j++] = i;
2733
+ }
2734
+ }
2735
+ if (btmp) gsl_block_uchar_free(btmp);
2736
+ return Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, vv);
2737
+ }
2738
+
2739
+ static VALUE FUNCTION(rb_gsl_vector,where2)(VALUE obj)
2740
+ {
2741
+ GSL_TYPE(gsl_vector) *v;
2742
+ gsl_index *v1, *v2;
2743
+ gsl_block_uchar *btmp = NULL;
2744
+ VALUE vv1, vv2;
2745
+ size_t i, j, k, n = 0;
2746
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2747
+ if (rb_block_given_p()) {
2748
+ btmp = gsl_block_uchar_alloc(v->size);
2749
+ for (i = 0; i < v->size; i++) {
2750
+ if (rb_yield(C_TO_VALUE(FUNCTION(gsl_vector,get)(v, i)))) {
2751
+ btmp->data[i] = 1;
2752
+ n++;
2753
+ } else {
2754
+ btmp->data[i] = 0;
2755
+ }
2756
+ } /* for */
2757
+ } else { /* block is not given */
2758
+ for (i = 0; i < v->size; i++) { if (FUNCTION(gsl_vector,get)(v, i)) n++; }
2759
+ }
2760
+ /* true and false logic. need to handle both */
2761
+ if (n == 0) {
2762
+ v2 = gsl_permutation_calloc(v->size); /* calloc() initializes v2 */
2763
+ vv1 = Qnil;
2764
+ vv2 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v2);
2765
+ } else if (v->size-n == 0) {
2766
+ v1 = gsl_permutation_calloc(n); /* calloc() initializes v1 */
2767
+ vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);
2768
+ vv2 = Qnil;
2769
+ } else {
2770
+ /* same case as 'where' */
2771
+ v1 = gsl_permutation_alloc(n);
2772
+ v2 = gsl_permutation_alloc(v->size-n);
2773
+ for (i = 0, j = 0, k = 0; i < v->size; i++) {
2774
+ if ((!btmp && FUNCTION(gsl_vector,get)(v, i)) || (btmp && btmp->data[i])) v1->data[j++] = i;
2775
+ else v2->data[k++] = i;
2776
+ }
2777
+ vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);
2778
+ vv2 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v2);
2779
+ }
2780
+ if (btmp) gsl_block_uchar_free(btmp);
2781
+ return rb_ary_new3(2, vv1, vv2);
2782
+ }
2783
+
2784
+ static VALUE FUNCTION(rb_gsl_vector,op_inplace)(VALUE vv1, VALUE vv2,
2785
+ int (*f)(GSL_TYPE(gsl_vector)*, const GSL_TYPE(gsl_vector)*))
2786
+ {
2787
+ GSL_TYPE(gsl_vector) *v1, *v2;
2788
+ Data_Get_Struct(vv1, GSL_TYPE(gsl_vector), v1);
2789
+ Data_Get_Struct(vv2, GSL_TYPE(gsl_vector), v2);
2790
+ (*f)(v1, v2);
2791
+ return vv1;
2792
+ }
2793
+
2794
+ static VALUE FUNCTION(rb_gsl_vector,add_inplace)(VALUE vv1, VALUE vv2)
2795
+ {
2796
+ GSL_TYPE(gsl_vector) *v1;
2797
+ double x;
2798
+ if(VEC_P(vv2)) {
2799
+ return FUNCTION(rb_gsl_vector,op_inplace)(vv1, vv2, FUNCTION(gsl_vector,add));
2800
+ } else {
2801
+ x = NUM2DBL(vv2);
2802
+ Data_Get_Struct(vv1, GSL_TYPE(gsl_vector), v1);
2803
+ FUNCTION(gsl_vector,add_constant)(v1, x);
2804
+ return vv1;
2805
+ }
2806
+ }
2807
+
2808
+ static VALUE FUNCTION(rb_gsl_vector,sub_inplace)(VALUE vv1, VALUE vv2)
2809
+ {
2810
+ GSL_TYPE(gsl_vector) *v1;
2811
+ double x;
2812
+ if(VEC_P(vv2)) {
2813
+ return FUNCTION(rb_gsl_vector,op_inplace)(vv1, vv2, FUNCTION(gsl_vector,sub));
2814
+ } else {
2815
+ x = NUM2DBL(vv2);
2816
+ Data_Get_Struct(vv1, GSL_TYPE(gsl_vector), v1);
2817
+ FUNCTION(gsl_vector,add_constant)(v1, -x);
2818
+ return vv1;
2819
+ }
2820
+ }
2821
+
2822
+ static VALUE FUNCTION(rb_gsl_vector,mul_inplace)(VALUE vv1, VALUE vv2)
2823
+ {
2824
+ GSL_TYPE(gsl_vector) *v1;
2825
+ double x;
2826
+ if(VEC_P(vv2)) {
2827
+ return FUNCTION(rb_gsl_vector,op_inplace)(vv1, vv2, FUNCTION(gsl_vector,mul));
2828
+ } else {
2829
+ x = NUM2DBL(vv2);
2830
+ Data_Get_Struct(vv1, GSL_TYPE(gsl_vector), v1);
2831
+ FUNCTION(gsl_vector,scale)(v1, x);
2832
+ return vv1;
2833
+ }
2834
+ }
2835
+
2836
+ static VALUE FUNCTION(rb_gsl_vector,div_inplace)(VALUE vv1, VALUE vv2)
2837
+ {
2838
+ GSL_TYPE(gsl_vector) *v1;
2839
+ double x;
2840
+ if(VEC_P(vv2)) {
2841
+ return FUNCTION(rb_gsl_vector,op_inplace)(vv1, vv2, FUNCTION(gsl_vector,div));
2842
+ } else {
2843
+ x = NUM2DBL(vv2);
2844
+ Data_Get_Struct(vv1, GSL_TYPE(gsl_vector), v1);
2845
+ FUNCTION(gsl_vector,scale)(v1, 1.0/x);
2846
+ return vv1;
2847
+ }
2848
+ }
2849
+
2850
+ static VALUE FUNCTION(rb_gsl_vector,zip)(int argc, VALUE *argv, VALUE obj)
2851
+ {
2852
+ GSL_TYPE(gsl_vector) *v0, **vp, *vnew;
2853
+ VALUE ary;
2854
+ size_t i, j;
2855
+ int argc2;
2856
+ VALUE *argv2;
2857
+ if (VEC_P(obj)) {
2858
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v0);
2859
+ argc2 = argc;
2860
+ argv2 = argv;
2861
+ } else {
2862
+ if (argc < 1) rb_raise(rb_eArgError, "Too few arguments.");
2863
+ Data_Get_Struct(argv[0], GSL_TYPE(gsl_vector), v0);
2864
+ argc2 = argc - 1;
2865
+ argv2 = argv + 1;
2866
+ }
2867
+ for (i = 0; i < argc2; i++) {
2868
+ CHECK_VEC(argv2[i]);
2869
+ }
2870
+ vp = (GSL_TYPE(gsl_vector)**) malloc(sizeof(GSL_TYPE(gsl_vector)**));
2871
+ for (i = 0; i < argc2; i++) {
2872
+ Data_Get_Struct(argv2[i], GSL_TYPE(gsl_vector), vp[i]);
2873
+ }
2874
+ ary = rb_ary_new2(v0->size);
2875
+ for (i = 0; i < v0->size; i++) {
2876
+ vnew = FUNCTION(gsl_vector,alloc)(argc2 + 1);
2877
+ FUNCTION(gsl_vector,set)(vnew, 0, FUNCTION(gsl_vector,get)(v0, i));
2878
+ for (j = 0; j < argc2; j++) {
2879
+ if (i < vp[j]->size) {
2880
+ FUNCTION(gsl_vector,set)(vnew, j+1, FUNCTION(gsl_vector,get)(vp[j], i));
2881
+ } else {
2882
+ FUNCTION(gsl_vector,set)(vnew, j+1, 0.0);
2883
+ }
2884
+ }
2885
+ rb_ary_store(ary, i, Data_Wrap_Struct(GSL_TYPE(cgsl_vector), 0, FUNCTION(gsl_vector,free), vnew));
2886
+ }
2887
+
2888
+ free((GSL_TYPE(gsl_vector)**) vp);
2889
+ return ary;
2890
+ }
2891
+
2892
+ static VALUE FUNCTION(rb_gsl_vector,join)(int argc, VALUE *argv, VALUE obj)
2893
+ {
2894
+ GSL_TYPE(gsl_vector) *v;
2895
+ VALUE str, sep;
2896
+ char *p, buf[16];
2897
+ size_t i;
2898
+ switch (argc) {
2899
+ case 0:
2900
+ sep = rb_str_new2(" ");
2901
+ break;
2902
+ case 1:
2903
+ sep = argv[0];
2904
+ break;
2905
+ default:
2906
+ rb_raise(rb_eArgError, "Wrong number of arguments (%d for 0 or 1)", argc);
2907
+ }
2908
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2909
+ // p = (char *) malloc((10+RSTRING(sep))*v->size + 1);
2910
+ p = (char *) malloc((10+RSTRING_LEN(sep))*v->size + 1);
2911
+ str = rb_str_new2(p);
2912
+ for (i = 0; i < v->size; i++) {
2913
+ #ifdef BASE_DOUBLE
2914
+ sprintf(buf, "%4.3e", FUNCTION(gsl_vector,get)(v, i));
2915
+ #else
2916
+ sprintf(buf, "%d", FUNCTION(gsl_vector,get)(v, i));
2917
+ #endif
2918
+ rb_str_concat(str, rb_str_new2(buf));
2919
+ if (i != v->size-1) rb_str_concat(str, sep);
2920
+ }
2921
+ return str;
2922
+ }
2923
+
2924
+ static VALUE FUNCTION(rb_gsl_vector,cumsum)(VALUE obj)
2925
+ {
2926
+ GSL_TYPE(gsl_vector) *v, *vnew;
2927
+ BASE sum = 0;
2928
+ size_t i;
2929
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2930
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
2931
+ for (i = 0; i < v->size; i++) {
2932
+ sum += FUNCTION(gsl_vector,get)(v, i);
2933
+ FUNCTION(gsl_vector,set)(vnew, i, sum);
2934
+ }
2935
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
2936
+ }
2937
+
2938
+ static VALUE FUNCTION(rb_gsl_vector,cumprod)(VALUE obj)
2939
+ {
2940
+ GSL_TYPE(gsl_vector) *v, *vnew;
2941
+ BASE prod = 1;
2942
+ size_t i;
2943
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2944
+ vnew = FUNCTION(gsl_vector,alloc)(v->size);
2945
+ for (i = 0; i < v->size; i++) {
2946
+ prod *= FUNCTION(gsl_vector,get)(v, i);
2947
+ FUNCTION(gsl_vector,set)(vnew, i, prod);
2948
+ }
2949
+ return Data_Wrap_Struct(VEC_ROW_COL(obj), 0, FUNCTION(gsl_vector,free), vnew);
2950
+ }
2951
+
2952
+ #ifdef GSL_1_9_LATER
2953
+ static VALUE FUNCTION(rb_gsl_vector,property)(VALUE obj,
2954
+ int (*f)(const GSL_TYPE(gsl_vector) *)) {
2955
+ GSL_TYPE(gsl_vector) *v;
2956
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2957
+ return INT2FIX((*f)(v));
2958
+ }
2959
+
2960
+ static VALUE FUNCTION(rb_gsl_vector,property2)(VALUE obj,
2961
+ int (*f)(const GSL_TYPE(gsl_vector) *)) {
2962
+ GSL_TYPE(gsl_vector) *v;
2963
+ Data_Get_Struct(obj, GSL_TYPE(gsl_vector), v);
2964
+ if ((*f)(v)) return Qtrue;
2965
+ else return Qfalse;
2966
+ }
2967
+
2968
+ static VALUE FUNCTION(rb_gsl_vector,ispos)(VALUE obj)
2969
+ {
2970
+ return FUNCTION(rb_gsl_vector,property)(obj, FUNCTION(gsl_vector, ispos));
2971
+ }
2972
+ static VALUE FUNCTION(rb_gsl_vector,ispos2)(VALUE obj)
2973
+ {
2974
+ return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, ispos));
2975
+ }
2976
+ static VALUE FUNCTION(rb_gsl_vector,isneg)(VALUE obj)
2977
+ {
2978
+ return FUNCTION(rb_gsl_vector,property)(obj, FUNCTION(gsl_vector, isneg));
2979
+ }
2980
+ static VALUE FUNCTION(rb_gsl_vector,isneg2)(VALUE obj)
2981
+ {
2982
+ return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, isneg));
2983
+ }
2984
+ #endif
2985
+
2986
+ #ifdef GSL_1_10_LATER
2987
+ static VALUE FUNCTION(rb_gsl_vector,isnonneg)(VALUE obj)
2988
+ {
2989
+ return FUNCTION(rb_gsl_vector,property)(obj, FUNCTION(gsl_vector, isnonneg));
2990
+ }
2991
+ static VALUE FUNCTION(rb_gsl_vector,isnonneg2)(VALUE obj)
2992
+ {
2993
+ return FUNCTION(rb_gsl_vector,property2)(obj, FUNCTION(gsl_vector, isnonneg));
2994
+ }
2995
+ #endif
2996
+
2997
+ void FUNCTION(Init_gsl_vector,init)(VALUE module)
2998
+ {
2999
+ /* rb_define_singleton_method(GSL_TYPE(cgsl_vector), "new",
3000
+ FUNCTION(rb_gsl_vector,new), -1);*/
3001
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "[]",
3002
+ FUNCTION(rb_gsl_vector,new), -1);
3003
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "alloc",
3004
+ FUNCTION(rb_gsl_vector,new), -1);
3005
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "calloc",
3006
+ FUNCTION(rb_gsl_vector,calloc), 1);
3007
+
3008
+ /*****/
3009
+ rb_define_method(GSL_TYPE(cgsl_vector), "get", FUNCTION(rb_gsl_vector,get), -1);
3010
+ rb_define_alias(GSL_TYPE(cgsl_vector), "[]", "get");
3011
+ rb_define_method(GSL_TYPE(cgsl_vector), "size", FUNCTION(rb_gsl_vector,size), 0);
3012
+ rb_define_alias(GSL_TYPE(cgsl_vector), "len", "size");
3013
+ rb_define_alias(GSL_TYPE(cgsl_vector), "length", "size");
3014
+ rb_define_method(GSL_TYPE(cgsl_vector), "stride", FUNCTION(rb_gsl_vector,stride), 0);
3015
+ rb_define_method(GSL_TYPE(cgsl_vector), "set_stride", FUNCTION(rb_gsl_vector,set_stride), 1);
3016
+ rb_define_alias(GSL_TYPE(cgsl_vector), "stride=", "set_stride");
3017
+ rb_define_method(GSL_TYPE(cgsl_vector), "owner", FUNCTION(rb_gsl_vector,owner), 0);
3018
+
3019
+ rb_define_method(GSL_TYPE(cgsl_vector), "set", FUNCTION(rb_gsl_vector,set), -1);
3020
+ rb_define_alias(GSL_TYPE(cgsl_vector), "[]=", "set");
3021
+ rb_define_method(GSL_TYPE(cgsl_vector), "set_all", FUNCTION(rb_gsl_vector,set_all), 1);
3022
+ rb_define_method(GSL_TYPE(cgsl_vector), "set_zero", FUNCTION(rb_gsl_vector,set_zero), 0);
3023
+ rb_define_method(GSL_TYPE(cgsl_vector), "set_basis", FUNCTION(rb_gsl_vector,set_basis), 1);
3024
+ rb_define_method(GSL_TYPE(cgsl_vector), "each", FUNCTION(rb_gsl_vector,each), 0);
3025
+ rb_define_method(GSL_TYPE(cgsl_vector), "reverse_each", FUNCTION(rb_gsl_vector,reverse_each), 0);
3026
+ rb_define_method(GSL_TYPE(cgsl_vector), "each_index", FUNCTION(rb_gsl_vector,each_index), 0);
3027
+ rb_define_method(GSL_TYPE(cgsl_vector), "reverse_each_index", FUNCTION(rb_gsl_vector,reverse_each_index), 0);
3028
+
3029
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_a", FUNCTION(rb_gsl_vector,to_a), 0);
3030
+
3031
+ rb_define_method(GSL_TYPE(cgsl_vector), "reverse", FUNCTION(rb_gsl_vector,reverse), 0);
3032
+ rb_define_method(GSL_TYPE(cgsl_vector), "reverse!", FUNCTION(rb_gsl_vector,reverse_bang), 0);
3033
+
3034
+ rb_define_method(GSL_TYPE(cgsl_vector), "max", FUNCTION(rb_gsl_vector,max), 0);
3035
+ rb_define_method(GSL_TYPE(cgsl_vector), "min", FUNCTION(rb_gsl_vector,min), 0);
3036
+ rb_define_method(GSL_TYPE(cgsl_vector), "minmax", FUNCTION(rb_gsl_vector,minmax), 0);
3037
+ rb_define_method(GSL_TYPE(cgsl_vector), "maxmin", FUNCTION(rb_gsl_vector,maxmin), 0);
3038
+ rb_define_method(GSL_TYPE(cgsl_vector), "max_index", FUNCTION(rb_gsl_vector,max_index), 0);
3039
+ rb_define_method(GSL_TYPE(cgsl_vector), "min_index", FUNCTION(rb_gsl_vector,min_index), 0);
3040
+ rb_define_method(GSL_TYPE(cgsl_vector), "minmax_index", FUNCTION(rb_gsl_vector,minmax_index), 0);
3041
+ rb_define_method(GSL_TYPE(cgsl_vector), "maxmin_index", FUNCTION(rb_gsl_vector,maxmin_index), 0);
3042
+ rb_define_method(GSL_TYPE(cgsl_vector), "isnull", FUNCTION(rb_gsl_vector,isnull), 0);
3043
+ rb_define_method(GSL_TYPE(cgsl_vector), "isnull?", FUNCTION(rb_gsl_vector,isnull2), 0);
3044
+ /* rb_define_alias(GSL_TYPE(cgsl_vector), "none?", "isnull?");*/
3045
+ /* none? method is define below, which can have a block. */
3046
+
3047
+ rb_define_method(GSL_TYPE(cgsl_vector), "trans", FUNCTION(rb_gsl_vector,trans), 0);
3048
+ rb_define_alias(GSL_TYPE(cgsl_vector), "transpose", "trans");
3049
+ rb_define_alias(GSL_TYPE(cgsl_vector), "col", "trans");
3050
+
3051
+ rb_define_method(GSL_TYPE(cgsl_vector), "trans!", FUNCTION(rb_gsl_vector,trans_bang), 0);
3052
+ rb_define_alias(GSL_TYPE(cgsl_vector), "transpose!", "trans!");
3053
+ rb_define_alias(GSL_TYPE(cgsl_vector), "col!", "trans!");
3054
+ #ifdef BASE_DOUBLE
3055
+ rb_define_alias(cgsl_vector_col, "row", "trans");
3056
+ rb_define_alias(cgsl_vector_col, "row!", "trans!");
3057
+ #elif defined(BASE_INT)
3058
+ rb_define_alias(cgsl_vector_int_col, "row", "trans");
3059
+ rb_define_alias(cgsl_vector_int_col, "row!", "trans!");
3060
+ #endif
3061
+
3062
+ rb_define_method(GSL_TYPE(cgsl_vector), "-@", FUNCTION(rb_gsl_vector,uminus), 0);
3063
+ rb_define_method(GSL_TYPE(cgsl_vector), "+@", FUNCTION(rb_gsl_vector,uplus), 0);
3064
+
3065
+ rb_define_method(GSL_TYPE(cgsl_vector), "sum", FUNCTION(rb_gsl_vector,sum), 0);
3066
+ #ifdef BASE_INT
3067
+ /* Vector#sumsq is defined in blas1.c */
3068
+ rb_define_method(GSL_TYPE(cgsl_vector), "sumsq", FUNCTION(rb_gsl_vector,sumsq), 0);
3069
+ #endif
3070
+ rb_define_method(GSL_TYPE(cgsl_vector), "prod", FUNCTION(rb_gsl_vector,prod), 0);
3071
+
3072
+ rb_define_method(GSL_TYPE(cgsl_vector), "cumsum", FUNCTION(rb_gsl_vector,cumsum), 0);
3073
+ rb_define_method(GSL_TYPE(cgsl_vector), "cumprod", FUNCTION(rb_gsl_vector,cumprod), 0);
3074
+
3075
+ rb_define_method(GSL_TYPE(cgsl_vector), "connect",
3076
+ FUNCTION(rb_gsl_vector,connect), -1);
3077
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "connect",
3078
+ FUNCTION(rb_gsl_vector,connect), -1);
3079
+
3080
+
3081
+ rb_define_method(GSL_TYPE(cgsl_vector), "sgn", FUNCTION(rb_gsl_vector,sgn), 0);
3082
+ rb_define_alias(GSL_TYPE(cgsl_vector), "signum", "sgn");
3083
+ rb_define_method(GSL_TYPE(cgsl_vector), "abs", FUNCTION(rb_gsl_vector,abs), 0);
3084
+ rb_define_alias(GSL_TYPE(cgsl_vector), "fabs", "abs");
3085
+ rb_define_method(GSL_TYPE(cgsl_vector), "square",
3086
+ FUNCTION(rb_gsl_vector,square), 0);
3087
+ rb_define_alias(GSL_TYPE(cgsl_vector), "abs2", "square");
3088
+ rb_define_method(GSL_TYPE(cgsl_vector), "sqrt", FUNCTION(rb_gsl_vector,sqrt), 0);
3089
+
3090
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "memcpy",
3091
+ FUNCTION(rb_gsl_vector,memcpy), 2);
3092
+ rb_define_method(GSL_TYPE(cgsl_vector), "clone",
3093
+ FUNCTION(rb_gsl_vector,clone), 0);
3094
+ rb_define_alias(GSL_TYPE(cgsl_vector), "duplicate", "clone");
3095
+ rb_define_alias(GSL_TYPE(cgsl_vector), "dup", "clone");
3096
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "swap",
3097
+ FUNCTION(rb_gsl_vector,swap), 2);
3098
+ rb_define_method(GSL_TYPE(cgsl_vector), "swap_elements",
3099
+ FUNCTION(rb_gsl_vector,swap_elements), 2);
3100
+
3101
+ rb_define_method(GSL_TYPE(cgsl_vector), "fwrite",
3102
+ FUNCTION(rb_gsl_vector,fwrite), 1);
3103
+ rb_define_method(GSL_TYPE(cgsl_vector), "fread",
3104
+ FUNCTION(rb_gsl_vector,fread), 1);
3105
+ rb_define_method(GSL_TYPE(cgsl_vector), "fprintf",
3106
+ FUNCTION(rb_gsl_vector,fprintf), -1);
3107
+ rb_define_method(GSL_TYPE(cgsl_vector), "printf",
3108
+ FUNCTION(rb_gsl_vector,printf), -1);
3109
+ rb_define_method(GSL_TYPE(cgsl_vector), "fscanf",
3110
+ FUNCTION(rb_gsl_vector,fscanf), 1);
3111
+
3112
+ /* 2.Aug.2004 */
3113
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "inner_product",
3114
+ FUNCTION(rb_gsl_vector,inner_product), -1);
3115
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "dot",
3116
+ FUNCTION(rb_gsl_vector,inner_product), -1);
3117
+ rb_define_method(GSL_TYPE(cgsl_vector), "inner_product",
3118
+ FUNCTION(rb_gsl_vector,inner_product), -1);
3119
+ rb_define_alias(GSL_TYPE(cgsl_vector), "dot", "inner_product");
3120
+
3121
+ rb_define_method(GSL_TYPE(cgsl_vector), "equal?",
3122
+ FUNCTION(rb_gsl_vector,equal), -1);
3123
+ rb_define_alias(GSL_TYPE(cgsl_vector), "==", "equal?");
3124
+
3125
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_poly",
3126
+ FUNCTION(rb_gsl_vector,to_poly), 0);
3127
+
3128
+ /*****/
3129
+ rb_define_method(GSL_TYPE(cgsl_vector), "graph",
3130
+ FUNCTION(rb_gsl_vector,graph), -1);
3131
+ rb_define_method(GSL_TYPE(cgsl_vector), "graph_step",
3132
+ FUNCTION(rb_gsl_vector,graph_step), -1);
3133
+ rb_define_method(GSL_TYPE(cgsl_vector), "plot",
3134
+ FUNCTION(rb_gsl_vector,plot), -1);
3135
+
3136
+ rb_define_method(GSL_TYPE(cgsl_vector), "print",
3137
+ FUNCTION(rb_gsl_vector,print), 0);
3138
+ rb_define_method(GSL_TYPE(cgsl_vector), "inspect",
3139
+ FUNCTION(rb_gsl_vector,inspect), 0);
3140
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_s",
3141
+ FUNCTION(rb_gsl_vector,to_s), 0);
3142
+
3143
+ /*****/
3144
+ rb_define_method(GSL_TYPE(cgsl_vector), "subvector",
3145
+ FUNCTION(rb_gsl_vector,subvector), -1);
3146
+ rb_define_alias(GSL_TYPE(cgsl_vector), "view", "subvector");
3147
+ rb_define_method(GSL_TYPE(cgsl_vector), "subvector_with_stride",
3148
+ FUNCTION(rb_gsl_vector,subvector_with_stride), -1);
3149
+ rb_define_alias(GSL_TYPE(cgsl_vector), "view_with_stride", "subvector_with_stride");
3150
+
3151
+ rb_define_method(GSL_TYPE(cgsl_vector), "matrix_view",
3152
+ FUNCTION(rb_gsl_vector,matrix_view), -1);
3153
+ rb_define_method(GSL_TYPE(cgsl_vector), "matrix_view_with_tda",
3154
+ FUNCTION(rb_gsl_vector,matrix_view_with_tda), 3);
3155
+
3156
+ #ifdef BASE_DOUBLE
3157
+ rb_undef_method(cgsl_vector_view_ro, "set");
3158
+ rb_undef_method(cgsl_vector_view_ro, "[]=");
3159
+ rb_undef_method(cgsl_vector_col_view_ro, "set");
3160
+ rb_undef_method(cgsl_vector_col_view_ro, "[]=");
3161
+ #elif defined(BASE_INT)
3162
+ rb_undef_method(cgsl_vector_int_view_ro, "set");
3163
+ rb_undef_method(cgsl_vector_int_view_ro, "[]=");
3164
+ rb_undef_method(cgsl_vector_int_col_view_ro, "set");
3165
+ rb_undef_method(cgsl_vector_int_col_view_ro, "[]=");
3166
+ #endif
3167
+
3168
+ rb_define_method(GSL_TYPE(cgsl_vector), "scale",
3169
+ FUNCTION(rb_gsl_vector,scale), 1);
3170
+ rb_define_method(GSL_TYPE(cgsl_vector), "scale!",
3171
+ FUNCTION(rb_gsl_vector,scale_bang), 1);
3172
+ rb_define_method(GSL_TYPE(cgsl_vector), "add_constant",
3173
+ FUNCTION(rb_gsl_vector,add_constant), 1);
3174
+ rb_define_alias(GSL_TYPE(cgsl_vector), "add_const", "add_constant");
3175
+ rb_define_method(GSL_TYPE(cgsl_vector), "add_constant!",
3176
+ FUNCTION(rb_gsl_vector,add_constant_bang), 1);
3177
+ rb_define_alias(GSL_TYPE(cgsl_vector), "add_const!", "add_constant!");
3178
+
3179
+ #ifdef HAVE_TENSOR_TENSOR_H
3180
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_tensor",
3181
+ FUNCTION(rb_gsl_vector,to_tensor), -1);
3182
+ #endif
3183
+
3184
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "to_gplot",
3185
+ FUNCTION(rb_gsl_vector,to_gplot), -1);
3186
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "to_gsplot",
3187
+ FUNCTION(rb_gsl_vector,to_gplot), -1);
3188
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_gplot",
3189
+ FUNCTION(rb_gsl_vector,to_gplot), -1);
3190
+ rb_define_alias(GSL_TYPE(cgsl_vector), "to_gsplot", "to_gplot");
3191
+
3192
+ /*****/
3193
+ rb_define_method(GSL_TYPE(cgsl_vector), "collect",
3194
+ FUNCTION(rb_gsl_vector,collect), 0);
3195
+ rb_define_method(GSL_TYPE(cgsl_vector), "collect!",
3196
+ FUNCTION(rb_gsl_vector,collect_bang), 0);
3197
+ rb_define_alias(GSL_TYPE(cgsl_vector), "map", "collect");
3198
+ rb_define_alias(GSL_TYPE(cgsl_vector), "map!", "collect!");
3199
+
3200
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_m", FUNCTION(rb_gsl_vector,to_m), 2);
3201
+ rb_define_alias(GSL_TYPE(cgsl_vector), "to_matrix", "to_m");
3202
+ rb_define_alias(GSL_TYPE(cgsl_vector), "reshape", "to_m");
3203
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_m_diagonal",
3204
+ FUNCTION(rb_gsl_vector,to_m_diagonal), 0);
3205
+ rb_define_method(GSL_TYPE(cgsl_vector), "block",
3206
+ FUNCTION(rb_gsl_vector,block), 0);
3207
+ rb_define_method(GSL_TYPE(cgsl_vector), "to_m_circulant",
3208
+ FUNCTION(rb_gsl_vector,to_m_circulant), 0);
3209
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "indgen",
3210
+ FUNCTION(rb_gsl_vector,indgen_singleton), -1);
3211
+ rb_define_method(GSL_TYPE(cgsl_vector), "indgen",
3212
+ FUNCTION(rb_gsl_vector,indgen), -1);
3213
+ rb_define_method(GSL_TYPE(cgsl_vector), "indgen!",
3214
+ FUNCTION(rb_gsl_vector,indgen_bang), -1);
3215
+ /*****/
3216
+ rb_define_method(GSL_TYPE(cgsl_vector), "sort!",
3217
+ GSL_TYPE(rb_gsl_sort_vector), 0);
3218
+ rb_define_method(GSL_TYPE(cgsl_vector), "sort",
3219
+ GSL_TYPE(rb_gsl_sort_vector2), 0);
3220
+ rb_define_method(GSL_TYPE(cgsl_vector), "sort_index",
3221
+ FUNCTION(rb_gsl_sort_vector,index), 0);
3222
+ rb_define_method(GSL_TYPE(cgsl_vector), "sort_smallest",
3223
+ FUNCTION(rb_gsl_sort_vector,smallest), 1);
3224
+ rb_define_alias(GSL_TYPE(cgsl_vector), "smallest", "sort_smallest");
3225
+ rb_define_method(GSL_TYPE(cgsl_vector), "sort_largest",
3226
+ FUNCTION(rb_gsl_sort_vector,largest), 1);
3227
+ rb_define_alias(GSL_TYPE(cgsl_vector), "largest", "sort_largest");
3228
+ rb_define_method(GSL_TYPE(cgsl_vector), "sort_smallest_index",
3229
+ FUNCTION(rb_gsl_sort_vector,smallest_index), 1);
3230
+ rb_define_alias(GSL_TYPE(cgsl_vector), "smallest_index", "sort_smallest_index");
3231
+ rb_define_method(GSL_TYPE(cgsl_vector), "sort_largest_index",
3232
+ FUNCTION(rb_gsl_sort_vector,largest_index), 1);
3233
+ rb_define_alias(GSL_TYPE(cgsl_vector), "largest_index", "sort_largest_index");
3234
+
3235
+ /*****/
3236
+ rb_define_method(GSL_TYPE(cgsl_vector), "histogram",
3237
+ FUNCTION(rb_gsl_vector,histogram), -1);
3238
+
3239
+ rb_define_method(GSL_TYPE(cgsl_vector), "last",
3240
+ FUNCTION(rb_gsl_vector,last), 0);
3241
+ rb_define_method(GSL_TYPE(cgsl_vector), "first",
3242
+ FUNCTION(rb_gsl_vector,first), 0);
3243
+ rb_define_method(GSL_TYPE(cgsl_vector), "concat",
3244
+ FUNCTION(rb_gsl_vector,concat), 1);
3245
+
3246
+ rb_define_method(GSL_TYPE(cgsl_vector), "diff",
3247
+ FUNCTION(rb_gsl_vector,diff), -1);
3248
+ rb_define_method(GSL_TYPE(cgsl_vector), "isnan",
3249
+ FUNCTION(rb_gsl_vector,isnan), 0);
3250
+ rb_define_method(GSL_TYPE(cgsl_vector), "isinf",
3251
+ FUNCTION(rb_gsl_vector,isinf), 0);
3252
+ rb_define_method(GSL_TYPE(cgsl_vector), "finite",
3253
+ FUNCTION(rb_gsl_vector,finite), 0);
3254
+
3255
+ rb_define_method(GSL_TYPE(cgsl_vector), "isnan?",
3256
+ FUNCTION(rb_gsl_vector,isnan2), 0);
3257
+ rb_define_method(GSL_TYPE(cgsl_vector), "isinf?",
3258
+ FUNCTION(rb_gsl_vector,isinf2), 0);
3259
+ rb_define_method(GSL_TYPE(cgsl_vector), "finite?",
3260
+ FUNCTION(rb_gsl_vector,finite2), 0);
3261
+
3262
+ rb_define_method(GSL_TYPE(cgsl_vector), "delete_at",
3263
+ FUNCTION(rb_gsl_vector,delete_at), 1);
3264
+ rb_define_method(GSL_TYPE(cgsl_vector), "delete_if",
3265
+ FUNCTION(rb_gsl_vector,delete_if), 0);
3266
+ rb_define_method(GSL_TYPE(cgsl_vector), "delete",
3267
+ FUNCTION(rb_gsl_vector,delete), 1);
3268
+ /***/
3269
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "filescan", FUNCTION(rb_gsl_vector,filescan), 1);
3270
+
3271
+ /*****/
3272
+ rb_define_method(GSL_TYPE(cgsl_vector), "eq", FUNCTION(rb_gsl_vector,eq), 1);
3273
+ rb_define_method(GSL_TYPE(cgsl_vector), "ne", FUNCTION(rb_gsl_vector,ne), 1);
3274
+ rb_define_method(GSL_TYPE(cgsl_vector), "gt", FUNCTION(rb_gsl_vector,gt), 1);
3275
+ rb_define_alias(GSL_TYPE(cgsl_vector), ">", "gt");
3276
+ rb_define_method(GSL_TYPE(cgsl_vector), "ge", FUNCTION(rb_gsl_vector,ge), 1);
3277
+ rb_define_alias(GSL_TYPE(cgsl_vector), ">=", "ge");
3278
+ rb_define_method(GSL_TYPE(cgsl_vector), "lt", FUNCTION(rb_gsl_vector,lt), 1);
3279
+ rb_define_alias(GSL_TYPE(cgsl_vector), "<", "lt");
3280
+ rb_define_method(GSL_TYPE(cgsl_vector), "le", FUNCTION(rb_gsl_vector,le), 1);
3281
+ rb_define_alias(GSL_TYPE(cgsl_vector), "<=", "le");
3282
+
3283
+ rb_define_method(GSL_TYPE(cgsl_vector), "and", FUNCTION(rb_gsl_vector,and), 1);
3284
+ rb_define_method(GSL_TYPE(cgsl_vector), "or", FUNCTION(rb_gsl_vector,or), 1);
3285
+ rb_define_method(GSL_TYPE(cgsl_vector), "xor", FUNCTION(rb_gsl_vector,xor), 1);
3286
+ rb_define_method(GSL_TYPE(cgsl_vector), "not", FUNCTION(rb_gsl_vector,not), 0);
3287
+
3288
+ rb_define_method(GSL_TYPE(cgsl_vector), "all?", FUNCTION(rb_gsl_vector,all), 0);
3289
+ rb_define_method(GSL_TYPE(cgsl_vector), "none?", FUNCTION(rb_gsl_vector,none), 0);
3290
+ rb_define_method(GSL_TYPE(cgsl_vector), "any",
3291
+ FUNCTION(rb_gsl_vector,any), 0);
3292
+ rb_define_method(GSL_TYPE(cgsl_vector), "any?",
3293
+ FUNCTION(rb_gsl_vector,any2), 0);
3294
+
3295
+ rb_define_method(GSL_TYPE(cgsl_vector), "where", FUNCTION(rb_gsl_vector,where), 0);
3296
+ rb_define_method(GSL_TYPE(cgsl_vector), "where2", FUNCTION(rb_gsl_vector,where2), 0);
3297
+
3298
+ rb_define_method(GSL_TYPE(cgsl_vector), "add!", FUNCTION(rb_gsl_vector,add_inplace), 1);
3299
+ rb_define_method(GSL_TYPE(cgsl_vector), "sub!", FUNCTION(rb_gsl_vector,sub_inplace), 1);
3300
+ rb_define_method(GSL_TYPE(cgsl_vector), "mul!", FUNCTION(rb_gsl_vector,mul_inplace), 1);
3301
+ rb_define_method(GSL_TYPE(cgsl_vector), "div!", FUNCTION(rb_gsl_vector,div_inplace), 1);
3302
+
3303
+ rb_define_singleton_method(GSL_TYPE(cgsl_vector), "zip", FUNCTION(rb_gsl_vector,zip), -1);
3304
+ rb_define_method(GSL_TYPE(cgsl_vector), "zip", FUNCTION(rb_gsl_vector,zip), -1);
3305
+ rb_define_method(GSL_TYPE(cgsl_vector), "join", FUNCTION(rb_gsl_vector,join), -1);
3306
+ #ifdef GSL_1_9_LATER
3307
+ rb_define_method(GSL_TYPE(cgsl_vector), "ispos", FUNCTION(rb_gsl_vector,ispos), 0);
3308
+ rb_define_method(GSL_TYPE(cgsl_vector), "ispos?", FUNCTION(rb_gsl_vector,ispos2), 0);
3309
+ rb_define_method(GSL_TYPE(cgsl_vector), "isneg", FUNCTION(rb_gsl_vector,isneg), 0);
3310
+ rb_define_method(GSL_TYPE(cgsl_vector), "isneg?", FUNCTION(rb_gsl_vector,isneg2), 0);
3311
+ #endif
3312
+
3313
+ #ifdef GSL_1_10_LATER
3314
+ rb_define_method(GSL_TYPE(cgsl_vector), "isnonneg", FUNCTION(rb_gsl_vector,isnonneg), 0);
3315
+ rb_define_method(GSL_TYPE(cgsl_vector), "isnonneg?", FUNCTION(rb_gsl_vector,isnonneg2), 0);
3316
+ #endif
3317
+ }
3318
+
3319
+ #undef NUMCONV
3320
+ #undef NUMCONV2
3321
+ #undef PRINTF_FORMAT
3322
+ #undef VEC_ROW_COL
3323
+ #undef VEC_P
3324
+ #undef C_TO_VALUE
3325
+ #undef C_TO_VALUE2
3326
+ #undef VEC_COL_P
3327
+ #undef VEC_ROW_P
3328
+ #undef CHECK_VEC
3329
+ #undef VEC_VIEW_P