numo-linalg-alt 0.5.0 → 0.6.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 +7 -0
- data/README.md +47 -5
- data/ext/numo/linalg/blas/blas_common.h +30 -0
- data/ext/numo/linalg/blas/blas_util.c +39 -0
- data/ext/numo/linalg/blas/blas_util.h +11 -0
- data/ext/numo/linalg/{converter.h → blas/converter.h} +0 -2
- data/ext/numo/linalg/blas/dot.c +1 -1
- data/ext/numo/linalg/blas/dot.h +1 -6
- data/ext/numo/linalg/blas/dot_sub.c +1 -1
- data/ext/numo/linalg/blas/dot_sub.h +1 -6
- data/ext/numo/linalg/blas/gemm.c +21 -21
- data/ext/numo/linalg/blas/gemm.h +3 -9
- data/ext/numo/linalg/blas/gemv.c +10 -10
- data/ext/numo/linalg/blas/gemv.h +3 -9
- data/ext/numo/linalg/blas/nrm2.c +1 -1
- data/ext/numo/linalg/blas/nrm2.h +1 -6
- data/ext/numo/linalg/extconf.rb +33 -6
- data/ext/numo/linalg/lapack/gebal.h +1 -1
- data/ext/numo/linalg/lapack/gees.c +4 -4
- data/ext/numo/linalg/lapack/gees.h +1 -1
- data/ext/numo/linalg/lapack/geev.c +8 -24
- data/ext/numo/linalg/lapack/geev.h +1 -1
- data/ext/numo/linalg/lapack/gehrd.h +1 -1
- data/ext/numo/linalg/lapack/gelsd.h +1 -1
- data/ext/numo/linalg/lapack/geqrf.h +1 -1
- data/ext/numo/linalg/lapack/gerqf.h +1 -1
- data/ext/numo/linalg/lapack/gesdd.h +1 -1
- data/ext/numo/linalg/lapack/gesv.h +1 -1
- data/ext/numo/linalg/lapack/gesvd.h +1 -1
- data/ext/numo/linalg/lapack/getrf.h +1 -1
- data/ext/numo/linalg/lapack/getri.h +1 -1
- data/ext/numo/linalg/lapack/getrs.h +1 -1
- data/ext/numo/linalg/lapack/gges.c +4 -4
- data/ext/numo/linalg/lapack/gges.h +1 -1
- data/ext/numo/linalg/lapack/heev.c +1 -1
- data/ext/numo/linalg/lapack/heev.h +1 -1
- data/ext/numo/linalg/lapack/heevd.c +1 -1
- data/ext/numo/linalg/lapack/heevd.h +1 -1
- data/ext/numo/linalg/lapack/heevr.c +1 -1
- data/ext/numo/linalg/lapack/heevr.h +1 -1
- data/ext/numo/linalg/lapack/hegv.c +1 -1
- data/ext/numo/linalg/lapack/hegv.h +1 -1
- data/ext/numo/linalg/lapack/hegvd.c +1 -1
- data/ext/numo/linalg/lapack/hegvd.h +1 -1
- data/ext/numo/linalg/lapack/hegvx.c +1 -1
- data/ext/numo/linalg/lapack/hegvx.h +1 -1
- data/ext/numo/linalg/lapack/hetrf.h +1 -1
- data/ext/numo/linalg/lapack/lange.h +1 -1
- data/ext/numo/linalg/lapack/lapack_util.c +57 -0
- data/ext/numo/linalg/lapack/lapack_util.h +27 -0
- data/ext/numo/linalg/lapack/orghr.h +1 -1
- data/ext/numo/linalg/lapack/orgqr.h +1 -1
- data/ext/numo/linalg/lapack/orgrq.h +1 -1
- data/ext/numo/linalg/lapack/potrf.h +1 -1
- data/ext/numo/linalg/lapack/potri.h +1 -1
- data/ext/numo/linalg/lapack/potrs.h +1 -1
- data/ext/numo/linalg/lapack/syev.c +1 -1
- data/ext/numo/linalg/lapack/syev.h +1 -1
- data/ext/numo/linalg/lapack/syevd.c +1 -1
- data/ext/numo/linalg/lapack/syevd.h +1 -1
- data/ext/numo/linalg/lapack/syevr.c +1 -1
- data/ext/numo/linalg/lapack/syevr.h +1 -1
- data/ext/numo/linalg/lapack/sygv.c +1 -1
- data/ext/numo/linalg/lapack/sygv.h +1 -1
- data/ext/numo/linalg/lapack/sygvd.c +1 -1
- data/ext/numo/linalg/lapack/sygvd.h +1 -1
- data/ext/numo/linalg/lapack/sygvx.c +1 -1
- data/ext/numo/linalg/lapack/sygvx.h +1 -1
- data/ext/numo/linalg/lapack/sytrf.h +1 -1
- data/ext/numo/linalg/lapack/trtrs.h +1 -1
- data/ext/numo/linalg/lapack/unghr.h +1 -1
- data/ext/numo/linalg/lapack/ungqr.h +1 -1
- data/ext/numo/linalg/lapack/ungrq.h +1 -1
- data/ext/numo/linalg/linalg.c +2 -0
- data/ext/numo/linalg/linalg.h +14 -6
- data/lib/numo/linalg/version.rb +1 -1
- data/lib/numo/linalg.rb +68 -20
- metadata +9 -6
- data/ext/numo/linalg/util.c +0 -103
- data/ext/numo/linalg/util.h +0 -18
- /data/ext/numo/linalg/{converter.c → blas/converter.c} +0 -0
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
|
|
50
50
|
const int matrix_layout = \
|
|
51
51
|
kw_values[0] != Qundef ? get_matrix_layout(kw_values[0]) : LAPACK_ROW_MAJOR; \
|
|
52
|
-
const char jobvsl = kw_values[1] != Qundef ?
|
|
53
|
-
const char jobvsr = kw_values[2] != Qundef ?
|
|
52
|
+
const char jobvsl = kw_values[1] != Qundef ? get_job(kw_values[1], "jobvsl") : 'V'; \
|
|
53
|
+
const char jobvsr = kw_values[2] != Qundef ? get_job(kw_values[2], "jobvsr") : 'V'; \
|
|
54
54
|
\
|
|
55
55
|
if (CLASS_OF(a_vnary) != tNAryClass) { \
|
|
56
56
|
a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
|
|
@@ -141,8 +141,8 @@
|
|
|
141
141
|
rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
|
|
142
142
|
const int matrix_layout = \
|
|
143
143
|
kw_values[0] != Qundef ? get_matrix_layout(kw_values[0]) : LAPACK_ROW_MAJOR; \
|
|
144
|
-
const char jobvsl = kw_values[1] != Qundef ?
|
|
145
|
-
const char jobvsr = kw_values[2] != Qundef ?
|
|
144
|
+
const char jobvsl = kw_values[1] != Qundef ? get_job(kw_values[1], "jobvsl") : 'V'; \
|
|
145
|
+
const char jobvsr = kw_values[2] != Qundef ? get_job(kw_values[2], "jobvsr") : 'V'; \
|
|
146
146
|
\
|
|
147
147
|
if (CLASS_OF(a_vnary) != tNAryClass) { \
|
|
148
148
|
a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
|
|
@@ -26,7 +26,7 @@ struct _heev_option {
|
|
|
26
26
|
ID kw_table[3] = { rb_intern("jobz"), rb_intern("uplo"), rb_intern("order") }; \
|
|
27
27
|
VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
|
|
28
28
|
rb_get_kwargs(kw_args, kw_table, 0, 3, kw_values); \
|
|
29
|
-
const char jobz = kw_values[0] != Qundef ?
|
|
29
|
+
const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
|
|
30
30
|
const char uplo = kw_values[1] != Qundef ? get_uplo(kw_values[1]) : 'U'; \
|
|
31
31
|
const int matrix_layout = \
|
|
32
32
|
kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
|
|
@@ -26,7 +26,7 @@ struct _heevd_option {
|
|
|
26
26
|
ID kw_table[3] = { rb_intern("jobz"), rb_intern("uplo"), rb_intern("order") }; \
|
|
27
27
|
VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
|
|
28
28
|
rb_get_kwargs(kw_args, kw_table, 0, 3, kw_values); \
|
|
29
|
-
const char jobz = kw_values[0] != Qundef ?
|
|
29
|
+
const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
|
|
30
30
|
const char uplo = kw_values[1] != Qundef ? get_uplo(kw_values[1]) : 'U'; \
|
|
31
31
|
const int matrix_layout = \
|
|
32
32
|
kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
rb_intern("iu"), rb_intern("order") }; \
|
|
41
41
|
VALUE kw_values[8] = { Qundef, Qundef, Qundef, Qundef, Qundef, Qundef, Qundef, Qundef }; \
|
|
42
42
|
rb_get_kwargs(kw_args, kw_table, 0, 8, kw_values); \
|
|
43
|
-
const char jobz = kw_values[0] != Qundef ?
|
|
43
|
+
const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
|
|
44
44
|
const char range = kw_values[1] != Qundef ? get_range(kw_values[1]) : 'A'; \
|
|
45
45
|
const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
|
|
46
46
|
const tRtDType vl = kw_values[3] != Qundef ? NUM2DBL(kw_values[3]) : 0.0; \
|
|
@@ -33,7 +33,7 @@ struct _hegv_option {
|
|
|
33
33
|
VALUE kw_values[4] = { Qundef, Qundef, Qundef, Qundef }; \
|
|
34
34
|
rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
|
|
35
35
|
const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
|
|
36
|
-
const char jobz = kw_values[1] != Qundef ?
|
|
36
|
+
const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
|
|
37
37
|
const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
|
|
38
38
|
const int matrix_layout = \
|
|
39
39
|
kw_values[3] != Qundef ? get_matrix_layout(kw_values[3]) : LAPACK_ROW_MAJOR; \
|
|
@@ -33,7 +33,7 @@ struct _hegvd_option {
|
|
|
33
33
|
VALUE kw_values[4] = { Qundef, Qundef, Qundef, Qundef }; \
|
|
34
34
|
rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
|
|
35
35
|
const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
|
|
36
|
-
const char jobz = kw_values[1] != Qundef ?
|
|
36
|
+
const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
|
|
37
37
|
const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
|
|
38
38
|
const int matrix_layout = \
|
|
39
39
|
kw_values[3] != Qundef ? get_matrix_layout(kw_values[3]) : LAPACK_ROW_MAJOR; \
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
Qundef, Qundef, Qundef, Qundef }; \
|
|
47
47
|
rb_get_kwargs(kw_args, kw_table, 0, 9, kw_values); \
|
|
48
48
|
const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
|
|
49
|
-
const char jobz = kw_values[1] != Qundef ?
|
|
49
|
+
const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
|
|
50
50
|
const char range = kw_values[2] != Qundef ? get_range(kw_values[2]) : 'A'; \
|
|
51
51
|
const char uplo = kw_values[3] != Qundef ? get_uplo(kw_values[3]) : 'U'; \
|
|
52
52
|
const tRtDType vl = kw_values[4] != Qundef ? NUM2DBL(kw_values[4]) : 0.0; \
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#include "lapack_util.h"
|
|
2
|
+
|
|
3
|
+
lapack_int get_itype(VALUE val) {
|
|
4
|
+
const lapack_int itype = NUM2INT(val);
|
|
5
|
+
|
|
6
|
+
if (itype != 1 && itype != 2 && itype != 3) {
|
|
7
|
+
rb_raise(rb_eArgError, "itype must be 1, 2 or 3");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return itype;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
char get_job(VALUE val, const char* param_name) {
|
|
14
|
+
const char job = NUM2CHR(val);
|
|
15
|
+
|
|
16
|
+
if (job != 'N' && job != 'V') {
|
|
17
|
+
rb_raise(rb_eArgError, "%s must be 'N' or 'V'", param_name);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return job;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
char get_range(VALUE val) {
|
|
24
|
+
const char range = NUM2CHR(val);
|
|
25
|
+
|
|
26
|
+
if (range != 'A' && range != 'V' && range != 'I') {
|
|
27
|
+
rb_raise(rb_eArgError, "range must be 'A', 'V' or 'I'");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return range;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
char get_uplo(VALUE val) {
|
|
34
|
+
const char uplo = NUM2CHR(val);
|
|
35
|
+
|
|
36
|
+
if (uplo != 'U' && uplo != 'L') {
|
|
37
|
+
rb_raise(rb_eArgError, "uplo must be 'U' or 'L'");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return uplo;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
int get_matrix_layout(VALUE val) {
|
|
44
|
+
const char option = NUM2CHR(val);
|
|
45
|
+
|
|
46
|
+
switch (option) {
|
|
47
|
+
case 'r':
|
|
48
|
+
case 'R':
|
|
49
|
+
break;
|
|
50
|
+
case 'c':
|
|
51
|
+
case 'C':
|
|
52
|
+
rb_warn("Numo::Linalg does not support column major.");
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return LAPACK_ROW_MAJOR;
|
|
57
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#ifndef NUMO_LINALG_ALT_LAPACK_UTIL_H
|
|
2
|
+
#define NUMO_LINALG_ALT_LAPACK_UTIL_H 1
|
|
3
|
+
|
|
4
|
+
#include <ruby.h>
|
|
5
|
+
|
|
6
|
+
#include <lapacke.h>
|
|
7
|
+
|
|
8
|
+
#ifndef lapack_complex_float_real
|
|
9
|
+
#define lapack_complex_float_real(z) ((z).real)
|
|
10
|
+
#endif
|
|
11
|
+
#ifndef lapack_complex_float_imag
|
|
12
|
+
#define lapack_complex_float_imag(z) ((z).imag)
|
|
13
|
+
#endif
|
|
14
|
+
#ifndef lapack_complex_double_real
|
|
15
|
+
#define lapack_complex_double_real(z) ((z).real)
|
|
16
|
+
#endif
|
|
17
|
+
#ifndef lapack_complex_double_imag
|
|
18
|
+
#define lapack_complex_double_imag(z) ((z).imag)
|
|
19
|
+
#endif
|
|
20
|
+
|
|
21
|
+
lapack_int get_itype(VALUE val);
|
|
22
|
+
char get_job(VALUE val, const char* param_name);
|
|
23
|
+
char get_range(VALUE val);
|
|
24
|
+
char get_uplo(VALUE val);
|
|
25
|
+
int get_matrix_layout(VALUE val);
|
|
26
|
+
|
|
27
|
+
#endif // NUMO_LINALG_ALT_LAPACK_UTIL_H
|
|
@@ -26,7 +26,7 @@ struct _syev_option {
|
|
|
26
26
|
ID kw_table[3] = { rb_intern("jobz"), rb_intern("uplo"), rb_intern("order") }; \
|
|
27
27
|
VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
|
|
28
28
|
rb_get_kwargs(kw_args, kw_table, 0, 3, kw_values); \
|
|
29
|
-
const char jobz = kw_values[0] != Qundef ?
|
|
29
|
+
const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
|
|
30
30
|
const char uplo = kw_values[1] != Qundef ? get_uplo(kw_values[1]) : 'U'; \
|
|
31
31
|
const int matrix_layout = \
|
|
32
32
|
kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
|
|
@@ -26,7 +26,7 @@ struct _syevd_option {
|
|
|
26
26
|
ID kw_table[3] = { rb_intern("jobz"), rb_intern("uplo"), rb_intern("order") }; \
|
|
27
27
|
VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
|
|
28
28
|
rb_get_kwargs(kw_args, kw_table, 0, 3, kw_values); \
|
|
29
|
-
const char jobz = kw_values[0] != Qundef ?
|
|
29
|
+
const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
|
|
30
30
|
const char uplo = kw_values[1] != Qundef ? get_uplo(kw_values[1]) : 'U'; \
|
|
31
31
|
const int matrix_layout = \
|
|
32
32
|
kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
rb_intern("iu"), rb_intern("order") }; \
|
|
41
41
|
VALUE kw_values[8] = { Qundef, Qundef, Qundef, Qundef, Qundef, Qundef, Qundef, Qundef }; \
|
|
42
42
|
rb_get_kwargs(kw_args, kw_table, 0, 8, kw_values); \
|
|
43
|
-
const char jobz = kw_values[0] != Qundef ?
|
|
43
|
+
const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
|
|
44
44
|
const char range = kw_values[1] != Qundef ? get_range(kw_values[1]) : 'A'; \
|
|
45
45
|
const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
|
|
46
46
|
const tDType vl = kw_values[3] != Qundef ? NUM2DBL(kw_values[3]) : 0.0; \
|
|
@@ -33,7 +33,7 @@ struct _sygv_option {
|
|
|
33
33
|
VALUE kw_values[4] = { Qundef, Qundef, Qundef, Qundef }; \
|
|
34
34
|
rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
|
|
35
35
|
const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
|
|
36
|
-
const char jobz = kw_values[1] != Qundef ?
|
|
36
|
+
const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
|
|
37
37
|
const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
|
|
38
38
|
const int matrix_layout = \
|
|
39
39
|
kw_values[3] != Qundef ? get_matrix_layout(kw_values[3]) : LAPACK_ROW_MAJOR; \
|
|
@@ -33,7 +33,7 @@ struct _sygvd_option {
|
|
|
33
33
|
VALUE kw_values[4] = { Qundef, Qundef, Qundef, Qundef }; \
|
|
34
34
|
rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
|
|
35
35
|
const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
|
|
36
|
-
const char jobz = kw_values[1] != Qundef ?
|
|
36
|
+
const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
|
|
37
37
|
const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
|
|
38
38
|
const int matrix_layout = \
|
|
39
39
|
kw_values[3] != Qundef ? get_matrix_layout(kw_values[3]) : LAPACK_ROW_MAJOR; \
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
Qundef, Qundef, Qundef, Qundef }; \
|
|
47
47
|
rb_get_kwargs(kw_args, kw_table, 0, 9, kw_values); \
|
|
48
48
|
const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
|
|
49
|
-
const char jobz = kw_values[1] != Qundef ?
|
|
49
|
+
const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
|
|
50
50
|
const char range = kw_values[2] != Qundef ? get_range(kw_values[2]) : 'A'; \
|
|
51
51
|
const char uplo = kw_values[3] != Qundef ? get_uplo(kw_values[3]) : 'U'; \
|
|
52
52
|
const tDType vl = kw_values[4] != Qundef ? NUM2DBL(kw_values[4]) : 0.0; \
|
data/ext/numo/linalg/linalg.c
CHANGED
|
@@ -224,8 +224,10 @@ void Init_linalg(void) {
|
|
|
224
224
|
*/
|
|
225
225
|
rb_mLinalgLapack = rb_define_module_under(rb_mLinalg, "Lapack");
|
|
226
226
|
|
|
227
|
+
#ifdef HAVE_OPENBLAS_CONFIG_H
|
|
227
228
|
/* The version of OpenBLAS used in background library. */
|
|
228
229
|
rb_define_const(rb_mLinalg, "OPENBLAS_VERSION", rb_str_new_cstr(OPENBLAS_VERSION));
|
|
230
|
+
#endif
|
|
229
231
|
|
|
230
232
|
/**
|
|
231
233
|
* Returns BLAS char ([sdcz]) defined by data-type of arguments.
|