numo-linalg-alt 0.4.0 → 0.5.0
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 +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +36 -0
- data/ext/numo/linalg/blas/dot.c +2 -2
- data/ext/numo/linalg/blas/dot_sub.c +2 -2
- data/ext/numo/linalg/blas/gemm.c +4 -4
- data/ext/numo/linalg/blas/gemv.c +4 -4
- data/ext/numo/linalg/blas/nrm2.c +4 -4
- data/ext/numo/linalg/extconf.rb +1 -0
- data/ext/numo/linalg/lapack/gebal.c +87 -0
- data/ext/numo/linalg/lapack/gebal.h +15 -0
- data/ext/numo/linalg/lapack/gees.c +4 -4
- data/ext/numo/linalg/lapack/geev.c +4 -4
- data/ext/numo/linalg/lapack/gehrd.c +77 -0
- data/ext/numo/linalg/lapack/gehrd.h +15 -0
- data/ext/numo/linalg/lapack/gelsd.c +4 -4
- data/ext/numo/linalg/lapack/geqrf.c +4 -4
- data/ext/numo/linalg/lapack/gerqf.c +4 -4
- data/ext/numo/linalg/lapack/gesdd.c +4 -4
- data/ext/numo/linalg/lapack/gesv.c +4 -4
- data/ext/numo/linalg/lapack/gesvd.c +4 -4
- data/ext/numo/linalg/lapack/getrf.c +4 -4
- data/ext/numo/linalg/lapack/getri.c +4 -4
- data/ext/numo/linalg/lapack/getrs.c +4 -4
- data/ext/numo/linalg/lapack/gges.c +4 -4
- data/ext/numo/linalg/lapack/heev.c +2 -2
- data/ext/numo/linalg/lapack/heevd.c +2 -2
- data/ext/numo/linalg/lapack/heevr.c +2 -2
- data/ext/numo/linalg/lapack/hegv.c +2 -2
- data/ext/numo/linalg/lapack/hegvd.c +2 -2
- data/ext/numo/linalg/lapack/hegvx.c +2 -2
- data/ext/numo/linalg/lapack/hetrf.c +2 -2
- data/ext/numo/linalg/lapack/lange.c +11 -12
- data/ext/numo/linalg/lapack/orghr.c +82 -0
- data/ext/numo/linalg/lapack/orghr.h +15 -0
- data/ext/numo/linalg/lapack/orgqr.c +2 -2
- data/ext/numo/linalg/lapack/orgrq.c +2 -2
- data/ext/numo/linalg/lapack/potrf.c +4 -4
- data/ext/numo/linalg/lapack/potri.c +4 -4
- data/ext/numo/linalg/lapack/potrs.c +4 -4
- data/ext/numo/linalg/lapack/syev.c +2 -2
- data/ext/numo/linalg/lapack/syevd.c +2 -2
- data/ext/numo/linalg/lapack/syevr.c +2 -2
- data/ext/numo/linalg/lapack/sygv.c +2 -2
- data/ext/numo/linalg/lapack/sygvd.c +2 -2
- data/ext/numo/linalg/lapack/sygvx.c +2 -2
- data/ext/numo/linalg/lapack/sytrf.c +4 -4
- data/ext/numo/linalg/lapack/trtrs.c +4 -4
- data/ext/numo/linalg/lapack/unghr.c +82 -0
- data/ext/numo/linalg/lapack/unghr.h +15 -0
- data/ext/numo/linalg/lapack/ungqr.c +2 -2
- data/ext/numo/linalg/lapack/ungrq.c +2 -2
- data/ext/numo/linalg/linalg.c +7 -3
- data/ext/numo/linalg/linalg.h +4 -0
- data/lib/numo/linalg/version.rb +1 -1
- data/lib/numo/linalg.rb +188 -0
- metadata +10 -2
|
@@ -5,10 +5,10 @@ struct _lange_option {
|
|
|
5
5
|
char norm;
|
|
6
6
|
};
|
|
7
7
|
|
|
8
|
-
#define DEF_LINALG_FUNC(tDType, tNAryClass, fLapackFunc)
|
|
8
|
+
#define DEF_LINALG_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass, fLapackFunc) \
|
|
9
9
|
static void _iter_##fLapackFunc(na_loop_t* const lp) { \
|
|
10
10
|
tDType* a = (tDType*)NDL_PTR(lp, 0); \
|
|
11
|
-
|
|
11
|
+
tRtDType* d = (tRtDType*)NDL_PTR(lp, 1); \
|
|
12
12
|
struct _lange_option* opt = (struct _lange_option*)(lp->opt_ptr); \
|
|
13
13
|
const lapack_int m = (lapack_int)NDL_SHAPE(lp, 0)[0]; \
|
|
14
14
|
const lapack_int n = (lapack_int)NDL_SHAPE(lp, 0)[1]; \
|
|
@@ -42,8 +42,7 @@ struct _lange_option {
|
|
|
42
42
|
} \
|
|
43
43
|
\
|
|
44
44
|
ndfunc_arg_in_t ain[1] = { { tNAryClass, 2 } }; \
|
|
45
|
-
|
|
46
|
-
ndfunc_arg_out_t aout[1] = { { tNAryClass, 0, shape_out } }; \
|
|
45
|
+
ndfunc_arg_out_t aout[1] = { { tRtNAryClass, 0 } }; \
|
|
47
46
|
ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 1, 1, ain, aout }; \
|
|
48
47
|
struct _lange_option opt = { matrix_layout, norm }; \
|
|
49
48
|
VALUE ret = na_ndloop3(&ndf, &opt, 1, a_vnary); \
|
|
@@ -52,16 +51,16 @@ struct _lange_option {
|
|
|
52
51
|
return ret; \
|
|
53
52
|
}
|
|
54
53
|
|
|
55
|
-
DEF_LINALG_FUNC(double, numo_cDFloat, dlange)
|
|
56
|
-
DEF_LINALG_FUNC(float, numo_cSFloat, slange)
|
|
57
|
-
DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zlange)
|
|
58
|
-
DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, clange)
|
|
54
|
+
DEF_LINALG_FUNC(double, double, numo_cDFloat, numo_cDFloat, dlange)
|
|
55
|
+
DEF_LINALG_FUNC(float, float, numo_cSFloat, numo_cSFloat, slange)
|
|
56
|
+
DEF_LINALG_FUNC(lapack_complex_double, double, numo_cDComplex, numo_cDFloat, zlange)
|
|
57
|
+
DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, clange)
|
|
59
58
|
|
|
60
59
|
#undef DEF_LINALG_FUNC
|
|
61
60
|
|
|
62
61
|
void define_linalg_lapack_lange(VALUE mLapack) {
|
|
63
|
-
rb_define_module_function(mLapack, "dlange",
|
|
64
|
-
rb_define_module_function(mLapack, "slange",
|
|
65
|
-
rb_define_module_function(mLapack, "zlange",
|
|
66
|
-
rb_define_module_function(mLapack, "clange",
|
|
62
|
+
rb_define_module_function(mLapack, "dlange", _linalg_lapack_dlange, -1);
|
|
63
|
+
rb_define_module_function(mLapack, "slange", _linalg_lapack_slange, -1);
|
|
64
|
+
rb_define_module_function(mLapack, "zlange", _linalg_lapack_zlange, -1);
|
|
65
|
+
rb_define_module_function(mLapack, "clange", _linalg_lapack_clange, -1);
|
|
67
66
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#include "orghr.h"
|
|
2
|
+
|
|
3
|
+
struct _orghr_option {
|
|
4
|
+
int matrix_layout;
|
|
5
|
+
int ilo;
|
|
6
|
+
int ihi;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
#define DEF_LINALG_FUNC(tDType, tNAryClass, fLapackFunc) \
|
|
10
|
+
static void _iter_##fLapackFunc(na_loop_t* const lp) { \
|
|
11
|
+
tDType* a = (tDType*)NDL_PTR(lp, 0); \
|
|
12
|
+
tDType* tau = (tDType*)NDL_PTR(lp, 1); \
|
|
13
|
+
int* info = (int*)NDL_PTR(lp, 2); \
|
|
14
|
+
struct _orghr_option* opt = (struct _orghr_option*)(lp->opt_ptr); \
|
|
15
|
+
const lapack_int ilo = opt->ilo; \
|
|
16
|
+
const lapack_int ihi = opt->ihi; \
|
|
17
|
+
const lapack_int n = (lapack_int)NDL_SHAPE(lp, 0)[0]; \
|
|
18
|
+
const lapack_int lda = n; \
|
|
19
|
+
const lapack_int i = LAPACKE_##fLapackFunc(opt->matrix_layout, n, ilo, ihi, a, lda, tau); \
|
|
20
|
+
*info = (int)i; \
|
|
21
|
+
} \
|
|
22
|
+
\
|
|
23
|
+
static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
|
|
24
|
+
VALUE a_vnary = Qnil; \
|
|
25
|
+
VALUE tau_vnary = Qnil; \
|
|
26
|
+
VALUE kw_args = Qnil; \
|
|
27
|
+
rb_scan_args(argc, argv, "2:", &a_vnary, &tau_vnary, &kw_args); \
|
|
28
|
+
ID kw_table[3] = { rb_intern("ilo"), rb_intern("ihi"), rb_intern("order") }; \
|
|
29
|
+
VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
|
|
30
|
+
rb_get_kwargs(kw_args, kw_table, 2, 1, kw_values); \
|
|
31
|
+
const int ilo = NUM2INT(kw_values[0]); \
|
|
32
|
+
const int ihi = NUM2INT(kw_values[1]); \
|
|
33
|
+
const int matrix_layout = \
|
|
34
|
+
kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
|
|
35
|
+
\
|
|
36
|
+
if (CLASS_OF(a_vnary) != tNAryClass) { \
|
|
37
|
+
a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
|
|
38
|
+
} \
|
|
39
|
+
if (!RTEST(nary_check_contiguous(a_vnary))) { \
|
|
40
|
+
a_vnary = nary_dup(a_vnary); \
|
|
41
|
+
} \
|
|
42
|
+
if (CLASS_OF(tau_vnary) != tNAryClass) { \
|
|
43
|
+
tau_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, tau_vnary); \
|
|
44
|
+
} \
|
|
45
|
+
if (!RTEST(nary_check_contiguous(tau_vnary))) { \
|
|
46
|
+
tau_vnary = nary_dup(tau_vnary); \
|
|
47
|
+
} \
|
|
48
|
+
\
|
|
49
|
+
narray_t* a_nary = NULL; \
|
|
50
|
+
GetNArray(a_vnary, a_nary); \
|
|
51
|
+
if (NA_NDIM(a_nary) != 2) { \
|
|
52
|
+
rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
|
|
53
|
+
return Qnil; \
|
|
54
|
+
} \
|
|
55
|
+
narray_t* tau_nary = NULL; \
|
|
56
|
+
GetNArray(tau_vnary, tau_nary); \
|
|
57
|
+
if (NA_NDIM(tau_nary) != 1) { \
|
|
58
|
+
rb_raise(rb_eArgError, "input array tau must be 1-dimensional"); \
|
|
59
|
+
return Qnil; \
|
|
60
|
+
} \
|
|
61
|
+
\
|
|
62
|
+
ndfunc_arg_in_t ain[2] = { { OVERWRITE, 2 }, { tNAryClass, 1 } }; \
|
|
63
|
+
ndfunc_arg_out_t aout[1] = { { numo_cInt32, 0 } }; \
|
|
64
|
+
ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 2, 1, ain, aout }; \
|
|
65
|
+
struct _orghr_option opt = { matrix_layout, ilo, ihi }; \
|
|
66
|
+
VALUE res = na_ndloop3(&ndf, &opt, 2, a_vnary, tau_vnary); \
|
|
67
|
+
VALUE ret = rb_ary_new3(2, a_vnary, res); \
|
|
68
|
+
\
|
|
69
|
+
RB_GC_GUARD(a_vnary); \
|
|
70
|
+
RB_GC_GUARD(tau_vnary); \
|
|
71
|
+
return ret; \
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
DEF_LINALG_FUNC(double, numo_cDFloat, dorghr)
|
|
75
|
+
DEF_LINALG_FUNC(float, numo_cSFloat, sorghr)
|
|
76
|
+
|
|
77
|
+
#undef DEF_LINALG_FUNC
|
|
78
|
+
|
|
79
|
+
void define_linalg_lapack_orghr(VALUE mLapack) {
|
|
80
|
+
rb_define_module_function(mLapack, "dorghr", _linalg_lapack_dorghr, -1);
|
|
81
|
+
rb_define_module_function(mLapack, "sorghr", _linalg_lapack_sorghr, -1);
|
|
82
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#ifndef NUMO_LINALG_ALT_LAPACK_ORGHR_H
|
|
2
|
+
#define NUMO_LINALG_ALT_LAPACK_ORGHR_H 1
|
|
3
|
+
|
|
4
|
+
#include <lapacke.h>
|
|
5
|
+
|
|
6
|
+
#include <ruby.h>
|
|
7
|
+
|
|
8
|
+
#include <numo/narray.h>
|
|
9
|
+
#include <numo/template.h>
|
|
10
|
+
|
|
11
|
+
#include "../util.h"
|
|
12
|
+
|
|
13
|
+
void define_linalg_lapack_orghr(VALUE mLapack);
|
|
14
|
+
|
|
15
|
+
#endif /* NUMO_LINALG_ALT_LAPACK_ORGHR_H */
|
|
@@ -75,6 +75,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, sorgqr)
|
|
|
75
75
|
#undef DEF_LINALG_FUNC
|
|
76
76
|
|
|
77
77
|
void define_linalg_lapack_orgqr(VALUE mLapack) {
|
|
78
|
-
rb_define_module_function(mLapack, "dorgqr",
|
|
79
|
-
rb_define_module_function(mLapack, "sorgqr",
|
|
78
|
+
rb_define_module_function(mLapack, "dorgqr", _linalg_lapack_dorgqr, -1);
|
|
79
|
+
rb_define_module_function(mLapack, "sorgqr", _linalg_lapack_sorgqr, -1);
|
|
80
80
|
}
|
|
@@ -73,6 +73,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, sorgrq)
|
|
|
73
73
|
#undef DEF_LINALG_FUNC
|
|
74
74
|
|
|
75
75
|
void define_linalg_lapack_orgrq(VALUE mLapack) {
|
|
76
|
-
rb_define_module_function(mLapack, "dorgrq",
|
|
77
|
-
rb_define_module_function(mLapack, "sorgrq",
|
|
76
|
+
rb_define_module_function(mLapack, "dorgrq", _linalg_lapack_dorgrq, -1);
|
|
77
|
+
rb_define_module_function(mLapack, "sorgrq", _linalg_lapack_sorgrq, -1);
|
|
78
78
|
}
|
|
@@ -64,8 +64,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cpotrf)
|
|
|
64
64
|
#undef DEF_LINALG_FUNC
|
|
65
65
|
|
|
66
66
|
void define_linalg_lapack_potrf(VALUE mLapack) {
|
|
67
|
-
rb_define_module_function(mLapack, "dpotrf",
|
|
68
|
-
rb_define_module_function(mLapack, "spotrf",
|
|
69
|
-
rb_define_module_function(mLapack, "zpotrf",
|
|
70
|
-
rb_define_module_function(mLapack, "cpotrf",
|
|
67
|
+
rb_define_module_function(mLapack, "dpotrf", _linalg_lapack_dpotrf, -1);
|
|
68
|
+
rb_define_module_function(mLapack, "spotrf", _linalg_lapack_spotrf, -1);
|
|
69
|
+
rb_define_module_function(mLapack, "zpotrf", _linalg_lapack_zpotrf, -1);
|
|
70
|
+
rb_define_module_function(mLapack, "cpotrf", _linalg_lapack_cpotrf, -1);
|
|
71
71
|
}
|
|
@@ -64,8 +64,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cpotri)
|
|
|
64
64
|
#undef DEF_LINALG_FUNC
|
|
65
65
|
|
|
66
66
|
void define_linalg_lapack_potri(VALUE mLapack) {
|
|
67
|
-
rb_define_module_function(mLapack, "dpotri",
|
|
68
|
-
rb_define_module_function(mLapack, "spotri",
|
|
69
|
-
rb_define_module_function(mLapack, "zpotri",
|
|
70
|
-
rb_define_module_function(mLapack, "cpotri",
|
|
67
|
+
rb_define_module_function(mLapack, "dpotri", _linalg_lapack_dpotri, -1);
|
|
68
|
+
rb_define_module_function(mLapack, "spotri", _linalg_lapack_spotri, -1);
|
|
69
|
+
rb_define_module_function(mLapack, "zpotri", _linalg_lapack_zpotri, -1);
|
|
70
|
+
rb_define_module_function(mLapack, "cpotri", _linalg_lapack_cpotri, -1);
|
|
71
71
|
}
|
|
@@ -89,8 +89,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cpotrs)
|
|
|
89
89
|
#undef DEF_LINALG_FUNC
|
|
90
90
|
|
|
91
91
|
void define_linalg_lapack_potrs(VALUE mLapack) {
|
|
92
|
-
rb_define_module_function(mLapack, "dpotrs",
|
|
93
|
-
rb_define_module_function(mLapack, "spotrs",
|
|
94
|
-
rb_define_module_function(mLapack, "zpotrs",
|
|
95
|
-
rb_define_module_function(mLapack, "cpotrs",
|
|
92
|
+
rb_define_module_function(mLapack, "dpotrs", _linalg_lapack_dpotrs, -1);
|
|
93
|
+
rb_define_module_function(mLapack, "spotrs", _linalg_lapack_spotrs, -1);
|
|
94
|
+
rb_define_module_function(mLapack, "zpotrs", _linalg_lapack_zpotrs, -1);
|
|
95
|
+
rb_define_module_function(mLapack, "cpotrs", _linalg_lapack_cpotrs, -1);
|
|
96
96
|
}
|
|
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssyev)
|
|
|
68
68
|
#undef DEFINE_LINALG_FUNC
|
|
69
69
|
|
|
70
70
|
void define_linalg_lapack_syev(VALUE mLapack) {
|
|
71
|
-
rb_define_module_function(mLapack, "dsyev",
|
|
72
|
-
rb_define_module_function(mLapack, "ssyev",
|
|
71
|
+
rb_define_module_function(mLapack, "dsyev", _linalg_lapack_dsyev, -1);
|
|
72
|
+
rb_define_module_function(mLapack, "ssyev", _linalg_lapack_ssyev, -1);
|
|
73
73
|
}
|
|
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssyevd)
|
|
|
68
68
|
#undef DEF_LINALG_FUNC
|
|
69
69
|
|
|
70
70
|
void define_linalg_lapack_syevd(VALUE mLapack) {
|
|
71
|
-
rb_define_module_function(mLapack, "dsyevd",
|
|
72
|
-
rb_define_module_function(mLapack, "ssyevd",
|
|
71
|
+
rb_define_module_function(mLapack, "dsyevd", _linalg_lapack_dsyevd, -1);
|
|
72
|
+
rb_define_module_function(mLapack, "ssyevd", _linalg_lapack_ssyevd, -1);
|
|
73
73
|
}
|
|
@@ -115,6 +115,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssyevr)
|
|
|
115
115
|
#undef DEF_LINALG_FUNC
|
|
116
116
|
|
|
117
117
|
void define_linalg_lapack_syevr(VALUE mLapack) {
|
|
118
|
-
rb_define_module_function(mLapack, "dsyevr",
|
|
119
|
-
rb_define_module_function(mLapack, "ssyevr",
|
|
118
|
+
rb_define_module_function(mLapack, "dsyevr", _linalg_lapack_dsyevr, -1);
|
|
119
|
+
rb_define_module_function(mLapack, "ssyevr", _linalg_lapack_ssyevr, -1);
|
|
120
120
|
}
|
|
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssygv)
|
|
|
92
92
|
#undef DEF_LINALG_FUNC
|
|
93
93
|
|
|
94
94
|
void define_linalg_lapack_sygv(VALUE mLapack) {
|
|
95
|
-
rb_define_module_function(mLapack, "dsygv",
|
|
96
|
-
rb_define_module_function(mLapack, "ssygv",
|
|
95
|
+
rb_define_module_function(mLapack, "dsygv", _linalg_lapack_dsygv, -1);
|
|
96
|
+
rb_define_module_function(mLapack, "ssygv", _linalg_lapack_ssygv, -1);
|
|
97
97
|
}
|
|
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssygvd)
|
|
|
92
92
|
#undef DEF_LINALG_FUNC
|
|
93
93
|
|
|
94
94
|
void define_linalg_lapack_sygvd(VALUE mLapack) {
|
|
95
|
-
rb_define_module_function(mLapack, "dsygvd",
|
|
96
|
-
rb_define_module_function(mLapack, "ssygvd",
|
|
95
|
+
rb_define_module_function(mLapack, "dsygvd", _linalg_lapack_dsygvd, -1);
|
|
96
|
+
rb_define_module_function(mLapack, "ssygvd", _linalg_lapack_ssygvd, -1);
|
|
97
97
|
}
|
|
@@ -140,6 +140,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssygvx)
|
|
|
140
140
|
#undef DEF_LINALG_FUNC
|
|
141
141
|
|
|
142
142
|
void define_linalg_lapack_sygvx(VALUE mLapack) {
|
|
143
|
-
rb_define_module_function(mLapack, "dsygvx",
|
|
144
|
-
rb_define_module_function(mLapack, "ssygvx",
|
|
143
|
+
rb_define_module_function(mLapack, "dsygvx", _linalg_lapack_dsygvx, -1);
|
|
144
|
+
rb_define_module_function(mLapack, "ssygvx", _linalg_lapack_ssygvx, -1);
|
|
145
145
|
}
|
|
@@ -69,8 +69,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, csytrf)
|
|
|
69
69
|
#undef DEF_LINALG_FUNC
|
|
70
70
|
|
|
71
71
|
void define_linalg_lapack_sytrf(VALUE mLapack) {
|
|
72
|
-
rb_define_module_function(mLapack, "dsytrf",
|
|
73
|
-
rb_define_module_function(mLapack, "ssytrf",
|
|
74
|
-
rb_define_module_function(mLapack, "zsytrf",
|
|
75
|
-
rb_define_module_function(mLapack, "csytrf",
|
|
72
|
+
rb_define_module_function(mLapack, "dsytrf", _linalg_lapack_dsytrf, -1);
|
|
73
|
+
rb_define_module_function(mLapack, "ssytrf", _linalg_lapack_ssytrf, -1);
|
|
74
|
+
rb_define_module_function(mLapack, "zsytrf", _linalg_lapack_zsytrf, -1);
|
|
75
|
+
rb_define_module_function(mLapack, "csytrf", _linalg_lapack_csytrf, -1);
|
|
76
76
|
}
|
|
@@ -96,8 +96,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, ctrtrs)
|
|
|
96
96
|
#undef DEF_LINALG_FUNC
|
|
97
97
|
|
|
98
98
|
void define_linalg_lapack_trtrs(VALUE mLapack) {
|
|
99
|
-
rb_define_module_function(mLapack, "dtrtrs",
|
|
100
|
-
rb_define_module_function(mLapack, "strtrs",
|
|
101
|
-
rb_define_module_function(mLapack, "ztrtrs",
|
|
102
|
-
rb_define_module_function(mLapack, "ctrtrs",
|
|
99
|
+
rb_define_module_function(mLapack, "dtrtrs", _linalg_lapack_dtrtrs, -1);
|
|
100
|
+
rb_define_module_function(mLapack, "strtrs", _linalg_lapack_strtrs, -1);
|
|
101
|
+
rb_define_module_function(mLapack, "ztrtrs", _linalg_lapack_ztrtrs, -1);
|
|
102
|
+
rb_define_module_function(mLapack, "ctrtrs", _linalg_lapack_ctrtrs, -1);
|
|
103
103
|
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#include "unghr.h"
|
|
2
|
+
|
|
3
|
+
struct _unghr_option {
|
|
4
|
+
int matrix_layout;
|
|
5
|
+
int ilo;
|
|
6
|
+
int ihi;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
#define DEF_LINALG_FUNC(tDType, tNAryClass, fLapackFunc) \
|
|
10
|
+
static void _iter_##fLapackFunc(na_loop_t* const lp) { \
|
|
11
|
+
tDType* a = (tDType*)NDL_PTR(lp, 0); \
|
|
12
|
+
tDType* tau = (tDType*)NDL_PTR(lp, 1); \
|
|
13
|
+
int* info = (int*)NDL_PTR(lp, 2); \
|
|
14
|
+
struct _unghr_option* opt = (struct _unghr_option*)(lp->opt_ptr); \
|
|
15
|
+
const lapack_int ilo = opt->ilo; \
|
|
16
|
+
const lapack_int ihi = opt->ihi; \
|
|
17
|
+
const lapack_int n = (lapack_int)NDL_SHAPE(lp, 0)[0]; \
|
|
18
|
+
const lapack_int lda = n; \
|
|
19
|
+
const lapack_int i = LAPACKE_##fLapackFunc(opt->matrix_layout, n, ilo, ihi, a, lda, tau); \
|
|
20
|
+
*info = (int)i; \
|
|
21
|
+
} \
|
|
22
|
+
\
|
|
23
|
+
static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
|
|
24
|
+
VALUE a_vnary = Qnil; \
|
|
25
|
+
VALUE tau_vnary = Qnil; \
|
|
26
|
+
VALUE kw_args = Qnil; \
|
|
27
|
+
rb_scan_args(argc, argv, "2:", &a_vnary, &tau_vnary, &kw_args); \
|
|
28
|
+
ID kw_table[3] = { rb_intern("ilo"), rb_intern("ihi"), rb_intern("order") }; \
|
|
29
|
+
VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
|
|
30
|
+
rb_get_kwargs(kw_args, kw_table, 2, 1, kw_values); \
|
|
31
|
+
const int ilo = NUM2INT(kw_values[0]); \
|
|
32
|
+
const int ihi = NUM2INT(kw_values[1]); \
|
|
33
|
+
const int matrix_layout = \
|
|
34
|
+
kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
|
|
35
|
+
\
|
|
36
|
+
if (CLASS_OF(a_vnary) != tNAryClass) { \
|
|
37
|
+
a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
|
|
38
|
+
} \
|
|
39
|
+
if (!RTEST(nary_check_contiguous(a_vnary))) { \
|
|
40
|
+
a_vnary = nary_dup(a_vnary); \
|
|
41
|
+
} \
|
|
42
|
+
if (CLASS_OF(tau_vnary) != tNAryClass) { \
|
|
43
|
+
tau_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, tau_vnary); \
|
|
44
|
+
} \
|
|
45
|
+
if (!RTEST(nary_check_contiguous(tau_vnary))) { \
|
|
46
|
+
tau_vnary = nary_dup(tau_vnary); \
|
|
47
|
+
} \
|
|
48
|
+
\
|
|
49
|
+
narray_t* a_nary = NULL; \
|
|
50
|
+
GetNArray(a_vnary, a_nary); \
|
|
51
|
+
if (NA_NDIM(a_nary) != 2) { \
|
|
52
|
+
rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
|
|
53
|
+
return Qnil; \
|
|
54
|
+
} \
|
|
55
|
+
narray_t* tau_nary = NULL; \
|
|
56
|
+
GetNArray(tau_vnary, tau_nary); \
|
|
57
|
+
if (NA_NDIM(tau_nary) != 1) { \
|
|
58
|
+
rb_raise(rb_eArgError, "input array tau must be 1-dimensional"); \
|
|
59
|
+
return Qnil; \
|
|
60
|
+
} \
|
|
61
|
+
\
|
|
62
|
+
ndfunc_arg_in_t ain[2] = { { OVERWRITE, 2 }, { tNAryClass, 1 } }; \
|
|
63
|
+
ndfunc_arg_out_t aout[1] = { { numo_cInt32, 0 } }; \
|
|
64
|
+
ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 2, 1, ain, aout }; \
|
|
65
|
+
struct _unghr_option opt = { matrix_layout, ilo, ihi }; \
|
|
66
|
+
VALUE res = na_ndloop3(&ndf, &opt, 2, a_vnary, tau_vnary); \
|
|
67
|
+
VALUE ret = rb_ary_new3(2, a_vnary, res); \
|
|
68
|
+
\
|
|
69
|
+
RB_GC_GUARD(a_vnary); \
|
|
70
|
+
RB_GC_GUARD(tau_vnary); \
|
|
71
|
+
return ret; \
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zunghr)
|
|
75
|
+
DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cunghr)
|
|
76
|
+
|
|
77
|
+
#undef DEF_LINALG_FUNC
|
|
78
|
+
|
|
79
|
+
void define_linalg_lapack_unghr(VALUE mLapack) {
|
|
80
|
+
rb_define_module_function(mLapack, "zunghr", _linalg_lapack_zunghr, -1);
|
|
81
|
+
rb_define_module_function(mLapack, "cunghr", _linalg_lapack_cunghr, -1);
|
|
82
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#ifndef NUMO_LINALG_ALT_LAPACK_UNGHR_H
|
|
2
|
+
#define NUMO_LINALG_ALT_LAPACK_UNGHR_H 1
|
|
3
|
+
|
|
4
|
+
#include <lapacke.h>
|
|
5
|
+
|
|
6
|
+
#include <ruby.h>
|
|
7
|
+
|
|
8
|
+
#include <numo/narray.h>
|
|
9
|
+
#include <numo/template.h>
|
|
10
|
+
|
|
11
|
+
#include "../util.h"
|
|
12
|
+
|
|
13
|
+
void define_linalg_lapack_unghr(VALUE mLapack);
|
|
14
|
+
|
|
15
|
+
#endif /* NUMO_LINALG_ALT_LAPACK_UNGHR_H */
|
|
@@ -75,6 +75,6 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cungqr)
|
|
|
75
75
|
#undef DEF_LINALG_FUNC
|
|
76
76
|
|
|
77
77
|
void define_linalg_lapack_ungqr(VALUE mLapack) {
|
|
78
|
-
rb_define_module_function(mLapack, "zungqr",
|
|
79
|
-
rb_define_module_function(mLapack, "cungqr",
|
|
78
|
+
rb_define_module_function(mLapack, "zungqr", _linalg_lapack_zungqr, -1);
|
|
79
|
+
rb_define_module_function(mLapack, "cungqr", _linalg_lapack_cungqr, -1);
|
|
80
80
|
}
|
|
@@ -73,6 +73,6 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cungrq)
|
|
|
73
73
|
#undef DEF_LINALG_FUNC
|
|
74
74
|
|
|
75
75
|
void define_linalg_lapack_ungrq(VALUE mLapack) {
|
|
76
|
-
rb_define_module_function(mLapack, "zungrq",
|
|
77
|
-
rb_define_module_function(mLapack, "cungrq",
|
|
76
|
+
rb_define_module_function(mLapack, "zungrq", _linalg_lapack_zungrq, -1);
|
|
77
|
+
rb_define_module_function(mLapack, "cungrq", _linalg_lapack_cungrq, -1);
|
|
78
78
|
}
|
data/ext/numo/linalg/linalg.c
CHANGED
|
@@ -234,7 +234,7 @@ void Init_linalg(void) {
|
|
|
234
234
|
* @param [Numo::NArray] a
|
|
235
235
|
* @return [String]
|
|
236
236
|
*/
|
|
237
|
-
rb_define_module_function(rb_mLinalg, "blas_char",
|
|
237
|
+
rb_define_module_function(rb_mLinalg, "blas_char", linalg_blas_char, -1);
|
|
238
238
|
/**
|
|
239
239
|
* Calculates dot product of two vectors / matrices.
|
|
240
240
|
*
|
|
@@ -243,7 +243,7 @@ void Init_linalg(void) {
|
|
|
243
243
|
* @param [Numo::NArray] b
|
|
244
244
|
* @return [Float|Complex|Numo::NArray]
|
|
245
245
|
*/
|
|
246
|
-
rb_define_module_function(rb_mLinalg, "dot",
|
|
246
|
+
rb_define_module_function(rb_mLinalg, "dot", linalg_dot, 2);
|
|
247
247
|
/**
|
|
248
248
|
* Calls BLAS function prefixed with BLAS char.
|
|
249
249
|
*
|
|
@@ -253,7 +253,7 @@ void Init_linalg(void) {
|
|
|
253
253
|
* @example
|
|
254
254
|
* Numo::Linalg::Blas.call(:gemv, a, b)
|
|
255
255
|
*/
|
|
256
|
-
rb_define_singleton_method(rb_mLinalgBlas, "call",
|
|
256
|
+
rb_define_singleton_method(rb_mLinalgBlas, "call", linalg_blas_call, -1);
|
|
257
257
|
|
|
258
258
|
define_linalg_blas_dot(rb_mLinalgBlas);
|
|
259
259
|
define_linalg_blas_dot_sub(rb_mLinalgBlas);
|
|
@@ -295,6 +295,10 @@ void Init_linalg(void) {
|
|
|
295
295
|
define_linalg_lapack_gelsd(rb_mLinalgLapack);
|
|
296
296
|
define_linalg_lapack_sytrf(rb_mLinalgLapack);
|
|
297
297
|
define_linalg_lapack_hetrf(rb_mLinalgLapack);
|
|
298
|
+
define_linalg_lapack_gebal(rb_mLinalgLapack);
|
|
299
|
+
define_linalg_lapack_gehrd(rb_mLinalgLapack);
|
|
300
|
+
define_linalg_lapack_orghr(rb_mLinalgLapack);
|
|
301
|
+
define_linalg_lapack_unghr(rb_mLinalgLapack);
|
|
298
302
|
|
|
299
303
|
rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "znrm2", "dznrm2");
|
|
300
304
|
rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "cnrm2", "scnrm2");
|
data/ext/numo/linalg/linalg.h
CHANGED
|
@@ -51,8 +51,10 @@
|
|
|
51
51
|
#include "blas/gemv.h"
|
|
52
52
|
#include "blas/nrm2.h"
|
|
53
53
|
|
|
54
|
+
#include "lapack/gebal.h"
|
|
54
55
|
#include "lapack/gees.h"
|
|
55
56
|
#include "lapack/geev.h"
|
|
57
|
+
#include "lapack/gehrd.h"
|
|
56
58
|
#include "lapack/gelsd.h"
|
|
57
59
|
#include "lapack/geqrf.h"
|
|
58
60
|
#include "lapack/gerqf.h"
|
|
@@ -71,6 +73,7 @@
|
|
|
71
73
|
#include "lapack/hegvx.h"
|
|
72
74
|
#include "lapack/hetrf.h"
|
|
73
75
|
#include "lapack/lange.h"
|
|
76
|
+
#include "lapack/orghr.h"
|
|
74
77
|
#include "lapack/orgqr.h"
|
|
75
78
|
#include "lapack/orgrq.h"
|
|
76
79
|
#include "lapack/potrf.h"
|
|
@@ -84,6 +87,7 @@
|
|
|
84
87
|
#include "lapack/sygvx.h"
|
|
85
88
|
#include "lapack/sytrf.h"
|
|
86
89
|
#include "lapack/trtrs.h"
|
|
90
|
+
#include "lapack/unghr.h"
|
|
87
91
|
#include "lapack/ungqr.h"
|
|
88
92
|
#include "lapack/ungrq.h"
|
|
89
93
|
|