numo-linalg-alt 0.4.0 → 0.4.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 +4 -4
- data/CHANGELOG.md +5 -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/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/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 +4 -4
- 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/ungqr.c +2 -2
- data/ext/numo/linalg/lapack/ungrq.c +2 -2
- data/ext/numo/linalg/linalg.c +4 -3
- data/ext/numo/linalg/linalg.h +1 -0
- data/lib/numo/linalg/version.rb +1 -1
- data/lib/numo/linalg.rb +96 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc07e81b983e8ac3353509992185849f458f1559e6e484786c92f2a8d717de0e
|
4
|
+
data.tar.gz: 660ae0a6cc21ca8beec6858a2f7c1efeee990261fdc649710f080becbb3ccc50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 674d3e13ce4ac8b340eb66a77d83d33420af54c8f5e7836c31d398d5e3a86d5811e89baa737cb29d00f4a770f0616b4c3ff3393e17692a4dbf2ac3c9dfccdf54
|
7
|
+
data.tar.gz: b6f0a374232dc259e0ea49e4e9d13c421aab685f38b0d01ef4d602f1e0f74a17835330e9864cfb335e9571fa246a80f015f29e904e2926646eb19680b176ba5d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## [[0.4.1](https://github.com/yoshoku/numo-linalg-alt/compare/v0.3.0...v0.4.0)] - 2025-10-19
|
2
|
+
|
3
|
+
- FIX: remove incorrect usage of RUBY_METHOD_FUNC macro: [#2](https://github.com/yoshoku/numo-linalg-alt/pull/2)
|
4
|
+
- add `matrix_balance` moudle function to Numo::Linalg.
|
5
|
+
|
1
6
|
## [[0.4.0](https://github.com/yoshoku/numo-linalg-alt/compare/v0.3.0...v0.4.0)] - 2025-10-16
|
2
7
|
|
3
8
|
- add `rq`, `qz`, and `tanm` module functions to Numo::Linalg.
|
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
|
}
|
@@ -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
|
}
|
@@ -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
|
}
|
@@ -60,8 +60,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, clange)
|
|
60
60
|
#undef DEF_LINALG_FUNC
|
61
61
|
|
62
62
|
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",
|
63
|
+
rb_define_module_function(mLapack, "dlange", _linalg_lapack_dlange, -1);
|
64
|
+
rb_define_module_function(mLapack, "slange", _linalg_lapack_slange, -1);
|
65
|
+
rb_define_module_function(mLapack, "zlange", _linalg_lapack_zlange, -1);
|
66
|
+
rb_define_module_function(mLapack, "clange", _linalg_lapack_clange, -1);
|
67
67
|
}
|
@@ -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
|
}
|
@@ -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,7 @@ 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);
|
298
299
|
|
299
300
|
rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "znrm2", "dznrm2");
|
300
301
|
rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "cnrm2", "scnrm2");
|
data/ext/numo/linalg/linalg.h
CHANGED
data/lib/numo/linalg/version.rb
CHANGED
data/lib/numo/linalg.rb
CHANGED
@@ -1189,6 +1189,102 @@ module Numo
|
|
1189
1189
|
[r, scale]
|
1190
1190
|
end
|
1191
1191
|
|
1192
|
+
# Computes a diagonal similarity transformation that balances a square matrix.
|
1193
|
+
#
|
1194
|
+
# @example
|
1195
|
+
# require 'numo/linalg'
|
1196
|
+
#
|
1197
|
+
# a = Numo::DFloat[[1, 0, 0], [1, 2, 0], [1, 2, 3]]
|
1198
|
+
# b, h = Numo::Linalg.matrix_balance(a)
|
1199
|
+
# pp b
|
1200
|
+
# # =>
|
1201
|
+
# # Numo::DFloat#shape=[3,3]
|
1202
|
+
# # [[3, 2, 1],
|
1203
|
+
# # [0, 2, 1],
|
1204
|
+
# # [0, 0, 1]]
|
1205
|
+
# pp h
|
1206
|
+
# # =>
|
1207
|
+
# # Numo::DFloat#shape=[3,3]
|
1208
|
+
# # [[0, 0, 1],
|
1209
|
+
# # [0, 1, 0],
|
1210
|
+
# # [1, 0, 0]]
|
1211
|
+
# pp (Numo::Linalg.inv(h).dot(a).dot(h) - b).abs.max
|
1212
|
+
# # => 0.0
|
1213
|
+
#
|
1214
|
+
# @param a [Numo::NArray] The n-by-n square matrix.
|
1215
|
+
# @param permute [Boolean] The flag indicating whether to permute the matrix.
|
1216
|
+
# @param scale [Boolean] The flag indicating whether to scale the matrix.
|
1217
|
+
# @param separate [Boolean] The flag indicating whether to return scaling factors and permutation indices
|
1218
|
+
# separately.
|
1219
|
+
# @return [Array<Numo::NArray, Numo::NArray>] if `separate` is `false`, the balanced matrix and the
|
1220
|
+
# similarity transformation matrix `H` ([b, h]). if `separate` is `true`, the balanced matrix, the
|
1221
|
+
# scaling factors, and the permutation indices ([b, scaler, perm]).
|
1222
|
+
def matrix_balance(a, permute: true, scale: true, separate: false) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
1223
|
+
raise Numo::NArray::ShapeError, 'input array a must be 2-dimensional' if a.ndim != 2
|
1224
|
+
|
1225
|
+
n = a.shape[0]
|
1226
|
+
raise ArgumentError, 'input array a must be square' if a.shape[1] != n
|
1227
|
+
|
1228
|
+
bchr = blas_char(a)
|
1229
|
+
raise ArgumentError, "invalid array type: #{a.class}" if bchr == 'n'
|
1230
|
+
|
1231
|
+
job = if permute && scale
|
1232
|
+
'B'
|
1233
|
+
elsif permute && !scale
|
1234
|
+
'P'
|
1235
|
+
elsif !permute && scale
|
1236
|
+
'S'
|
1237
|
+
else
|
1238
|
+
'N'
|
1239
|
+
end
|
1240
|
+
fnc = :"#{bchr}gebal"
|
1241
|
+
b, lo, hi, prm_scl, info = Numo::Linalg::Lapack.send(fnc, a.dup, job: job)
|
1242
|
+
|
1243
|
+
raise "the #{info.abs}-th argument of #{fnc} had illegal value" if info.negative?
|
1244
|
+
|
1245
|
+
# convert from Fortran style index to Ruby style index.
|
1246
|
+
lo -= 1
|
1247
|
+
hi -= 1
|
1248
|
+
iprm_scl = Numo::Int32.cast(prm_scl) - 1
|
1249
|
+
|
1250
|
+
# extract scaling factors
|
1251
|
+
scaler = prm_scl.class.ones(n)
|
1252
|
+
scaler[lo...(hi + 1)] = prm_scl[lo...(hi + 1)]
|
1253
|
+
|
1254
|
+
# extract permutation indices
|
1255
|
+
perm = Numo::Int32.new(n).seq
|
1256
|
+
if hi < n - 1
|
1257
|
+
iprm_scl[(hi + 1)...n].to_a.reverse.each.with_index(1) do |s, i|
|
1258
|
+
j = n - i
|
1259
|
+
next if s == j
|
1260
|
+
|
1261
|
+
tmp_ls, tmp_lj = perm[[s, j]].to_a
|
1262
|
+
tmp_rj, tmp_rs = perm[[j, s]].to_a
|
1263
|
+
perm[[s, j]] = [tmp_rj, tmp_rs]
|
1264
|
+
perm[[j, s]] = [tmp_ls, tmp_lj]
|
1265
|
+
end
|
1266
|
+
end
|
1267
|
+
if lo > 0 # rubocop:disable Style/NumericPredicate
|
1268
|
+
iprm_scl[0...lo].to_a.each_with_index do |s, j|
|
1269
|
+
next if s == j
|
1270
|
+
|
1271
|
+
tmp_ls, tmp_lj = perm[[s, j]].to_a
|
1272
|
+
tmp_rj, tmp_rs = perm[[j, s]].to_a
|
1273
|
+
perm[[s, j]] = [tmp_rj, tmp_rs]
|
1274
|
+
perm[[j, s]] = [tmp_ls, tmp_lj]
|
1275
|
+
end
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
return [b, scaler, perm] if separate
|
1279
|
+
|
1280
|
+
# construct inverse permutation matrix
|
1281
|
+
inv_perm = Numo::Int32.zeros(n)
|
1282
|
+
inv_perm[perm] = Numo::Int32.new(n).seq
|
1283
|
+
h = scaler.diag[inv_perm, true].dup
|
1284
|
+
|
1285
|
+
[b, h]
|
1286
|
+
end
|
1287
|
+
|
1192
1288
|
# Computes the eigenvalues and right and/or left eigenvectors of a general square matrix.
|
1193
1289
|
#
|
1194
1290
|
# @example
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: numo-linalg-alt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
@@ -50,6 +50,8 @@ files:
|
|
50
50
|
- ext/numo/linalg/converter.c
|
51
51
|
- ext/numo/linalg/converter.h
|
52
52
|
- ext/numo/linalg/extconf.rb
|
53
|
+
- ext/numo/linalg/lapack/gebal.c
|
54
|
+
- ext/numo/linalg/lapack/gebal.h
|
53
55
|
- ext/numo/linalg/lapack/gees.c
|
54
56
|
- ext/numo/linalg/lapack/gees.h
|
55
57
|
- ext/numo/linalg/lapack/geev.c
|
@@ -134,7 +136,7 @@ metadata:
|
|
134
136
|
homepage_uri: https://github.com/yoshoku/numo-linalg-alt
|
135
137
|
source_code_uri: https://github.com/yoshoku/numo-linalg-alt
|
136
138
|
changelog_uri: https://github.com/yoshoku/numo-linalg-alt/blob/main/CHANGELOG.md
|
137
|
-
documentation_uri: https://gemdocs.org/gems/numo-linalg-alt/0.4.
|
139
|
+
documentation_uri: https://gemdocs.org/gems/numo-linalg-alt/0.4.1/
|
138
140
|
rubygems_mfa_required: 'true'
|
139
141
|
rdoc_options: []
|
140
142
|
require_paths:
|