Skip to content

Commit 2bd7c59

Browse files
committed
is_approx: Set precision as was proposed in eigenpy
1 parent 1e83941 commit 2bd7c59

9 files changed

+50
-50
lines changed

tests/test_complex_schur.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
T = cs.matrixT()
1313

1414
A_complex = A.astype(complex)
15-
assert nanoeigenpy.is_approx(A_complex, U @ T @ U.conj().T, 1e-10)
16-
assert nanoeigenpy.is_approx(U @ U.conj().T, np.eye(dim), 1e-10)
15+
assert nanoeigenpy.is_approx(A_complex, U @ T @ U.conj().T)
16+
assert nanoeigenpy.is_approx(U @ U.conj().T, np.eye(dim))
1717

1818
for row in range(1, dim):
1919
for col in range(row):
@@ -32,20 +32,20 @@
3232
T2 = cs2.matrixT()
3333
U2 = cs2.matrixU()
3434

35-
assert nanoeigenpy.is_approx(T1, T2, 1e-12)
36-
assert nanoeigenpy.is_approx(U1, U2, 1e-12)
35+
assert nanoeigenpy.is_approx(T1, T2)
36+
assert nanoeigenpy.is_approx(U1, U2)
3737

3838
cs_no_u = nanoeigenpy.ComplexSchur(A, False)
3939
assert cs_no_u.info() == nanoeigenpy.ComputationInfo.Success
4040
T_no_u = cs_no_u.matrixT()
4141

42-
assert nanoeigenpy.is_approx(T, T_no_u, 1e-12)
42+
assert nanoeigenpy.is_approx(T, T_no_u)
4343

4444
cs_compute_no_u = nanoeigenpy.ComplexSchur(dim)
4545
result_no_u = cs_compute_no_u.compute(A, False)
4646
assert result_no_u.info() == nanoeigenpy.ComputationInfo.Success
4747
T_compute_no_u = cs_compute_no_u.matrixT()
48-
assert nanoeigenpy.is_approx(T, T_compute_no_u, 1e-12)
48+
assert nanoeigenpy.is_approx(T, T_compute_no_u)
4949

5050
cs_iter = nanoeigenpy.ComplexSchur(dim)
5151
cs_iter.setMaxIterations(30 * dim) # m_maxIterationsPerRow * size
@@ -55,8 +55,8 @@
5555

5656
T_iter = cs_iter.matrixT()
5757
U_iter = cs_iter.matrixU()
58-
assert nanoeigenpy.is_approx(T, T_iter, 1e-12)
59-
assert nanoeigenpy.is_approx(U, U_iter, 1e-12)
58+
assert nanoeigenpy.is_approx(T, T_iter)
59+
assert nanoeigenpy.is_approx(U, U_iter)
6060

6161
cs_few_iter = nanoeigenpy.ComplexSchur(dim)
6262
cs_few_iter.setMaxIterations(1)
@@ -73,8 +73,8 @@
7373
U_triangular = cs_triangular.matrixU()
7474

7575
A_triangular_complex = A_triangular.astype(complex)
76-
assert nanoeigenpy.is_approx(T_triangular, A_triangular_complex, 1e-10)
77-
assert nanoeigenpy.is_approx(U_triangular, np.eye(dim, dtype=complex), 1e-10)
76+
assert nanoeigenpy.is_approx(T_triangular, A_triangular_complex)
77+
assert nanoeigenpy.is_approx(U_triangular, np.eye(dim, dtype=complex))
7878

7979
hess = nanoeigenpy.HessenbergDecomposition(A)
8080
H = hess.matrixH()
@@ -89,7 +89,7 @@
8989

9090
A_complex = A.astype(complex)
9191
assert nanoeigenpy.is_approx(
92-
A_complex, U_from_hess @ T_from_hess @ U_from_hess.conj().T, 1e-10
92+
A_complex, U_from_hess @ T_from_hess @ U_from_hess.conj().T
9393
)
9494

9595
cs1_id = nanoeigenpy.ComplexSchur(dim)

tests/test_full_piv_lu.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
kernel = fullpivlu.kernel()
5858
image = fullpivlu.image(A)
5959
assert kernel.shape[1] == 1
60-
assert nanoeigenpy.is_approx(A @ kernel, np.zeros((dim, 1)), 1e-10)
60+
assert nanoeigenpy.is_approx(A @ kernel, np.zeros((dim, 1)))
6161
assert image.shape[1] == rank
6262

