romanbsd-gsl 1.11.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. data/README.rdoc +29 -0
  2. data/Rakefile +54 -0
  3. data/VERSION +1 -0
  4. data/ext/MANIFEST +116 -0
  5. data/ext/array.c +665 -0
  6. data/ext/array_complex.c +247 -0
  7. data/ext/blas.c +29 -0
  8. data/ext/blas1.c +729 -0
  9. data/ext/blas2.c +1093 -0
  10. data/ext/blas3.c +881 -0
  11. data/ext/block.c +44 -0
  12. data/ext/block_source.c +885 -0
  13. data/ext/bspline.c +116 -0
  14. data/ext/bundle.c +3 -0
  15. data/ext/cdf.c +754 -0
  16. data/ext/cheb.c +538 -0
  17. data/ext/combination.c +283 -0
  18. data/ext/common.c +310 -0
  19. data/ext/complex.c +1005 -0
  20. data/ext/const.c +668 -0
  21. data/ext/const_additional.c +120 -0
  22. data/ext/cqp.c +283 -0
  23. data/ext/deriv.c +194 -0
  24. data/ext/dht.c +360 -0
  25. data/ext/diff.c +165 -0
  26. data/ext/dirac.c +395 -0
  27. data/ext/eigen.c +2373 -0
  28. data/ext/error.c +194 -0
  29. data/ext/extconf.rb +272 -0
  30. data/ext/fcmp.c +66 -0
  31. data/ext/fft.c +1092 -0
  32. data/ext/fit.c +205 -0
  33. data/ext/fresnel.c +312 -0
  34. data/ext/function.c +522 -0
  35. data/ext/graph.c +1634 -0
  36. data/ext/gsl.c +265 -0
  37. data/ext/gsl_narray.c +652 -0
  38. data/ext/histogram.c +1717 -0
  39. data/ext/histogram2d.c +1067 -0
  40. data/ext/histogram3d.c +883 -0
  41. data/ext/histogram3d_source.c +750 -0
  42. data/ext/histogram_find.c +101 -0
  43. data/ext/histogram_oper.c +159 -0
  44. data/ext/ieee.c +98 -0
  45. data/ext/integration.c +1138 -0
  46. data/ext/interp.c +511 -0
  47. data/ext/jacobi.c +737 -0
  48. data/ext/linalg.c +4045 -0
  49. data/ext/linalg_complex.c +743 -0
  50. data/ext/math.c +724 -0
  51. data/ext/matrix.c +39 -0
  52. data/ext/matrix_complex.c +1731 -0
  53. data/ext/matrix_double.c +560 -0
  54. data/ext/matrix_int.c +256 -0
  55. data/ext/matrix_source.c +2678 -0
  56. data/ext/min.c +234 -0
  57. data/ext/monte.c +759 -0
  58. data/ext/multifit.c +1810 -0
  59. data/ext/multimin.c +793 -0
  60. data/ext/multimin_fsdf.c +156 -0
  61. data/ext/multiroots.c +952 -0
  62. data/ext/ndlinear.c +320 -0
  63. data/ext/nmf.c +159 -0
  64. data/ext/nmf_wrap.c +63 -0
  65. data/ext/ntuple.c +469 -0
  66. data/ext/odeiv.c +958 -0
  67. data/ext/ool.c +879 -0
  68. data/ext/oper_complex_source.c +253 -0
  69. data/ext/permutation.c +596 -0
  70. data/ext/poly.c +42 -0
  71. data/ext/poly2.c +265 -0
  72. data/ext/poly_source.c +1799 -0
  73. data/ext/qrng.c +171 -0
  74. data/ext/randist.c +1869 -0
  75. data/ext/rational.c +480 -0
  76. data/ext/rng.c +612 -0
  77. data/ext/root.c +408 -0
  78. data/ext/sf.c +1494 -0
  79. data/ext/sf_airy.c +200 -0
  80. data/ext/sf_bessel.c +867 -0
  81. data/ext/sf_clausen.c +28 -0
  82. data/ext/sf_coulomb.c +206 -0
  83. data/ext/sf_coupling.c +118 -0
  84. data/ext/sf_dawson.c +29 -0
  85. data/ext/sf_debye.c +157 -0
  86. data/ext/sf_dilog.c +42 -0
  87. data/ext/sf_elementary.c +44 -0
  88. data/ext/sf_ellint.c +206 -0
  89. data/ext/sf_elljac.c +29 -0
  90. data/ext/sf_erfc.c +93 -0
  91. data/ext/sf_exp.c +164 -0
  92. data/ext/sf_expint.c +211 -0
  93. data/ext/sf_fermi_dirac.c +148 -0
  94. data/ext/sf_gamma.c +344 -0
  95. data/ext/sf_gegenbauer.c +96 -0
  96. data/ext/sf_hyperg.c +197 -0
  97. data/ext/sf_laguerre.c +112 -0
  98. data/ext/sf_lambert.c +47 -0
  99. data/ext/sf_legendre.c +367 -0
  100. data/ext/sf_log.c +104 -0
  101. data/ext/sf_mathieu.c +238 -0
  102. data/ext/sf_power.c +46 -0
  103. data/ext/sf_psi.c +98 -0
  104. data/ext/sf_synchrotron.c +48 -0
  105. data/ext/sf_transport.c +76 -0
  106. data/ext/sf_trigonometric.c +207 -0
  107. data/ext/sf_zeta.c +119 -0
  108. data/ext/signal.c +310 -0
  109. data/ext/siman.c +718 -0
  110. data/ext/sort.c +208 -0
  111. data/ext/spline.c +393 -0
  112. data/ext/stats.c +799 -0
  113. data/ext/sum.c +168 -0
  114. data/ext/tamu_anova.c +56 -0
  115. data/ext/tensor.c +38 -0
  116. data/ext/tensor_source.c +1121 -0
  117. data/ext/vector.c +38 -0
  118. data/ext/vector_complex.c +2139 -0
  119. data/ext/vector_double.c +1445 -0
  120. data/ext/vector_int.c +204 -0
  121. data/ext/vector_source.c +3325 -0
  122. data/ext/wavelet.c +937 -0
  123. data/include/rb_gsl.h +140 -0
  124. data/include/rb_gsl_array.h +230 -0
  125. data/include/rb_gsl_cheb.h +21 -0
  126. data/include/rb_gsl_common.h +343 -0
  127. data/include/rb_gsl_complex.h +25 -0
  128. data/include/rb_gsl_const.h +29 -0
  129. data/include/rb_gsl_dirac.h +15 -0
  130. data/include/rb_gsl_eigen.h +17 -0
  131. data/include/rb_gsl_fft.h +62 -0
  132. data/include/rb_gsl_fit.h +25 -0
  133. data/include/rb_gsl_function.h +27 -0
  134. data/include/rb_gsl_graph.h +70 -0
  135. data/include/rb_gsl_histogram.h +65 -0
  136. data/include/rb_gsl_histogram3d.h +97 -0
  137. data/include/rb_gsl_integration.h +17 -0
  138. data/include/rb_gsl_interp.h +46 -0
  139. data/include/rb_gsl_linalg.h +25 -0
  140. data/include/rb_gsl_math.h +26 -0
  141. data/include/rb_gsl_odeiv.h +21 -0
  142. data/include/rb_gsl_poly.h +71 -0
  143. data/include/rb_gsl_rational.h +37 -0
  144. data/include/rb_gsl_rng.h +21 -0
  145. data/include/rb_gsl_root.h +22 -0
  146. data/include/rb_gsl_sf.h +119 -0
  147. data/include/rb_gsl_statistics.h +17 -0
  148. data/include/rb_gsl_tensor.h +45 -0
  149. data/include/rb_gsl_with_narray.h +22 -0
  150. data/include/templates_off.h +87 -0
  151. data/include/templates_on.h +241 -0
  152. data/lib/gsl/gnuplot.rb +41 -0
  153. data/lib/gsl/oper.rb +68 -0
  154. data/lib/ool.rb +22 -0
  155. data/lib/ool/conmin.rb +30 -0
  156. metadata +221 -0
