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,120 @@
1
+ /*
2
+ const_additional.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_const.h"
13
+
14
+ #ifndef GSL_1_4_9_LATER
15
+ #define MKS_STEFAN_BOLTZMANN_CONSTANT (5.6703993443638e-08)
16
+ #define MKS_THOMSON_CROSS_SECTION (6.65245852869236e-29)
17
+ #define CGS_STEFAN_BOLTZMANN_CONSTANT (5.6703993443638e-05)
18
+ #define CGS_THOMSON_CROSS_SECTION (6.65245852869236e-25)
19
+ #endif
20
+
21
+ #define MKS_CLASSICAL_ELECTRON_RADIUS (2.81794028310825e-15)
22
+ #define MKS_RADIATION_DENSITY_CONSTANT (7.56576650685962e-16)
23
+ #define MKS_RADIATION_NUMBER_DENSITY_CONSTANT (20.2869161066108e-6)
24
+ #define MKS_SOLAR_TIME (4.925490947e-6)
25
+ #define MKS_SOLAR_GM (1.3271243999e20)
26
+ #define MKS_PLANCK_MASS (2.17664610503472e-08)
27
+ #define MKS_PLANCK_LENGTH (1.61609744261067e-35)
28
+ #define MKS_PLANCK_TIME (5.39072081196475e-44)
29
+
30
+ #define CGS_CLASSICAL_ELECTRON_RADIUS (2.81794028310825e-13)
31
+ #define CGS_RADIATION_DENSITY_CONSTANT (7.56576650685962e-15)
32
+ #define CGS_RADIATION_NUMBER_DENSITY_CONSTANT (20.2869161066108)
33
+ #define CGS_SOLAR_TIME (4.925490947e-6)
34
+ #define CGS_SOLAR_GM (1.3271243999e26)
35
+ #define CGS_PLANCK_MASS (2.17664610503472e-05)
36
+ #define CGS_PLANCK_LENGTH (1.61609744261067e-33)
37
+ #define CGS_PLANCK_TIME (5.39072081196475e-44)
38
+
39
+ static void rb_gsl_const_mks(VALUE module);
40
+ static void rb_gsl_const_cgs(VALUE module);
41
+ static void rb_gsl_const_num(VALUE module);
42
+
43
+ static void rb_gsl_const_mks(VALUE module)
44
+ {
45
+ rb_define_const(module, "RADIATION_DENSITY_CONSTANT",
46
+ rb_float_new(MKS_RADIATION_DENSITY_CONSTANT));
47
+ rb_define_const(module, "RADIATION_NUMBER_DENSITY_CONSTANT",
48
+ rb_float_new(MKS_RADIATION_NUMBER_DENSITY_CONSTANT));
49
+ rb_define_const(module, "CLASSICAL_ELECTRON_RADIUS",
50
+ rb_float_new(MKS_CLASSICAL_ELECTRON_RADIUS));
51
+ rb_define_const(module, "SOLAR_TIME", rb_float_new(MKS_SOLAR_TIME));
52
+ rb_define_const(module, "SOLAR_GM", rb_float_new(MKS_SOLAR_GM));
53
+
54
+ rb_define_const(module, "PLANCK_MASS", rb_float_new(MKS_PLANCK_MASS));
55
+ rb_define_const(module, "PLANCK_LENGTH", rb_float_new(MKS_PLANCK_LENGTH));
56
+ rb_define_const(module, "PLANCK_TIME", rb_float_new(MKS_PLANCK_TIME));
57
+
58
+ #ifndef GSL_1_4_9_LATER
59
+ rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT",
60
+ rb_float_new(MKS_STEFAN_BOLTZMANN_CONSTANT));
61
+ rb_define_const(module, "THOMSON_CROSS_SECTION",
62
+ rb_float_new(MKS_THOMSON_CROSS_SECTION));
63
+ #endif
64
+ }
65
+
66
+ static void rb_gsl_const_cgs(VALUE module)
67
+ {
68
+ rb_define_const(module, "RADIATION_DENSITY_CONSTANT",
69
+ rb_float_new(CGS_RADIATION_DENSITY_CONSTANT));
70
+ rb_define_const(module, "RADIATION_NUMBER_DENSITY_CONSTANT",
71
+ rb_float_new(CGS_RADIATION_NUMBER_DENSITY_CONSTANT));
72
+ rb_define_const(module, "CLASSICAL_ELECTRON_RADIUS",
73
+ rb_float_new(CGS_CLASSICAL_ELECTRON_RADIUS));
74
+ rb_define_const(module, "SOLAR_TIME", rb_float_new(CGS_SOLAR_TIME));
75
+ rb_define_const(module, "SOLAR_GM", rb_float_new(CGS_SOLAR_GM));
76
+
77
+ rb_define_const(module, "PLANCK_MASS", rb_float_new(CGS_PLANCK_MASS));
78
+ rb_define_const(module, "PLANCK_LENGTH", rb_float_new(CGS_PLANCK_LENGTH));
79
+ rb_define_const(module, "PLANCK_TIME", rb_float_new(CGS_PLANCK_TIME));
80
+
81
+ #ifndef GSL_1_4_9_LATER
82
+ rb_define_const(module, "STEFAN_BOLTZMANN_CONSTANT",
83
+ rb_float_new(CGS_STEFAN_BOLTZMANN_CONSTANT));
84
+ rb_define_const(module, "THOMSON_CROSS_SECTION",
85
+ rb_float_new(CGS_THOMSON_CROSS_SECTION));
86
+ #endif
87
+ }
88
+
89
+ static void rb_gsl_const_num(VALUE module)
90
+ {
91
+
92
+ }
93
+
94
+ void Init_gsl_const_additional(VALUE mmks, VALUE mcgs, VALUE mnum)
95
+ {
96
+ rb_gsl_const_mks(mmks);
97
+ rb_gsl_const_cgs(mcgs);
98
+ rb_gsl_const_num(mnum);
99
+ }
100
+
101
+ #undef MKS_CLASSICAL_ELECTRON_RADIUS
102
+ #undef MKS_STEFAN_BOLTZMANN_CONSTANT
103
+ #undef MKS_RADIATION_DENSITY_CONSTANT
104
+ #undef MKS_RADIATION_NUMBER_DENSITY_CONSTANT
105
+ #undef CGS_CLASSICAL_ELECTRON_RADIUS
106
+ #undef CGS_STEFAN_BOLTZMANN_CONSTANT
107
+ #undef CGS_RADIATION_DENSITY_CONSTANT
108
+ #undef CGS_RADIATION_NUMBER_DENSITY_CONSTANT
109
+ #undef CGS_THOMSON_CROSS_SECTION
110
+ #undef MKS_THOMSON_CROSS_SECTION
111
+ #undef MKS_SOLAR_TIME
112
+ #undef CGS_SOLAR_TIME
113
+ #undef MKS_SOLAR_GM
114
+ #undef CGS_SOLAR_GM
115
+ #undef MKS_PLANCK_MASS
116
+ #undef MKS_PLANCK_LENGTH
117
+ #undef MKS_PLANCK_TIME
118
+ #undef CGS_PLANCK_MASS
119
+ #undef CGS_PLANCK_LENGTH
120
+ #undef CGS_PLANCK_TIME
@@ -0,0 +1,283 @@
1
+ #ifdef HAVE_GSL_GSL_CQP_H
2
+
3
+ #include "rb_gsl.h"
4
+ #include "gsl/gsl_cqp.h"
5
+
6
+ static const gsl_cqpminimizer_type* type_by_string(VALUE t);
7
+ static const gsl_cqpminimizer_type* get_type(VALUE t)
8
+ {
9
+
10
+ switch (TYPE(t)) {
11
+ case T_STRING:
12
+ return type_by_string(t);
13
+ break;
14
+ default:
15
+ rb_raise(rb_eTypeError, "Wrong argument type %s.", rb_class2name(CLASS_OF(t)));
16
+ }
17
+ }
18
+
19
+ static const gsl_cqpminimizer_type* type_by_string(VALUE t)
20
+ {
21
+ char *name;
22
+ name = STR2CSTR(t);
23
+ if (strcmp(name, "mg_pdip") == 0) {
24
+ return gsl_cqpminimizer_mg_pdip;
25
+ } else {
26
+ rb_raise(rb_eRuntimeError, "Unknown minimizer type %s.", name);
27
+ }
28
+ return NULL; /* never reach here */
29
+ }
30
+
31
+ static VALUE rb_cqpminimizer_alloc(VALUE klass, VALUE t, VALUE n, VALUE me, VALUE mi)
32
+ {
33
+ gsl_cqpminimizer *m;
34
+ m = gsl_cqpminimizer_alloc(get_type(t), (size_t) FIX2INT(n), (size_t) FIX2INT(me), (size_t) FIX2INT(mi));
35
+ return Data_Wrap_Struct(klass, 0, gsl_cqpminimizer_free, m);
36
+ }
37
+
38
+ static VALUE rb_cqpminimizer_set(VALUE obj, VALUE data)
39
+ {
40
+ gsl_cqpminimizer *m;
41
+ gsl_cqp_data *d;
42
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
43
+ Data_Get_Struct(data, gsl_cqp_data, d);
44
+ gsl_cqpminimizer_set(m, d);
45
+ return Qtrue;
46
+ }
47
+
48
+ static VALUE rb_cqpminimizer_name(VALUE obj)
49
+ {
50
+ gsl_cqpminimizer *m;
51
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
52
+ return rb_str_new2(gsl_cqpminimizer_name(m));
53
+ }
54
+
55
+ static VALUE rb_cqpminimizer_iterate(VALUE obj)
56
+ {
57
+ gsl_cqpminimizer *m;
58
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
59
+ return INT2FIX(gsl_cqpminimizer_iterate(m));
60
+ }
61
+
62
+ static VALUE rb_cqpminimizer_x(VALUE obj)
63
+ {
64
+ gsl_cqpminimizer *m;
65
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
66
+ return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_x(m));
67
+ }
68
+
69
+ static VALUE rb_cqpminimizer_lm_eq(VALUE obj)
70
+ {
71
+ gsl_cqpminimizer *m;
72
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
73
+ return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_lm_eq(m));
74
+ }
75
+ static VALUE rb_cqpminimizer_lm_ineq(VALUE obj)
76
+ {
77
+ gsl_cqpminimizer *m;
78
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
79
+ return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, gsl_cqpminimizer_lm_ineq(m));
80
+ }
81
+ static VALUE rb_cqpminimizer_f(VALUE obj)
82
+ {
83
+ gsl_cqpminimizer *m;
84
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
85
+ return rb_float_new(gsl_cqpminimizer_f(m));
86
+ }
87
+ static VALUE rb_cqpminimizer_gap(VALUE obj)
88
+ {
89
+ gsl_cqpminimizer *m;
90
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
91
+ return rb_float_new(gsl_cqpminimizer_gap(m));
92
+ }
93
+ static VALUE rb_cqpminimizer_residuals_norm(VALUE obj)
94
+ {
95
+ gsl_cqpminimizer *m;
96
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
97
+ return rb_float_new(gsl_cqpminimizer_residuals_norm(m));
98
+ }
99
+ /*
100
+ static VALUE rb_cqpminimizer_minimum(VALUE obj)
101
+ {
102
+ gsl_cqpminimizer *m;
103
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
104
+ return rb_float_new(gsl_cqpminimizer_minimum(m));
105
+ }
106
+ */
107
+ static VALUE rb_cqpminimizer_test_convergence(VALUE obj, VALUE g, VALUE r)
108
+ {
109
+ gsl_cqpminimizer *m;
110
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
111
+ return INT2FIX(gsl_cqpminimizer_test_convergence(m, NUM2DBL(g), NUM2DBL(r)));
112
+ }
113
+ static VALUE rb_cqpminimizer_test_infeasibility(VALUE obj, VALUE e)
114
+ {
115
+ gsl_cqpminimizer *m;
116
+ Data_Get_Struct(obj, gsl_cqpminimizer, m);
117
+ return INT2FIX(gsl_cqp_minimizer_test_infeasibility(m, NUM2DBL(e)));
118
+ }
119
+
120
+ static VALUE rb_cqp_data_alloc(VALUE klass)
121
+ {
122
+ gsl_cqp_data *d;
123
+ d = (gsl_cqp_data*) malloc(sizeof(gsl_cqp_data));
124
+ return Data_Wrap_Struct(klass, 0, free, d);
125
+ }
126
+
127
+ static VALUE rb_cqp_data_Q(VALUE obj)
128
+ {
129
+ gsl_cqp_data *d;
130
+ Data_Get_Struct(obj, gsl_cqp_data, d);
131
+ return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, d->Q);
132
+ }
133
+
134
+ static VALUE rb_cqp_data_q(VALUE obj)
135
+ {
136
+ gsl_cqp_data *d;
137
+ Data_Get_Struct(obj, gsl_cqp_data, d);
138
+ return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, d->q);
139
+ }
140
+
141
+ static VALUE rb_cqp_data_A(VALUE obj)
142
+ {
143
+ gsl_cqp_data *d;
144
+ Data_Get_Struct(obj, gsl_cqp_data, d);
145
+ return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, d->A);
146
+ }
147
+
148
+ static VALUE rb_cqp_data_b(VALUE obj)
149
+ {
150
+ gsl_cqp_data *d;
151
+ Data_Get_Struct(obj, gsl_cqp_data, d);
152
+ return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, d->b);
153
+ }
154
+
155
+ static VALUE rb_cqp_data_C(VALUE obj)
156
+ {
157
+ gsl_cqp_data *d;
158
+ Data_Get_Struct(obj, gsl_cqp_data, d);
159
+ return Data_Wrap_Struct(cgsl_matrix_view, 0, NULL, d->C);
160
+ }
161
+
162
+ static VALUE rb_cqp_data_d(VALUE obj)
163
+ {
164
+ gsl_cqp_data *d;
165
+ Data_Get_Struct(obj, gsl_cqp_data, d);
166
+ return Data_Wrap_Struct(cgsl_vector_view, 0, NULL, d->d);
167
+ }
168
+
169
+ static VALUE rb_cqp_data_set_Q(VALUE obj, VALUE mm)
170
+ {
171
+ gsl_cqp_data *d;
172
+ gsl_matrix *m;
173
+ Data_Get_Struct(obj, gsl_cqp_data, d);
174
+ CHECK_MATRIX(mm);
175
+ Data_Get_Struct(mm, gsl_matrix, m);
176
+ d->Q = m;
177
+ return Qtrue;
178
+ }
179
+
180
+ static VALUE rb_cqp_data_set_q(VALUE obj, VALUE vv)
181
+ {
182
+ gsl_cqp_data *d;
183
+ gsl_vector *v;
184
+ Data_Get_Struct(obj, gsl_cqp_data, d);
185
+ CHECK_VECTOR(vv);
186
+ Data_Get_Struct(vv, gsl_vector, v);
187
+ d->q = v;
188
+ return Qtrue;
189
+ }
190
+
191
+ static VALUE rb_cqp_data_set_A(VALUE obj, VALUE mm)
192
+ {
193
+ gsl_cqp_data *d;
194
+ gsl_matrix *m;
195
+ Data_Get_Struct(obj, gsl_cqp_data, d);
196
+ CHECK_MATRIX(mm);
197
+ Data_Get_Struct(mm, gsl_matrix, m);
198
+ d->A = m;
199
+ return Qtrue;
200
+ }
201
+
202
+ static VALUE rb_cqp_data_set_b(VALUE obj, VALUE vv)
203
+ {
204
+ gsl_cqp_data *d;
205
+ gsl_vector *v;
206
+ Data_Get_Struct(obj, gsl_cqp_data, d);
207
+ CHECK_VECTOR(vv);
208
+ Data_Get_Struct(vv, gsl_vector, v);
209
+ d->b = v;
210
+ return Qtrue;
211
+ }
212
+
213
+ static VALUE rb_cqp_data_set_C(VALUE obj, VALUE mm)
214
+ {
215
+ gsl_cqp_data *d;
216
+ gsl_matrix *m;
217
+ Data_Get_Struct(obj, gsl_cqp_data, d);
218
+ CHECK_MATRIX(mm);
219
+ Data_Get_Struct(mm, gsl_matrix, m);
220
+ d->C = m;
221
+ return Qtrue;
222
+ }
223
+
224
+ static VALUE rb_cqp_data_set_d(VALUE obj, VALUE vv)
225
+ {
226
+ gsl_cqp_data *d;
227
+ gsl_vector *v;
228
+ Data_Get_Struct(obj, gsl_cqp_data, d);
229
+ CHECK_VECTOR(vv);
230
+ Data_Get_Struct(vv, gsl_vector, v);
231
+ d->d = v;
232
+ return Qtrue;
233
+ }
234
+
235
+ void Init_cqp(VALUE module)
236
+ {
237
+ VALUE mCQP, cMinimizer, cData;
238
+
239
+ mCQP = rb_define_module_under(module, "CQP");
240
+ cMinimizer = rb_define_class_under(mCQP, "Minimizer", cGSL_Object);
241
+ cData = rb_define_class_under(mCQP, "Data", cGSL_Object);
242
+
243
+ rb_define_singleton_method(cMinimizer, "alloc", rb_cqpminimizer_alloc, 4);
244
+
245
+ rb_define_method(cMinimizer, "set", rb_cqpminimizer_set, 1);
246
+ rb_define_method(cMinimizer, "name", rb_cqpminimizer_name, 0);
247
+ rb_define_method(cMinimizer, "iterate", rb_cqpminimizer_iterate, 0);
248
+ rb_define_method(cMinimizer, "x", rb_cqpminimizer_x, 0);
249
+ rb_define_method(cMinimizer, "lm_eq", rb_cqpminimizer_lm_eq, 0);
250
+ rb_define_method(cMinimizer, "lm_ineq", rb_cqpminimizer_lm_ineq, 0);
251
+ rb_define_method(cMinimizer, "f", rb_cqpminimizer_f, 0);
252
+ rb_define_method(cMinimizer, "gap", rb_cqpminimizer_gap, 0);
253
+ rb_define_method(cMinimizer, "residuals_norm", rb_cqpminimizer_residuals_norm, 0);
254
+ /* rb_define_method(cMinimizer, "minimum", rb_cqpminimizer_minimum, 0); */
255
+ rb_define_method(cMinimizer, "test_convergence", rb_cqpminimizer_test_convergence, 2);
256
+ rb_define_method(cMinimizer, "test_infeasibility", rb_cqpminimizer_test_infeasibility, 1);
257
+
258
+ /*****/
259
+ rb_define_singleton_method(cData, "alloc", rb_cqp_data_alloc, 0);
260
+
261
+ rb_define_method(cData, "Q", rb_cqp_data_Q, 0);
262
+ rb_define_method(cData, "q", rb_cqp_data_q, 0);
263
+ rb_define_method(cData, "A", rb_cqp_data_A, 0);
264
+ rb_define_method(cData, "b", rb_cqp_data_b, 0);
265
+ rb_define_method(cData, "C", rb_cqp_data_C, 0);
266
+ rb_define_method(cData, "d", rb_cqp_data_d, 0);
267
+
268
+ rb_define_method(cData, "set_Q", rb_cqp_data_set_Q, 1);
269
+ rb_define_method(cData, "set_q", rb_cqp_data_set_q, 1);
270
+ rb_define_method(cData, "set_A", rb_cqp_data_set_A, 1);
271
+ rb_define_method(cData, "set_b", rb_cqp_data_set_b, 1);
272
+ rb_define_method(cData, "set_C", rb_cqp_data_set_C, 1);
273
+ rb_define_method(cData, "set_d", rb_cqp_data_set_d, 1);
274
+ rb_define_alias(cData, "Q=", "set_Q");
275
+ rb_define_alias(cData, "q=", "set_q");
276
+ rb_define_alias(cData, "A=", "set_A");
277
+ rb_define_alias(cData, "b=", "set_b");
278
+ rb_define_alias(cData, "C=", "set_C");
279
+ rb_define_alias(cData, "d=", "set_d");
280
+ }
281
+
282
+ #endif
283
+
@@ -0,0 +1,195 @@
1
+ /*
2
+ deriv.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
+ #ifdef GSL_1_4_9_LATER
13
+ #include "rb_gsl_common.h"
14
+ #include "rb_gsl_function.h"
15
+ #include <gsl/gsl_math.h>
16
+ #include <gsl/gsl_deriv.h>
17
+ #define RB_GSL_DERIV_H_DEFAULT (1e-8)
18
+ #ifdef HAVE_NARRAY_H
19
+ #include "narray.h"
20
+ #endif
21
+
22
+ static int get_func2(int argc, VALUE *argv, VALUE obj, VALUE *ff, VALUE *xx, VALUE *hh)
23
+ {
24
+ switch (TYPE(obj)) {
25
+ case T_MODULE:
26
+ case T_CLASS:
27
+ case T_OBJECT:
28
+ if (argc == 3) {
29
+ CHECK_FUNCTION(argv[0]);
30
+ Need_Float(argv[2]);
31
+ *ff = argv[0];
32
+ *xx = argv[1];
33
+ *hh = argv[2];
34
+ } else if (argc == 2) {
35
+ CHECK_FUNCTION(argv[0]);
36
+ *ff = argv[0];
37
+ *xx = argv[1];
38
+ *hh = rb_float_new(RB_GSL_DERIV_H_DEFAULT);
39
+ } else {
40
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
41
+ }
42
+ break;
43
+ default:
44
+ if (argc == 2) {
45
+ Need_Float(argv[1]);
46
+ *ff = obj;
47
+ *xx = argv[0];
48
+ *hh = argv[1];
49
+ } else if (argc == 1) {
50
+ *ff = obj;
51
+ *xx = argv[0];
52
+ *hh = rb_float_new(RB_GSL_DERIV_H_DEFAULT);
53
+ } else {
54
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
55
+ }
56
+ break;
57
+ }
58
+ return 0;
59
+ }
60
+
61
+ #ifdef RB_GSL_DERIV_H_DEFAULT
62
+ #undef RB_GSL_DERIV_H_DEFAULT
63
+ #endif
64
+
65
+ static VALUE rb_gsl_deriv_eval(VALUE obj, VALUE xx, VALUE hh,
66
+ int (*deriv)(const gsl_function *,
67
+ double, double,
68
+ double *, double *))
69
+ {
70
+ gsl_function *f = NULL;
71
+ double result, abserr, h;
72
+ VALUE x, ary, aerr;
73
+ gsl_vector *v = NULL, *vnew = NULL, *verr = NULL;
74
+ gsl_matrix *m = NULL, *mnew = NULL, *merr = NULL;
75
+ size_t n, i, j;
76
+ int status;
77
+ #ifdef HAVE_NARRAY_H
78
+ struct NARRAY *na;
79
+ double *ptr1, *ptr2, *ptr3;
80
+ VALUE ary2, ary3;
81
+ #endif
82
+ Need_Float(hh);
83
+ Data_Get_Struct(obj, gsl_function, f);
84
+ h = NUM2DBL(hh);
85
+ if (CLASS_OF(xx) == rb_cRange) xx = rb_gsl_range2ary(xx);
86
+ switch (TYPE(xx)) {
87
+ case T_FIXNUM:
88
+ case T_BIGNUM:
89
+ case T_FLOAT:
90
+ status = (*deriv)(f, NUM2DBL(xx), h, &result, &abserr);
91
+ return rb_ary_new3(3, rb_float_new(result), rb_float_new(abserr), INT2FIX(status));
92
+ break;
93
+ case T_ARRAY:
94
+ // n = RARRAY(xx)->len;
95
+ n = RARRAY_LEN(xx);
96
+ ary = rb_ary_new2(n);
97
+ aerr = rb_ary_new2(n);
98
+ for (i = 0; i < n; i++) {
99
+ x = rb_ary_entry(xx, i);
100
+ Need_Float(x);
101
+ (*deriv)(f, NUM2DBL(x), h, &result, &abserr);
102
+ rb_ary_store(ary, i, rb_float_new(result));
103
+ rb_ary_store(aerr, i, rb_float_new(abserr));
104
+ }
105
+ return rb_ary_new3(2, ary, aerr);
106
+ break;
107
+ default:
108
+ #ifdef HAVE_NARRAY_H
109
+ if (NA_IsNArray(xx)) {
110
+ GetNArray(xx, na);
111
+ n = na->total;
112
+ ptr1 = (double*) na->ptr;
113
+ ary2 = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
114
+ ary3 = na_make_object(NA_DFLOAT, na->rank, na->shape, CLASS_OF(xx));
115
+ ptr2 = NA_PTR_TYPE(ary2, double*);
116
+ ptr3 = NA_PTR_TYPE(ary3, double*);
117
+ for (i = 0; i < n; i++) {
118
+ (*deriv)(f, ptr1[i], h, &result, &abserr);
119
+ ptr2[i] = result;
120
+ ptr3[i] = abserr;
121
+ }
122
+ return rb_ary_new3(2, ary2, ary3);
123
+ }
124
+ #endif
125
+ if (VECTOR_P(xx)) {
126
+ Data_Get_Struct(xx, gsl_vector, v);
127
+ vnew = gsl_vector_alloc(v->size);
128
+ verr = gsl_vector_alloc(v->size);
129
+ for (i = 0; i < v->size; i++) {
130
+ (*deriv)(f, gsl_vector_get(v, i), h, &result, &abserr);
131
+ gsl_vector_set(vnew, i, result);
132
+ gsl_vector_set(verr, i, abserr);
133
+ }
134
+ return rb_ary_new3(2,
135
+ Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, vnew),
136
+ Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, verr));
137
+ } else if (MATRIX_P(xx)) {
138
+ Data_Get_Struct(xx, gsl_matrix, m);
139
+ mnew = gsl_matrix_alloc(m->size1, m->size2);
140
+ merr = gsl_matrix_alloc(m->size1, m->size2);
141
+ for (i = 0; i < m->size1; i++) {
142
+ for (j = 0; j < m->size2; j++) {
143
+ (*deriv)(f, gsl_matrix_get(m, i, j), h, &result, &abserr);
144
+ gsl_matrix_set(mnew, i, j, result);
145
+ gsl_matrix_set(merr, i, j, abserr);
146
+ }
147
+ }
148
+ return rb_ary_new3(2,
149
+ Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, mnew),
150
+ Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, merr));
151
+ } else {
152
+ rb_raise(rb_eTypeError, "wrong argument type");
153
+ }
154
+ break;
155
+ }
156
+ return Qnil; /* never reach here */
157
+ }
158
+
159
+ static VALUE rb_gsl_deriv_central(int argc, VALUE *argv, VALUE obj)
160
+ {
161
+ VALUE ff, xx, hh;
162
+ get_func2(argc, argv, obj, &ff, &xx, &hh);
163
+ return rb_gsl_deriv_eval(ff, xx, hh, gsl_deriv_central);
164
+ }
165
+
166
+ static VALUE rb_gsl_deriv_forward(int argc, VALUE *argv, VALUE obj)
167
+ {
168
+ VALUE ff, xx, hh;
169
+ get_func2(argc, argv, obj, &ff, &xx, &hh);
170
+ return rb_gsl_deriv_eval(ff, xx, hh, gsl_deriv_forward);
171
+ }
172
+
173
+ static VALUE rb_gsl_deriv_backward(int argc, VALUE *argv, VALUE obj)
174
+ {
175
+ VALUE ff, xx, hh;
176
+ get_func2(argc, argv, obj, &ff, &xx, &hh);
177
+ return rb_gsl_deriv_eval(ff, xx, hh, gsl_deriv_backward);
178
+ }
179
+
180
+ void Init_gsl_deriv(VALUE module)
181
+ {
182
+ VALUE mgsl_deriv;
183
+
184
+ mgsl_deriv = rb_define_module_under(module, "Deriv");
185
+
186
+ rb_define_method(cgsl_function, "deriv_central", rb_gsl_deriv_central, -1);
187
+ rb_define_method(cgsl_function, "deriv_forward", rb_gsl_deriv_forward, -1);
188
+ rb_define_method(cgsl_function, "deriv_backward", rb_gsl_deriv_backward, -1);
189
+
190
+ rb_define_singleton_method(mgsl_deriv, "central", rb_gsl_deriv_central, -1);
191
+ rb_define_singleton_method(mgsl_deriv, "forward", rb_gsl_deriv_forward, -1);
192
+ rb_define_singleton_method(mgsl_deriv, "backward", rb_gsl_deriv_backward, -1);
193
+ }
194
+
195
+ #endif