2
2
3
3
import eigenpy
4
4
5
+ THIN_U = eigenpy .DecompositionOptions .ComputeThinU
6
+ THIN_V = eigenpy .DecompositionOptions .ComputeThinV
7
+ FULL_U = eigenpy .DecompositionOptions .ComputeFullU
8
+ FULL_V = eigenpy .DecompositionOptions .ComputeFullV
9
+
5
10
_options = [
6
11
0 ,
7
- eigenpy .DecompositionOptions .ComputeThinU ,
8
- eigenpy .DecompositionOptions .ComputeThinV ,
9
- eigenpy .DecompositionOptions .ComputeFullU ,
10
- eigenpy .DecompositionOptions .ComputeFullV ,
11
- eigenpy .DecompositionOptions .ComputeThinU
12
- | eigenpy .DecompositionOptions .ComputeThinV ,
13
- eigenpy .DecompositionOptions .ComputeFullU
14
- | eigenpy .DecompositionOptions .ComputeFullV ,
15
- eigenpy .DecompositionOptions .ComputeThinU
16
- | eigenpy .DecompositionOptions .ComputeFullV ,
17
- eigenpy .DecompositionOptions .ComputeFullU
18
- | eigenpy .DecompositionOptions .ComputeThinV ,
12
+ THIN_U ,
13
+ THIN_V ,
14
+ FULL_U ,
15
+ FULL_V ,
16
+ THIN_U | THIN_V ,
17
+ FULL_U | FULL_V ,
18
+ THIN_U | FULL_V ,
19
+ FULL_U | THIN_V ,
19
20
]
20
21
21
22
_classes = [
26
27
]
27
28
28
29
29
- def test_jacobi (cls , options ):
30
+ def is_valid_combination (cls , opt ):
31
+ if cls == eigenpy .FullPivHhJacobiSVD :
32
+ has_thin_u = bool (opt & THIN_U )
33
+ has_thin_v = bool (opt & THIN_V )
34
+
35
+ if has_thin_u or has_thin_v :
36
+ return False
37
+
38
+ return True
39
+
40
+
41
+ def test_jacobi (cls , opt ):
30
42
dim = 100
31
43
rng = np .random .default_rng ()
32
44
A = rng .random ((dim , dim ))
33
45
A = (A + A .T ) * 0.5 + np .diag (10.0 + rng .random (dim ))
34
46
35
- if cls == eigenpy .FullPivHhJacobiSVD :
36
- if options != 0 and not (
37
- options
38
- & (
39
- eigenpy .DecompositionOptions .ComputeFullU
40
- | eigenpy .DecompositionOptions .ComputeFullV
41
- )
42
- ):
43
- return
44
-
45
- jacobisvd = cls (A , options )
47
+ jacobisvd = cls (A , opt )
46
48
assert jacobisvd .info () == eigenpy .ComputationInfo .Success
47
49
48
- if options & (
49
- eigenpy .DecompositionOptions .ComputeThinU
50
- | eigenpy .DecompositionOptions .ComputeFullU
51
- ) and options & (
52
- eigenpy .DecompositionOptions .ComputeThinV
53
- | eigenpy .DecompositionOptions .ComputeFullV
54
- ):
50
+ has_u = opt & (THIN_U | FULL_U )
51
+ has_v = opt & (THIN_V | FULL_V )
52
+
53
+ if has_u and has_v :
55
54
X = rng .random ((dim , 20 ))
56
55
B = A @ X
57
56
X_est = jacobisvd .solve (B )
@@ -64,13 +63,11 @@ def test_jacobi(cls, options):
64
63
assert eigenpy .is_approx (x , x_est )
65
64
assert eigenpy .is_approx (A @ x_est , b )
66
65
67
- rows = jacobisvd .rows ()
68
- cols = jacobisvd .cols ()
69
- assert cols == dim
70
- assert rows == dim
66
+ assert jacobisvd .rows () == dim
67
+ assert jacobisvd .cols () == dim
71
68
72
69
_jacobisvd_compute = jacobisvd .compute (A )
73
- _jacobisvd_compute_options = jacobisvd .compute (A , options )
70
+ _jacobisvd_compute_options = jacobisvd .compute (A , opt )
74
71
75
72
rank = jacobisvd .rank ()
76
73
singularvalues = jacobisvd .singularValues ()
@@ -84,37 +81,19 @@ def test_jacobi(cls, options):
84
81
85
82
compute_u = jacobisvd .computeU ()
86
83
compute_v = jacobisvd .computeV ()
87
- expected_compute_u = bool (
88
- options
89
- & (
90
- eigenpy .DecompositionOptions .ComputeThinU
91
- | eigenpy .DecompositionOptions .ComputeFullU
92
- )
93
- )
94
- expected_compute_v = bool (
95
- options
96
- & (
97
- eigenpy .DecompositionOptions .ComputeThinV
98
- | eigenpy .DecompositionOptions .ComputeFullV
99
- )
100
- )
84
+ expected_compute_u = bool (has_u )
85
+ expected_compute_v = bool (has_v )
101
86
assert compute_u == expected_compute_u
102
87
assert compute_v == expected_compute_v
103
88
104
89
if compute_u :
105
90
matrixU = jacobisvd .matrixU ()
106
- if options & eigenpy .DecompositionOptions .ComputeFullU :
107
- assert matrixU .shape == (dim , dim )
108
- elif options & eigenpy .DecompositionOptions .ComputeThinU :
109
- assert matrixU .shape == (dim , dim )
91
+ assert matrixU .shape == (dim , dim )
110
92
assert eigenpy .is_approx (matrixU .T @ matrixU , np .eye (matrixU .shape [1 ]))
111
93
112
94
if compute_v :
113
95
matrixV = jacobisvd .matrixV ()
114
- if options & eigenpy .DecompositionOptions .ComputeFullV :
115
- assert matrixV .shape == (dim , dim )
116
- elif options & eigenpy .DecompositionOptions .ComputeThinV :
117
- assert matrixV .shape == (dim , dim )
96
+ assert matrixV .shape == (dim , dim )
118
97
assert eigenpy .is_approx (matrixV .T @ matrixV , np .eye (matrixV .shape [1 ]))
119
98
120
99
if compute_u and compute_v :
@@ -138,15 +117,16 @@ def test_jacobi(cls, options):
138
117
assert id1 == decomp1 .id ()
139
118
assert id2 == decomp2 .id ()
140
119
141
- decomp3 = cls (dim , dim , options )
142
- decomp4 = cls (dim , dim , options )
120
+ decomp3 = cls (dim , dim , opt )
121
+ decomp4 = cls (dim , dim , opt )
143
122
id3 = decomp3 .id ()
144
123
id4 = decomp4 .id ()
145
124
assert id3 != id4
146
125
assert id3 == decomp3 .id ()
147
126
assert id4 == decomp4 .id ()
148
127
149
128
150
- for opt in _options :
151
- for cls in _classes :
152
- test_jacobi (cls , opt )
129
+ for cls in _classes :
130
+ for opt in _options :
131
+ if is_valid_combination (cls , opt ):
132
+ test_jacobi (cls , opt )
0 commit comments