gsl 1.12.108

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