6363
inverse = fullpivlu.inverse()

tests/test_generalized_eigen_solver.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434

3535
Av = A @ v
3636
lambda_Bv = lambda_k * (B @ v)
37-
assert nanoeigenpy.is_approx(Av.real, lambda_Bv.real, 1e-10)
38-
assert nanoeigenpy.is_approx(Av.imag, lambda_Bv.imag, 1e-10)
37+
assert nanoeigenpy.is_approx(Av.real, lambda_Bv.real, 1e-6)
38+
assert nanoeigenpy.is_approx(Av.imag, lambda_Bv.imag, 1e-6)
3939

4040
for k in range(dim):
4141
v = eigenvectors[:, k]
@@ -44,8 +44,8 @@
4444

4545
alpha_Bv = alpha * (B @ v)
4646
beta_Av = beta * (A @ v)
47-
assert nanoeigenpy.is_approx(alpha_Bv.real, beta_Av.real, 1e-10)
48-
assert nanoeigenpy.is_approx(alpha_Bv.imag, beta_Av.imag, 1e-10)
47+
assert nanoeigenpy.is_approx(alpha_Bv.real, beta_Av.real, 1e-6)
48+
assert nanoeigenpy.is_approx(alpha_Bv.imag, beta_Av.imag, 1e-6)
4949

5050
for k in range(dim):
5151
if abs(betas[k]) > 1e-12:

tests/test_generalized_self_adjoint_eigen_solver.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
@pytest.mark.parametrize("options", _options)
2222
def test_generalized_selfadjoint_eigensolver(options):
23-
dim = 5
23+
dim = 100
2424
rng = np.random.default_rng()
2525
A = rng.random((dim, dim))
2626
A = (A + A.T) * 0.5
@@ -49,10 +49,10 @@ def test_generalized_selfadjoint_eigensolver(options):
4949
lam = D[i]
5050
Av = A @ v
5151
lam_Bv = lam * (B @ v)
52-
assert nanoeigenpy.is_approx(Av, lam_Bv, 1e-10)
52+
assert nanoeigenpy.is_approx(Av, lam_Bv, 1e-6)
5353

5454
VT_B_V = V.T @ B @ V
55-
assert nanoeigenpy.is_approx(VT_B_V, np.eye(dim), 1e-10)
55+
assert nanoeigenpy.is_approx(VT_B_V, np.eye(dim), 1e-6)
5656

5757
elif options & nanoeigenpy.DecompositionOptions.ABx_lx.value:
5858
AB = A @ B
@@ -61,7 +61,7 @@ def test_generalized_selfadjoint_eigensolver(options):
6161
lam = D[i]
6262
ABv = AB @ v
6363
lam_v = lam * v
64-
assert nanoeigenpy.is_approx(ABv, lam_v, 1e-10)
64+
assert nanoeigenpy.is_approx(ABv, lam_v, 1e-6)
6565

6666
elif options & nanoeigenpy.DecompositionOptions.BAx_lx.value:
6767
BA = B @ A
@@ -70,7 +70,7 @@ def test_generalized_selfadjoint_eigensolver(options):
7070
lam = D[i]
7171
BAv = BA @ v
7272
lam_v = lam * v
73-
assert nanoeigenpy.is_approx(BAv, lam_v, 1e-10)
73+
assert nanoeigenpy.is_approx(BAv, lam_v, 1e-6)
7474

7575
_gsaes_compute = gsaes.compute(A, B)
7676
_gsaes_compute_options = gsaes.compute(A, B, options)

tests/test_hessenberg_decomposition.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
A_reconstructed = Q @ H @ Q.conj().T
1515
else:
1616
A_reconstructed = Q @ H @ Q.T
17-
assert nanoeigenpy.is_approx(A, A_reconstructed, 1e-10)
17+
assert nanoeigenpy.is_approx(A, A_reconstructed)
1818

1919
for row in range(2, dim):
2020
for col in range(row - 1):
@@ -24,7 +24,7 @@
2424
QQ_conj = Q @ Q.conj().T
2525
else:
2626
QQ_conj = Q @ Q.T
27-
assert nanoeigenpy.is_approx(QQ_conj, np.eye(dim), 1e-10)
27+
assert nanoeigenpy.is_approx(QQ_conj, np.eye(dim))
2828

