gsl 1.12.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +29 -0
- data/Rakefile +54 -0
- data/VERSION +2 -0
- data/ext/MANIFEST +119 -0
- data/ext/alf.c +206 -0
- data/ext/array.c +666 -0
- data/ext/array_complex.c +247 -0
- data/ext/blas.c +29 -0
- data/ext/blas1.c +731 -0
- data/ext/blas2.c +1093 -0
- data/ext/blas3.c +881 -0
- data/ext/block.c +44 -0
- data/ext/block_source.c +886 -0
- data/ext/bspline.c +130 -0
- data/ext/bundle.c +3 -0
- data/ext/cdf.c +754 -0
- data/ext/cheb.c +542 -0
- data/ext/combination.c +283 -0
- data/ext/common.c +325 -0
- data/ext/complex.c +1004 -0
- data/ext/const.c +673 -0
- data/ext/const_additional.c +120 -0
- data/ext/cqp.c +283 -0
- data/ext/deriv.c +195 -0
- data/ext/dht.c +361 -0
- data/ext/diff.c +166 -0
- data/ext/dirac.c +395 -0
- data/ext/eigen.c +2373 -0
- data/ext/error.c +194 -0
- data/ext/extconf.rb +281 -0
- data/ext/fcmp.c +66 -0
- data/ext/fft.c +1092 -0
- data/ext/fit.c +205 -0
- data/ext/fresnel.c +312 -0
- data/ext/function.c +524 -0
- data/ext/geometry.c +139 -0
- data/ext/graph.c +1638 -0
- data/ext/gsl.c +271 -0
- data/ext/gsl_narray.c +653 -0
- data/ext/histogram.c +1995 -0
- data/ext/histogram2d.c +1068 -0
- data/ext/histogram3d.c +884 -0
- data/ext/histogram3d_source.c +750 -0
- data/ext/histogram_find.c +101 -0
- data/ext/histogram_oper.c +159 -0
- data/ext/ieee.c +98 -0
- data/ext/integration.c +1138 -0
- data/ext/interp.c +512 -0
- data/ext/jacobi.c +739 -0
- data/ext/linalg.c +4047 -0
- data/ext/linalg_complex.c +741 -0
- data/ext/math.c +725 -0
- data/ext/matrix.c +39 -0
- data/ext/matrix_complex.c +1732 -0
- data/ext/matrix_double.c +560 -0
- data/ext/matrix_int.c +256 -0
- data/ext/matrix_source.c +2733 -0
- data/ext/min.c +250 -0
- data/ext/monte.c +992 -0
- data/ext/multifit.c +1879 -0
- data/ext/multimin.c +808 -0
- data/ext/multimin_fsdf.c +156 -0
- data/ext/multiroots.c +955 -0
- data/ext/ndlinear.c +321 -0
- data/ext/nmf.c +167 -0
- data/ext/nmf_wrap.c +72 -0
- data/ext/ntuple.c +469 -0
- data/ext/odeiv.c +959 -0
- data/ext/ool.c +879 -0
- data/ext/oper_complex_source.c +253 -0
- data/ext/permutation.c +596 -0
- data/ext/poly.c +42 -0
- data/ext/poly2.c +265 -0
- data/ext/poly_source.c +1885 -0
- data/ext/qrng.c +171 -0
- data/ext/randist.c +1873 -0
- data/ext/rational.c +480 -0
- data/ext/rng.c +612 -0
- data/ext/root.c +408 -0
- data/ext/sf.c +1494 -0
- data/ext/sf_airy.c +200 -0
- data/ext/sf_bessel.c +867 -0
- data/ext/sf_clausen.c +28 -0
- data/ext/sf_coulomb.c +206 -0
- data/ext/sf_coupling.c +118 -0
- data/ext/sf_dawson.c +29 -0
- data/ext/sf_debye.c +157 -0
- data/ext/sf_dilog.c +42 -0
- data/ext/sf_elementary.c +44 -0
- data/ext/sf_ellint.c +206 -0
- data/ext/sf_elljac.c +29 -0
- data/ext/sf_erfc.c +93 -0
- data/ext/sf_exp.c +164 -0
- data/ext/sf_expint.c +211 -0
- data/ext/sf_fermi_dirac.c +148 -0
- data/ext/sf_gamma.c +344 -0
- data/ext/sf_gegenbauer.c +96 -0
- data/ext/sf_hyperg.c +197 -0
- data/ext/sf_laguerre.c +112 -0
- data/ext/sf_lambert.c +47 -0
- data/ext/sf_legendre.c +367 -0
- data/ext/sf_log.c +104 -0
- data/ext/sf_mathieu.c +238 -0
- data/ext/sf_power.c +46 -0
- data/ext/sf_psi.c +98 -0
- data/ext/sf_synchrotron.c +48 -0
- data/ext/sf_transport.c +76 -0
- data/ext/sf_trigonometric.c +207 -0
- data/ext/sf_zeta.c +119 -0
- data/ext/signal.c +310 -0
- data/ext/siman.c +718 -0
- data/ext/sort.c +208 -0
- data/ext/spline.c +395 -0
- data/ext/stats.c +799 -0
- data/ext/sum.c +168 -0
- data/ext/tamu_anova.c +56 -0
- data/ext/tensor.c +38 -0
- data/ext/tensor_source.c +1123 -0
- data/ext/vector.c +38 -0
- data/ext/vector_complex.c +2236 -0
- data/ext/vector_double.c +1433 -0
- data/ext/vector_int.c +204 -0
- data/ext/vector_source.c +3329 -0
- data/ext/wavelet.c +937 -0
- data/include/rb_gsl.h +151 -0
- data/include/rb_gsl_array.h +238 -0
- data/include/rb_gsl_cheb.h +21 -0
- data/include/rb_gsl_common.h +343 -0
- data/include/rb_gsl_complex.h +25 -0
- data/include/rb_gsl_const.h +29 -0
- data/include/rb_gsl_dirac.h +13 -0
- data/include/rb_gsl_eigen.h +17 -0
- data/include/rb_gsl_fft.h +62 -0
- data/include/rb_gsl_fit.h +25 -0
- data/include/rb_gsl_function.h +27 -0
- data/include/rb_gsl_graph.h +70 -0
- data/include/rb_gsl_histogram.h +63 -0
- data/include/rb_gsl_histogram3d.h +97 -0
- data/include/rb_gsl_integration.h +17 -0
- data/include/rb_gsl_interp.h +46 -0
- data/include/rb_gsl_linalg.h +25 -0
- data/include/rb_gsl_math.h +26 -0
- data/include/rb_gsl_odeiv.h +21 -0
- data/include/rb_gsl_poly.h +71 -0
- data/include/rb_gsl_rational.h +37 -0
- data/include/rb_gsl_rng.h +21 -0
- data/include/rb_gsl_root.h +22 -0
- data/include/rb_gsl_sf.h +119 -0
- data/include/rb_gsl_statistics.h +17 -0
- data/include/rb_gsl_tensor.h +45 -0
- data/include/rb_gsl_with_narray.h +22 -0
- data/include/templates_off.h +87 -0
- data/include/templates_on.h +241 -0
- data/lib/gsl/gnuplot.rb +41 -0
- data/lib/gsl/oper.rb +68 -0
- data/lib/ool.rb +22 -0
- data/lib/ool/conmin.rb +30 -0
- metadata +224 -0
data/ext/block.c
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
block.c
|
|
3
|
+
Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
|
|
4
|
+
(C) Copyright 2001-2006 by Yoshiki Tsunesada
|
|
5
|
+
|
|
6
|
+
Ruby/GSL is free software: you can redistribute it and/or modify it
|
|
7
|
+
under the terms of the GNU General Public License.
|
|
8
|
+
This library is distributed in the hope that it will be useful, but
|
|
9
|
+
WITHOUT ANY WARRANTY.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
This code uses "templates_on.h" and "templates_off.h",
|
|
14
|
+
which are provided by the GSL source.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include "rb_gsl_config.h"
|
|
18
|
+
#include "rb_gsl_array.h"
|
|
19
|
+
#include "rb_gsl_histogram.h"
|
|
20
|
+
#include "rb_gsl_complex.h"
|
|
21
|
+
#include "rb_gsl_poly.h"
|
|
22
|
+
|
|
23
|
+
#ifdef HAVE_NARRAY_H
|
|
24
|
+
#include "rb_gsl_with_narray.h"
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
#define BASE_DOUBLE
|
|
28
|
+
#include "templates_on.h"
|
|
29
|
+
#include "block_source.c"
|
|
30
|
+
#include "templates_off.h"
|
|
31
|
+
#undef BASE_DOUBLE
|
|
32
|
+
|
|
33
|
+
#define BASE_INT
|
|
34
|
+
#include "templates_on.h"
|
|
35
|
+
#include "block_source.c"
|
|
36
|
+
#include "templates_off.h"
|
|
37
|
+
#undef BASE_INT
|
|
38
|
+
|
|
39
|
+
#define BASE_UCHAR
|
|
40
|
+
#include "templates_on.h"
|
|
41
|
+
#include "block_source.c"
|
|
42
|
+
#include "templates_off.h"
|
|
43
|
+
#undef BASE_UCHAR
|
|
44
|
+
|
data/ext/block_source.c
ADDED
|
@@ -0,0 +1,886 @@
|
|
|
1
|
+
/*
|
|
2
|
+
block_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 CHECK_BL CHECK_BLOCK
|
|
15
|
+
#define C_TO_VALUE rb_float_new
|
|
16
|
+
#define BL_P BLOCK_P
|
|
17
|
+
#elif defined(BASE_INT)
|
|
18
|
+
#define C_TO_VALUE INT2FIX
|
|
19
|
+
#define CHECK_BL CHECK_BLOCK_INT
|
|
20
|
+
#define BL_P BLOCK_INT_P
|
|
21
|
+
#else
|
|
22
|
+
#define C_TO_VALUE INT2FIX
|
|
23
|
+
#define CHECK_BL CHECK_BLOCK_UCHAR
|
|
24
|
+
#define BL_P BLOCK_UCHAR_P
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
static VALUE FUNCTION(rb_gsl_block,new)(VALUE klass, VALUE nn)
|
|
28
|
+
{
|
|
29
|
+
GSL_TYPE(gsl_block) *block = NULL;
|
|
30
|
+
CHECK_FIXNUM(nn);
|
|
31
|
+
block = FUNCTION(gsl_block,alloc)(FIX2INT(nn));
|
|
32
|
+
return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_block,free), block);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static VALUE FUNCTION(rb_gsl_block,calloc)(VALUE klass, VALUE nn)
|
|
36
|
+
{
|
|
37
|
+
GSL_TYPE(gsl_block) *block = NULL;
|
|
38
|
+
CHECK_FIXNUM(nn);
|
|
39
|
+
block = FUNCTION(gsl_block,calloc)(FIX2INT(nn));
|
|
40
|
+
return Data_Wrap_Struct(klass, 0, FUNCTION(gsl_block,free), block);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static VALUE FUNCTION(rb_gsl_block,size)(VALUE obj)
|
|
44
|
+
{
|
|
45
|
+
GSL_TYPE(gsl_block) *block = NULL;
|
|
46
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), block);
|
|
47
|
+
return INT2FIX(block->size);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static VALUE FUNCTION(rb_gsl_block,fwrite)(VALUE obj, VALUE io)
|
|
51
|
+
{
|
|
52
|
+
GSL_TYPE(gsl_block) *h = NULL;
|
|
53
|
+
FILE *f = NULL;
|
|
54
|
+
int status, flag = 0;
|
|
55
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), h);
|
|
56
|
+
f = rb_gsl_open_writefile(io, &flag);
|
|
57
|
+
status = FUNCTION(gsl_block,fwrite)(f, h);
|
|
58
|
+
if (flag == 1) fclose(f);
|
|
59
|
+
return INT2FIX(status);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static VALUE FUNCTION(rb_gsl_block,fread)(VALUE obj, VALUE io)
|
|
63
|
+
{
|
|
64
|
+
GSL_TYPE(gsl_block) *h = NULL;
|
|
65
|
+
FILE *f = NULL;
|
|
66
|
+
int status, flag = 0;
|
|
67
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), h);
|
|
68
|
+
f = rb_gsl_open_readfile(io, &flag);
|
|
69
|
+
status = FUNCTION(gsl_block,fread)(f, h);
|
|
70
|
+
if (flag == 1) fclose(f);
|
|
71
|
+
return INT2FIX(status);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#ifdef BASE_DOUBLE
|
|
75
|
+
#define FORMAT_DEFAULT "%g"
|
|
76
|
+
#else
|
|
77
|
+
#define FORMAT_DEFAULT "%d"
|
|
78
|
+
#endif
|
|
79
|
+
|
|
80
|
+
static VALUE FUNCTION(rb_gsl_block,fprintf)(int argc, VALUE *argv, VALUE obj)
|
|
81
|
+
{
|
|
82
|
+
GSL_TYPE(gsl_block) *h = NULL;
|
|
83
|
+
FILE *fp = NULL;
|
|
84
|
+
int status, flag = 0;
|
|
85
|
+
if (argc != 1 && argc != 2)
|
|
86
|
+
rb_raise(rb_eArgError,
|
|
87
|
+
"wrong number of arguments (%d for 1 or 2)", argc);
|
|
88
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), h);
|
|
89
|
+
fp = rb_gsl_open_writefile(argv[0], &flag);
|
|
90
|
+
if (argc == 2) {
|
|
91
|
+
Check_Type(argv[1], T_STRING);
|
|
92
|
+
status = FUNCTION(gsl_block,fprintf)(fp, h, STR2CSTR(argv[1]));
|
|
93
|
+
} else {
|
|
94
|
+
status = FUNCTION(gsl_block,fprintf)(fp, h, FORMAT_DEFAULT);
|
|
95
|
+
}
|
|
96
|
+
if (flag == 1) fclose(fp);
|
|
97
|
+
return INT2FIX(status);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
static VALUE FUNCTION(rb_gsl_block,printf)(int argc, VALUE *argv, VALUE obj)
|
|
101
|
+
{
|
|
102
|
+
GSL_TYPE(gsl_block) *h = NULL;
|
|
103
|
+
int status;
|
|
104
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), h);
|
|
105
|
+
if (argc == 1) {
|
|
106
|
+
Check_Type(argv[0], T_STRING);
|
|
107
|
+
status = FUNCTION(gsl_block,fprintf)(stdout, h, STR2CSTR(argv[0]));
|
|
108
|
+
} else {
|
|
109
|
+
status = FUNCTION(gsl_block,fprintf)(stdout, h, FORMAT_DEFAULT);
|
|
110
|
+
}
|
|
111
|
+
return INT2FIX(status);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
#undef FORMAT_DEFAULT
|
|
115
|
+
|
|
116
|
+
static VALUE FUNCTION(rb_gsl_block,fscanf)(VALUE obj, VALUE io)
|
|
117
|
+
{
|
|
118
|
+
GSL_TYPE(gsl_block) *h = NULL;
|
|
119
|
+
FILE *fp = NULL;
|
|
120
|
+
int status, flag = 0;
|
|
121
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), h);
|
|
122
|
+
fp = rb_gsl_open_readfile(io, &flag);
|
|
123
|
+
status = FUNCTION(gsl_block,fscanf)(fp, h);
|
|
124
|
+
if (flag == 1) fclose(fp);
|
|
125
|
+
return INT2FIX(status);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
#ifdef BASE_DOUBLE
|
|
129
|
+
#define SHOW_ELM 6
|
|
130
|
+
#define PRINTF_FORMAT "%4.3e "
|
|
131
|
+
#define TYPE2 double
|
|
132
|
+
#else
|
|
133
|
+
#define SHOW_ELM 15
|
|
134
|
+
#define PRINTF_FORMAT "%d "
|
|
135
|
+
#define TYPE2 int
|
|
136
|
+
#endif
|
|
137
|
+
|
|
138
|
+
static VALUE FUNCTION(rb_gsl_block,to_s)(VALUE obj)
|
|
139
|
+
{
|
|
140
|
+
GSL_TYPE(gsl_block) *v = NULL;
|
|
141
|
+
char buf[32];
|
|
142
|
+
size_t i, n;
|
|
143
|
+
VALUE str;
|
|
144
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
145
|
+
str = rb_str_new2("[ ");
|
|
146
|
+
n = v->size;
|
|
147
|
+
if (rb_obj_is_kind_of(obj, cgsl_block_complex)) n *= 2;
|
|
148
|
+
for (i = 0; i < n; i++) {
|
|
149
|
+
sprintf(buf, PRINTF_FORMAT, (TYPE2) v->data[i]);
|
|
150
|
+
rb_str_cat(str, buf, strlen(buf));
|
|
151
|
+
if (i == SHOW_ELM && i != v->size-1) {
|
|
152
|
+
strcpy(buf, "... ");
|
|
153
|
+
rb_str_cat(str, buf, strlen(buf));
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
sprintf(buf, "]");
|
|
158
|
+
rb_str_cat(str, buf, strlen(buf));
|
|
159
|
+
return str;
|
|
160
|
+
}
|
|
161
|
+
#undef SHOW_ELM
|
|
162
|
+
#undef PRINTF_FORMAT
|
|
163
|
+
|
|
164
|
+
static VALUE FUNCTION(rb_gsl_block,inspect)(VALUE obj)
|
|
165
|
+
{
|
|
166
|
+
VALUE str;
|
|
167
|
+
char buf[64];
|
|
168
|
+
sprintf(buf, "%s\n", rb_class2name(CLASS_OF(obj)));
|
|
169
|
+
str = rb_str_new2(buf);
|
|
170
|
+
return rb_str_concat(str, FUNCTION(rb_gsl_block,to_s)(obj));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
#ifdef BASE_DOUBLE
|
|
174
|
+
#define C_TO_VALUE rb_float_new
|
|
175
|
+
#define NUMCONV NUM2DBL
|
|
176
|
+
#else
|
|
177
|
+
#define C_TO_VALUE INT2FIX
|
|
178
|
+
#define NUMCONV FIX2INT
|
|
179
|
+
#endif
|
|
180
|
+
|
|
181
|
+
void get_range_int_beg_en_n(VALUE range, int *beg, int *en, size_t *n, int *step);
|
|
182
|
+
static VALUE FUNCTION(rb_gsl_block,get)(int argc, VALUE *argv, VALUE obj)
|
|
183
|
+
{
|
|
184
|
+
GSL_TYPE(gsl_block) *b, *bnew;
|
|
185
|
+
gsl_index *p;
|
|
186
|
+
int beg, en, i, step;
|
|
187
|
+
size_t n, j, k;
|
|
188
|
+
|
|
189
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), b);
|
|
190
|
+
switch (argc) {
|
|
191
|
+
case 0:
|
|
192
|
+
rb_raise(rb_eArgError, "too few arguments (%d for >= 1)", argc);
|
|
193
|
+
break;
|
|
194
|
+
case 1:
|
|
195
|
+
switch (TYPE(argv[0])) {
|
|
196
|
+
case T_FIXNUM:
|
|
197
|
+
i = FIX2INT(argv[0]);
|
|
198
|
+
if (i < 0) j = b->size + i; else j = (size_t) i;
|
|
199
|
+
return C_TO_VALUE(b->data[j]);
|
|
200
|
+
break;
|
|
201
|
+
case T_ARRAY:
|
|
202
|
+
// n = RARRAY(argv[0])->len;
|
|
203
|
+
n = RARRAY_LEN(argv[0]);
|
|
204
|
+
bnew = FUNCTION(gsl_block,alloc)(n);
|
|
205
|
+
for (j = 0; j < n; j++) {
|
|
206
|
+
i = FIX2INT(rb_ary_entry(argv[0], j));
|
|
207
|
+
if (i < 0) k = b->size + i; else k = i;
|
|
208
|
+
bnew->data[j] = b->data[k];
|
|
209
|
+
}
|
|
210
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
|
|
211
|
+
break;
|
|
212
|
+
default:
|
|
213
|
+
if (PERMUTATION_P(argv[0])) {
|
|
214
|
+
Data_Get_Struct(argv[0], gsl_index, p);
|
|
215
|
+
bnew = FUNCTION(gsl_block,alloc)(p->size);
|
|
216
|
+
for (j = 0; j < p->size; j++) bnew->data[j] = b->data[p->data[j]];
|
|
217
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
|
|
218
|
+
} else if (CLASS_OF(argv[0]) == rb_cRange) {
|
|
219
|
+
get_range_int_beg_en_n(argv[0], &beg, &en, &n, &step);
|
|
220
|
+
bnew = FUNCTION(gsl_block,alloc)(n);
|
|
221
|
+
for (j = 0; j < n; j++)
|
|
222
|
+
bnew->data[j] = b->data[beg+j];
|
|
223
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free),
|
|
224
|
+
bnew);
|
|
225
|
+
} else {
|
|
226
|
+
rb_raise(rb_eArgError, "wrong argument type %s (Fixnum, Array, or Range expected)", rb_class2name(CLASS_OF(argv[0])));
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
break;
|
|
231
|
+
default:
|
|
232
|
+
bnew = FUNCTION(gsl_block,alloc)(argc);
|
|
233
|
+
for (j = 0; j < argc; j++) {
|
|
234
|
+
i = FIX2INT(argv[j]);
|
|
235
|
+
if (i < 0) k = b->size + i; else k = i;
|
|
236
|
+
bnew->data[j] = b->data[k];
|
|
237
|
+
}
|
|
238
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
return Qnil;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
static VALUE FUNCTION(rb_gsl_block,set)(VALUE obj, VALUE ii, VALUE xx)
|
|
247
|
+
{
|
|
248
|
+
GSL_TYPE(gsl_block) *b;
|
|
249
|
+
BASE x;
|
|
250
|
+
size_t i;
|
|
251
|
+
CHECK_FIXNUM(ii);
|
|
252
|
+
i = FIX2INT(ii);
|
|
253
|
+
x = (BASE) NUMCONV(xx);
|
|
254
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), b);
|
|
255
|
+
b->data[i] = x;
|
|
256
|
+
return obj;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
static int FUNCTION(gsl_block,eq)(const GSL_TYPE(gsl_block) *a,
|
|
261
|
+
const GSL_TYPE(gsl_block) *b,
|
|
262
|
+
gsl_block_uchar *c)
|
|
263
|
+
{
|
|
264
|
+
size_t i;
|
|
265
|
+
BASE x, y;
|
|
266
|
+
if (a->size != b->size) return -1;
|
|
267
|
+
if (a->size != c->size) return -2;
|
|
268
|
+
for (i = 0; i < a->size; i++) {
|
|
269
|
+
x = a->data[i];
|
|
270
|
+
y = b->data[i];
|
|
271
|
+
c->data[i] = (x > y || x < y) ? 0 : 1;
|
|
272
|
+
}
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
static int FUNCTION(gsl_block,ne)(const GSL_TYPE(gsl_block) *a,
|
|
277
|
+
const GSL_TYPE(gsl_block) *b,
|
|
278
|
+
gsl_block_uchar *c)
|
|
279
|
+
{
|
|
280
|
+
size_t i;
|
|
281
|
+
BASE x, y;
|
|
282
|
+
if (a->size != b->size) return -1;
|
|
283
|
+
if (a->size != c->size) return -2;
|
|
284
|
+
for (i = 0; i < a->size; i++) {
|
|
285
|
+
x = a->data[i];
|
|
286
|
+
y = b->data[i];
|
|
287
|
+
c->data[i] = (x > y || x < y) ? 1 : 0;
|
|
288
|
+
}
|
|
289
|
+
return 0;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
static int FUNCTION(gsl_block,gt)(const GSL_TYPE(gsl_block) *a,
|
|
293
|
+
const GSL_TYPE(gsl_block) *b,
|
|
294
|
+
gsl_block_uchar *c)
|
|
295
|
+
{
|
|
296
|
+
size_t i;
|
|
297
|
+
BASE x, y;
|
|
298
|
+
if (a->size != b->size) return -1;
|
|
299
|
+
if (a->size != c->size) return -2;
|
|
300
|
+
for (i = 0; i < a->size; i++) {
|
|
301
|
+
x = a->data[i];
|
|
302
|
+
y = b->data[i];
|
|
303
|
+
c->data[i] = (x > y) ? 1 : 0;
|
|
304
|
+
}
|
|
305
|
+
return 0;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
static int FUNCTION(gsl_block,ge)(const GSL_TYPE(gsl_block) *a,
|
|
309
|
+
const GSL_TYPE(gsl_block) *b,
|
|
310
|
+
gsl_block_uchar *c)
|
|
311
|
+
{
|
|
312
|
+
size_t i;
|
|
313
|
+
BASE x, y;
|
|
314
|
+
if (a->size != b->size) return -1;
|
|
315
|
+
if (a->size != c->size) return -2;
|
|
316
|
+
for (i = 0; i < a->size; i++) {
|
|
317
|
+
x = a->data[i];
|
|
318
|
+
y = b->data[i];
|
|
319
|
+
c->data[i] = (x >= y) ? 1 : 0;
|
|
320
|
+
}
|
|
321
|
+
return 0;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
static int FUNCTION(gsl_block,lt)(const GSL_TYPE(gsl_block) *a,
|
|
325
|
+
const GSL_TYPE(gsl_block) *b,
|
|
326
|
+
gsl_block_uchar *c)
|
|
327
|
+
{
|
|
328
|
+
size_t i;
|
|
329
|
+
BASE x, y;
|
|
330
|
+
if (a->size != b->size) return -1;
|
|
331
|
+
if (a->size != c->size) return -2;
|
|
332
|
+
for (i = 0; i < a->size; i++) {
|
|
333
|
+
x = a->data[i];
|
|
334
|
+
y = b->data[i];
|
|
335
|
+
c->data[i] = (x < y) ? 1 : 0;
|
|
336
|
+
}
|
|
337
|
+
return 0;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
static int FUNCTION(gsl_block,le)(const GSL_TYPE(gsl_block) *a,
|
|
341
|
+
const GSL_TYPE(gsl_block) *b,
|
|
342
|
+
gsl_block_uchar *c)
|
|
343
|
+
{
|
|
344
|
+
size_t i;
|
|
345
|
+
BASE x, y;
|
|
346
|
+
if (a->size != b->size) return -1;
|
|
347
|
+
if (a->size != c->size) return -2;
|
|
348
|
+
for (i = 0; i < a->size; i++) {
|
|
349
|
+
x = a->data[i];
|
|
350
|
+
y = b->data[i];
|
|
351
|
+
c->data[i] = (x <= y) ? 1 : 0;
|
|
352
|
+
}
|
|
353
|
+
return 0;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
static int FUNCTION(gsl_block,and)(const GSL_TYPE(gsl_block) *a,
|
|
357
|
+
const GSL_TYPE(gsl_block) *b,
|
|
358
|
+
gsl_block_uchar *c)
|
|
359
|
+
{
|
|
360
|
+
size_t i;
|
|
361
|
+
BASE x, y;
|
|
362
|
+
if (a->size != b->size) return -1;
|
|
363
|
+
if (a->size != c->size) return -2;
|
|
364
|
+
for (i = 0; i < a->size; i++) {
|
|
365
|
+
x = a->data[i];
|
|
366
|
+
y = b->data[i];
|
|
367
|
+
c->data[i] = (x != 0 && y != 0) ? 1 : 0;
|
|
368
|
+
}
|
|
369
|
+
return 0;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
static int FUNCTION(gsl_block,or)(const GSL_TYPE(gsl_block) *a,
|
|
373
|
+
const GSL_TYPE(gsl_block) *b,
|
|
374
|
+
gsl_block_uchar *c)
|
|
375
|
+
{
|
|
376
|
+
size_t i;
|
|
377
|
+
BASE x, y;
|
|
378
|
+
if (a->size != b->size) return -1;
|
|
379
|
+
if (a->size != c->size) return -2;
|
|
380
|
+
for (i = 0; i < a->size; i++) {
|
|
381
|
+
x = a->data[i];
|
|
382
|
+
y = b->data[i];
|
|
383
|
+
c->data[i] = (x != 0 || y != 0) ? 1 : 0;
|
|
384
|
+
}
|
|
385
|
+
return 0;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
static int FUNCTION(gsl_block,xor)(const GSL_TYPE(gsl_block) *a,
|
|
389
|
+
const GSL_TYPE(gsl_block) *b,
|
|
390
|
+
gsl_block_uchar *c)
|
|
391
|
+
{
|
|
392
|
+
size_t i;
|
|
393
|
+
BASE x, y;
|
|
394
|
+
if (a->size != b->size) return -1;
|
|
395
|
+
if (a->size != c->size) return -2;
|
|
396
|
+
for (i = 0; i < a->size; i++) {
|
|
397
|
+
x = a->data[i];
|
|
398
|
+
y = b->data[i];
|
|
399
|
+
c->data[i] = ((x != 0) == (y != 0)) ? 0 : 1;
|
|
400
|
+
}
|
|
401
|
+
return 0;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
static int FUNCTION(gsl_block,eq2)(const GSL_TYPE(gsl_block) *a,
|
|
405
|
+
BASE b, gsl_block_uchar *c)
|
|
406
|
+
{
|
|
407
|
+
size_t i;
|
|
408
|
+
BASE x, y;
|
|
409
|
+
if (a->size != c->size) return -2;
|
|
410
|
+
for (i = 0; i < a->size; i++) {
|
|
411
|
+
x = a->data[i];
|
|
412
|
+
y = b;
|
|
413
|
+
c->data[i] = (x > y || x < y) ? 0 : 1;
|
|
414
|
+
}
|
|
415
|
+
return 0;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
static int FUNCTION(gsl_block,ne2)(const GSL_TYPE(gsl_block) *a,
|
|
419
|
+
BASE b,
|
|
420
|
+
gsl_block_uchar *c)
|
|
421
|
+
{
|
|
422
|
+
size_t i;
|
|
423
|
+
BASE x, y;
|
|
424
|
+
if (a->size != c->size) return -2;
|
|
425
|
+
for (i = 0; i < a->size; i++) {
|
|
426
|
+
x = a->data[i];
|
|
427
|
+
y = b;
|
|
428
|
+
c->data[i] = (x > y || x < y) ? 1 : 0;
|
|
429
|
+
}
|
|
430
|
+
return 0;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
static int FUNCTION(gsl_block,gt2)(const GSL_TYPE(gsl_block) *a,
|
|
434
|
+
BASE b,
|
|
435
|
+
gsl_block_uchar *c)
|
|
436
|
+
{
|
|
437
|
+
size_t i;
|
|
438
|
+
BASE x, y;
|
|
439
|
+
if (a->size != c->size) return -2;
|
|
440
|
+
for (i = 0; i < a->size; i++) {
|
|
441
|
+
x = a->data[i];
|
|
442
|
+
y = b;
|
|
443
|
+
c->data[i] = (x > y) ? 1 : 0;
|
|
444
|
+
}
|
|
445
|
+
return 0;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
static int FUNCTION(gsl_block,ge2)(const GSL_TYPE(gsl_block) *a,
|
|
449
|
+
BASE b,
|
|
450
|
+
gsl_block_uchar *c)
|
|
451
|
+
{
|
|
452
|
+
size_t i;
|
|
453
|
+
BASE x, y;
|
|
454
|
+
if (a->size != c->size) return -2;
|
|
455
|
+
for (i = 0; i < a->size; i++) {
|
|
456
|
+
x = a->data[i];
|
|
457
|
+
y = b;
|
|
458
|
+
c->data[i] = (x >= y) ? 1 : 0;
|
|
459
|
+
}
|
|
460
|
+
return 0;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
static int FUNCTION(gsl_block,lt2)(const GSL_TYPE(gsl_block) *a,
|
|
464
|
+
BASE b,
|
|
465
|
+
gsl_block_uchar *c)
|
|
466
|
+
{
|
|
467
|
+
size_t i;
|
|
468
|
+
BASE x, y;
|
|
469
|
+
if (a->size != c->size) return -2;
|
|
470
|
+
for (i = 0; i < a->size; i++) {
|
|
471
|
+
x = a->data[i];
|
|
472
|
+
y = b;
|
|
473
|
+
c->data[i] = (x < y) ? 1 : 0;
|
|
474
|
+
}
|
|
475
|
+
return 0;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
static int FUNCTION(gsl_block,le2)(const GSL_TYPE(gsl_block) *a,
|
|
479
|
+
BASE b,
|
|
480
|
+
gsl_block_uchar *c)
|
|
481
|
+
{
|
|
482
|
+
size_t i;
|
|
483
|
+
BASE x, y;
|
|
484
|
+
if (a->size != c->size) return -2;
|
|
485
|
+
for (i = 0; i < a->size; i++) {
|
|
486
|
+
x = a->data[i];
|
|
487
|
+
y = b;
|
|
488
|
+
c->data[i] = (x <= y) ? 1 : 0;
|
|
489
|
+
}
|
|
490
|
+
return 0;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
static int FUNCTION(gsl_block,and2)(const GSL_TYPE(gsl_block) *a,
|
|
494
|
+
BASE b,
|
|
495
|
+
gsl_block_uchar *c)
|
|
496
|
+
{
|
|
497
|
+
size_t i;
|
|
498
|
+
BASE x, y;
|
|
499
|
+
if (a->size != c->size) return -2;
|
|
500
|
+
for (i = 0; i < a->size; i++) {
|
|
501
|
+
x = a->data[i];
|
|
502
|
+
y = b;
|
|
503
|
+
c->data[i] = (x != 0 && y != 0) ? 1 : 0;
|
|
504
|
+
}
|
|
505
|
+
return 0;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
static int FUNCTION(gsl_block,or2)(const GSL_TYPE(gsl_block) *a,
|
|
509
|
+
BASE b,
|
|
510
|
+
gsl_block_uchar *c)
|
|
511
|
+
{
|
|
512
|
+
size_t i;
|
|
513
|
+
BASE x, y;
|
|
514
|
+
if (a->size != c->size) return -2;
|
|
515
|
+
for (i = 0; i < a->size; i++) {
|
|
516
|
+
x = a->data[i];
|
|
517
|
+
y = b;
|
|
518
|
+
c->data[i] = (x != 0 || y != 0) ? 1 : 0;
|
|
519
|
+
}
|
|
520
|
+
return 0;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
static int FUNCTION(gsl_block,xor2)(const GSL_TYPE(gsl_block) *a,
|
|
524
|
+
BASE b,
|
|
525
|
+
gsl_block_uchar *c)
|
|
526
|
+
{
|
|
527
|
+
size_t i;
|
|
528
|
+
BASE x, y;
|
|
529
|
+
if (a->size != c->size) return -2;
|
|
530
|
+
for (i = 0; i < a->size; i++) {
|
|
531
|
+
x = a->data[i];
|
|
532
|
+
y = b;
|
|
533
|
+
c->data[i] = ((x != 0) == (y != 0)) ? 0 : 1;
|
|
534
|
+
}
|
|
535
|
+
return 0;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
static VALUE FUNCTION(rb_gsl_block,compare)(VALUE aa, VALUE bb,
|
|
540
|
+
int (*cmp)(const GSL_TYPE(gsl_block)*,
|
|
541
|
+
const GSL_TYPE(gsl_block)*,
|
|
542
|
+
gsl_block_uchar*),
|
|
543
|
+
int (*cmp2)(const GSL_TYPE(gsl_block)*,
|
|
544
|
+
BASE,
|
|
545
|
+
gsl_block_uchar*))
|
|
546
|
+
{
|
|
547
|
+
GSL_TYPE(gsl_block) *a, *b;
|
|
548
|
+
/* gsl_block_int *c;*/
|
|
549
|
+
gsl_block_uchar *c;
|
|
550
|
+
int status;
|
|
551
|
+
Data_Get_Struct(aa, GSL_TYPE(gsl_block), a);
|
|
552
|
+
c = gsl_block_uchar_alloc(a->size);
|
|
553
|
+
if (BL_P(bb)) {
|
|
554
|
+
Data_Get_Struct(bb, GSL_TYPE(gsl_block), b);
|
|
555
|
+
if (a->size != b->size)
|
|
556
|
+
rb_raise(rb_eRuntimeError, "Block size mismatch, %d and %d", (int) a->size,
|
|
557
|
+
(int) b->size);
|
|
558
|
+
status = (*cmp)(a, b, c);
|
|
559
|
+
} else {
|
|
560
|
+
status = (*cmp2)(a, NUMCONV(bb), c);
|
|
561
|
+
}
|
|
562
|
+
return Data_Wrap_Struct(cgsl_block_uchar, 0, gsl_block_uchar_free, c);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
static VALUE FUNCTION(rb_gsl_block,eq)(VALUE aa, VALUE bb)
|
|
566
|
+
{
|
|
567
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,eq),
|
|
568
|
+
FUNCTION(gsl_block,eq2));
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
static VALUE FUNCTION(rb_gsl_block,ne)(VALUE aa, VALUE bb)
|
|
572
|
+
{
|
|
573
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,ne),
|
|
574
|
+
FUNCTION(gsl_block,ne2));
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
static VALUE FUNCTION(rb_gsl_block,gt)(VALUE aa, VALUE bb)
|
|
578
|
+
{
|
|
579
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,gt),
|
|
580
|
+
FUNCTION(gsl_block,gt2));
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
static VALUE FUNCTION(rb_gsl_block,ge)(VALUE aa, VALUE bb)
|
|
584
|
+
{
|
|
585
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,ge),
|
|
586
|
+
FUNCTION(gsl_block,ge2));
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
static VALUE FUNCTION(rb_gsl_block,lt)(VALUE aa, VALUE bb)
|
|
590
|
+
{
|
|
591
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,lt),
|
|
592
|
+
FUNCTION(gsl_block,lt2));
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
static VALUE FUNCTION(rb_gsl_block,le)(VALUE aa, VALUE bb)
|
|
596
|
+
{
|
|
597
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,le),
|
|
598
|
+
FUNCTION(gsl_block,le2));
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
static VALUE FUNCTION(rb_gsl_block,and)(VALUE aa, VALUE bb)
|
|
602
|
+
{
|
|
603
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,and),
|
|
604
|
+
FUNCTION(gsl_block,and2));
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
static VALUE FUNCTION(rb_gsl_block,or)(VALUE aa, VALUE bb)
|
|
608
|
+
{
|
|
609
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,or),
|
|
610
|
+
FUNCTION(gsl_block,or2));
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
static VALUE FUNCTION(rb_gsl_block,xor)(VALUE aa, VALUE bb)
|
|
614
|
+
{
|
|
615
|
+
return FUNCTION(rb_gsl_block,compare)(aa, bb, FUNCTION(gsl_block,xor),
|
|
616
|
+
FUNCTION(gsl_block,xor2));
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
static VALUE FUNCTION(rb_gsl_block,not)(VALUE obj)
|
|
620
|
+
{
|
|
621
|
+
GSL_TYPE(gsl_block) *v;
|
|
622
|
+
gsl_block_uchar *vv;
|
|
623
|
+
size_t i;
|
|
624
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
625
|
+
vv = gsl_block_uchar_alloc(v->size);
|
|
626
|
+
for (i = 0; i < v->size; i++) vv->data[i] = (v->data[i] != 0) ? 0 : 1;
|
|
627
|
+
return Data_Wrap_Struct(cgsl_block_uchar, 0, gsl_block_uchar_free, vv);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
static VALUE FUNCTION(rb_gsl_block,any)(VALUE obj)
|
|
631
|
+
{
|
|
632
|
+
GSL_TYPE(gsl_block) *v = NULL;
|
|
633
|
+
size_t i;
|
|
634
|
+
|
|
635
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
636
|
+
if (rb_block_given_p()) {
|
|
637
|
+
for (i = 0; i < v->size; i++) {
|
|
638
|
+
if (rb_yield(C_TO_VALUE(v->data[i]))) return INT2FIX(1);
|
|
639
|
+
}
|
|
640
|
+
return INT2FIX(0);
|
|
641
|
+
} else {
|
|
642
|
+
for (i = 0; i < v->size; i++) if (v->data[i]) return INT2FIX(1);
|
|
643
|
+
return INT2FIX(0);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
static VALUE FUNCTION(rb_gsl_block,any2)(VALUE obj)
|
|
648
|
+
{
|
|
649
|
+
GSL_TYPE(gsl_block) *v = NULL;
|
|
650
|
+
size_t i;
|
|
651
|
+
|
|
652
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
653
|
+
if (rb_block_given_p()) {
|
|
654
|
+
for (i = 0; i < v->size; i++) {
|
|
655
|
+
if (rb_yield(C_TO_VALUE(v->data[i]))) return Qtrue;
|
|
656
|
+
}
|
|
657
|
+
return Qfalse;
|
|
658
|
+
} else {
|
|
659
|
+
for (i = 0; i < v->size; i++) if (v->data[i]) return Qtrue;
|
|
660
|
+
return Qfalse;
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
static VALUE FUNCTION(rb_gsl_block,all)(VALUE obj)
|
|
665
|
+
{
|
|
666
|
+
GSL_TYPE(gsl_block) *v;
|
|
667
|
+
size_t i;
|
|
668
|
+
|
|
669
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
670
|
+
if (rb_block_given_p()) {
|
|
671
|
+
for (i = 0; i < v->size; i++)
|
|
672
|
+
if (!rb_yield(C_TO_VALUE(v->data[i]))) return Qfalse;
|
|
673
|
+
return Qtrue;
|
|
674
|
+
} else {
|
|
675
|
+
for (i = 0; i < v->size; i++)
|
|
676
|
+
if (!v->data[i]) return Qfalse;
|
|
677
|
+
return Qtrue;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
static VALUE FUNCTION(rb_gsl_block,none)(VALUE obj)
|
|
682
|
+
{
|
|
683
|
+
GSL_TYPE(gsl_block) *v;
|
|
684
|
+
size_t i;
|
|
685
|
+
|
|
686
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
687
|
+
if (rb_block_given_p()) {
|
|
688
|
+
for (i = 0; i < v->size; i++)
|
|
689
|
+
if (rb_yield(C_TO_VALUE(v->data[i]))) return Qfalse;
|
|
690
|
+
return Qtrue;
|
|
691
|
+
} else {
|
|
692
|
+
for (i = 0; i < v->size; i++)
|
|
693
|
+
if (v->data[i]) return Qfalse;
|
|
694
|
+
return Qtrue;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
static VALUE FUNCTION(rb_gsl_block,where)(VALUE obj)
|
|
699
|
+
{
|
|
700
|
+
GSL_TYPE(gsl_block) *v;
|
|
701
|
+
gsl_index *vv;
|
|
702
|
+
gsl_block_uchar *btmp = NULL;
|
|
703
|
+
size_t i, j, n = 0;
|
|
704
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
705
|
+
/* count true elements */
|
|
706
|
+
if (rb_block_given_p()) {
|
|
707
|
+
btmp = gsl_block_uchar_alloc(v->size);
|
|
708
|
+
for (i = 0; i < v->size; i++) {
|
|
709
|
+
if (rb_yield(C_TO_VALUE(v->data[i]))) {
|
|
710
|
+
btmp->data[i] = 1;
|
|
711
|
+
n++;
|
|
712
|
+
} else {
|
|
713
|
+
btmp->data[i] = 0;
|
|
714
|
+
}
|
|
715
|
+
} /* for */
|
|
716
|
+
} else { /* block is not given */
|
|
717
|
+
for (i = 0; i < v->size; i++) { if (v->data[i]) n++; }
|
|
718
|
+
}
|
|
719
|
+
if (n == 0) {
|
|
720
|
+
if (btmp) gsl_block_uchar_free(btmp);
|
|
721
|
+
return Qnil;
|
|
722
|
+
}
|
|
723
|
+
vv = gsl_permutation_alloc(n);
|
|
724
|
+
for (i = 0, j = 0; i < v->size; i++) {
|
|
725
|
+
if ((!btmp && v->data[i]) || (btmp && btmp->data[i])) {
|
|
726
|
+
vv->data[j++] = i;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (btmp) gsl_block_uchar_free(btmp);
|
|
730
|
+
return Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, vv);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
static VALUE FUNCTION(rb_gsl_block,where2)(VALUE obj)
|
|
734
|
+
{
|
|
735
|
+
GSL_TYPE(gsl_block) *v;
|
|
736
|
+
gsl_index *v1, *v2;
|
|
737
|
+
gsl_block_uchar *btmp = NULL;
|
|
738
|
+
VALUE vv1, vv2;
|
|
739
|
+
size_t i, j, k, n = 0;
|
|
740
|
+
|
|
741
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), v);
|
|
742
|
+
if (rb_block_given_p()) {
|
|
743
|
+
btmp = gsl_block_uchar_alloc(v->size);
|
|
744
|
+
for (i = 0; i < v->size; i++) {
|
|
745
|
+
if (rb_yield(C_TO_VALUE(v->data[i]))) {
|
|
746
|
+
btmp->data[i] = 1;
|
|
747
|
+
n++;
|
|
748
|
+
} else {
|
|
749
|
+
btmp->data[i] = 0;
|
|
750
|
+
}
|
|
751
|
+
} /* for */
|
|
752
|
+
} else { /* block is not given */
|
|
753
|
+
for (i = 0; i < v->size; i++) { if (v->data[i]) n++; }
|
|
754
|
+
}
|
|
755
|
+
/* true and false logic. need to handle both */
|
|
756
|
+
if (n == 0) {
|
|
757
|
+
v2 = gsl_permutation_calloc(v->size); /* calloc() initializes v2 */
|
|
758
|
+
vv1 = Qnil;
|
|
759
|
+
vv2 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v2);
|
|
760
|
+
} else if (v->size-n == 0) {
|
|
761
|
+
v1 = gsl_permutation_calloc(n); /* calloc() initializes v1 */
|
|
762
|
+
vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);
|
|
763
|
+
vv2 = Qnil;
|
|
764
|
+
} else {
|
|
765
|
+
/* same case as 'where' */
|
|
766
|
+
v1 = gsl_permutation_alloc(n);
|
|
767
|
+
v2 = gsl_permutation_alloc(v->size-n);
|
|
768
|
+
for (i = 0, j = 0, k = 0; i < v->size; i++) {
|
|
769
|
+
if ((!btmp && v->data[i]) || (btmp && btmp->data[i])) v1->data[j++] = i;
|
|
770
|
+
else v2->data[k++] = i;
|
|
771
|
+
}
|
|
772
|
+
vv1 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v1);
|
|
773
|
+
vv2 = Data_Wrap_Struct(cgsl_index, 0, gsl_permutation_free, v2);
|
|
774
|
+
}
|
|
775
|
+
if (btmp) gsl_block_uchar_free(btmp);
|
|
776
|
+
return rb_ary_new3(2, vv1, vv2);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
static VALUE FUNCTION(rb_gsl_block,each)(VALUE obj)
|
|
780
|
+
{
|
|
781
|
+
GSL_TYPE(gsl_block) *b = NULL;
|
|
782
|
+
size_t i;
|
|
783
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), b);
|
|
784
|
+
for (i = 0; i < b->size; i++) {
|
|
785
|
+
rb_yield(C_TO_VALUE(b->data[i]));
|
|
786
|
+
}
|
|
787
|
+
return obj;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
static VALUE FUNCTION(rb_gsl_block,each_index)(VALUE obj)
|
|
791
|
+
{
|
|
792
|
+
GSL_TYPE(gsl_block) *b = NULL;
|
|
793
|
+
size_t i;
|
|
794
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), b);
|
|
795
|
+
for (i = 0; i < b->size; i++) {
|
|
796
|
+
rb_yield(INT2FIX(i));
|
|
797
|
+
}
|
|
798
|
+
return obj;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
static VALUE FUNCTION(rb_gsl_block,collect)(VALUE obj)
|
|
802
|
+
{
|
|
803
|
+
GSL_TYPE(gsl_block) *b = NULL, *bnew;
|
|
804
|
+
size_t i;
|
|
805
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), b);
|
|
806
|
+
bnew = FUNCTION(gsl_block,alloc)(b->size);
|
|
807
|
+
for (i = 0; i < b->size; i++) {
|
|
808
|
+
bnew->data[i] = NUMCONV(rb_yield(C_TO_VALUE(b->data[i])));
|
|
809
|
+
}
|
|
810
|
+
return Data_Wrap_Struct(GSL_TYPE(cgsl_block), 0, FUNCTION(gsl_block,free), bnew);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
static VALUE FUNCTION(rb_gsl_block,collect_bang)(VALUE obj)
|
|
814
|
+
{
|
|
815
|
+
GSL_TYPE(gsl_block) *b = NULL;
|
|
816
|
+
size_t i;
|
|
817
|
+
Data_Get_Struct(obj, GSL_TYPE(gsl_block), b);
|
|
818
|
+
for (i = 0; i < b->size; i++) {
|
|
819
|
+
b->data[i] = NUMCONV(rb_yield(C_TO_VALUE(b->data[i])));
|
|
820
|
+
}
|
|
821
|
+
return obj;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
#undef C_TO_VALUE
|
|
825
|
+
#undef NUMCONV
|
|
826
|
+
#undef TYPE2
|
|
827
|
+
#undef CHECK_BL
|
|
828
|
+
#undef BL_P
|
|
829
|
+
|
|
830
|
+
void FUNCTION(Init_gsl_block,init)(VALUE module)
|
|
831
|
+
{
|
|
832
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_block), "new",
|
|
833
|
+
FUNCTION(rb_gsl_block,new), 1);
|
|
834
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_block), "alloc",
|
|
835
|
+
FUNCTION(rb_gsl_block,new), 1);
|
|
836
|
+
rb_define_singleton_method(GSL_TYPE(cgsl_block), "calloc",
|
|
837
|
+
FUNCTION(rb_gsl_block,calloc), 1);
|
|
838
|
+
|
|
839
|
+
rb_define_method(GSL_TYPE(cgsl_block), "size", FUNCTION(rb_gsl_block,size), 0);
|
|
840
|
+
rb_define_alias(GSL_TYPE(cgsl_block), "length", "size");
|
|
841
|
+
rb_define_method(GSL_TYPE(cgsl_block), "fwrite", FUNCTION(rb_gsl_block,fwrite), 1);
|
|
842
|
+
rb_define_method(GSL_TYPE(cgsl_block), "fread", FUNCTION(rb_gsl_block,fread), 1);
|
|
843
|
+
rb_define_method(GSL_TYPE(cgsl_block), "fprintf", FUNCTION(rb_gsl_block,fprintf), -1);
|
|
844
|
+
rb_define_method(GSL_TYPE(cgsl_block), "printf", FUNCTION(rb_gsl_block,printf), -1);
|
|
845
|
+
rb_define_method(GSL_TYPE(cgsl_block), "fscanf", FUNCTION(rb_gsl_block,fscanf), 1);
|
|
846
|
+
|
|
847
|
+
rb_define_method(GSL_TYPE(cgsl_block), "inspect", FUNCTION(rb_gsl_block,inspect), 0);
|
|
848
|
+
rb_define_method(GSL_TYPE(cgsl_block), "to_s", FUNCTION(rb_gsl_block,to_s), 0);
|
|
849
|
+
rb_define_method(GSL_TYPE(cgsl_block), "get", FUNCTION(rb_gsl_block,get), -1);
|
|
850
|
+
rb_define_alias(GSL_TYPE(cgsl_block), "[]", "get");
|
|
851
|
+
rb_define_method(GSL_TYPE(cgsl_block), "set", FUNCTION(rb_gsl_block,set), 2);
|
|
852
|
+
rb_define_alias(GSL_TYPE(cgsl_block), "[]=", "set");
|
|
853
|
+
/*****/
|
|
854
|
+
rb_define_method(GSL_TYPE(cgsl_block), "eq", FUNCTION(rb_gsl_block,eq), 1);
|
|
855
|
+
rb_define_method(GSL_TYPE(cgsl_block), "ne", FUNCTION(rb_gsl_block,ne), 1);
|
|
856
|
+
rb_define_method(GSL_TYPE(cgsl_block), "gt", FUNCTION(rb_gsl_block,gt), 1);
|
|
857
|
+
rb_define_alias(GSL_TYPE(cgsl_block), ">", "gt");
|
|
858
|
+
rb_define_method(GSL_TYPE(cgsl_block), "ge", FUNCTION(rb_gsl_block,ge), 1);
|
|
859
|
+
rb_define_alias(GSL_TYPE(cgsl_block), ">=", "ge");
|
|
860
|
+
rb_define_method(GSL_TYPE(cgsl_block), "lt", FUNCTION(rb_gsl_block,lt), 1);
|
|
861
|
+
rb_define_alias(GSL_TYPE(cgsl_block), "<", "lt");
|
|
862
|
+
rb_define_method(GSL_TYPE(cgsl_block), "le", FUNCTION(rb_gsl_block,le), 1);
|
|
863
|
+
rb_define_alias(GSL_TYPE(cgsl_block), "<=", "le");
|
|
864
|
+
|
|
865
|
+
rb_define_method(GSL_TYPE(cgsl_block), "and", FUNCTION(rb_gsl_block,and), 1);
|
|
866
|
+
rb_define_method(GSL_TYPE(cgsl_block), "or", FUNCTION(rb_gsl_block,or), 1);
|
|
867
|
+
rb_define_method(GSL_TYPE(cgsl_block), "xor", FUNCTION(rb_gsl_block,xor), 1);
|
|
868
|
+
rb_define_method(GSL_TYPE(cgsl_block), "not", FUNCTION(rb_gsl_block,not), 0);
|
|
869
|
+
|
|
870
|
+
rb_define_method(GSL_TYPE(cgsl_block), "all?", FUNCTION(rb_gsl_block,all), 0);
|
|
871
|
+
rb_define_method(GSL_TYPE(cgsl_block), "none?", FUNCTION(rb_gsl_block,none), 0);
|
|
872
|
+
rb_define_method(GSL_TYPE(cgsl_block), "any",
|
|
873
|
+
FUNCTION(rb_gsl_block,any), 0);
|
|
874
|
+
rb_define_method(GSL_TYPE(cgsl_block), "any?",
|
|
875
|
+
FUNCTION(rb_gsl_block,any2), 0);
|
|
876
|
+
|
|
877
|
+
rb_define_method(GSL_TYPE(cgsl_block), "where", FUNCTION(rb_gsl_block,where), 0);
|
|
878
|
+
rb_define_method(GSL_TYPE(cgsl_block), "where2", FUNCTION(rb_gsl_block,where2), 0);
|
|
879
|
+
|
|
880
|
+
rb_define_method(GSL_TYPE(cgsl_block), "each", FUNCTION(rb_gsl_block,each), 0);
|
|
881
|
+
rb_define_method(GSL_TYPE(cgsl_block), "each_index", FUNCTION(rb_gsl_block,each_index), 0);
|
|
882
|
+
rb_define_method(GSL_TYPE(cgsl_block), "collect", FUNCTION(rb_gsl_block,collect), 0);
|
|
883
|
+
rb_define_method(GSL_TYPE(cgsl_block), "collect!", FUNCTION(rb_gsl_block,collect_bang), 0);
|
|
884
|
+
rb_define_alias(GSL_TYPE(cgsl_block), "map", "collect");
|
|
885
|
+
rb_define_alias(GSL_TYPE(cgsl_block), "map!", "collect!");
|
|
886
|
+
}
|