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/cheb.c
ADDED
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
/*
|
|
2
|
+
cheb.c
|
|
3
|
+
Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
|
|
4
|
+
(C) Copyright 2001-2006 by Yoshiki Tsunesada
|
|
5
|
+
|
|
6
|
+
Ruby/GSL is free software: you can redistribute it and/or modify it
|
|
7
|
+
under the terms of the GNU General Public License.
|
|
8
|
+
This library is distributed in the hope that it will be useful, but
|
|
9
|
+
WITHOUT ANY WARRANTY.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
#include "rb_gsl.h"
|
|
13
|
+
#include "rb_gsl_common.h"
|
|
14
|
+
#include "rb_gsl_array.h"
|
|
15
|
+
#include "rb_gsl_function.h"
|
|
16
|
+
#include <gsl/gsl_math.h>
|
|
17
|
+
#include <gsl/gsl_chebyshev.h>
|
|
18
|
+
#ifdef HAVE_NARRAY_H
|
|
19
|
+
#include "narray.h"
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
static VALUE cgsl_cheb;
|
|
23
|
+
|
|
24
|
+
static VALUE rb_gsl_cheb_new(VALUE klass, VALUE nn)
|
|
25
|
+
{
|
|
26
|
+
gsl_cheb_series *p = NULL;
|
|
27
|
+
CHECK_FIXNUM(nn);
|
|
28
|
+
p = gsl_cheb_alloc(FIX2INT(nn));
|
|
29
|
+
return Data_Wrap_Struct(klass, 0, gsl_cheb_free, p);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static VALUE rb_gsl_cheb_order(VALUE obj)
|
|
33
|
+
{
|
|
34
|
+
gsl_cheb_series *p = NULL;
|
|
35
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
36
|
+
return INT2FIX(p->order);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static VALUE rb_gsl_cheb_a(VALUE obj)
|
|
40
|
+
{
|
|
41
|
+
gsl_cheb_series *p = NULL;
|
|
42
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
43
|
+
return rb_float_new(p->a);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static VALUE rb_gsl_cheb_b(VALUE obj)
|
|
47
|
+
{
|
|
48
|
+
gsl_cheb_series *p = NULL;
|
|
49
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
50
|
+
return rb_float_new(p->b);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static VALUE rb_gsl_cheb_coef(VALUE obj)
|
|
54
|
+
{
|
|
55
|
+
gsl_cheb_series *p = NULL;
|
|
56
|
+
gsl_vector_view *v = NULL;
|
|
57
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
58
|
+
v = gsl_vector_view_alloc();
|
|
59
|
+
v->vector.data = p->c;
|
|
60
|
+
v->vector.size = p->order + 1;
|
|
61
|
+
v->vector.stride = 1;
|
|
62
|
+
v->vector.owner = 0;
|
|
63
|
+
return Data_Wrap_Struct(cgsl_vector_view_ro, 0, gsl_vector_view_free, v);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static VALUE rb_gsl_cheb_f(VALUE obj)
|
|
67
|
+
{
|
|
68
|
+
gsl_cheb_series *p = NULL;
|
|
69
|
+
gsl_vector_view *v = NULL;
|
|
70
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
71
|
+
v = gsl_vector_view_alloc();
|
|
72
|
+
v->vector.data = p->f;
|
|
73
|
+
v->vector.size = p->order + 1;
|
|
74
|
+
v->vector.stride = 1;
|
|
75
|
+
v->vector.owner = 0;
|
|
76
|
+
return Data_Wrap_Struct(cgsl_vector_view_ro, 0, gsl_vector_view_free, v);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
static VALUE rb_gsl_cheb_init(VALUE obj, VALUE ff, VALUE aa, VALUE bb)
|
|
80
|
+
{
|
|
81
|
+
gsl_cheb_series *p = NULL;
|
|
82
|
+
gsl_function *fff = NULL;
|
|
83
|
+
double a, b;
|
|
84
|
+
CHECK_FUNCTION(ff);
|
|
85
|
+
Need_Float(aa); Need_Float(bb);
|
|
86
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
87
|
+
Data_Get_Struct(ff, gsl_function, fff);
|
|
88
|
+
a = NUM2DBL(aa);
|
|
89
|
+
b = NUM2DBL(bb);
|
|
90
|
+
gsl_cheb_init(p, fff, a, b);
|
|
91
|
+
return obj;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static VALUE rb_gsl_cheb_eval(VALUE obj, VALUE xx)
|
|
95
|
+
{
|
|
96
|
+
gsl_cheb_series *p = NULL;
|
|
97
|
+
VALUE x, ary;
|
|
98
|
+
size_t i, j, n;
|
|
99
|
+
gsl_vector *v = NULL, *vnew = NULL;
|
|
100
|
+
gsl_matrix *m = NULL, *mnew = NULL;
|
|
101
|
+
#ifdef HAVE_NARRAY_H
|
|
102
|
+
struct NARRAY *na;
|
|
103
|
+
double *ptr1, *ptr2;
|
|
104
|
+
#endif
|
|
105
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
106
|
+
if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
|
|
107
|
+
switch (TYPE(xx)) {
|
|
108
|
+
case T_FIXNUM:
|
|
109
|
+
case T_BIGNUM:
|
|
110
|
+
case T_FLOAT:
|
|
111
|
+
return rb_float_new(gsl_cheb_eval(p, NUM2DBL(xx)));
|
|
112
|
+
break;
|
|
113
|
+
case T_ARRAY:
|
|
114
|
+
// n = RARRAY(xx)->len;
|
|
115
|
+
n = RARRAY_LEN(xx);
|
|
116
|
+
ary = rb_ary_new2(n);
|
|
117
|
+
for (i = 0; i < n; i++) {
|
|
118
|
+
x = rb_ary_entry(xx, i);
|
|
119
|
+
Need_Float(xx);
|
|
120
|
+
rb_ary_store(ary, i, rb_float_new(gsl_cheb_eval(p, NUM2DBL(x))));
|
|
121
|
+
}
|
|
122
|
+
return ary;
|
|
123
|
+
break;
|
|
124
|
+
default:
|
|
125
|
+
#ifdef HAVE_NARRAY_H
|
|
126
|
+
if (NA_IsNArray(xx)) {
|
|
127
|
+
GetNArray(xx, na);
|
|
128
|
+
ptr1 = (double*) na->ptr;
|
|
129
|
+
n = na->total;
|
|
130
|
+
ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
|
131
|
+
ptr2 = NA_PTR_TYPE(ary,double*);
|
|
132
|
+
for (i = 0; i < n; i++) ptr2[i] = gsl_cheb_eval(p, ptr1[i]);
|
|
133
|
+
return ary;
|
|
134
|
+
}
|
|
135
|
+
#endif
|
|
136
|
+
if (VECTOR_P(xx)) {
|
|
137
|
+
Data_Get_Struct(xx, gsl_vector, v);
|
|
138
|
+
vnew = gsl_vector_alloc(v->size);
|
|
139
|
+
for (i = 0; i < v->size; i++) {
|
|
140
|
+
gsl_vector_set(vnew, i, gsl_cheb_eval(p, gsl_vector_get(v, i)));
|
|
141
|
+
}
|
|
142
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
|
143
|
+
} else if (MATRIX_P(xx)) {
|
|
144
|
+
Data_Get_Struct(xx, gsl_matrix, m);
|
|
145
|
+
mnew = gsl_matrix_alloc(m->size1, m->size2);
|
|
146
|
+
for (i = 0; i < m->size1; i++) {
|
|
147
|
+
for (j = 0; j < m->size2; j++) {
|
|
148
|
+
gsl_matrix_set(mnew, i, j, gsl_cheb_eval(p, gsl_matrix_get(m, i, j)));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
|
152
|
+
} else {
|
|
153
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
return Qnil; /* never reach here */
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
static VALUE rb_gsl_cheb_eval_err(VALUE obj, VALUE xx)
|
|
161
|
+
{
|
|
162
|
+
gsl_cheb_series *p = NULL;
|
|
163
|
+
double result, err;
|
|
164
|
+
VALUE x, ary, aerr;
|
|
165
|
+
size_t n, i, j;
|
|
166
|
+
gsl_vector *v = NULL, *vnew = NULL, *verr = NULL;
|
|
167
|
+
gsl_matrix *m = NULL, *mnew = NULL, *merr = NULL;
|
|
168
|
+
#ifdef HAVE_NARRAY_H
|
|
169
|
+
struct NARRAY *na;
|
|
170
|
+
double *ptr1, *ptr2, *ptr3;
|
|
171
|
+
#endif
|
|
172
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
173
|
+
if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
|
|
174
|
+
switch (TYPE(xx)) {
|
|
175
|
+
case T_FIXNUM:
|
|
176
|
+
case T_BIGNUM:
|
|
177
|
+
case T_FLOAT:
|
|
178
|
+
gsl_cheb_eval_err(p, NUM2DBL(xx), &result, &err);
|
|
179
|
+
return rb_ary_new3(2, rb_float_new(result), rb_float_new(err));
|
|
180
|
+
break;
|
|
181
|
+
case T_ARRAY:
|
|
182
|
+
// n = RARRAY(xx)->len;
|
|
183
|
+
n = RARRAY_LEN(xx);
|
|
184
|
+
ary = rb_ary_new2(n);
|
|
185
|
+
aerr = rb_ary_new2(n);
|
|
186
|
+
for (i = 0; i < n; i++) {
|
|
187
|
+
x = rb_ary_entry(xx, i);
|
|
188
|
+
Need_Float(xx);
|
|
189
|
+
gsl_cheb_eval_err(p, NUM2DBL(x), &result, &err);
|
|
190
|
+
rb_ary_store(ary, i, rb_float_new(result));
|
|
191
|
+
rb_ary_store(aerr, i, rb_float_new(err));
|
|
192
|
+
}
|
|
193
|
+
return rb_ary_new3(2, ary, aerr);
|
|
194
|
+
break;
|
|
195
|
+
default:
|
|
196
|
+
#ifdef HAVE_NARRAY_H
|
|
197
|
+
if (NA_IsNArray(xx)) {
|
|
198
|
+
GetNArray(xx, na);
|
|
199
|
+
ptr1 = (double*) na->ptr;
|
|
200
|
+
n = na->total;
|
|
201
|
+
ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
|
202
|
+
aerr = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
|
203
|
+
ptr2 = NA_PTR_TYPE(ary,double*);
|
|
204
|
+
ptr3 = NA_PTR_TYPE(aerr,double*);
|
|
205
|
+
for (i = 0; i < n; i++) {
|
|
206
|
+
gsl_cheb_eval_err(p, ptr1[i], &result, &err);
|
|
207
|
+
ptr2[i] = result;
|
|
208
|
+
ptr3[i] = err;
|
|
209
|
+
}
|
|
210
|
+
return rb_ary_new3(2, ary, aerr);
|
|
211
|
+
}
|
|
212
|
+
#endif
|
|
213
|
+
if (VECTOR_P(xx)) {
|
|
214
|
+
Data_Get_Struct(xx, gsl_vector, v);
|
|
215
|
+
vnew = gsl_vector_alloc(v->size);
|
|
216
|
+
verr = gsl_vector_alloc(v->size);
|
|
217
|
+
for (i = 0; i < v->size; i++) {
|
|
218
|
+
gsl_cheb_eval_err(p, gsl_vector_get(v, i), &result, &err);
|
|
219
|
+
gsl_vector_set(vnew, i, result);
|
|
220
|
+
gsl_vector_set(verr, i, err);
|
|
221
|
+
}
|
|
222
|
+
return rb_ary_new3(2,
|
|
223
|
+
Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
|
|
224
|
+
Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
|
|
225
|
+
} else if (MATRIX_P(xx)) {
|
|
226
|
+
Data_Get_Struct(xx, gsl_matrix, m);
|
|
227
|
+
mnew = gsl_matrix_alloc(m->size1, m->size2);
|
|
228
|
+
merr = gsl_matrix_alloc(m->size1, m->size2);
|
|
229
|
+
for (i = 0; i < m->size1; i++) {
|
|
230
|
+
for (j = 0; j < m->size2; j++) {
|
|
231
|
+
gsl_cheb_eval_err(p, gsl_matrix_get(m, i, j), &result, &err);
|
|
232
|
+
gsl_matrix_set(mnew, i, j, result);
|
|
233
|
+
gsl_matrix_set(merr, i, j, err);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return rb_ary_new3(2,
|
|
237
|
+
Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
|
|
238
|
+
Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
|
|
239
|
+
} else {
|
|
240
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
241
|
+
}
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
return Qnil; /* never reach here */
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
static VALUE rb_gsl_cheb_eval_n(VALUE obj, VALUE nn, VALUE xx)
|
|
248
|
+
{
|
|
249
|
+
gsl_cheb_series *p = NULL;
|
|
250
|
+
VALUE x, ary;
|
|
251
|
+
size_t n, order, i, j;
|
|
252
|
+
gsl_vector *v = NULL, *vnew = NULL;
|
|
253
|
+
gsl_matrix *m = NULL, *mnew = NULL;
|
|
254
|
+
#ifdef HAVE_NARRAY_H
|
|
255
|
+
struct NARRAY *na;
|
|
256
|
+
double *ptr1, *ptr2;
|
|
257
|
+
#endif
|
|
258
|
+
CHECK_FIXNUM(nn);
|
|
259
|
+
order = FIX2INT(nn);
|
|
260
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
261
|
+
if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
|
|
262
|
+
switch (TYPE(xx)) {
|
|
263
|
+
case T_FIXNUM:
|
|
264
|
+
case T_BIGNUM:
|
|
265
|
+
case T_FLOAT:
|
|
266
|
+
return rb_float_new(gsl_cheb_eval_n(p, order, NUM2DBL(xx)));
|
|
267
|
+
break;
|
|
268
|
+
case T_ARRAY:
|
|
269
|
+
// n = RARRAY(xx)->len;
|
|
270
|
+
n = RARRAY_LEN(xx);
|
|
271
|
+
ary = rb_ary_new2(n);
|
|
272
|
+
for (i = 0; i < n; i++) {
|
|
273
|
+
x = rb_ary_entry(xx, i);
|
|
274
|
+
Need_Float(xx);
|
|
275
|
+
rb_ary_store(ary, i, rb_float_new(gsl_cheb_eval_n(p, order, NUM2DBL(x))));
|
|
276
|
+
}
|
|
277
|
+
return ary;
|
|
278
|
+
break;
|
|
279
|
+
default:
|
|
280
|
+
#ifdef HAVE_NARRAY_H
|
|
281
|
+
if (NA_IsNArray(xx)) {
|
|
282
|
+
GetNArray(xx, na);
|
|
283
|
+
ptr1 = (double*) na->ptr;
|
|
284
|
+
n = na->total;
|
|
285
|
+
ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
|
286
|
+
ptr2 = NA_PTR_TYPE(ary,double*);
|
|
287
|
+
for (i = 0; i < n; i++) ptr2[i] = gsl_cheb_eval_n(p, order, ptr1[i]);
|
|
288
|
+
return ary;
|
|
289
|
+
}
|
|
290
|
+
#endif
|
|
291
|
+
if (VECTOR_P(xx)) {
|
|
292
|
+
Data_Get_Struct(xx, gsl_vector, v);
|
|
293
|
+
vnew = gsl_vector_alloc(v->size);
|
|
294
|
+
for (i = 0; i < v->size; i++) {
|
|
295
|
+
gsl_vector_set(vnew, i, gsl_cheb_eval_n(p, order, gsl_vector_get(v, i)));
|
|
296
|
+
}
|
|
297
|
+
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
|
|
298
|
+
} else if (MATRIX_P(xx)) {
|
|
299
|
+
Data_Get_Struct(xx, gsl_matrix, m);
|
|
300
|
+
mnew = gsl_matrix_alloc(m->size1, m->size2);
|
|
301
|
+
for (i = 0; i < m->size1; i++) {
|
|
302
|
+
for (j = 0; j < m->size2; j++) {
|
|
303
|
+
gsl_matrix_set(mnew, i, j,
|
|
304
|
+
gsl_cheb_eval_n(p, order, gsl_matrix_get(m, i, j)));
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
|
|
308
|
+
} else {
|
|
309
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
310
|
+
}
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
return Qnil; /* never reach here */
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
static VALUE rb_gsl_cheb_eval_n_err(VALUE obj, VALUE nn, VALUE xx)
|
|
317
|
+
{
|
|
318
|
+
gsl_cheb_series *p = NULL;
|
|
319
|
+
double result, err;
|
|
320
|
+
VALUE x, ary, aerr;
|
|
321
|
+
size_t n, order, i, j;
|
|
322
|
+
gsl_vector *v, *vnew, *verr;
|
|
323
|
+
gsl_matrix *m, *mnew, *merr;
|
|
324
|
+
#ifdef HAVE_NARRAY_H
|
|
325
|
+
struct NARRAY *na;
|
|
326
|
+
double *ptr1, *ptr2, *ptr3;
|
|
327
|
+
#endif
|
|
328
|
+
CHECK_FIXNUM(nn);
|
|
329
|
+
order = FIX2INT(nn);
|
|
330
|
+
Data_Get_Struct(obj, gsl_cheb_series, p);
|
|
331
|
+
if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
|
|
332
|
+
switch (TYPE(xx)) {
|
|
333
|
+
case T_FIXNUM:
|
|
334
|
+
case T_BIGNUM:
|
|
335
|
+
case T_FLOAT:
|
|
336
|
+
gsl_cheb_eval_n_err(p, order, NUM2DBL(xx), &result, &err);
|
|
337
|
+
return rb_ary_new3(2, rb_float_new(result), rb_float_new(err));
|
|
338
|
+
break;
|
|
339
|
+
case T_ARRAY:
|
|
340
|
+
// n = RARRAY(xx)->len;
|
|
341
|
+
n = RARRAY_LEN(xx);
|
|
342
|
+
ary = rb_ary_new2(n);
|
|
343
|
+
aerr = rb_ary_new2(n);
|
|
344
|
+
for (i = 0; i < n; i++) {
|
|
345
|
+
x = rb_ary_entry(xx, i);
|
|
346
|
+
Need_Float(xx);
|
|
347
|
+
gsl_cheb_eval_n_err(p, order, NUM2DBL(x), &result, &err);
|
|
348
|
+
rb_ary_store(ary, i, rb_float_new(result));
|
|
349
|
+
rb_ary_store(aerr, i, rb_float_new(err));
|
|
350
|
+
}
|
|
351
|
+
return rb_ary_new3(2, ary, aerr);
|
|
352
|
+
break;
|
|
353
|
+
default:
|
|
354
|
+
#ifdef HAVE_NARRAY_H
|
|
355
|
+
if (NA_IsNArray(xx)) {
|
|
356
|
+
GetNArray(xx, na);
|
|
357
|
+
ptr1 = (double*) na->ptr;
|
|
358
|
+
n = na->total;
|
|
359
|
+
ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
|
360
|
+
aerr = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
|
|
361
|
+
ptr2 = NA_PTR_TYPE(ary,double*);
|
|
362
|
+
ptr3 = NA_PTR_TYPE(aerr,double*);
|
|
363
|
+
for (i = 0; i < n; i++) {
|
|
364
|
+
gsl_cheb_eval_n_err(p, order, ptr1[i], &result, &err);
|
|
365
|
+
ptr2[i] = result;
|
|
366
|
+
ptr3[i] = err;
|
|
367
|
+
}
|
|
368
|
+
return rb_ary_new3(2, ary, aerr);
|
|
369
|
+
}
|
|
370
|
+
#endif
|
|
371
|
+
if (VECTOR_P(xx)) {
|
|
372
|
+
Data_Get_Struct(xx, gsl_vector, v);
|
|
373
|
+
vnew = gsl_vector_alloc(v->size);
|
|
374
|
+
verr = gsl_vector_alloc(v->size);
|
|
375
|
+
for (i = 0; i < v->size; i++) {
|
|
376
|
+
gsl_cheb_eval_n_err(p, order, gsl_vector_get(v, i), &result, &err);
|
|
377
|
+
gsl_vector_set(vnew, i, result);
|
|
378
|
+
gsl_vector_set(verr, i, err);
|
|
379
|
+
}
|
|
380
|
+
return rb_ary_new3(2,
|
|
381
|
+
Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
|
|
382
|
+
Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
|
|
383
|
+
} else if (MATRIX_P(xx)) {
|
|
384
|
+
Data_Get_Struct(xx, gsl_matrix, m);
|
|
385
|
+
mnew = gsl_matrix_alloc(m->size1, m->size2);
|
|
386
|
+
merr = gsl_matrix_alloc(m->size1, m->size2);
|
|
387
|
+
for (i = 0; i < m->size1; i++) {
|
|
388
|
+
for (j = 0; j < m->size2; j++) {
|
|
389
|
+
gsl_cheb_eval_n_err(p, order, gsl_matrix_get(m, i, j), &result, &err);
|
|
390
|
+
gsl_matrix_set(mnew, i, j, result);
|
|
391
|
+
gsl_matrix_set(merr, i, j, err);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return rb_ary_new3(2,
|
|
395
|
+
Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
|
|
396
|
+
Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
|
|
397
|
+
} else {
|
|
398
|
+
rb_raise(rb_eTypeError, "wrong argument type");
|
|
399
|
+
}
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
return Qnil; /* never reach here */
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
static VALUE rb_gsl_cheb_calc_deriv(int argc, VALUE *argv, VALUE obj)
|
|
406
|
+
{
|
|
407
|
+
gsl_cheb_series *deriv = NULL, *cs = NULL;
|
|
408
|
+
VALUE retval;
|
|
409
|
+
switch (TYPE(obj)) {
|
|
410
|
+
case T_MODULE:
|
|
411
|
+
case T_CLASS:
|
|
412
|
+
case T_OBJECT:
|
|
413
|
+
switch (argc) {
|
|
414
|
+
case 1:
|
|
415
|
+
if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
|
|
416
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
|
|
417
|
+
rb_class2name(CLASS_OF(argv[0])));
|
|
418
|
+
Data_Get_Struct(argv[0], gsl_cheb_series, cs);
|
|
419
|
+
deriv = gsl_cheb_alloc(cs->order);
|
|
420
|
+
retval = Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_cheb_free, deriv);
|
|
421
|
+
break;
|
|
422
|
+
case 2:
|
|
423
|
+
if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
|
|
424
|
+
rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
|
|
425
|
+
rb_class2name(CLASS_OF(argv[0])));
|
|
426
|
+
if (!rb_obj_is_kind_of(argv[1], cgsl_cheb))
|
|
427
|
+
rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
|
|
428
|
+
rb_class2name(CLASS_OF(argv[1])));
|
|
429
|
+
Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
|
|
430
|
+
Data_Get_Struct(argv[1], gsl_cheb_series, cs);
|
|
431
|
+
retval = argv[0];
|
|
432
|
+
break;
|
|
433
|
+
default:
|
|
434
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
break;
|
|
438
|
+
default:
|
|
439
|
+
Data_Get_Struct(obj, gsl_cheb_series, cs);
|
|
440
|
+
switch (argc) {
|
|
441
|
+
case 0:
|
|
442
|
+
deriv = gsl_cheb_alloc(cs->order);
|
|
443
|
+
retval = Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_cheb_free, deriv);
|
|
444
|
+
break;
|
|
445
|
+
case 1:
|
|
446
|
+
if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
|
|
447
|
+
rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
|
|
448
|
+
rb_class2name(CLASS_OF(argv[0])));
|
|
449
|
+
Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
|
|
450
|
+
retval = argv[0];
|
|
451
|
+
break;
|
|
452
|
+
default:
|
|
453
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
gsl_cheb_calc_deriv(deriv, cs);
|
|
459
|
+
return retval;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
static VALUE rb_gsl_cheb_calc_integ(int argc, VALUE *argv, VALUE obj)
|
|
463
|
+
{
|
|
464
|
+
gsl_cheb_series *deriv = NULL, *cs = NULL;
|
|
465
|
+
VALUE retval;
|
|
466
|
+
switch (TYPE(obj)) {
|
|
467
|
+
case T_MODULE:
|
|
468
|
+
case T_CLASS:
|
|
469
|
+
case T_OBJECT:
|
|
470
|
+
switch (argc) {
|
|
471
|
+
case 1:
|
|
472
|
+
if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
|
|
473
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
|
|
474
|
+
rb_class2name(CLASS_OF(argv[0])));
|
|
475
|
+
Data_Get_Struct(argv[0], gsl_cheb_series, cs);
|
|
476
|
+
deriv = gsl_cheb_alloc(cs->order);
|
|
477
|
+
retval = Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_cheb_free, deriv);
|
|
478
|
+
break;
|
|
479
|
+
case 2:
|
|
480
|
+
if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
|
|
481
|
+
rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
|
|
482
|
+
rb_class2name(CLASS_OF(argv[0])));
|
|
483
|
+
if (!rb_obj_is_kind_of(argv[1], cgsl_cheb))
|
|
484
|
+
rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
|
|
485
|
+
rb_class2name(CLASS_OF(argv[1])));
|
|
486
|
+
Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
|
|
487
|
+
Data_Get_Struct(argv[1], gsl_cheb_series, cs);
|
|
488
|
+
retval = argv[0];
|
|
489
|
+
break;
|
|
490
|
+
default:
|
|
491
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
|
|
492
|
+
break;
|
|
493
|
+
}
|
|
494
|
+
break;
|
|
495
|
+
default:
|
|
496
|
+
Data_Get_Struct(obj, gsl_cheb_series, cs);
|
|
497
|
+
switch (argc) {
|
|
498
|
+
case 0:
|
|
499
|
+
deriv = gsl_cheb_alloc(cs->order);
|
|
500
|
+
retval = Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_cheb_free, deriv);
|
|
501
|
+
break;
|
|
502
|
+
case 1:
|
|
503
|
+
if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
|
|
504
|
+
rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
|
|
505
|
+
rb_class2name(CLASS_OF(argv[0])));
|
|
506
|
+
Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
|
|
507
|
+
retval = argv[0];
|
|
508
|
+
break;
|
|
509
|
+
default:
|
|
510
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
break;
|
|
514
|
+
}
|
|
515
|
+
gsl_cheb_calc_integ(deriv, cs);
|
|
516
|
+
return retval;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
void Init_gsl_cheb(VALUE module)
|
|
520
|
+
{
|
|
521
|
+
cgsl_cheb = rb_define_class_under(module, "Cheb", cGSL_Object);
|
|
522
|
+
rb_define_singleton_method(cgsl_cheb, "new", rb_gsl_cheb_new, 1);
|
|
523
|
+
rb_define_singleton_method(cgsl_cheb, "alloc", rb_gsl_cheb_new, 1);
|
|
524
|
+
rb_define_method(cgsl_cheb, "order", rb_gsl_cheb_order, 0);
|
|
525
|
+
rb_define_method(cgsl_cheb, "a", rb_gsl_cheb_a, 0);
|
|
526
|
+
rb_define_method(cgsl_cheb, "b", rb_gsl_cheb_b, 0);
|
|
527
|
+
rb_define_method(cgsl_cheb, "coef", rb_gsl_cheb_coef, 0);
|
|
528
|
+
rb_define_alias(cgsl_cheb, "c", "coef");
|
|
529
|
+
rb_define_method(cgsl_cheb, "f", rb_gsl_cheb_f, 0);
|
|
530
|
+
rb_define_method(cgsl_cheb, "init", rb_gsl_cheb_init, 3);
|
|
531
|
+
rb_define_method(cgsl_cheb, "eval", rb_gsl_cheb_eval, 1);
|
|
532
|
+
rb_define_method(cgsl_cheb, "eval_err", rb_gsl_cheb_eval_err, 1);
|
|
533
|
+
rb_define_method(cgsl_cheb, "eval_n", rb_gsl_cheb_eval_n, 2);
|
|
534
|
+
rb_define_method(cgsl_cheb, "eval_n_err", rb_gsl_cheb_eval_n_err, 2);
|
|
535
|
+
rb_define_method(cgsl_cheb, "calc_deriv", rb_gsl_cheb_calc_deriv, -1);
|
|
536
|
+
rb_define_alias(cgsl_cheb, "deriv", "calc_deriv");
|
|
537
|
+
rb_define_method(cgsl_cheb, "calc_integ", rb_gsl_cheb_calc_integ, -1);
|
|
538
|
+
rb_define_alias(cgsl_cheb, "integ", "calc_integ");
|
|
539
|
+
|
|
540
|
+
rb_define_singleton_method(cgsl_cheb, "calc_deriv", rb_gsl_cheb_calc_deriv, -1);
|
|
541
|
+
rb_define_singleton_method(cgsl_cheb, "calc_integ", rb_gsl_cheb_calc_integ, -1);
|
|
542
|
+
}
|