2929
A_test = rng.random((dim, dim))
3030
hess1 = nanoeigenpy.HessenbergDecomposition(dim)
@@ -36,8 +36,8 @@
3636
Q1 = hess1.matrixQ()
3737
Q2 = hess2.matrixQ()
3838

39-
assert nanoeigenpy.is_approx(H1, H2, 1e-12)
40-
assert nanoeigenpy.is_approx(Q1, Q2, 1e-12)
39+
assert nanoeigenpy.is_approx(H1, H2)
40+
assert nanoeigenpy.is_approx(Q1, Q2)
4141

4242
hCoeffs = hess.householderCoefficients()
4343
packed = hess.packedMatrix()

tests/test_real_qz.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
Z = realqz.matrixZ()
1515
T = realqz.matrixT()
1616

17-
assert nanoeigenpy.is_approx(A, Q @ S @ Z, 1e-10)
18-
assert nanoeigenpy.is_approx(B, Q @ T @ Z, 1e-10)
17+
assert nanoeigenpy.is_approx(A, Q @ S @ Z)
18+
assert nanoeigenpy.is_approx(B, Q @ T @ Z)
1919

20-
assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim), 1e-10)
21-
assert nanoeigenpy.is_approx(Z @ Z.T, np.eye(dim), 1e-10)
20+
assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim))
21+
assert nanoeigenpy.is_approx(Z @ Z.T, np.eye(dim))
2222

2323
for i in range(dim):
2424
for j in range(i):
@@ -61,8 +61,8 @@
6161
S_without = realqz_without_qz.matrixS()
6262
T_without = realqz_without_qz.matrixT()
6363

64-
assert nanoeigenpy.is_approx(S_with, S_without, 1e-12)
65-
assert nanoeigenpy.is_approx(T_with, T_without, 1e-12)
64+
assert nanoeigenpy.is_approx(S_with, S_without)
65+
assert nanoeigenpy.is_approx(T_with, T_without)
6666

6767
iterations = realqz.iterations()
6868
assert iterations >= 0

tests/test_real_schur.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ def verify_is_quasi_triangular(T):
2929
U = rs.matrixU()
3030
T = rs.matrixT()
3131

32-
assert nanoeigenpy.is_approx(A, U @ T @ U.T, 1e-10)
33-
assert nanoeigenpy.is_approx(U @ U.T, np.eye(dim), 1e-10)
32+
assert nanoeigenpy.is_approx(A, U @ T @ U.T)
33+
assert nanoeigenpy.is_approx(U @ U.T, np.eye(dim))
3434

3535
verify_is_quasi_triangular(T)
3636

@@ -47,20 +47,20 @@ def verify_is_quasi_triangular(T):
4747
T2 = rs2.matrixT()
4848
U2 = rs2.matrixU()
4949

50-
assert nanoeigenpy.is_approx(T1, T2, 1e-12)
51-
assert nanoeigenpy.is_approx(U1, U2, 1e-12)
50+
assert nanoeigenpy.is_approx(T1, T2)
51+
assert nanoeigenpy.is_approx(U1, U2)
5252

5353
rs_no_u = nanoeigenpy.RealSchur(A, False)
5454
assert rs_no_u.info() == nanoeigenpy.ComputationInfo.Success
5555
T_no_u = rs_no_u.matrixT()
5656

57-
assert nanoeigenpy.is_approx(T, T_no_u, 1e-12)
57+
assert nanoeigenpy.is_approx(T, T_no_u)
5858

5959
rs_compute_no_u = nanoeigenpy.RealSchur(dim)
6060
result_no_u = rs_compute_no_u.compute(A, False)
6161
assert result_no_u.info() == nanoeigenpy.ComputationInfo.Success
6262
T_compute_no_u = rs_compute_no_u.matrixT()
63-
assert nanoeigenpy.is_approx(T, T_compute_no_u, 1e-12)
63+
assert nanoeigenpy.is_approx(T, T_compute_no_u)
6464

6565
rs_iter = nanoeigenpy.RealSchur(dim)
6666
rs_iter.setMaxIterations(40 * dim) # m_maxIterationsPerRow * size
@@ -70,8 +70,8 @@ def verify_is_quasi_triangular(T):
7070

7171
T_iter = rs_iter.matrixT()
7272
U_iter = rs_iter.matrixU()
73-
assert nanoeigenpy.is_approx(T, T_iter, 1e-12)
74-
assert nanoeigenpy.is_approx(U, U_iter, 1e-12)
73+
assert nanoeigenpy.is_approx(T, T_iter)
74+
assert nanoeigenpy.is_approx(U, U_iter)
7575

