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,937 @@
1
+ /*
2
+ wavelet.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2004 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 "rb_gsl_common.h"
15
+
16
+ #ifdef GSL_1_6_LATER
17
+ #include <gsl/gsl_wavelet.h>
18
+ #include <gsl/gsl_wavelet2d.h>
19
+ #endif
20
+
21
+ #ifdef HAVE_NARRAY_H
22
+ #include "narray.h"
23
+ #endif
24
+
25
+ #ifndef CHECK_WAVELET
26
+ #define CHECK_WAVELET(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet))\
27
+ rb_raise(rb_eTypeError, "wrong argument type (Wavelet expected)");
28
+ #endif
29
+
30
+ #ifndef CHECK_WORKSPACE
31
+ #define CHECK_WORKSPACE(x) if(!rb_obj_is_kind_of(x,cgsl_wavelet_workspace))\
32
+ rb_raise(rb_eTypeError, "wrong argument type (Wavelet::Workspace expected)");
33
+ #endif
34
+
35
+ enum RB_GSL_DWT {
36
+ RB_GSL_DWT_COPY,
37
+ RB_GSL_DWT_INPLACE,
38
+ };
39
+
40
+ static VALUE cgsl_wavelet;
41
+
42
+ enum {
43
+ GSL_WAVELET_DAUBECHIES,
44
+ GSL_WAVELET_DAUBECHIES_CENTERED,
45
+ GSL_WAVELET_HAAR,
46
+ GSL_WAVELET_HAAR_CENTERED,
47
+ GSL_WAVELET_BSPLINE,
48
+ GSL_WAVELET_BSPLINE_CENTERED,
49
+ };
50
+
51
+ #ifdef GSL_1_6_LATER
52
+ static const gsl_wavelet_type* rb_gsl_wavelet_get_type(VALUE t);
53
+ static VALUE cgsl_wavelet_workspace;
54
+ #endif
55
+
56
+ static VALUE rb_gsl_wavelet_new(VALUE klass, VALUE t, VALUE m)
57
+ {
58
+ #ifdef GSL_1_6_LATER
59
+ const gsl_wavelet_type *T;
60
+ size_t member;
61
+ gsl_wavelet *w = NULL;
62
+ CHECK_FIXNUM(m);
63
+ T = rb_gsl_wavelet_get_type(t);
64
+ member = FIX2INT(m);
65
+ w = gsl_wavelet_alloc(T, member);
66
+ if (w == NULL) rb_raise(rb_eNoMemError, "gsl_wavelet_alloc failed");
67
+ return Data_Wrap_Struct(klass, 0, gsl_wavelet_free, w);
68
+ #else
69
+ rb_raise(rb_eNotImpError, "Wavelet transforms not supported in GSL-%s, use GSL-1.6 or later", GSL_VERSION);
70
+ return Qnil;
71
+ #endif
72
+ }
73
+
74
+ #ifdef GSL_1_6_LATER
75
+ static const gsl_wavelet_type* rb_gsl_wavelet_get_type_str(char *name);
76
+ static const gsl_wavelet_type* rb_gsl_wavelet_get_type_int(int t);
77
+ static const gsl_wavelet_type* rb_gsl_wavelet_get_type(VALUE t)
78
+ {
79
+ const gsl_wavelet_type *T;
80
+ switch (TYPE(t)) {
81
+ case T_STRING:
82
+ T = rb_gsl_wavelet_get_type_str(STR2CSTR(t));
83
+ break;
84
+ case T_FIXNUM:
85
+ T = rb_gsl_wavelet_get_type_int(FIX2INT(t));
86
+ break;
87
+ default:
88
+ rb_raise(rb_eTypeError,
89
+ "wrong type of argument %s (String or Fixnum expected)",
90
+ rb_class2name(CLASS_OF(t)));
91
+ break;
92
+ }
93
+ return T;
94
+ }
95
+
96
+ static const gsl_wavelet_type* rb_gsl_wavelet_get_type_str(char *name)
97
+ {
98
+ const gsl_wavelet_type *T;
99
+ if (str_tail_grep(name, "daubechies") == 0)
100
+ T = gsl_wavelet_daubechies;
101
+ else if (str_tail_grep(name, "daubechies_centered") == 0)
102
+ T = gsl_wavelet_daubechies_centered;
103
+ else if (str_tail_grep(name, "haar") == 0)
104
+ T = gsl_wavelet_haar;
105
+ else if (str_tail_grep(name, "haar_centered") == 0)
106
+ T = gsl_wavelet_haar_centered;
107
+ else if (str_tail_grep(name, "bspline") == 0)
108
+ T = gsl_wavelet_bspline;
109
+ else if (str_tail_grep(name, "bspline_centered") == 0)
110
+ T = gsl_wavelet_bspline_centered;
111
+ else
112
+ rb_raise(rb_eArgError, "unknown type %s", name);
113
+ return T;
114
+ }
115
+
116
+ static const gsl_wavelet_type* rb_gsl_wavelet_get_type_int(int t)
117
+ {
118
+ const gsl_wavelet_type *T;
119
+ switch (t) {
120
+ case GSL_WAVELET_DAUBECHIES:
121
+ T = gsl_wavelet_daubechies;
122
+ break;
123
+ case GSL_WAVELET_DAUBECHIES_CENTERED:
124
+ T = gsl_wavelet_daubechies_centered;
125
+ break;
126
+ case GSL_WAVELET_HAAR:
127
+ T = gsl_wavelet_haar;
128
+ break;
129
+ case GSL_WAVELET_HAAR_CENTERED:
130
+ T = gsl_wavelet_haar_centered;
131
+ break;
132
+ case GSL_WAVELET_BSPLINE:
133
+ T = gsl_wavelet_bspline;
134
+ break;
135
+ case GSL_WAVELET_BSPLINE_CENTERED:
136
+ T = gsl_wavelet_bspline_centered;
137
+ break;
138
+ default:
139
+ rb_raise(rb_eArgError, "unknown type %d", t);
140
+ break;
141
+ }
142
+ return T;
143
+ }
144
+
145
+ static void rb_gsl_wavelet_define_const(VALUE klass);
146
+ static void rb_gsl_wavelet_define_const(VALUE klass)
147
+ {
148
+ rb_define_const(klass, "DAUBECHIES", INT2FIX(GSL_WAVELET_DAUBECHIES));
149
+ rb_define_const(klass, "DAUBECHIES_CENTERED", INT2FIX(GSL_WAVELET_DAUBECHIES_CENTERED));
150
+ rb_define_const(klass, "HAAR", INT2FIX(GSL_WAVELET_HAAR));
151
+ rb_define_const(klass, "HAAR_CENTERED", INT2FIX(GSL_WAVELET_HAAR_CENTERED));
152
+ rb_define_const(klass, "BSPLINE", INT2FIX(GSL_WAVELET_BSPLINE));
153
+ rb_define_const(klass, "BSPLINE_CENTERED", INT2FIX(GSL_WAVELET_BSPLINE_CENTERED));
154
+ /*****/
155
+ rb_define_const(klass, "FORWARD", INT2FIX(forward));
156
+ rb_define_const(klass, "Forward", INT2FIX(forward));
157
+ rb_define_const(klass, "BACKWARD", INT2FIX(backward));
158
+ rb_define_const(klass, "Backward", INT2FIX(backward));
159
+ }
160
+
161
+ static VALUE rb_gsl_wavelet_name(VALUE ww)
162
+ {
163
+ gsl_wavelet *w = NULL;
164
+ Data_Get_Struct(ww, gsl_wavelet, w);
165
+ return rb_str_new2(gsl_wavelet_name(w));
166
+ }
167
+
168
+ static VALUE rb_gsl_wavelet_workspace_new(VALUE klass, VALUE nn)
169
+ {
170
+ gsl_wavelet_workspace *wspace = NULL;
171
+ CHECK_FIXNUM(nn);
172
+ wspace = gsl_wavelet_workspace_alloc(FIX2INT(nn));
173
+ if (wspace == NULL) rb_raise(rb_eNoMemError, "gsl_wavelet_workspace_alloc failed");
174
+ return Data_Wrap_Struct(klass, 0, gsl_wavelet_workspace_free, wspace);
175
+ }
176
+
177
+ static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
178
+ int (*trans)(const gsl_wavelet *,
179
+ gsl_matrix *,
180
+ gsl_wavelet_workspace *),
181
+ int sss);
182
+ static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
183
+ int (*trans)(const gsl_wavelet *,
184
+ gsl_matrix *,
185
+ gsl_wavelet_direction,
186
+ gsl_wavelet_workspace *),
187
+ int sss);
188
+
189
+ static VALUE rb_gsl_wavelet_transform0(int argc, VALUE *argv, VALUE obj,
190
+ int sss)
191
+ {
192
+ gsl_wavelet *w = NULL;
193
+ gsl_vector *v = NULL, *vnew;
194
+ gsl_wavelet_direction dir = forward;
195
+ gsl_wavelet_workspace *work = NULL;
196
+ int itmp, flag = 0, status;
197
+ double *ptr1, *ptr2;
198
+ size_t n, stride;
199
+ int naflag = 0;
200
+ VALUE ary, ret;
201
+ #ifdef HAVE_NARRAY_H
202
+ struct NARRAY *na1 = NULL;
203
+ #endif
204
+
205
+ switch (TYPE(obj)) {
206
+ case T_MODULE:
207
+ case T_CLASS:
208
+ case T_OBJECT:
209
+ if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
210
+ CHECK_WAVELET(argv[0]);
211
+
212
+ if (MATRIX_P(argv[1])) {
213
+ return rb_gsl_wavelet2d(argc, argv, obj,
214
+ gsl_wavelet2d_transform_matrix, sss);
215
+ }
216
+ if (VECTOR_P(argv[1])) {
217
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
218
+ Data_Get_Struct(argv[1], gsl_vector, v);
219
+ ret = argv[1];
220
+ ptr1 = v->data;
221
+ n = v->size;
222
+ stride = v->stride;
223
+ #ifdef HAVE_NARRAY_H
224
+ } else if (NA_IsNArray(argv[1])) {
225
+ GetNArray(argv[1], na1);
226
+ ret = argv[1];
227
+ ptr1 = (double*) na1->ptr;
228
+ n = na1->total;
229
+ naflag = 1;
230
+ stride = 1;
231
+ #endif
232
+ } else {
233
+ rb_raise(rb_eTypeError, "wrong argument type (Vector expected)");
234
+ }
235
+ itmp = 2;
236
+ break;
237
+ default:
238
+ if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
239
+
240
+ if (MATRIX_P(argv[0])) {
241
+ return rb_gsl_wavelet2d(argc, argv, obj,
242
+ gsl_wavelet2d_transform_matrix, sss);
243
+ }
244
+ if (VECTOR_P(obj)) {
245
+ CHECK_WAVELET(argv[0]);
246
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
247
+ Data_Get_Struct(obj, gsl_vector, v);
248
+ ret = obj;
249
+ ptr1 = v->data;
250
+ n = v->size;
251
+ stride = v->stride;
252
+ } else if (VECTOR_P(argv[0])) {
253
+
254
+ CHECK_WAVELET(obj);
255
+ Data_Get_Struct(obj, gsl_wavelet, w);
256
+ Data_Get_Struct(argv[0], gsl_vector, v);
257
+ ret = argv[0];
258
+ ptr1 = v->data;
259
+ n = v->size;
260
+ stride = v->stride;
261
+ #ifdef HAVE_NARRAY_H
262
+ } else if (NA_IsNArray(obj)) {
263
+ CHECK_WAVELET(argv[0]);
264
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
265
+ GetNArray(obj, na1);
266
+ ret = obj;
267
+ ptr1 = (double*) na1->ptr;
268
+ n = na1->total;
269
+ naflag = 1;
270
+ stride = 1;
271
+ } else if (NA_IsNArray(argv[0])) {
272
+ CHECK_WAVELET(obj);
273
+ Data_Get_Struct(obj, gsl_wavelet, w);
274
+ GetNArray(argv[0], na1);
275
+ ret = argv[0];
276
+ ptr1 = (double*) na1->ptr;
277
+ n = na1->total;
278
+ naflag = 1;
279
+ stride = 1;
280
+ #endif
281
+ } else {
282
+ rb_raise(rb_eTypeError, "wrong argument type");
283
+ }
284
+ itmp = 1;
285
+ break;
286
+ }
287
+ switch (argc - itmp) {
288
+ case 2:
289
+ CHECK_FIXNUM(argv[itmp]);
290
+ CHECK_WORKSPACE(argv[itmp+1]);
291
+ dir = FIX2INT(argv[itmp]);
292
+ Data_Get_Struct(argv[itmp+1], gsl_wavelet_workspace, work);
293
+ break;
294
+ case 1:
295
+ if (TYPE(argv[itmp]) == T_FIXNUM) {
296
+ dir = FIX2INT(argv[itmp]);
297
+ work = gsl_wavelet_workspace_alloc(v->size);
298
+ flag = 1;
299
+ } else if (rb_obj_is_kind_of(argv[itmp], cgsl_wavelet_workspace)) {
300
+ Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
301
+ } else {
302
+ rb_raise(rb_eTypeError, "wrong argument type");
303
+ }
304
+ break;
305
+ case 0:
306
+ work = gsl_wavelet_workspace_alloc(v->size);
307
+ flag = 1;
308
+ break;
309
+ default:
310
+ rb_raise(rb_eArgError, "too many arguments");
311
+ break;
312
+ }
313
+ if (naflag == 0) {
314
+ if (sss == RB_GSL_DWT_COPY) {
315
+ vnew = gsl_vector_alloc(v->size);
316
+ gsl_vector_memcpy(vnew, v);
317
+ ary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
318
+ ptr2 = vnew->data;
319
+ } else {
320
+ ary = ret;
321
+ ptr2 = ptr1;
322
+ }
323
+ } else {
324
+ #ifdef HAVE_NARRAY_H
325
+ if (sss == RB_GSL_DWT_COPY) {
326
+ ary = na_make_object(NA_DFLOAT, na1->rank, na1->shape, cNArray);
327
+ ptr2 = NA_PTR_TYPE(ary, double*);
328
+ memcpy(ptr2, ptr1, sizeof(double)*n);
329
+ } else {
330
+ ary = ret;
331
+ ptr2 = ptr1;
332
+ }
333
+ #endif
334
+ }
335
+ status = gsl_wavelet_transform(w, ptr2, stride, n, dir, work);
336
+ if (flag) gsl_wavelet_workspace_free(work);
337
+ return ary;
338
+ }
339
+
340
+ static VALUE rb_gsl_wavelet_transform(int argc, VALUE *argv, VALUE obj)
341
+ {
342
+ return rb_gsl_wavelet_transform0(argc, argv, obj, RB_GSL_DWT_COPY);
343
+ }
344
+
345
+ static VALUE rb_gsl_wavelet_transform2(int argc, VALUE *argv, VALUE obj)
346
+ {
347
+ return rb_gsl_wavelet_transform0(argc, argv, obj, RB_GSL_DWT_INPLACE);
348
+ }
349
+
350
+ static VALUE rb_gsl_wavelet_trans(int argc, VALUE *argv, VALUE obj,
351
+ int (*trans)(const gsl_wavelet *,
352
+ double *, size_t, size_t,
353
+ gsl_wavelet_workspace *),
354
+ int sss)
355
+ {
356
+ gsl_wavelet *w = NULL;
357
+ gsl_vector *v = NULL, *vnew;
358
+ gsl_wavelet_workspace *work = NULL;
359
+ int itmp, flag = 0, status, naflag = 0;
360
+ double *ptr1 = NULL, *ptr2 = NULL;
361
+ size_t n, stride;
362
+ VALUE ary, ret;
363
+ #ifdef HAVE_NARRAY_H
364
+ struct NARRAY *na;
365
+ #endif
366
+ switch (TYPE(obj)) {
367
+ case T_MODULE:
368
+ case T_CLASS:
369
+ case T_OBJECT:
370
+ if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
371
+ CHECK_WAVELET(argv[0]);
372
+
373
+ if (MATRIX_P(argv[1])) {
374
+ if (trans == gsl_wavelet_transform_forward) {
375
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
376
+ gsl_wavelet2d_transform_matrix_forward, sss);
377
+ } else {
378
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
379
+ gsl_wavelet2d_transform_matrix_inverse, sss);
380
+ }
381
+ }
382
+ if (VECTOR_P(argv[1])) {
383
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
384
+ Data_Get_Struct(argv[1], gsl_vector, v);
385
+ ret = argv[1];
386
+ ptr1 = v->data;
387
+ n = v->size;
388
+ stride = v->stride;
389
+ #ifdef HAVE_NARRAY_H
390
+ } else if (NA_IsNArray(argv[1])) {
391
+ GetNArray(argv[1], na);
392
+ ret = argv[1];
393
+ ptr1 = (double*) na->ptr;
394
+ n = na->total;
395
+ naflag = 1;
396
+ stride = 1;
397
+ #endif
398
+ } else {
399
+ rb_raise(rb_eTypeError, "wrong argument type (Vector expected)");
400
+ }
401
+ itmp = 2;
402
+ break;
403
+ default:
404
+ if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
405
+
406
+ if (MATRIX_P(argv[0])) {
407
+ if (trans == gsl_wavelet_transform_forward) {
408
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
409
+ gsl_wavelet2d_transform_matrix_forward, sss);
410
+ } else {
411
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
412
+ gsl_wavelet2d_transform_matrix_inverse, sss);
413
+ }
414
+ }
415
+ if (VECTOR_P(obj)) {
416
+ CHECK_WAVELET(argv[0]);
417
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
418
+ Data_Get_Struct(obj, gsl_vector, v);
419
+ ret = obj;
420
+ ptr1 = v->data;
421
+ n = v->size;
422
+ stride = v->stride;
423
+ } else if (VECTOR_P(argv[0])) {
424
+ CHECK_WAVELET(obj);
425
+ Data_Get_Struct(obj, gsl_wavelet, w);
426
+ Data_Get_Struct(argv[0], gsl_vector, v);
427
+ ret = argv[0];
428
+ ptr1 = v->data;
429
+ n = v->size;
430
+ stride = v->stride;
431
+ #ifdef HAVE_NARRAY_H
432
+ } else if (NA_IsNArray(obj)) {
433
+ CHECK_WAVELET(argv[0]);
434
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
435
+ GetNArray(obj, na);
436
+ ret = obj;
437
+ ptr1 = (double*) na->ptr;
438
+ n = na->total;
439
+ naflag = 1;
440
+ stride = 1;
441
+ } else if (NA_IsNArray(argv[0])) {
442
+ CHECK_WAVELET(obj);
443
+ Data_Get_Struct(obj, gsl_wavelet, w);
444
+ GetNArray(argv[0], na);
445
+ ret = argv[0];
446
+ ptr1 = (double*) na->ptr;
447
+ n = na->total;
448
+ naflag = 1;
449
+ stride = 1;
450
+ #endif
451
+ } else {
452
+ rb_raise(rb_eTypeError, "wrong argument type");
453
+ }
454
+ itmp = 1;
455
+ break;
456
+ }
457
+ switch (argc - itmp) {
458
+ case 1:
459
+ CHECK_WORKSPACE(argv[itmp]);
460
+ Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
461
+ break;
462
+ case 0:
463
+ work = gsl_wavelet_workspace_alloc(v->size);
464
+ flag = 1;
465
+ break;
466
+ default:
467
+ rb_raise(rb_eArgError, "too many arguments");
468
+ break;
469
+ }
470
+ if (naflag == 0) {
471
+ if (sss == RB_GSL_DWT_COPY) {
472
+ vnew = gsl_vector_alloc(v->size);
473
+ gsl_vector_memcpy(vnew, v);
474
+ ary = Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
475
+ ptr2 = vnew->data;
476
+ } else {
477
+ ptr2 = ptr1;
478
+ ary = ret;
479
+ }
480
+ } else {
481
+ #ifdef HAVA_NARRAY_H
482
+ if (sss == RB_GSL_DWT_COPY) {
483
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, cNArray);
484
+ ptr2 = NA_PTR_TYPE(ary, double*);
485
+ memcpy(ptr2, ptr1, sizeof(double)*n);
486
+ } else {
487
+ ptr2 = ptr1;
488
+ ary = ret;
489
+ }
490
+ #endif
491
+ }
492
+ status = (*trans)(w, ptr2, stride, n, work);
493
+ if (flag) gsl_wavelet_workspace_free(work);
494
+ return ary;
495
+ }
496
+
497
+ static VALUE rb_gsl_wavelet_transform_forward(int argc, VALUE *argv, VALUE obj)
498
+ {
499
+ return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_forward,
500
+ RB_GSL_DWT_COPY);
501
+ }
502
+
503
+ static VALUE rb_gsl_wavelet_transform_inverse(int argc, VALUE *argv, VALUE obj)
504
+ {
505
+ return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_inverse,
506
+ RB_GSL_DWT_COPY);
507
+ }
508
+
509
+ static VALUE rb_gsl_wavelet_transform_forward2(int argc, VALUE *argv, VALUE obj)
510
+ {
511
+ return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_forward,
512
+ RB_GSL_DWT_INPLACE);
513
+ }
514
+
515
+ static VALUE rb_gsl_wavelet_transform_inverse2(int argc, VALUE *argv, VALUE obj)
516
+ {
517
+ return rb_gsl_wavelet_trans(argc, argv, obj, gsl_wavelet_transform_inverse,
518
+ RB_GSL_DWT_INPLACE);
519
+ }
520
+
521
+ static VALUE rb_gsl_wavelet2d(int argc, VALUE *argv, VALUE obj,
522
+ int (*trans)(const gsl_wavelet *,
523
+ gsl_matrix *,
524
+ gsl_wavelet_direction,
525
+ gsl_wavelet_workspace *),
526
+ int sss)
527
+ {
528
+ gsl_wavelet *w = NULL;
529
+ gsl_matrix *m = NULL, *mnew;
530
+ gsl_wavelet_direction dir = forward;
531
+ gsl_wavelet_workspace *work = NULL;
532
+ VALUE ary, ret;
533
+ int itmp, flag = 0, status;
534
+ switch (TYPE(obj)) {
535
+ case T_MODULE:
536
+ case T_CLASS:
537
+ case T_OBJECT:
538
+ if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
539
+ CHECK_WAVELET(argv[0]);
540
+ CHECK_MATRIX(argv[1]);
541
+ ret = argv[1];
542
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
543
+ Data_Get_Struct(argv[1], gsl_matrix, m);
544
+ itmp = 2;
545
+ break;
546
+ default:
547
+ if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
548
+ if (MATRIX_P(obj)) {
549
+ CHECK_WAVELET(argv[0]);
550
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
551
+ Data_Get_Struct(obj, gsl_matrix, m);
552
+ ret = obj;
553
+ } else {
554
+ CHECK_MATRIX(argv[0]);
555
+ Data_Get_Struct(obj, gsl_wavelet, w);
556
+ Data_Get_Struct(argv[0], gsl_matrix, m);
557
+ ret = argv[0];
558
+ }
559
+ itmp = 1;
560
+ break;
561
+ }
562
+ switch (argc - itmp) {
563
+ case 2:
564
+ CHECK_FIXNUM(argv[itmp]);
565
+ CHECK_WORKSPACE(argv[itmp+1]);
566
+ dir = FIX2INT(argv[itmp]);
567
+ Data_Get_Struct(argv[itmp+1], gsl_wavelet_workspace, work);
568
+ break;
569
+ case 1:
570
+ if (TYPE(argv[itmp]) == T_FIXNUM) {
571
+ dir = FIX2INT(argv[itmp]);
572
+ work = gsl_wavelet_workspace_alloc(m->size1);
573
+ flag = 1;
574
+ } else if (rb_obj_is_kind_of(argv[itmp], cgsl_wavelet_workspace)) {
575
+ Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
576
+ } else {
577
+ rb_raise(rb_eTypeError, "wrong argument type");
578
+ }
579
+ break;
580
+ case 0:
581
+ work = gsl_wavelet_workspace_alloc(m->size1);
582
+ flag = 1;
583
+ break;
584
+ default:
585
+ rb_raise(rb_eArgError, "too many arguments");
586
+ break;
587
+ }
588
+ if (sss == RB_GSL_DWT_COPY) {
589
+ mnew = make_matrix_clone(m);
590
+ ary = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
591
+ } else {
592
+ mnew = m;
593
+ ary = ret;
594
+ }
595
+ status = (*trans)(w, mnew, dir, work);
596
+ if (flag) gsl_wavelet_workspace_free(work);
597
+ return ary;
598
+ }
599
+
600
+ static VALUE rb_gsl_wavelet2d_transform_matrix(int argc, VALUE *argv, VALUE obj)
601
+ {
602
+ return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_transform_matrix,
603
+ RB_GSL_DWT_COPY);
604
+ }
605
+
606
+ static VALUE rb_gsl_wavelet2d_transform_matrix2(int argc, VALUE *argv, VALUE obj)
607
+ {
608
+ return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_transform_matrix,
609
+ RB_GSL_DWT_INPLACE);
610
+ }
611
+
612
+ static VALUE rb_gsl_wavelet2d_trans(int argc, VALUE *argv, VALUE obj,
613
+ int (*trans)(const gsl_wavelet *,
614
+ gsl_matrix *,
615
+ gsl_wavelet_workspace *),
616
+ int sss)
617
+ {
618
+ gsl_wavelet *w = NULL;
619
+ gsl_matrix *m = NULL, *mnew;
620
+ gsl_wavelet_workspace *work = NULL;
621
+ VALUE ary, ret;
622
+ int itmp, flag = 0, status;
623
+ switch (TYPE(obj)) {
624
+ case T_MODULE:
625
+ case T_CLASS:
626
+ case T_OBJECT:
627
+ if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
628
+ CHECK_WAVELET(argv[0]);
629
+ CHECK_MATRIX(argv[1]);
630
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
631
+ Data_Get_Struct(argv[1], gsl_matrix, m);
632
+ ret = argv[1];
633
+ itmp = 2;
634
+ break;
635
+ default:
636
+ if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
637
+ if (MATRIX_P(obj)) {
638
+ CHECK_WAVELET(argv[0]);
639
+ Data_Get_Struct(argv[0], gsl_wavelet, w);
640
+ Data_Get_Struct(obj, gsl_matrix, m);
641
+ ret = obj;
642
+ } else {
643
+ CHECK_MATRIX(argv[0]);
644
+ Data_Get_Struct(obj, gsl_wavelet, w);
645
+ Data_Get_Struct(argv[0], gsl_matrix, m);
646
+ ret = argv[0];
647
+ }
648
+ itmp = 1;
649
+ break;
650
+ }
651
+ switch (argc - itmp) {
652
+ case 1:
653
+ CHECK_WORKSPACE(argv[itmp]);
654
+ Data_Get_Struct(argv[itmp], gsl_wavelet_workspace, work);
655
+ break;
656
+ case 0:
657
+ work = gsl_wavelet_workspace_alloc(m->size1);
658
+ flag = 1;
659
+ break;
660
+ default:
661
+ rb_raise(rb_eArgError, "too many arguments");
662
+ break;
663
+ }
664
+ if (sss == RB_GSL_DWT_COPY) {
665
+ mnew = make_matrix_clone(m);
666
+ ary = Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
667
+ } else {
668
+ mnew = m;
669
+ ary = ret;
670
+ }
671
+ status = (*trans)(w, mnew, work);
672
+ if (flag) gsl_wavelet_workspace_free(work);
673
+ return ary;
674
+ }
675
+
676
+ static VALUE rb_gsl_wavelet2d_transform_matrix_forward(int argc, VALUE *argv, VALUE obj)
677
+ {
678
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
679
+ gsl_wavelet2d_transform_matrix_forward,
680
+ RB_GSL_DWT_COPY);
681
+ }
682
+
683
+ static VALUE rb_gsl_wavelet2d_transform_matrix_forward2(int argc, VALUE *argv, VALUE obj)
684
+ {
685
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
686
+ gsl_wavelet2d_transform_matrix_forward,
687
+ RB_GSL_DWT_INPLACE);
688
+ }
689
+
690
+ static VALUE rb_gsl_wavelet2d_transform_matrix_inverse(int argc, VALUE *argv, VALUE obj)
691
+ {
692
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
693
+ gsl_wavelet2d_transform_matrix_inverse,
694
+ RB_GSL_DWT_COPY);
695
+ }
696
+
697
+ static VALUE rb_gsl_wavelet2d_transform_matrix_inverse2(int argc, VALUE *argv, VALUE obj)
698
+ {
699
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
700
+ gsl_wavelet2d_transform_matrix_inverse,
701
+ RB_GSL_DWT_INPLACE);
702
+ }
703
+
704
+ /** nstransform **/
705
+ static VALUE rb_gsl_wavelet2d_nstransform_matrix(int argc, VALUE *argv, VALUE obj)
706
+ {
707
+ return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_nstransform_matrix,
708
+ RB_GSL_DWT_COPY);
709
+ }
710
+
711
+ static VALUE rb_gsl_wavelet2d_nstransform_matrix2(int argc, VALUE *argv, VALUE obj)
712
+ {
713
+ return rb_gsl_wavelet2d(argc, argv, obj, gsl_wavelet2d_nstransform_matrix,
714
+ RB_GSL_DWT_INPLACE);
715
+ }
716
+
717
+ static VALUE rb_gsl_wavelet2d_nstransform_matrix_forward(int argc, VALUE *argv, VALUE obj)
718
+ {
719
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
720
+ gsl_wavelet2d_nstransform_matrix_forward,
721
+ RB_GSL_DWT_COPY);
722
+ }
723
+
724
+ static VALUE rb_gsl_wavelet2d_nstransform_matrix_forward2(int argc, VALUE *argv, VALUE obj)
725
+ {
726
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
727
+ gsl_wavelet2d_nstransform_matrix_forward,
728
+ RB_GSL_DWT_INPLACE);
729
+ }
730
+
731
+ static VALUE rb_gsl_wavelet2d_nstransform_matrix_inverse(int argc, VALUE *argv, VALUE obj)
732
+ {
733
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
734
+ gsl_wavelet2d_nstransform_matrix_inverse,
735
+ RB_GSL_DWT_COPY);
736
+ }
737
+
738
+ static VALUE rb_gsl_wavelet2d_nstransform_matrix_inverse2(int argc, VALUE *argv, VALUE obj)
739
+ {
740
+ return rb_gsl_wavelet2d_trans(argc, argv, obj,
741
+ gsl_wavelet2d_nstransform_matrix_inverse,
742
+ RB_GSL_DWT_INPLACE);
743
+ }
744
+
745
+ #endif
746
+
747
+ void Init_wavelet(VALUE module)
748
+ {
749
+ VALUE cgsl_wavelet2d;
750
+
751
+ cgsl_wavelet = rb_define_class_under(module, "Wavelet", cGSL_Object);
752
+ cgsl_wavelet2d = rb_define_class_under(module, "Wavelet2d", cgsl_wavelet);
753
+
754
+ rb_define_singleton_method(cgsl_wavelet, "alloc", rb_gsl_wavelet_new, 2);
755
+
756
+ #ifdef GSL_1_6_LATER
757
+ rb_gsl_wavelet_define_const(cgsl_wavelet);
758
+ rb_define_method(cgsl_wavelet, "name", rb_gsl_wavelet_name, 0);
759
+
760
+ cgsl_wavelet_workspace = rb_define_class_under(cgsl_wavelet, "Workspace", cGSL_Object);
761
+ rb_define_singleton_method(cgsl_wavelet_workspace, "alloc",
762
+ rb_gsl_wavelet_workspace_new, 1);
763
+
764
+ /*****/
765
+
766
+ rb_define_singleton_method(cgsl_wavelet, "transform",
767
+ rb_gsl_wavelet_transform, -1);
768
+ rb_define_method(cgsl_wavelet, "transform", rb_gsl_wavelet_transform, -1);
769
+ rb_define_method(cgsl_vector, "wavelet_transform", rb_gsl_wavelet_transform, -1);
770
+ rb_define_singleton_method(cgsl_wavelet, "transform!",
771
+ rb_gsl_wavelet_transform2, -1);
772
+ rb_define_method(cgsl_wavelet, "transform!", rb_gsl_wavelet_transform2, -1);
773
+ rb_define_method(cgsl_vector, "wavelet_transform!", rb_gsl_wavelet_transform2, -1);
774
+
775
+ /**/
776
+
777
+ rb_define_singleton_method(cgsl_wavelet, "transform_forward",
778
+ rb_gsl_wavelet_transform_forward, -1);
779
+ rb_define_method(cgsl_wavelet, "transform_forward",
780
+ rb_gsl_wavelet_transform_forward, -1);
781
+ rb_define_alias(cgsl_wavelet, "forward", "transform_forward");
782
+ rb_define_method(cgsl_vector, "wavelet_transform_forward",
783
+ rb_gsl_wavelet_transform_forward, -1);
784
+
785
+ rb_define_singleton_method(cgsl_wavelet, "transform_inverse",
786
+ rb_gsl_wavelet_transform_inverse, -1);
787
+ rb_define_method(cgsl_wavelet, "transform_inverse",
788
+ rb_gsl_wavelet_transform_inverse, -1);
789
+ rb_define_alias(cgsl_wavelet, "inverse", "transform_inverse");
790
+ rb_define_method(cgsl_vector, "wavelet_transform_inverse",
791
+ rb_gsl_wavelet_transform_inverse, -1);
792
+
793
+ rb_define_singleton_method(cgsl_wavelet, "transform_forward!",
794
+ rb_gsl_wavelet_transform_forward2, -1);
795
+ rb_define_method(cgsl_wavelet, "transform_forward!",
796
+ rb_gsl_wavelet_transform_forward2, -1);
797
+ rb_define_alias(cgsl_wavelet, "forward!", "transform_forward!");
798
+ rb_define_method(cgsl_vector, "wavelet_transform_forward!",
799
+ rb_gsl_wavelet_transform_forward2, -1);
800
+
801
+ rb_define_singleton_method(cgsl_wavelet, "transform_inverse!",
802
+ rb_gsl_wavelet_transform_inverse2, -1);
803
+ rb_define_method(cgsl_wavelet, "transform_inverse!",
804
+ rb_gsl_wavelet_transform_inverse2, -1);
805
+ rb_define_alias(cgsl_wavelet, "inverse!", "transform_inverse!");
806
+ rb_define_method(cgsl_vector, "wavelet_transform_inverse!",
807
+ rb_gsl_wavelet_transform_inverse2, -1);
808
+ /***** 2d *****/
809
+ rb_define_singleton_method(cgsl_wavelet, "transform_matrix",
810
+ rb_gsl_wavelet2d_transform_matrix, -1);
811
+ rb_define_singleton_method(cgsl_wavelet2d, "transform",
812
+ rb_gsl_wavelet2d_transform_matrix, -1);
813
+ rb_define_method(cgsl_wavelet, "transform_matrix",
814
+ rb_gsl_wavelet2d_transform_matrix, -1);
815
+ rb_define_method(cgsl_wavelet2d, "transform",
816
+ rb_gsl_wavelet2d_transform_matrix, -1);
817
+ rb_define_method(cgsl_matrix, "wavelet_transform",
818
+ rb_gsl_wavelet2d_transform_matrix, -1);
819
+
820
+ rb_define_singleton_method(cgsl_wavelet, "transform_matrix!",
821
+ rb_gsl_wavelet2d_transform_matrix2, -1);
822
+ rb_define_singleton_method(cgsl_wavelet2d, "transform!",
823
+ rb_gsl_wavelet2d_transform_matrix2, -1);
824
+ rb_define_method(cgsl_wavelet, "transform_matrix!",
825
+ rb_gsl_wavelet2d_transform_matrix2, -1);
826
+ rb_define_method(cgsl_wavelet2d, "transform!",
827
+ rb_gsl_wavelet2d_transform_matrix2, -1);
828
+ rb_define_method(cgsl_matrix, "wavelet_transform!",
829
+ rb_gsl_wavelet2d_transform_matrix2, -1);
830
+ /**/
831
+
832
+ rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward",
833
+ rb_gsl_wavelet2d_transform_matrix_forward, -1);
834
+ rb_define_singleton_method(cgsl_wavelet2d, "transform_forward",
835
+ rb_gsl_wavelet2d_transform_matrix_forward, -1);
836
+ rb_define_method(cgsl_wavelet, "transform_matrix_forward",
837
+ rb_gsl_wavelet2d_transform_matrix_forward, -1);
838
+ rb_define_method(cgsl_wavelet2d, "transform_forward",
839
+ rb_gsl_wavelet2d_transform_matrix_forward, -1);
840
+ rb_define_method(cgsl_matrix, "wavelet_transform_forward",
841
+ rb_gsl_wavelet2d_transform_matrix_forward, -1);
842
+
843
+ rb_define_singleton_method(cgsl_wavelet, "transform_matrix_forward!",
844
+ rb_gsl_wavelet2d_transform_matrix_forward2, -1);
845
+ rb_define_singleton_method(cgsl_wavelet2d, "transform_forward!",
846
+ rb_gsl_wavelet2d_transform_matrix_forward2, -1);
847
+ rb_define_method(cgsl_wavelet, "transform_matrix_forward!",
848
+ rb_gsl_wavelet2d_transform_matrix_forward2, -1);
849
+ rb_define_method(cgsl_wavelet2d, "transform_forward!",
850
+ rb_gsl_wavelet2d_transform_matrix_forward2, -1);
851
+ rb_define_method(cgsl_matrix, "wavelet_transform_forward!",
852
+ rb_gsl_wavelet2d_transform_matrix_forward2, -1);
853
+
854
+ rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse",
855
+ rb_gsl_wavelet2d_transform_matrix_inverse, -1);
856
+ rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse",
857
+ rb_gsl_wavelet2d_transform_matrix_inverse, -1);
858
+ rb_define_method(cgsl_wavelet, "transform_matrix_inverse",
859
+ rb_gsl_wavelet2d_transform_matrix_inverse, -1);
860
+ rb_define_method(cgsl_wavelet2d, "transform_inverse",
861
+ rb_gsl_wavelet2d_transform_matrix_inverse, -1);
862
+ rb_define_method(cgsl_matrix, "wavelet_transform_inverse",
863
+ rb_gsl_wavelet2d_transform_matrix_inverse, -1);
864
+
865
+ rb_define_singleton_method(cgsl_wavelet, "transform_matrix_inverse!",
866
+ rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
867
+ rb_define_singleton_method(cgsl_wavelet2d, "transform_inverse!",
868
+ rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
869
+ rb_define_method(cgsl_wavelet, "transform_matrix_inverse!",
870
+ rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
871
+ rb_define_method(cgsl_wavelet2d, "transform_inverse!",
872
+ rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
873
+ rb_define_method(cgsl_matrix, "wavelet_transform_inverse!",
874
+ rb_gsl_wavelet2d_transform_matrix_inverse2, -1);
875
+
876
+ /** nstransform **/
877
+ rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix",
878
+ rb_gsl_wavelet2d_nstransform_matrix, -1);
879
+ rb_define_singleton_method(cgsl_wavelet2d, "nstransform",
880
+ rb_gsl_wavelet2d_nstransform_matrix, -1);
881
+ rb_define_method(cgsl_wavelet, "nstransform_matrix",
882
+ rb_gsl_wavelet2d_nstransform_matrix, -1);
883
+ rb_define_method(cgsl_wavelet2d, "nstransform",
884
+ rb_gsl_wavelet2d_nstransform_matrix, -1);
885
+
886
+ rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix!",
887
+ rb_gsl_wavelet2d_nstransform_matrix2, -1);
888
+ rb_define_singleton_method(cgsl_wavelet2d, "nstransform!",
889
+ rb_gsl_wavelet2d_nstransform_matrix2, -1);
890
+ rb_define_method(cgsl_wavelet, "nstransform_matrix!",
891
+ rb_gsl_wavelet2d_nstransform_matrix2, -1);
892
+ rb_define_method(cgsl_wavelet2d, "nstransform!",
893
+ rb_gsl_wavelet2d_nstransform_matrix2, -1);
894
+ /**/
895
+
896
+ rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward",
897
+ rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
898
+ rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward",
899
+ rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
900
+ rb_define_method(cgsl_wavelet, "nstransform_matrix_forward",
901
+ rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
902
+ rb_define_method(cgsl_wavelet2d, "nstransform_forward",
903
+ rb_gsl_wavelet2d_nstransform_matrix_forward, -1);
904
+
905
+ rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_forward!",
906
+ rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
907
+ rb_define_singleton_method(cgsl_wavelet2d, "nstransform_forward!",
908
+ rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
909
+ rb_define_method(cgsl_wavelet, "nstransform_matrix_forward!",
910
+ rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
911
+ rb_define_method(cgsl_wavelet2d, "nstransform_forward!",
912
+ rb_gsl_wavelet2d_nstransform_matrix_forward2, -1);
913
+
914
+ rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse",
915
+ rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
916
+ rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse",
917
+ rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
918
+ rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse",
919
+ rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
920
+ rb_define_method(cgsl_wavelet2d, "nstransform_inverse",
921
+ rb_gsl_wavelet2d_nstransform_matrix_inverse, -1);
922
+
923
+ rb_define_singleton_method(cgsl_wavelet, "nstransform_matrix_inverse!",
924
+ rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
925
+ rb_define_singleton_method(cgsl_wavelet2d, "nstransform_inverse!",
926
+ rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
927
+ rb_define_method(cgsl_wavelet, "nstransform_matrix_inverse!",
928
+ rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
929
+ rb_define_method(cgsl_wavelet2d, "nstransform_inverse!",
930
+ rb_gsl_wavelet2d_nstransform_matrix_inverse2, -1);
931
+
932
+ #endif
933
+ }
934
+
935
+ #undef CHECK_WAVELET
936
+ #undef CHECK_WORKSPACE
937
+