romanbsd-gsl 1.11.2.2

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 (156) hide show
  1. data/README.rdoc +29 -0
  2. data/Rakefile +54 -0
  3. data/VERSION +1 -0
  4. data/ext/MANIFEST +116 -0
  5. data/ext/array.c +665 -0
  6. data/ext/array_complex.c +247 -0
  7. data/ext/blas.c +29 -0
  8. data/ext/blas1.c +729 -0
  9. data/ext/blas2.c +1093 -0
  10. data/ext/blas3.c +881 -0
  11. data/ext/block.c +44 -0
  12. data/ext/block_source.c +885 -0
  13. data/ext/bspline.c +116 -0
  14. data/ext/bundle.c +3 -0
  15. data/ext/cdf.c +754 -0
  16. data/ext/cheb.c +538 -0
  17. data/ext/combination.c +283 -0
  18. data/ext/common.c +310 -0
  19. data/ext/complex.c +1005 -0
  20. data/ext/const.c +668 -0
  21. data/ext/const_additional.c +120 -0
  22. data/ext/cqp.c +283 -0
  23. data/ext/deriv.c +194 -0
  24. data/ext/dht.c +360 -0
  25. data/ext/diff.c +165 -0
  26. data/ext/dirac.c +395 -0
  27. data/ext/eigen.c +2373 -0
  28. data/ext/error.c +194 -0
  29. data/ext/extconf.rb +272 -0
  30. data/ext/fcmp.c +66 -0
  31. data/ext/fft.c +1092 -0
  32. data/ext/fit.c +205 -0
  33. data/ext/fresnel.c +312 -0
  34. data/ext/function.c +522 -0
  35. data/ext/graph.c +1634 -0
  36. data/ext/gsl.c +265 -0
  37. data/ext/gsl_narray.c +652 -0
  38. data/ext/histogram.c +1717 -0
  39. data/ext/histogram2d.c +1067 -0
  40. data/ext/histogram3d.c +883 -0
  41. data/ext/histogram3d_source.c +750 -0
  42. data/ext/histogram_find.c +101 -0
  43. data/ext/histogram_oper.c +159 -0
  44. data/ext/ieee.c +98 -0
  45. data/ext/integration.c +1138 -0
  46. data/ext/interp.c +511 -0
  47. data/ext/jacobi.c +737 -0
  48. data/ext/linalg.c +4045 -0
  49. data/ext/linalg_complex.c +743 -0
  50. data/ext/math.c +724 -0
  51. data/ext/matrix.c +39 -0
  52. data/ext/matrix_complex.c +1731 -0
  53. data/ext/matrix_double.c +560 -0
  54. data/ext/matrix_int.c +256 -0
  55. data/ext/matrix_source.c +2678 -0
  56. data/ext/min.c +234 -0
  57. data/ext/monte.c +759 -0
  58. data/ext/multifit.c +1810 -0
  59. data/ext/multimin.c +793 -0
  60. data/ext/multimin_fsdf.c +156 -0
  61. data/ext/multiroots.c +952 -0
  62. data/ext/ndlinear.c +320 -0
  63. data/ext/nmf.c +159 -0
  64. data/ext/nmf_wrap.c +63 -0
  65. data/ext/ntuple.c +469 -0
  66. data/ext/odeiv.c +958 -0
  67. data/ext/ool.c +879 -0
  68. data/ext/oper_complex_source.c +253 -0
  69. data/ext/permutation.c +596 -0
  70. data/ext/poly.c +42 -0
  71. data/ext/poly2.c +265 -0
  72. data/ext/poly_source.c +1799 -0
  73. data/ext/qrng.c +171 -0
  74. data/ext/randist.c +1869 -0
  75. data/ext/rational.c +480 -0
  76. data/ext/rng.c +612 -0
  77. data/ext/root.c +408 -0
  78. data/ext/sf.c +1494 -0
  79. data/ext/sf_airy.c +200 -0
  80. data/ext/sf_bessel.c +867 -0
  81. data/ext/sf_clausen.c +28 -0
  82. data/ext/sf_coulomb.c +206 -0
  83. data/ext/sf_coupling.c +118 -0
  84. data/ext/sf_dawson.c +29 -0
  85. data/ext/sf_debye.c +157 -0
  86. data/ext/sf_dilog.c +42 -0
  87. data/ext/sf_elementary.c +44 -0
  88. data/ext/sf_ellint.c +206 -0
  89. data/ext/sf_elljac.c +29 -0
  90. data/ext/sf_erfc.c +93 -0
  91. data/ext/sf_exp.c +164 -0
  92. data/ext/sf_expint.c +211 -0
  93. data/ext/sf_fermi_dirac.c +148 -0
  94. data/ext/sf_gamma.c +344 -0
  95. data/ext/sf_gegenbauer.c +96 -0
  96. data/ext/sf_hyperg.c +197 -0
  97. data/ext/sf_laguerre.c +112 -0
  98. data/ext/sf_lambert.c +47 -0
  99. data/ext/sf_legendre.c +367 -0
  100. data/ext/sf_log.c +104 -0
  101. data/ext/sf_mathieu.c +238 -0
  102. data/ext/sf_power.c +46 -0
  103. data/ext/sf_psi.c +98 -0
  104. data/ext/sf_synchrotron.c +48 -0
  105. data/ext/sf_transport.c +76 -0
  106. data/ext/sf_trigonometric.c +207 -0
  107. data/ext/sf_zeta.c +119 -0
  108. data/ext/signal.c +310 -0
  109. data/ext/siman.c +718 -0
  110. data/ext/sort.c +208 -0
  111. data/ext/spline.c +393 -0
  112. data/ext/stats.c +799 -0
  113. data/ext/sum.c +168 -0
  114. data/ext/tamu_anova.c +56 -0
  115. data/ext/tensor.c +38 -0
  116. data/ext/tensor_source.c +1121 -0
  117. data/ext/vector.c +38 -0
  118. data/ext/vector_complex.c +2139 -0
  119. data/ext/vector_double.c +1445 -0
  120. data/ext/vector_int.c +204 -0
  121. data/ext/vector_source.c +3325 -0
  122. data/ext/wavelet.c +937 -0
  123. data/include/rb_gsl.h +140 -0
  124. data/include/rb_gsl_array.h +230 -0
  125. data/include/rb_gsl_cheb.h +21 -0
  126. data/include/rb_gsl_common.h +343 -0
  127. data/include/rb_gsl_complex.h +25 -0
  128. data/include/rb_gsl_const.h +29 -0
  129. data/include/rb_gsl_dirac.h +15 -0
  130. data/include/rb_gsl_eigen.h +17 -0
  131. data/include/rb_gsl_fft.h +62 -0
  132. data/include/rb_gsl_fit.h +25 -0
  133. data/include/rb_gsl_function.h +27 -0
  134. data/include/rb_gsl_graph.h +70 -0
  135. data/include/rb_gsl_histogram.h +65 -0
  136. data/include/rb_gsl_histogram3d.h +97 -0
  137. data/include/rb_gsl_integration.h +17 -0
  138. data/include/rb_gsl_interp.h +46 -0
  139. data/include/rb_gsl_linalg.h +25 -0
  140. data/include/rb_gsl_math.h +26 -0
  141. data/include/rb_gsl_odeiv.h +21 -0
  142. data/include/rb_gsl_poly.h +71 -0
  143. data/include/rb_gsl_rational.h +37 -0
  144. data/include/rb_gsl_rng.h +21 -0
  145. data/include/rb_gsl_root.h +22 -0
  146. data/include/rb_gsl_sf.h +119 -0
  147. data/include/rb_gsl_statistics.h +17 -0
  148. data/include/rb_gsl_tensor.h +45 -0
  149. data/include/rb_gsl_with_narray.h +22 -0
  150. data/include/templates_off.h +87 -0
  151. data/include/templates_on.h +241 -0
  152. data/lib/gsl/gnuplot.rb +41 -0
  153. data/lib/gsl/oper.rb +68 -0
  154. data/lib/ool.rb +22 -0
  155. data/lib/ool/conmin.rb +30 -0
  156. metadata +221 -0
