gsl 1.12.108

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. data/README.rdoc +29 -0
  2. data/Rakefile +54 -0
  3. data/VERSION +2 -0
  4. data/ext/MANIFEST +119 -0
  5. data/ext/alf.c +206 -0
  6. data/ext/array.c +666 -0
  7. data/ext/array_complex.c +247 -0
  8. data/ext/blas.c +29 -0
  9. data/ext/blas1.c +731 -0
  10. data/ext/blas2.c +1093 -0
  11. data/ext/blas3.c +881 -0
  12. data/ext/block.c +44 -0
  13. data/ext/block_source.c +886 -0
  14. data/ext/bspline.c +130 -0
  15. data/ext/bundle.c +3 -0
  16. data/ext/cdf.c +754 -0
  17. data/ext/cheb.c +542 -0
  18. data/ext/combination.c +283 -0
  19. data/ext/common.c +325 -0
  20. data/ext/complex.c +1004 -0
  21. data/ext/const.c +673 -0
  22. data/ext/const_additional.c +120 -0
  23. data/ext/cqp.c +283 -0
  24. data/ext/deriv.c +195 -0
  25. data/ext/dht.c +361 -0
  26. data/ext/diff.c +166 -0
  27. data/ext/dirac.c +395 -0
  28. data/ext/eigen.c +2373 -0
  29. data/ext/error.c +194 -0
  30. data/ext/extconf.rb +281 -0
  31. data/ext/fcmp.c +66 -0
  32. data/ext/fft.c +1092 -0
  33. data/ext/fit.c +205 -0
  34. data/ext/fresnel.c +312 -0
  35. data/ext/function.c +524 -0
  36. data/ext/geometry.c +139 -0
  37. data/ext/graph.c +1638 -0
  38. data/ext/gsl.c +271 -0
  39. data/ext/gsl_narray.c +653 -0
  40. data/ext/histogram.c +1995 -0
  41. data/ext/histogram2d.c +1068 -0
  42. data/ext/histogram3d.c +884 -0
  43. data/ext/histogram3d_source.c +750 -0
  44. data/ext/histogram_find.c +101 -0
  45. data/ext/histogram_oper.c +159 -0
  46. data/ext/ieee.c +98 -0
  47. data/ext/integration.c +1138 -0
  48. data/ext/interp.c +512 -0
  49. data/ext/jacobi.c +739 -0
  50. data/ext/linalg.c +4047 -0
  51. data/ext/linalg_complex.c +741 -0
  52. data/ext/math.c +725 -0
  53. data/ext/matrix.c +39 -0
  54. data/ext/matrix_complex.c +1732 -0
  55. data/ext/matrix_double.c +560 -0
  56. data/ext/matrix_int.c +256 -0
  57. data/ext/matrix_source.c +2733 -0
  58. data/ext/min.c +250 -0
  59. data/ext/monte.c +992 -0
  60. data/ext/multifit.c +1879 -0
  61. data/ext/multimin.c +808 -0
  62. data/ext/multimin_fsdf.c +156 -0
  63. data/ext/multiroots.c +955 -0
  64. data/ext/ndlinear.c +321 -0
  65. data/ext/nmf.c +167 -0
  66. data/ext/nmf_wrap.c +72 -0
  67. data/ext/ntuple.c +469 -0
  68. data/ext/odeiv.c +959 -0
  69. data/ext/ool.c +879 -0
  70. data/ext/oper_complex_source.c +253 -0
  71. data/ext/permutation.c +596 -0
  72. data/ext/poly.c +42 -0
  73. data/ext/poly2.c +265 -0
  74. data/ext/poly_source.c +1885 -0
  75. data/ext/qrng.c +171 -0
  76. data/ext/randist.c +1873 -0
  77. data/ext/rational.c +480 -0
  78. data/ext/rng.c +612 -0
  79. data/ext/root.c +408 -0
  80. data/ext/sf.c +1494 -0
  81. data/ext/sf_airy.c +200 -0
  82. data/ext/sf_bessel.c +867 -0
  83. data/ext/sf_clausen.c +28 -0
  84. data/ext/sf_coulomb.c +206 -0
  85. data/ext/sf_coupling.c +118 -0
  86. data/ext/sf_dawson.c +29 -0
  87. data/ext/sf_debye.c +157 -0
  88. data/ext/sf_dilog.c +42 -0
  89. data/ext/sf_elementary.c +44 -0
  90. data/ext/sf_ellint.c +206 -0
  91. data/ext/sf_elljac.c +29 -0
  92. data/ext/sf_erfc.c +93 -0
  93. data/ext/sf_exp.c +164 -0
  94. data/ext/sf_expint.c +211 -0
  95. data/ext/sf_fermi_dirac.c +148 -0
  96. data/ext/sf_gamma.c +344 -0
  97. data/ext/sf_gegenbauer.c +96 -0
  98. data/ext/sf_hyperg.c +197 -0
  99. data/ext/sf_laguerre.c +112 -0
  100. data/ext/sf_lambert.c +47 -0
  101. data/ext/sf_legendre.c +367 -0
  102. data/ext/sf_log.c +104 -0
  103. data/ext/sf_mathieu.c +238 -0
  104. data/ext/sf_power.c +46 -0
  105. data/ext/sf_psi.c +98 -0
  106. data/ext/sf_synchrotron.c +48 -0
  107. data/ext/sf_transport.c +76 -0
  108. data/ext/sf_trigonometric.c +207 -0
  109. data/ext/sf_zeta.c +119 -0
  110. data/ext/signal.c +310 -0
  111. data/ext/siman.c +718 -0
  112. data/ext/sort.c +208 -0
  113. data/ext/spline.c +395 -0
  114. data/ext/stats.c +799 -0
  115. data/ext/sum.c +168 -0
  116. data/ext/tamu_anova.c +56 -0
  117. data/ext/tensor.c +38 -0
  118. data/ext/tensor_source.c +1123 -0
  119. data/ext/vector.c +38 -0
  120. data/ext/vector_complex.c +2236 -0
  121. data/ext/vector_double.c +1433 -0
  122. data/ext/vector_int.c +204 -0
  123. data/ext/vector_source.c +3329 -0
  124. data/ext/wavelet.c +937 -0
  125. data/include/rb_gsl.h +151 -0
  126. data/include/rb_gsl_array.h +238 -0
  127. data/include/rb_gsl_cheb.h +21 -0
  128. data/include/rb_gsl_common.h +343 -0
  129. data/include/rb_gsl_complex.h +25 -0
  130. data/include/rb_gsl_const.h +29 -0
  131. data/include/rb_gsl_dirac.h +13 -0
  132. data/include/rb_gsl_eigen.h +17 -0
  133. data/include/rb_gsl_fft.h +62 -0
  134. data/include/rb_gsl_fit.h +25 -0
  135. data/include/rb_gsl_function.h +27 -0
  136. data/include/rb_gsl_graph.h +70 -0
  137. data/include/rb_gsl_histogram.h +63 -0
  138. data/include/rb_gsl_histogram3d.h +97 -0
  139. data/include/rb_gsl_integration.h +17 -0
  140. data/include/rb_gsl_interp.h +46 -0
  141. data/include/rb_gsl_linalg.h +25 -0
  142. data/include/rb_gsl_math.h +26 -0
  143. data/include/rb_gsl_odeiv.h +21 -0
  144. data/include/rb_gsl_poly.h +71 -0
  145. data/include/rb_gsl_rational.h +37 -0
  146. data/include/rb_gsl_rng.h +21 -0
  147. data/include/rb_gsl_root.h +22 -0
  148. data/include/rb_gsl_sf.h +119 -0
  149. data/include/rb_gsl_statistics.h +17 -0
  150. data/include/rb_gsl_tensor.h +45 -0
  151. data/include/rb_gsl_with_narray.h +22 -0
  152. data/include/templates_off.h +87 -0
  153. data/include/templates_on.h +241 -0
  154. data/lib/gsl/gnuplot.rb +41 -0
  155. data/lib/gsl/oper.rb +68 -0
  156. data/lib/ool.rb +22 -0
  157. data/lib/ool/conmin.rb +30 -0
  158. metadata +224 -0
@@ -0,0 +1,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