Skip to content

Commit ea74840

Browse files
committed
Reduce computation time in unit tests
1 parent bf345c3 commit ea74840

8 files changed

+12
-466
lines changed

tests/test_complex_eigen_solver.py

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,9 @@
55
rng = np.random.default_rng()
66
A = rng.random((dim, dim))
77

8-
ces = nanoeigenpy.ComplexEigenSolver()
9-
es = nanoeigenpy.ComplexEigenSolver(dim)
108
es = nanoeigenpy.ComplexEigenSolver(A)
119
assert es.info() == nanoeigenpy.ComputationInfo.Success
1210

13-
es_with_vectors = nanoeigenpy.ComplexEigenSolver(A, True)
14-
assert es_with_vectors.info() == nanoeigenpy.ComputationInfo.Success
15-
16-
es_without_vectors = nanoeigenpy.ComplexEigenSolver(A, False)
17-
assert es_without_vectors.info() == nanoeigenpy.ComputationInfo.Success
18-
1911
V = es.eigenvectors()
2012
D = es.eigenvalues()
2113
assert V.shape == (dim, dim)
@@ -26,68 +18,15 @@
2618
assert nanoeigenpy.is_approx(AV.real, VD.real)
2719
assert nanoeigenpy.is_approx(AV.imag, VD.imag)
2820

29-
es_compute = nanoeigenpy.ComplexEigenSolver()
30-
result = es_compute.compute(A, False)
31-
assert result.info() == nanoeigenpy.ComputationInfo.Success
32-
D_only = es_compute.eigenvalues()
33-
assert D_only.shape == (dim,)
34-
35-
result_with_vectors = es_compute.compute(A, True)
36-
assert result_with_vectors.info() == nanoeigenpy.ComputationInfo.Success
37-
V_computed = es_compute.eigenvectors()
38-
D_computed = es_compute.eigenvalues()
39-
assert V_computed.shape == (dim, dim)
40-
assert D_computed.shape == (dim,)
41-
4221
trace_A = np.trace(A)
4322
trace_D = np.sum(D)
4423
assert abs(trace_A - trace_D.real) < 1e-10
4524
assert abs(trace_D.imag) < 1e-10
4625

47-
es_default = nanoeigenpy.ComplexEigenSolver()
48-
result_default = es_default.compute(A)
49-
assert result_default.info() == nanoeigenpy.ComputationInfo.Success
50-
V_default = es_default.eigenvectors()
51-
D_default = es_default.eigenvalues()
52-
53-
es_iter = nanoeigenpy.ComplexEigenSolver(A)
54-
default_iter = es_iter.getMaxIterations()
55-
es_iter.setMaxIterations(100)
56-
assert es_iter.getMaxIterations() == 100
57-
es_iter.setMaxIterations(200)
58-
assert es_iter.getMaxIterations() == 200
59-
60-
assert es.info() == nanoeigenpy.ComputationInfo.Success
61-
62-
ces1 = nanoeigenpy.ComplexEigenSolver()
63-
ces2 = nanoeigenpy.ComplexEigenSolver()
64-
id1 = ces1.id()
65-
id2 = ces2.id()
66-
assert id1 != id2
67-
assert id1 == ces1.id()
68-
assert id2 == ces2.id()
69-
70-
dim_constructor = 3
71-
ces3 = nanoeigenpy.ComplexEigenSolver(dim_constructor)
72-
ces4 = nanoeigenpy.ComplexEigenSolver(dim_constructor)
73-
id3 = ces3.id()
74-
id4 = ces4.id()
75-
assert id3 != id4
76-
assert id3 == ces3.id()
77-
assert id4 == ces4.id()
78-
7926
ces5 = nanoeigenpy.ComplexEigenSolver(A)
8027
ces6 = nanoeigenpy.ComplexEigenSolver(A)
8128
id5 = ces5.id()
8229
id6 = ces6.id()
8330
assert id5 != id6
8431
assert id5 == ces5.id()
8532
assert id6 == ces6.id()
86-
87-
ces7 = nanoeigenpy.ComplexEigenSolver(A, True)
88-
ces8 = nanoeigenpy.ComplexEigenSolver(A, False)
89-
id7 = ces7.id()
90-
id8 = ces8.id()
91-
assert id7 != id8
92-
assert id7 == ces7.id()
93-
assert id8 == ces8.id()

tests/test_complex_schur.py

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -19,50 +19,6 @@
1919
for col in range(row):
2020
assert abs(T[row, col]) < 1e-12
2121