data/ext/cheb.c ADDED
@@ -0,0 +1,538 @@
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
+ ary = rb_ary_new2(n);
116
+ for (i = 0; i < n; i++) {
117
+ x = rb_ary_entry(xx, i);
118
+ Need_Float(xx);
119
+ rb_ary_store(ary, i, rb_float_new(gsl_cheb_eval(p, NUM2DBL(x))));
120
+ }
121
+ return ary;
122
+ break;
123
+ default:
124
+ #ifdef HAVE_NARRAY_H
125
+ if (NA_IsNArray(xx)) {
126
+ GetNArray(xx, na);
127
+ ptr1 = (double*) na->ptr;
128
+ n = na->total;
129
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
130
+ ptr2 = NA_PTR_TYPE(ary,double*);
131
+ for (i = 0; i < n; i++) ptr2[i] = gsl_cheb_eval(p, ptr1[i]);
132
+ return ary;
133
+ }
134
+ #endif
135
+ if (VECTOR_P(xx)) {
136
+ Data_Get_Struct(xx, gsl_vector, v);
137
+ vnew = gsl_vector_alloc(v->size);
138
+ for (i = 0; i < v->size; i++) {
139
+ gsl_vector_set(vnew, i, gsl_cheb_eval(p, gsl_vector_get(v, i)));
140
+ }
141
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
142
+ } else if (MATRIX_P(xx)) {
143
+ Data_Get_Struct(xx, gsl_matrix, m);
144
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
145
+ for (i = 0; i < m->size1; i++) {
146
+ for (j = 0; j < m->size2; j++) {
147
+ gsl_matrix_set(mnew, i, j, gsl_cheb_eval(p, gsl_matrix_get(m, i, j)));
148
+ }
149
+ }
150
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
151
+ } else {
152
+ rb_raise(rb_eTypeError, "wrong argument type");
153
+ }
154
+ break;
155
+ }
156
+ return Qnil; /* never reach here */
157
+ }
158
+
159
+ static VALUE rb_gsl_cheb_eval_err(VALUE obj, VALUE xx)
160
+ {
161
+ gsl_cheb_series *p = NULL;
162
+ double result, err;
163
+ VALUE x, ary, aerr;
164
+ size_t n, i, j;
165
+ gsl_vector *v = NULL, *vnew = NULL, *verr = NULL;
166
+ gsl_matrix *m = NULL, *mnew = NULL, *merr = NULL;
167
+ #ifdef HAVE_NARRAY_H
168
+ struct NARRAY *na;
169
+ double *ptr1, *ptr2, *ptr3;
170
+ #endif
171
+ Data_Get_Struct(obj, gsl_cheb_series, p);
172
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
173
+ switch (TYPE(xx)) {
174
+ case T_FIXNUM:
175
+ case T_BIGNUM:
176
+ case T_FLOAT:
177
+ gsl_cheb_eval_err(p, NUM2DBL(xx), &result, &err);
178
+ return rb_ary_new3(2, rb_float_new(result), rb_float_new(err));
179
+ break;
180
+ case T_ARRAY:
181
+ n = RARRAY(xx)->len;
182
+ ary = rb_ary_new2(n);
183
+ aerr = rb_ary_new2(n);
184
+ for (i = 0; i < n; i++) {
185
+ x = rb_ary_entry(xx, i);
186
+ Need_Float(xx);
187
+ gsl_cheb_eval_err(p, NUM2DBL(x), &result, &err);
188
+ rb_ary_store(ary, i, rb_float_new(result));
189
+ rb_ary_store(aerr, i, rb_float_new(err));
190
+ }
191
+ return rb_ary_new3(2, ary, aerr);
192
+ break;
193
+ default:
194
+ #ifdef HAVE_NARRAY_H
195
+ if (NA_IsNArray(xx)) {
196
+ GetNArray(xx, na);
197
+ ptr1 = (double*) na->ptr;
198
+ n = na->total;
199
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
200
+ aerr = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
201
+ ptr2 = NA_PTR_TYPE(ary,double*);
202
+ ptr3 = NA_PTR_TYPE(aerr,double*);
203
+ for (i = 0; i < n; i++) {
204
+ gsl_cheb_eval_err(p, ptr1[i], &result, &err);
205
+ ptr2[i] = result;
206
+ ptr3[i] = err;
207
+ }
208
+ return rb_ary_new3(2, ary, aerr);
209
+ }
210
+ #endif
211
+ if (VECTOR_P(xx)) {
212
+ Data_Get_Struct(xx, gsl_vector, v);
213
+ vnew = gsl_vector_alloc(v->size);
214
+ verr = gsl_vector_alloc(v->size);
215
+ for (i = 0; i < v->size; i++) {
216
+ gsl_cheb_eval_err(p, gsl_vector_get(v, i), &result, &err);
217
+ gsl_vector_set(vnew, i, result);
218
+ gsl_vector_set(verr, i, err);
219
+ }
220
+ return rb_ary_new3(2,
221
+ Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
222
+ Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
223
+ } else if (MATRIX_P(xx)) {
224
+ Data_Get_Struct(xx, gsl_matrix, m);
225
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
226
+ merr = gsl_matrix_alloc(m->size1, m->size2);
227
+ for (i = 0; i < m->size1; i++) {
228
+ for (j = 0; j < m->size2; j++) {
229
+ gsl_cheb_eval_err(p, gsl_matrix_get(m, i, j), &result, &err);
230
+ gsl_matrix_set(mnew, i, j, result);
231
+ gsl_matrix_set(merr, i, j, err);
232
+ }
233
+ }
234
+ return rb_ary_new3(2,
235
+ Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
236
+ Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
237
+ } else {
238
+ rb_raise(rb_eTypeError, "wrong argument type");
239
+ }
240
+ break;
241
+ }
242
+ return Qnil; /* never reach here */
243
+ }
244
+
245
+ static VALUE rb_gsl_cheb_eval_n(VALUE obj, VALUE nn, VALUE xx)
246
+ {
247
+ gsl_cheb_series *p = NULL;
248
+ VALUE x, ary;
249
+ size_t n, order, i, j;
250
+ gsl_vector *v = NULL, *vnew = NULL;
251
+ gsl_matrix *m = NULL, *mnew = NULL;
252
+ #ifdef HAVE_NARRAY_H
253
+ struct NARRAY *na;
254
+ double *ptr1, *ptr2;
255
+ #endif
256
+ CHECK_FIXNUM(nn);
257
+ order = FIX2INT(nn);
258
+ Data_Get_Struct(obj, gsl_cheb_series, p);
259
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
260
+ switch (TYPE(xx)) {
261
+ case T_FIXNUM:
262
+ case T_BIGNUM:
263
+ case T_FLOAT:
264
+ return rb_float_new(gsl_cheb_eval_n(p, order, NUM2DBL(xx)));
265
+ break;
266
+ case T_ARRAY:
267
+ n = RARRAY(xx)->len;
268
+ ary = rb_ary_new2(n);
269
+ for (i = 0; i < n; i++) {
270
+ x = rb_ary_entry(xx, i);
271
+ Need_Float(xx);
272
+ rb_ary_store(ary, i, rb_float_new(gsl_cheb_eval_n(p, order, NUM2DBL(x))));
273
+ }
274
+ return ary;
275
+ break;
276
+ default:
277
+ #ifdef HAVE_NARRAY_H
278
+ if (NA_IsNArray(xx)) {
279
+ GetNArray(xx, na);
280
+ ptr1 = (double*) na->ptr;
281
+ n = na->total;
282
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
283
+ ptr2 = NA_PTR_TYPE(ary,double*);
284
+ for (i = 0; i < n; i++) ptr2[i] = gsl_cheb_eval_n(p, order, ptr1[i]);
285
+ return ary;
286
+ }
287
+ #endif
288
+ if (VECTOR_P(xx)) {
289
+ Data_Get_Struct(xx, gsl_vector, v);
290
+ vnew = gsl_vector_alloc(v->size);
291
+ for (i = 0; i < v->size; i++) {
292
+ gsl_vector_set(vnew, i, gsl_cheb_eval_n(p, order, gsl_vector_get(v, i)));
293
+ }
294
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
295
+ } else if (MATRIX_P(xx)) {
296
+ Data_Get_Struct(xx, gsl_matrix, m);
297
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
298
+ for (i = 0; i < m->size1; i++) {
299
+ for (j = 0; j < m->size2; j++) {
300
+ gsl_matrix_set(mnew, i, j,
301
+ gsl_cheb_eval_n(p, order, gsl_matrix_get(m, i, j)));
302
+ }
303
+ }
304
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
305
+ } else {
306
+ rb_raise(rb_eTypeError, "wrong argument type");
307
+ }
308
+ break;
309
+ }
310
+ return Qnil; /* never reach here */
311
+ }
312
+
313
+ static VALUE rb_gsl_cheb_eval_n_err(VALUE obj, VALUE nn, VALUE xx)
314
+ {
315
+ gsl_cheb_series *p = NULL;
316
+ double result, err;
317
+ VALUE x, ary, aerr;
318
+ size_t n, order, i, j;
319
+ gsl_vector *v, *vnew, *verr;
320
+ gsl_matrix *m, *mnew, *merr;
321
+ #ifdef HAVE_NARRAY_H
322
+ struct NARRAY *na;
323
+ double *ptr1, *ptr2, *ptr3;
324
+ #endif
325
+ CHECK_FIXNUM(nn);
326
+ order = FIX2INT(nn);
327
+ Data_Get_Struct(obj, gsl_cheb_series, p);
328
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
329
+ switch (TYPE(xx)) {
330
+ case T_FIXNUM:
331
+ case T_BIGNUM:
332
+ case T_FLOAT:
333
+ gsl_cheb_eval_n_err(p, order, NUM2DBL(xx), &result, &err);
334
+ return rb_ary_new3(2, rb_float_new(result), rb_float_new(err));
335
+ break;
336
+ case T_ARRAY:
337
+ n = RARRAY(xx)->len;
338
+ ary = rb_ary_new2(n);
339
+ aerr = rb_ary_new2(n);
340
+ for (i = 0; i < n; i++) {
341
+ x = rb_ary_entry(xx, i);
342
+ Need_Float(xx);
343
+ gsl_cheb_eval_n_err(p, order, NUM2DBL(x), &result, &err);
344
+ rb_ary_store(ary, i, rb_float_new(result));
345
+ rb_ary_store(aerr, i, rb_float_new(err));
346
+ }
347
+ return rb_ary_new3(2, ary, aerr);
348
+ break;
349
+ default:
350
+ #ifdef HAVE_NARRAY_H
351
+ if (NA_IsNArray(xx)) {
352
+ GetNArray(xx, na);
353
+ ptr1 = (double*) na->ptr;
354
+ n = na->total;
355
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
356
+ aerr = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
357
+ ptr2 = NA_PTR_TYPE(ary,double*);
358
+ ptr3 = NA_PTR_TYPE(aerr,double*);
359
+ for (i = 0; i < n; i++) {
360
+ gsl_cheb_eval_n_err(p, order, ptr1[i], &result, &err);
361
+ ptr2[i] = result;
362
+ ptr3[i] = err;
363
+ }
364
+ return rb_ary_new3(2, ary, aerr);
365
+ }
366
+ #endif
367
+ if (VECTOR_P(xx)) {
368
+ Data_Get_Struct(xx, gsl_vector, v);
369
+ vnew = gsl_vector_alloc(v->size);
370
+ verr = gsl_vector_alloc(v->size);
371
+ for (i = 0; i < v->size; i++) {
372
+ gsl_cheb_eval_n_err(p, order, gsl_vector_get(v, i), &result, &err);
373
+ gsl_vector_set(vnew, i, result);
374
+ gsl_vector_set(verr, i, err);
375
+ }
376
+ return rb_ary_new3(2,
377
+ Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
378
+ Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
379
+ } else if (MATRIX_P(xx)) {
380
+ Data_Get_Struct(xx, gsl_matrix, m);
381
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
382
+ merr = gsl_matrix_alloc(m->size1, m->size2);
383
+ for (i = 0; i < m->size1; i++) {
384
+ for (j = 0; j < m->size2; j++) {
385
+ gsl_cheb_eval_n_err(p, order, gsl_matrix_get(m, i, j), &result, &err);
386
+ gsl_matrix_set(mnew, i, j, result);
387
+ gsl_matrix_set(merr, i, j, err);
388
+ }
389
+ }
390
+ return rb_ary_new3(2,
391
+ Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
392
+ Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
393
+ } else {
394
+ rb_raise(rb_eTypeError, "wrong argument type");
395
+ }
396
+ break;
397
+ }
398
+ return Qnil; /* never reach here */
399
+ }
400
+
401
+ static VALUE rb_gsl_cheb_calc_deriv(int argc, VALUE *argv, VALUE obj)
402
+ {
403
+ gsl_cheb_series *deriv = NULL, *cs = NULL;
404
+ VALUE retval;
405
+ switch (TYPE(obj)) {
406
+ case T_MODULE:
407
+ case T_CLASS:
408
+ case T_OBJECT:
409
+ switch (argc) {
410
+ case 1:
411
+ if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
412
+ rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
413
+ rb_class2name(CLASS_OF(argv[0])));
414
+ Data_Get_Struct(argv[0], gsl_cheb_series, cs);
415
+ deriv = gsl_cheb_alloc(cs->order);
416
+ retval = Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_cheb_free, deriv);
417
+ break;
418
+ case 2:
419
+ if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
420
+ rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
421
+ rb_class2name(CLASS_OF(argv[0])));
422
+ if (!rb_obj_is_kind_of(argv[1], cgsl_cheb))
423
+ rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
424
+ rb_class2name(CLASS_OF(argv[1])));
425
+ Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
426
+ Data_Get_Struct(argv[1], gsl_cheb_series, cs);
427
+ retval = argv[0];
428
+ break;
429
+ default:
430
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
431
+ break;
432
+ }
433
+ break;
434
+ default:
435
+ Data_Get_Struct(obj, gsl_cheb_series, cs);
436
+ switch (argc) {
437
+ case 0:
438
+ deriv = gsl_cheb_alloc(cs->order);
439
+ retval = Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_cheb_free, deriv);
440
+ break;
441
+ case 1:
442
+ if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
443
+ rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
444
+ rb_class2name(CLASS_OF(argv[0])));
445
+ Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
446
+ retval = argv[0];
447
+ break;
448
+ default:
449
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
450
+ break;
451
+ }
452
+ break;
453
+ }
454
+ gsl_cheb_calc_deriv(deriv, cs);
455
+ return retval;
456
+ }
457
+
458
+ static VALUE rb_gsl_cheb_calc_integ(int argc, VALUE *argv, VALUE obj)
459
+ {
460
+ gsl_cheb_series *deriv = NULL, *cs = NULL;
461
+ VALUE retval;
462
+ switch (TYPE(obj)) {
463
+ case T_MODULE:
464
+ case T_CLASS:
465
+ case T_OBJECT:
466
+ switch (argc) {
467
+ case 1:
468
+ if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
469
+ rb_raise(rb_eTypeError, "wrong argument type %s (Cheb expected)",
470
+ rb_class2name(CLASS_OF(argv[0])));
471
+ Data_Get_Struct(argv[0], gsl_cheb_series, cs);
472
+ deriv = gsl_cheb_alloc(cs->order);
473
+ retval = Data_Wrap_Struct(CLASS_OF(argv[0]), 0, gsl_cheb_free, deriv);
474
+ break;
475
+ case 2:
476
+ if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
477
+ rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
478
+ rb_class2name(CLASS_OF(argv[0])));
479
+ if (!rb_obj_is_kind_of(argv[1], cgsl_cheb))
480
+ rb_raise(rb_eTypeError, "argv[1] wrong argument type %s (Cheb expected)",
481
+ rb_class2name(CLASS_OF(argv[1])));
482
+ Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
483
+ Data_Get_Struct(argv[1], gsl_cheb_series, cs);
484
+ retval = argv[0];
485
+ break;
486
+ default:
487
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
488
+ break;
489
+ }
490
+ break;
491
+ default:
492
+ Data_Get_Struct(obj, gsl_cheb_series, cs);
493
+ switch (argc) {
494
+ case 0:
495
+ deriv = gsl_cheb_alloc(cs->order);
496
+ retval = Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_cheb_free, deriv);
497
+ break;
498
+ case 1:
499
+ if (!rb_obj_is_kind_of(argv[0], cgsl_cheb))
500
+ rb_raise(rb_eTypeError, "argv[0] wrong argument type %s (Cheb expected)",
501
+ rb_class2name(CLASS_OF(argv[0])));
502
+ Data_Get_Struct(argv[0], gsl_cheb_series, deriv);
503
+ retval = argv[0];
504
+ break;
505
+ default:
506
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
507
+ break;
508
+ }
509
+ break;
510
+ }
511
+ gsl_cheb_calc_integ(deriv, cs);
512
+ return retval;
513
+ }
514
+
515
+ void Init_gsl_cheb(VALUE module)
516
+ {
517
+ cgsl_cheb = rb_define_class_under(module, "Cheb", cGSL_Object);
518
+ rb_define_singleton_method(cgsl_cheb, "new", rb_gsl_cheb_new, 1);
519
+ rb_define_singleton_method(cgsl_cheb, "alloc", rb_gsl_cheb_new, 1);
520
+ rb_define_method(cgsl_cheb, "order", rb_gsl_cheb_order, 0);
521
+ rb_define_method(cgsl_cheb, "a", rb_gsl_cheb_a, 0);
522
+ rb_define_method(cgsl_cheb, "b", rb_gsl_cheb_b, 0);
523
+ rb_define_method(cgsl_cheb, "coef", rb_gsl_cheb_coef, 0);
524
+ rb_define_alias(cgsl_cheb, "c", "coef");
525
+ rb_define_method(cgsl_cheb, "f", rb_gsl_cheb_f, 0);
526
+ rb_define_method(cgsl_cheb, "init", rb_gsl_cheb_init, 3);
527
+ rb_define_method(cgsl_cheb, "eval", rb_gsl_cheb_eval, 1);
528
+ rb_define_method(cgsl_cheb, "eval_err", rb_gsl_cheb_eval_err, 1);
529
+ rb_define_method(cgsl_cheb, "eval_n", rb_gsl_cheb_eval_n, 2);
530
+ rb_define_method(cgsl_cheb, "eval_n_err", rb_gsl_cheb_eval_n_err, 2);
531
+ rb_define_method(cgsl_cheb, "calc_deriv", rb_gsl_cheb_calc_deriv, -1);
532
+ rb_define_alias(cgsl_cheb, "deriv", "calc_deriv");
533
+ rb_define_method(cgsl_cheb, "calc_integ", rb_gsl_cheb_calc_integ, -1);
534
+ rb_define_alias(cgsl_cheb, "integ", "calc_integ");
535
+
536
+ rb_define_singleton_method(cgsl_cheb, "calc_deriv", rb_gsl_cheb_calc_deriv, -1);
537
+ rb_define_singleton_method(cgsl_cheb, "calc_integ", rb_gsl_cheb_calc_integ, -1);
538
+ }