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/multimin.c ADDED
@@ -0,0 +1,793 @@
1
+ /*
2
+ multimin.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_array.h"
14
+ #include "rb_gsl_function.h"
15
+ #include <gsl/gsl_multimin.h>
16
+
17
+ #ifndef CHECK_MULTIMIN_FUNCTION
18
+ #define CHECK_MULTIMIN_FUNCTION(x) if(CLASS_OF(x)!=cgsl_multimin_function)\
19
+ rb_raise(rb_eTypeError,\
20
+ "wrong argument type %s (GSL::MultiMin::Function expected)",\
21
+ rb_class2name(CLASS_OF(x)));
22
+ #endif
23
+
24
+ #ifndef CHECK_MULTIMIN_FUNCTION_FDF
25
+ #define CHECK_MULTIMIN_FUNCTION_FDF(x) if(CLASS_OF(x)!=cgsl_multimin_function_fdf)\
26
+ rb_raise(rb_eTypeError,\
27
+ "wrong argument type %s (GSL::MultiMin::Function_fdf expected)",\
28
+ rb_class2name(CLASS_OF(x)));
29
+ #endif
30
+
31
+ VALUE cgsl_multimin_function_fdf; /* Used also in multimin_fsdf.c */
32
+ static VALUE cgsl_multimin_function;
33
+
34
+ enum {
35
+ GSL_FDFMINIMIZER_CONJUGATE_FR,
36
+ GSL_FDFMINIMIZER_CONJUGATE_PR,
37
+ GSL_FDFMINIMIZER_VECTOR_BFGS,
38
+ GSL_FDFMINIMIZER_STEEPEST_DESCENT,
39
+ GSL_FMINIMIZER_NMSIMPLEX,
40
+ #ifdef GSL_1_9_LATER
41
+ GSL_FDFMINIMIZER_VECTOR_BFGS2,
42
+ #endif
43
+ };
44
+
45
+ static const gsl_multimin_fdfminimizer_type* get_fdfminimizer_type(VALUE t);
46
+ #ifdef GSL_1_3_LATER
47
+ static const gsl_multimin_fminimizer_type* get_fminimizer_type(VALUE t);
48
+ #endif
49
+ static void define_const();
50
+
51
+ static void gsl_multimin_function_free(gsl_multimin_function *f);
52
+ static double rb_gsl_multimin_function_f(const gsl_vector *x, void *p);
53
+ static void set_function(int i, VALUE *argv, gsl_multimin_function *F);
54
+
55
+ static void gsl_multimin_function_fdf_free(gsl_multimin_function_fdf *f);
56
+
57
+ double rb_gsl_multimin_function_fdf_f(const gsl_vector *x, void *p);
58
+ void rb_gsl_multimin_function_fdf_df(const gsl_vector *x, void *p,
59
+ gsl_vector *g);
60
+ void rb_gsl_multimin_function_fdf_fdf(const gsl_vector *x, void *p,
61
+ double *f, gsl_vector *g);
62
+ static void set_function_fdf(int i, VALUE *argv, gsl_multimin_function_fdf *F);
63
+
64
+ /*** multimin_funcion ***/
65
+ static void gsl_multimin_function_mark(gsl_multimin_function *F);
66
+ static void gsl_multimin_function_fdf_mark(gsl_multimin_function_fdf *F);
67
+
68
+ static void gsl_multimin_function_mark(gsl_multimin_function *F)
69
+ {
70
+ rb_gc_mark((VALUE) F->params);
71
+ }
72
+
73
+ static void gsl_multimin_function_fdf_mark(gsl_multimin_function_fdf *F)
74
+ {
75
+ rb_gc_mark((VALUE) F->params);
76
+ }
77
+
78
+ static VALUE rb_gsl_multimin_function_new(int argc, VALUE *argv, VALUE klass)
79
+ {
80
+ gsl_multimin_function *F = NULL;
81
+ VALUE ary;
82
+ size_t i;
83
+ F = ALLOC(gsl_multimin_function);
84
+ F->f = &rb_gsl_multimin_function_f;
85
+ ary = rb_ary_new2(2);
86
+ /* (VALUE) F->params = ary;*/
87
+ F->params = (void *) ary;
88
+ if (rb_block_given_p()) rb_ary_store(ary, 0, RB_GSL_MAKE_PROC);
89
+ else rb_ary_store(ary, 0, Qnil);
90
+ rb_ary_store(ary, 1, Qnil);
91
+ switch (argc) {
92
+ case 0:
93
+ break;
94
+ case 1:
95
+ set_function(0, argv, F);
96
+ break;
97
+ case 2:
98
+ case 3:
99
+ for (i = 0; i < argc; i++) set_function(i, argv, F);
100
+ break;
101
+ default:
102
+ rb_raise(rb_eArgError, "wrong number of arguments");
103
+ }
104
+ return Data_Wrap_Struct(klass, gsl_multimin_function_mark, gsl_multimin_function_free, F);
105
+ }
106
+
107
+ static void gsl_multimin_function_free(gsl_multimin_function *f)
108
+ {
109
+ free((gsl_multimin_function *) f);
110
+ }
111
+
112
+ static VALUE rb_gsl_multimin_function_n(VALUE obj)
113
+ {
114
+ gsl_multimin_function *F = NULL;
115
+ Data_Get_Struct(obj, gsl_multimin_function, F);
116
+ return INT2FIX(F->n);
117
+ }
118
+
119
+ static double rb_gsl_multimin_function_f(const gsl_vector *x, void *p)
120
+ {
121
+ VALUE vx, vp, proc, result;
122
+ vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
123
+ proc = rb_ary_entry((VALUE) p, 0);
124
+ vp = rb_ary_entry((VALUE) p, 1);
125
+ if (NIL_P(vp)) result = rb_funcall(proc, RBGSL_ID_call, 1, vx);
126
+ else result = rb_funcall(proc, RBGSL_ID_call, 2, vx, vp);
127
+ return NUM2DBL(result);
128
+ }
129
+
130
+ static VALUE rb_gsl_multimin_function_eval(VALUE obj, VALUE vx)
131
+ {
132
+ gsl_multimin_function *F = NULL;
133
+ VALUE vp, proc, ary, result;
134
+ Data_Get_Struct(obj, gsl_multimin_function, F);
135
+ ary = (VALUE) F->params;
136
+ proc = rb_ary_entry(ary, 0);
137
+ vp = rb_ary_entry(ary, 1);
138
+ if (NIL_P(vp)) result = rb_funcall(proc, RBGSL_ID_call, 1, vx);
139
+ else result = rb_funcall(proc, RBGSL_ID_call, 2, vx, vp);
140
+ return result;
141
+ }
142
+
143
+ static void set_function(int i, VALUE *argv, gsl_multimin_function *F)
144
+ {
145
+ VALUE ary;
146
+ ary = (VALUE) F->params;
147
+ if (TYPE(argv[i]) == T_FIXNUM) F->n = FIX2INT(argv[i]);
148
+ else if (rb_obj_is_kind_of(argv[i], rb_cProc))
149
+ rb_ary_store(ary, 0, argv[i]);
150
+ else if (TYPE(argv[i]) == T_ARRAY || rb_obj_is_kind_of(argv[i], cgsl_vector)
151
+ || TYPE(argv[i]) == T_FIXNUM || TYPE(argv[i]) == T_FLOAT) {
152
+ rb_ary_store(ary, 1, argv[i]);
153
+ } else {
154
+ rb_raise(rb_eTypeError, "wrong type of argument %d (Fixnum or Proc)", i);
155
+ }
156
+ }
157
+
158
+ static VALUE rb_gsl_multimin_function_set_f(int argc, VALUE *argv, VALUE obj)
159
+ {
160
+ gsl_multimin_function *F = NULL;
161
+ VALUE ary;
162
+ size_t i;
163
+ Data_Get_Struct(obj, gsl_multimin_function, F);
164
+ ary = (VALUE) F->params;
165
+ if (rb_block_given_p()) rb_ary_store(ary, 0, RB_GSL_MAKE_PROC);
166
+ switch (argc) {
167
+ case 1:
168
+ set_function(0, argv, F);
169
+ break;
170
+ case 2:
171
+ case 3:
172
+ for (i = 0; i < argc; i++) set_function(i, argv, F);
173
+ break;
174
+ default:
175
+ rb_raise(rb_eArgError, "wrong number of arguments");
176
+ }
177
+ return obj;
178
+ }
179
+
180
+ static VALUE rb_gsl_multimin_function_set_params(int argc, VALUE *argv, VALUE obj)
181
+ {
182
+ gsl_multimin_function *F = NULL;
183
+ VALUE ary, ary2;
184
+ size_t i;
185
+ if (argc == 0) return obj;
186
+ Data_Get_Struct(obj, gsl_multimin_function, F);
187
+ if (F->params == NULL) {
188
+ ary = rb_ary_new2(4);
189
+ /* (VALUE) F->params = ary;*/
190
+ F->params = (void *) ary;
191
+ } else {
192
+ ary = (VALUE) F->params;
193
+ }
194
+ if (argc == 1) rb_ary_store(ary, 1, argv[0]);
195
+ else {
196
+ ary2 = rb_ary_new2(argc);
197
+ for (i = 0; i < argc; i++) rb_ary_store(ary2, i, argv[i]);
198
+ rb_ary_store(ary, 1, ary2);
199
+ }
200
+ return obj;
201
+ }
202
+
203
+ static VALUE rb_gsl_multimin_function_params(VALUE obj)
204
+ {
205
+ gsl_multimin_function *F = NULL;
206
+ Data_Get_Struct(obj, gsl_multimin_function, F);
207
+ return rb_ary_entry((VALUE) F->params, 1);
208
+ }
209
+
210
+ /*** multimin_function_fdf ***/
211
+ static void set_function_fdf(int argc, VALUE *argv, gsl_multimin_function_fdf *F);
212
+ static VALUE rb_gsl_multimin_function_fdf_new(int argc, VALUE *argv, VALUE klass)
213
+ {
214
+ gsl_multimin_function_fdf *F = NULL;
215
+ VALUE ary;
216
+ F = ALLOC(gsl_multimin_function_fdf);
217
+ F->f = &rb_gsl_multimin_function_fdf_f;
218
+ F->df = &rb_gsl_multimin_function_fdf_df;
219
+ F->fdf = &rb_gsl_multimin_function_fdf_fdf;
220
+ ary = rb_ary_new2(4);
221
+ /* (VALUE) F->params = ary;*/
222
+ F->params = (void *) ary;
223
+ rb_ary_store(ary, 2, Qnil);
224
+ rb_ary_store(ary, 3, Qnil);
225
+ set_function_fdf(argc, argv, F);
226
+ return Data_Wrap_Struct(klass, gsl_multimin_function_fdf_mark, gsl_multimin_function_fdf_free, F);
227
+ }
228
+
229
+ static void gsl_multimin_function_fdf_free(gsl_multimin_function_fdf *f)
230
+ {
231
+ free((gsl_multimin_function_fdf *) f);
232
+ }
233
+
234
+ static VALUE rb_gsl_multimin_function_fdf_n(VALUE obj)
235
+ {
236
+ gsl_multimin_function_fdf *F = NULL;
237
+ Data_Get_Struct(obj, gsl_multimin_function_fdf, F);
238
+ return INT2FIX(F->n);
239
+ }
240
+
241
+ static void set_function_fdf(int argc, VALUE *argv, gsl_multimin_function_fdf *F)
242
+ {
243
+ VALUE ary;
244
+ if (F->params == NULL) {
245
+ ary = rb_ary_new2(4);
246
+ /* (VALUE) F->params = ary;*/
247
+ F->params = (void *) ary;
248
+ } else {
249
+ ary = (VALUE) F->params;
250
+ }
251
+ switch (argc) {
252
+ case 1:
253
+ if (TYPE(argv[0]) != T_FIXNUM) rb_raise(rb_eTypeError, "Fixnum expected");
254
+ F->n = FIX2INT(argv[0]);
255
+ break;
256
+ case 2:
257
+ rb_ary_store(ary, 0, argv[0]);
258
+ rb_ary_store(ary, 1, argv[1]);
259
+ rb_ary_store(ary, 2, Qnil);
260
+ break;
261
+ case 3:
262
+ rb_ary_store(ary, 0, argv[0]);
263
+ rb_ary_store(ary, 1, argv[1]);
264
+ if (TYPE(argv[2]) == T_FIXNUM) {
265
+ F->n = FIX2INT(argv[2]);
266
+ rb_ary_store(ary, 2, Qnil);
267
+ } else {
268
+ rb_ary_store(ary, 2, argv[2]);
269
+ }
270
+ break;
271
+ case 4:
272
+ case 5:
273
+ if (TYPE(argv[0]) == T_FIXNUM) {
274
+ F->n = FIX2INT(argv[0]);
275
+ rb_ary_store(ary, 0, argv[1]);
276
+ rb_ary_store(ary, 1, argv[2]);
277
+ rb_ary_store(ary, 2, argv[3]);
278
+ } else {
279
+ rb_ary_store(ary, 0, argv[0]);
280
+ rb_ary_store(ary, 1, argv[1]);
281
+ rb_ary_store(ary, 2, argv[2]);
282
+ F->n = FIX2INT(argv[3]);
283
+ }
284
+ if (argc == 5) rb_ary_store(ary, 3, argv[4]);
285
+ break;
286
+ default:
287
+ rb_raise(rb_eArgError, "wrong number of arguments (1, 3, or 4)");
288
+ }
289
+ }
290
+
291
+ static VALUE rb_gsl_multimin_function_fdf_set_procs(int argc, VALUE *argv, VALUE obj)
292
+ {
293
+ VALUE ary;
294
+ gsl_multimin_function_fdf *F = NULL;
295
+ Data_Get_Struct(obj, gsl_multimin_function_fdf, F);
296
+ if (F->params == NULL) {
297
+ ary = rb_ary_new2(4);
298
+ /* (VALUE) F->params = ary;*/
299
+ F->params = (void *) ary;
300
+ } else {
301
+ ary = (VALUE) F->params;
302
+ }
303
+ switch (argc) {
304
+ case 2:
305
+ rb_ary_store(ary, 0, argv[0]);
306
+ rb_ary_store(ary, 1, argv[1]);
307
+ rb_ary_store(ary, 2, Qnil);
308
+ break;
309
+ case 3:
310
+ rb_ary_store(ary, 0, argv[0]);
311
+ rb_ary_store(ary, 1, argv[1]);
312
+ if (TYPE(argv[2]) == T_FIXNUM) {
313
+ F->n = FIX2INT(argv[2]);
314
+ rb_ary_store(ary, 2, Qnil);
315
+ } else {
316
+ rb_ary_store(ary, 2, argv[2]);
317
+ }
318
+ break;
319
+ case 4:
320
+ case 5:
321
+ if (TYPE(argv[0]) == T_FIXNUM) {
322
+ F->n = FIX2INT(argv[0]);
323
+ rb_ary_store(ary, 0, argv[1]);
324
+ rb_ary_store(ary, 1, argv[2]);
325
+ rb_ary_store(ary, 2, argv[3]);
326
+ } else {
327
+ rb_ary_store(ary, 0, argv[0]);
328
+ rb_ary_store(ary, 1, argv[1]);
329
+ rb_ary_store(ary, 2, argv[2]);
330
+ F->n = FIX2INT(argv[3]);
331
+ }
332
+ if (argc == 5) rb_ary_store(ary, 3, argv[4]);
333
+ break;
334
+ default:
335
+ rb_raise(rb_eArgError, "wrong number of arguments (2, 3, or 4)");
336
+ }
337
+ return obj;
338
+ }
339
+
340
+ static VALUE rb_gsl_multimin_function_fdf_set_params(int argc, VALUE *argv, VALUE obj)
341
+ {
342
+ gsl_multimin_function_fdf *F = NULL;
343
+ VALUE ary, ary2;
344
+ size_t i;
345
+ if (argc == 0) return obj;
346
+ Data_Get_Struct(obj, gsl_multimin_function_fdf, F);
347
+ if (F->params == NULL) {
348
+ ary = rb_ary_new2(4);
349
+ /* (VALUE) F->params = ary;*/
350
+ F->params = (void *) ary;
351
+ } else {
352
+ ary = (VALUE) F->params;
353
+ }
354
+ if (argc == 1) {
355
+ rb_ary_store(ary, 3, argv[0]);
356
+ } else {
357
+ ary2 = rb_ary_new2(argc);
358
+ for (i = 0; i < argc; i++) rb_ary_store(ary2, i, argv[i]);
359
+ rb_ary_store(ary, 3, ary2);
360
+ }
361
+ return obj;
362
+ }
363
+
364
+ static VALUE rb_gsl_multimin_function_fdf_set(int argc, VALUE *argv, VALUE obj)
365
+ {
366
+ gsl_multimin_function_fdf *F = NULL;
367
+ Data_Get_Struct(obj, gsl_multimin_function_fdf, F);
368
+ set_function_fdf(argc, argv, F);
369
+ return obj;
370
+ }
371
+
372
+ double rb_gsl_multimin_function_fdf_f(const gsl_vector *x, void *p)
373
+ {
374
+ VALUE vx, proc, vp, result, ary;
375
+ vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
376
+ ary = (VALUE) p;
377
+ proc = rb_ary_entry(ary, 0);
378
+ vp = rb_ary_entry(ary, RARRAY(ary)->len-1);
379
+ if (NIL_P(vp)) result = rb_funcall(proc, RBGSL_ID_call, 1, vx);
380
+ else result = rb_funcall(proc, RBGSL_ID_call, 2, vx, vp);
381
+ return NUM2DBL(result);
382
+ }
383
+
384
+ void rb_gsl_multimin_function_fdf_df(const gsl_vector *x, void *p,
385
+ gsl_vector *g)
386
+ {
387
+ VALUE vx, vg, proc, vp, ary;
388
+ vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
389
+ vg = Data_Wrap_Struct(cgsl_vector, 0, NULL, g);
390
+ ary = (VALUE) p;
391
+ proc = rb_ary_entry(ary, 1);
392
+ vp = rb_ary_entry(ary, RARRAY(ary)->len-1);
393
+ if (NIL_P(vp)) {
394
+ rb_funcall(proc, RBGSL_ID_call, 2, vx, vg);
395
+ } else {
396
+ rb_funcall(proc, RBGSL_ID_call, 3, vx, vp, vg);
397
+ }
398
+ }
399
+
400
+ void rb_gsl_multimin_function_fdf_fdf(const gsl_vector *x, void *p,
401
+ double *f, gsl_vector *g)
402
+ {
403
+ VALUE vx, vf, vg, proc_fdf, proc_f, proc_df, vp, ary, result;
404
+ vx = Data_Wrap_Struct(cgsl_vector, 0, NULL, (gsl_vector *) x);
405
+ vg = Data_Wrap_Struct(cgsl_vector, 0, NULL, g);
406
+ vf = rb_float_new(*f);
407
+ ary = (VALUE) p;
408
+ proc_f = rb_ary_entry(ary, 0);
409
+ proc_df = rb_ary_entry(ary, 1);
410
+ proc_fdf = rb_ary_entry(ary, 2);
411
+ vp = rb_ary_entry(ary, RARRAY(ary)->len-1);
412
+ if (NIL_P(vp)) {
413
+ result = rb_funcall(proc_f, RBGSL_ID_call, 1, vx);
414
+ rb_funcall(proc_df, RBGSL_ID_call, 2, vx, vg);
415
+ } else {
416
+ result = rb_funcall(proc_f, RBGSL_ID_call, 2, vx, vp);
417
+ rb_funcall(proc_df, RBGSL_ID_call, 3, vx, vp, vg);
418
+ }
419
+ *f = NUM2DBL(result);
420
+ }
421
+
422
+ static VALUE rb_gsl_multimin_function_fdf_params(VALUE obj)
423
+ {
424
+ gsl_multimin_function_fdf *F = NULL;
425
+ Data_Get_Struct(obj, gsl_multimin_function_fdf, F);
426
+ return rb_ary_entry((VALUE) F->params, 3);
427
+ }
428
+
429
+ /****************/
430
+
431
+ static void define_const(VALUE klass1, VALUE klass2)
432
+ {
433
+ rb_define_const(klass1,
434
+ "CONJUGATE_FR", INT2FIX(GSL_FDFMINIMIZER_CONJUGATE_FR));
435
+ rb_define_const(klass1,
436
+ "CONJUGATE_PR", INT2FIX(GSL_FDFMINIMIZER_CONJUGATE_PR));
437
+ rb_define_const(klass1,
438
+ "VECTOR_BFGS", INT2FIX(GSL_FDFMINIMIZER_VECTOR_BFGS));
439
+ rb_define_const(klass1,
440
+ "STEEPEST_DESCENT", INT2FIX(GSL_FDFMINIMIZER_STEEPEST_DESCENT));
441
+ #ifdef GSL_1_3_LATER
442
+ rb_define_const(klass2,
443
+ "NMSIMPLEX", INT2FIX(GSL_FMINIMIZER_NMSIMPLEX));
444
+ #endif
445
+ #ifdef GSL_1_9_LATER
446
+ rb_define_const(klass1,
447
+ "VECTOR_BFGS2", INT2FIX(GSL_FDFMINIMIZER_VECTOR_BFGS2));
448
+ #endif
449
+ }
450
+
451
+ static const gsl_multimin_fdfminimizer_type* get_fdfminimizer_type(VALUE t)
452
+ {
453
+ char name[64];
454
+ switch (TYPE(t)) {
455
+ case T_STRING:
456
+ strcpy(name, STR2CSTR(t));
457
+ if (str_tail_grep(name, "conjugate_fr") == 0)
458
+ return gsl_multimin_fdfminimizer_conjugate_fr;
459
+ else if (str_tail_grep(name, "conjugate_pr") == 0)
460
+ return gsl_multimin_fdfminimizer_conjugate_pr;
461
+ else if (str_tail_grep(name, "vector_bfgs") == 0)
462
+ return gsl_multimin_fdfminimizer_vector_bfgs;
463
+ else if (str_tail_grep(name, "steepest_descent") == 0)
464
+ return gsl_multimin_fdfminimizer_steepest_descent;
465
+ #ifdef GSL_1_9_LATER
466
+ else if (str_tail_grep(name, "vector_bfgs2") == 0)
467
+ return gsl_multimin_fdfminimizer_vector_bfgs2;
468
+ #endif
469
+ else
470
+ rb_raise(rb_eTypeError, "%s: unknown minimizer type", name);
471
+ break;
472
+ case T_FIXNUM:
473
+ switch (FIX2INT(t)) {
474
+ case GSL_FDFMINIMIZER_CONJUGATE_FR:
475
+ return gsl_multimin_fdfminimizer_conjugate_fr; break;
476
+ case GSL_FDFMINIMIZER_CONJUGATE_PR:
477
+ return gsl_multimin_fdfminimizer_conjugate_pr; break;
478
+ case GSL_FDFMINIMIZER_VECTOR_BFGS:
479
+ return gsl_multimin_fdfminimizer_vector_bfgs; break;
480
+ case GSL_FDFMINIMIZER_STEEPEST_DESCENT:
481
+ return gsl_multimin_fdfminimizer_steepest_descent; break;
482
+ #ifdef GSL_1_9_LATER
483
+ case GSL_FDFMINIMIZER_VECTOR_BFGS2:
484
+ return gsl_multimin_fdfminimizer_vector_bfgs2; break;
485
+ #endif
486
+ default:
487
+ rb_raise(rb_eTypeError, "%d: unknown type", FIX2INT(t));
488
+ break;
489
+ }
490
+ break;
491
+ default:
492
+ rb_raise(rb_eTypeError, "type is given by a String or a Fixnum");
493
+ break;
494
+ }
495
+ }
496
+
497
+ static VALUE rb_gsl_fdfminimizer_new(VALUE klass, VALUE t, VALUE n)
498
+ {
499
+ gsl_multimin_fdfminimizer *gmf = NULL;
500
+ const gsl_multimin_fdfminimizer_type *T;
501
+ T = get_fdfminimizer_type(t);
502
+ gmf = gsl_multimin_fdfminimizer_alloc(T, FIX2INT(n));
503
+ return Data_Wrap_Struct(klass, 0, gsl_multimin_fdfminimizer_free, gmf);
504
+ }
505
+
506
+ static VALUE rb_gsl_fdfminimizer_set(VALUE obj, VALUE ff, VALUE xx, VALUE ss,
507
+ VALUE tt)
508
+ {
509
+ gsl_multimin_fdfminimizer *gmf = NULL;
510
+ gsl_multimin_function_fdf *F = NULL;
511
+ gsl_vector *x;
512
+ double stepsize, tol;
513
+ int status;
514
+ CHECK_MULTIMIN_FUNCTION_FDF(ff);
515
+ Need_Float(ss); Need_Float(tt);
516
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
517
+ Data_Get_Struct(ff, gsl_multimin_function_fdf, F);
518
+ Data_Get_Vector(xx, x);
519
+ stepsize = NUM2DBL(ss);
520
+ tol = NUM2DBL(tt);
521
+ status = gsl_multimin_fdfminimizer_set(gmf, F, x, stepsize, tol);
522
+ return INT2FIX(status);
523
+ }
524
+
525
+ static VALUE rb_gsl_fdfminimizer_name(VALUE obj)
526
+ {
527
+ gsl_multimin_fdfminimizer *gmf = NULL;
528
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
529
+ return rb_str_new2(gsl_multimin_fdfminimizer_name(gmf));
530
+ }
531
+
532
+ static VALUE rb_gsl_fdfminimizer_iterate(VALUE obj)
533
+ {
534
+ gsl_multimin_fdfminimizer *gmf = NULL;
535
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
536
+ return INT2FIX(gsl_multimin_fdfminimizer_iterate(gmf));
537
+ }
538
+
539
+ static VALUE rb_gsl_fdfminimizer_x(VALUE obj)
540
+ {
541
+ gsl_multimin_fdfminimizer *gmf = NULL;
542
+ gsl_vector *x = NULL;
543
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
544
+ x = gsl_multimin_fdfminimizer_x(gmf);
545
+ return Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, x);
546
+ }
547
+
548
+ static VALUE rb_gsl_fdfminimizer_gradient(VALUE obj)
549
+ {
550
+ gsl_multimin_fdfminimizer *gmf = NULL;
551
+ gsl_vector *gradient = NULL;
552
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
553
+ gradient = gsl_multimin_fdfminimizer_gradient(gmf);
554
+ return Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, gradient);
555
+ }
556
+
557
+ static VALUE rb_gsl_fdfminimizer_minimum(VALUE obj)
558
+ {
559
+ gsl_multimin_fdfminimizer *gmf = NULL;
560
+ double min;
561
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
562
+ min = gsl_multimin_fdfminimizer_minimum(gmf);
563
+ return rb_float_new(min);
564
+ }
565
+
566
+ static VALUE rb_gsl_fdfminimizer_f(VALUE obj)
567
+ {
568
+ gsl_multimin_fdfminimizer *gmf = NULL;
569
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
570
+ return rb_float_new(gmf->f);
571
+ }
572
+
573
+ static VALUE rb_gsl_fdfminimizer_restart(VALUE obj)
574
+ {
575
+ gsl_multimin_fdfminimizer *gmf = NULL;
576
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
577
+ return INT2FIX(gsl_multimin_fdfminimizer_restart(gmf));
578
+ }
579
+
580
+ static VALUE rb_gsl_fdfminimizer_test_gradient(VALUE obj, VALUE ea)
581
+ {
582
+ gsl_multimin_fdfminimizer *gmf = NULL;
583
+ gsl_vector *g = NULL;
584
+ Need_Float(ea);
585
+ Data_Get_Struct(obj, gsl_multimin_fdfminimizer, gmf);
586
+ g = gsl_multimin_fdfminimizer_gradient(gmf);
587
+ return INT2FIX(gsl_multimin_test_gradient(g, NUM2DBL(ea)));
588
+ }
589
+
590
+ static VALUE rb_gsl_multimin_test_gradient(VALUE obj, VALUE gg, VALUE ea)
591
+ {
592
+ gsl_vector *g = NULL;
593
+ Need_Float(ea);
594
+ Data_Get_Vector(gg, g);
595
+ return INT2FIX(gsl_multimin_test_gradient(g, NUM2DBL(ea)));
596
+ }
597
+
598
+ /*****/
599
+ #ifdef GSL_1_3_LATER
600
+ static const gsl_multimin_fminimizer_type* get_fminimizer_type(VALUE t)
601
+ {
602
+ char name[64];
603
+
604
+ switch (TYPE(t)) {
605
+ case T_STRING:
606
+ strcpy(name, STR2CSTR(t));
607
+ if (str_tail_grep(name, "nmsimplex") == 0)
608
+ return gsl_multimin_fminimizer_nmsimplex;
609
+ else
610
+ rb_raise(rb_eTypeError, "unknown type %s (only nmsimplex supported)", name);
611
+ break;
612
+ case T_FIXNUM:
613
+ switch (FIX2INT(t)) {
614
+ case GSL_FMINIMIZER_NMSIMPLEX:
615
+ return gsl_multimin_fminimizer_nmsimplex; break;
616
+ default:
617
+ rb_raise(rb_eTypeError, "%d: unknown type (not supported)", FIX2INT(t));
618
+ break;
619
+ }
620
+ break;
621
+ default:
622
+ rb_raise(rb_eTypeError, "wrong argument type %s (String or Fixnum expected)",
623
+ rb_class2name(CLASS_OF(t)));
624
+ break;
625
+ }
626
+ }
627
+
628
+ static VALUE rb_gsl_fminimizer_new(VALUE klass, VALUE t, VALUE n)
629
+ {
630
+ gsl_multimin_fminimizer *gmf = NULL;
631
+ const gsl_multimin_fminimizer_type *T;
632
+ CHECK_FIXNUM(n);
633
+ T = get_fminimizer_type(t);
634
+ gmf = gsl_multimin_fminimizer_alloc(T, FIX2INT(n));
635
+ return Data_Wrap_Struct(klass, 0, gsl_multimin_fminimizer_free, gmf);
636
+ }
637
+
638
+ static VALUE rb_gsl_fminimizer_set(VALUE obj, VALUE ff, VALUE xx, VALUE ss)
639
+ {
640
+ gsl_multimin_fminimizer *gmf = NULL;
641
+ gsl_multimin_function *F = NULL;
642
+ gsl_vector *x = NULL, *s = NULL;
643
+ CHECK_MULTIMIN_FUNCTION(ff);
644
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
645
+ Data_Get_Struct(ff, gsl_multimin_function, F);
646
+ Data_Get_Vector(xx, x);
647
+ Data_Get_Vector(ss, s);
648
+ return INT2FIX(gsl_multimin_fminimizer_set(gmf, F, x, s));
649
+ }
650
+
651
+ static VALUE rb_gsl_fminimizer_name(VALUE obj)
652
+ {
653
+ gsl_multimin_fminimizer *gmf = NULL;
654
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
655
+ return rb_str_new2(gsl_multimin_fminimizer_name(gmf));
656
+ }
657
+
658
+ static VALUE rb_gsl_fminimizer_iterate(VALUE obj)
659
+ {
660
+ gsl_multimin_fminimizer *gmf = NULL;
661
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
662
+ return INT2FIX(gsl_multimin_fminimizer_iterate(gmf));
663
+ }
664
+
665
+ static VALUE rb_gsl_fminimizer_x(VALUE obj)
666
+ {
667
+ gsl_multimin_fminimizer *gmf = NULL;
668
+ gsl_vector *x = NULL;
669
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
670
+ x = gsl_multimin_fminimizer_x(gmf);
671
+ return Data_Wrap_Struct(cgsl_vector_view_ro, 0, NULL, x);
672
+ }
673
+
674
+ static VALUE rb_gsl_fminimizer_minimum(VALUE obj)
675
+ {
676
+ gsl_multimin_fminimizer *gmf = NULL;
677
+ double min;
678
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
679
+ min = gsl_multimin_fminimizer_minimum(gmf);
680
+ return rb_float_new(min);
681
+ }
682
+
683
+ static VALUE rb_gsl_fminimizer_size(VALUE obj)
684
+ {
685
+ gsl_multimin_fminimizer *gmf = NULL;
686
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
687
+ return rb_float_new(gsl_multimin_fminimizer_size(gmf));
688
+ }
689
+
690
+ static VALUE rb_gsl_fminimizer_fval(VALUE obj)
691
+ {
692
+ gsl_multimin_fminimizer *gmf = NULL;
693
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
694
+ return rb_float_new(gmf->fval);
695
+ }
696
+
697
+ static VALUE rb_gsl_fminimizer_test_size(VALUE obj, VALUE ea)
698
+ {
699
+ gsl_multimin_fminimizer *gmf = NULL;
700
+ Need_Float(ea);
701
+ Data_Get_Struct(obj, gsl_multimin_fminimizer, gmf);
702
+ return INT2FIX(gsl_multimin_test_size(gmf->size, NUM2DBL(ea)));
703
+ }
704
+ static VALUE rb_gsl_multimin_test_size(VALUE obj, VALUE ss, VALUE ea)
705
+ {
706
+ Need_Float(ss); Need_Float(ea);
707
+ return INT2FIX(gsl_multimin_test_size(NUM2DBL(ss), NUM2DBL(ea)));
708
+ }
709
+
710
+ #endif
711
+
712
+ #ifdef HAVE_GSL_GSL_MULTIMIN_FSDF_H
713
+ void Init_multimin_fsdf(VALUE module);
714
+ #endif
715
+
716
+ /*****/
717
+ void Init_gsl_multimin(VALUE module)
718
+ {
719
+ VALUE mgsl_multimin;
720
+ VALUE cgsl_multimin_fdfminimizer;
721
+ VALUE cgsl_multimin_fminimizer;
722
+
723
+ mgsl_multimin = rb_define_module_under(module, "MultiMin");
724
+ rb_define_singleton_method(mgsl_multimin, "test_gradient", rb_gsl_multimin_test_gradient, 2);
725
+ #ifdef GSL_1_3_LATER
726
+ rb_define_singleton_method(mgsl_multimin, "test_size", rb_gsl_multimin_test_size, 2);
727
+ #endif
728
+
729
+ cgsl_multimin_fdfminimizer = rb_define_class_under(mgsl_multimin, "FdfMinimizer", cGSL_Object);
730
+ cgsl_multimin_fminimizer = rb_define_class_under(mgsl_multimin, "FMinimizer", cGSL_Object);
731
+ define_const(cgsl_multimin_fdfminimizer, cgsl_multimin_fminimizer);
732
+
733
+ cgsl_multimin_function = rb_define_class_under(mgsl_multimin, "Function",
734
+ cgsl_function);
735
+ rb_define_singleton_method(cgsl_multimin_function, "alloc",
736
+ rb_gsl_multimin_function_new, -1);
737
+ rb_define_method(cgsl_multimin_function, "eval", rb_gsl_multimin_function_eval, 1);
738
+ rb_define_alias(cgsl_multimin_function, "call", "eval");
739
+ rb_define_method(cgsl_multimin_function, "set_proc", rb_gsl_multimin_function_set_f, -1);
740
+ rb_define_alias(cgsl_multimin_function, "set_f", "set_proc");
741
+ rb_define_method(cgsl_multimin_function, "set_params", rb_gsl_multimin_function_set_params, -1);
742
+ rb_define_method(cgsl_multimin_function, "params", rb_gsl_multimin_function_params, 0);
743
+ rb_define_method(cgsl_multimin_function, "n", rb_gsl_multimin_function_n, 0);
744
+
745
+ cgsl_multimin_function_fdf = rb_define_class_under(mgsl_multimin, "Function_fdf",
746
+ cGSL_Object);
747
+ rb_define_singleton_method(cgsl_multimin_function_fdf, "alloc",
748
+ rb_gsl_multimin_function_fdf_new, -1);
749
+
750
+ rb_define_method(cgsl_multimin_function_fdf, "set", rb_gsl_multimin_function_fdf_set, -1);
751
+ rb_define_method(cgsl_multimin_function_fdf, "set_params", rb_gsl_multimin_function_fdf_set_params, -1);
752
+ rb_define_method(cgsl_multimin_function_fdf, "set_procs", rb_gsl_multimin_function_fdf_set_procs, -1);
753
+ rb_define_method(cgsl_multimin_function_fdf, "params", rb_gsl_multimin_function_fdf_params, 0);
754
+ rb_define_method(cgsl_multimin_function_fdf, "n", rb_gsl_multimin_function_fdf_n, 0);
755
+
756
+ rb_define_singleton_method(cgsl_multimin_fdfminimizer, "alloc", rb_gsl_fdfminimizer_new, 2);
757
+
758
+ rb_define_method(cgsl_multimin_fdfminimizer, "set", rb_gsl_fdfminimizer_set, 4);
759
+ rb_define_method(cgsl_multimin_fdfminimizer, "name", rb_gsl_fdfminimizer_name, 0);
760
+ rb_define_method(cgsl_multimin_fdfminimizer, "iterate", rb_gsl_fdfminimizer_iterate, 0);
761
+ rb_define_method(cgsl_multimin_fdfminimizer, "x", rb_gsl_fdfminimizer_x, 0);
762
+ rb_define_method(cgsl_multimin_fdfminimizer, "f", rb_gsl_fdfminimizer_f, 0);
763
+ rb_define_method(cgsl_multimin_fdfminimizer, "gradient", rb_gsl_fdfminimizer_gradient, 0);
764
+ rb_define_method(cgsl_multimin_fdfminimizer, "minimum", rb_gsl_fdfminimizer_minimum, 0);
765
+ rb_define_method(cgsl_multimin_fdfminimizer, "restart", rb_gsl_fdfminimizer_restart, 0);
766
+ rb_define_method(cgsl_multimin_fdfminimizer, "test_gradient", rb_gsl_fdfminimizer_test_gradient, 1);
767
+
768
+ /*****/
769
+ #ifdef GSL_1_3_LATER
770
+ rb_define_singleton_method(cgsl_multimin_fminimizer, "alloc", rb_gsl_fminimizer_new, 2);
771
+
772
+ rb_define_method(cgsl_multimin_fminimizer, "set", rb_gsl_fminimizer_set, 3);
773
+ rb_define_method(cgsl_multimin_fminimizer, "name", rb_gsl_fminimizer_name, 0);
774
+ rb_define_method(cgsl_multimin_fminimizer, "iterate", rb_gsl_fminimizer_iterate, 0);
775
+ rb_define_method(cgsl_multimin_fminimizer, "x", rb_gsl_fminimizer_x, 0);
776
+ rb_define_method(cgsl_multimin_fminimizer, "fval", rb_gsl_fminimizer_fval, 0);
777
+ rb_define_method(cgsl_multimin_fminimizer, "minimum", rb_gsl_fminimizer_minimum, 0);
778
+ rb_define_method(cgsl_multimin_fminimizer, "size", rb_gsl_fminimizer_size, 0);
779
+ rb_define_method(cgsl_multimin_fminimizer, "test_size", rb_gsl_fminimizer_test_size, 1);
780
+ #endif
781
+
782
+
783
+ #ifdef HAVE_GSL_GSL_MULTIMIN_FSDF_H
784
+ Init_multimin_fsdf(mgsl_multimin);
785
+ #endif
786
+ }
787
+ #ifdef CHECK_MULTIMIN_FUNCTION
788
+ #undef CHECK_MULTIMIN_FUNCTION
789
+ #endif
790
+ #ifdef CHECK_MULTIMIN_FUNCTION_FDF
791
+ #undef CHECK_MULTIMIN_FUNCTION_FDF
792
+ #endif
793
+