22
33import eigenpy
44
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+
510_options = [
611 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 ,
1920]
2021
2122_classes = [
2627]
2728
2829
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 ):
3042 dim = 100
3143 rng = np .random .default_rng ()
3244 A = rng .random ((dim , dim ))
3345 A = (A + A .T ) * 0.5 + np .diag (10.0 + rng .random (dim ))
3446
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 )
4648 assert jacobisvd .info () == eigenpy .ComputationInfo .Success
4749
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 :
5554 X = rng .random ((dim , 20 ))
5655 B = A @ X
5756 X_est = jacobisvd .solve (B )
@@ -64,13 +63,11 @@ def test_jacobi(cls, options):
6463 assert eigenpy .is_approx (x , x_est )
6564 assert eigenpy .is_approx (A @ x_est , b )
6665
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
7168
7269 _jacobisvd_compute = jacobisvd .compute (A )
73- _jacobisvd_compute_options = jacobisvd .compute (A , options )
70+ _jacobisvd_compute_options = jacobisvd .compute (A , opt )
7471
7572 rank = jacobisvd .rank ()
7673 singularvalues = jacobisvd .singularValues ()
@@ -84,37 +81,19 @@ def test_jacobi(cls, options):
8481
8582 compute_u = jacobisvd .computeU ()
8683 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 )
10186 assert compute_u == expected_compute_u
10287 assert compute_v == expected_compute_v
10388
10489 if compute_u :
10590 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 )
11092 assert eigenpy .is_approx (matrixU .T @ matrixU , np .eye (matrixU .shape [1 ]))
11193
11294 if compute_v :
11395 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 )
11897 assert eigenpy .is_approx (matrixV .T @ matrixV , np .eye (matrixV .shape [1 ]))
11998
12099 if compute_u and compute_v :
@@ -138,15 +117,16 @@ def test_jacobi(cls, options):
138117 assert id1 == decomp1 .id ()
139118 assert id2 == decomp2 .id ()
140119
141- decomp3 = cls (dim , dim , options )
142- decomp4 = cls (dim , dim , options )
120+ decomp3 = cls (dim , dim , opt )
121+ decomp4 = cls (dim , dim , opt )
143122 id3 = decomp3 .id ()
144123 id4 = decomp4 .id ()
145124 assert id3 != id4
146125 assert id3 == decomp3 .id ()
147126 assert id4 == decomp4 .id ()
148127
149128
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