data/ext/min.c ADDED
@@ -0,0 +1,234 @@
1
+ /*
2
+ min.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2004 by Yoshiki Tsunesada
5
+
6
+ Ruby/GSL is free software: you can redistribute it and/or modify it
7
+ under the terms of the GNU General Public License.
8
+ This library is distributed in the hope that it will be useful, but
9
+ WITHOUT ANY WARRANTY.
10
+ */
11
+
12
+ #include "rb_gsl.h"
13
+ #include "rb_gsl_function.h"
14
+ #include <gsl/gsl_min.h>
15
+
16
+ double rb_gsl_function_f(double x, void *p);
17
+
18
+ enum {
19
+ GSL_MIN_FMINIMIZER_GOLDENSECTION,
20
+ GSL_MIN_FMINIMIZER_BRENT,
21
+ };
22
+ static const gsl_min_fminimizer_type* rb_gsl_min_fminimizer_type_get(VALUE t);
23
+
24
+ static const gsl_min_fminimizer_type* rb_gsl_min_fminimizer_type_get(VALUE t)
25
+ {
26
+ char name[32];
27
+ switch (TYPE(t)) {
28
+ case T_STRING:
29
+ strcpy(name, STR2CSTR(t));
30
+ if (str_tail_grep(name, "goldensection") == 0)
31
+ return gsl_min_fminimizer_goldensection;
32
+ else if (str_tail_grep(name, "brent") == 0)
33
+ return gsl_min_fminimizer_brent;
34
+ else
35
+ rb_raise(rb_eTypeError, "unknown type %s (goldensection or brent expected)",
36
+ name);
37
+ break;
38
+ case T_FIXNUM:
39
+ switch (FIX2INT(t)) {
40
+ case GSL_MIN_FMINIMIZER_GOLDENSECTION:
41
+ return gsl_min_fminimizer_goldensection;
42
+ break;
43
+ case GSL_MIN_FMINIMIZER_BRENT:
44
+ return gsl_min_fminimizer_brent;
45
+ break;
46
+ default:
47
+ rb_raise(rb_eTypeError, "unknown type (GOLDENSECION or BRENT expected)");
48
+ break;
49
+ }
50
+ break;
51
+ default:
52
+ rb_raise(rb_eTypeError, "wrong argument type %s (String of Fixnum)",
53
+ rb_class2name(CLASS_OF(t)));
54
+ break;
55
+ }
56
+ }
57
+
58
+ static VALUE rb_gsl_min_fminimizer_new(VALUE klass, VALUE t)
59
+ {
60
+ gsl_min_fminimizer *gmf = NULL;
61
+ const gsl_min_fminimizer_type *T;
62
+ T = rb_gsl_min_fminimizer_type_get(t);
63
+ gmf = gsl_min_fminimizer_alloc(T);
64
+ return Data_Wrap_Struct(klass, 0, gsl_min_fminimizer_free, gmf);
65
+ }
66
+
67
+ static VALUE rb_gsl_min_fminimizer_name(VALUE obj)
68
+ {
69
+ gsl_min_fminimizer *gmf = NULL;
70
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
71
+ return rb_str_new2(gsl_min_fminimizer_name(gmf));
72
+ }
73
+
74
+ static VALUE rb_gsl_min_fminimizer_set(VALUE obj, VALUE ff, VALUE xmin,
75
+ VALUE xl, VALUE xu)
76
+ {
77
+ gsl_min_fminimizer *gmf = NULL;
78
+ gsl_function *f = NULL;
79
+ Need_Float(xmin); Need_Float(xl); Need_Float(xu);
80
+ CHECK_FUNCTION(ff);
81
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
82
+ Data_Get_Struct(ff, gsl_function, f);
83
+ return INT2FIX(gsl_min_fminimizer_set(gmf, f, NUM2DBL(xmin),
84
+ NUM2DBL(xl), NUM2DBL(xu)));
85
+ }
86
+
87
+ static VALUE rb_gsl_min_fminimizer_set_with_values(VALUE obj, VALUE ff,
88
+ VALUE xmin, VALUE fmin,
89
+ VALUE xl, VALUE fl,
90
+ VALUE xu, VALUE fu)
91
+ {
92
+ gsl_min_fminimizer *gmf = NULL;
93
+ gsl_function *f = NULL;
94
+ Need_Float(xmin); Need_Float(xl); Need_Float(xu);
95
+ Need_Float(fl); Need_Float(fu);
96
+ CHECK_FUNCTION(ff);
97
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
98
+ Data_Get_Struct(ff, gsl_function, f);
99
+ return INT2FIX(gsl_min_fminimizer_set_with_values(gmf, f, NUM2DBL(xmin),
100
+ NUM2DBL(fmin),
101
+ NUM2DBL(xl), NUM2DBL(fl),
102
+ NUM2DBL(xu), NUM2DBL(fu)));
103
+ }
104
+
105
+ static VALUE rb_gsl_min_fminimizer_iterate(VALUE obj)
106
+ {
107
+ gsl_min_fminimizer *gmf = NULL;
108
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
109
+ return INT2FIX(gsl_min_fminimizer_iterate(gmf));
110
+ }
111
+
112
+ static VALUE rb_gsl_min_fminimizer_x_lower(VALUE obj)
113
+ {
114
+ gsl_min_fminimizer *gmf = NULL;
115
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
116
+ return rb_float_new(gsl_min_fminimizer_x_lower(gmf));
117
+ }
118
+
119
+ static VALUE rb_gsl_min_fminimizer_x_upper(VALUE obj)
120
+ {
121
+ gsl_min_fminimizer *gmf = NULL;
122
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
123
+ return rb_float_new(gsl_min_fminimizer_x_upper(gmf));
124
+ }
125
+
126
+ #ifndef GSL_1_2_LATER
127
+ static double gsl_min_fminimizer_x_minimum(const gsl_min_fminimizer * s)
128
+ {
129
+ /* return s->x_minimum;*/
130
+ return s->minimum;
131
+ }
132
+
133
+ static double gsl_min_fminimizer_f_minimum(const gsl_min_fminimizer * s)
134
+ {
135
+ return s->f_minimum;
136
+ }
137
+
138
+ static double gsl_min_fminimizer_f_lower(const gsl_min_fminimizer * s)
139
+ {
140
+ return s->f_lower;
141
+ }
142
+
143
+ static double gsl_min_fminimizer_f_upper(const gsl_min_fminimizer * s)
144
+ {
145
+ return s->f_upper;
146
+ }
147
+ #endif
148
+
149
+ static VALUE rb_gsl_min_fminimizer_x_minimum(VALUE obj)
150
+ {
151
+ gsl_min_fminimizer *gmf = NULL;
152
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
153
+ return rb_float_new(gsl_min_fminimizer_x_minimum(gmf));
154
+ }
155
+
156
+ static VALUE rb_gsl_min_fminimizer_f_minimum(VALUE obj)
157
+ {
158
+ gsl_min_fminimizer *gmf = NULL;
159
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
160
+ return rb_float_new(gsl_min_fminimizer_f_minimum(gmf));
161
+ }
162
+
163
+ static VALUE rb_gsl_min_fminimizer_f_lower(VALUE obj)
164
+ {
165
+ gsl_min_fminimizer *gmf = NULL;
166
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
167
+ return rb_float_new(gsl_min_fminimizer_f_lower(gmf));
168
+ }
169
+
170
+ static VALUE rb_gsl_min_fminimizer_f_upper(VALUE obj)
171
+ {
172
+ gsl_min_fminimizer *gmf = NULL;
173
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
174
+ return rb_float_new(gsl_min_fminimizer_f_upper(gmf));
175
+ }
176
+
177
+ static VALUE rb_gsl_min_fminimizer_test_interval(VALUE obj, VALUE ea, VALUE er)
178
+ {
179
+ gsl_min_fminimizer *gmf = NULL;
180
+ double xl, xu;
181
+ Need_Float(ea); Need_Float(er);
182
+ Data_Get_Struct(obj, gsl_min_fminimizer, gmf);
183
+ xl = gsl_min_fminimizer_x_lower(gmf);
184
+ xu = gsl_min_fminimizer_x_upper(gmf);
185
+ return INT2FIX(gsl_min_test_interval(xl, xu, NUM2DBL(ea), NUM2DBL(er)));
186
+ }
187
+
188
+ static VALUE rb_gsl_fminimizer_test_interval(VALUE obj, VALUE xl, VALUE xu,
189
+ VALUE ea, VALUE er)
190
+ {
191
+ Need_Float(xl); Need_Float(xu);
192
+ Need_Float(ea); Need_Float(er);
193
+ return INT2FIX(gsl_min_test_interval(NUM2DBL(xl), NUM2DBL(xu),
194
+ NUM2DBL(ea), NUM2DBL(er)));
195
+ }
196
+
197
+ void Init_gsl_min(VALUE module)
198
+ {
199
+ VALUE mgsl_min, cgsl_fminimizer;
200
+
201
+ mgsl_min = rb_define_module_under(module, "Min");
202
+
203
+ cgsl_fminimizer = rb_define_class_under(mgsl_min, "FMinimizer", cGSL_Object);
204
+
205
+ rb_define_const(cgsl_fminimizer, "GOLDENSECTION",
206
+ INT2FIX(GSL_MIN_FMINIMIZER_GOLDENSECTION));
207
+ rb_define_const(cgsl_fminimizer, "Goldensection",
208
+ INT2FIX(GSL_MIN_FMINIMIZER_GOLDENSECTION));
209
+ rb_define_const(cgsl_fminimizer, "BRENT",
210
+ INT2FIX(GSL_MIN_FMINIMIZER_BRENT));
211
+ rb_define_const(cgsl_fminimizer, "Brent",
212
+ INT2FIX(GSL_MIN_FMINIMIZER_BRENT));
213
+
214
+ rb_define_singleton_method(cgsl_fminimizer, "new", rb_gsl_min_fminimizer_new, 1);
215
+ rb_define_singleton_method(cgsl_fminimizer, "alloc", rb_gsl_min_fminimizer_new, 1);
216
+
217
+ rb_define_method(cgsl_fminimizer, "name", rb_gsl_min_fminimizer_name, 0);
218
+ rb_define_method(cgsl_fminimizer, "set", rb_gsl_min_fminimizer_set, 4);
219
+ rb_define_method(cgsl_fminimizer, "set_with_values", rb_gsl_min_fminimizer_set_with_values, 7);
220
+ rb_define_method(cgsl_fminimizer, "iterate", rb_gsl_min_fminimizer_iterate, 0);
221
+
222
+ rb_define_method(cgsl_fminimizer, "x_lower", rb_gsl_min_fminimizer_x_lower, 0);
223
+ rb_define_method(cgsl_fminimizer, "x_upper", rb_gsl_min_fminimizer_x_upper, 0);
224
+ rb_define_method(cgsl_fminimizer, "test_interval", rb_gsl_min_fminimizer_test_interval, 2);
225
+
226
+ rb_define_singleton_method(mgsl_min, "test_interval",
227
+ rb_gsl_fminimizer_test_interval, 4);
228
+
229
+ rb_define_method(cgsl_fminimizer, "x_minimum", rb_gsl_min_fminimizer_x_minimum, 0);
230
+ rb_define_method(cgsl_fminimizer, "f_minimum", rb_gsl_min_fminimizer_f_minimum, 0);
231
+ rb_define_method(cgsl_fminimizer, "f_lower", rb_gsl_min_fminimizer_f_lower, 0);
232
+ rb_define_method(cgsl_fminimizer, "f_upper", rb_gsl_min_fminimizer_f_upper, 0);
233
+
234
+ }
data/ext/monte.c ADDED
@@ -0,0 +1,759 @@
1
+ /*
2
+ monte.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.h"
13
+ #include "rb_gsl_rng.h"
14
+ #include <gsl/gsl_monte_plain.h>
15
+ #include <gsl/gsl_monte_miser.h>
16
+ #include <gsl/gsl_monte_vegas.h>
17
+
18
+ #ifndef CHECK_MONTE_FUNCTION
19
+ #define CHECK_MONTE_FUNCTION(x) if(!rb_obj_is_kind_of(x,cgsl_monte_function))\
20
+ rb_raise(rb_eTypeError, "wrong type (Function expected)");
21
+ #endif
22
+
23
+ static VALUE cgsl_monte_plain;
24
+ static VALUE cgsl_monte_miser;
25
+ static VALUE cgsl_monte_vegas;
26
+ static VALUE cgsl_monte_function;
27
+
28
+ EXTERN VALUE cgsl_vector;
29
+
30
+ enum {
31
+ GSL_MONTE_PLAIN_STATE = 1,
32
+ GSL_MONTE_MISER_STATE = 2,
33
+ GSL_MONTE_VEGAS_STATE = 3,
34
+ };
35
+
36
+ static void gsl_monte_function_mark(gsl_monte_function *f);
37
+ static void gsl_monte_function_free(gsl_monte_function *f);
38
+ static double rb_gsl_monte_function_f(double *x, size_t dim, void *p);
39
+
40
+ static VALUE rb_gsl_monte_function_set_f(int argc, VALUE *argv, VALUE obj)
41
+ {
42
+ gsl_monte_function *F = NULL;
43
+ VALUE ary, ary2;
44
+ size_t i;
45
+ Data_Get_Struct(obj, gsl_monte_function, F);
46
+ if (F->params == NULL) {
47
+ ary = rb_ary_new2(2);
48
+ /* (VALUE) F->params = ary;*/
49
+ F->params = (void *) ary;
50
+ } else {
51
+ ary = (VALUE) F->params;
52
+ }
53
+ rb_ary_store(ary, 1, Qnil);
54
+
55
+ switch (argc) {
56
+ case 0:
57
+ break;
58
+ case 1:
59
+ if (TYPE(argv[0]) == T_FIXNUM) {
60
+ F->dim = FIX2INT(argv[0]);
61
+ } else {
62
+ rb_ary_store(ary, 0, argv[0]);
63
+ }
64
+ break;
65
+ case 2:
66
+ rb_ary_store(ary, 0, argv[0]);
67
+ F->dim = FIX2INT(argv[1]);
68
+ break;
69
+ default:
70
+ rb_ary_store(ary, 0, argv[0]);
71
+ F->dim = FIX2INT(argv[1]);
72
+ ary2 = rb_ary_new2(argc-2);
73
+ for (i = 2; i < argc; i++) rb_ary_store(ary2, i-2, argv[i]);
74
+ rb_ary_store(ary, 1, ary2);
75
+ break;
76
+ }
77
+ if (rb_block_given_p()) rb_ary_store(ary, 0, RB_GSL_MAKE_PROC);
78
+ return obj;
79
+ }
80
+
81
+ static void gsl_monte_function_free(gsl_monte_function *f)
82
+ {
83
+ free((gsl_monte_function *) f);
84
+ }
85
+
86
+ static void gsl_monte_function_mark(gsl_monte_function *f)
87
+ {
88
+ rb_gc_mark((VALUE) f->params);
89
+ }
90
+
91
+ static VALUE rb_gsl_monte_function_new(int argc, VALUE *argv, VALUE klass)
92
+ {
93
+ gsl_monte_function *f;
94
+ VALUE obj;
95
+ f = ALLOC(gsl_monte_function);
96
+ f->f = &rb_gsl_monte_function_f;
97
+ /* (VALUE) f->params = rb_ary_new2(2);*/
98
+ f->params = (void *) rb_ary_new2(2);
99
+ rb_ary_store((VALUE) f->params, 1, Qnil);
100
+ obj = Data_Wrap_Struct(klass, gsl_monte_function_mark, gsl_monte_function_free, f);
101
+ rb_gsl_monte_function_set_f(argc, argv, obj);
102
+ return obj;
103
+ }
104
+
105
+ static double rb_gsl_monte_function_f(double *x, size_t dim, void *p)
106
+ {
107
+ VALUE result, ary, proc, params;
108
+ gsl_vector vtmp;
109
+ VALUE vx;
110
+
111
+ vtmp.data = x;
112
+ vtmp.size = dim;
113
+ vtmp.stride = 1;
114
+ vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, &vtmp);
115
+ ary = (VALUE) p;
116
+ proc = rb_ary_entry(ary, 0);
117
+ params = rb_ary_entry(ary, 1);
118
+ if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 2, vx, INT2FIX(dim));
119
+ else result = rb_funcall(proc, RBGSL_ID_call, 3, vx, INT2FIX(dim), params);
120
+ return NUM2DBL(result);
121
+ }
122
+
123
+
124
+ static VALUE rb_gsl_monte_function_eval(VALUE obj, VALUE vx)
125
+ {
126
+ gsl_monte_function *F = NULL;
127
+ VALUE result, ary, proc, params;
128
+
129
+ Data_Get_Struct(obj, gsl_monte_function, F);
130
+ ary = (VALUE) F->params;
131
+ proc = rb_ary_entry(ary, 0);
132
+ params = rb_ary_entry(ary, 1);
133
+ if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 2, vx, INT2FIX(F->dim));
134
+ else result = rb_funcall(proc, RBGSL_ID_call, 3, vx, INT2FIX(F->dim), params);
135
+ return result;
136
+ }
137
+
138
+ static VALUE rb_gsl_monte_function_proc(VALUE obj)
139
+ {
140
+ gsl_monte_function *F = NULL;
141
+ Data_Get_Struct(obj, gsl_monte_function, F);
142
+ return rb_ary_entry((VALUE) F->params, 0);
143
+ }
144
+
145
+ static VALUE rb_gsl_monte_function_params(VALUE obj)
146
+ {
147
+ gsl_monte_function *F = NULL;
148
+ Data_Get_Struct(obj, gsl_monte_function, F);
149
+ return rb_ary_entry((VALUE) F->params, 1);
150
+ }
151
+
152
+ static VALUE rb_gsl_monte_function_set_params(int argc, VALUE *argv, VALUE obj)
153
+ {
154
+ gsl_monte_function *F = NULL;
155
+ VALUE ary, ary2;
156
+ size_t i;
157
+
158
+ if (argc == 0) return obj;
159
+ Data_Get_Struct(obj, gsl_monte_function, F);
160
+ ary = (VALUE) F->params;
161
+ if (argc == 1) {
162
+ rb_ary_store(ary, 1, argv[0]);
163
+ } else {
164
+ ary2 = rb_ary_new2(argc);
165
+ for (i = 0; i < argc; i++) rb_ary_store(ary2, i, argv[i]);
166
+ rb_ary_store(ary, 1, ary2);
167
+ }
168
+ return obj;
169
+ }
170
+
171
+ static VALUE rb_gsl_monte_plain_new(VALUE klass, VALUE d)
172
+ {
173
+ gsl_monte_plain_state *s;
174
+ size_t dim;
175
+ CHECK_FIXNUM(d);
176
+ dim = FIX2INT(d);
177
+ s = gsl_monte_plain_alloc(dim);
178
+ gsl_monte_plain_init(s);
179
+ return Data_Wrap_Struct(klass, 0, gsl_monte_plain_free, s);
180
+ }
181
+
182
+ static VALUE rb_gsl_monte_plain_init(VALUE obj)
183
+ {
184
+ gsl_monte_plain_state *s;
185
+ Data_Get_Struct(obj, gsl_monte_plain_state, s);
186
+ return INT2FIX(gsl_monte_plain_init(s));
187
+ }
188
+
189
+ static VALUE rb_gsl_monte_miser_new(VALUE klass, VALUE d)
190
+ {
191
+ gsl_monte_miser_state *s;
192
+ size_t dim;
193
+ CHECK_FIXNUM(d);
194
+ dim = FIX2INT(d);
195
+ s = gsl_monte_miser_alloc(dim);
196
+ gsl_monte_miser_init(s);
197
+ return Data_Wrap_Struct(klass, 0, gsl_monte_miser_free, s);
198
+ }
199
+
200
+ static VALUE rb_gsl_monte_miser_init(VALUE obj)
201
+ {
202
+ gsl_monte_miser_state *s;
203
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
204
+ return INT2FIX(gsl_monte_miser_init(s));
205
+ }
206
+
207
+ static VALUE rb_gsl_monte_vegas_new(VALUE klass, VALUE d)
208
+ {
209
+ gsl_monte_vegas_state *s;
210
+ size_t dim;
211
+ CHECK_FIXNUM(d);
212
+ dim = FIX2INT(d);
213
+ s = gsl_monte_vegas_alloc(dim);
214
+ gsl_monte_vegas_init(s);
215
+ return Data_Wrap_Struct(klass, 0, gsl_monte_vegas_free, s);
216
+ }
217
+
218
+ static VALUE rb_gsl_monte_vegas_init(VALUE obj)
219
+ {
220
+ gsl_monte_vegas_state *s;
221
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
222
+ return INT2FIX(gsl_monte_vegas_init(s));
223
+ }
224
+
225
+ static int get_monte_type(VALUE vt);
226
+ static VALUE rb_gsl_monte_integrate(int argc, VALUE *argv, VALUE obj)
227
+ {
228
+ gsl_monte_function *F = NULL;
229
+ gsl_monte_plain_state *plain = NULL;
230
+ gsl_monte_miser_state *miser = NULL;
231
+ gsl_monte_vegas_state *vegas = NULL;
232
+ gsl_vector *xl = NULL, *xu = NULL;
233
+ gsl_rng *r = NULL;
234
+ size_t dim, calls;
235
+ int itmp = 0, flagr = 0, type;
236
+ double result, abserr;
237
+
238
+ if (argc < 4)
239
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)", argc);
240
+ switch (TYPE(obj)) {
241
+ case T_MODULE:
242
+ case T_CLASS:
243
+ case T_OBJECT:
244
+ if (!rb_obj_is_kind_of(argv[0], cgsl_monte_function))
245
+ rb_raise(rb_eTypeError,
246
+ "wrong type argument %s (GSL::Monte::Function expected)",
247
+ rb_class2name(CLASS_OF(argv[0])));
248
+ Data_Get_Struct(argv[0], gsl_monte_function, F);
249
+ itmp = 1;
250
+ break;
251
+ default:
252
+ Data_Get_Struct(obj, gsl_monte_function, F);
253
+ itmp = 0;
254
+ }
255
+
256
+ CHECK_VECTOR(argv[itmp]);
257
+ CHECK_VECTOR(argv[itmp+1]);
258
+ Data_Get_Struct(argv[itmp], gsl_vector, xl);
259
+ Data_Get_Struct(argv[itmp+1], gsl_vector, xu);
260
+
261
+ if (argc > itmp+3 && TYPE(argv[itmp+3]) == T_FIXNUM) {
262
+ dim = FIX2INT(argv[itmp+2]);
263
+ calls = FIX2INT(argv[itmp+3]);
264
+ } else {
265
+ dim = F->dim;
266
+ calls = FIX2INT(argv[itmp+2]);
267
+ }
268
+
269
+ if (rb_obj_is_kind_of(argv[argc-2], cgsl_rng)) {
270
+ Data_Get_Struct(argv[argc-2], gsl_rng, r);
271
+ } else {
272
+ r = gsl_rng_alloc(gsl_rng_default);
273
+ flagr = 1;
274
+ }
275
+
276
+ type = get_monte_type(argv[argc-1]);
277
+
278
+ switch (type) {
279
+ case GSL_MONTE_PLAIN_STATE:
280
+ case GSL_MONTE_PLAIN_STATE+100:
281
+ if (type > 100) {
282
+ plain = gsl_monte_plain_alloc(dim);
283
+ gsl_monte_plain_init(plain);
284
+ } else {
285
+ if (!rb_obj_is_kind_of(argv[argc-1], cgsl_monte_plain))
286
+ rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Plain expected)",
287
+ rb_class2name(CLASS_OF(argv[argc-1])));
288
+ Data_Get_Struct(argv[argc-1], gsl_monte_plain_state, plain);
289
+ }
290
+ gsl_monte_plain_integrate(F, xl->data, xu->data, dim, calls, r, plain, &result, &abserr);
291
+ if (type > 100) gsl_monte_plain_free(plain);
292
+ break;
293
+ case GSL_MONTE_MISER_STATE:
294
+ case GSL_MONTE_MISER_STATE+100:
295
+ if (type > 100) {
296
+ miser = gsl_monte_miser_alloc(dim);
297
+ gsl_monte_miser_init(miser);
298
+ } else {
299
+ if (!rb_obj_is_kind_of(argv[argc-1], cgsl_monte_miser))
300
+ rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Miser expected)",
301
+ rb_class2name(CLASS_OF(argv[argc-1])));
302
+ Data_Get_Struct(argv[argc-1], gsl_monte_miser_state, miser);
303
+ }
304
+ gsl_monte_miser_integrate(F, xl->data, xu->data, dim, calls, r, miser, &result, &abserr);
305
+ if (type > 100) gsl_monte_miser_free(miser);
306
+ break;
307
+ case GSL_MONTE_VEGAS_STATE:
308
+ case GSL_MONTE_VEGAS_STATE+100:
309
+ if (type > 100) {
310
+ vegas = gsl_monte_vegas_alloc(dim);
311
+ gsl_monte_vegas_init(vegas);
312
+ } else { if (!rb_obj_is_kind_of(argv[argc-1], cgsl_monte_vegas))
313
+ rb_raise(rb_eTypeError, "wrong argument type %s (Monte::Vegas expected)",
314
+ rb_class2name(CLASS_OF(argv[argc-1])));
315
+ Data_Get_Struct(argv[argc-1], gsl_monte_vegas_state, vegas);
316
+ }
317
+ gsl_monte_vegas_integrate(F, xl->data, xu->data, dim, calls, r, vegas, &result, &abserr);
318
+ if (type > 100) gsl_monte_vegas_free(vegas);
319
+ break;
320
+ }
321
+ if (flagr == 1) gsl_rng_free(r);
322
+ return rb_ary_new3(2, rb_float_new(result), rb_float_new(abserr));
323
+ }
324
+
325
+ static VALUE rb_gsl_monte_plain_integrate(int argc, VALUE *argv, VALUE obj)
326
+ {
327
+ gsl_monte_function *F = NULL;
328
+ gsl_monte_plain_state *plain = NULL;
329
+ gsl_vector *xl = NULL, *xu = NULL;
330
+ gsl_rng *r = NULL;
331
+ size_t dim, calls;
332
+ int flagr = 0;
333
+ double result, abserr;
334
+
335
+ if (argc < 4)
336
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 4, 5 or 6)", argc);
337
+ CHECK_MONTE_FUNCTION(argv[0]);
338
+ CHECK_VECTOR(argv[1]); CHECK_VECTOR(argv[2]);
339
+ Data_Get_Struct(obj, gsl_monte_plain_state, plain);
340
+ Data_Get_Struct(argv[0], gsl_monte_function, F);
341
+ Data_Get_Struct(argv[1], gsl_vector, xl);
342
+ Data_Get_Struct(argv[2], gsl_vector, xu);
343
+ if (argc >= 5 && TYPE(argv[4]) == T_FIXNUM) {
344
+ dim = FIX2INT(argv[3]);
345
+ calls = FIX2INT(argv[4]);
346
+ } else {
347
+ dim = F->dim;
348
+ calls = FIX2INT(argv[3]);
349
+ }
350
+
351
+ if (rb_obj_is_kind_of(argv[argc-1], cgsl_rng)) {
352
+ Data_Get_Struct(argv[argc-1], gsl_rng, r);
353
+ } else {
354
+ r = gsl_rng_alloc(gsl_rng_default);
355
+ flagr = 1;
356
+ }
357
+ gsl_monte_plain_integrate(F, xl->data, xu->data, dim, calls, r, plain,
358
+ &result, &abserr);
359
+ if (flagr == 1) gsl_rng_free(r);
360
+ return rb_ary_new3(2, rb_float_new(result), rb_float_new(abserr));
361
+ }
362
+
363
+ static VALUE rb_gsl_monte_miser_integrate(int argc, VALUE *argv, VALUE obj)
364
+ {
365
+ gsl_monte_function *F = NULL;
366
+ gsl_monte_miser_state *miser = NULL;
367
+ gsl_vector *xl = NULL, *xu = NULL;
368
+ gsl_rng *r = NULL;
369
+ size_t dim, calls;
370
+ int flagr = 0;
371
+ double result, abserr;
372
+
373
+ if (argc < 4)
374
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)", argc);
375
+ CHECK_MONTE_FUNCTION(argv[0]);
376
+ CHECK_VECTOR(argv[1]); CHECK_VECTOR(argv[2]);
377
+ Data_Get_Struct(obj, gsl_monte_miser_state, miser);
378
+ Data_Get_Struct(argv[0], gsl_monte_function, F);
379
+ Data_Get_Struct(argv[1], gsl_vector, xl);
380
+ Data_Get_Struct(argv[2], gsl_vector, xu);
381
+ if (argc >= 5 && TYPE(argv[4]) == T_FIXNUM) {
382
+ dim = FIX2INT(argv[3]);
383
+ calls = FIX2INT(argv[4]);
384
+ } else {
385
+ dim = F->dim;
386
+ calls = FIX2INT(argv[3]);
387
+ }
388
+
389
+ if (rb_obj_is_kind_of(argv[argc-1], cgsl_rng)) {
390
+ Data_Get_Struct(argv[argc-1], gsl_rng, r);
391
+ } else {
392
+ r = gsl_rng_alloc(gsl_rng_default);
393
+ flagr = 1;
394
+ }
395
+ gsl_monte_miser_integrate(F, xl->data, xu->data, dim, calls, r, miser,
396
+ &result, &abserr);
397
+ if (flagr == 1) gsl_rng_free(r);
398
+ return rb_ary_new3(2, rb_float_new(result), rb_float_new(abserr));
399
+ }
400
+
401
+ static VALUE rb_gsl_monte_vegas_integrate(int argc, VALUE *argv, VALUE obj)
402
+ {
403
+ gsl_monte_function *F = NULL;
404
+ gsl_monte_vegas_state *vegas = NULL;
405
+ gsl_vector *xl = NULL, *xu = NULL;
406
+ gsl_rng *r = NULL;
407
+ size_t dim, calls;
408
+ int flagr = 0;
409
+ double result, abserr;
410
+
411
+ if (argc < 4)
412
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 4)", argc);
413
+ CHECK_MONTE_FUNCTION(argv[0]);
414
+ CHECK_VECTOR(argv[1]); CHECK_VECTOR(argv[2]);
415
+ Data_Get_Struct(obj, gsl_monte_vegas_state, vegas);
416
+ Data_Get_Struct(argv[0], gsl_monte_function, F);
417
+ Data_Get_Struct(argv[1], gsl_vector, xl);
418
+ Data_Get_Struct(argv[2], gsl_vector, xu);
419
+ if (argc >= 5 && TYPE(argv[4]) == T_FIXNUM) {
420
+ dim = FIX2INT(argv[3]);
421
+ calls = FIX2INT(argv[4]);
422
+ } else {
423
+ dim = F->dim;
424
+ calls = FIX2INT(argv[3]);
425
+ }
426
+
427
+ if (rb_obj_is_kind_of(argv[argc-1], cgsl_rng)) {
428
+ Data_Get_Struct(argv[argc-1], gsl_rng, r);
429
+ } else {
430
+ r = gsl_rng_alloc(gsl_rng_default);
431
+ flagr = 1;
432
+ }
433
+ gsl_monte_vegas_integrate(F, xl->data, xu->data, dim, calls, r, vegas,
434
+ &result, &abserr);
435
+ if (flagr == 1) gsl_rng_free(r);
436
+ return rb_ary_new3(2, rb_float_new(result), rb_float_new(abserr));
437
+ }
438
+
439
+ static int get_monte_type(VALUE vt)
440
+ {
441
+ char name[32];
442
+ if (rb_obj_is_kind_of(vt, cgsl_monte_plain)) return GSL_MONTE_PLAIN_STATE;
443
+ else if (rb_obj_is_kind_of(vt, cgsl_monte_miser)) return GSL_MONTE_MISER_STATE;
444
+ else if (rb_obj_is_kind_of(vt, cgsl_monte_vegas)) return GSL_MONTE_VEGAS_STATE;
445
+ else {
446
+ /* do next */
447
+ }
448
+
449
+ switch(TYPE(vt)) {
450
+ case T_STRING:
451
+ strcpy(name, STR2CSTR(vt));
452
+ if (str_tail_grep(name, "plain") == 0) {
453
+ return GSL_MONTE_PLAIN_STATE + 100;
454
+ } else if (str_tail_grep(name, "miser") == 0) {
455
+ return GSL_MONTE_MISER_STATE + 100;
456
+ } else if (str_tail_grep(name, "vegas") == 0) {
457
+ return GSL_MONTE_VEGAS_STATE + 100;
458
+ } else {
459
+ rb_raise(rb_eArgError, "%s: unknown algorithm", name);
460
+ }
461
+ break;
462
+ case T_FIXNUM:
463
+ return FIX2INT(vt) + 100;
464
+ break;
465
+ default:
466
+ rb_raise(rb_eTypeError, "String or Fixnum expected");
467
+ break;
468
+ }
469
+ /* wrong argument if reach here */
470
+ rb_raise(rb_eArgError, "wrong argument");
471
+ }
472
+
473
+ static VALUE rb_gsl_monte_miser_estimate_frac(VALUE obj)
474
+ {
475
+ gsl_monte_miser_state *s = NULL;
476
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
477
+ return rb_float_new(s->estimate_frac);
478
+ }
479
+
480
+ static VALUE rb_gsl_monte_miser_set_estimate_frac(VALUE obj, VALUE val)
481
+ {
482
+ gsl_monte_miser_state *s = NULL;
483
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
484
+ s->estimate_frac = NUM2DBL(val);
485
+ return obj;
486
+ }
487
+
488
+ static VALUE rb_gsl_monte_miser_min_calls(VALUE obj)
489
+ {
490
+ gsl_monte_miser_state *s = NULL;
491
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
492
+ return INT2FIX(s->min_calls);
493
+ }
494
+
495
+ static VALUE rb_gsl_monte_miser_set_min_calls(VALUE obj, VALUE val)
496
+ {
497
+ gsl_monte_miser_state *s = NULL;
498
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
499
+ s->min_calls = FIX2INT(val);
500
+ return obj;
501
+ }
502
+
503
+ static VALUE rb_gsl_monte_miser_min_calls_per_bisection(VALUE obj)
504
+ {
505
+ gsl_monte_miser_state *s = NULL;
506
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
507
+ return INT2FIX(s->min_calls_per_bisection);
508
+ }
509
+
510
+ static VALUE rb_gsl_monte_miser_set_min_calls_per_bisection(VALUE obj, VALUE val)
511
+ {
512
+ gsl_monte_miser_state *s = NULL;
513
+ CHECK_FIXNUM(val);
514
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
515
+ s->min_calls_per_bisection = FIX2INT(val);
516
+ return obj;
517
+ }
518
+
519
+ static VALUE rb_gsl_monte_miser_alpha(VALUE obj)
520
+ {
521
+ gsl_monte_miser_state *s = NULL;
522
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
523
+ return rb_float_new(s->alpha);
524
+ }
525
+
526
+ static VALUE rb_gsl_monte_miser_set_alpha(VALUE obj, VALUE val)
527
+ {
528
+ gsl_monte_miser_state *s = NULL;
529
+ Need_Float(val);
530
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
531
+ s->alpha = NUM2DBL(val);
532
+ return obj;
533
+ }
534
+
535
+ static VALUE rb_gsl_monte_miser_dither(VALUE obj)
536
+ {
537
+ gsl_monte_miser_state *s = NULL;
538
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
539
+ return rb_float_new(s->dither);
540
+ }
541
+
542
+ static VALUE rb_gsl_monte_miser_set_dither(VALUE obj, VALUE val)
543
+ {
544
+ gsl_monte_miser_state *s = NULL;
545
+ Need_Float(val);
546
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
547
+ s->dither = NUM2DBL(val);
548
+ return obj;
549
+ }
550
+
551
+ static VALUE rb_gsl_monte_miser_state(VALUE obj)
552
+ {
553
+ gsl_monte_miser_state *s = NULL;
554
+ Data_Get_Struct(obj, gsl_monte_miser_state, s);
555
+ return rb_ary_new3(5, rb_float_new(s->estimate_frac), INT2FIX(s->min_calls),
556
+ INT2FIX(s->min_calls_per_bisection), rb_float_new(s->alpha),
557
+ rb_float_new(s->dither));
558
+ }
559
+
560
+ static VALUE rb_gsl_monte_vegas_result(VALUE obj)
561
+ {
562
+ gsl_monte_vegas_state *s = NULL;
563
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
564
+ return rb_float_new(s->result);
565
+ }
566
+
567
+ static VALUE rb_gsl_monte_vegas_sigma(VALUE obj)
568
+ {
569
+ gsl_monte_vegas_state *s = NULL;
570
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
571
+ return rb_float_new(s->sigma);
572
+ }
573
+ static VALUE rb_gsl_monte_vegas_chisq(VALUE obj)
574
+ {
575
+ gsl_monte_vegas_state *s = NULL;
576
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
577
+ return rb_float_new(s->chisq);
578
+ }
579
+ static VALUE rb_gsl_monte_vegas_alpha(VALUE obj)
580
+ {
581
+ gsl_monte_vegas_state *s = NULL;
582
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
583
+ return rb_float_new(s->alpha);
584
+ }
585
+
586
+ static VALUE rb_gsl_monte_vegas_set_alpha(VALUE obj, VALUE val)
587
+ {
588
+ gsl_monte_vegas_state *s = NULL;
589
+ Need_Float(val);
590
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
591
+ s->alpha = NUM2DBL(val);
592
+ return obj;
593
+ }
594
+
595
+ static VALUE rb_gsl_monte_vegas_iterations(VALUE obj)
596
+ {
597
+ gsl_monte_vegas_state *s = NULL;
598
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
599
+ return INT2FIX(s->iterations);
600
+ }
601
+
602
+ static VALUE rb_gsl_monte_vegas_set_iterations(VALUE obj, VALUE val)
603
+ {
604
+ gsl_monte_vegas_state *s = NULL;
605
+ CHECK_FIXNUM(val);
606
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
607
+ s->iterations = FIX2INT(val);
608
+ return obj;
609
+ }
610
+ static VALUE rb_gsl_monte_vegas_stage(VALUE obj)
611
+ {
612
+ gsl_monte_vegas_state *s = NULL;
613
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
614
+ return INT2FIX(s->stage);
615
+ }
616
+ static VALUE rb_gsl_monte_vegas_set_stage(VALUE obj, VALUE val)
617
+ {
618
+ gsl_monte_vegas_state *s = NULL;
619
+ CHECK_FIXNUM(val);
620
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
621
+ s->stage = FIX2INT(val);
622
+ return obj;
623
+ }
624
+ static VALUE rb_gsl_monte_vegas_mode(VALUE obj)
625
+ {
626
+ gsl_monte_vegas_state *s = NULL;
627
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
628
+ return INT2FIX(s->mode);
629
+ }
630
+ static VALUE rb_gsl_monte_vegas_set_mode(VALUE obj, VALUE val)
631
+ {
632
+ gsl_monte_vegas_state *s = NULL;
633
+ CHECK_FIXNUM(val);
634
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
635
+ s->mode = FIX2INT(val);
636
+ return obj;
637
+ }
638
+ static VALUE rb_gsl_monte_vegas_verbose(VALUE obj)
639
+ {
640
+ gsl_monte_vegas_state *s = NULL;
641
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
642
+ return INT2FIX(s->verbose);
643
+ }
644
+ static VALUE rb_gsl_monte_vegas_set_verbose(VALUE obj, VALUE val)
645
+ {
646
+ gsl_monte_vegas_state *s = NULL;
647
+ CHECK_FIXNUM(val);
648
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
649
+ s->verbose = FIX2INT(val);
650
+ return obj;
651
+ }
652
+ static VALUE rb_gsl_monte_vegas_state(VALUE obj)
653
+ {
654
+ gsl_monte_vegas_state *s = NULL;
655
+ Data_Get_Struct(obj, gsl_monte_vegas_state, s);
656
+ return rb_ary_new3(8, rb_float_new(s->result), rb_float_new(s->sigma),
657
+ rb_float_new(s->chisq), rb_float_new(s->alpha),
658
+ INT2FIX(s->iterations), INT2FIX(s->stage),
659
+ INT2FIX(s->mode), INT2FIX(s->verbose));
660
+ }
661
+
662
+ void Init_gsl_monte(VALUE module)
663
+ {
664
+ VALUE mgsl_monte;
665
+
666
+ mgsl_monte = rb_define_module_under(module, "Monte");
667
+
668
+ rb_define_const(mgsl_monte, "PLAIN", INT2FIX(GSL_MONTE_PLAIN_STATE));
669
+ rb_define_const(mgsl_monte, "MISER", INT2FIX(GSL_MONTE_MISER_STATE));
670
+ rb_define_const(mgsl_monte, "VEGAS", INT2FIX(GSL_MONTE_VEGAS_STATE));
671
+
672
+ cgsl_monte_function = rb_define_class_under(mgsl_monte, "Function", cGSL_Object);
673
+ cgsl_monte_plain = rb_define_class_under(mgsl_monte, "Plain", cGSL_Object);
674
+ cgsl_monte_miser = rb_define_class_under(mgsl_monte, "Miser", cGSL_Object);
675
+ cgsl_monte_vegas = rb_define_class_under(mgsl_monte, "Vegas", cGSL_Object);
676
+
677
+ rb_define_singleton_method(cgsl_monte_function, "new", rb_gsl_monte_function_new, -1);
678
+ rb_define_singleton_method(cgsl_monte_function, "alloc", rb_gsl_monte_function_new, -1);
679
+
680
+ rb_define_method(cgsl_monte_function, "proc", rb_gsl_monte_function_proc, 0);
681
+ rb_define_method(cgsl_monte_function, "eval", rb_gsl_monte_function_eval, 0);
682
+ rb_define_alias(cgsl_monte_function, "call", "eval");
683
+ rb_define_method(cgsl_monte_function, "params", rb_gsl_monte_function_params, 0);
684
+ rb_define_method(cgsl_monte_function, "set", rb_gsl_monte_function_set_f, -1);
685
+ rb_define_alias(cgsl_monte_function, "set_proc", "set");
686
+ rb_define_method(cgsl_monte_function, "set_params", rb_gsl_monte_function_set_params, -1);
687
+
688
+ rb_define_method(cgsl_monte_function, "integrate", rb_gsl_monte_integrate, -1);
689
+
690
+ /*****/
691
+ rb_define_singleton_method(cgsl_monte_plain, "new", rb_gsl_monte_plain_new, 1);
692
+ rb_define_singleton_method(cgsl_monte_plain, "alloc", rb_gsl_monte_plain_new, 1);
693
+ rb_define_method(cgsl_monte_plain, "init", rb_gsl_monte_plain_init, 0);
694
+
695
+ rb_define_singleton_method(cgsl_monte_miser, "new", rb_gsl_monte_miser_new, 1);
696
+ rb_define_singleton_method(cgsl_monte_miser, "alloc", rb_gsl_monte_miser_new, 1);
697
+ rb_define_method(cgsl_monte_miser, "init", rb_gsl_monte_miser_init, 0);
698
+ rb_define_method(cgsl_monte_miser, "estimate_frac", rb_gsl_monte_miser_estimate_frac, 0);
699
+ rb_define_method(cgsl_monte_miser, "min_calls", rb_gsl_monte_miser_min_calls, 0);
700
+ rb_define_method(cgsl_monte_miser, "min_calls_per_bisection", rb_gsl_monte_miser_min_calls_per_bisection, 0);
701
+ rb_define_method(cgsl_monte_miser, "alpha", rb_gsl_monte_miser_alpha, 0);
702
+ rb_define_method(cgsl_monte_miser, "dither", rb_gsl_monte_miser_dither, 0);
703
+ rb_define_method(cgsl_monte_miser, "state", rb_gsl_monte_miser_state, 0);
704
+
705
+ rb_define_method(cgsl_monte_miser, "set_estimate_frac", rb_gsl_monte_miser_set_estimate_frac, 1);
706
+ rb_define_alias(cgsl_monte_miser, "estimate_frac=", "set_estimate_frac");
707
+ rb_define_method(cgsl_monte_miser, "set_min_calls", rb_gsl_monte_miser_set_min_calls, 1);
708
+ rb_define_alias(cgsl_monte_miser, "min_calls=", "set_min_calls");
709
+ rb_define_method(cgsl_monte_miser, "set_min_calls_per_bisection", rb_gsl_monte_miser_set_min_calls_per_bisection, 1);
710
+ rb_define_alias(cgsl_monte_miser, "min_calls_per_bisection=", "set_min_calls_per_bisection");
711
+ rb_define_method(cgsl_monte_miser, "set_alpha", rb_gsl_monte_miser_set_alpha, 1);
712
+ rb_define_alias(cgsl_monte_miser, "alpha=", "set_alpha");
713
+ rb_define_method(cgsl_monte_miser, "set_dither", rb_gsl_monte_miser_set_dither, 1);
714
+ rb_define_alias(cgsl_monte_miser, "dither=", "set_dither");
715
+
716
+ /*****/
717
+ rb_define_singleton_method(cgsl_monte_vegas, "new", rb_gsl_monte_vegas_new, 1);
718
+ rb_define_singleton_method(cgsl_monte_vegas, "alloc", rb_gsl_monte_vegas_new, 1);
719
+ rb_define_method(cgsl_monte_vegas, "init", rb_gsl_monte_vegas_init, 0);
720
+
721
+ rb_define_method(cgsl_monte_vegas, "result", rb_gsl_monte_vegas_result, 0);
722
+ rb_define_method(cgsl_monte_vegas, "sigma", rb_gsl_monte_vegas_sigma, 0);
723
+ rb_define_method(cgsl_monte_vegas, "chisq", rb_gsl_monte_vegas_chisq, 0);
724
+ rb_define_method(cgsl_monte_vegas, "alpha", rb_gsl_monte_vegas_alpha, 0);
725
+ rb_define_method(cgsl_monte_vegas, "iterations", rb_gsl_monte_vegas_iterations, 0);
726
+ rb_define_method(cgsl_monte_vegas, "stage", rb_gsl_monte_vegas_stage, 0);
727
+ rb_define_method(cgsl_monte_vegas, "mode", rb_gsl_monte_vegas_mode, 0);
728
+ rb_define_method(cgsl_monte_vegas, "verbose", rb_gsl_monte_vegas_verbose, 0);
729
+ rb_define_method(cgsl_monte_vegas, "state", rb_gsl_monte_vegas_state, 0);
730
+
731
+ rb_define_method(cgsl_monte_vegas, "set_alpha", rb_gsl_monte_vegas_set_alpha, 1);
732
+ rb_define_alias(cgsl_monte_vegas, "alpha=", "set_alpha");
733
+ rb_define_method(cgsl_monte_vegas, "set_iterations", rb_gsl_monte_vegas_set_iterations, 1);
734
+ rb_define_alias(cgsl_monte_vegas, "iterations=", "set_iterations");
735
+ rb_define_method(cgsl_monte_vegas, "set_stage", rb_gsl_monte_vegas_set_stage, 1);
736
+ rb_define_alias(cgsl_monte_vegas, "stage=", "set_stage");
737
+ rb_define_method(cgsl_monte_vegas, "set_mode", rb_gsl_monte_vegas_set_mode, 1);
738
+ rb_define_alias(cgsl_monte_vegas, "mode=", "set_mode");
739
+ rb_define_method(cgsl_monte_vegas, "set_verbose", rb_gsl_monte_vegas_set_verbose, 1);
740
+ rb_define_alias(cgsl_monte_vegas, "verbose=", "set_verbose");
741
+
742
+
743
+ /*****/
744
+ rb_define_singleton_method(cgsl_monte_plain, "integrate",
745
+ rb_gsl_monte_integrate, -1);
746
+ rb_define_method(cgsl_monte_plain, "integrate",
747
+ rb_gsl_monte_plain_integrate, -1);
748
+ rb_define_singleton_method(cgsl_monte_miser, "integrate",
749
+ rb_gsl_monte_integrate, -1);
750
+ rb_define_method(cgsl_monte_miser, "integrate",
751
+ rb_gsl_monte_miser_integrate, -1);
752
+ rb_define_singleton_method(cgsl_monte_vegas, "integrate",
753
+ rb_gsl_monte_integrate, -1);
754
+ rb_define_method(cgsl_monte_vegas, "integrate",
755
+ rb_gsl_monte_vegas_integrate, -1);
756
+ }
757
+ #ifdef CHECK_MONTE_FUNCTION
758
+ #undef CHECK_MONTE_FUNCTION
759
+ #endif