22-
A_test = rng.random((dim, dim))
23-
cs1 = nanoeigenpy.ComplexSchur(dim)
24-
cs1.compute(A_test)
25-
cs2 = nanoeigenpy.ComplexSchur(A_test)
26-
27-
assert cs1.info() == nanoeigenpy.ComputationInfo.Success
28-
assert cs2.info() == nanoeigenpy.ComputationInfo.Success
29-
30-
T1 = cs1.matrixT()
31-
U1 = cs1.matrixU()
32-
T2 = cs2.matrixT()
33-
U2 = cs2.matrixU()
34-
35-
assert nanoeigenpy.is_approx(T1, T2)
36-
assert nanoeigenpy.is_approx(U1, U2)
37-
38-
cs_no_u = nanoeigenpy.ComplexSchur(A, False)
39-
assert cs_no_u.info() == nanoeigenpy.ComputationInfo.Success
40-
T_no_u = cs_no_u.matrixT()
41-
42-
assert nanoeigenpy.is_approx(T, T_no_u)
43-
44-
cs_compute_no_u = nanoeigenpy.ComplexSchur(dim)
45-
result_no_u = cs_compute_no_u.compute(A, False)
46-
assert result_no_u.info() == nanoeigenpy.ComputationInfo.Success
47-
T_compute_no_u = cs_compute_no_u.matrixT()
48-
assert nanoeigenpy.is_approx(T, T_compute_no_u)
49-
50-
cs_iter = nanoeigenpy.ComplexSchur(dim)
51-
cs_iter.setMaxIterations(30 * dim) # m_maxIterationsPerRow * size
52-
result_iter = cs_iter.compute(A)
53-
assert result_iter.info() == nanoeigenpy.ComputationInfo.Success
54-
assert cs_iter.getMaxIterations() == 30 * dim
55-
56-
T_iter = cs_iter.matrixT()
57-
U_iter = cs_iter.matrixU()
58-
assert nanoeigenpy.is_approx(T, T_iter)
59-
assert nanoeigenpy.is_approx(U, U_iter)
60-
61-
cs_few_iter = nanoeigenpy.ComplexSchur(dim)
62-
cs_few_iter.setMaxIterations(1)
63-
result_few = cs_few_iter.compute(A)
64-
assert cs_few_iter.getMaxIterations() == 1
65-
6622
A_triangular = np.triu(A)
6723
cs_triangular = nanoeigenpy.ComplexSchur(dim)
6824
cs_triangular.setMaxIterations(1)
@@ -91,27 +47,3 @@
9147
assert nanoeigenpy.is_approx(
9248
A_complex, U_from_hess @ T_from_hess @ U_from_hess.conj().T
9349
)
94-
95-
cs1_id = nanoeigenpy.ComplexSchur(dim)
96-
cs2_id = nanoeigenpy.ComplexSchur(dim)
97-
id1 = cs1_id.id()
98-
id2 = cs2_id.id()
99-
assert id1 != id2
100-
assert id1 == cs1_id.id()
101-
assert id2 == cs2_id.id()
102-
103-
cs3_id = nanoeigenpy.ComplexSchur(A)
104-
cs4_id = nanoeigenpy.ComplexSchur(A)
105-
id3 = cs3_id.id()
106-
id4 = cs4_id.id()
107-
assert id3 != id4
108-
assert id3 == cs3_id.id()
109-
assert id4 == cs4_id.id()
110-
111-
cs5_id = nanoeigenpy.ComplexSchur(A, True)
112-
cs6_id = nanoeigenpy.ComplexSchur(A, False)
113-
id5 = cs5_id.id()
114-
id6 = cs6_id.id()
115-
assert id5 != id6
116-
assert id5 == cs5_id.id()
117-
assert id6 == cs6_id.id()

tests/test_generalized_eigen_solver.py

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,14 @@
77
B = rng.random((dim, dim))
88
B = (B + B.T) * 0.5 + np.diag(10.0 + rng.random(dim))
99

10-
ges = nanoeigenpy.GeneralizedEigenSolver()
11-
ges_size = nanoeigenpy.GeneralizedEigenSolver(dim)
1210
ges_matrices = nanoeigenpy.GeneralizedEigenSolver(A, B)
1311
assert ges_matrices.info() == nanoeigenpy.ComputationInfo.Success
1412

15-
ges_with_vectors = nanoeigenpy.GeneralizedEigenSolver(A, B, True)
16-
assert ges_with_vectors.info() == nanoeigenpy.ComputationInfo.Success
17-
18-
ges_without_vectors = nanoeigenpy.GeneralizedEigenSolver(A, B, False)
19-
assert ges_without_vectors.info() == nanoeigenpy.ComputationInfo.Success
20-
2113
alphas = ges_matrices.alphas()
2214
betas = ges_matrices.betas()
2315
eigenvectors = ges_matrices.eigenvectors()
2416
eigenvalues = ges_matrices.eigenvalues()
2517

