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.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/README.md +80 -0
  4. data/Rakefile +18 -0
  5. data/ext/numo/linalg/blas/blas.c +352 -0
  6. data/ext/numo/linalg/blas/cblas.h +575 -0
  7. data/ext/numo/linalg/blas/cblas_t.h +563 -0
  8. data/ext/numo/linalg/blas/depend.erb +23 -0
  9. data/ext/numo/linalg/blas/extconf.rb +67 -0
  10. data/ext/numo/linalg/blas/gen/cogen.rb +72 -0
  11. data/ext/numo/linalg/blas/gen/decl.rb +203 -0
  12. data/ext/numo/linalg/blas/gen/desc.rb +8138 -0
  13. data/ext/numo/linalg/blas/gen/erbpp2.rb +339 -0
  14. data/ext/numo/linalg/blas/gen/replace_cblas_h.rb +27 -0
  15. data/ext/numo/linalg/blas/gen/spec.rb +93 -0
  16. data/ext/numo/linalg/blas/numo_blas.h +41 -0
  17. data/ext/numo/linalg/blas/tmpl/axpy.c +75 -0
  18. data/ext/numo/linalg/blas/tmpl/copy.c +57 -0
  19. data/ext/numo/linalg/blas/tmpl/def_c.c +3 -0
  20. data/ext/numo/linalg/blas/tmpl/def_d.c +3 -0
  21. data/ext/numo/linalg/blas/tmpl/def_s.c +3 -0
  22. data/ext/numo/linalg/blas/tmpl/def_z.c +3 -0
  23. data/ext/numo/linalg/blas/tmpl/dot.c +68 -0
  24. data/ext/numo/linalg/blas/tmpl/ger.c +114 -0
  25. data/ext/numo/linalg/blas/tmpl/init_class.c +20 -0
  26. data/ext/numo/linalg/blas/tmpl/init_module.c +12 -0
  27. data/ext/numo/linalg/blas/tmpl/lib.c +40 -0
  28. data/ext/numo/linalg/blas/tmpl/mm.c +214 -0
  29. data/ext/numo/linalg/blas/tmpl/module.c +9 -0
  30. data/ext/numo/linalg/blas/tmpl/mv.c +194 -0
  31. data/ext/numo/linalg/blas/tmpl/nrm2.c +79 -0
  32. data/ext/numo/linalg/blas/tmpl/rot.c +65 -0
  33. data/ext/numo/linalg/blas/tmpl/rotm.c +82 -0
  34. data/ext/numo/linalg/blas/tmpl/scal.c +69 -0
  35. data/ext/numo/linalg/blas/tmpl/sdsdot.c +77 -0
  36. data/ext/numo/linalg/blas/tmpl/set_prefix.c +16 -0
  37. data/ext/numo/linalg/blas/tmpl/swap.c +57 -0
  38. data/ext/numo/linalg/blas/tmpl/syr.c +102 -0
  39. data/ext/numo/linalg/blas/tmpl/syr2.c +110 -0
  40. data/ext/numo/linalg/blas/tmpl/syr2k.c +129 -0
  41. data/ext/numo/linalg/blas/tmpl/syrk.c +132 -0
  42. data/ext/numo/linalg/lapack/depend.erb +23 -0
  43. data/ext/numo/linalg/lapack/extconf.rb +45 -0
  44. data/ext/numo/linalg/lapack/gen/cogen.rb +74 -0
  45. data/ext/numo/linalg/lapack/gen/desc.rb +151278 -0
  46. data/ext/numo/linalg/lapack/gen/replace_lapacke_h.rb +32 -0
  47. data/ext/numo/linalg/lapack/gen/spec.rb +104 -0
  48. data/ext/numo/linalg/lapack/lapack.c +387 -0
  49. data/ext/numo/linalg/lapack/lapacke.h +16425 -0
  50. data/ext/numo/linalg/lapack/lapacke_config.h +119 -0
  51. data/ext/numo/linalg/lapack/lapacke_mangling.h +17 -0
  52. data/ext/numo/linalg/lapack/lapacke_t.h +10550 -0
  53. data/ext/numo/linalg/lapack/numo_lapack.h +42 -0
  54. data/ext/numo/linalg/lapack/tmpl/def_c.c +3 -0
  55. data/ext/numo/linalg/lapack/tmpl/def_d.c +7 -0
  56. data/ext/numo/linalg/lapack/tmpl/def_s.c +7 -0
  57. data/ext/numo/linalg/lapack/tmpl/def_z.c +3 -0
  58. data/ext/numo/linalg/lapack/tmpl/fact.c +179 -0
  59. data/ext/numo/linalg/lapack/tmpl/geev.c +123 -0
  60. data/ext/numo/linalg/lapack/tmpl/gels.c +232 -0
  61. data/ext/numo/linalg/lapack/tmpl/gesv.c +149 -0
  62. data/ext/numo/linalg/lapack/tmpl/gesvd.c +189 -0
  63. data/ext/numo/linalg/lapack/tmpl/ggev.c +138 -0
  64. data/ext/numo/linalg/lapack/tmpl/gqr.c +121 -0
  65. data/ext/numo/linalg/lapack/tmpl/init_class.c +20 -0
  66. data/ext/numo/linalg/lapack/tmpl/init_module.c +12 -0
  67. data/ext/numo/linalg/lapack/tmpl/lange.c +79 -0
  68. data/ext/numo/linalg/lapack/tmpl/lib.c +40 -0
  69. data/ext/numo/linalg/lapack/tmpl/module.c +9 -0
  70. data/ext/numo/linalg/lapack/tmpl/syev.c +91 -0
  71. data/ext/numo/linalg/lapack/tmpl/sygv.c +104 -0
  72. data/ext/numo/linalg/lapack/tmpl/trf.c +276 -0
  73. data/ext/numo/linalg/numo_linalg.h +115 -0
  74. data/lib/numo/linalg.rb +3 -0
  75. data/lib/numo/linalg/function.rb +1008 -0
  76. data/lib/numo/linalg/linalg.rb +7 -0
  77. data/lib/numo/linalg/loader.rb +174 -0
  78. data/lib/numo/linalg/use/atlas.rb +3 -0
  79. data/lib/numo/linalg/use/lapack.rb +3 -0
  80. data/lib/numo/linalg/use/mkl.rb +3 -0
  81. data/lib/numo/linalg/use/openblas.rb +3 -0
  82. data/lib/numo/linalg/version.rb +5 -0
  83. data/numo-linalg.gemspec +26 -0
  84. data/spec/lapack_spec.rb +13 -0
  85. metadata +172 -0
