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,1068 @@
1
+ /*
2
+ histogram2d.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_histogram.h"
14
+ #include "rb_gsl_common.h"
15
+ #include "rb_gsl_array.h"
16
+
17
+ VALUE cgsl_histogram2d;
18
+ VALUE cgsl_histogram2d_view;
19
+ static VALUE cgsl_histogram2d_integ;
20
+
21
+ #ifdef GSL_0_9_4_LATER
22
+ static VALUE rb_gsl_histogram2d_alloc_uniform(int argc, VALUE *argv, VALUE klass);
23
+ static VALUE rb_gsl_histogram2d_alloc(int argc, VALUE *argv, VALUE klass)
24
+ {
25
+ gsl_histogram2d *h = NULL;
26
+ size_t xsize, ysize;
27
+ gsl_vector *vx, *vy;
28
+ switch (argc) {
29
+ case 2:
30
+ switch (TYPE(argv[0])) {
31
+ case T_FIXNUM:
32
+ CHECK_FIXNUM(argv[1]);
33
+ h = gsl_histogram2d_calloc(FIX2INT(argv[0]), FIX2INT(argv[1]));
34
+ break;
35
+ case T_ARRAY:
36
+ vx = make_cvector_from_rarray(argv[0]);
37
+ vy = make_cvector_from_rarray(argv[1]);
38
+ h = gsl_histogram2d_alloc(vx->size-1, vy->size-1);
39
+ gsl_histogram2d_set_ranges(h, vx->data, vx->size, vy->data, vy->size);
40
+ gsl_vector_free(vx);
41
+ gsl_vector_free(vy);
42
+ break;
43
+ default:
44
+ CHECK_VECTOR(argv[0]); CHECK_VECTOR(argv[1]);
45
+ Data_Get_Struct(argv[0], gsl_vector, vx);
46
+ Data_Get_Struct(argv[1], gsl_vector, vy);
47
+ h = gsl_histogram2d_alloc(vx->size-1, vy->size-1);
48
+ gsl_histogram2d_set_ranges(h, vx->data, vx->size, vy->data, vy->size);
49
+ break;
50
+ }
51
+ return Data_Wrap_Struct(klass, 0, gsl_histogram2d_free, h);
52
+ break;
53
+ case 4:
54
+ if (VECTOR_P(argv[0]) && VECTOR_P(argv[2])) {
55
+ CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[3]);
56
+ Data_Get_Struct(argv[0], gsl_vector, vx);
57
+ Data_Get_Struct(argv[2], gsl_vector, vy);
58
+ xsize = (size_t) FIX2UINT(argv[1]); ysize = (size_t) FIX2UINT(argv[3]);
59
+ h = gsl_histogram2d_alloc(xsize-1, ysize-1);
60
+ gsl_histogram2d_set_ranges(h, vx->data, xsize, vy->data, ysize);
61
+ return Data_Wrap_Struct(klass, 0, gsl_histogram2d_free, h);
62
+ } else {
63
+ return rb_gsl_histogram2d_alloc_uniform(argc, argv, klass);
64
+ }
65
+ break;
66
+ case 6:
67
+ return rb_gsl_histogram2d_alloc_uniform(argc, argv, klass);
68
+ break;
69
+ default:
70
+ rb_raise(rb_eArgError, "wrong number of arguments %d", argc);
71
+ break;
72
+ }
73
+ return Qnil; /* never reach here */
74
+ }
75
+
76
+ static VALUE rb_gsl_histogram2d_alloc_uniform(int argc, VALUE *argv, VALUE klass)
77
+ {
78
+ gsl_histogram2d *h = NULL;
79
+ double xmin, xmax, ymin, ymax;
80
+ switch (argc) {
81
+ case 4:
82
+ CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[2]);
83
+ Check_Type(argv[1], T_ARRAY); Check_Type(argv[3], T_ARRAY);
84
+ // if (RARRAY(argv[1])->len != 2 || RARRAY(argv[3])->len != 2)
85
+ if (RARRAY_LEN(argv[1]) != 2 || RARRAY_LEN(argv[3]) != 2)
86
+ rb_raise(rb_eArgError, "array size must be 2");
87
+ xmin = NUM2DBL(rb_ary_entry(argv[1], 0));
88
+ xmax = NUM2DBL(rb_ary_entry(argv[1], 1));
89
+ ymin = NUM2DBL(rb_ary_entry(argv[3], 0));
90
+ ymax = NUM2DBL(rb_ary_entry(argv[3], 1));
91
+ h = gsl_histogram2d_alloc(FIX2INT(argv[0]), FIX2INT(argv[2]));
92
+ gsl_histogram2d_set_ranges_uniform(h, xmin, xmax, ymin, ymax);
93
+ return Data_Wrap_Struct(klass, 0, gsl_histogram2d_free, h);
94
+ break;
95
+ case 6:
96
+ CHECK_FIXNUM(argv[0]);
97
+ Need_Float(argv[1]); Need_Float(argv[2]);
98
+ CHECK_FIXNUM(argv[3]);
99
+ Need_Float(argv[4]); Need_Float(argv[5]);
100
+ h = gsl_histogram2d_alloc(FIX2INT(argv[0]), FIX2INT(argv[3]));
101
+ gsl_histogram2d_set_ranges_uniform(h, NUM2DBL(argv[1]), NUM2DBL(argv[2]),
102
+ NUM2DBL(argv[4]), NUM2DBL(argv[5]));
103
+ return Data_Wrap_Struct(klass, 0, gsl_histogram2d_free, h);
104
+ break;
105
+ default:
106
+ rb_raise(rb_eArgError, "wrong number of arguments %d", argc);
107
+ break;
108
+ }
109
+ return Qnil; /* never reach here */
110
+ }
111
+ #endif
112
+
113
+ static VALUE rb_gsl_histogram2d_set_ranges(int argc, VALUE *argv, VALUE obj)
114
+ {
115
+ gsl_histogram2d *h = NULL;
116
+ gsl_vector *vx, *vy;
117
+ size_t xsize, ysize;
118
+ Data_Get_Struct(obj, gsl_histogram2d, h);
119
+ switch (argc) {
120
+ case 4:
121
+ CHECK_VECTOR(argv[0]); CHECK_VECTOR(argv[2]);
122
+ CHECK_FIXNUM(argv[1]); CHECK_FIXNUM(argv[3]);
123
+ Data_Get_Struct(argv[0], gsl_vector, vx);
124
+ Data_Get_Struct(argv[2], gsl_vector, vy);
125
+ xsize = (size_t) FIX2UINT(argv[1]); ysize = (size_t) FIX2UINT(argv[3]);
126
+ break;
127
+ case 2:
128
+ CHECK_VECTOR(argv[0]); CHECK_VECTOR(argv[1]);
129
+ Data_Get_Struct(argv[0], gsl_vector, vx);
130
+ Data_Get_Struct(argv[1], gsl_vector, vy);
131
+ xsize = vx->size; ysize = vy->size;
132
+ break;
133
+ default:
134
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 4)", argc);
135
+ }
136
+ gsl_histogram2d_set_ranges(h, vx->data, xsize, vy->data, ysize);
137
+ return obj;
138
+ }
139
+
140
+ static VALUE rb_gsl_histogram2d_set_ranges_uniform(int argc, VALUE *argv, VALUE obj)
141
+ {
142
+ gsl_histogram2d *h = NULL;
143
+ double xmin, xmax, ymin, ymax;
144
+ switch (argc) {
145
+ case 2:
146
+ Check_Type(argv[0], T_ARRAY); Check_Type(argv[1], T_ARRAY);
147
+ xmin = NUM2DBL(rb_ary_entry(argv[0], 0));
148
+ xmax = NUM2DBL(rb_ary_entry(argv[0], 1));
149
+ ymin = NUM2DBL(rb_ary_entry(argv[1], 0));
150
+ ymax = NUM2DBL(rb_ary_entry(argv[1], 1));
151
+ break;
152
+ case 4:
153
+ xmin = NUM2DBL(argv[0]); xmax = NUM2DBL(argv[1]);
154
+ ymin = NUM2DBL(argv[2]); ymax = NUM2DBL(argv[3]);
155
+ break;
156
+ default:
157
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 4)", argc);
158
+ break;
159
+ }
160
+ Data_Get_Struct(obj, gsl_histogram2d, h);
161
+ gsl_histogram2d_set_ranges_uniform(h, xmin, xmax, ymin, ymax);
162
+ return obj;
163
+ }
164
+
165
+ static VALUE rb_gsl_histogram2d_clone(VALUE obj)
166
+ {
167
+ gsl_histogram2d *h, *h2 = NULL;
168
+ Data_Get_Struct(obj, gsl_histogram2d, h);
169
+ h2 = gsl_histogram2d_clone(h);
170
+ return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_histogram2d_free, h2);
171
+ }
172
+
173
+ /* singleton */
174
+ static VALUE rb_gsl_histogram2d_memcpy(VALUE obj, VALUE vhdest, VALUE vhsrc)
175
+ {
176
+ gsl_histogram2d *hdest, *hsrc;
177
+ CHECK_HISTOGRAM2D(vhdest); CHECK_HISTOGRAM2D(vhsrc);
178
+ Data_Get_Struct(vhdest, gsl_histogram2d, hdest);
179
+ Data_Get_Struct(vhsrc, gsl_histogram2d, hsrc);
180
+ gsl_histogram2d_memcpy(hdest, hsrc);
181
+ return vhdest;
182
+ }
183
+
184
+ static VALUE rb_gsl_histogram2d_accumulate(int argc, VALUE *argv, VALUE obj)
185
+ {
186
+ gsl_histogram2d *h = NULL;
187
+ gsl_vector *vx, *vy;
188
+ size_t n, i;
189
+ double weight = 1;
190
+ switch (argc) {
191
+ case 3:
192
+ Need_Float(argv[2]);
193
+ weight = NUM2DBL(argv[2]);
194
+ break;
195
+ case 2:
196
+ weight = 1;
197
+ break;
198
+ default:
199
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
200
+ break;
201
+ }
202
+ Data_Get_Struct(obj, gsl_histogram2d, h);
203
+ if (VECTOR_P(argv[0]) && VECTOR_P(argv[1])) {
204
+ Data_Get_Struct(argv[0], gsl_vector, vx);
205
+ Data_Get_Struct(argv[1], gsl_vector, vy);
206
+ n = (size_t) GSL_MIN_INT((int) vx->size, (int) vy->size);
207
+ for (i = 0; i < n; i++)
208
+ gsl_histogram2d_accumulate(h, gsl_vector_get(vx, i), gsl_vector_get(vy, i),
209
+ weight);
210
+ } else {
211
+ gsl_histogram2d_accumulate(h, NUM2DBL(argv[0]), NUM2DBL(argv[1]), weight);
212
+ }
213
+ return obj;
214
+ }
215
+
216
+ static VALUE rb_gsl_histogram2d_accumulate2(int argc, VALUE *argv, VALUE obj)
217
+ {
218
+ gsl_histogram2d *h = NULL;
219
+ double x, y, weight=1;
220
+ switch (argc) {
221
+ case 3:
222
+ Need_Float(argv[2]);
223
+ weight = NUM2DBL(argv[2]);
224
+ /* no break */
225
+ case 2:
226
+ Need_Float(argv[0]); Need_Float(argv[1]);
227
+ x = NUM2DBL(argv[0]); y = NUM2DBL(argv[1]);
228
+ break;
229
+ default:
230
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
231
+ break;
232
+ }
233
+ Data_Get_Struct(obj, gsl_histogram2d, h);
234
+ if (x < h->xrange[0]) x = h->xrange[0] + 4*GSL_DBL_EPSILON;
235
+ if (x > h->xrange[h->nx]) x = h->xrange[h->nx] - 4*GSL_DBL_EPSILON;
236
+ if (y < h->yrange[0]) y = h->yrange[0] + 4*GSL_DBL_EPSILON;
237
+ if (y > h->yrange[h->ny]) y = h->yrange[h->ny] - 4*GSL_DBL_EPSILON;
238
+ gsl_histogram2d_accumulate(h, x, y, weight);
239
+ return obj;
240
+ }
241
+
242
+ static VALUE rb_gsl_histogram2d_get(int argc, VALUE *argv, VALUE obj)
243
+ {
244
+ gsl_histogram2d *h2 = NULL;
245
+ mygsl_histogram2d_view *h1 = NULL;
246
+ size_t i;
247
+ switch (argc) {
248
+ case 2:
249
+ CHECK_FIXNUM(argv[0]); CHECK_FIXNUM(argv[1]);
250
+ Data_Get_Struct(obj, gsl_histogram2d, h2);
251
+ return rb_float_new(gsl_histogram2d_get(h2, (size_t) FIX2INT(argv[0]), (size_t) FIX2INT(argv[1])));
252
+ break;
253
+ case 1:
254
+ Data_Get_Struct(obj, gsl_histogram2d, h2);
255
+ switch (TYPE(argv[0])) {
256
+ case T_ARRAY:
257
+ return rb_float_new(gsl_histogram2d_get(h2, FIX2INT(rb_ary_entry(argv[0], 0)),
258
+ FIX2INT(rb_ary_entry(argv[0], 1))));
259
+ break;
260
+ case T_FIXNUM:
261
+ CHECK_FIXNUM(argv[0]);
262
+ i = (size_t) FIX2INT(argv[0]);
263
+ if (i >= h2->ny)
264
+ rb_raise(rb_eIndexError, "wrong index");
265
+ h1 = ALLOC(mygsl_histogram2d_view);
266
+ h1->h.n = h2->ny;
267
+ h1->h.range = h2->yrange;
268
+ h1->h.bin = h2->bin + i*h2->ny;
269
+ return Data_Wrap_Struct(cgsl_histogram2d_view, 0, free, h1);
270
+ break;
271
+ default:
272
+ rb_raise(rb_eTypeError, "wrong argument type %s (Array or Fixnum expected)",
273
+ rb_class2name(CLASS_OF(argv[0])));
274
+ break;
275
+ }
276
+ break;
277
+ default:
278
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 1)",argc);
279
+ break;
280
+ }
281
+ }
282
+
283
+ static VALUE rb_gsl_histogram2d_get_xrange(VALUE obj, VALUE i)
284
+ {
285
+ gsl_histogram2d *h = NULL;
286
+ double x1, x2;
287
+ CHECK_FIXNUM(i);
288
+ Data_Get_Struct(obj, gsl_histogram2d, h);
289
+ gsl_histogram2d_get_xrange(h, FIX2INT(i), &x1, &x2);
290
+ return rb_ary_new3(2, rb_float_new(x1), rb_float_new(x2));
291
+ }
292
+
293
+ static VALUE rb_gsl_histogram2d_get_yrange(VALUE obj, VALUE j)
294
+ {
295
+ gsl_histogram2d *h = NULL;
296
+ double y1, y2;
297
+ CHECK_FIXNUM(j);
298
+ Data_Get_Struct(obj, gsl_histogram2d, h);
299
+ gsl_histogram2d_get_yrange(h, FIX2INT(j), &y1, &y2);
300
+ return rb_ary_new3(2, rb_float_new(y1), rb_float_new(y2));
301
+ }
302
+
303
+ static VALUE rb_gsl_histogram2d_xmax(VALUE obj)
304
+ {
305
+ gsl_histogram2d *h = NULL;
306
+ Data_Get_Struct(obj, gsl_histogram2d, h);
307
+ return rb_float_new(gsl_histogram2d_xmax(h));
308
+ }
309
+
310
+ static VALUE rb_gsl_histogram2d_xmin(VALUE obj)
311
+ {
312
+ gsl_histogram2d *h = NULL;
313
+ Data_Get_Struct(obj, gsl_histogram2d, h);
314
+ return rb_float_new(gsl_histogram2d_xmin(h));
315
+ }
316
+
317
+ static VALUE rb_gsl_histogram2d_nx(VALUE obj)
318
+ {
319
+ gsl_histogram2d *h = NULL;
320
+ Data_Get_Struct(obj, gsl_histogram2d, h);
321
+ return INT2FIX(gsl_histogram2d_nx(h));
322
+ }
323
+
324
+ static VALUE rb_gsl_histogram2d_ymax(VALUE obj)
325
+ {
326
+ gsl_histogram2d *h = NULL;
327
+ Data_Get_Struct(obj, gsl_histogram2d, h);
328
+ return rb_float_new(gsl_histogram2d_ymax(h));
329
+ }
330
+
331
+ static VALUE rb_gsl_histogram2d_ymin(VALUE obj)
332
+ {
333
+ gsl_histogram2d *h = NULL;
334
+ Data_Get_Struct(obj, gsl_histogram2d, h);
335
+ return rb_float_new(gsl_histogram2d_ymin(h));
336
+ }
337
+
338
+ static VALUE rb_gsl_histogram2d_ny(VALUE obj)
339
+ {
340
+ gsl_histogram2d *h = NULL;
341
+ Data_Get_Struct(obj, gsl_histogram2d, h);
342
+ return INT2FIX(gsl_histogram2d_ny(h));
343
+ }
344
+
345
+ static VALUE rb_gsl_histogram2d_find(VALUE obj, VALUE x, VALUE y)
346
+ {
347
+ gsl_histogram2d *h = NULL;
348
+ size_t i, j;
349
+ Need_Float(x);Need_Float(y);
350
+ Data_Get_Struct(obj, gsl_histogram2d, h);
351
+ gsl_histogram2d_find(h, NUM2DBL(x), NUM2DBL(y), &i, &j);
352
+ return rb_ary_new3(2, INT2FIX(i), INT2FIX(j));
353
+ }
354
+
355
+ static VALUE rb_gsl_histogram2d_max_val(VALUE obj)
356
+ {
357
+ gsl_histogram2d *h = NULL;
358
+ Data_Get_Struct(obj, gsl_histogram2d, h);
359
+ return rb_float_new(gsl_histogram2d_max_val(h));
360
+ }
361
+
362
+ static VALUE rb_gsl_histogram2d_max_bin(VALUE obj)
363
+ {
364
+ gsl_histogram2d *h = NULL;
365
+ size_t i, j;
366
+ Data_Get_Struct(obj, gsl_histogram2d, h);
367
+ gsl_histogram2d_max_bin(h, &i, &j);
368
+ return rb_ary_new3(2, INT2FIX(i), INT2FIX(j));
369
+ }
370
+
371
+ static VALUE rb_gsl_histogram2d_min_val(VALUE obj)
372
+ {
373
+ gsl_histogram2d *h = NULL;
374
+ Data_Get_Struct(obj, gsl_histogram2d, h);
375
+ return rb_float_new(gsl_histogram2d_min_val(h));
376
+ }
377
+
378
+ static VALUE rb_gsl_histogram2d_min_bin(VALUE obj)
379
+ {
380
+ gsl_histogram2d *h = NULL;
381
+ size_t i, j;
382
+ Data_Get_Struct(obj, gsl_histogram2d, h);
383
+ gsl_histogram2d_min_bin(h, &i, &j);
384
+ return rb_ary_new3(2, INT2FIX(i), INT2FIX(j));
385
+ }
386
+
387
+ #ifdef GSL_1_1_LATER
388
+ static VALUE rb_gsl_histogram2d_xmean(VALUE obj)
389
+ {
390
+ gsl_histogram2d *h = NULL;
391
+ Data_Get_Struct(obj, gsl_histogram2d, h);
392
+ return rb_float_new(gsl_histogram2d_xmean(h));
393
+ }
394
+
395
+ static VALUE rb_gsl_histogram2d_ymean(VALUE obj)
396
+ {
397
+ gsl_histogram2d *h = NULL;
398
+ Data_Get_Struct(obj, gsl_histogram2d, h);
399
+ return rb_float_new(gsl_histogram2d_ymean(h));
400
+ }
401
+
402
+ static VALUE rb_gsl_histogram2d_xsigma(VALUE obj)
403
+ {
404
+ gsl_histogram2d *h = NULL;
405
+ Data_Get_Struct(obj, gsl_histogram2d, h);
406
+ return rb_float_new(gsl_histogram2d_xsigma(h));
407
+ }
408
+
409
+ static VALUE rb_gsl_histogram2d_ysigma(VALUE obj)
410
+ {
411
+ gsl_histogram2d *h = NULL;
412
+ Data_Get_Struct(obj, gsl_histogram2d, h);
413
+ return rb_float_new(gsl_histogram2d_ysigma(h));
414
+ }
415
+
416
+ static VALUE rb_gsl_histogram2d_cov(VALUE obj)
417
+ {
418
+ gsl_histogram2d *h = NULL;
419
+ Data_Get_Struct(obj, gsl_histogram2d, h);
420
+ return rb_float_new(gsl_histogram2d_cov(h));
421
+ }
422
+
423
+ static VALUE rb_gsl_histogram2d_sum(VALUE obj)
424
+ {
425
+ gsl_histogram2d *h = NULL;
426
+ Data_Get_Struct(obj, gsl_histogram2d, h);
427
+ return rb_float_new(gsl_histogram2d_sum(h));
428
+ }
429
+ #endif
430
+
431
+ /* singleton */
432
+ static VALUE rb_gsl_histogram2d_equal_bins_p(VALUE obj, VALUE hh1, VALUE hh2)
433
+ {
434
+ gsl_histogram2d *h1 = NULL, *h2 = NULL;
435
+ CHECK_HISTOGRAM2D(hh1); CHECK_HISTOGRAM2D(hh2);
436
+ Data_Get_Struct(hh1, gsl_histogram2d, h1);
437
+ Data_Get_Struct(hh2, gsl_histogram2d, h2);
438
+ return INT2FIX(gsl_histogram2d_equal_bins_p(h1, h2));
439
+ }
440
+
441
+ static VALUE rb_gsl_histogram2d_equal_bins_p2(VALUE obj, VALUE hh1, VALUE hh2)
442
+ {
443
+ gsl_histogram2d *h1 = NULL, *h2 = NULL;
444
+ CHECK_HISTOGRAM2D(hh1); CHECK_HISTOGRAM2D(hh2);
445
+ Data_Get_Struct(hh1, gsl_histogram2d, h1);
446
+ Data_Get_Struct(hh2, gsl_histogram2d, h2);
447
+ if (gsl_histogram2d_equal_bins_p(h1, h2)) return Qtrue;
448
+ else return Qfalse;
449
+ }
450
+
451
+ static VALUE rb_gsl_histogram2d_scale(VALUE obj, VALUE s)
452
+ {
453
+ gsl_histogram2d *h = NULL;
454
+ Need_Float(s);
455
+ Data_Get_Struct(obj, gsl_histogram2d, h);
456
+ gsl_histogram2d_scale(h, NUM2DBL(s));
457
+ return obj;
458
+ }
459
+
460
+ static VALUE rb_gsl_histogram2d_shift(VALUE obj, VALUE s)
461
+ {
462
+ gsl_histogram2d *h = NULL;
463
+ Need_Float(s);
464
+ Data_Get_Struct(obj, gsl_histogram2d, h);
465
+ gsl_histogram2d_shift(h, NUM2DBL(s));
466
+ return obj;
467
+ }
468
+
469
+ /*****/
470
+ static VALUE rb_gsl_histogram2d_add(VALUE obj, VALUE hh2)
471
+ {
472
+ gsl_histogram2d *h1 = NULL, *h2 = NULL, *hnew = NULL;
473
+ Data_Get_Struct(obj, gsl_histogram2d, h1);
474
+ hnew = gsl_histogram2d_clone(h1);
475
+ if (HISTOGRAM2D_P(hh2)) {
476
+ Data_Get_Struct(hh2, gsl_histogram2d, h2);
477
+ gsl_histogram2d_add(hnew, h2);
478
+ } else {
479
+ Need_Float(hh2);
480
+ gsl_histogram2d_shift(hnew, NUM2DBL(hh2));
481
+ }
482
+ return Data_Wrap_Struct(CLASS_OF(h1), 0, gsl_histogram2d_free, hnew);
483
+ }
484
+
485
+ static VALUE rb_gsl_histogram2d_sub(VALUE obj, VALUE hh2)
486
+ {
487
+ gsl_histogram2d *h1 = NULL, *h2 = NULL, *hnew = NULL;
488
+ Data_Get_Struct(obj, gsl_histogram2d, h1);
489
+ hnew = gsl_histogram2d_clone(h1);
490
+ if (HISTOGRAM2D_P(hh2)) {
491
+ Data_Get_Struct(hh2, gsl_histogram2d, h2);
492
+ gsl_histogram2d_sub(hnew, h2);
493
+ } else {
494
+ Need_Float(hh2);
495
+ gsl_histogram2d_shift(hnew, -NUM2DBL(hh2));
496
+ }
497
+ return Data_Wrap_Struct(CLASS_OF(h1), 0, gsl_histogram2d_free, hnew);
498
+ }
499
+
500
+ static VALUE rb_gsl_histogram2d_mul(VALUE obj, VALUE hh2)
501
+ {
502
+ gsl_histogram2d *h1 = NULL, *h2 = NULL, *hnew = NULL;
503
+ Data_Get_Struct(obj, gsl_histogram2d, h1);
504
+ hnew = gsl_histogram2d_clone(h1);
505
+ if (HISTOGRAM2D_P(hh2)) {
506
+ Data_Get_Struct(hh2, gsl_histogram2d, h2);
507
+ gsl_histogram2d_mul(hnew, h2);
508
+ } else {
509
+ Need_Float(hh2);
510
+ gsl_histogram2d_scale(hnew, NUM2DBL(hh2));
511
+ }
512
+ return Data_Wrap_Struct(CLASS_OF(h1), 0, gsl_histogram2d_free, hnew);
513
+ }
514
+
515
+ static VALUE rb_gsl_histogram2d_div(VALUE obj, VALUE hh2)
516
+ {
517
+ gsl_histogram2d *h1 = NULL, *h2 = NULL, *hnew = NULL;
518
+ Data_Get_Struct(obj, gsl_histogram2d, h1);
519
+ hnew = gsl_histogram2d_clone(h1);
520
+ if (HISTOGRAM2D_P(hh2)) {
521
+ Data_Get_Struct(hh2, gsl_histogram2d, h2);
522
+ gsl_histogram2d_div(hnew, h2);
523
+ } else {
524
+ Need_Float(hh2);
525
+ gsl_histogram2d_scale(hnew, 1.0/NUM2DBL(hh2));
526
+ }
527
+ return Data_Wrap_Struct(CLASS_OF(h1), 0, gsl_histogram2d_free, hnew);
528
+ }
529
+
530
+ static VALUE rb_gsl_histogram2d_scale2(VALUE obj, VALUE val)
531
+ {
532
+ gsl_histogram2d *h1 = NULL, *hnew = NULL;
533
+ Need_Float(val);
534
+ Data_Get_Struct(obj, gsl_histogram2d, h1);
535
+ hnew = gsl_histogram2d_clone(h1);
536
+ gsl_histogram2d_scale(hnew, NUM2DBL(val));
537
+ return Data_Wrap_Struct(CLASS_OF(h1), 0, gsl_histogram2d_free, hnew);
538
+ }
539
+
540
+ static VALUE rb_gsl_histogram2d_shift2(VALUE obj, VALUE val)
541
+ {
542
+ gsl_histogram2d *h1 = NULL, *hnew = NULL;
543
+ Need_Float(val);
544
+ Data_Get_Struct(obj, gsl_histogram2d, h1);
545
+ hnew = gsl_histogram2d_clone(h1);
546
+ gsl_histogram2d_shift(hnew, NUM2DBL(val));
547
+ return Data_Wrap_Struct(CLASS_OF(h1), 0, gsl_histogram2d_free, hnew);
548
+ }
549
+
550
+ static VALUE rb_gsl_histogram2d_fwrite(VALUE obj, VALUE io)
551
+ {
552
+ gsl_histogram2d *h = NULL;
553
+ FILE *f;
554
+ int status, flag = 0;
555
+ Data_Get_Struct(obj, gsl_histogram2d, h);
556
+ f = rb_gsl_open_writefile(io, &flag);
557
+ status = gsl_histogram2d_fwrite(f, h);
558
+ if (flag == 1) fclose(f);
559
+ return INT2FIX(status);
560
+ }
561
+
562
+ static VALUE rb_gsl_histogram2d_fread(VALUE obj, VALUE io)
563
+ {
564
+ gsl_histogram2d *h = NULL;
565
+ FILE *f = NULL;
566
+ int status, flag = 0;
567
+ Data_Get_Struct(obj, gsl_histogram2d, h);
568
+ f = rb_gsl_open_readfile(io, &flag);
569
+ status = gsl_histogram2d_fread(f, h);
570
+ if (flag == 1) fclose(f);
571
+ return INT2FIX(status);
572
+ }
573
+
574
+ static VALUE rb_gsl_histogram2d_fprintf(int argc, VALUE *argv, VALUE obj)
575
+ {
576
+ gsl_histogram2d *h = NULL;
577
+ FILE *fp;
578
+ int status, flag = 0;
579
+ if (argc != 1 && argc != 3) {
580
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 3)", argc);
581
+ }
582
+ Data_Get_Struct(obj, gsl_histogram2d, h);
583
+ fp = rb_gsl_open_writefile(argv[0], &flag);
584
+ if (argc == 3) {
585
+ Check_Type(argv[1], T_STRING);
586
+ Check_Type(argv[2], T_STRING);
587
+ status = gsl_histogram2d_fprintf(fp, h, STR2CSTR(argv[1]), STR2CSTR(argv[2]));
588
+ } else {
589
+ status = gsl_histogram2d_fprintf(fp, h, "%g", "%g");
590
+ }
591
+ if (flag == 1) fclose(fp);
592
+ return INT2FIX(status);
593
+ }
594
+
595
+ static VALUE rb_gsl_histogram2d_fscanf(VALUE obj, VALUE io)
596
+ {
597
+ gsl_histogram2d *h = NULL;
598
+ FILE *fp;
599
+ int status, flag = 0;
600
+ Data_Get_Struct(obj, gsl_histogram2d, h);
601
+ fp = rb_gsl_open_readfile(io, &flag);
602
+ status = gsl_histogram2d_fscanf(fp, h);
603
+ if (flag == 1) fclose(fp);
604
+ return INT2FIX(status);
605
+ }
606
+
607
+ static VALUE rb_gsl_histogram2d_reset(VALUE obj)
608
+ {
609
+ gsl_histogram2d *h = NULL;
610
+ Data_Get_Struct(obj, gsl_histogram2d, h);
611
+ gsl_histogram2d_reset(h);
612
+ return obj;
613
+ }
614
+
615
+ #ifdef GSL_0_9_4_LATER
616
+ static VALUE rb_gsl_histogram2d_pdf_alloc(VALUE klass, VALUE nx, VALUE ny)
617
+ {
618
+ gsl_histogram2d_pdf *h = NULL;
619
+ CHECK_FIXNUM(nx); CHECK_FIXNUM(ny);
620
+ h = gsl_histogram2d_pdf_alloc(FIX2INT(nx), FIX2INT(ny));
621
+ return Data_Wrap_Struct(klass, 0, gsl_histogram2d_pdf_free, h);
622
+ }
623
+
624
+ static VALUE rb_gsl_histogram2d_pdf_init(VALUE obj, VALUE hh)
625
+ {
626
+ gsl_histogram2d_pdf *pdf = NULL;
627
+ gsl_histogram2d *h = NULL;
628
+ CHECK_HISTOGRAM2D(hh);
629
+ Data_Get_Struct(obj, gsl_histogram2d_pdf, pdf);
630
+ Data_Get_Struct(hh, gsl_histogram2d, h);
631
+ gsl_histogram2d_pdf_init(pdf, h);
632
+ return obj;
633
+ }
634
+ #else
635
+ static VALUE rb_gsl_histogram2d_pdf_alloc(VALUE klass, VALUE hhh)
636
+ {
637
+ gsl_histogram2d_pdf *h = NULL;
638
+ gsl_histogram2d *hh;
639
+ Data_Get_Struct(hhh, gsl_histogram2d, hh);
640
+ h = gsl_histogram2d_pdf_alloc(hh);
641
+ return Data_Wrap_Struct(klass, 0, gsl_histogram2d_pdf_free, h);
642
+ }
643
+
644
+ #endif
645
+
646
+ static VALUE rb_gsl_histogram2d_pdf_sample(VALUE obj, VALUE r1, VALUE r2)
647
+ {
648
+ gsl_histogram2d_pdf *pdf = NULL;
649
+ double x, y;
650
+ Need_Float(r1); Need_Float(r2);
651
+ Data_Get_Struct(obj, gsl_histogram2d_pdf, pdf);
652
+ gsl_histogram2d_pdf_sample(pdf, NUM2DBL(r1), NUM2DBL(r2), &x, &y);
653
+ return rb_ary_new3(2, rb_float_new(x), rb_float_new(y));
654
+ }
655
+
656
+ static VALUE rb_gsl_histogram2d_xrange(VALUE obj)
657
+ {
658
+ gsl_histogram2d *h = NULL;
659
+ gsl_vector_view *v = NULL;
660
+ Data_Get_Struct(obj, gsl_histogram2d, h);
661
+ v = gsl_vector_view_alloc(h->nx);
662
+ v->vector.data = h->xrange;
663
+ v->vector.size = h->nx + 1;
664
+ v->vector.stride = 1;
665
+ return Data_Wrap_Struct(cgsl_histogram_range, 0, gsl_vector_view_free, v);
666
+ }
667
+
668
+ static VALUE rb_gsl_histogram2d_yrange(VALUE obj)
669
+ {
670
+ gsl_histogram2d *h = NULL;
671
+ gsl_vector_view *v = NULL;
672
+ Data_Get_Struct(obj, gsl_histogram2d, h);
673
+ v = gsl_vector_view_alloc(h->ny);
674
+ v->vector.data = h->yrange;
675
+ v->vector.size = h->ny + 1;
676
+ v->vector.stride = 1;
677
+ return Data_Wrap_Struct(cgsl_histogram_range, 0, gsl_vector_view_free, v);
678
+ }
679
+
680
+ static VALUE rb_gsl_histogram2d_bin(VALUE obj)
681
+ {
682
+ gsl_histogram2d *h = NULL;
683
+ gsl_vector_view *v = NULL;
684
+ Data_Get_Struct(obj, gsl_histogram2d, h);
685
+ v = gsl_vector_view_alloc(h->nx*h->ny);
686
+ v->vector.data = h->bin;
687
+ v->vector.size = h->nx*h->ny;
688
+ v->vector.stride = 1;
689
+ return Data_Wrap_Struct(cgsl_histogram_bin, 0, gsl_vector_view_free, v);
690
+ }
691
+
692
+ void mygsl_histogram2d_yproject(const gsl_histogram2d *h2, size_t istart,
693
+ size_t iend, gsl_histogram *h)
694
+ {
695
+ size_t i, j;
696
+ double sum;
697
+ for (j = 0; j < h2->ny; j++) {
698
+ sum = 0.0;
699
+ for (i = istart; i <= iend; i++) {
700
+ if (i >= h2->nx) break;
701
+ sum += gsl_histogram2d_get(h2, i, j);
702
+ }
703
+ h->bin[j] = sum;
704
+ }
705
+ }
706
+
707
+ gsl_histogram* mygsl_histogram2d_calloc_yproject(const gsl_histogram2d *h2,
708
+ size_t istart, size_t iend)
709
+ {
710
+ gsl_histogram *h;
711
+ h = gsl_histogram_calloc_range(h2->ny, h2->yrange);
712
+ mygsl_histogram2d_yproject(h2, istart, iend, h);
713
+ return h;
714
+ }
715
+
716
+ void mygsl_histogram2d_xproject(const gsl_histogram2d *h2, size_t jstart,
717
+ size_t jend, gsl_histogram *h)
718
+ {
719
+ size_t i, j;
720
+ double sum;
721
+ for (i = 0; i < h2->nx; i++) {
722
+ sum = 0.0;
723
+ for (j = jstart; j <= jend; j++) {
724
+ if (j >= h2->ny) break;
725
+ sum += gsl_histogram2d_get(h2, i, j);
726
+ }
727
+ h->bin[i] = sum;
728
+ }
729
+ }
730
+
731
+ gsl_histogram* mygsl_histogram2d_calloc_xproject(const gsl_histogram2d *h2,
732
+ size_t jstart, size_t jend)
733
+ {
734
+ gsl_histogram *h;
735
+ h = gsl_histogram_calloc_range(h2->nx, h2->xrange);
736
+ mygsl_histogram2d_xproject(h2, jstart, jend, h);
737
+ return h;
738
+ }
739
+
740
+ static VALUE rb_gsl_histogram2d_xproject(int argc, VALUE *argv, VALUE obj)
741
+ {
742
+ gsl_histogram2d *h2 = NULL;
743
+ gsl_histogram *h = NULL;
744
+ size_t jstart = 0, jend;
745
+ Data_Get_Struct(obj, gsl_histogram2d, h2);
746
+ switch (argc) {
747
+ case 2:
748
+ jstart = (size_t) FIX2INT(argv[0]);
749
+ jend = (size_t) FIX2INT(argv[1]);
750
+ break;
751
+ case 1:
752
+ jstart = (size_t) FIX2INT(argv[0]);
753
+ jend = h2->ny;
754
+ break;
755
+ case 0:
756
+ jend = h2->ny;
757
+ break;
758
+ default:
759
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0-2)", argc);
760
+ break;
761
+ }
762
+ h = mygsl_histogram2d_calloc_xproject(h2, jstart, jend);
763
+ return Data_Wrap_Struct(cgsl_histogram, 0, gsl_histogram_free, h);
764
+ }
765
+
766
+ static VALUE rb_gsl_histogram2d_yproject(int argc, VALUE *argv, VALUE obj)
767
+ {
768
+ gsl_histogram2d *h2 = NULL;
769
+ gsl_histogram *h = NULL;
770
+ size_t istart = 0, iend;
771
+ Data_Get_Struct(obj, gsl_histogram2d, h2);
772
+ switch (argc) {
773
+ case 2:
774
+ istart = (size_t) FIX2INT(argv[0]);
775
+ iend = (size_t) FIX2INT(argv[1]);
776
+ break;
777
+ case 1:
778
+ istart = (size_t) FIX2INT(argv[0]);
779
+ iend = h2->ny;
780
+ break;
781
+ case 0:
782
+ iend = h2->ny;
783
+ break;
784
+ default:
785
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0-2)", argc);
786
+ break;
787
+ }
788
+ h = mygsl_histogram2d_calloc_yproject(h2, istart, iend);
789
+ return Data_Wrap_Struct(cgsl_histogram, 0, gsl_histogram_free, h);
790
+ }
791
+
792
+ static int mygsl_histogram2d_fread2(FILE * stream, gsl_histogram2d * h)
793
+ {
794
+ double xmin, xmax, ymin, ymax;
795
+ int status;
796
+ status = gsl_block_raw_fread(stream, &xmin, 1, 1);
797
+ if (status) return status;
798
+ status = gsl_block_raw_fread(stream, &xmax, 1, 1);
799
+ if (status) return status;
800
+ status = gsl_block_raw_fread(stream, &ymin, 1, 1);
801
+ if (status) return status;
802
+ status = gsl_block_raw_fread(stream, &ymax, 1, 1);
803
+ if (status) return status;
804
+ gsl_histogram2d_set_ranges_uniform(h, xmin, xmax, ymin, ymax);
805
+ status = gsl_block_raw_fread (stream, h->bin, h->nx*h->ny, 1);
806
+ if (status) return status;
807
+ return status;
808
+ }
809
+
810
+ static int mygsl_histogram2d_fwrite2(FILE * stream, const gsl_histogram2d * h)
811
+ {
812
+ int status;
813
+ status = gsl_block_raw_fwrite (stream, h->xrange, 1, 1);
814
+ if (status) return status;
815
+ status = gsl_block_raw_fwrite (stream, h->xrange+h->nx, 1, 1);
816
+ if (status) return status;
817
+ status = gsl_block_raw_fwrite (stream, h->yrange, 1, 1);
818
+ if (status) return status;
819
+ status = gsl_block_raw_fwrite (stream, h->yrange+h->ny, 1, 1);
820
+ if (status) return status;
821
+ status = gsl_block_raw_fwrite (stream, h->bin, h->nx*h->ny, 1);
822
+ return status;
823
+ }
824
+
825
+ static VALUE rb_gsl_histogram2d_fwrite2(VALUE obj, VALUE io)
826
+ {
827
+ gsl_histogram2d *h = NULL;
828
+ FILE *f;
829
+ int status, flag = 0;
830
+ Data_Get_Struct(obj, gsl_histogram2d, h);
831
+ f = rb_gsl_open_writefile(io, &flag);
832
+ status = mygsl_histogram2d_fwrite2(f, h);
833
+ if (flag == 1) fclose(f);
834
+ return INT2FIX(status);
835
+ }
836
+
837
+ static VALUE rb_gsl_histogram2d_fread2(VALUE obj, VALUE io)
838
+ {
839
+ gsl_histogram2d *h = NULL;
840
+ FILE *f;
841
+ int status, flag = 0;
842
+ Data_Get_Struct(obj, gsl_histogram2d, h);
843
+ f = rb_gsl_open_readfile(io, &flag);
844
+ status = mygsl_histogram2d_fread2(f, h);
845
+ if (flag == 1) fclose(f);
846
+ return INT2FIX(status);
847
+ }
848
+
849
+ static gsl_histogram2d* mygsl_histogram2d_calloc_integrate(const gsl_histogram2d *h,
850
+ int flag)
851
+ {
852
+ gsl_histogram2d *hi;
853
+ size_t i, j, k;
854
+ size_t nx = h->nx, ny = h->ny, n = h->nx*h->ny;
855
+ hi = gsl_histogram2d_calloc(nx, ny);
856
+ gsl_histogram2d_set_ranges(hi, h->xrange, nx+1, h->yrange, ny+1);
857
+ if (flag == -1) {
858
+ hi->bin[n-1] = h->bin[n-1];
859
+ i = nx - 1;
860
+ for (j = ny-2, k = 0; j >= 0; j--, k++) {
861
+ hi->bin[n-1-k] = gsl_histogram2d_get(hi, i, j+1) + gsl_histogram2d_get(h, i, j);
862
+ if (j == 0) break;
863
+ }
864
+ j = ny - 1;
865
+ for (i = nx-2; i >= 0; i--) {
866
+ hi->bin[i*ny + j] = gsl_histogram2d_get(hi, i+1, j) + gsl_histogram2d_get(h, i, j);
867
+ if (i == 0) break;
868
+ }
869
+ for (i = nx-2; i >= 0; i--) {
870
+ for (j = ny-2; j >= 0; j--) {
871
+ hi->bin[i*ny+j] = ((gsl_histogram2d_get(hi, i+1, j)
872
+ + gsl_histogram2d_get(hi, i, j+1))
873
+ - gsl_histogram2d_get(hi, i+1, j+1))
874
+ + gsl_histogram2d_get(h, i, j);
875
+ if (j == 0) break;
876
+ }
877
+ if (i == 0) break;
878
+ }
879
+ } else {
880
+ hi->bin[0] = h->bin[0];
881
+ for (j = 1; j < ny; j++) hi->bin[j] = gsl_histogram2d_get(hi, 0, j-1)
882
+ + gsl_histogram2d_get(h, 0, j);
883
+ for (i = 1; i < nx; i++) hi->bin[i*ny] = gsl_histogram2d_get(hi, i-1, 0)
884
+ + gsl_histogram2d_get(h, i, 0);
885
+ for (i = 1; i < nx; i++) {
886
+ for (j = 1; j < ny; j++) {
887
+ hi->bin[i*ny+j] = ((gsl_histogram2d_get(hi, i-1, j)
888
+ + gsl_histogram2d_get(hi, i, j-1))
889
+ - gsl_histogram2d_get(hi, i-1, j-1))
890
+ + gsl_histogram2d_get(h, i, j);
891
+ }
892
+ }
893
+ }
894
+ return hi;
895
+ }
896
+
897
+ static VALUE rb_gsl_histogram2d_integrate(int argc, VALUE *argv, VALUE obj)
898
+ {
899
+ gsl_histogram2d *h = NULL, *hi = NULL;
900
+ int flag;
901
+ Data_Get_Struct(obj, gsl_histogram2d, h);
902
+ switch (argc) {
903
+ case 0:
904
+ flag = 1;
905
+ break;
906
+ case 1:
907
+ flag = FIX2INT(argv[0]);
908
+ break;
909
+ default:
910
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc);
911
+ break;
912
+ }
913
+ hi = mygsl_histogram2d_calloc_integrate(h, flag);
914
+ return Data_Wrap_Struct(cgsl_histogram2d_integ, 0, gsl_histogram2d_free, hi);
915
+ }
916
+
917
+ static VALUE rb_gsl_histogram2d_normalize_bang(VALUE obj)
918
+ {
919
+ gsl_histogram2d *h = NULL;
920
+ double scale;
921
+ Data_Get_Struct(obj, gsl_histogram2d, h);
922
+ if (CLASS_OF(obj) == cgsl_histogram2d_integ)
923
+ scale = 1.0/h->bin[h->nx*h->ny-1];
924
+ else
925
+ scale = 1.0/gsl_histogram2d_sum(h);
926
+ gsl_histogram2d_scale(h, scale);
927
+ return obj;
928
+ }
929
+
930
+ static VALUE rb_gsl_histogram2d_normalize(VALUE obj)
931
+ {
932
+ gsl_histogram2d *h = NULL, *hnew = NULL;
933
+ Data_Get_Struct(obj, gsl_histogram2d, h);
934
+ hnew = gsl_histogram2d_clone(h);
935
+ return rb_gsl_histogram2d_normalize_bang(Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_histogram2d_free, hnew));
936
+ }
937
+
938
+ void Init_gsl_histogram2d(VALUE module)
939
+ {
940
+ VALUE cgsl_histogram2d_pdf;
941
+
942
+ cgsl_histogram2d = rb_define_class_under(module, "Histogram2d", cGSL_Object);
943
+ cgsl_histogram2d_view = rb_define_class_under(cgsl_histogram2d, "View",
944
+ cgsl_histogram);
945
+
946
+ cgsl_histogram2d_integ = rb_define_class_under(cgsl_histogram2d, "Integral",
947
+ cgsl_histogram2d);
948
+ #ifdef GSL_0_9_4_LATER
949
+ /* rb_define_singleton_method(cgsl_histogram2d, "new", rb_gsl_histogram2d_alloc, -1);*/
950
+ rb_define_singleton_method(cgsl_histogram2d, "alloc", rb_gsl_histogram2d_alloc, -1);
951
+ rb_define_singleton_method(cgsl_histogram2d, "new_uniform",
952
+ rb_gsl_histogram2d_alloc_uniform, -1);
953
+ rb_define_singleton_method(cgsl_histogram2d, "alloc_uniform",
954
+ rb_gsl_histogram2d_alloc_uniform, -1);
955
+ #endif
956
+
957
+ rb_define_singleton_method(cgsl_histogram2d, "equal_bins_p",
958
+ rb_gsl_histogram2d_equal_bins_p, 2);
959
+ rb_define_singleton_method(cgsl_histogram2d, "equal_bins_p?",
960
+ rb_gsl_histogram2d_equal_bins_p2, 2);
961
+
962
+ rb_define_method(cgsl_histogram2d, "set_ranges",
963
+ rb_gsl_histogram2d_set_ranges, -1);
964
+ rb_define_method(cgsl_histogram2d, "set_ranges_uniform",
965
+ rb_gsl_histogram2d_set_ranges_uniform, -1);
966
+
967
+ rb_define_singleton_method(cgsl_histogram2d, "memcpy",
968
+ rb_gsl_histogram2d_memcpy, 2);
969
+ rb_define_method(cgsl_histogram2d, "clone", rb_gsl_histogram2d_clone, 0);
970
+ rb_define_alias(cgsl_histogram2d, "duplicate", "clone");
971
+ rb_define_method(cgsl_histogram2d, "increment",
972
+ rb_gsl_histogram2d_accumulate, -1);
973
+ rb_define_alias(cgsl_histogram2d, "fill", "increment");
974
+ rb_define_alias(cgsl_histogram2d, "accumulate", "increment");
975
+
976
+ rb_define_method(cgsl_histogram2d, "increment2",
977
+ rb_gsl_histogram2d_accumulate2, -1);
978
+ rb_define_alias(cgsl_histogram2d, "accumulate2", "increment2");
979
+ rb_define_alias(cgsl_histogram2d, "fill2", "increment2");
980
+
981
+ rb_define_method(cgsl_histogram2d, "get", rb_gsl_histogram2d_get, -1);
982
+ rb_define_alias(cgsl_histogram2d, "[]", "get");
983
+
984
+ rb_define_method(cgsl_histogram2d, "get_xrange", rb_gsl_histogram2d_get_xrange, 1);
985
+ rb_define_method(cgsl_histogram2d, "get_yrange", rb_gsl_histogram2d_get_yrange, 1);
986
+ rb_define_method(cgsl_histogram2d, "xmax", rb_gsl_histogram2d_xmax, 0);
987
+ rb_define_method(cgsl_histogram2d, "xmin", rb_gsl_histogram2d_xmin, 0);
988
+ rb_define_method(cgsl_histogram2d, "ymax", rb_gsl_histogram2d_ymax, 0);
989
+ rb_define_method(cgsl_histogram2d, "ymin", rb_gsl_histogram2d_ymin, 0);
990
+ rb_define_method(cgsl_histogram2d, "nx", rb_gsl_histogram2d_nx, 0);
991
+ rb_define_method(cgsl_histogram2d, "ny", rb_gsl_histogram2d_ny, 0);
992
+
993
+ rb_define_method(cgsl_histogram2d, "find", rb_gsl_histogram2d_find, 2);
994
+
995
+ rb_define_method(cgsl_histogram2d, "max_val", rb_gsl_histogram2d_max_val, 0);
996
+ rb_define_method(cgsl_histogram2d, "max_bin", rb_gsl_histogram2d_max_bin, 0);
997
+ rb_define_method(cgsl_histogram2d, "min_val", rb_gsl_histogram2d_min_val, 0);
998
+ rb_define_method(cgsl_histogram2d, "min_bin", rb_gsl_histogram2d_min_bin, 0);
999
+
1000
+ #ifdef GSL_1_1_LATER
1001
+ rb_define_method(cgsl_histogram2d, "xmean", rb_gsl_histogram2d_xmean, 0);
1002
+ rb_define_method(cgsl_histogram2d, "ymean", rb_gsl_histogram2d_ymean, 0);
1003
+ rb_define_method(cgsl_histogram2d, "xsigma", rb_gsl_histogram2d_xsigma, 0);
1004
+ rb_define_method(cgsl_histogram2d, "ysigma", rb_gsl_histogram2d_ysigma, 0);
1005
+ rb_define_method(cgsl_histogram2d, "cov", rb_gsl_histogram2d_cov, 0);
1006
+ rb_define_method(cgsl_histogram2d, "sum", rb_gsl_histogram2d_sum, 0);
1007
+ rb_define_alias(cgsl_histogram2d, "integral", "sum");
1008
+ #endif
1009
+
1010
+ rb_define_method(cgsl_histogram2d, "add", rb_gsl_histogram2d_add, 1);
1011
+ rb_define_alias(cgsl_histogram2d, "+", "add");
1012
+ rb_define_method(cgsl_histogram2d, "sub", rb_gsl_histogram2d_sub, 1);
1013
+ rb_define_alias(cgsl_histogram2d, "-", "sub");
1014
+ rb_define_method(cgsl_histogram2d, "mul", rb_gsl_histogram2d_mul, 1);
1015
+ rb_define_alias(cgsl_histogram2d, "*", "mul");
1016
+ rb_define_method(cgsl_histogram2d, "div", rb_gsl_histogram2d_div, 1);
1017
+ rb_define_alias(cgsl_histogram2d, "/", "div");
1018
+ rb_define_method(cgsl_histogram2d, "scale", rb_gsl_histogram2d_scale2, 1);
1019
+ rb_define_method(cgsl_histogram2d, "shift", rb_gsl_histogram2d_shift2, 1);
1020
+
1021
+ rb_define_method(cgsl_histogram2d, "scale!", rb_gsl_histogram2d_scale, 1);
1022
+ rb_define_method(cgsl_histogram2d, "shift!", rb_gsl_histogram2d_shift, 1);
1023
+
1024
+ rb_define_method(cgsl_histogram2d, "fwrite", rb_gsl_histogram2d_fwrite, 1);
1025
+ rb_define_method(cgsl_histogram2d, "fread", rb_gsl_histogram2d_fread, 1);
1026
+ rb_define_method(cgsl_histogram2d, "fwrite2", rb_gsl_histogram2d_fwrite2, 1);
1027
+ rb_define_method(cgsl_histogram2d, "fread2", rb_gsl_histogram2d_fread2, 1);
1028
+ rb_define_method(cgsl_histogram2d, "fprintf", rb_gsl_histogram2d_fprintf, -1);
1029
+ rb_define_method(cgsl_histogram2d, "fscanf", rb_gsl_histogram2d_fscanf, 3);
1030
+
1031
+ cgsl_histogram2d_pdf = rb_define_class_under(cgsl_histogram2d, "Pdf", cGSL_Object);
1032
+ #ifdef GSL_0_9_4_LATER
1033
+ /* rb_define_singleton_method(cgsl_histogram2d_pdf, "new",
1034
+ rb_gsl_histogram2d_pdf_alloc, 2);*/
1035
+ rb_define_singleton_method(cgsl_histogram2d_pdf, "alloc",
1036
+ rb_gsl_histogram2d_pdf_alloc, 2);
1037
+ rb_define_method(cgsl_histogram2d_pdf, "init", rb_gsl_histogram2d_pdf_init, 1);
1038
+ #else
1039
+ /* rb_define_singleton_method(cgsl_histogram2d_pdf, "new",
1040
+ rb_gsl_histogram2d_pdf_alloc, 1);*/
1041
+ rb_define_singleton_method(cgsl_histogram2d_pdf, "alloc",
1042
+ rb_gsl_histogram2d_pdf_alloc, 1);
1043
+ #endif
1044
+
1045
+ rb_define_method(cgsl_histogram2d_pdf, "sample", rb_gsl_histogram2d_pdf_sample, 2);
1046
+
1047
+ rb_define_method(cgsl_histogram2d, "xrange", rb_gsl_histogram2d_xrange, 0);
1048
+ rb_define_method(cgsl_histogram2d, "yrange", rb_gsl_histogram2d_yrange, 0);
1049
+ rb_define_method(cgsl_histogram2d, "bin", rb_gsl_histogram2d_bin, 0);
1050
+
1051
+ rb_define_method(cgsl_histogram2d, "reset", rb_gsl_histogram2d_reset, 0);
1052
+ rb_define_method(cgsl_histogram2d, "xproject", rb_gsl_histogram2d_xproject, -1);
1053
+ rb_define_method(cgsl_histogram2d, "yproject", rb_gsl_histogram2d_yproject, -1);
1054
+
1055
+ rb_define_method(cgsl_histogram2d, "integrate", rb_gsl_histogram2d_integrate, -1);
1056
+ rb_undef_method(cgsl_histogram2d_integ, "integrate");
1057
+
1058
+ rb_define_method(cgsl_histogram2d, "normalize", rb_gsl_histogram2d_normalize, 0);
1059
+ rb_define_method(cgsl_histogram2d, "normalize!", rb_gsl_histogram2d_normalize_bang, 0);
1060
+ }
1061
+
1062
+ #ifdef HISTOGRAM2D_P
1063
+ #undef HISTOGRAM2D_P
1064
+ #endif
1065
+ #ifdef CHECK_HISTOGRAM2D
1066
+ #undef CHECK_HISTOGRAM2D
1067
+ #endif
1068
+