numo-tiny_linalg 0.1.2 → 0.2.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 +4 -0
- data/README.md +2 -0
- data/ext/numo/tiny_linalg/lapack/heevr.hpp +18 -0
- data/ext/numo/tiny_linalg/lapack/hegvx.hpp +18 -0
- data/ext/numo/tiny_linalg/lapack/syevr.hpp +18 -0
- data/ext/numo/tiny_linalg/lapack/sygvx.hpp +18 -0
- data/lib/numo/tiny_linalg/version.rb +1 -1
- data/lib/numo/tiny_linalg.rb +33 -18
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 911223ba40879d779bcc9bc77b840fb7b5e41ed68d6ccf7d26816913c42aed73
|
4
|
+
data.tar.gz: 9dce9c353da5466e1104c604c2749369131cb6640e14ddd33c697cee5d973563
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d666bdd04f48132005a9aee455047c80d83184815fac5c688ec593412ff8e670f1f31ba3376b1ee2985b8e829680590c1dad6a0ec3bf5366e584a82b523d8e4
|
7
|
+
data.tar.gz: 22027c54b56bad7214060ba7d5939b986be660a75afd65d74de7fdae095a6699ceea35422eee56831b621f2132e5bce921cb6b70bc9709e77e3efdf6cfc8a098
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [[0.2.0](https://github.com/yoshoku/numo-tiny_linalg/compare/v0.1.2...v0.2.0)] - 2023-08-11
|
4
|
+
**Breaking change**
|
5
|
+
- Change LAPACK function to call when array b is not given to TinyLinalg.eigh method.
|
6
|
+
|
3
7
|
## [[0.1.2](https://github.com/yoshoku/numo-tiny_linalg/compare/v0.1.1...v0.1.2)] - 2023-08-09
|
4
8
|
- Add dsyev, ssyev, zheev, and cheev module functions to TinyLinalg::Lapack.
|
5
9
|
- Add dsyevd, ssyevd, zheevd, and cheevd module functions to TinyLinalg::Lapack.
|
data/README.md
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
Numo::TinyLinalg is a subset library from [Numo::Linalg](https://github.com/ruby-numo/numo-linalg) consisting only of methods used in Machine Learning algorithms.
|
9
9
|
The functions Numo::TinyLinalg supports are dot, det, eigh, inv, pinv, qr, solve, and svd.
|
10
10
|
|
11
|
+
Note that the version numbering rule of Numo::TinyLinalg is not compatible with that of Numo::Linalg.
|
12
|
+
|
11
13
|
## Installation
|
12
14
|
Unlike Numo::Linalg, Numo::TinyLinalg only supports OpenBLAS as a backend library for BLAS and LAPACK.
|
13
15
|
|
@@ -93,7 +93,25 @@ private:
|
|
93
93
|
return Qnil;
|
94
94
|
}
|
95
95
|
|
96
|
+
if (range == 'V' && vu <= vl) {
|
97
|
+
rb_raise(rb_eArgError, "vu must be greater than vl");
|
98
|
+
return Qnil;
|
99
|
+
}
|
100
|
+
|
96
101
|
const size_t n = NA_SHAPE(a_nary)[1];
|
102
|
+
if (range == 'I' && (il < 1 || il > n)) {
|
103
|
+
rb_raise(rb_eArgError, "il must satisfy 1 <= il <= n");
|
104
|
+
return Qnil;
|
105
|
+
}
|
106
|
+
if (range == 'I' && (iu < 1 || iu > n)) {
|
107
|
+
rb_raise(rb_eArgError, "iu must satisfy 1 <= iu <= n");
|
108
|
+
return Qnil;
|
109
|
+
}
|
110
|
+
if (range == 'I' && iu < il) {
|
111
|
+
rb_raise(rb_eArgError, "iu must be greater than or equal to il");
|
112
|
+
return Qnil;
|
113
|
+
}
|
114
|
+
|
97
115
|
size_t m = range != 'I' ? n : iu - il + 1;
|
98
116
|
size_t w_shape[1] = { m };
|
99
117
|
size_t z_shape[2] = { n, m };
|
@@ -114,7 +114,25 @@ private:
|
|
114
114
|
return Qnil;
|
115
115
|
}
|
116
116
|
|
117
|
+
if (range == 'V' && vu <= vl) {
|
118
|
+
rb_raise(rb_eArgError, "vu must be greater than vl");
|
119
|
+
return Qnil;
|
120
|
+
}
|
121
|
+
|
117
122
|
const size_t n = NA_SHAPE(a_nary)[1];
|
123
|
+
if (range == 'I' && (il < 1 || il > n)) {
|
124
|
+
rb_raise(rb_eArgError, "il must satisfy 1 <= il <= n");
|
125
|
+
return Qnil;
|
126
|
+
}
|
127
|
+
if (range == 'I' && (iu < 1 || iu > n)) {
|
128
|
+
rb_raise(rb_eArgError, "iu must satisfy 1 <= iu <= n");
|
129
|
+
return Qnil;
|
130
|
+
}
|
131
|
+
if (range == 'I' && iu < il) {
|
132
|
+
rb_raise(rb_eArgError, "il must be less than or equal to iu");
|
133
|
+
return Qnil;
|
134
|
+
}
|
135
|
+
|
118
136
|
size_t m = range != 'I' ? n : iu - il + 1;
|
119
137
|
size_t w_shape[1] = { m };
|
120
138
|
size_t z_shape[2] = { n, m };
|
@@ -90,7 +90,25 @@ private:
|
|
90
90
|
return Qnil;
|
91
91
|
}
|
92
92
|
|
93
|
+
if (range == 'V' && vu <= vl) {
|
94
|
+
rb_raise(rb_eArgError, "vu must be greater than vl");
|
95
|
+
return Qnil;
|
96
|
+
}
|
97
|
+
|
93
98
|
const size_t n = NA_SHAPE(a_nary)[1];
|
99
|
+
if (range == 'I' && (il < 1 || il > n)) {
|
100
|
+
rb_raise(rb_eArgError, "il must satisfy 1 <= il <= n");
|
101
|
+
return Qnil;
|
102
|
+
}
|
103
|
+
if (range == 'I' && (iu < 1 || iu > n)) {
|
104
|
+
rb_raise(rb_eArgError, "iu must satisfy 1 <= iu <= n");
|
105
|
+
return Qnil;
|
106
|
+
}
|
107
|
+
if (range == 'I' && iu < il) {
|
108
|
+
rb_raise(rb_eArgError, "iu must be greater than or equal to il");
|
109
|
+
return Qnil;
|
110
|
+
}
|
111
|
+
|
94
112
|
size_t m = range != 'I' ? n : iu - il + 1;
|
95
113
|
size_t w_shape[1] = { m };
|
96
114
|
size_t z_shape[2] = { n, m };
|
@@ -113,7 +113,25 @@ private:
|
|
113
113
|
return Qnil;
|
114
114
|
}
|
115
115
|
|
116
|
+
if (range == 'V' && vu <= vl) {
|
117
|
+
rb_raise(rb_eArgError, "vu must be greater than vl");
|
118
|
+
return Qnil;
|
119
|
+
}
|
120
|
+
|
116
121
|
const size_t n = NA_SHAPE(a_nary)[1];
|
122
|
+
if (range == 'I' && (il < 1 || il > n)) {
|
123
|
+
rb_raise(rb_eArgError, "il must satisfy 1 <= il <= n");
|
124
|
+
return Qnil;
|
125
|
+
}
|
126
|
+
if (range == 'I' && (iu < 1 || iu > n)) {
|
127
|
+
rb_raise(rb_eArgError, "iu must satisfy 1 <= iu <= n");
|
128
|
+
return Qnil;
|
129
|
+
}
|
130
|
+
if (range == 'I' && iu < il) {
|
131
|
+
rb_raise(rb_eArgError, "iu must be greater than or equal to il");
|
132
|
+
return Qnil;
|
133
|
+
}
|
134
|
+
|
117
135
|
size_t m = range != 'I' ? n : iu - il + 1;
|
118
136
|
size_t w_shape[1] = { m };
|
119
137
|
size_t z_shape[2] = { n, m };
|
data/lib/numo/tiny_linalg.rb
CHANGED
@@ -48,35 +48,50 @@ module Numo
|
|
48
48
|
# @param uplo [String] This argument is for compatibility with Numo::Linalg.solver, and is not used.
|
49
49
|
# @param turbo [Bool] The flag indicating whether to use a divide and conquer algorithm. If vals_range is given, this flag is ignored.
|
50
50
|
# @return [Array<Numo::NArray>] The eigenvalues and eigenvectors.
|
51
|
-
def eigh(a, b = nil, vals_only: false, vals_range: nil, uplo: 'U', turbo: false) # rubocop:disable Metrics/AbcSize, Metrics/ParameterLists, Lint/UnusedMethodArgument
|
51
|
+
def eigh(a, b = nil, vals_only: false, vals_range: nil, uplo: 'U', turbo: false) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/ParameterLists, Metrics/PerceivedComplexity, Lint/UnusedMethodArgument
|
52
52
|
raise ArgumentError, 'input array a must be 2-dimensional' if a.ndim != 2
|
53
53
|
raise ArgumentError, 'input array a must be square' if a.shape[0] != a.shape[1]
|
54
54
|
|
55
|
+
b_given = !b.nil?
|
56
|
+
raise ArgumentError, 'input array b must be 2-dimensional' if b_given && b.ndim != 2
|
57
|
+
raise ArgumentError, 'input array b must be square' if b_given && b.shape[0] != b.shape[1]
|
58
|
+
raise ArgumentError, "invalid array type: #{b.class}" if b_given && blas_char(b) == 'n'
|
59
|
+
|
55
60
|
bchr = blas_char(a)
|
56
61
|
raise ArgumentError, "invalid array type: #{a.class}" if bchr == 'n'
|
57
62
|
|
58
|
-
unless b.nil?
|
59
|
-
raise ArgumentError, 'input array b must be 2-dimensional' if b.ndim != 2
|
60
|
-
raise ArgumentError, 'input array b must be square' if b.shape[0] != b.shape[1]
|
61
|
-
raise ArgumentError, "invalid array type: #{b.class}" if blas_char(b) == 'n'
|
62
|
-
end
|
63
|
-
|
64
63
|
jobz = vals_only ? 'N' : 'V'
|
65
|
-
b = a.class.eye(a.shape[0]) if b.nil?
|
66
|
-
sy_he_gv = %w[d s].include?(bchr) ? "#{bchr}sygv" : "#{bchr}hegv"
|
67
64
|
|
68
|
-
if
|
69
|
-
|
70
|
-
|
65
|
+
if b_given
|
66
|
+
fnc = %w[d s].include?(bchr) ? "#{bchr}sygv" : "#{bchr}hegv"
|
67
|
+
if vals_range.nil?
|
68
|
+
fnc << 'd' if turbo
|
69
|
+
vecs, _b, vals, _info = Numo::TinyLinalg::Lapack.send(fnc.to_sym, a.dup, b.dup, jobz: jobz)
|
70
|
+
else
|
71
|
+
fnc << 'x'
|
72
|
+
il = vals_range.first(1)[0] + 1
|
73
|
+
iu = vals_range.last(1)[0] + 1
|
74
|
+
_a, _b, _m, vals, vecs, _ifail, _info = Numo::TinyLinalg::Lapack.send(
|
75
|
+
fnc.to_sym, a.dup, b.dup, jobz: jobz, range: 'I', il: il, iu: iu
|
76
|
+
)
|
77
|
+
end
|
71
78
|
else
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
79
|
+
fnc = %w[d s].include?(bchr) ? "#{bchr}syev" : "#{bchr}heev"
|
80
|
+
if vals_range.nil?
|
81
|
+
fnc << 'd' if turbo
|
82
|
+
vecs, vals, _info = Numo::TinyLinalg::Lapack.send(fnc.to_sym, a.dup, jobz: jobz)
|
83
|
+
else
|
84
|
+
fnc << 'r'
|
85
|
+
il = vals_range.first(1)[0] + 1
|
86
|
+
iu = vals_range.last(1)[0] + 1
|
87
|
+
_a, _m, vals, vecs, _isuppz, _info = Numo::TinyLinalg::Lapack.send(
|
88
|
+
fnc.to_sym, a.dup, jobz: jobz, range: 'I', il: il, iu: iu
|
89
|
+
)
|
90
|
+
end
|
78
91
|
end
|
92
|
+
|
79
93
|
vecs = nil if vals_only
|
94
|
+
|
80
95
|
[vals, vecs]
|
81
96
|
end
|
82
97
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: numo-tiny_linalg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|