@@ -0,0 +1,214 @@
1
+ /*<%
2
+ is_ge = (/^.ge/ =~ name)
3
+ is_tr = (/^.tr/ =~ name)
4
+ is_tr = (/^.tr/ =~ name)
5
+ %>*/
6
+ <% %>
7
+ #define GE <%= is_ge ? "1":"0" %>
8
+ #define TR <%= is_tr ? "1":"0" %>
9
+ #define args_t <%=name%>_args_t
10
+
11
+ typedef struct {
12
+ enum CBLAS_ORDER order;
13
+ enum CBLAS_TRANSPOSE transa, transb;
14
+ enum CBLAS_SIDE side;
15
+ enum CBLAS_UPLO uplo;
16
+ enum CBLAS_DIAG diag;
17
+ dtype alpha, beta;
18
+ blasint m, n, k;
19
+ } args_t;
20
+
21
+ #define func_p <%=func_name%>_p
22
+
23
+ static <%=func_name%>_t func_p = 0;
24
+
25
+ static void
26
+ <%=c_iter%>(na_loop_t *const lp)
27
+ {
28
+ dtype *a, *b;
29
+ int lda, ldb;
30
+ #if !TR
31
+ dtype *c;
32
+ int ldc;
33
+ #endif
34
+ args_t *g;
35
+
36
+ a = (dtype*)NDL_PTR(lp,0);
37
+ b = (dtype*)NDL_PTR(lp,1);
38
+ #if !TR
39
+ c = (dtype*)NDL_PTR(lp,2);
40
+ #endif
41
+ g = (args_t*)(lp->opt_ptr);
42
+
43
+ lda = NDL_STEP(lp,0) / sizeof(dtype);
44
+ ldb = NDL_STEP(lp,1) / sizeof(dtype);
45
+ #if !TR
46
+ ldc = NDL_STEP(lp,2) / sizeof(dtype);
47
+ #endif
48
+
49
+ //printf("m=%d n=%d k=%d\n",g->m,g->n,g->k);
50
+
51
+ #if GE
52
+ (*func_p)( g->order, g->transa, g->transb, g->m, g->n, g->k,
53
+ DP(g->alpha), a, lda, b, ldb, DP(g->beta), c, ldc);
54
+ #elif TR
55
+ (*func_p)( g->order, g->side, g->uplo, g->transa, g->diag, g->m, g->n,
56
+ DP(g->alpha), a, lda, b, ldb);
57
+ #else // SY,HE
58
+ (*func_p)( g->order, g->side, g->uplo, g->m, g->n,
59
+ DP(g->alpha), a, lda, b, ldb, DP(g->beta), c, ldc);
60
+ #endif
61
+ }
62
+
63
+ /*
64
+ <%
65
+ args_v =
66
+ if is_ge
67
+ "a, b, [c, alpha:1, beta:0, transa:'N', transb:'N'"
68
+ elsif is_tr
69
+ "a, b, [alpha:1, side:'L', uplo:'U', transa:'N', diag:'U'"
70
+ else
71
+ "a, b, [c, alpha:1, beta:0, side:'L', uplo:'U'"
72
+ end + ", order:'R'"
73
+
74
+ params = [
75
+ mat("a"),
76
+ mat("b"),
77
+ !is_tr && mat("c","optional",:inplace),
78
+ opt("alpha"),
79
+ opt("beta"),
80
+ !is_ge && opt("side"),
81
+ !is_ge && opt("uplo"),
82
+ (is_ge || is_tr) && opt("transa"),
83
+ is_ge && opt("transb"),
84
+ opt("order")
85
+ ].select{|x| x}.join("\n ")
86
+ %>
87
+ @overload <%=name%>(<%=args_v%>)
88
+ <%=params%>
89
+ @return [<%=class_name%>] returns c = alpha\*op( A )\*op( B ) + beta\*C.
90
+ <%=description%>
91
+
92
+ */
93
+ static VALUE
94
+ <%=c_func(-1)%>(int argc, VALUE const argv[], VALUE UNUSED(mod))
95
+ {
96
+ VALUE a, b, c=Qnil, alpha, beta;
97
+ narray_t *na1, *na2;
98
+ blasint ma, ka, kb, nb, tmp;
99
+ size_t shape[2];
100
+ ndfunc_arg_in_t ain[3] = {{cT,2},{cT,2},{OVERWRITE,2}};
101
+ ndfunc_arg_out_t aout[1] = {{cT,2,shape}};
102
+ ndfunc_t ndf = {<%=c_iter%>, NO_LOOP, 3, 0, ain, aout};
103
+
104
+ args_t g;
105
+ VALUE kw_hash = Qnil;
106
+ #if GE
107
+ ID kw_table[5] = {id_alpha,id_beta,id_order,id_transa,id_transb};
108
+ #elif TR
109
+ ID kw_table[7] = {id_alpha,id_beta,id_order,id_side,id_uplo,id_transa,id_diag};
110
+ #else
111
+ ID kw_table[5] = {id_alpha,id_beta,id_order,id_side,id_uplo};
112
+ #endif
113
+ VALUE opts[7] = {Qundef,Qundef,Qundef,Qundef,Qundef,Qundef,Qundef};
114
+
115
+ CHECK_FUNC(func_p,"<%=func_name%>");
116
+
117
+ rb_scan_args(argc, argv, "21:", &a, &b, &c, &kw_hash);
118
+ rb_get_kwargs(kw_hash, kw_table, 0, 5+TR*2, opts);
119
+ alpha = option_value(opts[0],Qnil);
120
+ g.alpha = RTEST(alpha) ? m_num_to_data(alpha) : m_one;
121
+ beta = option_value(opts[1],Qnil);
122
+ g.beta = RTEST(beta) ? m_num_to_data(beta) : m_zero;
123
+ g.order = option_order(opts[2]);
124
+ #if GE
125
+ g.transa = option_trans(opts[3]);
126
+ g.transb = option_trans(opts[4]);
127
+ #else
128
+ g.side = option_side(opts[3]);
129
+ g.uplo = option_uplo(opts[4]);
130
+ #endif
131
+ #if TR
132
+ g.transa = option_trans(opts[5]);
133
+ g.diag = option_diag(opts[6]);
134
+ #endif
135
+
136
+ GetNArray(a,na1);
137
+ GetNArray(b,na2);
138
+ CHECK_DIM_GE(na1,2);
139
+ CHECK_DIM_GE(na2,2);
140
+ ma = ROW_SIZE(na1); // m
141
+ ka = COL_SIZE(na1); // k (lda)
142
+ kb = ROW_SIZE(na2); // k
143
+ nb = COL_SIZE(na2); // n (ldb)
144
+
145
+ #if GE
146
+ SWAP_IFCOLTR(g.order,g.transa, ma,ka, tmp);
147
+ SWAP_IFCOLTR(g.order,g.transb, kb,nb, tmp);
148
+ CHECK_INT_EQ("ka",ka,"kb",kb);
149
+ g.m = ma;
150
+ g.n = nb;
151
+ g.k = ka;
152
+ #else
153
+ CHECK_SQUARE("a",na1); // ma == ka
154
+ SWAP_IFCOL(g.order, kb,nb, tmp);
155
+ // row major L R
156
+ //ma = ROW_SIZE(na1); // m or n
157
+ //ka = COL_SIZE(na1); // m or n (lda)
158
+ g.m = kb; // m
159
+ g.n = nb; // n (ldb)
160
+ if (g.side == CblasLeft) {
161
+ CHECK_SIZE_EQ(ka, g.m);
162
+ } else {
163
+ CHECK_SIZE_EQ(ka, g.n);
164
+ }
165
+ #endif
166
+
167
+ SWAP_IFROW(g.order, ma,nb, tmp);
168
+
169
+ #if TR
170
+ if (c != Qnil) {
171
+ rb_raise(rb_eArgError,"wrong number of arguments (3 for 2)");
172
+ }
173
+ COPY_OR_CAST_TO(b,cT);
174
+ ndf.nin = 2;
175
+
176
+ na_ndloop3(&ndf, &g, 2, a, b);
177
+ return b;
178
+ #else
179
+
180
+ if (c == Qnil) { // c is not given.
181
+ ndfunc_arg_in_t ain_init = {sym_init,0};
182
+ ain[2] = ain_init;
183
+ ndf.nout = 1;
184
+ c = INT2FIX(0);
185
+ shape[0] = nb;
186
+ shape[1] = ma;
187
+ } else {
188
+ narray_t *na3;
189
+ int nc;
190
+ COPY_OR_CAST_TO(c,cT);
191
+ GetNArray(c,na3);
192
+ CHECK_DIM_GE(na3,2);
193
+ nc = ROW_SIZE(na3);
194
+ if (nc < nb) {
195
+ rb_raise(nary_eShapeError,"nc=%d must be >= nb=%d",nc,nb);
196
+ }
197
+ //CHECK_LEADING_GE("ldc",g.ldc,"m",ma);
198
+ }
199
+ {
200
+ VALUE ans = na_ndloop3(&ndf, &g, 3, a, b, c);
201
+
202
+ if (ndf.nout == 1) { // c is not given.
203
+ return ans;
204
+ } else {
205
+ return c;
206
+ }
207
+ }
208
+ #endif
209
+ }
210
+
211
+ #undef func_p
212
+ #undef args_t
213
+ #undef GE
214
+ #undef TR
@@ -0,0 +1,9 @@
1
+ /*
2
+ module definition: <%= full_module_name %>
3
+ */
4
+
5
+ <% if module_var != ns_var %>
6
+ static VALUE <%=module_var%>;
7
+ <% end %>
8
+
9
+ <%= method_code %>
@@ -0,0 +1,194 @@
1
+ /*<%
2
+ is_ge = (/^.ge/ =~ name)
3
+ is_tr = (/^.tr/ =~ name)
4
+ %>*/
5
+ <% %>
6
+ #define GE <%= is_ge ? "1":"0" %>
7
+ #define TR <%= is_tr ? "1":"0" %>
8
+ #define args_t <%=name%>_args_t
9
+
10
+ typedef struct {
11
+ enum CBLAS_ORDER order;
12
+ enum CBLAS_TRANSPOSE trans;
13
+ enum CBLAS_UPLO uplo;
14
+ enum CBLAS_DIAG diag;
15
+ dtype alpha, beta;
16
+ blasint m, n;
17
+ } args_t;
18
+
19
+ #define func_p <%=func_name%>_p
20
+
21
+ static <%=func_name%>_t func_p = 0;
22
+
23
+ static void
24
+ <%=c_iter%>(na_loop_t *const lp)
25
+ {
26
+ dtype *a;
27
+ char *p1;
28
+ ssize_t s1;
29
+ #if !TR
30
+ char *p2;
31
+ ssize_t s2;
32
+ #endif
33
+ #if !GE
34
+ int n;
35
+ #endif
36
+ int lda;
37
+ args_t *g;
38
+
39
+ a = (dtype*)NDL_PTR(lp,0);
40
+ INIT_PTR(lp,1,p1,s1);
41
+ #if !TR
42
+ INIT_PTR(lp,2,p2,s2);
43
+ #endif
44
+ g = (args_t*)(lp->opt_ptr);
45
+
46
+ #if !GE
47
+ n = NDL_SHAPE(lp,0)[1];
48
+ #endif
49
+ lda = NDL_STEP(lp,0) / sizeof(dtype);
50
+
51
+ #if GE
52
+ (*func_p)( g->order, g->trans, g->m, g->n,
53
+ DP(g->alpha), a, lda, (dtype*)p1, s1/sizeof(dtype),
54
+ DP(g->beta), (dtype*)p2, s2/sizeof(dtype) );
55
+ #elif TR
56
+ (*func_p)( g->order, g->uplo, g->trans, g->diag, n, a, lda,
57
+ (dtype*)p1, s1/sizeof(dtype) );
58
+ #else // SY,HE
59
+ (*func_p)( g->order, g->uplo, n,
60
+ DP(g->alpha), a, lda, (dtype*)p1, s1/sizeof(dtype),
61
+ DP(g->beta), (dtype*)p2, s2/sizeof(dtype) );
62
+ #endif
63
+ }
64
+
65
+ /*<%
66
+ args_v =
67
+ if is_ge
68
+ "a, x, [y, alpha:1, beta:0, trans:'N'"
69
+ elsif is_tr
70
+ "a, x, [uplo:'U', trans:'N', diag:'U'"
71
+ else
72
+ "a, x, [y, alpha:1, beta:0, uplo:'U'"
73
+ end + ", order:'R'"
74
+ params = [
75
+ mat("a"),
76
+ vec("x"),
77
+ !is_tr && vec("y","optional",:inplace),
78
+ opt("alpha"),
79
+ opt("beta"),
80
+ !is_ge && opt("side"),
81
+ !is_ge && opt("uplo"),
82
+ is_ge || is_tr && opt("trans"),
83
+ opt("order")
84
+ ].select{|x| x}.join("\n ")
85
+ %>
86
+ @overload <%=name%>(<%=args_v%>)
87
+ <%=params%>
88
+ @return [<%=class_name%>] returns y = alpha*op(A)\*x + beta\*y.
89
+
90
+ <%=description%>
91
+
92
+ */
93
+ static VALUE
94
+ <%=c_func(-1)%>(int argc, VALUE const argv[], VALUE UNUSED(mod))
95
+ {
96
+ VALUE a, x, y=Qnil, alpha, beta;
97
+ narray_t *na1, *na2;
98
+ blasint ma, na, nx;
99
+ #if GE
100
+ blasint tmp;
101
+ #endif
102
+ size_t shape[1];
103
+ ndfunc_arg_in_t ain[4] = {{cT,2},{cT,1},{OVERWRITE,1},{sym_init,0}};
104
+ ndfunc_arg_out_t aout[1] = {{cT,1,shape}};
105
+ ndfunc_t ndf = {<%=c_iter%>, NO_LOOP, 3, 0, ain, aout};
106
+
107
+ args_t g;
108
+ VALUE kw_hash = Qnil;
109
+ #if GE
110
+ ID kw_table[4] = {id_alpha,id_beta,id_order,id_trans};
111
+ #elif TR
112
+ ID kw_table[6] = {id_alpha,id_beta,id_order,id_uplo,id_trans,id_diag};
113
+ #else
114
+ ID kw_table[4] = {id_alpha,id_beta,id_order,id_uplo};
115
+ #endif
116
+ VALUE opts[6] = {Qundef,Qundef,Qundef,Qundef,Qundef,Qundef};
117
+
118
+ CHECK_FUNC(func_p,"<%=func_name%>");
119
+
120
+ rb_scan_args(argc, argv, "21:", &a, &x, &y, &kw_hash);
121
+ rb_get_kwargs(kw_hash, kw_table, 0, 4+2*TR, opts);
122
+ alpha = option_value(opts[0],Qnil);
123
+ g.alpha = RTEST(alpha) ? m_num_to_data(alpha) : m_one;
124
+ beta = option_value(opts[1],Qnil);
125
+ g.beta = RTEST(beta) ? m_num_to_data(beta) : m_zero;
126
+ g.order = option_order(opts[2]);
127
+ #if GE
128
+ g.trans = option_trans(opts[3]);
129
+ #else
130
+ g.uplo = option_uplo(opts[3]);
131
+ #endif
132
+ #if TR
133
+ g.trans = option_trans(opts[4]);
134
+ g.diag = option_diag(opts[5]);
135
+ #endif
136
+
137
+ GetNArray(a,na1);
138
+ CHECK_DIM_GE(na1,2);
139
+ ma = ROW_SIZE(na1);
140
+ na = COL_SIZE(na1);
141
+
142
+ GetNArray(x,na2);
143
+ CHECK_DIM_GE(na2,1);
144
+ nx = COL_SIZE(na2);
145
+ #if GE
146
+ SWAP_IFCOLTR(g.order,g.trans, ma,na, tmp);
147
+ g.m = ma;
148
+ g.n = na;
149
+ #else
150
+ CHECK_SQUARE("a",na1);
151
+ #endif
152
+ CHECK_INT_EQ("na",na,"nx",nx);
153
+ shape[0] = ma;
154
+
155
+ #if TR
156
+ if (y != Qnil) {
157
+ rb_raise(rb_eArgError,"wrong number of arguments (3 for 2)");
158
+ }
159
+ COPY_OR_CAST_TO(x,cT);
160
+ ndf.nin = 2;
161
+ na_ndloop3(&ndf, &g, 2, a, x);
162
+ return x;
163
+
164
+ #else // GE,SY,HE
165
+
166
+ if (y == Qnil) { // c is not given.
167
+ ndf.nout = 1;
168
+ ain[2] = ain[3];
169
+ y = INT2FIX(0);
170
+ shape[0] = ma;
171
+ } else {
172
+ narray_t *na3;
173
+ COPY_OR_CAST_TO(y,cT);
174
+ GetNArray(y,na3);
175
+ CHECK_DIM_GE(na3,1);
176
+ CHECK_SIZE_GE(na3,nx);
177
+ }
178
+ {
179
+ VALUE ans;
180
+ ans = na_ndloop3(&ndf, &g, 3, a, x, y);
181
+
182
+ if (ndf.nout == 1) { // c is not given.
183
+ return ans;
184
+ } else {
185
+ return y;
186
+ }
187
+ }
188
+ #endif
189
+ }
190
+
191
+ #undef func_p
192
+ #undef args_t
193
+ #undef GE
194
+ #undef TR
@@ -0,0 +1,79 @@
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;
12
+ size_t n;
13
+ ssize_t s1;
14
+
15
+ INIT_PTR(lp,0,p1,s1);
16
+ p2 = NDL_PTR(lp,1);
17
+ n = NDL_SHAPE(lp,0)[0];
18
+
19
+ *(result_dtype*)p2 = (*func_p)(n, (dtype*)p1, s1/sizeof(dtype));
20
+ }
21
+
22
+ /*
23
+ <%
24
+ case name
25
+ when /^dz/
26
+ arg_class = "Numo::DComplex"
27
+ retT = "cRT"
28
+ when /^sc/
29
+ arg_class = "Numo::SComplex"
30
+ retT = "cRT"
31
+ else
32
+ arg_class = class_name
33
+ retT = "cT"
34
+ end
35
+ params = [
36
+ vec("x",type:arg_class),
37
+ opt("keepdims"),
38
+ ].select{|x| x}.join("\n ")
39
+ %>
40
+ @overload <%=name%>( x )
41
+ <%=params%>
42
+ @return [<%=class_name%>] euclidean norm of x
43
+
44
+ <%=description%>
45
+
46
+ */
47
+ static VALUE
48
+ <%=c_func(-1)%>(int argc, VALUE const argv[], VALUE UNUSED(mod))
49
+ {
50
+ VALUE x, keepdims, ans;
51
+ narray_t *na1;
52
+ ndfunc_arg_in_t ain[1] = {{cT,1}};
53
+ ndfunc_arg_out_t aout[1] = {{<%=retT%>,0}};
54
+ ndfunc_t ndf = {<%=c_iter%>, NDF_EXTRACT, 1,1, ain,aout};
55
+
56
+ VALUE opts[1] = {Qundef};
57
+ ID kw_table[1] = {id_keepdims};
58
+ VALUE kw_hash = Qnil;
59
+
60
+ CHECK_FUNC(func_p,"<%=func_name%>");
61
+
62
+ rb_scan_args(argc, argv, "1:", &x, &kw_hash);
63
+ rb_get_kwargs(kw_hash, kw_table, 0, 1, opts);
64
+ keepdims = option_value(opts[0],Qfalse);
65
+
66
+ if (RTEST(keepdims)) {
67
+ ndf.flag |= NDF_KEEP_DIM;
68
+ }
69
+
70
+ GetNArray(x,na1);
71
+ CHECK_DIM_GE(na1,1);
72
+ CHECK_NON_EMPTY(na1);
73
+
74
+ ans = na_ndloop(&ndf, 1, x);
75
+
76
+ return ans;
77
+ }
78
+
79
+ #undef func_p