26-
assert alphas.shape == (dim,)
27-
assert betas.shape == (dim,)
28-
assert eigenvectors.shape == (dim, dim)
29-
assert eigenvalues.shape == (dim,)
30-
3118
for k in range(dim):
3219
v = eigenvectors[:, k]
3320
lambda_k = eigenvalues[k]
@@ -51,66 +38,3 @@
5138
if abs(betas[k]) > 1e-12:
5239
expected_eigenvalue = alphas[k] / betas[k]
5340
assert abs(eigenvalues[k] - expected_eigenvalue) < 1e-12
54-
55-
ges_compute = nanoeigenpy.GeneralizedEigenSolver()
56-
result = ges_compute.compute(A, B, False)
57-
assert result.info() == nanoeigenpy.ComputationInfo.Success
58-
alphas_only = ges_compute.alphas()
59-
betas_only = ges_compute.betas()
60-
eigenvalues_only = ges_compute.eigenvalues()
61-
62-
result_with_vectors = ges_compute.compute(A, B, True)
63-
assert result_with_vectors.info() == nanoeigenpy.ComputationInfo.Success
64-
eigenvectors_computed = ges_compute.eigenvectors()
65-
66-
ges_default = nanoeigenpy.GeneralizedEigenSolver()
67-
result_default = ges_default.compute(A, B)
68-
assert result_default.info() == nanoeigenpy.ComputationInfo.Success
69-
70-
ges_iter = nanoeigenpy.GeneralizedEigenSolver(A, B)
71-
ges_iter.setMaxIterations(100)
72-
ges_iter.setMaxIterations(200)
73-
74-
A1 = rng.random((dim, dim))
75-
B1 = rng.random((dim, dim))
76-
spdA = A.T @ A + A1.T @ A1
77-
spdB = B.T @ B + B1.T @ B1
78-
79-
ges_spd = nanoeigenpy.GeneralizedEigenSolver(spdA, spdB)
80-
assert ges_spd.info() == nanoeigenpy.ComputationInfo.Success
81-
82-
spd_eigenvalues = ges_spd.eigenvalues()
83-
max_imag = np.max(np.abs(spd_eigenvalues.imag))
84-
assert max_imag < 1e-10
85-
86-
ges1 = nanoeigenpy.GeneralizedEigenSolver()
87-
ges2 = nanoeigenpy.GeneralizedEigenSolver()
88-
id1 = ges1.id()
89-
id2 = ges2.id()
90-
assert id1 != id2
91-
assert id1 == ges1.id()
92-
assert id2 == ges2.id()
93-
94-
ges3 = nanoeigenpy.GeneralizedEigenSolver(dim)
95-
ges4 = nanoeigenpy.GeneralizedEigenSolver(dim)
96-
id3 = ges3.id()
97-
id4 = ges4.id()
98-
assert id3 != id4
99-
assert id3 == ges3.id()
100-
assert id4 == ges4.id()
101-
102-
ges5 = nanoeigenpy.GeneralizedEigenSolver(A, B)
103-
ges6 = nanoeigenpy.GeneralizedEigenSolver(A, B)
104-
id5 = ges5.id()
105-
id6 = ges6.id()
106-
assert id5 != id6
107-
assert id5 == ges5.id()
108-
assert id6 == ges6.id()
109-
110-
ges7 = nanoeigenpy.GeneralizedEigenSolver(A, B, True)
111-
ges8 = nanoeigenpy.GeneralizedEigenSolver(A, B, False)
112-
id7 = ges7.id()
113-
id8 = ges8.id()
114-
assert id7 != id8
115-
assert id7 == ges7.id()
116-
assert id8 == ges8.id()

tests/test_generalized_self_adjoint_eigen_solver.py

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -78,44 +78,6 @@ def test_generalized_selfadjoint_eigensolver(options):
7878
rank = len([d for d in D if abs(d) > 1e-12])
7979
assert rank <= dim
8080

