gsl 1.12.108

Sign up to get free protection for your applications and to get access to all the features.
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
+