7676
if dim > 2:
7777
rs_few_iter = nanoeigenpy.RealSchur(dim)
@@ -88,8 +88,8 @@ def verify_is_quasi_triangular(T):
8888
T_triangular = rs_triangular.matrixT()
8989
U_triangular = rs_triangular.matrixU()
9090

91-
assert nanoeigenpy.is_approx(T_triangular, A_triangular, 1e-10)
92-
assert nanoeigenpy.is_approx(U_triangular, np.eye(dim), 1e-10)
91+
assert nanoeigenpy.is_approx(T_triangular, A_triangular)
92+
assert nanoeigenpy.is_approx(U_triangular, np.eye(dim))
9393

9494
hess = nanoeigenpy.HessenbergDecomposition(A)
9595
H = hess.matrixH()
@@ -102,7 +102,7 @@ def verify_is_quasi_triangular(T):
102102
T_from_hess = rs_from_hess.matrixT()
103103
U_from_hess = rs_from_hess.matrixU()
104104

105-
assert nanoeigenpy.is_approx(A, U_from_hess @ T_from_hess @ U_from_hess.T, 1e-10)
105+
assert nanoeigenpy.is_approx(A, U_from_hess @ T_from_hess @ U_from_hess.T)
106106

107107
rs1_id = nanoeigenpy.RealSchur(dim)
108108
rs2_id = nanoeigenpy.RealSchur(dim)

tests/test_self_adjoint_eigen_solver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@
1717
AdotV = A @ V
1818
VdotD = V @ np.diag(D)
1919

20-
assert nanoeigenpy.is_approx(AdotV, VdotD, 1e-10)
20+
assert nanoeigenpy.is_approx(AdotV, VdotD, 1e-6)

tests/test_tridiagonalization.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
Q = tri.matrixQ()
1212
T = tri.matrixT()
1313

14-
assert nanoeigenpy.is_approx(A, Q @ T @ Q.T, 1e-10)
15-
assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim), 1e-10)
14+
assert nanoeigenpy.is_approx(A, Q @ T @ Q.T)
15+
assert nanoeigenpy.is_approx(Q @ Q.T, np.eye(dim))
1616

1717
for i in range(dim):
1818
for j in range(dim):
1919
if abs(i - j) > 1:
2020
assert abs(T[i, j]) < 1e-12
2121

22-
assert nanoeigenpy.is_approx(T, T.T, 1e-12)
22+
assert nanoeigenpy.is_approx(T, T.T)
2323

2424
diag = tri.diagonal()
2525
sub_diag = tri.subDiagonal()
@@ -42,8 +42,8 @@
4242
Q2 = tri2.matrixQ()
4343
T2 = tri2.matrixT()
4444

45-
assert nanoeigenpy.is_approx(Q1, Q2, 1e-12)
46-
assert nanoeigenpy.is_approx(T1, T2, 1e-12)
45+
assert nanoeigenpy.is_approx(Q1, Q2)
46+
assert nanoeigenpy.is_approx(T1, T2)
4747

4848
h_coeffs = tri.householderCoefficients()
4949
packed = tri.packedMatrix()
@@ -65,7 +65,7 @@
6565
Q_diag = tri_diag.matrixQ()
6666
T_diag = tri_diag.matrixT()
6767

68-
assert nanoeigenpy.is_approx(A_diag, Q_diag @ T_diag @ Q_diag.T, 1e-10)
68+
assert nanoeigenpy.is_approx(A_diag, Q_diag @ T_diag @ Q_diag.T)
6969
for i in range(dim):
7070
for j in range(dim):
7171
if i != j:
@@ -83,7 +83,7 @@
8383
Q_tridiag = tri_tridiag.matrixQ()
8484
T_tridiag = tri_tridiag.matrixT()
8585

86-
assert nanoeigenpy.is_approx(A_tridiag, Q_tridiag @ T_tridiag @ Q_tridiag.T, 1e-10)
86+
assert nanoeigenpy.is_approx(A_tridiag, Q_tridiag @ T_tridiag @ Q_tridiag.T)
8787

8888

8989
tri1_id = nanoeigenpy.Tridiagonalization(dim)

0 commit comments

Comments
 (0)