81-
decomp1 = nanoeigenpy.GeneralizedSelfAdjointEigenSolver()
82-
decomp2 = nanoeigenpy.GeneralizedSelfAdjointEigenSolver()
83-
id1 = decomp1.id()
84-
id2 = decomp2.id()
85-
assert id1 != id2
86-
assert id1 == decomp1.id()
87-
assert id2 == decomp2.id()
88-
89-
decomp3 = nanoeigenpy.GeneralizedSelfAdjointEigenSolver(dim)
90-
decomp4 = nanoeigenpy.GeneralizedSelfAdjointEigenSolver(dim)
91-
id3 = decomp3.id()
92-
id4 = decomp4.id()
93-
assert id3 != id4
94-
assert id3 == decomp3.id()
95-
assert id4 == decomp4.id()
96-
97-
decomp5 = nanoeigenpy.GeneralizedSelfAdjointEigenSolver(A, B, options)
98-
decomp6 = nanoeigenpy.GeneralizedSelfAdjointEigenSolver(A, B, options)
99-
id5 = decomp5.id()
100-
id6 = decomp6.id()
101-
assert id5 != id6
102-
assert id5 == decomp5.id()
103-
assert id6 == decomp6.id()
104-
105-
if compute_eigenvectors and (
106-
options & nanoeigenpy.DecompositionOptions.Ax_lBx.value
107-
):
108-
A_pos = A @ A.T + np.eye(dim)
109-
gsaes_pos = nanoeigenpy.GeneralizedSelfAdjointEigenSolver(A_pos, B, options)
110-
assert gsaes_pos.info() == nanoeigenpy.ComputationInfo.Success
111-
112-
D_pos = gsaes_pos.eigenvalues()
113-
if all(D_pos[i] > 1e-12 for i in range(dim)):
114-
sqrt_matrix = gsaes_pos.operatorSqrt()
115-
inv_sqrt_matrix = gsaes_pos.operatorInverseSqrt()
116-
assert sqrt_matrix.shape == (dim, dim)
117-
assert inv_sqrt_matrix.shape == (dim, dim)
118-
11981

12082
if __name__ == "__main__":
12183
import sys

tests/test_iterative_solvers.py

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@
1212
nanoeigenpy.solvers.LeastSquaresConjugateGradient,
1313
nanoeigenpy.solvers.IdentityLeastSquaresConjugateGradient,
1414
nanoeigenpy.solvers.DiagonalLeastSquaresConjugateGradient,
15-
nanoeigenpy.solvers.MINRES,
16-
nanoeigenpy.solvers.IdentityBiCGSTAB,
17-
]
18-
19-
_classes_bis = [
20-
nanoeigenpy.solvers.DiagonalMINRES,
21-
nanoeigenpy.solvers.BiCGSTAB,
2215
]
2316

2417

@@ -66,50 +59,6 @@ def test_solver_with_guess(cls):
6659
assert nanoeigenpy.is_approx(B, A.dot(X_est), 1e-6)
6760

6861

69-
@pytest.mark.parametrize("cls", _classes_bis)
70-
def test_solver_bis(cls):
71-
Q = rng.standard_normal((dim, dim))
72-
A = Q.T @ Q + np.eye(dim) * 0.1
73-
solver = cls(A)
74-
solver.setMaxIterations(MAX_ITER)
75-
76-
x = rng.random(dim)
77-
b = A.dot(x)
78-
x_est = solver.solve(b)
79-
80-
assert solver.info() == nanoeigenpy.ComputationInfo.Success
81-
assert nanoeigenpy.is_approx(b, A.dot(x_est), 1e-6)
82-
83-
X = rng.random((dim, 20))
84-
B = A.dot(X)
85-
X_est = solver.solve(B)
86-
87-
assert nanoeigenpy.is_approx(B, A.dot(X_est), 1e-6)
88-
89-
90-
@pytest.mark.parametrize("cls", _classes_bis)
91-
def test_solver_with_guess_bis(cls):
92-
Q = rng.standard_normal((dim, dim))
93-
A = Q.T @ Q + np.eye(dim) * 0.1
94-
solver = cls(A)
95-
solver.setMaxIterations(MAX_ITER)
96-
97-
x = rng.random(dim)
98-
b = A.dot(x)
99-
x_est = solver.solveWithGuess(b, x + 0.01)
100-
101-
assert solver.info() == nanoeigenpy.ComputationInfo.Success
102-
assert nanoeigenpy.is_approx(x, x_est, 1e-6)
103-
assert nanoeigenpy.is_approx(b, A.dot(x_est), 1e-6)
104-
105-
X = rng.random((dim, 20))
106-
B = A.dot(X)
107-
X_est = solver.solveWithGuess(B, X + 0.01)
108-
109-
assert nanoeigenpy.is_approx(X, X_est, 1e-6)
110-
assert nanoeigenpy.is_approx(B, A.dot(X_est), 1e-6)
111-
112-
11362
if __name__ == "__main__":
11463
import sys
11564

0 commit comments

Comments
 (0)