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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 25f768b7f68b0526d390891b70e65e41ef16ef61a31614100c53250bb3d29baa
|
|
4
|
+
data.tar.gz: ebeb6d483949b617d5567f0265b2cd2cdee992fe8494006875595aa2dbb80adf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bba4f496a60bd9fe7aad51f07c6123855d8cbf4c1f1d2d4bb2858482c8ad3daeea5de8425176b242c5d84376874a0d0f93e80e46b0e39a2ff671721acb083fb3
|
|
7
|
+
data.tar.gz: 40d7100c495cad8021d5678ba1a0a3a3a9bdcfb53262e985234c653d207270c5d88f4a8d67ae8d00caab578f94142b1bdae198cf5ee3799cfc997f55486525cc
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
## [[0.5.0](https://github.com/yoshoku/numo-linalg-alt/compare/v0.4.1...v0.5.0)] - 2025-10-25
|
|
2
|
+
|
|
3
|
+
- FIX: correct Numo::Linalg::Lapack.xlange return type to Float for Numo::DComplex and Numo::SComplex.
|
|
4
|
+
- add `coshm`, `sinhm`, and `tanhm` module functions to Numo::Linalg.
|
|
5
|
+
- add `hessenberg` module function to Numo::Linalg.
|
|
6
|
+
|
|
7
|
+
## [[0.4.1](https://github.com/yoshoku/numo-linalg-alt/compare/v0.4.0...v0.4.1)] - 2025-10-19
|
|
8
|
+
|
|
9
|
+
- FIX: remove incorrect usage of RUBY_METHOD_FUNC macro: [#2](https://github.com/yoshoku/numo-linalg-alt/pull/2)
|
|
10
|
+
- add `matrix_balance` moudle function to Numo::Linalg.
|
|
11
|
+
|
|
1
12
|
## [[0.4.0](https://github.com/yoshoku/numo-linalg-alt/compare/v0.3.0...v0.4.0)] - 2025-10-16
|
|
2
13
|
|
|
3
14
|
- add `rq`, `qz`, and `tanm` module functions to Numo::Linalg.
|
data/README.md
CHANGED
|
@@ -63,6 +63,11 @@ Ubuntu:
|
|
|
63
63
|
$ gem install numo-linalg-alt
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
+
## Documentation
|
|
67
|
+
|
|
68
|
+
- [API Documentation](https://gemdocs.org/gems/numo-linalg-alt/0.4.1/)
|
|
69
|
+
- [Comparison with scipy.linalg and numpy.linalg](https://github.com/yoshoku/numo-linalg-alt/wiki/Comparison-with-scipy.linalg-and-numpy.linalg)
|
|
70
|
+
|
|
66
71
|
## Usage
|
|
67
72
|
|
|
68
73
|
An example of singular value decomposition.
|
|
@@ -94,6 +99,37 @@ puts (x - z).abs.max
|
|
|
94
99
|
# => 4.440892098500626e-16
|
|
95
100
|
```
|
|
96
101
|
|
|
102
|
+
## Development
|
|
103
|
+
|
|
104
|
+
preparation:
|
|
105
|
+
|
|
106
|
+
```shell
|
|
107
|
+
$ git clone https://github.com/yoshoku/numo-linalg-alt
|
|
108
|
+
$ cd numo-linalg-alt
|
|
109
|
+
$ bundle install
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
build and test:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
$ bundle exec rake compile
|
|
116
|
+
$ bundle exec rake test
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
linter:
|
|
120
|
+
|
|
121
|
+
```shell
|
|
122
|
+
$ bundle exec rubocop
|
|
123
|
+
$ clang-format --dry-run --Werror --style=file ext/**/*.h ext/**/*.c
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
This project follows [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/).
|
|
127
|
+
Please run `npm install` to set up husky and commitlint for commit message validation:
|
|
128
|
+
|
|
129
|
+
```shell
|
|
130
|
+
$ npm install
|
|
131
|
+
```
|
|
132
|
+
|
|
97
133
|
## Contributing
|
|
98
134
|
|
|
99
135
|
Bug reports and pull requests are welcome on GitHub at https://github.com/yoshoku/numo-linalg-alt.
|
data/ext/numo/linalg/blas/dot.c
CHANGED
|
@@ -67,6 +67,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, sdot)
|
|
|
67
67
|
#undef DEF_LINALG_FUNC
|
|
68
68
|
|
|
69
69
|
void define_linalg_blas_dot(VALUE mBlas) {
|
|
70
|
-
rb_define_module_function(mBlas, "ddot",
|
|
71
|
-
rb_define_module_function(mBlas, "sdot",
|
|
70
|
+
rb_define_module_function(mBlas, "ddot", _linalg_blas_ddot, 2);
|
|
71
|
+
rb_define_module_function(mBlas, "sdot", _linalg_blas_sdot, 2);
|
|
72
72
|
}
|
|
@@ -66,6 +66,6 @@ DEF_LINALG_FUNC(float, numo_cSComplex, cdotu_sub)
|
|
|
66
66
|
#undef DEF_LINALG_FUNC
|
|
67
67
|
|
|
68
68
|
void define_linalg_blas_dot_sub(VALUE mBlas) {
|
|
69
|
-
rb_define_module_function(mBlas, "zdotu",
|
|
70
|
-
rb_define_module_function(mBlas, "cdotu",
|
|
69
|
+
rb_define_module_function(mBlas, "zdotu", _linalg_blas_zdotu_sub, 2);
|
|
70
|
+
rb_define_module_function(mBlas, "cdotu", _linalg_blas_cdotu_sub, 2);
|
|
71
71
|
}
|
data/ext/numo/linalg/blas/gemm.c
CHANGED
|
@@ -186,8 +186,8 @@ DEF_LINALG_FUNC(scomplex, numo_cSComplex, cgemm)
|
|
|
186
186
|
#undef DEF_LINALG_FUNC
|
|
187
187
|
|
|
188
188
|
void define_linalg_blas_gemm(VALUE mBlas) {
|
|
189
|
-
rb_define_module_function(mBlas, "dgemm",
|
|
190
|
-
rb_define_module_function(mBlas, "sgemm",
|
|
191
|
-
rb_define_module_function(mBlas, "zgemm",
|
|
192
|
-
rb_define_module_function(mBlas, "cgemm",
|
|
189
|
+
rb_define_module_function(mBlas, "dgemm", _linalg_blas_dgemm, -1);
|
|
190
|
+
rb_define_module_function(mBlas, "sgemm", _linalg_blas_sgemm, -1);
|
|
191
|
+
rb_define_module_function(mBlas, "zgemm", _linalg_blas_zgemm, -1);
|
|
192
|
+
rb_define_module_function(mBlas, "cgemm", _linalg_blas_cgemm, -1);
|
|
193
193
|
}
|
data/ext/numo/linalg/blas/gemv.c
CHANGED
|
@@ -158,8 +158,8 @@ DEF_LINALG_FUNC(scomplex, numo_cSComplex, cgemv)
|
|
|
158
158
|
#undef DEF_LINALG_FUNC
|
|
159
159
|
|
|
160
160
|
void define_linalg_blas_gemv(VALUE mBlas) {
|
|
161
|
-
rb_define_module_function(mBlas, "dgemv",
|
|
162
|
-
rb_define_module_function(mBlas, "sgemv",
|
|
163
|
-
rb_define_module_function(mBlas, "zgemv",
|
|
164
|
-
rb_define_module_function(mBlas, "cgemv",
|
|
161
|
+
rb_define_module_function(mBlas, "dgemv", _linalg_blas_dgemv, -1);
|
|
162
|
+
rb_define_module_function(mBlas, "sgemv", _linalg_blas_sgemv, -1);
|
|
163
|
+
rb_define_module_function(mBlas, "zgemv", _linalg_blas_zgemv, -1);
|
|
164
|
+
rb_define_module_function(mBlas, "cgemv", _linalg_blas_cgemv, -1);
|
|
165
165
|
}
|
data/ext/numo/linalg/blas/nrm2.c
CHANGED
|
@@ -60,8 +60,8 @@ DEF_LINALG_FUNC(scomplex, float, numo_cSComplex, numo_cSFloat, scnrm2)
|
|
|
60
60
|
#undef DEF_LINALG_FUNC
|
|
61
61
|
|
|
62
62
|
void define_linalg_blas_nrm2(VALUE mBlas) {
|
|
63
|
-
rb_define_module_function(mBlas, "dnrm2",
|
|
64
|
-
rb_define_module_function(mBlas, "snrm2",
|
|
65
|
-
rb_define_module_function(mBlas, "dznrm2",
|
|
66
|
-
rb_define_module_function(mBlas, "scnrm2",
|
|
63
|
+
rb_define_module_function(mBlas, "dnrm2", _linalg_blas_dnrm2, -1);
|
|
64
|
+
rb_define_module_function(mBlas, "snrm2", _linalg_blas_snrm2, -1);
|
|
65
|
+
rb_define_module_function(mBlas, "dznrm2", _linalg_blas_dznrm2, -1);
|
|
66
|
+
rb_define_module_function(mBlas, "scnrm2", _linalg_blas_scnrm2, -1);
|
|
67
67
|
}
|
data/ext/numo/linalg/extconf.rb
CHANGED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#include "gebal.h"
|
|
2
|
+
|
|
3
|
+
struct _gebal_option {
|
|
4
|
+
int matrix_layout;
|
|
5
|
+
char job;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
char _get_job(VALUE val) {
|
|
9
|
+
const char job = NUM2CHR(val);
|
|
10
|
+
if (job != 'N' && job != 'P' && job != 'S' && job != 'B') {
|
|
11
|
+
rb_raise(rb_eArgError, "job must be 'N', 'P', 'S', or 'B'");
|
|
12
|
+
}
|
|
13
|
+
return job;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
#define DEF_LINALG_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass, fLapackFunc) \
|
|
17
|
+
static void _iter_##fLapackFunc(na_loop_t* const lp) { \
|
|
18
|
+
tDType* a = (tDType*)NDL_PTR(lp, 0); \
|
|
19
|
+
int* ilo = (int*)NDL_PTR(lp, 1); \
|
|
20
|
+
int* ihi = (int*)NDL_PTR(lp, 2); \
|
|
21
|
+
tRtDType* scale = (tRtDType*)NDL_PTR(lp, 3); \
|
|
22
|
+
int* info = (int*)NDL_PTR(lp, 4); \
|
|
23
|
+
struct _gebal_option* opt = (struct _gebal_option*)(lp->opt_ptr); \
|
|
24
|
+
const lapack_int n = \
|
|
25
|
+
(lapack_int)(opt->matrix_layout == LAPACK_ROW_MAJOR ? NDL_SHAPE(lp, 0)[0] \
|
|
26
|
+
: NDL_SHAPE(lp, 0)[1]); \
|
|
27
|
+
const lapack_int lda = n; \
|
|
28
|
+
lapack_int i = \
|
|
29
|
+
LAPACKE_##fLapackFunc(opt->matrix_layout, opt->job, n, a, lda, ilo, ihi, scale); \
|
|
30
|
+
*info = (int)i; \
|
|
31
|
+
} \
|
|
32
|
+
\
|
|
33
|
+
static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
|
|
34
|
+
VALUE a_vnary = Qnil; \
|
|
35
|
+
VALUE kw_args = Qnil; \
|
|
36
|
+
rb_scan_args(argc, argv, "1:", &a_vnary, &kw_args); \
|
|
37
|
+
ID kw_table[2] = { rb_intern("order"), rb_intern("job") }; \
|
|
38
|
+
VALUE kw_values[2] = { Qundef, Qundef }; \
|
|
39
|
+
rb_get_kwargs(kw_args, kw_table, 0, 2, kw_values); \
|
|
40
|
+
const int matrix_layout = \
|
|
41
|
+
kw_values[0] != Qundef ? get_matrix_layout(kw_values[0]) : LAPACK_ROW_MAJOR; \
|
|
42
|
+
const char job = kw_values[1] != Qundef ? _get_job(kw_values[1]) : 'B'; \
|
|
43
|
+
\
|
|
44
|
+
if (CLASS_OF(a_vnary) != tNAryClass) { \
|
|
45
|
+
a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
|
|
46
|
+
} \
|
|
47
|
+
if (!RTEST(nary_check_contiguous(a_vnary))) { \
|
|
48
|
+
a_vnary = nary_dup(a_vnary); \
|
|
49
|
+
} \
|
|
50
|
+
\
|
|
51
|
+
narray_t* a_nary = NULL; \
|
|
52
|
+
GetNArray(a_vnary, a_nary); \
|
|
53
|
+
const int n_dims = NA_NDIM(a_nary); \
|
|
54
|
+
if (n_dims != 2) { \
|
|
55
|
+
rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
|
|
56
|
+
return Qnil; \
|
|
57
|
+
} \
|
|
58
|
+
\
|
|
59
|
+
size_t n = matrix_layout == LAPACK_ROW_MAJOR ? NA_SHAPE(a_nary)[0] : NA_SHAPE(a_nary)[1]; \
|
|
60
|
+
size_t shape_scale[1] = { n }; \
|
|
61
|
+
ndfunc_arg_in_t ain[1] = { { OVERWRITE, 2 } }; \
|
|
62
|
+
ndfunc_arg_out_t aout[4] = { { numo_cInt32, 0 }, \
|
|
63
|
+
{ numo_cInt32, 0 }, \
|
|
64
|
+
{ tRtNAryClass, 1, shape_scale }, \
|
|
65
|
+
{ numo_cInt32, 0 } }; \
|
|
66
|
+
ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 1, 4, ain, aout }; \
|
|
67
|
+
struct _gebal_option opt = { matrix_layout, job }; \
|
|
68
|
+
VALUE res = na_ndloop3(&ndf, &opt, 1, a_vnary); \
|
|
69
|
+
VALUE ret = rb_ary_concat(rb_ary_new3(1, a_vnary), res); \
|
|
70
|
+
\
|
|
71
|
+
RB_GC_GUARD(a_vnary); \
|
|
72
|
+
return ret; \
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
DEF_LINALG_FUNC(double, double, numo_cDFloat, numo_cDFloat, dgebal)
|
|
76
|
+
DEF_LINALG_FUNC(float, float, numo_cSFloat, numo_cSFloat, sgebal)
|
|
77
|
+
DEF_LINALG_FUNC(lapack_complex_double, double, numo_cDComplex, numo_cDFloat, zgebal)
|
|
78
|
+
DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgebal)
|
|
79
|
+
|
|
80
|
+
#undef DEF_LINALG_FUNC
|
|
81
|
+
|
|
82
|
+
void define_linalg_lapack_gebal(VALUE mLapack) {
|
|
83
|
+
rb_define_module_function(mLapack, "dgebal", _linalg_lapack_dgebal, -1);
|
|
84
|
+
rb_define_module_function(mLapack, "sgebal", _linalg_lapack_sgebal, -1);
|
|
85
|
+
rb_define_module_function(mLapack, "zgebal", _linalg_lapack_zgebal, -1);
|
|
86
|
+
rb_define_module_function(mLapack, "cgebal", _linalg_lapack_cgebal, -1);
|
|
87
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#ifndef NUMO_LINALG_ALT_LAPACK_GEBAL_H
|
|
2
|
+
#define NUMO_LINALG_ALT_LAPACK_GEBAL_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_gebal(VALUE mLapack);
|
|
14
|
+
|
|
15
|
+
#endif /* NUMO_LINALG_ALT_LAPACK_GEBAL_H */
|
|
@@ -269,8 +269,8 @@ DEF_LINALG_FUNC_COMPLEX(lapack_complex_float, numo_cSComplex, cgees)
|
|
|
269
269
|
#undef DEF_LINALG_FUNC_COMPLEX
|
|
270
270
|
|
|
271
271
|
void define_linalg_lapack_gees(VALUE mLapack) {
|
|
272
|
-
rb_define_module_function(mLapack, "dgees",
|
|
273
|
-
rb_define_module_function(mLapack, "sgees",
|
|
274
|
-
rb_define_module_function(mLapack, "zgees",
|
|
275
|
-
rb_define_module_function(mLapack, "cgees",
|
|
272
|
+
rb_define_module_function(mLapack, "dgees", _linalg_lapack_dgees, -1);
|
|
273
|
+
rb_define_module_function(mLapack, "sgees", _linalg_lapack_sgees, -1);
|
|
274
|
+
rb_define_module_function(mLapack, "zgees", _linalg_lapack_zgees, -1);
|
|
275
|
+
rb_define_module_function(mLapack, "cgees", _linalg_lapack_cgees, -1);
|
|
276
276
|
}
|
|
@@ -162,8 +162,8 @@ DEF_LINALG_FUNC_COMPLEX(lapack_complex_float, numo_cSComplex, cgeev)
|
|
|
162
162
|
#undef DEF_LINALG_FUNC_COMPLEX
|
|
163
163
|
|
|
164
164
|
void define_linalg_lapack_geev(VALUE mLapack) {
|
|
165
|
-
rb_define_module_function(mLapack, "dgeev",
|
|
166
|
-
rb_define_module_function(mLapack, "sgeev",
|
|
167
|
-
rb_define_module_function(mLapack, "zgeev",
|
|
168
|
-
rb_define_module_function(mLapack, "cgeev",
|
|
165
|
+
rb_define_module_function(mLapack, "dgeev", _linalg_lapack_dgeev, -1);
|
|
166
|
+
rb_define_module_function(mLapack, "sgeev", _linalg_lapack_sgeev, -1);
|
|
167
|
+
rb_define_module_function(mLapack, "zgeev", _linalg_lapack_zgeev, -1);
|
|
168
|
+
rb_define_module_function(mLapack, "cgeev", _linalg_lapack_cgeev, -1);
|
|
169
169
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#include "gehrd.h"
|
|
2
|
+
|
|
3
|
+
struct _gehrd_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 _gehrd_option* opt = (struct _gehrd_option*)(lp->opt_ptr); \
|
|
15
|
+
const lapack_int ilo = opt->ilo; \
|
|
16
|
+
const lapack_int ihi = opt->ihi; \
|
|
17
|
+
const lapack_int n = \
|
|
18
|
+
(lapack_int)(opt->matrix_layout == LAPACK_ROW_MAJOR ? NDL_SHAPE(lp, 0)[0] \
|
|
19
|
+
: NDL_SHAPE(lp, 0)[1]); \
|
|
20
|
+
const lapack_int lda = n; \
|
|
21
|
+
lapack_int i = LAPACKE_##fLapackFunc(opt->matrix_layout, n, ilo, ihi, a, lda, tau); \
|
|
22
|
+
*info = (int)i; \
|
|
23
|
+
} \
|
|
24
|
+
\
|
|
25
|
+
static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
|
|
26
|
+
VALUE a_vnary = Qnil; \
|
|
27
|
+
VALUE kw_args = Qnil; \
|
|
28
|
+
rb_scan_args(argc, argv, "1:", &a_vnary, &kw_args); \
|
|
29
|
+
ID kw_table[3] = { rb_intern("ilo"), rb_intern("ihi"), rb_intern("order") }; \
|
|
30
|
+
VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
|
|
31
|
+
rb_get_kwargs(kw_args, kw_table, 2, 1, kw_values); \
|
|
32
|
+
const int ilo = NUM2INT(kw_values[0]); \
|
|
33
|
+
const int ihi = NUM2INT(kw_values[1]); \
|
|
34
|
+
const int matrix_layout = \
|
|
35
|
+
kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
|
|
36
|
+
\
|
|
37
|
+
if (CLASS_OF(a_vnary) != tNAryClass) { \
|
|
38
|
+
a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
|
|
39
|
+
} \
|
|
40
|
+
if (!RTEST(nary_check_contiguous(a_vnary))) { \
|
|
41
|
+
a_vnary = nary_dup(a_vnary); \
|
|
42
|
+
} \
|
|
43
|
+
\
|
|
44
|
+
narray_t* a_nary = NULL; \
|
|
45
|
+
GetNArray(a_vnary, a_nary); \
|
|
46
|
+
const int n_dims = NA_NDIM(a_nary); \
|
|
47
|
+
if (n_dims != 2) { \
|
|
48
|
+
rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
|
|
49
|
+
return Qnil; \
|
|
50
|
+
} \
|
|
51
|
+
\
|
|
52
|
+
size_t n = matrix_layout == LAPACK_ROW_MAJOR ? NA_SHAPE(a_nary)[0] : NA_SHAPE(a_nary)[1]; \
|
|
53
|
+
size_t shape_tau[1] = { n - 1 }; \
|
|
54
|
+
ndfunc_arg_in_t ain[1] = { { OVERWRITE, 2 } }; \
|
|
55
|
+
ndfunc_arg_out_t aout[2] = { { tNAryClass, 1, shape_tau }, { numo_cInt32, 0 } }; \
|
|
56
|
+
ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 1, 2, ain, aout }; \
|
|
57
|
+
struct _gehrd_option opt = { matrix_layout, ilo, ihi }; \
|
|
58
|
+
VALUE res = na_ndloop3(&ndf, &opt, 1, a_vnary); \
|
|
59
|
+
VALUE ret = rb_ary_concat(rb_ary_new3(1, a_vnary), res); \
|
|
60
|
+
\
|
|
61
|
+
RB_GC_GUARD(a_vnary); \
|
|
62
|
+
return ret; \
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
DEF_LINALG_FUNC(double, numo_cDFloat, dgehrd)
|
|
66
|
+
DEF_LINALG_FUNC(float, numo_cSFloat, sgehrd)
|
|
67
|
+
DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zgehrd)
|
|
68
|
+
DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgehrd)
|
|
69
|
+
|
|
70
|
+
#undef DEF_LINALG_FUNC
|
|
71
|
+
|
|
72
|
+
void define_linalg_lapack_gehrd(VALUE mLapack) {
|
|
73
|
+
rb_define_module_function(mLapack, "dgehrd", _linalg_lapack_dgehrd, -1);
|
|
74
|
+
rb_define_module_function(mLapack, "sgehrd", _linalg_lapack_sgehrd, -1);
|
|
75
|
+
rb_define_module_function(mLapack, "zgehrd", _linalg_lapack_zgehrd, -1);
|
|
76
|
+
rb_define_module_function(mLapack, "cgehrd", _linalg_lapack_cgehrd, -1);
|
|
77
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#ifndef NUMO_LINALG_ALT_LAPACK_GEHRD_H
|
|
2
|
+
#define NUMO_LINALG_ALT_LAPACK_GEHRD_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_gehrd(VALUE mLapack);
|
|
14
|
+
|
|
15
|
+
#endif // NUMO_LINALG_ALT_LAPACK_GEHRD_H
|
|
@@ -96,8 +96,8 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgels
|
|
|
96
96
|
#undef DEF_LINALG_FUNC
|
|
97
97
|
|
|
98
98
|
void define_linalg_lapack_gelsd(VALUE mLapack) {
|
|
99
|
-
rb_define_module_function(mLapack, "dgelsd",
|
|
100
|
-
rb_define_module_function(mLapack, "sgelsd",
|
|
101
|
-
rb_define_module_function(mLapack, "zgelsd",
|
|
102
|
-
rb_define_module_function(mLapack, "cgelsd",
|
|
99
|
+
rb_define_module_function(mLapack, "dgelsd", _linalg_lapack_dgelsd, -1);
|
|
100
|
+
rb_define_module_function(mLapack, "sgelsd", _linalg_lapack_sgelsd, -1);
|
|
101
|
+
rb_define_module_function(mLapack, "zgelsd", _linalg_lapack_zgelsd, -1);
|
|
102
|
+
rb_define_module_function(mLapack, "cgelsd", _linalg_lapack_cgelsd, -1);
|
|
103
103
|
}
|
|
@@ -66,8 +66,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgeqrf)
|
|
|
66
66
|
#undef DEF_LINALG_FUNC
|
|
67
67
|
|
|
68
68
|
void define_linalg_lapack_geqrf(VALUE mLapack) {
|
|
69
|
-
rb_define_module_function(mLapack, "dgeqrf",
|
|
70
|
-
rb_define_module_function(mLapack, "sgeqrf",
|
|
71
|
-
rb_define_module_function(mLapack, "zgeqrf",
|
|
72
|
-
rb_define_module_function(mLapack, "cgeqrf",
|
|
69
|
+
rb_define_module_function(mLapack, "dgeqrf", _linalg_lapack_dgeqrf, -1);
|
|
70
|
+
rb_define_module_function(mLapack, "sgeqrf", _linalg_lapack_sgeqrf, -1);
|
|
71
|
+
rb_define_module_function(mLapack, "zgeqrf", _linalg_lapack_zgeqrf, -1);
|
|
72
|
+
rb_define_module_function(mLapack, "cgeqrf", _linalg_lapack_cgeqrf, -1);
|
|
73
73
|
}
|
|
@@ -63,8 +63,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgerqf)
|
|
|
63
63
|
#undef DEF_LINALG_FUNC
|
|
64
64
|
|
|
65
65
|
void define_linalg_lapack_gerqf(VALUE mLapack) {
|
|
66
|
-
rb_define_module_function(mLapack, "dgerqf",
|
|
67
|
-
rb_define_module_function(mLapack, "sgerqf",
|
|
68
|
-
rb_define_module_function(mLapack, "zgerqf",
|
|
69
|
-
rb_define_module_function(mLapack, "cgerqf",
|
|
66
|
+
rb_define_module_function(mLapack, "dgerqf", _linalg_lapack_dgerqf, -1);
|
|
67
|
+
rb_define_module_function(mLapack, "sgerqf", _linalg_lapack_sgerqf, -1);
|
|
68
|
+
rb_define_module_function(mLapack, "zgerqf", _linalg_lapack_zgerqf, -1);
|
|
69
|
+
rb_define_module_function(mLapack, "cgerqf", _linalg_lapack_cgerqf, -1);
|
|
70
70
|
}
|
|
@@ -111,8 +111,8 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgesd
|
|
|
111
111
|
#undef DEF_LINALG_FUNC
|
|
112
112
|
|
|
113
113
|
void define_linalg_lapack_gesdd(VALUE mLapack) {
|
|
114
|
-
rb_define_module_function(mLapack, "dgesdd",
|
|
115
|
-
rb_define_module_function(mLapack, "sgesdd",
|
|
116
|
-
rb_define_module_function(mLapack, "zgesdd",
|
|
117
|
-
rb_define_module_function(mLapack, "cgesdd",
|
|
114
|
+
rb_define_module_function(mLapack, "dgesdd", _linalg_lapack_dgesdd, -1);
|
|
115
|
+
rb_define_module_function(mLapack, "sgesdd", _linalg_lapack_sgesdd, -1);
|
|
116
|
+
rb_define_module_function(mLapack, "zgesdd", _linalg_lapack_zgesdd, -1);
|
|
117
|
+
rb_define_module_function(mLapack, "cgesdd", _linalg_lapack_cgesdd, -1);
|
|
118
118
|
}
|
|
@@ -94,8 +94,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgesv)
|
|
|
94
94
|
#undef DEF_LINALG_FUNC
|
|
95
95
|
|
|
96
96
|
void define_linalg_lapack_gesv(VALUE mLapack) {
|
|
97
|
-
rb_define_module_function(mLapack, "dgesv",
|
|
98
|
-
rb_define_module_function(mLapack, "sgesv",
|
|
99
|
-
rb_define_module_function(mLapack, "zgesv",
|
|
100
|
-
rb_define_module_function(mLapack, "cgesv",
|
|
97
|
+
rb_define_module_function(mLapack, "dgesv", _linalg_lapack_dgesv, -1);
|
|
98
|
+
rb_define_module_function(mLapack, "sgesv", _linalg_lapack_sgesv, -1);
|
|
99
|
+
rb_define_module_function(mLapack, "zgesv", _linalg_lapack_zgesv, -1);
|
|
100
|
+
rb_define_module_function(mLapack, "cgesv", _linalg_lapack_cgesv, -1);
|
|
101
101
|
}
|
|
@@ -156,8 +156,8 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgesv
|
|
|
156
156
|
#undef DEF_LINALG_FUNC
|
|
157
157
|
|
|
158
158
|
void define_linalg_lapack_gesvd(VALUE mLapack) {
|
|
159
|
-
rb_define_module_function(mLapack, "dgesvd",
|
|
160
|
-
rb_define_module_function(mLapack, "sgesvd",
|
|
161
|
-
rb_define_module_function(mLapack, "zgesvd",
|
|
162
|
-
rb_define_module_function(mLapack, "cgesvd",
|
|
159
|
+
rb_define_module_function(mLapack, "dgesvd", _linalg_lapack_dgesvd, -1);
|
|
160
|
+
rb_define_module_function(mLapack, "sgesvd", _linalg_lapack_sgesvd, -1);
|
|
161
|
+
rb_define_module_function(mLapack, "zgesvd", _linalg_lapack_zgesvd, -1);
|
|
162
|
+
rb_define_module_function(mLapack, "cgesvd", _linalg_lapack_cgesvd, -1);
|
|
163
163
|
}
|
|
@@ -65,8 +65,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgetrf)
|
|
|
65
65
|
#undef DEF_LINALG_FUNC
|
|
66
66
|
|
|
67
67
|
void define_linalg_lapack_getrf(VALUE mLapack) {
|
|
68
|
-
rb_define_module_function(mLapack, "dgetrf",
|
|
69
|
-
rb_define_module_function(mLapack, "sgetrf",
|
|
70
|
-
rb_define_module_function(mLapack, "zgetrf",
|
|
71
|
-
rb_define_module_function(mLapack, "cgetrf",
|
|
68
|
+
rb_define_module_function(mLapack, "dgetrf", _linalg_lapack_dgetrf, -1);
|
|
69
|
+
rb_define_module_function(mLapack, "sgetrf", _linalg_lapack_sgetrf, -1);
|
|
70
|
+
rb_define_module_function(mLapack, "zgetrf", _linalg_lapack_zgetrf, -1);
|
|
71
|
+
rb_define_module_function(mLapack, "cgetrf", _linalg_lapack_cgetrf, -1);
|
|
72
72
|
}
|
|
@@ -76,8 +76,8 @@ DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zgetri)
|
|
|
76
76
|
DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgetri)
|
|
77
77
|
|
|
78
78
|
void define_linalg_lapack_getri(VALUE mLapack) {
|
|
79
|
-
rb_define_module_function(mLapack, "dgetri",
|
|
80
|
-
rb_define_module_function(mLapack, "sgetri",
|
|
81
|
-
rb_define_module_function(mLapack, "zgetri",
|
|
82
|
-
rb_define_module_function(mLapack, "cgetri",
|
|
79
|
+
rb_define_module_function(mLapack, "dgetri", _linalg_lapack_dgetri, -1);
|
|
80
|
+
rb_define_module_function(mLapack, "sgetri", _linalg_lapack_sgetri, -1);
|
|
81
|
+
rb_define_module_function(mLapack, "zgetri", _linalg_lapack_zgetri, -1);
|
|
82
|
+
rb_define_module_function(mLapack, "cgetri", _linalg_lapack_cgetri, -1);
|
|
83
83
|
}
|
|
@@ -107,8 +107,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgetrs)
|
|
|
107
107
|
#undef DEF_LINALG_FUNC
|
|
108
108
|
|
|
109
109
|
void define_linalg_lapack_getrs(VALUE mLapack) {
|
|
110
|
-
rb_define_module_function(mLapack, "dgetrs",
|
|
111
|
-
rb_define_module_function(mLapack, "sgetrs",
|
|
112
|
-
rb_define_module_function(mLapack, "zgetrs",
|
|
113
|
-
rb_define_module_function(mLapack, "cgetrs",
|
|
110
|
+
rb_define_module_function(mLapack, "dgetrs", _linalg_lapack_dgetrs, -1);
|
|
111
|
+
rb_define_module_function(mLapack, "sgetrs", _linalg_lapack_sgetrs, -1);
|
|
112
|
+
rb_define_module_function(mLapack, "zgetrs", _linalg_lapack_zgetrs, -1);
|
|
113
|
+
rb_define_module_function(mLapack, "cgetrs", _linalg_lapack_cgetrs, -1);
|
|
114
114
|
}
|
|
@@ -207,8 +207,8 @@ DEF_LINALG_FUNC_COMPLEX(lapack_complex_float, numo_cSComplex, cgges)
|
|
|
207
207
|
#undef DEF_LINALG_FUNC_COMPLEX
|
|
208
208
|
|
|
209
209
|
void define_linalg_lapack_gges(VALUE mLapack) {
|
|
210
|
-
rb_define_module_function(mLapack, "dgges",
|
|
211
|
-
rb_define_module_function(mLapack, "sgges",
|
|
212
|
-
rb_define_module_function(mLapack, "zgges",
|
|
213
|
-
rb_define_module_function(mLapack, "cgges",
|
|
210
|
+
rb_define_module_function(mLapack, "dgges", _linalg_lapack_dgges, -1);
|
|
211
|
+
rb_define_module_function(mLapack, "sgges", _linalg_lapack_sgges, -1);
|
|
212
|
+
rb_define_module_function(mLapack, "zgges", _linalg_lapack_zgges, -1);
|
|
213
|
+
rb_define_module_function(mLapack, "cgges", _linalg_lapack_cgges, -1);
|
|
214
214
|
}
|
|
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cheev
|
|
|
68
68
|
#undef DEF_LINALG_FUNC
|
|
69
69
|
|
|
70
70
|
void define_linalg_lapack_heev(VALUE mLapack) {
|
|
71
|
-
rb_define_module_function(mLapack, "zheev",
|
|
72
|
-
rb_define_module_function(mLapack, "cheev",
|
|
71
|
+
rb_define_module_function(mLapack, "zheev", _linalg_lapack_zheev, -1);
|
|
72
|
+
rb_define_module_function(mLapack, "cheev", _linalg_lapack_cheev, -1);
|
|
73
73
|
}
|
|
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cheev
|
|
|
68
68
|
#undef DEF_LINALG_FUNC
|
|
69
69
|
|
|
70
70
|
void define_linalg_lapack_heevd(VALUE mLapack) {
|
|
71
|
-
rb_define_module_function(mLapack, "zheevd",
|
|
72
|
-
rb_define_module_function(mLapack, "cheevd",
|
|
71
|
+
rb_define_module_function(mLapack, "zheevd", _linalg_lapack_zheevd, -1);
|
|
72
|
+
rb_define_module_function(mLapack, "cheevd", _linalg_lapack_cheevd, -1);
|
|
73
73
|
}
|
|
@@ -117,6 +117,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cheev
|
|
|
117
117
|
#undef DEF_LINALG_FUNC
|
|
118
118
|
|
|
119
119
|
void define_linalg_lapack_heevr(VALUE mLapack) {
|
|
120
|
-
rb_define_module_function(mLapack, "zheevr",
|
|
121
|
-
rb_define_module_function(mLapack, "cheevr",
|
|
120
|
+
rb_define_module_function(mLapack, "zheevr", _linalg_lapack_zheevr, -1);
|
|
121
|
+
rb_define_module_function(mLapack, "cheevr", _linalg_lapack_cheevr, -1);
|
|
122
122
|
}
|
|
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, chegv
|
|
|
92
92
|
#undef DEF_LINALG_FUNC
|
|
93
93
|
|
|
94
94
|
void define_linalg_lapack_hegv(VALUE mLapack) {
|
|
95
|
-
rb_define_module_function(mLapack, "zhegv",
|
|
96
|
-
rb_define_module_function(mLapack, "chegv",
|
|
95
|
+
rb_define_module_function(mLapack, "zhegv", _linalg_lapack_zhegv, -1);
|
|
96
|
+
rb_define_module_function(mLapack, "chegv", _linalg_lapack_chegv, -1);
|
|
97
97
|
}
|
|
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, chegv
|
|
|
92
92
|
#undef DEF_LINALG_FUNC
|
|
93
93
|
|
|
94
94
|
void define_linalg_lapack_hegvd(VALUE mLapack) {
|
|
95
|
-
rb_define_module_function(mLapack, "zhegvd",
|
|
96
|
-
rb_define_module_function(mLapack, "chegvd",
|
|
95
|
+
rb_define_module_function(mLapack, "zhegvd", _linalg_lapack_zhegvd, -1);
|
|
96
|
+
rb_define_module_function(mLapack, "chegvd", _linalg_lapack_chegvd, -1);
|
|
97
97
|
}
|
|
@@ -140,6 +140,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, chegv
|
|
|
140
140
|
#undef DEF_LINALG_FUNC
|
|
141
141
|
|
|
142
142
|
void define_linalg_lapack_hegvx(VALUE mLapack) {
|
|
143
|
-
rb_define_module_function(mLapack, "zhegvx",
|
|
144
|
-
rb_define_module_function(mLapack, "chegvx",
|
|
143
|
+
rb_define_module_function(mLapack, "zhegvx", _linalg_lapack_zhegvx, -1);
|
|
144
|
+
rb_define_module_function(mLapack, "chegvx", _linalg_lapack_chegvx, -1);
|
|
145
145
|
}
|
|
@@ -67,6 +67,6 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, chetrf)
|
|
|
67
67
|
#undef DEF_LINALG_FUNC
|
|
68
68
|
|
|
69
69
|
void define_linalg_lapack_hetrf(VALUE mLapack) {
|
|
70
|
-
rb_define_module_function(mLapack, "zhetrf",
|
|
71
|
-
rb_define_module_function(mLapack, "chetrf",
|
|
70
|
+
rb_define_module_function(mLapack, "zhetrf", _linalg_lapack_zhetrf, -1);
|
|
71
|
+
rb_define_module_function(mLapack, "chetrf", _linalg_lapack_chetrf, -1);
|
|
72
72
|
}
|