numo-linalg 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/README.md +80 -0
- data/Rakefile +18 -0
- data/ext/numo/linalg/blas/blas.c +352 -0
- data/ext/numo/linalg/blas/cblas.h +575 -0
- data/ext/numo/linalg/blas/cblas_t.h +563 -0
- data/ext/numo/linalg/blas/depend.erb +23 -0
- data/ext/numo/linalg/blas/extconf.rb +67 -0
- data/ext/numo/linalg/blas/gen/cogen.rb +72 -0
- data/ext/numo/linalg/blas/gen/decl.rb +203 -0
- data/ext/numo/linalg/blas/gen/desc.rb +8138 -0
- data/ext/numo/linalg/blas/gen/erbpp2.rb +339 -0
- data/ext/numo/linalg/blas/gen/replace_cblas_h.rb +27 -0
- data/ext/numo/linalg/blas/gen/spec.rb +93 -0
- data/ext/numo/linalg/blas/numo_blas.h +41 -0
- data/ext/numo/linalg/blas/tmpl/axpy.c +75 -0
- data/ext/numo/linalg/blas/tmpl/copy.c +57 -0
- data/ext/numo/linalg/blas/tmpl/def_c.c +3 -0
- data/ext/numo/linalg/blas/tmpl/def_d.c +3 -0
- data/ext/numo/linalg/blas/tmpl/def_s.c +3 -0
- data/ext/numo/linalg/blas/tmpl/def_z.c +3 -0
- data/ext/numo/linalg/blas/tmpl/dot.c +68 -0
- data/ext/numo/linalg/blas/tmpl/ger.c +114 -0
- data/ext/numo/linalg/blas/tmpl/init_class.c +20 -0
- data/ext/numo/linalg/blas/tmpl/init_module.c +12 -0
- data/ext/numo/linalg/blas/tmpl/lib.c +40 -0
- data/ext/numo/linalg/blas/tmpl/mm.c +214 -0
- data/ext/numo/linalg/blas/tmpl/module.c +9 -0
- data/ext/numo/linalg/blas/tmpl/mv.c +194 -0
- data/ext/numo/linalg/blas/tmpl/nrm2.c +79 -0
- data/ext/numo/linalg/blas/tmpl/rot.c +65 -0
- data/ext/numo/linalg/blas/tmpl/rotm.c +82 -0
- data/ext/numo/linalg/blas/tmpl/scal.c +69 -0
- data/ext/numo/linalg/blas/tmpl/sdsdot.c +77 -0
- data/ext/numo/linalg/blas/tmpl/set_prefix.c +16 -0
- data/ext/numo/linalg/blas/tmpl/swap.c +57 -0
- data/ext/numo/linalg/blas/tmpl/syr.c +102 -0
- data/ext/numo/linalg/blas/tmpl/syr2.c +110 -0
- data/ext/numo/linalg/blas/tmpl/syr2k.c +129 -0
- data/ext/numo/linalg/blas/tmpl/syrk.c +132 -0
- data/ext/numo/linalg/lapack/depend.erb +23 -0
- data/ext/numo/linalg/lapack/extconf.rb +45 -0
- data/ext/numo/linalg/lapack/gen/cogen.rb +74 -0
- data/ext/numo/linalg/lapack/gen/desc.rb +151278 -0
- data/ext/numo/linalg/lapack/gen/replace_lapacke_h.rb +32 -0
- data/ext/numo/linalg/lapack/gen/spec.rb +104 -0
- data/ext/numo/linalg/lapack/lapack.c +387 -0
- data/ext/numo/linalg/lapack/lapacke.h +16425 -0
- data/ext/numo/linalg/lapack/lapacke_config.h +119 -0
- data/ext/numo/linalg/lapack/lapacke_mangling.h +17 -0
- data/ext/numo/linalg/lapack/lapacke_t.h +10550 -0
- data/ext/numo/linalg/lapack/numo_lapack.h +42 -0
- data/ext/numo/linalg/lapack/tmpl/def_c.c +3 -0
- data/ext/numo/linalg/lapack/tmpl/def_d.c +7 -0
- data/ext/numo/linalg/lapack/tmpl/def_s.c +7 -0
- data/ext/numo/linalg/lapack/tmpl/def_z.c +3 -0
- data/ext/numo/linalg/lapack/tmpl/fact.c +179 -0
- data/ext/numo/linalg/lapack/tmpl/geev.c +123 -0
- data/ext/numo/linalg/lapack/tmpl/gels.c +232 -0
- data/ext/numo/linalg/lapack/tmpl/gesv.c +149 -0
- data/ext/numo/linalg/lapack/tmpl/gesvd.c +189 -0
- data/ext/numo/linalg/lapack/tmpl/ggev.c +138 -0
- data/ext/numo/linalg/lapack/tmpl/gqr.c +121 -0
- data/ext/numo/linalg/lapack/tmpl/init_class.c +20 -0
- data/ext/numo/linalg/lapack/tmpl/init_module.c +12 -0
- data/ext/numo/linalg/lapack/tmpl/lange.c +79 -0
- data/ext/numo/linalg/lapack/tmpl/lib.c +40 -0
- data/ext/numo/linalg/lapack/tmpl/module.c +9 -0
- data/ext/numo/linalg/lapack/tmpl/syev.c +91 -0
- data/ext/numo/linalg/lapack/tmpl/sygv.c +104 -0
- data/ext/numo/linalg/lapack/tmpl/trf.c +276 -0
- data/ext/numo/linalg/numo_linalg.h +115 -0
- data/lib/numo/linalg.rb +3 -0
- data/lib/numo/linalg/function.rb +1008 -0
- data/lib/numo/linalg/linalg.rb +7 -0
- data/lib/numo/linalg/loader.rb +174 -0
- data/lib/numo/linalg/use/atlas.rb +3 -0
- data/lib/numo/linalg/use/lapack.rb +3 -0
- data/lib/numo/linalg/use/mkl.rb +3 -0
- data/lib/numo/linalg/use/openblas.rb +3 -0
- data/lib/numo/linalg/version.rb +5 -0
- data/numo-linalg.gemspec +26 -0
- data/spec/lapack_spec.rb +13 -0
- metadata +172 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
#include "cblas.h"
|
2
|
+
#include "cblas_t.h"
|
3
|
+
#include "../numo_linalg.h"
|
4
|
+
|
5
|
+
typedef int blasint;
|
6
|
+
|
7
|
+
#define option_value numo_cblas_option_value
|
8
|
+
extern VALUE numo_cblas_option_value(VALUE value, VALUE default_value);
|
9
|
+
|
10
|
+
#define option_order numo_cblas_option_order
|
11
|
+
extern enum CBLAS_ORDER numo_cblas_option_order(VALUE order);
|
12
|
+
|
13
|
+
#define option_trans numo_cblas_option_trans
|
14
|
+
extern enum CBLAS_TRANSPOSE numo_cblas_option_trans(VALUE trans);
|
15
|
+
|
16
|
+
#define option_uplo numo_cblas_option_uplo
|
17
|
+
extern enum CBLAS_UPLO numo_cblas_option_uplo(VALUE uplo);
|
18
|
+
|
19
|
+
#define option_diag numo_cblas_option_diag
|
20
|
+
extern enum CBLAS_DIAG numo_cblas_option_diag(VALUE diag);
|
21
|
+
|
22
|
+
#define option_side numo_cblas_option_side
|
23
|
+
extern enum CBLAS_SIDE numo_cblas_option_side(VALUE side);
|
24
|
+
|
25
|
+
#define check_func numo_cblas_check_func
|
26
|
+
extern void numo_cblas_check_func(void **func, const char *name);
|
27
|
+
|
28
|
+
#define SWAP_IFCOL(order,a,b,tmp) \
|
29
|
+
{ if ((order)==CblasColMajor) {(tmp)=(a);(a)=(b);(b)=(tmp);} }
|
30
|
+
|
31
|
+
#define SWAP_IFROW(order,a,b,tmp) \
|
32
|
+
{ if ((order)==CblasRowMajor) {(tmp)=(a);(a)=(b);(b)=(tmp);} }
|
33
|
+
|
34
|
+
#define SWAP_IFCOLTR(order,trans,a,b,tmp) \
|
35
|
+
{ if (((order)==CblasRowMajor && (trans)!=CblasNoTrans) || \
|
36
|
+
((order)!=CblasRowMajor && (trans)==CblasNoTrans)) \
|
37
|
+
{(tmp)=(a);(a)=(b);(b)=(tmp);} \
|
38
|
+
}
|
39
|
+
|
40
|
+
#define CHECK_FUNC(fptr, fname) \
|
41
|
+
{ if ((fptr)==0) { check_func((void*)(&(fptr)),fname); } }
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#define args_t <%=name%>_args_t
|
2
|
+
|
3
|
+
typedef struct {
|
4
|
+
dtype alpha;
|
5
|
+
} args_t;
|
6
|
+
|
7
|
+
#define func_p <%=func_name%>_p
|
8
|
+
static <%=func_name%>_t func_p = 0;
|
9
|
+
|
10
|
+
static void
|
11
|
+
<%=c_iter%>(na_loop_t *const lp)
|
12
|
+
{
|
13
|
+
char *p1, *p2;
|
14
|
+
size_t n;
|
15
|
+
ssize_t s1, s2;
|
16
|
+
dtype *g;
|
17
|
+
|
18
|
+
INIT_COUNTER(lp,n);
|
19
|
+
INIT_PTR(lp,0,p1,s1);
|
20
|
+
INIT_PTR(lp,1,p2,s2);
|
21
|
+
g = (dtype*)(lp->opt_ptr);
|
22
|
+
|
23
|
+
(*func_p)(n, DP(*g), (dtype*)p1, s1/sizeof(dtype),
|
24
|
+
(dtype*)p2, s2/sizeof(dtype));
|
25
|
+
}
|
26
|
+
|
27
|
+
/*<%
|
28
|
+
params = [
|
29
|
+
vec("x"),
|
30
|
+
vec("y",:inplace),
|
31
|
+
opt("alpha"),
|
32
|
+
].select{|x| x}.join("\n ")
|
33
|
+
%>
|
34
|
+
@overload <%=name%>( x, y, [alpha:1] )
|
35
|
+
<%=params%>
|
36
|
+
@return [<%=class_name%>] y = alpha * x + y
|
37
|
+
|
38
|
+
<%=description%>
|
39
|
+
|
40
|
+
*/
|
41
|
+
static VALUE
|
42
|
+
<%=c_func(-1)%>(int argc, VALUE const argv[], VALUE UNUSED(mod))
|
43
|
+
{
|
44
|
+
VALUE x, y, alpha;
|
45
|
+
narray_t *na1, *na2;
|
46
|
+
ndfunc_arg_in_t ain[2] = {{cT,0},{OVERWRITE,0}};
|
47
|
+
ndfunc_t ndf = {<%=c_iter%>, STRIDE_LOOP, 2, 0, ain, 0};
|
48
|
+
|
49
|
+
dtype g;
|
50
|
+
VALUE kw_hash = Qnil;
|
51
|
+
ID kw_table[1] = {id_alpha};
|
52
|
+
VALUE opts[1] = {Qundef};
|
53
|
+
|
54
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
55
|
+
|
56
|
+
rb_scan_args(argc, argv, "2:", &x, &y, &kw_hash);
|
57
|
+
rb_get_kwargs(kw_hash, kw_table, 0, 1, opts);
|
58
|
+
alpha = option_value(opts[0],Qnil);
|
59
|
+
g = RTEST(alpha) ? m_num_to_data(alpha) : m_one;
|
60
|
+
|
61
|
+
COPY_OR_CAST_TO(y,cT);
|
62
|
+
GetNArray(x,na1);
|
63
|
+
GetNArray(y,na2);
|
64
|
+
CHECK_DIM_GE(na1,1);
|
65
|
+
CHECK_DIM_GE(na2,1);
|
66
|
+
CHECK_NON_EMPTY(na1);
|
67
|
+
CHECK_NON_EMPTY(na2);
|
68
|
+
CHECK_SAME_SHAPE(na1,na2);
|
69
|
+
|
70
|
+
na_ndloop3(&ndf, &g, 2, x, y);
|
71
|
+
return y;
|
72
|
+
}
|
73
|
+
|
74
|
+
#undef func_p
|
75
|
+
#undef args_t
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#define func_p <%=name%>_p
|
2
|
+
|
3
|
+
static <%=func_name%>_t func_p = 0;
|
4
|
+
|
5
|
+
static void
|
6
|
+
<%=c_iter%>(na_loop_t *const lp)
|
7
|
+
{
|
8
|
+
char *p1, *p2;
|
9
|
+
size_t n;
|
10
|
+
ssize_t s1, s2;
|
11
|
+
|
12
|
+
INIT_COUNTER(lp,n);
|
13
|
+
INIT_PTR(lp,0,p1,s1);
|
14
|
+
INIT_PTR(lp,1,p2,s2);
|
15
|
+
|
16
|
+
(*func_p)(n, (dtype*)p1, s1/sizeof(dtype),
|
17
|
+
(dtype*)p2, s2/sizeof(dtype));
|
18
|
+
}
|
19
|
+
|
20
|
+
/*<%
|
21
|
+
params = [
|
22
|
+
vec("x"),
|
23
|
+
vec("y"),
|
24
|
+
].select{|x| x}.join("\n ")
|
25
|
+
%>
|
26
|
+
@overload <%=name%>( x, y )
|
27
|
+
<%=params%>
|
28
|
+
@return [nil]
|
29
|
+
|
30
|
+
<%=description%>
|
31
|
+
|
32
|
+
*/
|
33
|
+
static VALUE
|
34
|
+
<%=c_func(2)%>(VALUE UNUSED(mod), VALUE x, VALUE y)
|
35
|
+
{
|
36
|
+
narray_t *na1, *na2;
|
37
|
+
ndfunc_arg_in_t ain[2] = {{cT,0},{OVERWRITE,0}};
|
38
|
+
ndfunc_t ndf = {<%=c_iter%>, STRIDE_LOOP, 2,0, ain,0};
|
39
|
+
|
40
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
41
|
+
|
42
|
+
CHECK_NARRAY_TYPE(x,cT);
|
43
|
+
CHECK_NARRAY_TYPE(y,cT);
|
44
|
+
GetNArray(x,na1);
|
45
|
+
GetNArray(y,na2);
|
46
|
+
CHECK_DIM_GE(na1,1);
|
47
|
+
CHECK_DIM_GE(na2,1);
|
48
|
+
CHECK_NON_EMPTY(na1);
|
49
|
+
CHECK_NON_EMPTY(na2);
|
50
|
+
CHECK_SAME_SHAPE(na1,na2);
|
51
|
+
|
52
|
+
na_ndloop(&ndf, 2, x, y);
|
53
|
+
|
54
|
+
return Qnil;
|
55
|
+
}
|
56
|
+
|
57
|
+
#undef func_p
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#define func_p <%=func_name%>_p
|
2
|
+
|
3
|
+
static <%=func_name%>_t func_p = 0;
|
4
|
+
|
5
|
+
#undef result_dtype
|
6
|
+
#define result_dtype <%=result_dtype%>
|
7
|
+
|
8
|
+
static void
|
9
|
+
<%=c_iter%>(na_loop_t *const lp)
|
10
|
+
{
|
11
|
+
char *p1, *p2, *p3;
|
12
|
+
size_t n;
|
13
|
+
ssize_t s1, s2;
|
14
|
+
|
15
|
+
INIT_PTR(lp,0,p1,s1);
|
16
|
+
INIT_PTR(lp,1,p2,s2);
|
17
|
+
p3 = NDL_PTR(lp,2);
|
18
|
+
n = NDL_SHAPE(lp,0)[0];
|
19
|
+
|
20
|
+
<% if /[cz]/ =~ blas_char %>
|
21
|
+
(*func_p)(n, (dtype*)p1, s1/sizeof(dtype),
|
22
|
+
(dtype*)p2, s2/sizeof(dtype), (result_dtype*)p3);
|
23
|
+
<% else %>
|
24
|
+
*(result_dtype*)p3 = (*func_p)(n, (dtype*)p1, s1/sizeof(dtype),
|
25
|
+
(dtype*)p2, s2/sizeof(dtype));
|
26
|
+
<% end %>
|
27
|
+
}
|
28
|
+
|
29
|
+
/*<%
|
30
|
+
params = [
|
31
|
+
vec("x"),
|
32
|
+
vec("y"),
|
33
|
+
].select{|x| x}.join("\n ")
|
34
|
+
%>
|
35
|
+
@overload <%=name%>( x, y )
|
36
|
+
<%=params%>
|
37
|
+
@return [<%=class_name%>] op(x) dot y
|
38
|
+
|
39
|
+
<%=description%>
|
40
|
+
|
41
|
+
*/
|
42
|
+
static VALUE
|
43
|
+
<%=c_func(2)%>(VALUE mod, VALUE x, VALUE y)
|
44
|
+
{
|
45
|
+
VALUE ans;
|
46
|
+
narray_t *na1, *na2;
|
47
|
+
size_t nx, ny, shape[1]={1};
|
48
|
+
ndfunc_arg_in_t ain[2] = {{cT,1},{cT,1}};
|
49
|
+
ndfunc_arg_out_t aout[1] = {{<%=result_class%>,0,shape}};
|
50
|
+
ndfunc_t ndf = {<%=c_iter%>, NDF_EXTRACT, 2,1, ain,aout};
|
51
|
+
|
52
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
53
|
+
|
54
|
+
GetNArray(x,na1);
|
55
|
+
GetNArray(y,na2);
|
56
|
+
CHECK_DIM_GE(na1,1);
|
57
|
+
CHECK_DIM_GE(na2,1);
|
58
|
+
CHECK_NON_EMPTY(na1);
|
59
|
+
CHECK_NON_EMPTY(na2);
|
60
|
+
nx = COL_SIZE(na1);
|
61
|
+
ny = COL_SIZE(na2);
|
62
|
+
CHECK_SIZE_EQ(nx,ny);
|
63
|
+
|
64
|
+
ans = na_ndloop(&ndf, 2, x, y);
|
65
|
+
|
66
|
+
return ans;
|
67
|
+
}
|
68
|
+
#undef func_p
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#define args_t <%=name%>_args_t
|
2
|
+
|
3
|
+
typedef struct {
|
4
|
+
enum CBLAS_ORDER order;
|
5
|
+
dtype alpha;
|
6
|
+
blasint m, n;
|
7
|
+
} args_t;
|
8
|
+
|
9
|
+
#define func_p <%=func_name%>_p
|
10
|
+
|
11
|
+
static <%=func_name%>_t func_p = 0;
|
12
|
+
|
13
|
+
static void
|
14
|
+
<%=c_iter%>(na_loop_t *const lp)
|
15
|
+
{
|
16
|
+
dtype *a;
|
17
|
+
char *p1, *p2;
|
18
|
+
ssize_t s1, s2;
|
19
|
+
args_t *g;
|
20
|
+
int lda;
|
21
|
+
|
22
|
+
INIT_PTR(lp,0,p1,s1);
|
23
|
+
INIT_PTR(lp,1,p2,s2);
|
24
|
+
a = (dtype*)NDL_PTR(lp,2);
|
25
|
+
g = (args_t*)(lp->opt_ptr);
|
26
|
+
|
27
|
+
lda = NDL_STEP(lp,2) / sizeof(dtype);
|
28
|
+
|
29
|
+
(*func_p)(g->order, g->m, g->n,
|
30
|
+
DP(g->alpha), (dtype*)p1, s1/sizeof(dtype),
|
31
|
+
(dtype*)p2, s2/sizeof(dtype), a, lda);
|
32
|
+
}
|
33
|
+
|
34
|
+
/*<%
|
35
|
+
params = [
|
36
|
+
vec("x"),
|
37
|
+
vec("y"),
|
38
|
+
mat("a","m-by-n symmetric matrix","optional",:inplace),
|
39
|
+
opt("alpha"),
|
40
|
+
opt("order"),
|
41
|
+
].select{|x| x}.join("\n ")
|
42
|
+
%>
|
43
|
+
@overload <%=name%>( x, y, [a, alpha:1, order:'R'] )
|
44
|
+
<%=params%>
|
45
|
+
@return [<%=class_name%>] returns a.
|
46
|
+
|
47
|
+
<%=description%>
|
48
|
+
|
49
|
+
*/
|
50
|
+
static VALUE
|
51
|
+
<%=c_func(-1)%>(int argc, VALUE const argv[], VALUE UNUSED(mod))
|
52
|
+
{
|
53
|
+
VALUE ans;
|
54
|
+
VALUE x, y, a=Qnil, alpha;
|
55
|
+
narray_t *na1, *na2;
|
56
|
+
blasint mx, ny, tmp;
|
57
|
+
size_t shape[2];
|
58
|
+
ndfunc_arg_in_t ain[4] = {{cT,1},{cT,1},{OVERWRITE,2},{sym_init,0}};
|
59
|
+
ndfunc_arg_out_t aout[1] = {{cT,2,shape}};
|
60
|
+
ndfunc_t ndf = {<%=c_iter%>, NO_LOOP, 3, 0, ain, aout};
|
61
|
+
|
62
|
+
args_t g;
|
63
|
+
VALUE kw_hash = Qnil;
|
64
|
+
ID kw_table[2] = {id_alpha,id_order};
|
65
|
+
VALUE opts[2] = {Qundef};
|
66
|
+
|
67
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
68
|
+
|
69
|
+
rb_scan_args(argc, argv, "21:", &x, &y, &a, &kw_hash);
|
70
|
+
rb_get_kwargs(kw_hash, kw_table, 0, 2, opts);
|
71
|
+
alpha = option_value(opts[0],Qnil);
|
72
|
+
g.alpha = RTEST(alpha) ? m_num_to_data(alpha) : m_one;
|
73
|
+
g.order = option_order(opts[1]);
|
74
|
+
|
75
|
+
GetNArray(x,na1);
|
76
|
+
GetNArray(y,na2);
|
77
|
+
CHECK_DIM_GE(na1,1);
|
78
|
+
CHECK_DIM_GE(na2,1);
|
79
|
+
mx = COL_SIZE(na1); // m
|
80
|
+
ny = COL_SIZE(na2); // n
|
81
|
+
g.m = mx;
|
82
|
+
g.n = ny;
|
83
|
+
|
84
|
+
SWAP_IFCOL(g.order, mx,ny, tmp);
|
85
|
+
|
86
|
+
if (a == Qnil) { // c is not given.
|
87
|
+
ndf.nout = 1;
|
88
|
+
ain[2] = ain[3];
|
89
|
+
a = INT2FIX(0);
|
90
|
+
shape[0] = mx;
|
91
|
+
shape[1] = ny;
|
92
|
+
} else {
|
93
|
+
narray_t *na3;
|
94
|
+
blasint ma, na;
|
95
|
+
COPY_OR_CAST_TO(a,cT);
|
96
|
+
GetNArray(a,na3);
|
97
|
+
CHECK_DIM_GE(na3,2);
|
98
|
+
ma = ROW_SIZE(na3); // m
|
99
|
+
na = COL_SIZE(na3); // n (lda)
|
100
|
+
CHECK_SIZE_EQ(ma,mx);
|
101
|
+
CHECK_SIZE_EQ(na,ny);
|
102
|
+
}
|
103
|
+
|
104
|
+
ans = na_ndloop3(&ndf, &g, 3, x, y, a);
|
105
|
+
|
106
|
+
if (ndf.nout = 1) { // a is not given.
|
107
|
+
return ans;
|
108
|
+
} else {
|
109
|
+
return a;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
#undef func_p
|
114
|
+
#undef args_t
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/*
|
2
|
+
Document-class: <%= full_class_name %>
|
3
|
+
<%= description %>
|
4
|
+
*/
|
5
|
+
cT = rb_define_class_under(<%=ns_var%>, "<%=class_name%>", cNArray);
|
6
|
+
|
7
|
+
<% for x in class_alias %>
|
8
|
+
// alias of <%=class_name%>
|
9
|
+
rb_define_const(<%=ns_var%>, "<%=x%>", <%=type_var%>);
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
hCast = rb_hash_new();
|
13
|
+
rb_define_const(cT, "UPCAST", hCast);
|
14
|
+
rb_hash_aset(hCast, rb_cArray, cT);
|
15
|
+
<% for x in upcast %>
|
16
|
+
<%= x %><% end %>
|
17
|
+
|
18
|
+
<% @children.each do |m| %>
|
19
|
+
<%= m.init_def %><% end %>
|
20
|
+
rb_define_singleton_method(cT, "[]", <%=find("cast").c_func%>, -2);
|
@@ -0,0 +1,12 @@
|
|
1
|
+
/*
|
2
|
+
Document-module: <%= full_module_name %>
|
3
|
+
<%= description %>
|
4
|
+
*/
|
5
|
+
<% if module_var != ns_var %>
|
6
|
+
<%=module_var%> = rb_define_module_under(<%=ns_var%>, "<%=module_name%>");
|
7
|
+
<% end %>
|
8
|
+
<% @children.each do |m| %>
|
9
|
+
<%= m.init_def %><% end %>
|
10
|
+
|
11
|
+
// how to do this?
|
12
|
+
//rb_extend_object(cT, mTM);
|
@@ -0,0 +1,40 @@
|
|
1
|
+
/*
|
2
|
+
BLAS wrapper for Ruby/Numo
|
3
|
+
(C) Copyright 2017 by Masahiro TANAKA
|
4
|
+
|
5
|
+
This program is free software.
|
6
|
+
NO WARRANTY.
|
7
|
+
*/
|
8
|
+
|
9
|
+
#include <assert.h>
|
10
|
+
#include <ruby.h>
|
11
|
+
#include "numo/narray.h"
|
12
|
+
#include "numo/template.h"
|
13
|
+
#include "numo_blas.h"
|
14
|
+
|
15
|
+
<% id_decl.each do |x| %>
|
16
|
+
<%= x %>
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<% include_files.each do |f| %>
|
20
|
+
#include <<%=f%>>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<% children.each do |c|%>
|
24
|
+
<%= c.result+"\n\n" %>
|
25
|
+
<% end %>
|
26
|
+
|
27
|
+
void
|
28
|
+
Init_<%=lib_name%>(void)
|
29
|
+
{
|
30
|
+
VALUE <%=ns_var%>;
|
31
|
+
|
32
|
+
<%=ns_var%> = rb_define_module("Numo");
|
33
|
+
|
34
|
+
<% id_assign.each do |x| %>
|
35
|
+
<%= x %><% end %>
|
36
|
+
|
37
|
+
<% children.each do |c| %>
|
38
|
+
<%= c.init_def %>
|
39
|
+
<% end %>
|
40
|
+
}
|