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
data/ext/nmf_wrap.c
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NMF: Non-Negative Matrix Factorization - Ruby wrapper
|
|
3
|
+
*
|
|
4
|
+
* Written by Roman Shterenzon
|
|
5
|
+
*
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include <ruby.h>
|
|
9
|
+
#include <gsl/gsl_matrix.h>
|
|
10
|
+
|
|
11
|
+
int gsl_matrix_nmf(gsl_matrix *v, int cols, gsl_matrix **w, gsl_matrix **h);
|
|
12
|
+
double difcost(const gsl_matrix *a, const gsl_matrix *b);
|
|
13
|
+
|
|
14
|
+
static VALUE mNMF;
|
|
15
|
+
extern VALUE cgsl_matrix;
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* call-seq:
|
|
19
|
+
* nmf(GSL::Matrix, columns) -> [GSL::Matrix, GSL::Matrix]
|
|
20
|
+
*
|
|
21
|
+
* Calculates the NMF of the given +matrix+, returns the W and H matrices
|
|
22
|
+
*/
|
|
23
|
+
static VALUE nmf_wrap(VALUE obj, VALUE matrix, VALUE cols)
|
|
24
|
+
{
|
|
25
|
+
gsl_matrix *w, *h, *m;
|
|
26
|
+
unsigned int c;
|
|
27
|
+
VALUE arr;
|
|
28
|
+
|
|
29
|
+
if ( ! FIXNUM_P(cols) || (c=NUM2INT(cols)) <= 0 ) {
|
|
30
|
+
rb_raise(rb_eArgError, "Number of columns should be a positive integer.");
|
|
31
|
+
}
|
|
32
|
+
arr = rb_ary_new2(2);
|
|
33
|
+
Data_Get_Struct(matrix, gsl_matrix, m);
|
|
34
|
+
|
|
35
|
+
/* compute the NMF */
|
|
36
|
+
gsl_matrix_nmf(m, c, &w, &h);
|
|
37
|
+
|
|
38
|
+
rb_ary_push(arr, Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, w));
|
|
39
|
+
rb_ary_push(arr, Data_Wrap_Struct(cgsl_matrix, 0, gsl_matrix_free, h));
|
|
40
|
+
|
|
41
|
+
return arr;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* call-seq:
|
|
46
|
+
* difcost(GSL::Matrix, GSL::Matrix) -> Float
|
|
47
|
+
*
|
|
48
|
+
* Calculates the geometric distance between two matrices
|
|
49
|
+
*/
|
|
50
|
+
static VALUE difcost_wrap(VALUE obj, VALUE matrix1, VALUE matrix2)
|
|
51
|
+
{
|
|
52
|
+
gsl_matrix *m1, *m2;
|
|
53
|
+
Data_Get_Struct(matrix1, gsl_matrix, m1);
|
|
54
|
+
Data_Get_Struct(matrix2, gsl_matrix, m2);
|
|
55
|
+
return rb_float_new(difcost(m1, m2));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* call-seq:
|
|
59
|
+
* nmf(cols) -> [GSL::Matrix, GSL::Matrix]
|
|
60
|
+
*/
|
|
61
|
+
static VALUE matrix_nmf(VALUE obj, VALUE cols)
|
|
62
|
+
{
|
|
63
|
+
return nmf_wrap(cgsl_matrix, obj, cols);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
void Init_gsl_matrix_nmf(void) {
|
|
67
|
+
mNMF = rb_define_module_under(cgsl_matrix, "NMF");
|
|
68
|
+
|
|
69
|
+
rb_define_singleton_method(mNMF, "nmf", nmf_wrap, 2);
|
|
70
|
+
rb_define_singleton_method(mNMF, "difcost", difcost_wrap, 2);
|
|
71
|
+
rb_define_method(cgsl_matrix, "nmf", matrix_nmf, 1);
|
|
72
|
+
}
|
data/ext/ntuple.c
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/*
|
|
2
|
+
ntuple.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_array.h"
|
|
14
|
+
#include "rb_gsl_function.h"
|
|
15
|
+
#include "rb_gsl_histogram.h"
|
|
16
|
+
#include <gsl/gsl_ntuple.h>
|
|
17
|
+
|
|
18
|
+
static VALUE cgsl_ntuple;
|
|
19
|
+
static VALUE cgsl_ntuple_select_fn;
|
|
20
|
+
static VALUE cgsl_ntuple_value_fn;
|
|
21
|
+
|
|
22
|
+
static VALUE rb_gsl_ntuple_new(int argc, VALUE *argv, VALUE klass)
|
|
23
|
+
{
|
|
24
|
+
gsl_vector *v = NULL;
|
|
25
|
+
gsl_matrix *m = NULL;
|
|
26
|
+
gsl_ntuple *n = NULL;
|
|
27
|
+
double *data = NULL;
|
|
28
|
+
size_t size;
|
|
29
|
+
switch (argc) {
|
|
30
|
+
case 2:
|
|
31
|
+
case 3:
|
|
32
|
+
if (VECTOR_P(argv[1])) {
|
|
33
|
+
Data_Get_Struct(argv[1], gsl_vector, v);
|
|
34
|
+
data = v->data;
|
|
35
|
+
size = v->size;
|
|
36
|
+
} else if (MATRIX_P(argv[1])) {
|
|
37
|
+
Data_Get_Struct(argv[1], gsl_matrix, m);
|
|
38
|
+
data = m->data;
|
|
39
|
+
size = m->size1*m->size2;
|
|
40
|
+
} else {
|
|
41
|
+
rb_raise(rb_eTypeError, "Vector or Matrix expected");
|
|
42
|
+
}
|
|
43
|
+
if (argc == 3) size = FIX2INT(argv[2]);
|
|
44
|
+
break;
|
|
45
|
+
default:
|
|
46
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
n = gsl_ntuple_create(STR2CSTR(argv[0]), data, size*sizeof(double));
|
|
50
|
+
return Data_Wrap_Struct(klass, 0, gsl_ntuple_close, n);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
VALUE rb_gsl_ntuple_open(int argc, VALUE *argv, VALUE klass)
|
|
54
|
+
{
|
|
55
|
+
gsl_vector *v = NULL;
|
|
56
|
+
gsl_matrix *m = NULL;
|
|
57
|
+
gsl_ntuple *n = NULL;
|
|
58
|
+
double *data = NULL;
|
|
59
|
+
size_t size;
|
|
60
|
+
switch (argc) {
|
|
61
|
+
case 2:
|
|
62
|
+
case 3:
|
|
63
|
+
if (VECTOR_P(argv[1])) {
|
|
64
|
+
Data_Get_Struct(argv[1], gsl_vector, v);
|
|
65
|
+
data = v->data;
|
|
66
|
+
size = v->size;
|
|
67
|
+
} else if (MATRIX_P(argv[1])) {
|
|
68
|
+
Data_Get_Struct(argv[1], gsl_matrix, m);
|
|
69
|
+
data = m->data;
|
|
70
|
+
size = m->size1*m->size2;
|
|
71
|
+
} else {
|
|
72
|
+
rb_raise(rb_eTypeError, "Vector or Matrix expected");
|
|
73
|
+
}
|
|
74
|
+
if (argc == 3) size = FIX2INT(argv[2]);
|
|
75
|
+
break;
|
|
76
|
+
default:
|
|
77
|
+
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
n = gsl_ntuple_open(STR2CSTR(argv[0]), data, size*sizeof(double));
|
|
81
|
+
return Data_Wrap_Struct(klass, 0, gsl_ntuple_close, n);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
VALUE rb_gsl_ntuple_write(VALUE obj)
|
|
85
|
+
{
|
|
86
|
+
gsl_ntuple *n = NULL;
|
|
87
|
+
Data_Get_Struct(obj, gsl_ntuple, n);
|
|
88
|
+
gsl_ntuple_write(n);
|
|
89
|
+
return obj;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
VALUE rb_gsl_ntuple_bookdata(VALUE obj)
|
|
93
|
+
{
|
|
94
|
+
gsl_ntuple *n = NULL;
|
|
95
|
+
Data_Get_Struct(obj, gsl_ntuple, n);
|
|
96
|
+
gsl_ntuple_bookdata(n);
|
|
97
|
+
return obj;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
VALUE rb_gsl_ntuple_read(VALUE obj)
|
|
101
|
+
{
|
|
102
|
+
gsl_ntuple *n = NULL;
|
|
103
|
+
Data_Get_Struct(obj, gsl_ntuple, n);
|
|
104
|
+
gsl_ntuple_read(n);
|
|
105
|
+
return obj;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
VALUE rb_gsl_ntuple_close(VALUE klass, VALUE obj)
|
|
109
|
+
{
|
|
110
|
+
gsl_ntuple *n = NULL;
|
|
111
|
+
Data_Get_Struct(obj, gsl_ntuple, n);
|
|
112
|
+
gsl_ntuple_close(n);
|
|
113
|
+
return Qnil;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
VALUE rb_gsl_ntuple_size(VALUE klass, VALUE obj)
|
|
117
|
+
{
|
|
118
|
+
gsl_ntuple *n = NULL;
|
|
119
|
+
Data_Get_Struct(obj, gsl_ntuple, n);
|
|
120
|
+
return INT2FIX(n->size);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
VALUE rb_gsl_ntuple_data(VALUE obj)
|
|
124
|
+
{
|
|
125
|
+
gsl_ntuple *n = NULL;
|
|
126
|
+
gsl_vector_view *v = NULL;
|
|
127
|
+
Data_Get_Struct(obj, gsl_ntuple, n);
|
|
128
|
+
v = gsl_vector_view_alloc();
|
|
129
|
+
v->vector.size = n->size;
|
|
130
|
+
v->vector.data = n->ntuple_data;
|
|
131
|
+
return Data_Wrap_Struct(cgsl_vector_view, 0, gsl_vector_view_free, v);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/***** select_fn *****/
|
|
135
|
+
|
|
136
|
+
static gsl_ntuple_select_fn* gsl_ntuple_select_fn_alloc();
|
|
137
|
+
static void gsl_ntuple_select_fn_free(gsl_ntuple_select_fn *ptr);
|
|
138
|
+
int rb_gsl_ntuple_select_fn_f(void *data, void *p);
|
|
139
|
+
static void gsl_ntuple_select_fn_mark(gsl_ntuple_select_fn *ptr);
|
|
140
|
+
|
|
141
|
+
static gsl_ntuple_select_fn* gsl_ntuple_select_fn_alloc()
|
|
142
|
+
{
|
|
143
|
+
gsl_ntuple_select_fn *ptr = NULL;
|
|
144
|
+
ptr = ALLOC(gsl_ntuple_select_fn);
|
|
145
|
+
if (ptr == NULL) rb_raise(rb_eRuntimeError, "malloc failed");
|
|
146
|
+
ptr->function = &rb_gsl_ntuple_select_fn_f;
|
|
147
|
+
/* (VALUE) ptr->params = rb_ary_new2(3);*/
|
|
148
|
+
ptr->params = (void *) rb_ary_new2(3);
|
|
149
|
+
rb_ary_store((VALUE) ptr->params, 1, Qnil);
|
|
150
|
+
return ptr;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
static void gsl_ntuple_select_fn_free(gsl_ntuple_select_fn *ptr)
|
|
154
|
+
{
|
|
155
|
+
free((gsl_ntuple_select_fn *) ptr);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
static void gsl_ntuple_select_fn_mark(gsl_ntuple_select_fn *ptr)
|
|
159
|
+
{
|
|
160
|
+
rb_gc_mark((VALUE) ptr->params);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
static VALUE rb_gsl_ntuple_select_fn_set_f(int argc, VALUE *argv, VALUE obj)
|
|
164
|
+
{
|
|
165
|
+
gsl_ntuple_select_fn *F = NULL;
|
|
166
|
+
VALUE ary, ary2;
|
|
167
|
+
size_t i;
|
|
168
|
+
Data_Get_Struct(obj, gsl_ntuple_select_fn, F);
|
|
169
|
+
if (F->params == NULL) {
|
|
170
|
+
ary = rb_ary_new2(3);
|
|
171
|
+
/* (VALUE) F->params = ary;*/
|
|
172
|
+
F->params = (void *) ary;
|
|
173
|
+
} else {
|
|
174
|
+
ary = (VALUE) F->params;
|
|
175
|
+
}
|
|
176
|
+
rb_ary_store(ary, 1, Qnil);
|
|
177
|
+
|
|
178
|
+
switch (argc) {
|
|
179
|
+
case 0:
|
|
180
|
+
break;
|
|
181
|
+
case 1:
|
|
182
|
+
CHECK_PROC(argv[0]);
|
|
183
|
+
rb_ary_store(ary, 0, argv[0]);
|
|
184
|
+
break;
|
|
185
|
+
case 2:
|
|
186
|
+
CHECK_PROC(argv[0]);
|
|
187
|
+
rb_ary_store(ary, 0, argv[0]);
|
|
188
|
+
rb_ary_store(ary, 1, argv[1]);
|
|
189
|
+
break;
|
|
190
|
+
default:
|
|
191
|
+
CHECK_PROC(argv[0]);
|
|
192
|
+
rb_ary_store(ary, 0, argv[0]);
|
|
193
|
+
ary2 = rb_ary_new2(argc-1);
|
|
194
|
+
for (i = 1; i < argc; i++) rb_ary_store(ary2, i-1, argv[i]);
|
|
195
|
+
rb_ary_store(ary, 1, ary2);
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
if (rb_block_given_p()) rb_ary_store(ary, 0, RB_GSL_MAKE_PROC);
|
|
199
|
+
return obj;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
int rb_gsl_ntuple_select_fn_f(void *data, void *p)
|
|
203
|
+
{
|
|
204
|
+
VALUE result, ary, proc, params, vv;
|
|
205
|
+
gsl_vector_view vtmp;
|
|
206
|
+
size_t size;
|
|
207
|
+
ary = (VALUE) p;
|
|
208
|
+
proc = rb_ary_entry(ary, 0);
|
|
209
|
+
params = rb_ary_entry(ary, 1);
|
|
210
|
+
size = FIX2INT(rb_ary_entry(ary, 2));
|
|
211
|
+
vtmp.vector.data = (double *) data;
|
|
212
|
+
vtmp.vector.size = size;
|
|
213
|
+
vtmp.vector.stride = 1;
|
|
214
|
+
vv = Data_Wrap_Struct(cgsl_vector_view, 0, NULL, &vtmp);
|
|
215
|
+
if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, vv);
|
|
216
|
+
else result = rb_funcall(proc, RBGSL_ID_call, 2, vv, params);
|
|
217
|
+
return FIX2INT(result);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
static VALUE rb_gsl_ntuple_select_fn_params(VALUE obj)
|
|
221
|
+
{
|
|
222
|
+
gsl_ntuple_select_fn *F = NULL;
|
|
223
|
+
Data_Get_Struct(obj, gsl_ntuple_select_fn, F);
|
|
224
|
+
return rb_ary_entry((VALUE) F->params, 1);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
static VALUE rb_gsl_ntuple_select_fn_set_params(int argc, VALUE *argv, VALUE obj)
|
|
228
|
+
{
|
|
229
|
+
gsl_ntuple_select_fn *F = NULL;
|
|
230
|
+
VALUE ary, ary2;
|
|
231
|
+
size_t i;
|
|
232
|
+
if (argc == 0) return obj;
|
|
233
|
+
Data_Get_Struct(obj, gsl_ntuple_select_fn, F);
|
|
234
|
+
ary = (VALUE) F->params;
|
|
235
|
+
if (argc == 1) {
|
|
236
|
+
rb_ary_store(ary, 1, argv[0]);
|
|
237
|
+
} else {
|
|
238
|
+
ary2 = rb_ary_new2(argc);
|
|
239
|
+
for (i = 0; i < argc; i++) rb_ary_store(ary2, i, argv[i]);
|
|
240
|
+
rb_ary_store(ary, 1, ary2);
|
|
241
|
+
}
|
|
242
|
+
return obj;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
static VALUE rb_gsl_ntuple_select_fn_new(int argc, VALUE *argv, VALUE klass)
|
|
246
|
+
{
|
|
247
|
+
gsl_ntuple_select_fn *F = NULL;
|
|
248
|
+
VALUE ff;
|
|
249
|
+
F = gsl_ntuple_select_fn_alloc();
|
|
250
|
+
ff = Data_Wrap_Struct(klass, gsl_ntuple_select_fn_mark, gsl_ntuple_select_fn_free, F);
|
|
251
|
+
rb_gsl_ntuple_select_fn_set_f(argc, argv, ff);
|
|
252
|
+
return ff;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/***** value_fn *****/
|
|
256
|
+
static gsl_ntuple_value_fn* gsl_ntuple_value_fn_alloc();
|
|
257
|
+
static void gsl_ntuple_value_fn_free(gsl_ntuple_value_fn *ptr);
|
|
258
|
+
static double rb_gsl_ntuple_value_fn_f(void *data, void *p);
|
|
259
|
+
static void gsl_ntuple_value_fn_mark(gsl_ntuple_value_fn *ptr);
|
|
260
|
+
|
|
261
|
+
static gsl_ntuple_value_fn* gsl_ntuple_value_fn_alloc()
|
|
262
|
+
{
|
|
263
|
+
gsl_ntuple_value_fn *ptr = NULL;
|
|
264
|
+
ptr = ALLOC(gsl_ntuple_value_fn);
|
|
265
|
+
if (ptr == NULL) rb_raise(rb_eRuntimeError, "malloc failed");
|
|
266
|
+
ptr->function = &rb_gsl_ntuple_value_fn_f;
|
|
267
|
+
/* (VALUE) ptr->params = rb_ary_new2(3);*/
|
|
268
|
+
ptr->params = (void *) rb_ary_new2(3);
|
|
269
|
+
rb_ary_store((VALUE) ptr->params, 1, Qnil);
|
|
270
|
+
return ptr;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
static void gsl_ntuple_value_fn_mark(gsl_ntuple_value_fn *ptr)
|
|
274
|
+
{
|
|
275
|
+
rb_gc_mark((VALUE) ptr->params);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
static void gsl_ntuple_value_fn_free(gsl_ntuple_value_fn *ptr)
|
|
279
|
+
{
|
|
280
|
+
free((gsl_ntuple_value_fn *) ptr);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
static VALUE rb_gsl_ntuple_value_fn_set_f(int argc, VALUE *argv, VALUE obj)
|
|
284
|
+
{
|
|
285
|
+
gsl_ntuple_value_fn *F = NULL;
|
|
286
|
+
VALUE ary, ary2;
|
|
287
|
+
size_t i;
|
|
288
|
+
Data_Get_Struct(obj, gsl_ntuple_value_fn, F);
|
|
289
|
+
if (F->params == NULL) {
|
|
290
|
+
ary = rb_ary_new2(3);
|
|
291
|
+
/* (VALUE) F->params = ary;*/
|
|
292
|
+
F->params = (void *) ary;
|
|
293
|
+
} else {
|
|
294
|
+
ary = (VALUE) F->params;
|
|
295
|
+
}
|
|
296
|
+
rb_ary_store(ary, 1, Qnil);
|
|
297
|
+
switch (argc) {
|
|
298
|
+
case 0:
|
|
299
|
+
break;
|
|
300
|
+
case 1:
|
|
301
|
+
CHECK_PROC(argv[0]);
|
|
302
|
+
rb_ary_store(ary, 0, argv[0]);
|
|
303
|
+
break;
|
|
304
|
+
case 2:
|
|
305
|
+
CHECK_PROC(argv[0]);
|
|
306
|
+
rb_ary_store(ary, 0, argv[0]);
|
|
307
|
+
rb_ary_store(ary, 1, argv[1]);
|
|
308
|
+
break;
|
|
309
|
+
default:
|
|
310
|
+
CHECK_PROC(argv[0]);
|
|
311
|
+
rb_ary_store(ary, 0, argv[0]);
|
|
312
|
+
ary2 = rb_ary_new2(argc-1);
|
|
313
|
+
for (i = 1; i < argc; i++) rb_ary_store(ary2, i-1, argv[i]);
|
|
314
|
+
rb_ary_store(ary, 1, ary2);
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
if (rb_block_given_p()) rb_ary_store(ary, 0, RB_GSL_MAKE_PROC);
|
|
318
|
+
return obj;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
static double rb_gsl_ntuple_value_fn_f(void *data, void *p)
|
|
322
|
+
{
|
|
323
|
+
VALUE result, ary, proc, params, vv;
|
|
324
|
+
gsl_vector_view vtmp;
|
|
325
|
+
ary = (VALUE) p;
|
|
326
|
+
proc = rb_ary_entry(ary, 0);
|
|
327
|
+
params = rb_ary_entry(ary, 1);
|
|
328
|
+
vtmp.vector.data = (double *) data;
|
|
329
|
+
vtmp.vector.size = FIX2INT(rb_ary_entry(ary, 2));
|
|
330
|
+
vtmp.vector.stride = 1;
|
|
331
|
+
vv = Data_Wrap_Struct(cgsl_vector_view, 0, NULL, &vtmp);
|
|
332
|
+
if (NIL_P(params)) result = rb_funcall(proc, RBGSL_ID_call, 1, vv);
|
|
333
|
+
else result = rb_funcall(proc, RBGSL_ID_call, 2, vv, params);
|
|
334
|
+
return NUM2DBL(result);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
static VALUE rb_gsl_ntuple_value_fn_params(VALUE obj)
|
|
338
|
+
{
|
|
339
|
+
gsl_ntuple_value_fn *F = NULL;
|
|
340
|
+
Data_Get_Struct(obj, gsl_ntuple_value_fn, F);
|
|
341
|
+
return rb_ary_entry((VALUE) F->params, 1);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
static VALUE rb_gsl_ntuple_value_fn_set_params(int argc, VALUE *argv, VALUE obj)
|
|
345
|
+
{
|
|
346
|
+
gsl_ntuple_value_fn *F = NULL;
|
|
347
|
+
VALUE ary, ary2;
|
|
348
|
+
size_t i;
|
|
349
|
+
if (argc == 0) return obj;
|
|
350
|
+
Data_Get_Struct(obj, gsl_ntuple_value_fn, F);
|
|
351
|
+
ary = (VALUE) F->params;
|
|
352
|
+
if (argc == 1) {
|
|
353
|
+
rb_ary_store(ary, 1, argv[0]);
|
|
354
|
+
} else {
|
|
355
|
+
ary2 = rb_ary_new2(argc);
|
|
356
|
+
for (i = 0; i < argc; i++) rb_ary_store(ary2, i, argv[i]);
|
|
357
|
+
rb_ary_store(ary, 1, ary2);
|
|
358
|
+
}
|
|
359
|
+
return obj;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
static VALUE rb_gsl_ntuple_value_fn_new(int argc, VALUE *argv, VALUE klass)
|
|
364
|
+
{
|
|
365
|
+
gsl_ntuple_value_fn *F = NULL;
|
|
366
|
+
VALUE ff;
|
|
367
|
+
F = gsl_ntuple_value_fn_alloc();
|
|
368
|
+
ff = Data_Wrap_Struct(klass, gsl_ntuple_value_fn_mark, gsl_ntuple_value_fn_free, F);
|
|
369
|
+
rb_gsl_ntuple_value_fn_set_f(argc, argv, ff);
|
|
370
|
+
return ff;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/* singleton method */
|
|
374
|
+
static VALUE rb_gsl_ntuple_project(VALUE obj, VALUE hh, VALUE nn,
|
|
375
|
+
VALUE vvfn, VALUE vsfn)
|
|
376
|
+
{
|
|
377
|
+
gsl_histogram *h = NULL;
|
|
378
|
+
gsl_ntuple *n = NULL;
|
|
379
|
+
gsl_ntuple_value_fn *vfn = NULL;
|
|
380
|
+
gsl_ntuple_select_fn *sfn = NULL;
|
|
381
|
+
int status;
|
|
382
|
+
size_t size;
|
|
383
|
+
if (!rb_obj_is_kind_of(hh, cgsl_histogram))
|
|
384
|
+
rb_raise(rb_eTypeError, "argument 1: Histogram expected");
|
|
385
|
+
Data_Get_Struct(hh, gsl_histogram, h);
|
|
386
|
+
if (!rb_obj_is_kind_of(nn, cgsl_ntuple))
|
|
387
|
+
rb_raise(rb_eTypeError, "argument 2: Ntuple expected");
|
|
388
|
+
Data_Get_Struct(nn, gsl_ntuple, n);
|
|
389
|
+
if (!rb_obj_is_kind_of(vvfn, cgsl_ntuple_value_fn))
|
|
390
|
+
rb_raise(rb_eTypeError, "argument 3: Ntuple::ValueFn expected");
|
|
391
|
+
Data_Get_Struct(vvfn, gsl_ntuple_value_fn, vfn);
|
|
392
|
+
if (!rb_obj_is_kind_of(vsfn, cgsl_ntuple_select_fn))
|
|
393
|
+
rb_raise(rb_eTypeError, "argument 4: Ntuple::SelectFn expected");
|
|
394
|
+
Data_Get_Struct(vsfn, gsl_ntuple_select_fn, sfn);
|
|
395
|
+
|
|
396
|
+
size = n->size/sizeof(double);
|
|
397
|
+
rb_ary_store((VALUE) vfn->params, 2, INT2FIX(size));
|
|
398
|
+
rb_ary_store((VALUE) sfn->params, 2, INT2FIX(size));
|
|
399
|
+
status = gsl_ntuple_project(h, n, vfn, sfn);
|
|
400
|
+
return INT2FIX(status);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/* method */
|
|
404
|
+
static VALUE rb_gsl_ntuple_project2(VALUE obj, VALUE hh, VALUE vvfn, VALUE vsfn)
|
|
405
|
+
{
|
|
406
|
+
gsl_histogram *h = NULL;
|
|
407
|
+
gsl_ntuple *n = NULL;
|
|
408
|
+
gsl_ntuple_value_fn *vfn = NULL;
|
|
409
|
+
gsl_ntuple_select_fn *sfn = NULL;
|
|
410
|
+
int status;
|
|
411
|
+
size_t size;
|
|
412
|
+
CHECK_HISTOGRAM(hh);
|
|
413
|
+
Data_Get_Struct(obj, gsl_ntuple, n);
|
|
414
|
+
Data_Get_Struct(hh, gsl_histogram, h);
|
|
415
|
+
if (!rb_obj_is_kind_of(vvfn, cgsl_ntuple_value_fn))
|
|
416
|
+
rb_raise(rb_eTypeError, "argument 2: Ntuple::ValueFn expected");
|
|
417
|
+
Data_Get_Struct(vvfn, gsl_ntuple_value_fn, vfn);
|
|
418
|
+
if (!rb_obj_is_kind_of(vsfn, cgsl_ntuple_select_fn))
|
|
419
|
+
rb_raise(rb_eTypeError, "argument 3: Ntuple::SelectFn expected");
|
|
420
|
+
Data_Get_Struct(vsfn, gsl_ntuple_select_fn, sfn);
|
|
421
|
+
size = n->size/sizeof(double);
|
|
422
|
+
rb_ary_store((VALUE) vfn->params, 2, INT2FIX(size));
|
|
423
|
+
rb_ary_store((VALUE) sfn->params, 2, INT2FIX(size));
|
|
424
|
+
status = gsl_ntuple_project(h, n, vfn, sfn);
|
|
425
|
+
return INT2FIX(status);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
void Init_gsl_ntuple(VALUE module)
|
|
429
|
+
{
|
|
430
|
+
cgsl_ntuple = rb_define_class_under(module, "Ntuple", cGSL_Object);
|
|
431
|
+
cgsl_ntuple_select_fn = rb_define_class_under(cgsl_ntuple, "SelectFn", cGSL_Object);
|
|
432
|
+
cgsl_ntuple_value_fn = rb_define_class_under(cgsl_ntuple, "ValueFn", cGSL_Object);
|
|
433
|
+
|
|
434
|
+
rb_define_singleton_method(cgsl_ntuple, "create", rb_gsl_ntuple_new, -1);
|
|
435
|
+
rb_define_singleton_method(cgsl_ntuple, "alloc", rb_gsl_ntuple_new, -1);
|
|
436
|
+
rb_define_singleton_method(cgsl_ntuple, "open", rb_gsl_ntuple_open, -1);
|
|
437
|
+
rb_define_singleton_method(cgsl_ntuple, "close", rb_gsl_ntuple_close, 0);
|
|
438
|
+
|
|
439
|
+
rb_define_method(cgsl_ntuple, "size", rb_gsl_ntuple_size, 0);
|
|
440
|
+
rb_define_method(cgsl_ntuple, "write", rb_gsl_ntuple_write, 0);
|
|
441
|
+
rb_define_method(cgsl_ntuple, "bookdata", rb_gsl_ntuple_bookdata, 0);
|
|
442
|
+
|
|
443
|
+
rb_define_method(cgsl_ntuple, "read", rb_gsl_ntuple_read, 0);
|
|
444
|
+
|
|
445
|
+
rb_define_method(cgsl_ntuple, "data", rb_gsl_ntuple_data, 0);
|
|
446
|
+
rb_define_alias(cgsl_ntuple, "get_data", "data");
|
|
447
|
+
rb_define_alias(cgsl_ntuple, "ntuple_data", "data");
|
|
448
|
+
|
|
449
|
+
rb_define_singleton_method(cgsl_ntuple_select_fn, "alloc",
|
|
450
|
+
rb_gsl_ntuple_select_fn_new, -1);
|
|
451
|
+
rb_define_method(cgsl_ntuple_select_fn, "set",
|
|
452
|
+
rb_gsl_ntuple_select_fn_set_f, -1);
|
|
453
|
+
rb_define_method(cgsl_ntuple_select_fn, "set_params",
|
|
454
|
+
rb_gsl_ntuple_select_fn_set_params, -1);
|
|
455
|
+
rb_define_method(cgsl_ntuple_select_fn, "params",
|
|
456
|
+
rb_gsl_ntuple_select_fn_params, 0);
|
|
457
|
+
|
|
458
|
+
rb_define_singleton_method(cgsl_ntuple_value_fn, "alloc",
|
|
459
|
+
rb_gsl_ntuple_value_fn_new, -1);
|
|
460
|
+
rb_define_method(cgsl_ntuple_value_fn, "set",
|
|
461
|
+
rb_gsl_ntuple_value_fn_set_f, -1);
|
|
462
|
+
rb_define_method(cgsl_ntuple_value_fn, "set_params",
|
|
463
|
+
rb_gsl_ntuple_value_fn_set_params, -1);
|
|
464
|
+
rb_define_method(cgsl_ntuple_value_fn, "params",
|
|
465
|
+
rb_gsl_ntuple_value_fn_params, 0);
|
|
466
|
+
|
|
467
|
+
rb_define_singleton_method(cgsl_ntuple, "project", rb_gsl_ntuple_project, 4);
|
|
468
|
+
rb_define_method(cgsl_ntuple, "project", rb_gsl_ntuple_project2, 3);
|
|
469
|
+
}
|