numo-linalg 0.0.1
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.
- 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,65 @@
|
|
1
|
+
#define func_p <%=func_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
|
+
rtype *g;
|
12
|
+
|
13
|
+
INIT_COUNTER(lp,n);
|
14
|
+
INIT_PTR(lp,0,p1,s1);
|
15
|
+
INIT_PTR(lp,1,p2,s2);
|
16
|
+
g = (rtype*)(lp->opt_ptr);
|
17
|
+
|
18
|
+
(*func_p)(n, (dtype*)p1, s1/sizeof(dtype),
|
19
|
+
(dtype*)p2, s2/sizeof(dtype), g[0], g[1]);
|
20
|
+
}
|
21
|
+
|
22
|
+
/*<%
|
23
|
+
params = [
|
24
|
+
vec("x",:inplace),
|
25
|
+
vec("y",:inplace),
|
26
|
+
].select{|x| x}.join("\n ")
|
27
|
+
%>
|
28
|
+
@overload <%=name%>( x, y, c, s )
|
29
|
+
<%=params%>
|
30
|
+
@param [Float] c
|
31
|
+
@param [Float] s
|
32
|
+
@return [Array<<%=class_name%>,<%=class_name%>>] returns [x,y]
|
33
|
+
|
34
|
+
<%=description%>
|
35
|
+
|
36
|
+
*/
|
37
|
+
static VALUE
|
38
|
+
<%=c_func(4)%>(VALUE UNUSED(mod), VALUE x, VALUE y, VALUE c, VALUE s)
|
39
|
+
{
|
40
|
+
rtype g[2] = {0,0};
|
41
|
+
narray_t *na1, *na2;
|
42
|
+
ndfunc_arg_in_t ain[2] = {{OVERWRITE,0},{OVERWRITE,0}};
|
43
|
+
ndfunc_t ndf = {<%=c_iter%>, STRIDE_LOOP, 2,0, ain,0};
|
44
|
+
|
45
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
46
|
+
|
47
|
+
if (RTEST(c)) {g[0] = NUM2DBL(c);}
|
48
|
+
if (RTEST(s)) {g[1] = NUM2DBL(s);}
|
49
|
+
|
50
|
+
COPY_OR_CAST_TO(x,cT);
|
51
|
+
COPY_OR_CAST_TO(y,cT);
|
52
|
+
GetNArray(x,na1);
|
53
|
+
GetNArray(y,na2);
|
54
|
+
CHECK_DIM_GE(na1,1);
|
55
|
+
CHECK_DIM_GE(na2,1);
|
56
|
+
CHECK_NON_EMPTY(na1);
|
57
|
+
CHECK_NON_EMPTY(na2);
|
58
|
+
CHECK_SAME_SHAPE(na1,na2);
|
59
|
+
|
60
|
+
na_ndloop3(&ndf, g, 2, x, y);
|
61
|
+
|
62
|
+
return rb_assoc_new(x,y);
|
63
|
+
}
|
64
|
+
|
65
|
+
#undef func_p
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#define func_p <%=func_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
|
+
dtype *g;
|
12
|
+
|
13
|
+
INIT_COUNTER(lp,n);
|
14
|
+
INIT_PTR(lp,0,p1,s1);
|
15
|
+
INIT_PTR(lp,1,p2,s2);
|
16
|
+
g = (dtype*)(lp->opt_ptr);
|
17
|
+
|
18
|
+
(*func_p)(n, (dtype*)p1, s1/sizeof(dtype),
|
19
|
+
(dtype*)p2, s2/sizeof(dtype), g);
|
20
|
+
}
|
21
|
+
|
22
|
+
/*<%
|
23
|
+
params = [
|
24
|
+
vec("x",:inplace),
|
25
|
+
vec("y",:inplace),
|
26
|
+
].select{|x| x}.join("\n ")
|
27
|
+
%>
|
28
|
+
@overload <%=name%>( x, y, param )
|
29
|
+
<%=params%>
|
30
|
+
@param param [<%=class_name%>] array of [FLAG,H11,H21,H12,H22]
|
31
|
+
@return [Array<<%=class_name%>,<%=class_name%>>] returns [x,y]
|
32
|
+
|
33
|
+
Apply the modified givens transformation, H,
|
34
|
+
to the 2 by N matrix (X\*\*T), where \*\*T indicates transpose.
|
35
|
+
The elements of X are in (Y\*\*T)
|
36
|
+
|
37
|
+
X(LX+I\*INCX), I = 0 to N-1, where LX = 1 if INCX .GE. 0, else
|
38
|
+
LX = (-INCX)\*N, and similarly for Y using LY and INCY.
|
39
|
+
With PARAM(1)=FLAG, H has one of the following forms..
|
40
|
+
|
41
|
+
FLAG=-1.0 FLAG=0.0 FLAG=1.0 FLAG=-2.0
|
42
|
+
|
43
|
+
(H11 H12) (1.0 H12) (H11 1.0) (1.0 0.0)
|
44
|
+
H=( ) ( ) ( ) ( )
|
45
|
+
(H21 H22), (H21 1.0), (-1.0 H22), (0.0 1.0).
|
46
|
+
|
47
|
+
see <%=name.upcase%>G for a description of data storage in param.
|
48
|
+
|
49
|
+
*/
|
50
|
+
static VALUE
|
51
|
+
<%=c_func(3)%>(VALUE UNUSED(mod), VALUE x, VALUE y, VALUE param)
|
52
|
+
{
|
53
|
+
dtype *g;
|
54
|
+
narray_t *na1, *na2, *nap;
|
55
|
+
ndfunc_arg_in_t ain[2] = {{OVERWRITE,0},{OVERWRITE,0}};
|
56
|
+
ndfunc_t ndf = {<%=c_iter%>, STRIDE_LOOP, 2,0, ain,0};
|
57
|
+
|
58
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
59
|
+
|
60
|
+
COPY_OR_CAST_TO(x,cT);
|
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
|
+
param = rb_funcall(cT,rb_intern("cast"),1,param);
|
71
|
+
GetNArray(param,nap);
|
72
|
+
CHECK_DIM_EQ(nap,1);
|
73
|
+
CHECK_SIZE_GE(nap,5);
|
74
|
+
g = (dtype*)nary_get_pointer_for_read(param);
|
75
|
+
|
76
|
+
na_ndloop3(&ndf, g, 2, x, y);
|
77
|
+
|
78
|
+
RB_GC_GUARD(param);
|
79
|
+
return rb_assoc_new(x,y);
|
80
|
+
}
|
81
|
+
|
82
|
+
#undef func_p
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#define func_p <%=func_name%>_p
|
2
|
+
|
3
|
+
static <%=func_name%>_t func_p = 0;
|
4
|
+
|
5
|
+
<% if /^(cs|zd)scal/ =~ name %>
|
6
|
+
#define scal_t rtype
|
7
|
+
<% else %>
|
8
|
+
#define scal_t dtype
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
static void
|
12
|
+
<%=c_iter%>(na_loop_t *const lp)
|
13
|
+
{
|
14
|
+
char *p1;
|
15
|
+
size_t n;
|
16
|
+
ssize_t s1;
|
17
|
+
scal_t *g;
|
18
|
+
|
19
|
+
INIT_COUNTER(lp,n);
|
20
|
+
INIT_PTR(lp,0,p1,s1);
|
21
|
+
g = (scal_t*)(lp->opt_ptr);
|
22
|
+
|
23
|
+
<% if /^[cz]scal/ =~ name %>
|
24
|
+
(*func_p)(n, g, (dtype*)p1, s1/sizeof(dtype));
|
25
|
+
<% else %>
|
26
|
+
(*func_p)(n, *g, (dtype*)p1, s1/sizeof(dtype));
|
27
|
+
<% end %>
|
28
|
+
}
|
29
|
+
|
30
|
+
/*<%
|
31
|
+
params = [
|
32
|
+
vec("x"),
|
33
|
+
].select{|x| x}.join("\n ")
|
34
|
+
%>
|
35
|
+
@overload <%=name%>( a, x )
|
36
|
+
@param [Float] a scale factor
|
37
|
+
<%=params%>
|
38
|
+
@return [<%=class_name%>] returns a*x.
|
39
|
+
|
40
|
+
<%=description%>
|
41
|
+
|
42
|
+
*/
|
43
|
+
static VALUE
|
44
|
+
<%=c_func(2)%>(VALUE mod, VALUE a, VALUE x)
|
45
|
+
{
|
46
|
+
scal_t g[1];
|
47
|
+
narray_t *na1;
|
48
|
+
ndfunc_arg_in_t ain[1] = {{OVERWRITE,0}};
|
49
|
+
ndfunc_t ndf = {<%=c_iter%>, STRIDE_LOOP, 1,0, ain,0};
|
50
|
+
|
51
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
52
|
+
|
53
|
+
<% if /^(cs|zd)scal/ =~ name %>
|
54
|
+
if (RTEST(a)) {g[0] = NUM2DBL(a);} else {g[0]=1;}
|
55
|
+
<% else %>
|
56
|
+
if (RTEST(a)) {g[0] = m_num_to_data(a);} else {g[0]=m_one;}
|
57
|
+
<% end %>
|
58
|
+
COPY_OR_CAST_TO(x,cT);
|
59
|
+
GetNArray(x,na1);
|
60
|
+
CHECK_DIM_GE(na1,1);
|
61
|
+
CHECK_NON_EMPTY(na1);
|
62
|
+
|
63
|
+
na_ndloop3(&ndf, g, 1, x);
|
64
|
+
|
65
|
+
return x;
|
66
|
+
}
|
67
|
+
|
68
|
+
#undef func_p
|
69
|
+
#undef scal_t
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#define func_p <%=func_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, *p3;
|
9
|
+
size_t n;
|
10
|
+
ssize_t s1, s2;
|
11
|
+
dtype *g;
|
12
|
+
|
13
|
+
INIT_PTR(lp,0,p1,s1);
|
14
|
+
INIT_PTR(lp,1,p2,s2);
|
15
|
+
p3 = NDL_PTR(lp,2);
|
16
|
+
n = NDL_SHAPE(lp,0)[0];
|
17
|
+
g = (dtype*)(lp->opt_ptr);
|
18
|
+
|
19
|
+
*(dtype*)p3 = (*func_p)(n, *g, (dtype*)p1, s1/sizeof(dtype),
|
20
|
+
(dtype*)p2, s2/sizeof(dtype));
|
21
|
+
}
|
22
|
+
|
23
|
+
/*<%
|
24
|
+
params = [
|
25
|
+
vec("sx"),
|
26
|
+
vec("sy",:inplace),
|
27
|
+
].select{|x| x}.join("\n ")
|
28
|
+
%>
|
29
|
+
@overload <%=name%>( sx, sy, [sb:0] )
|
30
|
+
<%=params%>
|
31
|
+
@param [Float] sb
|
32
|
+
@return [<%=class_name%>] returns inner product.
|
33
|
+
|
34
|
+
Compute the inner product of two vectors with extended
|
35
|
+
precision accumulation.
|
36
|
+
|
37
|
+
Returns S.P. result with dot product accumulated in D.P.
|
38
|
+
SDSDOT = SB + sum for I = 0 to N-1 of SX(LX+I*INCX)*SY(LY+I*INCY),
|
39
|
+
where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is
|
40
|
+
defined in a similar way using INCY.
|
41
|
+
|
42
|
+
*/
|
43
|
+
static VALUE
|
44
|
+
<%=c_func(-1)%>(int argc, VALUE const argv[], VALUE UNUSED(mod))
|
45
|
+
{
|
46
|
+
VALUE x, y, sb;
|
47
|
+
dtype g[1];
|
48
|
+
narray_t *na1, *na2;
|
49
|
+
size_t nx, ny;
|
50
|
+
ndfunc_arg_in_t ain[2] = {{cT,1},{cT,1}};
|
51
|
+
ndfunc_arg_out_t aout[1] = {{cT,0}};
|
52
|
+
ndfunc_t ndf = {<%=c_iter%>, NDF_EXTRACT, 2,1, ain,aout};
|
53
|
+
|
54
|
+
VALUE kw_hash = Qnil;
|
55
|
+
ID kw_table[1] = {id_sb};
|
56
|
+
VALUE opts[1] = {Qundef};
|
57
|
+
|
58
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
59
|
+
|
60
|
+
rb_scan_args(argc, argv, "2:", &x, &y, &kw_hash);
|
61
|
+
rb_get_kwargs(kw_hash, kw_table, 0, 1, opts);
|
62
|
+
sb = option_value(opts[0],Qnil);
|
63
|
+
g[0] = RTEST(sb) ? m_num_to_data(sb) : m_zero;
|
64
|
+
|
65
|
+
GetNArray(x,na1);
|
66
|
+
GetNArray(y,na2);
|
67
|
+
CHECK_DIM_GE(na1,1);
|
68
|
+
CHECK_DIM_GE(na2,1);
|
69
|
+
CHECK_NON_EMPTY(na1);
|
70
|
+
CHECK_NON_EMPTY(na2);
|
71
|
+
nx = na1->shape[na1->ndim-1];
|
72
|
+
ny = na2->shape[na2->ndim-1];
|
73
|
+
CHECK_SIZE_EQ(nx,ny);
|
74
|
+
|
75
|
+
return na_ndloop3(&ndf, g, 2, x, y);
|
76
|
+
}
|
77
|
+
#undef func_p
|
@@ -0,0 +1,16 @@
|
|
1
|
+
static VALUE
|
2
|
+
<%=c_func(1)%>(VALUE mod, VALUE prefix)
|
3
|
+
{
|
4
|
+
long len;
|
5
|
+
|
6
|
+
if (TYPE(prefix) != T_STRING) {
|
7
|
+
rb_raise(rb_eTypeError,"argument must be string");
|
8
|
+
}
|
9
|
+
if (blas_prefix) {
|
10
|
+
free(blas_prefix);
|
11
|
+
}
|
12
|
+
len = RSTRING_LEN(prefix);
|
13
|
+
blas_prefix = malloc(len+1);
|
14
|
+
strcpy(blas_prefix, StringValueCStr(prefix));
|
15
|
+
return prefix;
|
16
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#define func_p <%=func_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] = {{OVERWRITE,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,102 @@
|
|
1
|
+
#define args_t <%=name%>_args_t
|
2
|
+
|
3
|
+
typedef struct {
|
4
|
+
enum CBLAS_ORDER order;
|
5
|
+
enum CBLAS_UPLO uplo;
|
6
|
+
rtype alpha;
|
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;
|
18
|
+
ssize_t s1;
|
19
|
+
args_t *g;
|
20
|
+
blasint n, lda;
|
21
|
+
|
22
|
+
INIT_PTR(lp,0,p1,s1);
|
23
|
+
a = (dtype*)NDL_PTR(lp,1);
|
24
|
+
g = (args_t*)(lp->opt_ptr);
|
25
|
+
|
26
|
+
n = NDL_SHAPE(lp,0)[0];
|
27
|
+
lda = NDL_STEP(lp,1) / sizeof(dtype);
|
28
|
+
|
29
|
+
(*func_p)(g->order, g->uplo, n, g->alpha,
|
30
|
+
(dtype*)p1, s1/sizeof(dtype), a, lda);
|
31
|
+
}
|
32
|
+
|
33
|
+
/*<%
|
34
|
+
params = [
|
35
|
+
vec("x"),
|
36
|
+
mat("a",:inplace),
|
37
|
+
opt("alpha"),
|
38
|
+
opt("uplo"),
|
39
|
+
opt("order")
|
40
|
+
].select{|x| x}.join("\n ")
|
41
|
+
%>
|
42
|
+
@overload <%=name%>( x, [a, alpha:1, uplo:'U', order:'R'] )
|
43
|
+
<%=params%>
|
44
|
+
@return [<%=class_name%>] return a
|
45
|
+
<%=description%>
|
46
|
+
|
47
|
+
*/
|
48
|
+
static VALUE
|
49
|
+
<%=c_func(-1)%>(int argc, VALUE const argv[], VALUE UNUSED(mod))
|
50
|
+
{
|
51
|
+
VALUE ans;
|
52
|
+
VALUE x, a, alpha;
|
53
|
+
narray_t *na1, *na3;
|
54
|
+
blasint nx, na;
|
55
|
+
size_t shape[2];
|
56
|
+
ndfunc_arg_in_t ain[3] = {{cT,1},{OVERWRITE,2},{sym_init,0}};
|
57
|
+
ndfunc_arg_out_t aout[1] = {{cT,2,shape}};
|
58
|
+
ndfunc_t ndf = {<%=c_iter%>, NO_LOOP, 2, 0, ain, aout};
|
59
|
+
|
60
|
+
args_t g;
|
61
|
+
VALUE kw_hash = Qnil;
|
62
|
+
ID kw_table[3] = {id_alpha,id_order,id_uplo};
|
63
|
+
VALUE opts[3] = {Qundef,Qundef,Qundef};
|
64
|
+
|
65
|
+
CHECK_FUNC(func_p,"<%=func_name%>");
|
66
|
+
|
67
|
+
rb_scan_args(argc, argv, "11:", &x, &a, &kw_hash);
|
68
|
+
rb_get_kwargs(kw_hash, kw_table, 0, 3, opts);
|
69
|
+
alpha = option_value(opts[0],Qnil);
|
70
|
+
g.alpha = RTEST(alpha) ? NUM2DBL(alpha) : 1;
|
71
|
+
g.order = option_order(opts[1]);
|
72
|
+
g.uplo = option_uplo(opts[2]);
|
73
|
+
|
74
|
+
GetNArray(x,na1);
|
75
|
+
CHECK_DIM_GE(na1,1);
|
76
|
+
nx = COL_SIZE(na1); // n
|
77
|
+
|
78
|
+
if (a == Qnil) { // c is not given.
|
79
|
+
ndf.nout = 1;
|
80
|
+
ain[1] = ain[2];
|
81
|
+
a = INT2FIX(0);
|
82
|
+
shape[0] = shape[1] = nx;
|
83
|
+
} else {
|
84
|
+
COPY_OR_CAST_TO(a,cT);
|
85
|
+
GetNArray(a,na3);
|
86
|
+
CHECK_DIM_GE(na3,2);
|
87
|
+
CHECK_SQUARE("a",na3);
|
88
|
+
na = COL_SIZE(na3); // n (lda)
|
89
|
+
CHECK_SIZE_EQ(na,nx);
|
90
|
+
}
|
91
|
+
|
92
|
+
ans = na_ndloop3(&ndf, &g, 2, x, a);
|
93
|
+
|
94
|
+
if (ndf.nout == 1) { // a is not given.
|
95
|
+
return ans;
|
96
|
+
} else {
|
97
|
+
return a;
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
#undef func_p
|
102
|
+
#undef args_t
|