Skip to content

Commit 0d3a259

Browse files
committed
CI: Fix test_JacobiSVD
1 parent a874367 commit 0d3a259

File tree

1 file changed

+43
-63
lines changed

1 file changed

+43
-63
lines changed

unittest/python/test_JacobiSVD.py

Lines changed: 43 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,21 @@
22

33
import 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 = [
@@ -26,32 +27,30 @@
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

Comments
 (0)