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,208 @@
1
+ /*
2
+ sort.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_config.h"
13
+ #include "rb_gsl_array.h"
14
+ #include <gsl/gsl_heapsort.h>
15
+ #include <gsl/gsl_sort.h>
16
+ EXTERN ID RBGSL_ID_call;
17
+ EXTERN VALUE cgsl_complex;
18
+
19
+ int rb_gsl_comparison_double(const void *aa, const void *bb);
20
+ int rb_gsl_comparison_complex(const void *aa, const void *bb);
21
+ int rb_gsl_comparison_double(const void *aa, const void *bb)
22
+ {
23
+ double *a = NULL, *b = NULL;
24
+ a = (double *) aa;
25
+ b = (double *) bb;
26
+ return FIX2INT(rb_funcall(RB_GSL_MAKE_PROC, RBGSL_ID_call, 2, rb_float_new(*a), rb_float_new(*b)));
27
+ }
28
+
29
+ int rb_gsl_comparison_complex(const void *aa, const void *bb)
30
+ {
31
+ gsl_complex *a = NULL, *b = NULL;
32
+ a = (gsl_complex *) aa;
33
+ b = (gsl_complex *) bb;
34
+ return FIX2INT(rb_funcall(RB_GSL_MAKE_PROC, RBGSL_ID_call, 2,
35
+ Data_Wrap_Struct(cgsl_complex, 0, NULL, a),
36
+ Data_Wrap_Struct(cgsl_complex, 0, NULL, b)));
37
+ }
38
+
39
+ static VALUE rb_gsl_heapsort_vector(VALUE obj)
40
+ {
41
+ gsl_vector *v = NULL;
42
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
43
+ Data_Get_Struct(obj, gsl_vector, v);
44
+ gsl_heapsort(v->data, v->size, sizeof(double), rb_gsl_comparison_double);
45
+ return obj;
46
+ }
47
+
48
+ static VALUE rb_gsl_heapsort_vector2(VALUE obj)
49
+ {
50
+ gsl_vector *v = NULL, *vnew = NULL;
51
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
52
+ Data_Get_Struct(obj, gsl_vector, v);
53
+ vnew = gsl_vector_alloc(v->size);
54
+ gsl_vector_memcpy(vnew, v);
55
+ gsl_heapsort(vnew->data, vnew->size, sizeof(double), rb_gsl_comparison_double);
56
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
57
+ }
58
+
59
+ static VALUE rb_gsl_heapsort_index_vector(VALUE obj)
60
+ {
61
+ gsl_vector *v = NULL;
62
+ gsl_permutation *p = NULL;
63
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
64
+ Data_Get_Struct(obj, gsl_vector, v);
65
+ p = gsl_permutation_alloc(v->size);
66
+ gsl_heapsort_index(p->data, v->data, v->size, sizeof(double), rb_gsl_comparison_double);
67
+ return Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
68
+ }
69
+
70
+ static VALUE rb_gsl_heapsort_vector_complex(VALUE obj)
71
+ {
72
+ gsl_vector_complex *v = NULL;
73
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
74
+ Data_Get_Struct(obj, gsl_vector_complex, v);
75
+ gsl_heapsort(v->data, v->size, sizeof(gsl_complex), rb_gsl_comparison_complex);
76
+ return obj;
77
+ }
78
+
79
+ static VALUE rb_gsl_heapsort_vector_complex2(VALUE obj)
80
+ {
81
+ gsl_vector_complex *v = NULL, *vnew = NULL;
82
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
83
+ Data_Get_Struct(obj, gsl_vector_complex, v);
84
+ vnew = gsl_vector_complex_alloc(v->size);
85
+ gsl_vector_complex_memcpy(vnew, v);
86
+ gsl_heapsort(vnew->data, vnew->size, sizeof(gsl_complex), rb_gsl_comparison_complex);
87
+ return Data_Wrap_Struct(cgsl_vector_complex, 0, gsl_vector_complex_free, vnew);
88
+ }
89
+
90
+ static VALUE rb_gsl_heapsort_index_vector_complex(VALUE obj)
91
+ {
92
+ gsl_vector_complex *v = NULL;
93
+ gsl_permutation *p = NULL;
94
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
95
+ Data_Get_Struct(obj, gsl_vector_complex, v);
96
+ p = gsl_permutation_alloc(v->size);
97
+ gsl_heapsort_index(p->data, v->data, v->size, sizeof(gsl_complex), rb_gsl_comparison_complex);
98
+ return Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
99
+ }
100
+
101
+ /* singleton */
102
+ static VALUE rb_gsl_heapsort(VALUE obj, VALUE vv)
103
+ {
104
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
105
+ if (rb_obj_is_kind_of(vv, cgsl_vector_complex)) {
106
+ return rb_gsl_heapsort_vector_complex(vv);
107
+ } else if (rb_obj_is_kind_of(vv, cgsl_vector)) {
108
+ return rb_gsl_heapsort_vector(vv);
109
+ } else {
110
+ rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Vector::Complex expected)", rb_class2name(CLASS_OF(vv)));
111
+ }
112
+ return vv;
113
+ }
114
+
115
+ static VALUE rb_gsl_heapsort2(VALUE obj, VALUE vv)
116
+ {
117
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
118
+ if (rb_obj_is_kind_of(vv, cgsl_vector_complex)) {
119
+ return rb_gsl_heapsort_vector_complex2(vv);
120
+ } else if (rb_obj_is_kind_of(vv, cgsl_vector)) {
121
+ return rb_gsl_heapsort_vector2(vv);
122
+ } else {
123
+ rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Vector::Complex expected)", rb_class2name(CLASS_OF(vv)));
124
+ }
125
+ return vv;
126
+ }
127
+
128
+ static VALUE rb_gsl_heapsort_index(VALUE obj, VALUE vv)
129
+ {
130
+ if (!rb_block_given_p()) rb_raise(rb_eRuntimeError, "Proc is not given");
131
+ if (rb_obj_is_kind_of(vv, cgsl_vector_complex)) {
132
+ return rb_gsl_heapsort_index_vector_complex(vv);
133
+ } else if (rb_obj_is_kind_of(vv, cgsl_vector)) {
134
+ return rb_gsl_heapsort_index_vector(vv);
135
+ } else {
136
+ rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Vector::Complex expected)", rb_class2name(CLASS_OF(vv)));
137
+ }
138
+ return vv;
139
+ }
140
+
141
+ /*****/
142
+
143
+ #ifdef HAVE_NARRAY_H
144
+ #include "narray.h"
145
+ static VALUE rb_gsl_sort_narray(VALUE obj)
146
+ {
147
+ struct NARRAY *na;
148
+ size_t size, stride;
149
+ double *ptr1, *ptr2;
150
+ VALUE ary;
151
+ GetNArray(obj, na);
152
+ ptr1 = (double*) na->ptr;
153
+ size = na->total;
154
+ stride = 1;
155
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(obj));
156
+ ptr2 = NA_PTR_TYPE(ary, double*);
157
+ memcpy(ptr2, ptr1, sizeof(double)*size);
158
+ gsl_sort(ptr2, stride, size);
159
+ return ary;
160
+ }
161
+ static VALUE rb_gsl_sort_narray_bang(VALUE obj)
162
+ {
163
+ struct NARRAY *na;
164
+ size_t size, stride;
165
+ double *ptr1;
166
+ GetNArray(obj, na);
167
+ ptr1 = (double*) na->ptr;
168
+ size = na->total;
169
+ stride = 1;
170
+ gsl_sort(ptr1, stride, size);
171
+ return obj;
172
+ }
173
+ static VALUE rb_gsl_sort_index_narray(VALUE obj)
174
+ {
175
+ struct NARRAY *na;
176
+ size_t size, stride;
177
+ double *ptr1;
178
+ gsl_permutation *p;
179
+ GetNArray(obj, na);
180
+ ptr1 = (double*) na->ptr;
181
+ size = na->total;
182
+ stride = 1;
183
+ p = gsl_permutation_alloc(size);
184
+ gsl_sort_index(p->data, ptr1, stride, size);
185
+ return Data_Wrap_Struct(cgsl_permutation, 0, gsl_permutation_free, p);
186
+ }
187
+ #endif
188
+
189
+ void Init_gsl_sort(VALUE module)
190
+ {
191
+ rb_define_singleton_method(module, "heapsort!", rb_gsl_heapsort, 1);
192
+ rb_define_singleton_method(module, "heapsort", rb_gsl_heapsort2, 1);
193
+ rb_define_singleton_method(module, "heapsort_index", rb_gsl_heapsort_index, 1);
194
+
195
+ rb_define_method(cgsl_vector, "heapsort!", rb_gsl_heapsort_vector, 0);
196
+ rb_define_method(cgsl_vector, "heapsort", rb_gsl_heapsort_vector2, 0);
197
+ rb_define_method(cgsl_vector, "heapsort_index", rb_gsl_heapsort_index_vector, 0);
198
+
199
+ rb_define_method(cgsl_vector_complex, "heapsort!", rb_gsl_heapsort_vector_complex, 0);
200
+ rb_define_method(cgsl_vector_complex, "heapsort", rb_gsl_heapsort_vector_complex2, 0);
201
+ rb_define_method(cgsl_vector_complex, "heapsort_index", rb_gsl_heapsort_index_vector_complex, 0);
202
+
203
+ #ifdef HAVE_NARRAY_H
204
+ rb_define_method(cNArray, "gsl_sort", rb_gsl_sort_narray, 0);
205
+ rb_define_method(cNArray, "gsl_sort!", rb_gsl_sort_narray_bang, 0);
206
+ rb_define_method(cNArray, "gsl_sort_index", rb_gsl_sort_index_narray, 0);
207
+ #endif
208
+ }
@@ -0,0 +1,395 @@
1
+ /*
2
+ spline.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_config.h"
13
+ #include "rb_gsl_interp.h"
14
+ EXTERN VALUE cgsl_interp_accel; /* defined in interp.c */
15
+
16
+ static void rb_gsl_spline_free(rb_gsl_spline *sp);
17
+
18
+ static VALUE rb_gsl_spline_new(int argc, VALUE *argv, VALUE klass)
19
+ {
20
+ rb_gsl_spline *sp = NULL;
21
+ const gsl_interp_type *T = NULL;
22
+ double *ptrx = NULL, *ptry = NULL;
23
+ size_t sizex = 0, sizey = 0, size = 0, stride = 1;
24
+ int i;
25
+ for (i = 0; i < argc; i++) {
26
+ switch (TYPE(argv[i])) {
27
+ case T_STRING:
28
+ T = get_interp_type(argv[i]);
29
+ break;
30
+ case T_FIXNUM:
31
+ if (T) size = FIX2INT(argv[i]);
32
+ else T = get_interp_type(argv[i]);
33
+ break;
34
+ default:
35
+ if (ptrx == NULL) {
36
+ ptrx = get_vector_ptr(argv[i], &stride, &sizex);
37
+ } else {
38
+ ptry = get_vector_ptr(argv[i], &stride, &sizey);
39
+ size = GSL_MIN_INT(sizex, sizey);
40
+ }
41
+ break;
42
+ }
43
+ }
44
+ if (size == 0) rb_raise(rb_eRuntimeError, "spline size is not given.");
45
+ sp = ALLOC(rb_gsl_spline);
46
+ if (T == NULL) T = gsl_interp_cspline;
47
+ sp->s = gsl_spline_alloc(T, size);
48
+ sp->a = gsl_interp_accel_alloc();
49
+ if (ptrx && ptry) gsl_spline_init(sp->s, ptrx, ptry, size);
50
+ return Data_Wrap_Struct(klass, 0, rb_gsl_spline_free, sp);
51
+ }
52
+
53
+ static void rb_gsl_spline_free(rb_gsl_spline *sp)
54
+ {
55
+ gsl_spline_free(sp->s);
56
+ gsl_interp_accel_free(sp->a);
57
+ free((rb_gsl_spline *) sp);
58
+ }
59
+
60
+ static VALUE rb_gsl_spline_init(VALUE obj, VALUE xxa, VALUE yya)
61
+ {
62
+ rb_gsl_spline *sp = NULL;
63
+ gsl_spline *p = NULL;
64
+ gsl_vector *xa = NULL, *ya = NULL;
65
+ size_t i, size;
66
+ int flagx = 0, flagy = 0;
67
+ double *ptr1 = NULL, *ptr2 = NULL;
68
+ #ifdef HAVE_NARRAY_H
69
+ struct NARRAY *nax = NULL, *nay = NULL;
70
+ #endif
71
+ Data_Get_Struct(obj, rb_gsl_spline, sp);
72
+ p = sp->s;
73
+ if (TYPE(xxa) == T_ARRAY) {
74
+ // size = RARRAY(xxa)->len;
75
+ size = RARRAY_LEN(xxa);
76
+ xa = gsl_vector_alloc(size);
77
+ for (i = 0; i < size; i++) gsl_vector_set(xa, i, NUM2DBL(rb_ary_entry(xxa, i)));
78
+ ptr1 = xa->data;
79
+ flagx = 1;
80
+ } else if (VECTOR_P(xxa)) {
81
+ Data_Get_Struct(xxa, gsl_vector, xa);
82
+ size = xa->size;
83
+ ptr1 = xa->data;
84
+ #ifdef HAVE_NARRAY_H
85
+ } else if (NA_IsNArray(xxa)) {
86
+ GetNArray(xxa, nax);
87
+ size = nax->total;
88
+ ptr1 = (double *) nax->ptr;
89
+ #endif
90
+ } else {
91
+ rb_raise(rb_eTypeError, "not a vector");
92
+ }
93
+ if (TYPE(yya) == T_ARRAY) {
94
+ ya = gsl_vector_alloc(size);
95
+ for (i = 0; i < size; i++) gsl_vector_set(ya, i, NUM2DBL(rb_ary_entry(yya, i)));
96
+ ptr2 = ya->data;
97
+ flagy = 1;
98
+ #ifdef HAVE_NARRAY_H
99
+ } else if (NA_IsNArray(yya)) {
100
+ GetNArray(yya, nay);
101
+ ptr2 = (double *) nay->ptr;
102
+ #endif
103
+ } else if (VECTOR_P(yya)) {
104
+ Data_Get_Struct(yya, gsl_vector, ya);
105
+ ptr2 = ya->data;
106
+ } else {
107
+ rb_raise(rb_eTypeError, "not a vector");
108
+ }
109
+ gsl_spline_init(p, ptr1, ptr2, size);
110
+ if (flagx == 1) gsl_vector_free(xa);
111
+ if (flagy == 1) gsl_vector_free(ya);
112
+ return obj;
113
+ }
114
+
115
+ static VALUE rb_gsl_spline_accel(VALUE obj)
116
+ {
117
+ rb_gsl_spline *rgi = NULL;
118
+ Data_Get_Struct(obj, rb_gsl_spline, rgi);
119
+ return Data_Wrap_Struct(cgsl_interp_accel, 0, NULL, rgi->a);
120
+ }
121
+
122
+ static VALUE rb_gsl_spline_evaluate(VALUE obj, VALUE xx,
123
+ double (*eval)(const gsl_spline *, double,
124
+ gsl_interp_accel *))
125
+ {
126
+ rb_gsl_spline *rgs = NULL;
127
+ gsl_vector *v = NULL, *vnew = NULL;
128
+ gsl_matrix *m = NULL, *mnew = NULL;
129
+ VALUE ary, x;
130
+ double val;
131
+ size_t n, i, j;
132
+ #ifdef HAVE_NARRAY_H
133
+ double *ptr1 = NULL, *ptr2 = NULL;
134
+ struct NARRAY *na = NULL;
135
+ #endif
136
+ Data_Get_Struct(obj, rb_gsl_spline, rgs);
137
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
138
+ switch (TYPE(xx)) {
139
+ case T_FIXNUM: case T_BIGNUM: case T_FLOAT:
140
+ Need_Float(xx);
141
+ return rb_float_new((*eval)(rgs->s, NUM2DBL(xx), rgs->a));
142
+ break;
143
+ case T_ARRAY:
144
+ // n = RARRAY(xx)->len;
145
+ n = RARRAY_LEN(xx);
146
+ ary = rb_ary_new2(n);
147
+ for (i = 0; i < n; i++) {
148
+ x = rb_ary_entry(xx, i);
149
+ Need_Float(x);
150
+ val = (*eval)(rgs->s, NUM2DBL(x), rgs->a);
151
+ rb_ary_store(ary, i, rb_float_new(val));
152
+ }
153
+ return ary;
154
+ break;
155
+ default:
156
+ #ifdef HAVE_NARRAY_H
157
+ if (NA_IsNArray(xx)) {
158
+ GetNArray(xx, na);
159
+ ptr1 = (double *) na->ptr;
160
+ n = na->total;
161
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
162
+ ptr2 = NA_PTR_TYPE(ary, double*);
163
+ for (i = 0; i < n; i++)
164
+ ptr2[i] = (*eval)(rgs->s, ptr1[i], rgs->a);
165
+ return ary;
166
+ }
167
+ #endif
168
+ if (VECTOR_P(xx)) {
169
+ Data_Get_Struct(xx, gsl_vector, v);
170
+ vnew = gsl_vector_alloc(v->size);
171
+ for (i = 0; i < v->size; i++) {
172
+ val = (*eval)(rgs->s, gsl_vector_get(v, i), rgs->a);
173
+ gsl_vector_set(vnew, i, val);
174
+ }
175
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
176
+ } else if (MATRIX_P(xx)) {
177
+ Data_Get_Struct(xx, gsl_matrix, m);
178
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
179
+ for (i = 0; i < m->size1; i++) {
180
+ for (j = 0; j < m->size2; j++) {
181
+ val = (*eval)(rgs->s, gsl_matrix_get(m, i, j), rgs->a);
182
+ gsl_matrix_set(mnew, i, j, val);
183
+ }
184
+ }
185
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
186
+ } else {
187
+ rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(xx)));
188
+ }
189
+ break;
190
+ }
191
+
192
+ /* never reach here */
193
+ return Qnil;
194
+ }
195
+
196
+ static VALUE rb_gsl_spline_eval(VALUE obj, VALUE xx)
197
+ {
198
+ return rb_gsl_spline_evaluate(obj, xx, gsl_spline_eval);
199
+ }
200
+
201
+ static VALUE rb_gsl_spline_eval_deriv(VALUE obj, VALUE xx)
202
+ {
203
+ return rb_gsl_spline_evaluate(obj, xx, gsl_spline_eval_deriv);
204
+ }
205
+
206
+ static VALUE rb_gsl_spline_eval_deriv2(VALUE obj, VALUE xx)
207
+ {
208
+ return rb_gsl_spline_evaluate(obj, xx, gsl_spline_eval_deriv2);
209
+ }
210
+
211
+ static VALUE rb_gsl_spline_eval_integ(VALUE obj, VALUE aa, VALUE bb)
212
+ {
213
+ rb_gsl_spline *sp = NULL;
214
+ gsl_spline *s = NULL;
215
+ gsl_interp_accel *acc = NULL;
216
+ double a, b;
217
+ Need_Float(aa);
218
+ Need_Float(bb);
219
+ Data_Get_Struct(obj, rb_gsl_spline, sp);
220
+ s = sp->s;
221
+ acc = sp->a;
222
+ a = NUM2DBL(aa);
223
+ b = NUM2DBL(bb);
224
+ return rb_float_new(gsl_spline_eval_integ(s, a, b, acc));
225
+ }
226
+
227
+ static VALUE rb_gsl_spline_find(VALUE obj, VALUE vv, VALUE xx)
228
+ {
229
+ rb_gsl_spline *sp = NULL;
230
+ double *ptr = NULL, x;
231
+ size_t size, stride;
232
+ Data_Get_Struct(obj, rb_gsl_spline, sp);
233
+ ptr = get_vector_ptr(vv, &stride, &size);
234
+ // x = RFLOAT(xx)->value;
235
+ x = NUM2DBL(xx);
236
+ return INT2FIX(gsl_interp_accel_find(sp->a, ptr, size, x));
237
+ }
238
+
239
+ static VALUE rb_gsl_spline_eval_e(VALUE obj, VALUE xx)
240
+ {
241
+ rb_gsl_spline *rgs = NULL;
242
+ double val;
243
+ int status;
244
+ Data_Get_Struct(obj, rb_gsl_spline, rgs);
245
+ Need_Float(xx);
246
+ status = gsl_spline_eval_e(rgs->s, NUM2DBL(xx), rgs->a, &val);
247
+ switch (status) {
248
+ case GSL_EDOM:
249
+ rb_gsl_error_handler("gsl_spline_eval_e error", __FILE__, __LINE__, status);
250
+ break;
251
+ default:
252
+ return rb_float_new(val);
253
+ break;
254
+ }
255
+ return Qnil;
256
+ }
257
+
258
+ static VALUE rb_gsl_spline_eval_deriv_e(VALUE obj, VALUE xx)
259
+ {
260
+ rb_gsl_spline *rgs = NULL;
261
+ double val;
262
+ int status;
263
+ Data_Get_Struct(obj, rb_gsl_spline, rgs);
264
+ Need_Float(xx);
265
+ status = gsl_spline_eval_deriv_e(rgs->s, NUM2DBL(xx), rgs->a, &val);
266
+ switch (status) {
267
+ case GSL_EDOM:
268
+ rb_gsl_error_handler("gsl_spline_eval_deriv_e error", __FILE__, __LINE__, status);
269
+ break;
270
+ default:
271
+ return rb_float_new(val);
272
+ break;
273
+ }
274
+ return Qnil;
275
+ }
276
+
277
+ static VALUE rb_gsl_spline_eval_deriv2_e(VALUE obj, VALUE xx)
278
+ {
279
+ rb_gsl_spline *rgs = NULL;
280
+ double val;
281
+ int status;
282
+ Data_Get_Struct(obj, rb_gsl_spline, rgs);
283
+ Need_Float(xx);
284
+ status = gsl_spline_eval_deriv2_e(rgs->s, NUM2DBL(xx), rgs->a, &val);
285
+ switch (status) {
286
+ case GSL_EDOM:
287
+ rb_gsl_error_handler("gsl_spline_eval_deriv2_e error", __FILE__, __LINE__, status);
288
+ break;
289
+ default:
290
+ return rb_float_new(val);
291
+ break;
292
+ }
293
+ return Qnil;
294
+ }
295
+
296
+ static VALUE rb_gsl_spline_eval_integ_e(VALUE obj, VALUE a, VALUE b)
297
+ {
298
+ rb_gsl_spline *rgs = NULL;
299
+ double val;
300
+ int status;
301
+ Data_Get_Struct(obj, rb_gsl_spline, rgs);
302
+ Need_Float(a); Need_Float(b);
303
+ status = gsl_spline_eval_integ_e(rgs->s, NUM2DBL(a), NUM2DBL(b), rgs->a, &val);
304
+ switch (status) {
305
+ case GSL_EDOM:
306
+ rb_gsl_error_handler("gsl_spline_eval_integ_e error", __FILE__, __LINE__, status);
307
+ break;
308
+ default:
309
+ return rb_float_new(val);
310
+ break;
311
+ }
312
+ return Qnil;
313
+ }
314
+
315
+ static VALUE rb_gsl_spline_info(VALUE obj)
316
+ {
317
+ rb_gsl_spline *p = NULL;
318
+ char buf[256];
319
+ Data_Get_Struct(obj, rb_gsl_spline, p);
320
+ sprintf(buf, "Class: %s\n", rb_class2name(CLASS_OF(obj)));
321
+ // sprintf(buf, "%sSuperClass: %s\n", buf, rb_class2name(RCLASS(CLASS_OF(obj))->super));
322
+ sprintf(buf, "%sType: %s\n", buf, gsl_interp_name(p->s->interp));
323
+ sprintf(buf, "%sxmin: %f\n", buf, p->s->interp->xmin);
324
+ sprintf(buf, "%sxmax: %f\n", buf, p->s->interp->xmax);
325
+ sprintf(buf, "%sSize: %d\n", buf, (int) p->s->size);
326
+ return rb_str_new2(buf);
327
+ }
328
+
329
+ #ifdef GSL_1_8_LATER
330
+ static VALUE rb_gsl_spline_name(VALUE obj)
331
+ {
332
+ rb_gsl_spline *p = NULL;
333
+ Data_Get_Struct(obj, rb_gsl_spline, p);
334
+ return rb_str_new2(gsl_spline_name(p->s));
335
+ }
336
+ static VALUE rb_gsl_spline_min_size(VALUE obj)
337
+ {
338
+ rb_gsl_spline *sp = NULL;
339
+ Data_Get_Struct(obj, rb_gsl_spline, sp);
340
+ return UINT2NUM(gsl_spline_min_size(sp->s));
341
+ }
342
+
343
+ #else
344
+
345
+ static VALUE rb_gsl_spline_name(VALUE obj)
346
+ {
347
+ rb_gsl_spline *sp = NULL;
348
+ Data_Get_Struct(obj, rb_gsl_spline, sp);
349
+ return rb_str_new2(gsl_interp_name(sp->s->interp));
350
+ }
351
+
352
+ #endif
353
+
354
+ void Init_gsl_spline(VALUE module)
355
+ {
356
+ VALUE cgsl_spline;
357
+
358
+ cgsl_spline = rb_define_class_under(module, "Spline", cGSL_Object);
359
+
360
+ rb_define_singleton_method(cgsl_spline, "alloc", rb_gsl_spline_new, -1);
361
+
362
+ /*****/
363
+
364
+ rb_define_method(cgsl_spline, "init", rb_gsl_spline_init, 2);
365
+ rb_define_method(cgsl_spline, "accel", rb_gsl_spline_accel, 0);
366
+ rb_define_method(cgsl_spline, "eval", rb_gsl_spline_eval, 1);
367
+ rb_define_alias(cgsl_spline, "[]", "eval");
368
+ rb_define_method(cgsl_spline, "eval_deriv", rb_gsl_spline_eval_deriv, 1);
369
+ rb_define_alias(cgsl_spline, "deriv", "eval_deriv");
370
+ rb_define_method(cgsl_spline, "eval_deriv2", rb_gsl_spline_eval_deriv2, 1);
371
+ rb_define_alias(cgsl_spline, "deriv2", "eval_deriv2");
372
+ rb_define_method(cgsl_spline, "eval_integ", rb_gsl_spline_eval_integ, 2);
373
+ rb_define_alias(cgsl_spline, "integ", "eval_integ");
374
+
375
+ rb_define_method(cgsl_spline, "name", rb_gsl_spline_name, 0);
376
+ rb_define_alias(cgsl_spline, "type", "name");
377
+
378
+ rb_define_method(cgsl_spline, "find", rb_gsl_spline_find, 2);
379
+ rb_define_alias(cgsl_spline, "accel_find", "find");
380
+
381
+ rb_define_method(cgsl_spline, "eval_e", rb_gsl_spline_eval_e, 1);
382
+ rb_define_method(cgsl_spline, "eval_deriv_e", rb_gsl_spline_eval_deriv_e, 1);
383
+ rb_define_alias(cgsl_spline, "deriv_e", "eval_deriv_e");
384
+ rb_define_method(cgsl_spline, "eval_deriv2_e", rb_gsl_spline_eval_deriv2_e, 1);
385
+ rb_define_alias(cgsl_spline, "deri2v_e", "eval_deriv2_e");
386
+ rb_define_method(cgsl_spline, "eval_integ_e", rb_gsl_spline_eval_integ_e, 1);
387
+ rb_define_alias(cgsl_spline, "integ_e", "eval_integ_e");
388
+
389
+ rb_define_method(cgsl_spline, "info", rb_gsl_spline_info, 0);
390
+
391
+ #ifdef GSL_1_8_LATER
392
+ rb_define_method(cgsl_spline, "min_size", rb_gsl_spline_min_size, 0);
393
+ #endif
394
+
395
+ }