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,171 @@
1
+ /*
2
+ qrng.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
+ #include "rb_gsl_config.h"
12
+ #include "rb_gsl_rng.h"
13
+ #include "rb_gsl_array.h"
14
+ #include <gsl/gsl_qrng.h>
15
+ #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
16
+ #include <qrngextra/qrngextra.h>
17
+ #endif
18
+
19
+ enum rb_gsl_qrng_generator {
20
+ GSL_QRNG_NIEDERREITER_2,
21
+ GSL_QRNG_SOBOL,
22
+ GSL_QRNG_HALTON,
23
+ GSL_QRNG_REVERSEHALTON,
24
+ #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
25
+ GSL_QRNG_HDSOBOL,
26
+ #endif
27
+ };
28
+
29
+ static const gsl_qrng_type* get_gsl_qrng_type(VALUE t);
30
+
31
+ static const gsl_qrng_type* get_gsl_qrng_type(VALUE t)
32
+ {
33
+ const gsl_qrng_type *T;
34
+ char name[32];
35
+
36
+ switch (TYPE(t)) {
37
+ case T_STRING:
38
+ strcpy(name, STR2CSTR(t));
39
+ if (strstr(name, "niederreiter_2")) return T = gsl_qrng_niederreiter_2;
40
+ #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
41
+ else if (strstr(name, "hdsobol")) return T = qrngextra_hdsobol;
42
+ #endif
43
+ else if (strstr(name, "sobol")) return T = gsl_qrng_sobol;
44
+ #ifdef GSL_1_11_LATER
45
+ else if (strstr(name, "reversehalton")) return T = gsl_qrng_reversehalton;
46
+ else if (strstr(name, "halton")) return T = gsl_qrng_halton;
47
+
48
+ #endif
49
+ else rb_raise(rb_eArgError, "unknown type");
50
+ break;
51
+ case T_FIXNUM:
52
+ switch (FIX2INT(t)) {
53
+ case GSL_QRNG_NIEDERREITER_2: T = gsl_qrng_niederreiter_2; break;
54
+ case GSL_QRNG_SOBOL: T = gsl_qrng_sobol; break;
55
+ #ifdef GSL_1_11_LATER
56
+ case GSL_QRNG_HALTON: T = gsl_qrng_halton; break;
57
+ case GSL_QRNG_REVERSEHALTON: T = gsl_qrng_reversehalton; break;
58
+ #endif
59
+ #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
60
+ case GSL_QRNG_HDSOBOL: T = qrngextra_hdsobol; break;
61
+ #endif
62
+ default:
63
+ rb_raise(rb_eArgError, "unknown type");
64
+ }
65
+ break;
66
+ default:
67
+ rb_raise(rb_eTypeError, "wrong argument type %s (String or Fixnum expected)",
68
+ rb_class2name(CLASS_OF(t)));
69
+ }
70
+ return T;
71
+ }
72
+
73
+ static VALUE rb_gsl_qrng_new(VALUE klass, VALUE t, VALUE dd)
74
+ {
75
+ unsigned int d;
76
+ gsl_qrng *q;
77
+ const gsl_qrng_type *T;
78
+ d = NUM2UINT(dd);
79
+ T = get_gsl_qrng_type(t);
80
+ q = gsl_qrng_alloc(T, d);
81
+ return Data_Wrap_Struct(klass, 0, gsl_qrng_free, q);
82
+ }
83
+
84
+ #ifdef GSL_1_2_LATER
85
+ static VALUE rb_gsl_qrng_init(VALUE obj)
86
+ {
87
+ gsl_qrng *q = NULL;
88
+ Data_Get_Struct(obj, gsl_qrng, q);
89
+ gsl_qrng_init(q);
90
+ return obj;
91
+ }
92
+ #endif
93
+
94
+ static VALUE rb_gsl_qrng_name(VALUE obj)
95
+ {
96
+ gsl_qrng *q = NULL;
97
+ Data_Get_Struct(obj, gsl_qrng, q);
98
+ return rb_str_new2(gsl_qrng_name(q));
99
+ }
100
+
101
+ static VALUE rb_gsl_qrng_size(VALUE obj)
102
+ {
103
+ gsl_qrng *q = NULL;
104
+ Data_Get_Struct(obj, gsl_qrng, q);
105
+ return INT2FIX(gsl_qrng_size(q));
106
+ }
107
+
108
+ static VALUE rb_gsl_qrng_clone(VALUE obj)
109
+ {
110
+ gsl_qrng *q = NULL, *q2 = NULL;
111
+ Data_Get_Struct(obj, gsl_qrng, q);
112
+ q2 = gsl_qrng_clone(q);
113
+ return Data_Wrap_Struct(CLASS_OF(obj), 0, gsl_qrng_free, q2);
114
+ }
115
+
116
+ /* singleton */
117
+ static VALUE rb_gsl_qrng_memcpy(VALUE obj, VALUE dest, VALUE src)
118
+ {
119
+ gsl_qrng *q = NULL, *q2 = NULL;
120
+ Data_Get_Struct(dest, gsl_qrng, q);
121
+ Data_Get_Struct(src, gsl_qrng, q2);
122
+ gsl_qrng_memcpy(q, q2);
123
+ return dest;
124
+ }
125
+
126
+ static VALUE rb_gsl_qrng_get(int argc, VALUE *argv, VALUE obj)
127
+ {
128
+ gsl_qrng *q = NULL;
129
+ gsl_vector *v;
130
+ Data_Get_Struct(obj, gsl_qrng, q);
131
+ if (argc == 0) {
132
+ v = gsl_vector_alloc(q->dimension);
133
+ gsl_qrng_get(q, v->data);
134
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
135
+ } else {
136
+ if (!rb_obj_is_kind_of(argv[0], cgsl_vector)) {
137
+ rb_raise(rb_eArgError, "wrong type argument (GSL_Vector required)");
138
+ }
139
+ Data_Get_Struct(argv[0], gsl_vector, v);
140
+ return INT2FIX(gsl_qrng_get(q, v->data));
141
+ }
142
+ }
143
+
144
+ void Init_gsl_qrng(VALUE module)
145
+ {
146
+ VALUE cgsl_qrng;
147
+ cgsl_qrng = rb_define_class_under(module, "QRng", cGSL_Object);
148
+
149
+ rb_define_singleton_method(cgsl_qrng, "new", rb_gsl_qrng_new, 2);
150
+ rb_define_singleton_method(cgsl_qrng, "alloc", rb_gsl_qrng_new, 2);
151
+ #ifdef GSL_1_2_LATER
152
+ rb_define_method(cgsl_qrng, "init", rb_gsl_qrng_init, 0);
153
+ #endif
154
+ rb_define_method(cgsl_qrng, "name", rb_gsl_qrng_name, 0);
155
+ rb_define_method(cgsl_qrng, "size", rb_gsl_qrng_size, 0);
156
+ rb_define_method(cgsl_qrng, "clone", rb_gsl_qrng_clone, 0);
157
+ rb_define_alias(cgsl_qrng, "duplicate", "clone");
158
+ rb_define_singleton_method(cgsl_qrng, "memcpy", rb_gsl_qrng_memcpy, 2);
159
+
160
+ rb_define_method(cgsl_qrng, "get", rb_gsl_qrng_get, -1);
161
+
162
+ rb_define_const(cgsl_qrng, "NIEDERREITER_2", INT2FIX(GSL_QRNG_NIEDERREITER_2));
163
+ rb_define_const(cgsl_qrng, "SOBOL", INT2FIX(GSL_QRNG_SOBOL));
164
+ #ifdef GSL_1_11_LATER
165
+ rb_define_const(cgsl_qrng, "HALTON", INT2FIX(GSL_QRNG_HALTON));
166
+ rb_define_const(cgsl_qrng, "REVERSEHALTON", INT2FIX(GSL_QRNG_REVERSEHALTON));
167
+ #endif
168
+ #ifdef HAVE_QRNGEXTRA_QRNGEXTRA_H
169
+ rb_define_const(cgsl_qrng, "HDSOBOL", INT2FIX(GSL_QRNG_HDSOBOL));
170
+ #endif
171
+ }
@@ -0,0 +1,1873 @@
1
+ /*
2
+ randist.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
+ #include "rb_gsl_config.h"
12
+ #include "rb_gsl_array.h"
13
+ #include "rb_gsl_common.h"
14
+ #include "rb_gsl_rng.h"
15
+ #include <gsl/gsl_randist.h>
16
+
17
+ VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double));
18
+ VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa, double (*f)(double, double));
19
+ VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
20
+ double (*f)(double, double, double));
21
+ VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
22
+ double (*f)(unsigned int, double));
23
+
24
+ static VALUE rb_gsl_ran_eval0(int argc, VALUE *argv, VALUE obj,
25
+ double (*f)(const gsl_rng*))
26
+ {
27
+ gsl_rng *r;
28
+ switch (TYPE(obj)) {
29
+ case T_MODULE: case T_CLASS: case T_OBJECT:
30
+ switch (argc) {
31
+ case 1:
32
+ CHECK_RNG(argv[0]);
33
+ Data_Get_Struct(argv[0], gsl_rng, r);
34
+ break;
35
+ default:
36
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
37
+ break;
38
+ }
39
+ break;
40
+ default:
41
+ switch (argc) {
42
+ case 0:
43
+ break;
44
+ default:
45
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
46
+ break;
47
+ }
48
+ Data_Get_Struct(obj, gsl_rng, r);
49
+ break;
50
+ }
51
+ return rb_float_new((*f)(r));
52
+ }
53
+
54
+ static VALUE rb_gsl_ran_eval1(int argc, VALUE *argv, VALUE obj,
55
+ double (*f)(const gsl_rng*, double))
56
+ {
57
+ gsl_rng *r;
58
+ gsl_vector *v;
59
+ size_t n, i;
60
+ double a;
61
+ switch (TYPE(obj)) {
62
+ case T_MODULE: case T_CLASS: case T_OBJECT:
63
+ switch (argc) {
64
+ case 3:
65
+ n = NUM2INT(argv[2]);
66
+ a = NUM2DBL(argv[1]);
67
+ CHECK_RNG(argv[0]);
68
+ Data_Get_Struct(argv[0], gsl_rng, r);
69
+ v = gsl_vector_alloc(n);
70
+ for (i = 0; i < n; i++)
71
+ gsl_vector_set(v, i, (*f)(r, a));
72
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
73
+ break;
74
+ case 2:
75
+ CHECK_RNG(argv[0]);
76
+ Data_Get_Struct(argv[0], gsl_rng, r);
77
+ a = NUM2DBL(argv[1]);
78
+ break;
79
+ default:
80
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
81
+ break;
82
+ }
83
+ break;
84
+ default:
85
+ switch (argc) {
86
+ case 2:
87
+ n = NUM2INT(argv[1]);
88
+ a = NUM2DBL(argv[0]);
89
+ Data_Get_Struct(obj, gsl_rng, r);
90
+ v = gsl_vector_alloc(n);
91
+ for (i = 0; i < n; i++)
92
+ gsl_vector_set(v, i, (*f)(r, a));
93
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
94
+ break;
95
+ case 1:
96
+ a = NUM2DBL(argv[0]);
97
+ break;
98
+ default:
99
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
100
+ break;
101
+ }
102
+ Data_Get_Struct(obj, gsl_rng, r);
103
+ break;
104
+ }
105
+ return rb_float_new((*f)(r, a));
106
+ }
107
+
108
+ static VALUE rb_gsl_ran_eval1_uint(int argc, VALUE *argv, VALUE obj,
109
+ unsigned int (*f)(const gsl_rng*, double))
110
+ {
111
+ gsl_rng *r;
112
+ gsl_vector_int *v;
113
+ size_t n, i;
114
+ double a;
115
+ switch (TYPE(obj)) {
116
+ case T_MODULE: case T_CLASS: case T_OBJECT:
117
+ switch (argc) {
118
+ case 3:
119
+ n = NUM2INT(argv[2]);
120
+ a = NUM2DBL(argv[1]);
121
+ CHECK_RNG(argv[0]);
122
+ Data_Get_Struct(argv[0], gsl_rng, r);
123
+ v = gsl_vector_int_alloc(n);
124
+ for (i = 0; i < n; i++)
125
+ gsl_vector_int_set(v, i, (int) (*f)(r, a));
126
+ return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, v);
127
+ break;
128
+ case 2:
129
+ CHECK_RNG(argv[0]);
130
+ Data_Get_Struct(argv[0], gsl_rng, r);
131
+ a = NUM2DBL(argv[1]);
132
+ break;
133
+ default:
134
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
135
+ break;
136
+ }
137
+ break;
138
+ default:
139
+ switch (argc) {
140
+ case 2:
141
+ n = NUM2INT(argv[1]);
142
+ a = NUM2DBL(argv[0]);
143
+ Data_Get_Struct(obj, gsl_rng, r);
144
+ v = gsl_vector_int_alloc(n);
145
+ for (i = 0; i < n; i++)
146
+ gsl_vector_int_set(v, i, (*f)(r, a));
147
+ return Data_Wrap_Struct(cgsl_vector_int, 0, gsl_vector_int_free, v);
148
+ break;
149
+ case 1:
150
+ a = NUM2DBL(argv[0]);
151
+ break;
152
+ default:
153
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
154
+ break;
155
+ }
156
+ Data_Get_Struct(obj, gsl_rng, r);
157
+ break;
158
+ }
159
+ return INT2FIX((*f)(r, a));
160
+ }
161
+
162
+ static VALUE rb_gsl_ran_eval2(int argc, VALUE *argv, VALUE obj,
163
+ double (*f)(const gsl_rng*, double, double))
164
+ {
165
+ gsl_rng *r;
166
+ gsl_vector *v;
167
+ size_t n, i;
168
+ double a, b;
169
+ switch (TYPE(obj)) {
170
+ case T_MODULE: case T_CLASS: case T_OBJECT:
171
+ switch (argc) {
172
+ case 4:
173
+ CHECK_RNG(argv[0]);
174
+ Data_Get_Struct(argv[0], gsl_rng, r);
175
+ a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]);
176
+ n = NUM2INT(argv[3]);
177
+ v = gsl_vector_alloc(n);
178
+ for (i = 0; i < n; i++) gsl_vector_set(v, i, (*f)(r, a, b));
179
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
180
+ break;
181
+ case 3:
182
+ CHECK_RNG(argv[0]);
183
+ Data_Get_Struct(argv[0], gsl_rng, r);
184
+ a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]);
185
+ break;
186
+ default:
187
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
188
+ break;
189
+ }
190
+ break;
191
+ default:
192
+ switch (argc) {
193
+ case 3:
194
+ Data_Get_Struct(obj, gsl_rng, r);
195
+ a = NUM2DBL(argv[0]); b = NUM2DBL(argv[1]);
196
+ n = NUM2INT(argv[2]);
197
+ v = gsl_vector_alloc(n);
198
+ for (i = 0; i < n; i++) gsl_vector_set(v, i, (*f)(r, a, b));
199
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
200
+ break;
201
+ case 2:
202
+ a = NUM2DBL(argv[0]); b = NUM2DBL(argv[1]);
203
+ break;
204
+ default:
205
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
206
+ break;
207
+ }
208
+ Data_Get_Struct(obj, gsl_rng, r);
209
+ break;
210
+ }
211
+ return rb_float_new((*f)(r, a, b));
212
+ }
213
+
214
+ static VALUE rb_gsl_ran_eval3(int argc, VALUE *argv, VALUE obj,
215
+ double (*f)(const gsl_rng*, double, double, double))
216
+ {
217
+ gsl_rng *r;
218
+ gsl_vector *v;
219
+ size_t n, i;
220
+ double a, b, c;
221
+ switch (TYPE(obj)) {
222
+ case T_MODULE: case T_CLASS: case T_OBJECT:
223
+ switch (argc) {
224
+ case 5:
225
+ CHECK_RNG(argv[0]);
226
+ Data_Get_Struct(argv[0], gsl_rng, r);
227
+ a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]); c = NUM2DBL(argv[3]);
228
+ n = NUM2INT(argv[4]);
229
+ v = gsl_vector_alloc(n);
230
+ for (i = 0; i < n; i++) gsl_vector_set(v, i, (*f)(r, a, b, c));
231
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
232
+ break;
233
+ case 4:
234
+ CHECK_RNG(argv[0]);
235
+ Data_Get_Struct(argv[0], gsl_rng, r);
236
+ a = NUM2DBL(argv[1]); b = NUM2DBL(argv[2]); c = NUM2DBL(argv[3]);
237
+ break;
238
+ default:
239
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)", argc);
240
+ break;
241
+ }
242
+ break;
243
+ default:
244
+ switch (argc) {
245
+ case 4:
246
+ Data_Get_Struct(obj, gsl_rng, r);
247
+ a = NUM2DBL(argv[0]); b = NUM2DBL(argv[1]); c = NUM2DBL(argv[2]);
248
+ n = NUM2INT(argv[3]);
249
+ v = gsl_vector_alloc(n);
250
+ for (i = 0; i < n; i++) gsl_vector_set(v, i, (*f)(r, a, b, c));
251
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
252
+ break;
253
+ case 3:
254
+ a = NUM2DBL(argv[0]); b = NUM2DBL(argv[1]); c = NUM2DBL(argv[2]);
255
+ break;
256
+ default:
257
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
258
+ break;
259
+ }
260
+ Data_Get_Struct(obj, gsl_rng, r);
261
+ break;
262
+ }
263
+ return rb_float_new((*f)(r, a, b, c));
264
+ }
265
+
266
+ static VALUE rb_gsl_ran_gaussian(int argc, VALUE *argv, VALUE obj)
267
+ {
268
+ gsl_rng *r = NULL;
269
+ gsl_vector *v;
270
+ size_t n, i;
271
+ double sigma = 1.0;
272
+ switch (TYPE(obj)) {
273
+ case T_MODULE: case T_CLASS: case T_OBJECT:
274
+ switch (argc) {
275
+ case 3:
276
+ n = NUM2INT(argv[2]);
277
+ sigma = NUM2DBL(argv[1]);
278
+ CHECK_RNG(argv[0]);
279
+ Data_Get_Struct(argv[0], gsl_rng, r);
280
+ v = gsl_vector_alloc(n);
281
+ for (i = 0; i < n; i++)
282
+ gsl_vector_set(v, i, gsl_ran_gaussian(r, sigma));
283
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
284
+ break;
285
+ case 2:
286
+ sigma = NUM2DBL(argv[1]);
287
+ /* no break */
288
+ case 1:
289
+ CHECK_RNG(argv[0]);
290
+ Data_Get_Struct(argv[0], gsl_rng, r);
291
+ return rb_float_new(gsl_ran_gaussian(r, sigma));
292
+ break;
293
+ default:
294
+ rb_raise(rb_eArgError, "too many arguments (%d for 1 or 2)", argc);
295
+ return Qnil;
296
+ break;
297
+ }
298
+ break;
299
+ default:
300
+ Data_Get_Struct(obj, gsl_rng, r);
301
+ switch (argc) {
302
+ case 2:
303
+ n = NUM2INT(argv[1]);
304
+ sigma = NUM2DBL(argv[0]);
305
+ v = gsl_vector_alloc(n);
306
+ for (i = 0; i < n; i++)
307
+ gsl_vector_set(v, i, gsl_ran_gaussian(r, sigma));
308
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
309
+ break;
310
+ case 1:
311
+ sigma = NUM2DBL(argv[0]);
312
+ /* no break */
313
+ case 0:
314
+ return rb_float_new(gsl_ran_gaussian(r, sigma));
315
+ break;
316
+ default:
317
+ rb_raise(rb_eArgError, "too many arguments (%d for 0 or 1)", argc);
318
+ return Qnil;
319
+ break;
320
+ }
321
+ break;
322
+ }
323
+ return Qnil;
324
+ }
325
+
326
+ static VALUE rb_gsl_ran_gaussian_ratio_method(int argc, VALUE *argv, VALUE obj)
327
+ {
328
+ gsl_rng *r = NULL;
329
+ double sigma = 1.0;
330
+ switch (TYPE(obj)) {
331
+ case T_MODULE: case T_CLASS: case T_OBJECT:
332
+ switch (argc) {
333
+ case 2:
334
+ sigma = NUM2DBL(argv[1]);
335
+ /* no break */
336
+ case 1:
337
+ CHECK_RNG(argv[0]);
338
+ Data_Get_Struct(argv[0], gsl_rng, r);
339
+ return rb_float_new(gsl_ran_gaussian_ratio_method(r, sigma));
340
+ break;
341
+ default:
342
+ rb_raise(rb_eArgError, "too many arguments (%d for 1 or 2)", argc);
343
+ break;
344
+ }
345
+ break;
346
+ default:
347
+ Data_Get_Struct(obj, gsl_rng, r);
348
+ switch (argc) {
349
+ case 1:
350
+ sigma = NUM2DBL(argv[0]);
351
+ /* no break */
352
+ case 0:
353
+ return rb_float_new(gsl_ran_gaussian_ratio_method(r, sigma));
354
+ break;
355
+ default:
356
+ rb_raise(rb_eArgError, "too many arguments (%d for 0 or 1)", argc);
357
+ break;
358
+ }
359
+ break;
360
+ }
361
+ return Qnil;
362
+ }
363
+
364
+ static VALUE rb_gsl_ran_gaussian_pdf(int argc, VALUE *argv, VALUE obj)
365
+ {
366
+ if (argc == 1) {
367
+ return rb_gsl_eval_pdf_cdf(argv[0], gsl_ran_ugaussian_pdf);
368
+ } else if (argc == 2) {
369
+ return rb_gsl_eval_pdf_cdf2(argv[0], argv[1], gsl_ran_gaussian_pdf);
370
+ } else {
371
+ rb_raise(rb_eArgError, "wrong number of arguments (1 or 2)");
372
+ }
373
+ }
374
+
375
+ static VALUE rb_gsl_ran_gaussian_tail(int argc, VALUE *argv, VALUE obj)
376
+ {
377
+ gsl_rng *r = NULL;
378
+ gsl_vector *v;
379
+ size_t n, i;
380
+ double a, sigma = 1.0;
381
+ switch (TYPE(obj)) {
382
+ case T_MODULE: case T_CLASS: case T_OBJECT:
383
+ switch (argc) {
384
+ case 4:
385
+ n = NUM2INT(argv[3]);
386
+ sigma = NUM2DBL(argv[2]);
387
+ a = NUM2DBL(argv[1]);
388
+ CHECK_RNG(argv[0]);
389
+ Data_Get_Struct(argv[0], gsl_rng, r);
390
+ v = gsl_vector_alloc(n);
391
+ for (i = 0; i < n; i++)
392
+ gsl_vector_set(v, i, gsl_ran_gaussian_tail(r, a, sigma));
393
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
394
+ break;
395
+ case 3:
396
+ sigma = NUM2DBL(argv[2]);
397
+ /* no break */
398
+ case 2:
399
+ CHECK_RNG(argv[0]);
400
+ Data_Get_Struct(argv[0], gsl_rng, r);
401
+ a = NUM2DBL(argv[1]);
402
+ return rb_float_new(gsl_ran_gaussian_tail(r, a, sigma));
403
+ break;
404
+ default:
405
+ rb_raise(rb_eArgError, "too many arguments (%d for 2 or 3)", argc);
406
+ break;
407
+ }
408
+ break;
409
+ default:
410
+ Data_Get_Struct(obj, gsl_rng, r);
411
+ switch (argc) {
412
+ case 3:
413
+ n = NUM2INT(argv[2]);
414
+ sigma = NUM2DBL(argv[1]);
415
+ a = NUM2DBL(argv[0]);
416
+ v = gsl_vector_alloc(n);
417
+ for (i = 0; i < n; i++)
418
+ gsl_vector_set(v, i, gsl_ran_gaussian_tail(r, a, sigma));
419
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
420
+ break;
421
+ case 2:
422
+ sigma = NUM2DBL(argv[1]);
423
+ /* no break */
424
+ case 1:
425
+ a = NUM2DBL(argv[0]);
426
+ return rb_float_new(gsl_ran_gaussian_tail(r, a, sigma));
427
+ break;
428
+ default:
429
+ rb_raise(rb_eArgError, "too many arguments (%d for 1 or 2)", argc);
430
+ break;
431
+ }
432
+ break;
433
+ }
434
+ }
435
+
436
+ static VALUE rb_gsl_ran_gaussian_tail_pdf(int argc, VALUE *argv, VALUE obj)
437
+ {
438
+ switch (argc) {
439
+ case 2:
440
+ return rb_gsl_eval_pdf_cdf2(argv[0], argv[1], gsl_ran_ugaussian_tail_pdf);
441
+ break;
442
+ case 3:
443
+ return rb_gsl_eval_pdf_cdf3(argv[0], argv[1], argv[2], gsl_ran_gaussian_tail_pdf);
444
+ break;
445
+ default:
446
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
447
+ break;
448
+ }
449
+ }
450
+
451
+ static VALUE rb_gsl_ran_bivariate_gaussian(int argc, VALUE *argv, VALUE obj)
452
+ {
453
+ gsl_rng *r = NULL;
454
+ double sigmax, sigmay, x, y, rho;
455
+ switch (TYPE(obj)) {
456
+ case T_MODULE: case T_CLASS: case T_OBJECT:
457
+ switch (argc) {
458
+ case 4:
459
+ CHECK_RNG(argv[0]);
460
+ Data_Get_Struct(argv[0], gsl_rng, r);
461
+ sigmax = NUM2DBL(argv[1]); sigmay = NUM2DBL(argv[2]);
462
+ rho = NUM2DBL(argv[3]);
463
+ break;
464
+ default:
465
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)", argc);
466
+ break;
467
+ }
468
+ break;
469
+ default:
470
+ switch (argc) {
471
+ case 3:
472
+ Data_Get_Struct(obj, gsl_rng, r);
473
+ sigmax = NUM2DBL(argv[0]); sigmay = NUM2DBL(argv[1]);
474
+ rho = NUM2DBL(argv[2]);
475
+ break;
476
+ default:
477
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
478
+ break;
479
+ }
480
+ break;
481
+ }
482
+ gsl_ran_bivariate_gaussian(r, sigmax, sigmay, rho, &x, &y);
483
+ return rb_ary_new3(2, rb_float_new(x), rb_float_new(y));
484
+ }
485
+
486
+ static VALUE rb_gsl_ran_bivariate_gaussian_pdf(VALUE obj, VALUE x, VALUE y, VALUE sx, VALUE sy, VALUE rr)
487
+ {
488
+ Need_Float(x); Need_Float(y);
489
+ Need_Float(sx); Need_Float(sy); Need_Float(rr);
490
+ return rb_float_new(gsl_ran_bivariate_gaussian_pdf(NUM2DBL(x), NUM2DBL(y), NUM2DBL(sx), NUM2DBL(sy), NUM2DBL(rr)));
491
+ }
492
+
493
+ static VALUE rb_gsl_ran_exponential(int argc, VALUE *argv, VALUE obj)
494
+ {
495
+ return rb_gsl_ran_eval1(argc, argv, obj, gsl_ran_exponential);
496
+ }
497
+
498
+ static VALUE rb_gsl_ran_exponential_pdf(VALUE obj, VALUE x, VALUE mu)
499
+ {
500
+ return rb_gsl_eval_pdf_cdf2(x, mu, gsl_ran_exponential_pdf);
501
+ }
502
+
503
+ static VALUE rb_gsl_ran_laplace(int argc, VALUE *argv, VALUE obj)
504
+ {
505
+ return rb_gsl_ran_eval1(argc, argv, obj, gsl_ran_laplace);
506
+ }
507
+
508
+ static VALUE rb_gsl_ran_laplace_pdf(VALUE obj, VALUE x, VALUE mu)
509
+ {
510
+ return rb_gsl_eval_pdf_cdf2(x, mu, gsl_ran_laplace_pdf);
511
+ }
512
+
513
+ static VALUE rb_gsl_ran_exppow(int argc, VALUE *argv, VALUE obj)
514
+ {
515
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_exppow);
516
+ }
517
+
518
+ static VALUE rb_gsl_ran_exppow_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
519
+ {
520
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_exppow_pdf);
521
+ }
522
+
523
+ static VALUE rb_gsl_ran_cauchy(int argc, VALUE *argv, VALUE obj)
524
+ {
525
+ return rb_gsl_ran_eval1(argc, argv, obj, gsl_ran_cauchy);
526
+ }
527
+
528
+ static VALUE rb_gsl_ran_cauchy_pdf(VALUE obj, VALUE x, VALUE mu)
529
+ {
530
+ return rb_gsl_eval_pdf_cdf2(x, mu, gsl_ran_cauchy_pdf);
531
+ }
532
+
533
+ static VALUE rb_gsl_ran_rayleigh(int argc, VALUE *argv, VALUE obj)
534
+ {
535
+ return rb_gsl_ran_eval1(argc, argv, obj, gsl_ran_rayleigh);
536
+ }
537
+
538
+ static VALUE rb_gsl_ran_rayleigh_pdf(VALUE obj, VALUE x, VALUE a)
539
+ {
540
+ return rb_gsl_eval_pdf_cdf2(x, a, gsl_ran_rayleigh_pdf);
541
+ }
542
+
543
+ static VALUE rb_gsl_ran_rayleigh_tail(int argc, VALUE *argv, VALUE obj)
544
+ {
545
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_rayleigh_tail);
546
+ }
547
+
548
+ static VALUE rb_gsl_ran_rayleigh_tail_pdf(VALUE obj, VALUE x, VALUE a, VALUE s)
549
+ {
550
+ return rb_gsl_eval_pdf_cdf3(x, a, s, gsl_ran_rayleigh_tail_pdf);
551
+ }
552
+
553
+ static VALUE rb_gsl_ran_landau(int argc, VALUE *argv, VALUE obj)
554
+ {
555
+ return rb_gsl_ran_eval0(argc, argv, obj, gsl_ran_landau);
556
+ }
557
+
558
+ static VALUE rb_gsl_ran_landau_pdf(VALUE obj, VALUE x)
559
+ {
560
+ return rb_gsl_eval_pdf_cdf(x, gsl_ran_landau_pdf);
561
+ }
562
+
563
+ static VALUE rb_gsl_ran_levy(int argc, VALUE *argv, VALUE obj)
564
+ {
565
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_levy);
566
+ }
567
+
568
+ static VALUE rb_gsl_ran_levy_skew(int argc, VALUE *argv, VALUE obj)
569
+ {
570
+ return rb_gsl_ran_eval3(argc, argv, obj, gsl_ran_levy_skew);
571
+ }
572
+
573
+ static VALUE rb_gsl_ran_gamma(int argc, VALUE *argv, VALUE obj)
574
+ {
575
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_gamma);
576
+ }
577
+
578
+ static VALUE rb_gsl_ran_gamma_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
579
+ {
580
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_gamma_pdf);
581
+ }
582
+
583
+ static VALUE rb_gsl_ran_flat(int argc, VALUE *argv, VALUE obj)
584
+ {
585
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_flat);
586
+ }
587
+
588
+ static VALUE rb_gsl_ran_flat_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
589
+ {
590
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_flat_pdf);
591
+ }
592
+
593
+ static VALUE rb_gsl_ran_lognormal(int argc, VALUE *argv, VALUE obj)
594
+ {
595
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_lognormal);
596
+ }
597
+
598
+ static VALUE rb_gsl_ran_lognormal_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
599
+ {
600
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_lognormal_pdf);
601
+ }
602
+
603
+ static VALUE rb_gsl_ran_chisq(int argc, VALUE *argv, VALUE obj)
604
+ {
605
+ return rb_gsl_ran_eval1(argc, argv, obj, gsl_ran_chisq);
606
+ }
607
+
608
+ static VALUE rb_gsl_ran_chisq_pdf(VALUE obj, VALUE x, VALUE mu)
609
+ {
610
+ return rb_gsl_eval_pdf_cdf2(x, mu, gsl_ran_chisq_pdf);
611
+ }
612
+
613
+ static VALUE rb_gsl_ran_fdist(int argc, VALUE *argv, VALUE obj)
614
+ {
615
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_fdist);
616
+ }
617
+
618
+ static VALUE rb_gsl_ran_fdist_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
619
+ {
620
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_fdist_pdf);
621
+ }
622
+
623
+ static VALUE rb_gsl_ran_tdist(int argc, VALUE *argv, VALUE obj)
624
+ {
625
+ return rb_gsl_ran_eval1(argc, argv, obj, gsl_ran_tdist);
626
+ }
627
+
628
+ static VALUE rb_gsl_ran_tdist_pdf(VALUE obj, VALUE x, VALUE mu)
629
+ {
630
+ return rb_gsl_eval_pdf_cdf2(x, mu, gsl_ran_tdist_pdf);
631
+ }
632
+
633
+ static VALUE rb_gsl_ran_beta(int argc, VALUE *argv, VALUE obj)
634
+ {
635
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_beta);
636
+ }
637
+
638
+ static VALUE rb_gsl_ran_beta_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
639
+ {
640
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_beta_pdf);
641
+ }
642
+
643
+ static VALUE rb_gsl_ran_logistic(int argc, VALUE *argv, VALUE obj)
644
+ {
645
+ return rb_gsl_ran_eval1(argc, argv, obj, gsl_ran_logistic);
646
+ }
647
+
648
+ static VALUE rb_gsl_ran_logistic_pdf(VALUE obj, VALUE x, VALUE mu)
649
+ {
650
+ return rb_gsl_eval_pdf_cdf2(x, mu, gsl_ran_logistic_pdf);
651
+ }
652
+
653
+ static VALUE rb_gsl_ran_pareto(int argc, VALUE *argv, VALUE obj)
654
+ {
655
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_pareto);
656
+ }
657
+
658
+ static VALUE rb_gsl_ran_pareto_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
659
+ {
660
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_pareto_pdf);
661
+ }
662
+
663
+ static VALUE rb_gsl_ran_weibull(int argc, VALUE *argv, VALUE obj)
664
+ {
665
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_weibull);
666
+ }
667
+
668
+ static VALUE rb_gsl_ran_weibull_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
669
+ {
670
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_weibull_pdf);
671
+ }
672
+
673
+ static VALUE rb_gsl_ran_gumbel1(int argc, VALUE *argv, VALUE obj)
674
+ {
675
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_gumbel1);
676
+ }
677
+
678
+ static VALUE rb_gsl_ran_gumbel1_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
679
+ {
680
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_gumbel1_pdf);
681
+ }
682
+
683
+ static VALUE rb_gsl_ran_gumbel2(int argc, VALUE *argv, VALUE obj)
684
+ {
685
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_gumbel2);
686
+ }
687
+
688
+ static VALUE rb_gsl_ran_gumbel2_pdf(VALUE obj, VALUE x, VALUE a, VALUE b)
689
+ {
690
+ return rb_gsl_eval_pdf_cdf3(x, a, b, gsl_ran_gumbel2_pdf);
691
+ }
692
+
693
+ static VALUE rb_gsl_ran_poisson(int argc, VALUE *argv, VALUE obj)
694
+ {
695
+ return rb_gsl_ran_eval1_uint(argc, argv, obj, gsl_ran_poisson);
696
+ }
697
+
698
+ static VALUE rb_gsl_ran_poisson_pdf(VALUE obj, VALUE x, VALUE mu)
699
+ {
700
+ return rb_gsl_eval_pdf_cdf2_uint(x, mu, gsl_ran_poisson_pdf);
701
+ }
702
+
703
+ static VALUE rb_gsl_ran_bernoulli(int argc, VALUE *argv, VALUE obj)
704
+ {
705
+ return rb_gsl_ran_eval1_uint(argc, argv, obj, gsl_ran_bernoulli);
706
+ }
707
+
708
+ static VALUE rb_gsl_ran_bernoulli_pdf(VALUE obj, VALUE x, VALUE mu)
709
+ {
710
+ return rb_gsl_eval_pdf_cdf2_uint(x, mu, gsl_ran_bernoulli_pdf);
711
+ }
712
+
713
+ static VALUE rb_gsl_ran_binomial(int argc, VALUE *argv, VALUE obj)
714
+ {
715
+ gsl_rng *r;
716
+ double p;
717
+ unsigned int n;
718
+ switch (TYPE(obj)) {
719
+ case T_MODULE: case T_CLASS: case T_OBJECT:
720
+ switch (argc) {
721
+ case 3:
722
+ CHECK_RNG(argv[0]);
723
+ Data_Get_Struct(argv[0], gsl_rng, r);
724
+ p = NUM2DBL(argv[1]);
725
+ n = FIX2UINT(argv[2]);
726
+ break;
727
+ default:
728
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
729
+ break;
730
+ }
731
+ break;
732
+ default:
733
+ switch (argc) {
734
+ case 2:
735
+ p = NUM2DBL(argv[0]);
736
+ n = FIX2UINT(argv[1]);
737
+ break;
738
+ default:
739
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
740
+ break;
741
+ }
742
+ Data_Get_Struct(obj, gsl_rng, r);
743
+ break;
744
+ }
745
+ return UINT2NUM(gsl_ran_binomial(r, p, n));
746
+ }
747
+
748
+ #ifdef GSL_1_4_LATER
749
+ static VALUE rb_gsl_ran_binomial_tpe(int argc, VALUE *argv, VALUE obj)
750
+ {
751
+ gsl_rng *r = NULL;
752
+ double p;
753
+ unsigned int n;
754
+ switch (TYPE(obj)) {
755
+ case T_MODULE: case T_CLASS: case T_OBJECT:
756
+ switch (argc) {
757
+ case 3:
758
+ CHECK_RNG(argv[0]);
759
+ Data_Get_Struct(argv[0], gsl_rng, r);
760
+ p = NUM2DBL(argv[1]);
761
+ n = FIX2UINT(argv[2]);
762
+ break;
763
+ default:
764
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
765
+ break;
766
+ }
767
+ break;
768
+ default:
769
+ switch (argc) {
770
+ case 2:
771
+ p = NUM2DBL(argv[0]);
772
+ n = FIX2UINT(argv[1]);
773
+ break;
774
+ default:
775
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
776
+ break;
777
+ }
778
+ Data_Get_Struct(obj, gsl_rng, r);
779
+ break;
780
+ }
781
+ return UINT2NUM(gsl_ran_binomial_tpe(r, p, n));
782
+ }
783
+ #endif
784
+
785
+ static VALUE rb_gsl_ran_binomial_pdf(VALUE obj, VALUE x, VALUE p, VALUE n)
786
+ {
787
+ return rb_float_new(gsl_ran_binomial_pdf(NUM2UINT(x), NUM2DBL(p), NUM2UINT(n)));
788
+ }
789
+
790
+ static VALUE rb_gsl_ran_negative_binomial(int argc, VALUE *argv, VALUE obj)
791
+ {
792
+ gsl_rng *r;
793
+ double p;
794
+ unsigned int n;
795
+ switch (TYPE(obj)) {
796
+ case T_MODULE: case T_CLASS: case T_OBJECT:
797
+ switch (argc) {
798
+ case 3:
799
+ CHECK_RNG(argv[0]);
800
+ Data_Get_Struct(argv[0], gsl_rng, r);
801
+ p = NUM2DBL(argv[1]);
802
+ n = FIX2UINT(argv[2]);
803
+ break;
804
+ default:
805
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
806
+ break;
807
+ }
808
+ break;
809
+ default:
810
+ switch (argc) {
811
+ case 2:
812
+ p = NUM2DBL(argv[0]);
813
+ n = FIX2UINT(argv[1]);
814
+ break;
815
+ default:
816
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
817
+ break;
818
+ }
819
+ Data_Get_Struct(obj, gsl_rng, r);
820
+ break;
821
+ }
822
+ return UINT2NUM(gsl_ran_negative_binomial(r, p, n));
823
+ }
824
+
825
+ static VALUE rb_gsl_ran_negative_binomial_pdf(VALUE obj, VALUE x, VALUE p, VALUE n)
826
+ {
827
+ return rb_float_new(gsl_ran_negative_binomial_pdf(NUM2UINT(x), NUM2DBL(p), NUM2DBL(n)));
828
+ }
829
+
830
+ static VALUE rb_gsl_ran_pascal(int argc, VALUE *argv, VALUE obj)
831
+ {
832
+ gsl_rng *r = NULL;
833
+ double p;
834
+ unsigned int n;
835
+ switch (TYPE(obj)) {
836
+ case T_MODULE: case T_CLASS: case T_OBJECT:
837
+ switch (argc) {
838
+ case 3:
839
+ CHECK_RNG(argv[0]);
840
+ Data_Get_Struct(argv[0], gsl_rng, r);
841
+ p = NUM2DBL(argv[1]);
842
+ n = FIX2UINT(argv[2]);
843
+ break;
844
+ default:
845
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
846
+ break;
847
+ }
848
+ break;
849
+ default:
850
+ switch (argc) {
851
+ case 2:
852
+ p = NUM2DBL(argv[0]);
853
+ n = FIX2UINT(argv[1]);
854
+ break;
855
+ default:
856
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
857
+ break;
858
+ }
859
+ Data_Get_Struct(obj, gsl_rng, r);
860
+ break;
861
+ }
862
+ return UINT2NUM(gsl_ran_pascal(r, p, n));
863
+ }
864
+
865
+ static VALUE rb_gsl_ran_pascal_pdf(VALUE obj, VALUE x, VALUE p, VALUE n)
866
+ {
867
+ return rb_float_new(gsl_ran_pascal_pdf(NUM2UINT(x), NUM2DBL(p), NUM2UINT(n)));
868
+ }
869
+
870
+ static VALUE rb_gsl_ran_geometric(int argc, VALUE *argv, VALUE obj)
871
+ {
872
+ return rb_gsl_ran_eval1_uint(argc, argv, obj, gsl_ran_geometric);
873
+ }
874
+
875
+ static VALUE rb_gsl_ran_geometric_pdf(VALUE obj, VALUE x, VALUE p)
876
+ {
877
+ return rb_gsl_eval_pdf_cdf2_uint(x, p, gsl_ran_geometric_pdf);
878
+ }
879
+
880
+ static VALUE rb_gsl_ran_hypergeometric(int argc, VALUE *argv, VALUE obj)
881
+ {
882
+ gsl_rng *r;
883
+ unsigned int n1, n2, t;
884
+ switch (TYPE(obj)) {
885
+ case T_MODULE: case T_CLASS: case T_OBJECT:
886
+ switch (argc) {
887
+ case 4:
888
+ CHECK_RNG(argv[0]);
889
+ Data_Get_Struct(argv[0], gsl_rng, r);
890
+ n1 = FIX2UINT(argv[1]);
891
+ n2 = FIX2UINT(argv[2]);
892
+ t = FIX2UINT(argv[3]);
893
+ break;
894
+ default:
895
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 4)", argc);
896
+ break;
897
+ }
898
+ break;
899
+ default:
900
+ switch (argc) {
901
+ case 3:
902
+ n1 = FIX2UINT(argv[0]);
903
+ n2 = FIX2UINT(argv[1]);
904
+ t = FIX2UINT(argv[2]);
905
+ break;
906
+ default:
907
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 3)", argc);
908
+ break;
909
+ }
910
+ Data_Get_Struct(obj, gsl_rng, r);
911
+ break;
912
+ }
913
+ return UINT2NUM(gsl_ran_hypergeometric(r, n1, n2, t));
914
+ }
915
+
916
+ static VALUE rb_gsl_ran_hypergeometric_pdf(VALUE obj, VALUE k, VALUE n1, VALUE n2, VALUE t)
917
+ {
918
+ return rb_float_new(gsl_ran_hypergeometric_pdf(NUM2UINT(k), NUM2UINT(n1), NUM2UINT(n2), NUM2UINT(t)));
919
+ }
920
+
921
+ static VALUE rb_gsl_ran_logarithmic(int argc, VALUE *argv, VALUE obj)
922
+ {
923
+ return rb_gsl_ran_eval1_uint(argc, argv, obj, gsl_ran_logarithmic);
924
+ }
925
+
926
+ static VALUE rb_gsl_ran_logarithmic_pdf(VALUE obj, VALUE x, VALUE mu)
927
+ {
928
+ return rb_gsl_eval_pdf_cdf2_uint(x, mu, gsl_ran_logarithmic_pdf);
929
+ }
930
+
931
+ static VALUE rb_gsl_ran_dir_2d(int argc, VALUE *argv, VALUE obj)
932
+ {
933
+ gsl_rng *r = NULL;
934
+ double x, y;
935
+ switch (TYPE(obj)) {
936
+ case T_MODULE: case T_CLASS: case T_OBJECT:
937
+ switch (argc) {
938
+ case 1:
939
+ CHECK_RNG(argv[0]);
940
+ Data_Get_Struct(argv[0], gsl_rng, r);
941
+ break;
942
+ default:
943
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
944
+ break;
945
+ }
946
+ break;
947
+ default:
948
+ switch (argc) {
949
+ case 0:
950
+ Data_Get_Struct(obj, gsl_rng, r);
951
+ break;
952
+ default:
953
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
954
+ break;
955
+ }
956
+ }
957
+ gsl_ran_dir_2d(r, &x, &y);
958
+ return rb_ary_new3(2, rb_float_new(x), rb_float_new(y));
959
+ }
960
+
961
+ static VALUE rb_gsl_ran_dir_2d_trig_method(int argc, VALUE *argv, VALUE obj)
962
+ {
963
+ gsl_rng *r = NULL;
964
+ double x, y;
965
+ switch (TYPE(obj)) {
966
+ case T_MODULE: case T_CLASS: case T_OBJECT:
967
+ switch (argc) {
968
+ case 1:
969
+ CHECK_RNG(argv[0]);
970
+ Data_Get_Struct(argv[0], gsl_rng, r);
971
+ break;
972
+ default:
973
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
974
+ break;
975
+ }
976
+ break;
977
+ default:
978
+ switch (argc) {
979
+ case 0:
980
+ Data_Get_Struct(obj, gsl_rng, r);
981
+ break;
982
+ default:
983
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
984
+ break;
985
+ }
986
+ }
987
+ gsl_ran_dir_2d_trig_method(r, &x, &y);
988
+ return rb_ary_new3(2, rb_float_new(x), rb_float_new(y));
989
+ }
990
+
991
+ static VALUE rb_gsl_ran_dir_3d(int argc, VALUE *argv, VALUE obj)
992
+ {
993
+ gsl_rng *r = NULL;
994
+ double x, y, z;
995
+ switch (TYPE(obj)) {
996
+ case T_MODULE: case T_CLASS: case T_OBJECT:
997
+ switch (argc) {
998
+ case 1:
999
+ CHECK_RNG(argv[0]);
1000
+ Data_Get_Struct(argv[0], gsl_rng, r);
1001
+ break;
1002
+ default:
1003
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
1004
+ break;
1005
+ }
1006
+ break;
1007
+ default:
1008
+ switch (argc) {
1009
+ case 0:
1010
+ Data_Get_Struct(obj, gsl_rng, r);
1011
+ break;
1012
+ default:
1013
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
1014
+ break;
1015
+ }
1016
+ }
1017
+ gsl_ran_dir_3d(r, &x, &y, &z);
1018
+ return rb_ary_new3(3, rb_float_new(x), rb_float_new(y), rb_float_new(z));
1019
+ }
1020
+
1021
+ static VALUE rb_gsl_ran_dir_nd(int argc, VALUE *argv, VALUE obj)
1022
+ {
1023
+ gsl_rng *r = NULL;
1024
+ size_t n;
1025
+ gsl_vector *v;
1026
+ switch (TYPE(obj)) {
1027
+ case T_MODULE: case T_CLASS: case T_OBJECT:
1028
+ switch (argc) {
1029
+ case 2:
1030
+ CHECK_RNG(argv[0]); CHECK_FIXNUM(argv[1]);
1031
+ Data_Get_Struct(argv[0], gsl_rng, r);
1032
+ n = FIX2INT(argv[1]);
1033
+ break;
1034
+ default:
1035
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
1036
+ break;
1037
+ }
1038
+ break;
1039
+ default:
1040
+ switch (argc) {
1041
+ case 1:
1042
+ CHECK_FIXNUM(argv[0]);
1043
+ n = FIX2INT(argv[0]);
1044
+ Data_Get_Struct(obj, gsl_rng, r);
1045
+ break;
1046
+ default:
1047
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
1048
+ break;
1049
+ }
1050
+ }
1051
+ v = gsl_vector_alloc(n);
1052
+ gsl_ran_dir_nd(r, n, v->data);
1053
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
1054
+ }
1055
+
1056
+ static VALUE rb_gsl_ran_shuffle(int argc, VALUE *argv, VALUE obj)
1057
+ {
1058
+ gsl_rng *r = NULL;
1059
+ gsl_vector *v = NULL;
1060
+ gsl_permutation *p = NULL;
1061
+ switch (TYPE(obj)) {
1062
+ case T_MODULE:
1063
+ case T_CLASS:
1064
+ case T_OBJECT:
1065
+ switch (argc) {
1066
+ case 2:
1067
+ CHECK_RNG(argv[0]);
1068
+ Data_Get_Struct(argv[0], gsl_rng, r);
1069
+ if (VECTOR_P(argv[1])) {
1070
+ Data_Get_Struct(argv[1], gsl_vector, v);
1071
+ gsl_ran_shuffle(r, v->data, v->size, sizeof(double));
1072
+ } else if (PERMUTATION_P(argv[1])) {
1073
+ Data_Get_Struct(argv[1], gsl_permutation, p);
1074
+ gsl_ran_shuffle(r, p->data, p->size, sizeof(size_t));
1075
+ } else {
1076
+ rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Permutation expected)", rb_class2name(CLASS_OF(argv[1])));
1077
+ }
1078
+ break;
1079
+ case 3:
1080
+ CHECK_RNG(argv[0]);
1081
+ CHECK_FIXNUM(argv[2]);
1082
+ Data_Get_Struct(argv[0], gsl_rng, r);
1083
+ if (VECTOR_P(argv[1])) {
1084
+ Data_Get_Struct(argv[1], gsl_vector, v);
1085
+ gsl_ran_shuffle(r, v->data, FIX2INT(argv[2]), sizeof(double));
1086
+ } else if (PERMUTATION_P(argv[1])) {
1087
+ Data_Get_Struct(argv[1], gsl_permutation, p);
1088
+ gsl_ran_shuffle(r, p->data, FIX2INT(argv[2]), sizeof(size_t));
1089
+ } else {
1090
+ rb_raise(rb_eTypeError,
1091
+ "wrong argument type %s (Vector or Permutation expected)",
1092
+ rb_class2name(CLASS_OF(argv[1])));
1093
+ }
1094
+ break;
1095
+ default:
1096
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
1097
+ break;
1098
+ }
1099
+ break;
1100
+ default:
1101
+ Data_Get_Struct(obj, gsl_rng, r);
1102
+ switch (argc) {
1103
+ case 1:
1104
+ if (VECTOR_P(argv[0])) {
1105
+ Data_Get_Struct(argv[0], gsl_vector, v);
1106
+ gsl_ran_shuffle(r, v->data, v->size, sizeof(double));
1107
+ } else if (PERMUTATION_P(argv[0])) {
1108
+ Data_Get_Struct(argv[0], gsl_permutation, p);
1109
+ gsl_ran_shuffle(r, p->data, p->size, sizeof(size_t));
1110
+ } else {
1111
+ rb_raise(rb_eTypeError, "wrong argument type %s (Vector or Permutation expected)", rb_class2name(CLASS_OF(argv[0])));
1112
+ }
1113
+ break;
1114
+ case 2:
1115
+ CHECK_FIXNUM(argv[1]);
1116
+ if (VECTOR_P(argv[0])) {
1117
+ Data_Get_Struct(argv[0], gsl_vector, v);
1118
+ gsl_ran_shuffle(r, v->data, FIX2INT(argv[1]), sizeof(double));
1119
+ } else if (PERMUTATION_P(argv[0])) {
1120
+ Data_Get_Struct(argv[0], gsl_permutation, p);
1121
+ gsl_ran_shuffle(r, p->data, FIX2INT(argv[1]), sizeof(size_t));
1122
+ } else {
1123
+ rb_raise(rb_eTypeError,
1124
+ "wrong argument type %s (Vector or Permutation expected)",
1125
+ rb_class2name(CLASS_OF(argv[0])));
1126
+ }
1127
+ default:
1128
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
1129
+ break;
1130
+ }
1131
+ break;
1132
+ }
1133
+ return Qnil;
1134
+ }
1135
+
1136
+ static VALUE rb_gsl_ran_choose(int argc, VALUE *argv, VALUE obj)
1137
+ {
1138
+ gsl_rng *r = NULL;
1139
+ gsl_vector *v = NULL, *v2 = NULL;
1140
+ size_t k, n;
1141
+ Data_Get_Struct(obj, gsl_rng, r);
1142
+ switch (argc) {
1143
+ case 2:
1144
+ CHECK_VECTOR(argv[0]);
1145
+ CHECK_FIXNUM(argv[1]);
1146
+ Data_Get_Struct(argv[0], gsl_vector, v);
1147
+ n = v->size;
1148
+ k = FIX2INT(argv[1]);
1149
+ if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
1150
+ v2 = gsl_vector_alloc(k);
1151
+ gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
1152
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
1153
+ break;
1154
+ case 1:
1155
+ CHECK_VECTOR(argv[0]);
1156
+ Data_Get_Struct(argv[0], gsl_vector, v);
1157
+ n = v->size;
1158
+ k = v->size;
1159
+ if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
1160
+ v2 = gsl_vector_alloc(k);
1161
+ gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
1162
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
1163
+ break;
1164
+ default:
1165
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
1166
+ break;
1167
+ }
1168
+ }
1169
+
1170
+ static VALUE rb_gsl_ran_choose_singleton(int argc, VALUE *argv, VALUE obj)
1171
+ {
1172
+ gsl_rng *r = NULL;
1173
+ gsl_vector *v = NULL, *v2 = NULL;
1174
+ size_t k, n;
1175
+ switch (argc) {
1176
+ case 3:
1177
+ CHECK_RNG(argv[0]);
1178
+ CHECK_VECTOR(argv[1]);
1179
+ CHECK_FIXNUM(argv[2]);
1180
+ Data_Get_Struct(argv[0], gsl_rng, r);
1181
+ Data_Get_Struct(argv[1], gsl_vector, v);
1182
+ n = v->size;
1183
+ k = FIX2INT(argv[2]);
1184
+ if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
1185
+ v2 = gsl_vector_alloc(k);
1186
+ gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
1187
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
1188
+ break;
1189
+ case 2:
1190
+ CHECK_RNG(argv[0]);
1191
+ CHECK_VECTOR(argv[1]);
1192
+ Data_Get_Struct(argv[0], gsl_rng, r);
1193
+ Data_Get_Struct(argv[1], gsl_vector, v);
1194
+ n = v->size;
1195
+ k = v->size;
1196
+ if (k > n) rb_raise(rb_eArgError, "the argument 1 must be less than or equal to the size of the vector.");
1197
+ v2 = gsl_vector_alloc(k);
1198
+ gsl_ran_choose(r, v2->data, k, v->data, n, sizeof(double));
1199
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
1200
+ break;
1201
+ default:
1202
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
1203
+ break;
1204
+ }
1205
+ }
1206
+
1207
+ static VALUE rb_gsl_ran_sample(VALUE obj, VALUE vv, VALUE kk)
1208
+ {
1209
+ gsl_rng *r = NULL;
1210
+ gsl_vector *v = NULL, *v2 = NULL;
1211
+ size_t k, n;
1212
+ Data_Get_Struct(obj, gsl_rng, r);
1213
+ Data_Get_Struct(vv, gsl_vector, v);
1214
+ n = v->size;
1215
+ k = FIX2INT(kk);
1216
+ v2 = gsl_vector_alloc(k);
1217
+ gsl_ran_sample(r, v2->data, k, v->data, n, sizeof(double));
1218
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);;
1219
+ }
1220
+
1221
+ #ifdef GSL_1_3_LATER
1222
+ static VALUE rb_gsl_ran_dirichlet(int argc, VALUE *argv, VALUE obj)
1223
+ {
1224
+ gsl_rng *r = NULL;
1225
+ gsl_vector *v = NULL, *v2 = NULL;
1226
+ Data_Get_Struct(obj, gsl_rng, r);
1227
+ if (argc == 1) {
1228
+ Data_Get_Struct(argv[0], gsl_vector, v);
1229
+ v2 = gsl_vector_alloc(v->size);
1230
+ gsl_ran_dirichlet(r, v->size, v->data, v2->data);
1231
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v2);
1232
+ } else if (argc == 2) {
1233
+ Data_Get_Struct(argv[0], gsl_vector, v);
1234
+ Data_Get_Struct(argv[1], gsl_vector, v2);
1235
+ gsl_ran_dirichlet(r, v->size, v->data, v2->data);
1236
+ return obj;
1237
+ } else {
1238
+ rb_raise(rb_eArgError, "wrong number of arguments (1 or 2 GSL_Vectors)");
1239
+ }
1240
+ }
1241
+
1242
+ static VALUE rb_gsl_ran_dirichlet_pdf(VALUE obj, VALUE a, VALUE t)
1243
+ {
1244
+ gsl_vector *alpha = NULL, *theta = NULL;
1245
+ Data_Get_Struct(a, gsl_vector, alpha);
1246
+ Data_Get_Struct(t, gsl_vector, theta);
1247
+ return rb_float_new(gsl_ran_dirichlet_pdf(alpha->size, alpha->data, theta->data));
1248
+ }
1249
+ static VALUE rb_gsl_ran_dirichlet_lnpdf(VALUE obj, VALUE a, VALUE t)
1250
+ {
1251
+ gsl_vector *alpha = NULL, *theta = NULL;
1252
+ Data_Get_Struct(a, gsl_vector, alpha);
1253
+ Data_Get_Struct(t, gsl_vector, theta);
1254
+ return rb_float_new(gsl_ran_dirichlet_lnpdf(alpha->size, alpha->data, theta->data));
1255
+ }
1256
+ #endif
1257
+
1258
+ static VALUE rb_gsl_ran_discrete_new(VALUE klass, VALUE vv)
1259
+ {
1260
+ gsl_vector *v = NULL;
1261
+ gsl_ran_discrete_t *g = NULL;
1262
+ Data_Get_Struct(vv, gsl_vector, v);
1263
+ g = gsl_ran_discrete_preproc(v->size, v->data);
1264
+ return Data_Wrap_Struct(klass, 0, gsl_ran_discrete_free, g);
1265
+ }
1266
+
1267
+ static VALUE rb_gsl_ran_discrete(VALUE obj, VALUE gg)
1268
+ {
1269
+ gsl_rng *r = NULL;
1270
+ gsl_ran_discrete_t *g = NULL;
1271
+ Data_Get_Struct(obj, gsl_rng, r);
1272
+ Data_Get_Struct(gg, gsl_ran_discrete_t, g);
1273
+ return INT2FIX(gsl_ran_discrete(r, g));
1274
+ }
1275
+
1276
+ static VALUE rb_gsl_ran_discrete_pdf(VALUE obj, VALUE k, VALUE gg)
1277
+ {
1278
+ gsl_ran_discrete_t *g = NULL;
1279
+ Data_Get_Struct(gg, gsl_ran_discrete_t, g);
1280
+ return rb_float_new(gsl_ran_discrete_pdf(FIX2INT(k), g));
1281
+ }
1282
+
1283
+ #ifdef HAVE_NARRAY_H
1284
+ #include "narray.h"
1285
+ #endif
1286
+
1287
+ /*****/
1288
+ VALUE rb_gsl_eval_pdf_cdf(VALUE xx, double (*f)(double))
1289
+ {
1290
+ VALUE x, ary;
1291
+ gsl_vector *v = NULL, *vnew = NULL;
1292
+ gsl_matrix *m = NULL, *mnew = NULL;
1293
+ size_t i, j, n;
1294
+ #ifdef HAVE_NARRAY_H
1295
+ struct NARRAY *na;
1296
+ double *ptr1, *ptr2;
1297
+ #endif
1298
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
1299
+ switch(TYPE(xx)) {
1300
+ case T_FIXNUM:
1301
+ case T_BIGNUM:
1302
+ case T_FLOAT:
1303
+ return rb_float_new((*f)(NUM2DBL(xx)));
1304
+ break;
1305
+ case T_ARRAY:
1306
+ // n = RARRAY(xx)->len;
1307
+ n = RARRAY_LEN(xx);
1308
+ ary = rb_ary_new2(n);
1309
+ for (i = 0; i < n; i++) {
1310
+ x = rb_ary_entry(xx, i);
1311
+ Need_Float(x);
1312
+ rb_ary_store(ary, i, rb_float_new((*f)(NUM2DBL(x))));
1313
+ }
1314
+ return ary;
1315
+ break;
1316
+ default:
1317
+ #ifdef HAVE_NARRAY_H
1318
+ if (NA_IsNArray(xx)) {
1319
+ xx = na_change_type(xx, NA_DFLOAT);
1320
+ GetNArray(xx, na);
1321
+ ptr1 = (double *) na->ptr;
1322
+ n = na->total;
1323
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
1324
+ ptr2 = NA_PTR_TYPE(ary, double*);
1325
+ for (i = 0; i < n; i++) ptr2[i] = (*f)(ptr1[i]);
1326
+ return ary;
1327
+ }
1328
+ #endif
1329
+ if (VECTOR_P(xx)) {
1330
+ Data_Get_Struct(xx, gsl_vector, v);
1331
+ vnew = gsl_vector_alloc(v->size);
1332
+ for (i = 0; i < v->size; i++) {
1333
+ gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i)));
1334
+ }
1335
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
1336
+ } else if (MATRIX_P(xx)) {
1337
+ Data_Get_Struct(xx, gsl_matrix, m);
1338
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
1339
+ for (i = 0; i < m->size1; i++) {
1340
+ for (j = 0; j < m->size2; j++) {
1341
+ gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j)));
1342
+ }
1343
+ }
1344
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
1345
+ } else {
1346
+ rb_raise(rb_eTypeError, "wrong argument type");
1347
+ }
1348
+ break;
1349
+ }
1350
+ /* never reach here */
1351
+ return Qnil;
1352
+ }
1353
+
1354
+ VALUE rb_gsl_eval_pdf_cdf2(VALUE xx, VALUE aa,
1355
+ double (*f)(double, double))
1356
+ {
1357
+ VALUE x, ary;
1358
+ double a;
1359
+ gsl_vector *v = NULL, *vnew = NULL;
1360
+ gsl_matrix *m = NULL, *mnew = NULL;
1361
+ size_t i, j, n;
1362
+ #ifdef HAVE_NARRAY_H
1363
+ struct NARRAY *na;
1364
+ double *ptr1, *ptr2;
1365
+ #endif
1366
+ Need_Float(aa);
1367
+ a = NUM2DBL(aa);
1368
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
1369
+ switch(TYPE(xx)) {
1370
+ case T_FIXNUM:
1371
+ case T_BIGNUM:
1372
+ case T_FLOAT:
1373
+ return rb_float_new((*f)(NUM2DBL(xx), a));
1374
+ break;
1375
+ case T_ARRAY:
1376
+ // n = RARRAY(xx)->len;
1377
+ n = RARRAY_LEN(xx);
1378
+ ary = rb_ary_new2(n);
1379
+ for (i = 0; i < n; i++) {
1380
+ x = rb_ary_entry(xx, i);
1381
+ Need_Float(x);
1382
+ rb_ary_store(ary, i, rb_float_new((*f)(NUM2DBL(x), a)));
1383
+ }
1384
+ return ary;
1385
+ break;
1386
+ default:
1387
+ #ifdef HAVE_NARRAY_H
1388
+ if (NA_IsNArray(xx)) {
1389
+ xx = na_change_type(xx, NA_DFLOAT);
1390
+ GetNArray(xx, na);
1391
+ ptr1 = (double *) na->ptr;
1392
+ n = na->total;
1393
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
1394
+ ptr2 = NA_PTR_TYPE(ary, double*);
1395
+ for (i = 0; i < n; i++) ptr2[i] = (*f)(ptr1[i], a);
1396
+ return ary;
1397
+ }
1398
+ #endif
1399
+ if (VECTOR_P(xx)) {
1400
+ Data_Get_Struct(xx, gsl_vector, v);
1401
+ vnew = gsl_vector_alloc(v->size);
1402
+ for (i = 0; i < v->size; i++) {
1403
+ gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i), a));
1404
+ }
1405
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
1406
+ } else if (MATRIX_P(xx)) {
1407
+ Data_Get_Struct(xx, gsl_matrix, m);
1408
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
1409
+ for (i = 0; i < m->size1; i++) {
1410
+ for (j = 0; j < m->size2; j++) {
1411
+ gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j), a));
1412
+ }
1413
+ }
1414
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
1415
+ } else {
1416
+ rb_raise(rb_eTypeError, "wrong argument type");
1417
+ }
1418
+ break;
1419
+ }
1420
+ /* never reach here */
1421
+ return Qnil;
1422
+ }
1423
+
1424
+ VALUE rb_gsl_eval_pdf_cdf3(VALUE xx, VALUE aa, VALUE bb,
1425
+ double (*f)(double, double, double))
1426
+ {
1427
+ VALUE x, ary;
1428
+ double a, b;
1429
+ gsl_vector *v = NULL, *vnew = NULL;
1430
+ gsl_matrix *m = NULL, *mnew = NULL;
1431
+ size_t i, j, n;
1432
+ #ifdef HAVE_NARRAY_H
1433
+ struct NARRAY *na;
1434
+ double *ptr1, *ptr2;
1435
+ #endif
1436
+ Need_Float(aa); Need_Float(bb);
1437
+ a = NUM2DBL(aa); b = NUM2DBL(bb);
1438
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
1439
+ switch(TYPE(xx)) {
1440
+ case T_FIXNUM:
1441
+ case T_BIGNUM:
1442
+ case T_FLOAT:
1443
+ return rb_float_new((*f)(NUM2DBL(xx), a, b));
1444
+ break;
1445
+ case T_ARRAY:
1446
+ // n = RARRAY(xx)->len;
1447
+ n = RARRAY_LEN(xx);
1448
+ ary = rb_ary_new2(n);
1449
+ for (i = 0; i < n; i++) {
1450
+ x = rb_ary_entry(xx, i);
1451
+ Need_Float(x);
1452
+ rb_ary_store(ary, i, rb_float_new((*f)(NUM2DBL(x), a, b)));
1453
+ }
1454
+ return ary;
1455
+ break;
1456
+ default:
1457
+ #ifdef HAVE_NARRAY_H
1458
+ if (NA_IsNArray(xx)) {
1459
+ xx = na_change_type(xx, NA_DFLOAT);
1460
+ GetNArray(xx, na);
1461
+ ptr1 = (double *) na->ptr;
1462
+ n = na->total;
1463
+ ary = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
1464
+ ptr2 = NA_PTR_TYPE(ary, double*);
1465
+ for (i = 0; i < n; i++) ptr2[i] = (*f)(ptr1[i], a, b);
1466
+ return ary;
1467
+ }
1468
+ #endif
1469
+ if (VECTOR_P(xx)) {
1470
+ Data_Get_Struct(xx, gsl_vector, v);
1471
+ vnew = gsl_vector_alloc(v->size);
1472
+ for (i = 0; i < v->size; i++) {
1473
+ gsl_vector_set(vnew, i, (*f)(gsl_vector_get(v, i), a, b));
1474
+ }
1475
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
1476
+ } else if (MATRIX_P(xx)) {
1477
+ Data_Get_Struct(xx, gsl_matrix, m);
1478
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
1479
+ for (i = 0; i < m->size1; i++) {
1480
+ for (j = 0; j < m->size2; j++) {
1481
+ gsl_matrix_set(mnew, i, j, (*f)(gsl_matrix_get(m, i, j), a, b));
1482
+ }
1483
+ }
1484
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
1485
+ } else {
1486
+ rb_raise(rb_eTypeError, "wrong argument type");
1487
+ }
1488
+ break;
1489
+ }
1490
+ /* never reach here */
1491
+ return Qnil;
1492
+ }
1493
+
1494
+ VALUE rb_gsl_eval_pdf_cdf2_uint(VALUE xx, VALUE aa,
1495
+ double (*f)(unsigned int, double))
1496
+ {
1497
+ VALUE x, ary;
1498
+ double a;
1499
+ gsl_vector *v = NULL, *vnew = NULL;
1500
+ gsl_vector_int *vi = NULL;
1501
+ gsl_matrix *m = NULL, *mnew = NULL;
1502
+ gsl_matrix_int *mi = NULL;
1503
+ size_t i, j, n;
1504
+ #ifdef HAVE_NARRAY_H
1505
+ struct NARRAY *na;
1506
+ char *ptr1, *ptr2;
1507
+ #endif
1508
+ Need_Float(aa);
1509
+ a = NUM2DBL(aa);
1510
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
1511
+ switch(TYPE(xx)) {
1512
+ case T_FIXNUM:
1513
+ case T_BIGNUM:
1514
+ case T_FLOAT:
1515
+ return rb_float_new((*f)(NUM2UINT(xx), a));
1516
+ break;
1517
+ case T_ARRAY:
1518
+ // n = RARRAY(xx)->len;
1519
+ n = RARRAY_LEN(xx);
1520
+ ary = rb_ary_new2(n);
1521
+ for (i = 0; i < n; i++) {
1522
+ x = rb_ary_entry(xx, i);
1523
+ rb_ary_store(ary, i, rb_float_new((*f)(NUM2UINT(x), a)));
1524
+ }
1525
+ return ary;
1526
+ break;
1527
+ default:
1528
+ #ifdef HAVE_NARRAY_H
1529
+ if (NA_IsNArray(xx)) {
1530
+ GetNArray(xx, na);
1531
+ n = na->total;
1532
+ ary = na_make_object(na->type, na->rank, na->shape, CLASS_OF(xx));
1533
+ ptr1 = (char *)na->ptr;
1534
+ ptr2 = (char *)NA_STRUCT(ary)->ptr;
1535
+ switch (na->type) {
1536
+ case NA_LINT:
1537
+ for (i = 0; i < n; i++)
1538
+ ((int*)ptr2)[i] = (*f)((unsigned int) ((int*)ptr1)[i], a);
1539
+ break;
1540
+ default:
1541
+ for (i = 0; i < n; i++)
1542
+ ((double*)ptr2)[i] = (*f)((unsigned int) ((double*)ptr1)[i], a);
1543
+ break;
1544
+ }
1545
+ return ary;
1546
+ }
1547
+ #endif
1548
+ if (VECTOR_P(xx)) {
1549
+ Data_Get_Struct(xx, gsl_vector, v);
1550
+ vnew = gsl_vector_alloc(v->size);
1551
+ for (i = 0; i < v->size; i++) {
1552
+ gsl_vector_set(vnew, i, (*f)((unsigned int) gsl_vector_get(v, i), a));
1553
+ }
1554
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
1555
+ } else if (VECTOR_INT_P(xx)) {
1556
+ Data_Get_Struct(xx, gsl_vector_int, vi);
1557
+ vnew = gsl_vector_alloc(vi->size);
1558
+ for (i = 0; i < vi->size; i++) {
1559
+ gsl_vector_set(vnew, i, (*f)((unsigned int) gsl_vector_int_get(vi, i), a));
1560
+ }
1561
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew);
1562
+ } else if (MATRIX_P(xx)) {
1563
+ Data_Get_Struct(xx, gsl_matrix, m);
1564
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
1565
+ for (i = 0; i < m->size1; i++) {
1566
+ for (j = 0; j < m->size2; j++) {
1567
+ gsl_matrix_set(mnew, i, j, (*f)((unsigned int) gsl_matrix_get(m, i, j), a));
1568
+ }
1569
+ }
1570
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
1571
+ } else if (MATRIX_INT_P(xx)) {
1572
+ Data_Get_Struct(xx, gsl_matrix_int, mi);
1573
+ mnew = gsl_matrix_alloc(mi->size1, mi->size2);
1574
+ for (i = 0; i < mi->size1; i++) {
1575
+ for (j = 0; j < mi->size2; j++) {
1576
+ gsl_matrix_set(mnew, i, j, (*f)((unsigned int) gsl_matrix_int_get(mi, i, j), a));
1577
+ }
1578
+ }
1579
+ return Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew);
1580
+ } else {
1581
+ rb_raise(rb_eTypeError, "wrong argument type");
1582
+ }
1583
+ break;
1584
+ }
1585
+ /* never reach here */
1586
+ return Qnil;
1587
+ }
1588
+
1589
+ /*
1590
+ static VALUE rb_gsl_ran_erlang(VALUE obj, VALUE a, VALUE n)
1591
+ {
1592
+ gsl_rng *r = NULL;
1593
+ Data_Get_Struct(obj, gsl_rng, r);
1594
+ return rb_float_new(gsl_ran_erlang(r, NUM2DBL(a), NUM2DBL(n)));
1595
+ }
1596
+
1597
+ static VALUE rb_gsl_ran_erlang_pdf(VALUE obj, VALUE x, VALUE a, VALUE n)
1598
+ {
1599
+ return rb_float_new(gsl_ran_erlang_pdf(NUM2DBL(x), NUM2DBL(a), NUM2DBL(n)));
1600
+ }
1601
+ */
1602
+
1603
+ #ifdef GSL_1_8_LATER
1604
+
1605
+ static VALUE rb_gsl_ran_gaussian_ziggurat(int argc, VALUE *argv, VALUE obj)
1606
+ {
1607
+ gsl_rng *r = NULL;
1608
+ gsl_vector *v;
1609
+ size_t n, i;
1610
+ double sigma = 1.0;
1611
+ switch (TYPE(obj)) {
1612
+ case T_MODULE: case T_CLASS: case T_OBJECT:
1613
+ switch (argc) {
1614
+ case 3:
1615
+ n = NUM2INT(argv[2]);
1616
+ sigma = NUM2DBL(argv[1]);
1617
+ CHECK_RNG(argv[0]);
1618
+ Data_Get_Struct(argv[0], gsl_rng, r);
1619
+ v = gsl_vector_alloc(n);
1620
+ for (i = 0; i < n; i++)
1621
+ gsl_vector_set(v, i, gsl_ran_gaussian_ziggurat(r, sigma));
1622
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
1623
+ break;
1624
+ case 2:
1625
+ sigma = NUM2DBL(argv[1]);
1626
+ /* no break */
1627
+ case 1:
1628
+ CHECK_RNG(argv[0]);
1629
+ Data_Get_Struct(argv[0], gsl_rng, r);
1630
+ return rb_float_new(gsl_ran_gaussian_ziggurat(r, sigma));
1631
+ break;
1632
+ default:
1633
+ rb_raise(rb_eArgError, "too many arguments (%d for 1 or 2)", argc);
1634
+ return Qnil;
1635
+ break;
1636
+ }
1637
+ break;
1638
+ default:
1639
+ Data_Get_Struct(obj, gsl_rng, r);
1640
+ switch (argc) {
1641
+ case 2:
1642
+ n = NUM2INT(argv[1]);
1643
+ sigma = NUM2DBL(argv[0]);
1644
+ v = gsl_vector_alloc(n);
1645
+ for (i = 0; i < n; i++)
1646
+ gsl_vector_set(v, i, gsl_ran_gaussian_ziggurat(r, sigma));
1647
+ return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
1648
+ break;
1649
+ case 1:
1650
+ sigma = NUM2DBL(argv[0]);
1651
+ /* no break */
1652
+ case 0:
1653
+ return rb_float_new(gsl_ran_gaussian_ziggurat(r, sigma));
1654
+ break;
1655
+ default:
1656
+ rb_raise(rb_eArgError, "too many arguments (%d for 0 or 1)", argc);
1657
+ return Qnil;
1658
+ break;
1659
+ }
1660
+ break;
1661
+ }
1662
+ return Qnil;
1663
+ }
1664
+
1665
+ static VALUE rb_gsl_ran_gamma_mt(int argc, VALUE *argv, VALUE obj)
1666
+ {
1667
+ return rb_gsl_ran_eval2(argc, argv, obj, gsl_ran_gamma_mt);
1668
+ }
1669
+ #endif
1670
+
1671
+ void Init_gsl_ran(VALUE module)
1672
+ {
1673
+ VALUE mgsl_ran;
1674
+ VALUE cgsl_ran_discrete;
1675
+
1676
+ mgsl_ran = rb_define_module_under(module, "Ran");
1677
+
1678
+ rb_define_module_function(mgsl_ran, "gaussian", rb_gsl_ran_gaussian, -1);
1679
+ rb_define_module_function(mgsl_ran, "ugaussian", rb_gsl_ran_gaussian, -1);
1680
+ rb_define_method(cgsl_rng, "gaussian", rb_gsl_ran_gaussian, -1);
1681
+ rb_define_alias(cgsl_rng, "ugaussian", "gaussian");
1682
+
1683
+ rb_define_module_function(mgsl_ran, "gaussian_ratio_method",
1684
+ rb_gsl_ran_gaussian_ratio_method, -1);
1685
+ rb_define_module_function(mgsl_ran, "ugaussian_ratio_method",
1686
+ rb_gsl_ran_gaussian_ratio_method, -1);
1687
+ rb_define_method(cgsl_rng, "gaussian_ratio_method",
1688
+ rb_gsl_ran_gaussian_ratio_method, -1);
1689
+ rb_define_alias(cgsl_rng, "ugaussian_ratio_method", "gaussian_ratio_method");
1690
+ rb_define_module_function(mgsl_ran, "gaussian_pdf", rb_gsl_ran_gaussian_pdf, -1);
1691
+ rb_define_module_function(mgsl_ran, "ugaussian_pdf", rb_gsl_ran_gaussian_pdf, -1);
1692
+
1693
+ rb_define_module_function(mgsl_ran, "gaussian_tail", rb_gsl_ran_gaussian_tail, -1);
1694
+ rb_define_module_function(mgsl_ran, "ugaussian_tail", rb_gsl_ran_gaussian_tail, -1);
1695
+ rb_define_method(cgsl_rng, "gaussian_tail", rb_gsl_ran_gaussian_tail, -1);
1696
+ rb_define_alias(cgsl_rng, "ugaussian_tail", "gaussian_tail");
1697
+ rb_define_module_function(mgsl_ran, "gaussian_tail_pdf",
1698
+ rb_gsl_ran_gaussian_tail_pdf, -1);
1699
+ rb_define_module_function(mgsl_ran, "ugaussian_tail_pdf",
1700
+ rb_gsl_ran_gaussian_tail_pdf, -1);
1701
+
1702
+ rb_define_module_function(mgsl_ran, "bivariate_gaussian",
1703
+ rb_gsl_ran_bivariate_gaussian, -1);
1704
+ rb_define_method(cgsl_rng, "bivariate_gaussian",
1705
+ rb_gsl_ran_bivariate_gaussian, -1);
1706
+ rb_define_module_function(mgsl_ran, "bivariate_gaussian_pdf",
1707
+ rb_gsl_ran_bivariate_gaussian_pdf, 5);
1708
+
1709
+ rb_define_module_function(mgsl_ran, "exponential", rb_gsl_ran_exponential, -1);
1710
+ rb_define_method(cgsl_rng, "exponential", rb_gsl_ran_exponential, -1);
1711
+ rb_define_module_function(mgsl_ran, "exponential_pdf",
1712
+ rb_gsl_ran_exponential_pdf, 2);
1713
+
1714
+ rb_define_module_function(mgsl_ran, "laplace", rb_gsl_ran_laplace, -1);
1715
+ rb_define_method(cgsl_rng, "laplace", rb_gsl_ran_laplace, -1);
1716
+ rb_define_module_function(mgsl_ran, "laplace_pdf", rb_gsl_ran_laplace_pdf, 2);
1717
+
1718
+ rb_define_module_function(mgsl_ran, "exppow", rb_gsl_ran_exppow, -1);
1719
+ rb_define_method(cgsl_rng, "exppow", rb_gsl_ran_exppow, -1);
1720
+ rb_define_module_function(mgsl_ran, "exppow_pdf", rb_gsl_ran_exppow_pdf, 3);
1721
+
1722
+ rb_define_module_function(mgsl_ran, "cauchy", rb_gsl_ran_cauchy, -1);
1723
+ rb_define_method(cgsl_rng, "cauchy", rb_gsl_ran_cauchy, -1);
1724
+ rb_define_module_function(mgsl_ran, "cauchy_pdf", rb_gsl_ran_cauchy_pdf, 2);
1725
+
1726
+ rb_define_module_function(mgsl_ran, "rayleigh", rb_gsl_ran_rayleigh, -1);
1727
+ rb_define_method(cgsl_rng, "rayleigh", rb_gsl_ran_rayleigh, -1);
1728
+ rb_define_module_function(mgsl_ran, "rayleigh_pdf", rb_gsl_ran_rayleigh_pdf, 2);
1729
+
1730
+ rb_define_module_function(mgsl_ran, "rayleigh_tail", rb_gsl_ran_rayleigh_tail, -1);
1731
+ rb_define_method(cgsl_rng, "rayleigh_tail", rb_gsl_ran_rayleigh_tail, -1);
1732
+ rb_define_module_function(mgsl_ran, "rayleigh_tail_pdf",
1733
+ rb_gsl_ran_rayleigh_tail_pdf, 3);
1734
+
1735
+ rb_define_module_function(mgsl_ran, "landau", rb_gsl_ran_landau, -1);
1736
+ rb_define_method(cgsl_rng, "landau", rb_gsl_ran_landau, -1);
1737
+ rb_define_module_function(mgsl_ran, "landau_pdf", rb_gsl_ran_landau_pdf, 1);
1738
+
1739
+ rb_define_method(cgsl_rng, "levy", rb_gsl_ran_levy, -1);
1740
+ rb_define_method(cgsl_rng, "levy_skew", rb_gsl_ran_levy_skew, -1);
1741
+ rb_define_module_function(mgsl_ran, "levy", rb_gsl_ran_levy, -1);
1742
+ rb_define_module_function(mgsl_ran, "levy_skew", rb_gsl_ran_levy_skew, -1);
1743
+
1744
+ rb_define_module_function(mgsl_ran, "gamma", rb_gsl_ran_gamma, -1);
1745
+ rb_define_method(cgsl_rng, "gamma", rb_gsl_ran_gamma, -1);
1746
+ rb_define_module_function(mgsl_ran, "gamma_pdf", rb_gsl_ran_gamma_pdf, 3);
1747
+
1748
+ rb_define_module_function(mgsl_ran, "flat", rb_gsl_ran_flat, -1);
1749
+ rb_define_method(cgsl_rng, "flat", rb_gsl_ran_flat, -1);
1750
+ rb_define_module_function(mgsl_ran, "flat_pdf", rb_gsl_ran_flat_pdf, 3);
1751
+
1752
+ rb_define_module_function(mgsl_ran, "lognormal", rb_gsl_ran_lognormal, -1);
1753
+ rb_define_method(cgsl_rng, "lognormal", rb_gsl_ran_lognormal, -1);
1754
+ rb_define_module_function(mgsl_ran, "lognormal_pdf", rb_gsl_ran_lognormal_pdf, 3);
1755
+
1756
+ rb_define_module_function(mgsl_ran, "chisq", rb_gsl_ran_chisq, -1);
1757
+ rb_define_method(cgsl_rng, "chisq", rb_gsl_ran_chisq, -1);
1758
+ rb_define_module_function(mgsl_ran, "chisq_pdf", rb_gsl_ran_chisq_pdf, 2);
1759
+
1760
+ rb_define_module_function(mgsl_ran, "fdist", rb_gsl_ran_fdist, -1);
1761
+ rb_define_method(cgsl_rng, "fdist", rb_gsl_ran_fdist, -1);
1762
+ rb_define_module_function(mgsl_ran, "fdist_pdf", rb_gsl_ran_fdist_pdf, 3);
1763
+
1764
+ rb_define_module_function(mgsl_ran, "tdist", rb_gsl_ran_tdist, -1);
1765
+ rb_define_method(cgsl_rng, "tdist", rb_gsl_ran_tdist, -1);
1766
+ rb_define_module_function(mgsl_ran, "tdist_pdf", rb_gsl_ran_tdist_pdf, 2);
1767
+
1768
+ rb_define_module_function(mgsl_ran, "beta", rb_gsl_ran_beta, -1);
1769
+ rb_define_method(cgsl_rng, "beta", rb_gsl_ran_beta, -1);
1770
+ rb_define_module_function(mgsl_ran, "beta_pdf", rb_gsl_ran_beta_pdf, 3);
1771
+
1772
+ rb_define_module_function(mgsl_ran, "logistic", rb_gsl_ran_logistic, -1);
1773
+ rb_define_method(cgsl_rng, "logistic", rb_gsl_ran_logistic, -1);
1774
+ rb_define_module_function(mgsl_ran, "logistic_pdf", rb_gsl_ran_logistic_pdf, 2);
1775
+
1776
+ rb_define_module_function(mgsl_ran, "pareto", rb_gsl_ran_pareto, -1);
1777
+ rb_define_method(cgsl_rng, "pareto", rb_gsl_ran_pareto, -1);
1778
+ rb_define_module_function(mgsl_ran, "pareto_pdf", rb_gsl_ran_pareto_pdf, 3);
1779
+
1780
+ rb_define_module_function(mgsl_ran, "weibull", rb_gsl_ran_weibull, -1);
1781
+ rb_define_method(cgsl_rng, "weibull", rb_gsl_ran_weibull, -1);
1782
+ rb_define_module_function(mgsl_ran, "weibull_pdf", rb_gsl_ran_weibull_pdf, 3);
1783
+
1784
+ rb_define_module_function(mgsl_ran, "gumbel1", rb_gsl_ran_gumbel1, -1);
1785
+ rb_define_method(cgsl_rng, "gumbel1", rb_gsl_ran_gumbel1, -1);
1786
+ rb_define_module_function(mgsl_ran, "gumbel1_pdf", rb_gsl_ran_gumbel1_pdf, 3);
1787
+
1788
+ rb_define_module_function(mgsl_ran, "gumbel2", rb_gsl_ran_gumbel2, -1);
1789
+ rb_define_method(cgsl_rng, "gumbel2", rb_gsl_ran_gumbel2, -1);
1790
+ rb_define_module_function(mgsl_ran, "gumbel2_pdf", rb_gsl_ran_gumbel2_pdf, 3);
1791
+
1792
+ rb_define_module_function(mgsl_ran, "poisson", rb_gsl_ran_poisson, -1);
1793
+ rb_define_method(cgsl_rng, "poisson", rb_gsl_ran_poisson, -1);
1794
+ rb_define_module_function(mgsl_ran, "poisson_pdf", rb_gsl_ran_poisson_pdf, 2);
1795
+
1796
+ rb_define_module_function(mgsl_ran, "bernoulli", rb_gsl_ran_bernoulli, -1);
1797
+ rb_define_method(cgsl_rng, "bernoulli", rb_gsl_ran_bernoulli, -1);
1798
+ rb_define_module_function(mgsl_ran, "bernoulli_pdf", rb_gsl_ran_bernoulli_pdf, 2);
1799
+
1800
+ rb_define_module_function(mgsl_ran, "binomial", rb_gsl_ran_binomial, -1);
1801
+ rb_define_method(cgsl_rng, "binomial", rb_gsl_ran_binomial, -1);
1802
+ #ifdef GSL_1_4_LATER
1803
+ rb_define_module_function(mgsl_ran, "binomial_tpe", rb_gsl_ran_binomial_tpe, -1);
1804
+ rb_define_method(cgsl_rng, "binomial_tpe", rb_gsl_ran_binomial_tpe, -1);
1805
+ #endif
1806
+ rb_define_module_function(mgsl_ran, "binomial_pdf", rb_gsl_ran_binomial_pdf, 3);
1807
+
1808
+ rb_define_module_function(mgsl_ran, "negative_binomial",
1809
+ rb_gsl_ran_negative_binomial, -1);
1810
+ rb_define_method(cgsl_rng, "negative_binomial", rb_gsl_ran_negative_binomial, -1);
1811
+ rb_define_module_function(mgsl_ran, "negative_binomial_pdf", rb_gsl_ran_negative_binomial_pdf, 3);
1812
+
1813
+ rb_define_module_function(mgsl_ran, "pascal", rb_gsl_ran_pascal, -1);
1814
+ rb_define_method(cgsl_rng, "pascal", rb_gsl_ran_pascal, -1);
1815
+ rb_define_module_function(mgsl_ran, "pascal_pdf", rb_gsl_ran_pascal_pdf, 3);
1816
+
1817
+ rb_define_module_function(mgsl_ran, "geometric", rb_gsl_ran_geometric, -1);
1818
+ rb_define_method(cgsl_rng, "geometric", rb_gsl_ran_geometric, -1);
1819
+ rb_define_module_function(mgsl_ran, "geometric_pdf", rb_gsl_ran_geometric_pdf, 2);
1820
+
1821
+ rb_define_module_function(mgsl_ran, "hypergeometric", rb_gsl_ran_hypergeometric, -1);
1822
+ rb_define_method(cgsl_rng, "hypergeometric", rb_gsl_ran_hypergeometric, -1);
1823
+ rb_define_module_function(mgsl_ran, "hypergeometric_pdf",
1824
+ rb_gsl_ran_hypergeometric_pdf, 4);
1825
+
1826
+ rb_define_module_function(mgsl_ran, "logarithmic", rb_gsl_ran_logarithmic, -1);
1827
+ rb_define_method(cgsl_rng, "logarithmic", rb_gsl_ran_logarithmic, -1);
1828
+ rb_define_module_function(mgsl_ran, "logarithmic_pdf",
1829
+ rb_gsl_ran_logarithmic_pdf, 2);
1830
+
1831
+ rb_define_module_function(mgsl_ran, "dir_2d", rb_gsl_ran_dir_2d, -1);
1832
+ rb_define_module_function(mgsl_ran, "dir_2d_trig_method",
1833
+ rb_gsl_ran_dir_2d_trig_method, -1);
1834
+ rb_define_module_function(mgsl_ran, "dir_3d", rb_gsl_ran_dir_3d, -1);
1835
+ rb_define_module_function(mgsl_ran, "dir_nd", rb_gsl_ran_dir_nd, -1);
1836
+
1837
+ rb_define_method(cgsl_rng, "dir_2d", rb_gsl_ran_dir_2d, -1);
1838
+ rb_define_method(cgsl_rng, "dir_2d_trig_method", rb_gsl_ran_dir_2d_trig_method, -1);
1839
+ rb_define_method(cgsl_rng, "dir_3d", rb_gsl_ran_dir_3d, -1);
1840
+ rb_define_method(cgsl_rng, "dir_nd", rb_gsl_ran_dir_nd, -1);
1841
+
1842
+ rb_define_method(cgsl_rng, "shuffle", rb_gsl_ran_shuffle, -1);
1843
+ rb_define_module_function(mgsl_ran, "shuffle", rb_gsl_ran_shuffle, -1);
1844
+ rb_define_method(cgsl_rng, "choose", rb_gsl_ran_choose, -1);
1845
+ rb_define_singleton_method(mgsl_ran, "choose", rb_gsl_ran_choose_singleton, -1);
1846
+ rb_define_method(cgsl_rng, "sample", rb_gsl_ran_sample, 2);
1847
+
1848
+ /*****/
1849
+
1850
+ cgsl_ran_discrete = rb_define_class_under(mgsl_ran, "Discrete", cGSL_Object);
1851
+ rb_define_singleton_method(cgsl_ran_discrete, "alloc", rb_gsl_ran_discrete_new, 1);
1852
+ rb_define_singleton_method(cgsl_ran_discrete, "preproc", rb_gsl_ran_discrete_new, 1);
1853
+ rb_define_method(cgsl_rng, "discrete", rb_gsl_ran_discrete, 1);
1854
+ rb_define_module_function(mgsl_ran, "discrete_pdf", rb_gsl_ran_discrete_pdf, 2);
1855
+
1856
+ #ifdef GSL_1_3_LATER
1857
+ rb_define_method(cgsl_rng, "dirichlet", rb_gsl_ran_dirichlet, -1);
1858
+ rb_define_module_function(mgsl_ran, "dirichlet_pdf", rb_gsl_ran_dirichlet_pdf, 2);
1859
+ rb_define_module_function(mgsl_ran, "dirichlet_lnpdf", rb_gsl_ran_dirichlet_lnpdf, 2);
1860
+ #endif
1861
+
1862
+ /* rb_define_method(cgsl_rng, "erlang", rb_gsl_ran_erlang, 2);
1863
+ rb_define_method(module, "ran_erlang_pdf", rb_gsl_ran_erlang_pdf, 3);
1864
+ rb_define_method(mgsl_ran, "erlang_pdf", rb_gsl_ran_erlang_pdf, 3);*/
1865
+
1866
+ #ifdef GSL_1_8_LATER
1867
+ rb_define_module_function(mgsl_ran, "gaussian_ziggurat", rb_gsl_ran_gaussian_ziggurat, -1);
1868
+ rb_define_method(cgsl_rng, "gaussian_ziggurat", rb_gsl_ran_gaussian_ziggurat, -1);
1869
+ rb_define_module_function(mgsl_ran, "gamma_mt", rb_gsl_ran_gamma_mt, -1);
1870
+ rb_define_method(cgsl_rng, "gamma_mt", rb_gsl_ran_gamma_mt, -1);
1871
+ #endif
1872
+
1873
+ }