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.
- data/README.rdoc +29 -0
- data/Rakefile +54 -0
- data/VERSION +2 -0
- data/ext/MANIFEST +119 -0
- data/ext/alf.c +206 -0
- data/ext/array.c +666 -0
- data/ext/array_complex.c +247 -0
- data/ext/blas.c +29 -0
- data/ext/blas1.c +731 -0
- data/ext/blas2.c +1093 -0
- data/ext/blas3.c +881 -0
- data/ext/block.c +44 -0
- data/ext/block_source.c +886 -0
- data/ext/bspline.c +130 -0
- data/ext/bundle.c +3 -0
- data/ext/cdf.c +754 -0
- data/ext/cheb.c +542 -0
- data/ext/combination.c +283 -0
- data/ext/common.c +325 -0
- data/ext/complex.c +1004 -0
- data/ext/const.c +673 -0
- data/ext/const_additional.c +120 -0
- data/ext/cqp.c +283 -0
- data/ext/deriv.c +195 -0
- data/ext/dht.c +361 -0
- data/ext/diff.c +166 -0
- data/ext/dirac.c +395 -0
- data/ext/eigen.c +2373 -0
- data/ext/error.c +194 -0
- data/ext/extconf.rb +281 -0
- data/ext/fcmp.c +66 -0
- data/ext/fft.c +1092 -0
- data/ext/fit.c +205 -0
- data/ext/fresnel.c +312 -0
- data/ext/function.c +524 -0
- data/ext/geometry.c +139 -0
- data/ext/graph.c +1638 -0
- data/ext/gsl.c +271 -0
- data/ext/gsl_narray.c +653 -0
- data/ext/histogram.c +1995 -0
- data/ext/histogram2d.c +1068 -0
- data/ext/histogram3d.c +884 -0
- data/ext/histogram3d_source.c +750 -0
- data/ext/histogram_find.c +101 -0
- data/ext/histogram_oper.c +159 -0
- data/ext/ieee.c +98 -0
- data/ext/integration.c +1138 -0
- data/ext/interp.c +512 -0
- data/ext/jacobi.c +739 -0
- data/ext/linalg.c +4047 -0
- data/ext/linalg_complex.c +741 -0
- data/ext/math.c +725 -0
- data/ext/matrix.c +39 -0
- data/ext/matrix_complex.c +1732 -0
- data/ext/matrix_double.c +560 -0
- data/ext/matrix_int.c +256 -0
- data/ext/matrix_source.c +2733 -0
- data/ext/min.c +250 -0
- data/ext/monte.c +992 -0
- data/ext/multifit.c +1879 -0
- data/ext/multimin.c +808 -0
- data/ext/multimin_fsdf.c +156 -0
- data/ext/multiroots.c +955 -0
- data/ext/ndlinear.c +321 -0
- data/ext/nmf.c +167 -0
- data/ext/nmf_wrap.c +72 -0
- data/ext/ntuple.c +469 -0
- data/ext/odeiv.c +959 -0
- data/ext/ool.c +879 -0
- data/ext/oper_complex_source.c +253 -0
- data/ext/permutation.c +596 -0
- data/ext/poly.c +42 -0
- data/ext/poly2.c +265 -0
- data/ext/poly_source.c +1885 -0
- data/ext/qrng.c +171 -0
- data/ext/randist.c +1873 -0
- data/ext/rational.c +480 -0
- data/ext/rng.c +612 -0
- data/ext/root.c +408 -0
- data/ext/sf.c +1494 -0
- data/ext/sf_airy.c +200 -0
- data/ext/sf_bessel.c +867 -0
- data/ext/sf_clausen.c +28 -0
- data/ext/sf_coulomb.c +206 -0
- data/ext/sf_coupling.c +118 -0
- data/ext/sf_dawson.c +29 -0
- data/ext/sf_debye.c +157 -0
- data/ext/sf_dilog.c +42 -0
- data/ext/sf_elementary.c +44 -0
- data/ext/sf_ellint.c +206 -0
- data/ext/sf_elljac.c +29 -0
- data/ext/sf_erfc.c +93 -0
- data/ext/sf_exp.c +164 -0
- data/ext/sf_expint.c +211 -0
- data/ext/sf_fermi_dirac.c +148 -0
- data/ext/sf_gamma.c +344 -0
- data/ext/sf_gegenbauer.c +96 -0
- data/ext/sf_hyperg.c +197 -0
- data/ext/sf_laguerre.c +112 -0
- data/ext/sf_lambert.c +47 -0
- data/ext/sf_legendre.c +367 -0
- data/ext/sf_log.c +104 -0
- data/ext/sf_mathieu.c +238 -0
- data/ext/sf_power.c +46 -0
- data/ext/sf_psi.c +98 -0
- data/ext/sf_synchrotron.c +48 -0
- data/ext/sf_transport.c +76 -0
- data/ext/sf_trigonometric.c +207 -0
- data/ext/sf_zeta.c +119 -0
- data/ext/signal.c +310 -0
- data/ext/siman.c +718 -0
- data/ext/sort.c +208 -0
- data/ext/spline.c +395 -0
- data/ext/stats.c +799 -0
- data/ext/sum.c +168 -0
- data/ext/tamu_anova.c +56 -0
- data/ext/tensor.c +38 -0
- data/ext/tensor_source.c +1123 -0
- data/ext/vector.c +38 -0
- data/ext/vector_complex.c +2236 -0
- data/ext/vector_double.c +1433 -0
- data/ext/vector_int.c +204 -0
- data/ext/vector_source.c +3329 -0
- data/ext/wavelet.c +937 -0
- data/include/rb_gsl.h +151 -0
- data/include/rb_gsl_array.h +238 -0
- data/include/rb_gsl_cheb.h +21 -0
- data/include/rb_gsl_common.h +343 -0
- data/include/rb_gsl_complex.h +25 -0
- data/include/rb_gsl_const.h +29 -0
- data/include/rb_gsl_dirac.h +13 -0
- data/include/rb_gsl_eigen.h +17 -0
- data/include/rb_gsl_fft.h +62 -0
- data/include/rb_gsl_fit.h +25 -0
- data/include/rb_gsl_function.h +27 -0
- data/include/rb_gsl_graph.h +70 -0
- data/include/rb_gsl_histogram.h +63 -0
- data/include/rb_gsl_histogram3d.h +97 -0
- data/include/rb_gsl_integration.h +17 -0
- data/include/rb_gsl_interp.h +46 -0
- data/include/rb_gsl_linalg.h +25 -0
- data/include/rb_gsl_math.h +26 -0
- data/include/rb_gsl_odeiv.h +21 -0
- data/include/rb_gsl_poly.h +71 -0
- data/include/rb_gsl_rational.h +37 -0
- data/include/rb_gsl_rng.h +21 -0
- data/include/rb_gsl_root.h +22 -0
- data/include/rb_gsl_sf.h +119 -0
- data/include/rb_gsl_statistics.h +17 -0
- data/include/rb_gsl_tensor.h +45 -0
- data/include/rb_gsl_with_narray.h +22 -0
- data/include/templates_off.h +87 -0
- data/include/templates_on.h +241 -0
- data/lib/gsl/gnuplot.rb +41 -0
- data/lib/gsl/oper.rb +68 -0
- data/lib/ool.rb +22 -0
- data/lib/ool/conmin.rb +30 -0
- 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
|
data/ext/cqp.c
ADDED
|
@@ -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
|
+
|
data/ext/deriv.c
ADDED
|
@@ -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
|