Skip to content

Commit 4996734

Browse files
committed
is_approx: Put is_approx and set the precision
1 parent bede0bf commit 4996734

File tree

8 files changed

+58
-55
lines changed

8 files changed

+58
-55
lines changed

include/eigenpy/decompositions/SelfAdjointEigenSolver.hpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct SelfAdjointEigenSolverVisitor
2121
typedef _MatrixType MatrixType;
2222
typedef typename MatrixType::Scalar Scalar;
2323
typedef Eigen::SelfAdjointEigenSolver<MatrixType> Solver;
24+
typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> VectorType;
2425

2526
template <class PyClass>
2627
void visit(PyClass& cl) const {
@@ -32,12 +33,16 @@ struct SelfAdjointEigenSolverVisitor
3233
bp::args("self", "matrix", "options"),
3334
"Computes eigendecomposition of given matrix"))
3435

35-
.def("eigenvalues", &Solver::eigenvalues, bp::arg("self"),
36-
"Returns the eigenvalues of given matrix.",
37-
bp::return_internal_reference<>())
38-
.def("eigenvectors", &Solver::eigenvectors, bp::arg("self"),
39-
"Returns the eigenvectors of given matrix.",
40-
bp::return_internal_reference<>())
36+
.def(
37+
"eigenvalues",
38+
+[](Solver& c) -> const VectorType& { return c.eigenvalues(); },
39+
"Returns the eigenvalues of given matrix.",
40+
bp::return_internal_reference<>())
41+
.def(
42+
"eigenvectors",
43+
+[](Solver& c) -> const MatrixType& { return c.eigenvectors(); },
44+
"Returns the eigenvectors of given matrix.",
45+
bp::return_internal_reference<>())
4146

4247
.def("compute",
4348
&SelfAdjointEigenSolverVisitor::compute_proxy<MatrixType>,

unittest/python/test_ComplexSchur.py

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

1515
A_complex = A.astype(complex)
16-
assert eigenpy.is_approx(A_complex, U @ T @ U.conj().T, 1e-10)
17-
assert eigenpy.is_approx(U @ U.conj().T, np.eye(dim), 1e-10)
16+
assert eigenpy.is_approx(A_complex, U @ T @ U.conj().T)
17+
assert eigenpy.is_approx(U @ U.conj().T, np.eye(dim))
1818

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

36-
assert eigenpy.is_approx(T1, T2, 1e-12)
37-
assert eigenpy.is_approx(U1, U2, 1e-12)
36+
assert eigenpy.is_approx(T1, T2)
37+
assert eigenpy.is_approx(U1, U2)
3838

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

43-
assert eigenpy.is_approx(T, T_no_u, 1e-12)
43+
assert eigenpy.is_approx(T, T_no_u)
4444

4545
cs_compute_no_u = eigenpy.ComplexSchur(dim)
4646
result_no_u = cs_compute_no_u.compute(A, False)
4747
assert result_no_u.info() == eigenpy.ComputationInfo.Success
4848
T_compute_no_u = cs_compute_no_u.matrixT()
49-
assert eigenpy.is_approx(T, T_compute_no_u, 1e-12)
49+
assert eigenpy.is_approx(T, T_compute_no_u)
5050

5151
cs_iter = eigenpy.ComplexSchur(dim)
5252
cs_iter.setMaxIterations(30 * dim) # m_maxIterationsPerRow * size
@@ -56,8 +56,8 @@
5656

5757
T_iter = cs_iter.matrixT()
5858
U_iter = cs_iter.matrixU()
59-
assert eigenpy.is_approx(T, T_iter, 1e-12)
60-
assert eigenpy.is_approx(U, U_iter, 1e-12)
59+
assert eigenpy.is_approx(T, T_iter)
60+
assert eigenpy.is_approx(U, U_iter)
6161

6262
cs_few_iter = eigenpy.ComplexSchur(dim)
6363
cs_few_iter.setMaxIterations(1)
@@ -74,8 +74,8 @@
7474
U_triangular = cs_triangular.matrixU()
7575

7676
A_triangular_complex = A_triangular.astype(complex)
77-
assert eigenpy.is_approx(T_triangular, A_triangular_complex, 1e-10)
78-
assert eigenpy.is_approx(U_triangular, np.eye(dim, dtype=complex), 1e-10)
77+
assert eigenpy.is_approx(T_triangular, A_triangular_complex)
78+
assert eigenpy.is_approx(U_triangular, np.eye(dim, dtype=complex))
7979

8080
hess = eigenpy.HessenbergDecomposition(A)
8181
H = hess.matrixH()
@@ -89,9 +89,7 @@
8989
U_from_hess = cs_from_hess.matrixU()
9090

9191
A_complex = A.astype(complex)
92-
assert eigenpy.is_approx(
93-
A_complex, U_from_hess @ T_from_hess @ U_from_hess.conj().T, 1e-10
94-
)
92+
assert eigenpy.is_approx(A_complex, U_from_hess @ T_from_hess @ U_from_hess.conj().T)
9593

9694
cs1_id = eigenpy.ComplexSchur(dim)
9795
cs2_id = eigenpy.ComplexSchur(dim)

unittest/python/test_GeneralizedEigenSolver.py

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

3636
Av = A @ v
3737
lambda_Bv = lambda_k * (B @ v)
38-
assert eigenpy.is_approx(Av.real, lambda_Bv.real, 1e-10)
39-
assert eigenpy.is_approx(Av.imag, lambda_Bv.imag, 1e-10)
38+
assert eigenpy.is_approx(Av.real, lambda_Bv.real, 1e-6)
39+
assert eigenpy.is_approx(Av.imag, lambda_Bv.imag, 1e-6)
4040

4141
for k in range(dim):
4242
v = eigenvectors[:, k]
@@ -45,8 +45,8 @@
4545

4646
alpha_Bv = alpha * (B @ v)
4747
beta_Av = beta * (A @ v)
48-
assert eigenpy.is_approx(alpha_Bv.real, beta_Av.real, 1e-10)
49-
assert eigenpy.is_approx(alpha_Bv.imag, beta_Av.imag, 1e-10)
48+
assert eigenpy.is_approx(alpha_Bv.real, beta_Av.real, 1e-6)
49+
assert eigenpy.is_approx(alpha_Bv.imag, beta_Av.imag, 1e-6)
5050

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

unittest/python/test_GeneralizedSelfAdjointEigenSolver.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ def test_generalized_selfadjoint_eigensolver(options):
4545
lam = D[i]
4646
Av = A @ v
4747
lam_Bv = lam * (B @ v)
48-
assert eigenpy.is_approx(Av, lam_Bv, 1e-10)
48+
assert eigenpy.is_approx(Av, lam_Bv, 1e-6)
4949

5050
VT_B_V = V.T @ B @ V
51-
assert eigenpy.is_approx(VT_B_V, np.eye(dim), 1e-10)
51+
assert eigenpy.is_approx(VT_B_V, np.eye(dim), 1e-6)
5252

5353
elif options & eigenpy.DecompositionOptions.ABx_lx:
5454
AB = A @ B
@@ -57,7 +57,7 @@ def test_generalized_selfadjoint_eigensolver(options):
5757
lam = D[i]
5858
ABv = AB @ v
5959
lam_v = lam * v
60-
assert np.allclose(ABv, lam_v)
60+
assert eigenpy.is_approx(ABv, lam_v, 1e-6)
6161

6262
elif options & eigenpy.DecompositionOptions.BAx_lx:
6363
BA = B @ A
@@ -66,7 +66,7 @@ def test_generalized_selfadjoint_eigensolver(options):
6666
lam = D[i]
6767
BAv = BA @ v
6868
lam_v = lam * v
69-
assert np.allclose(BAv, lam_v)
69+
assert eigenpy.is_approx(BAv, lam_v, 1e-6)
7070

7171
_gsaes_compute = gsaes.compute(A, B)
7272
_gsaes_compute_options = gsaes.compute(A, B, options)

unittest/python/test_HessenbergDecomposition.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
A_reconstructed = Q @ H @ Q.conj().T
1616
else:
1717
A_reconstructed = Q @ H @ Q.T
18-
assert eigenpy.is_approx(A, A_reconstructed, 1e-10)
18+
assert eigenpy.is_approx(A, A_reconstructed)
1919

2020
for row in range(2, dim):
2121
for col in range(row - 1):
@@ -25,7 +25,7 @@
2525
QQ_conj = Q @ Q.conj().T
2626
else:
2727
QQ_conj = Q @ Q.T
28-
assert eigenpy.is_approx(QQ_conj, np.eye(dim), 1e-10)
28+
assert eigenpy.is_approx(QQ_conj, np.eye(dim))
2929

3030
A_test = rng.random((dim, dim))
3131
hess1 = eigenpy.HessenbergDecomposition(dim)
@@ -37,8 +37,8 @@
3737
Q1 = hess1.matrixQ()
3838
Q2 = hess2.matrixQ()
3939

40-
assert eigenpy.is_approx(H1, H2, 1e-12)
41-
assert eigenpy.is_approx(Q1, Q2, 1e-12)
40+
assert eigenpy.is_approx(H1, H2)
41+
assert eigenpy.is_approx(Q1, Q2)
4242

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

unittest/python/test_RealQZ.py

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

18-
assert eigenpy.is_approx(A, Q @ S @ Z, 1e-10)
19-
assert eigenpy.is_approx(B, Q @ T @ Z, 1e-10)
18+
assert eigenpy.is_approx(A, Q @ S @ Z)
19+
assert eigenpy.is_approx(B, Q @ T @ Z)
2020

21-
assert eigenpy.is_approx(Q @ Q.T, np.eye(dim), 1e-10)
22-
assert eigenpy.is_approx(Z @ Z.T, np.eye(dim), 1e-10)
21+
assert eigenpy.is_approx(Q @ Q.T, np.eye(dim))
22+
assert eigenpy.is_approx(Z @ Z.T, np.eye(dim))
2323

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

65-
assert eigenpy.is_approx(S_with, S_without, 1e-12)
66-
assert eigenpy.is_approx(T_with, T_without, 1e-12)
65+
assert eigenpy.is_approx(S_with, S_without)
66+
assert eigenpy.is_approx(T_with, T_without)
6767

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

unittest/python/test_RealSchur.py

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

33-
assert eigenpy.is_approx(A, U @ T @ U.T, 1e-10)
34-
assert eigenpy.is_approx(U @ U.T, np.eye(dim), 1e-10)
33+
assert eigenpy.is_approx(A, U @ T @ U.T)
34+
assert eigenpy.is_approx(U @ U.T, np.eye(dim))
3535

3636
verify_is_quasi_triangular(T)
3737

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

51-
assert eigenpy.is_approx(T1, T2, 1e-12)
52-
assert eigenpy.is_approx(U1, U2, 1e-12)
51+
assert eigenpy.is_approx(T1, T2)
52+
assert eigenpy.is_approx(U1, U2)
5353

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

58-
assert eigenpy.is_approx(T, T_no_u, 1e-12)
58+
assert eigenpy.is_approx(T, T_no_u)
5959

6060
rs_compute_no_u = eigenpy.RealSchur(dim)
6161
result_no_u = rs_compute_no_u.compute(A, False)
6262
assert result_no_u.info() == eigenpy.ComputationInfo.Success
6363
T_compute_no_u = rs_compute_no_u.matrixT()
64-
assert eigenpy.is_approx(T, T_compute_no_u, 1e-12)
64+
assert eigenpy.is_approx(T, T_compute_no_u)
6565

6666
rs_iter = eigenpy.RealSchur(dim)
6767
rs_iter.setMaxIterations(40 * dim) # m_maxIterationsPerRow * size
@@ -71,8 +71,8 @@ def verify_is_quasi_triangular(T):
7171

7272
T_iter = rs_iter.matrixT()
7373
U_iter = rs_iter.matrixU()
74-
assert eigenpy.is_approx(T, T_iter, 1e-12)
75-
assert eigenpy.is_approx(U, U_iter, 1e-12)
74+
assert eigenpy.is_approx(T, T_iter)
75+
assert eigenpy.is_approx(U, U_iter)
7676

7777
if dim > 2:
7878
rs_few_iter = eigenpy.RealSchur(dim)
@@ -89,8 +89,8 @@ def verify_is_quasi_triangular(T):
8989
T_triangular = rs_triangular.matrixT()
9090
U_triangular = rs_triangular.matrixU()
9191

92-
assert eigenpy.is_approx(T_triangular, A_triangular, 1e-10)
93-
assert eigenpy.is_approx(U_triangular, np.eye(dim), 1e-10)
92+
assert eigenpy.is_approx(T_triangular, A_triangular)
93+
assert eigenpy.is_approx(U_triangular, np.eye(dim))
9494

9595
hess = eigenpy.HessenbergDecomposition(A)
9696
H = hess.matrixH()
@@ -103,7 +103,7 @@ def verify_is_quasi_triangular(T):
103103
T_from_hess = rs_from_hess.matrixT()
104104
U_from_hess = rs_from_hess.matrixU()
105105

106-
assert eigenpy.is_approx(A, U_from_hess @ T_from_hess @ U_from_hess.T, 1e-10)
106+
assert eigenpy.is_approx(A, U_from_hess @ T_from_hess @ U_from_hess.T)
107107

108108
rs1_id = eigenpy.RealSchur(dim)
109109
rs2_id = eigenpy.RealSchur(dim)

unittest/python/test_Tridiagonalization.py

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

15-
assert eigenpy.is_approx(A, Q @ T @ Q.T, 1e-10)
16-
assert eigenpy.is_approx(Q @ Q.T, np.eye(dim), 1e-10)
15+
assert eigenpy.is_approx(A, Q @ T @ Q.T)
16+
assert eigenpy.is_approx(Q @ Q.T, np.eye(dim))
1717

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

23-
assert eigenpy.is_approx(T, T.T, 1e-12)
23+
assert eigenpy.is_approx(T, T.T)
2424

2525
diag = tri.diagonal()
2626
sub_diag = tri.subDiagonal()
@@ -43,8 +43,8 @@
4343
Q2 = tri2.matrixQ()
4444
T2 = tri2.matrixT()
4545

46-
assert eigenpy.is_approx(Q1, Q2, 1e-12)
47-
assert eigenpy.is_approx(T1, T2, 1e-12)
46+
assert eigenpy.is_approx(Q1, Q2)
47+
assert eigenpy.is_approx(T1, T2)
4848

4949
h_coeffs = tri.householderCoefficients()
5050
packed = tri.packedMatrix()
@@ -66,7 +66,7 @@
6666
Q_diag = tri_diag.matrixQ()
6767
T_diag = tri_diag.matrixT()
6868

69-
assert eigenpy.is_approx(A_diag, Q_diag @ T_diag @ Q_diag.T, 1e-10)
69+
assert eigenpy.is_approx(A_diag, Q_diag @ T_diag @ Q_diag.T)
7070
for i in range(dim):
7171
for j in range(dim):
7272
if i != j:
@@ -84,7 +84,7 @@
8484
Q_tridiag = tri_tridiag.matrixQ()
8585
T_tridiag = tri_tridiag.matrixT()
8686

87-
assert eigenpy.is_approx(A_tridiag, Q_tridiag @ T_tridiag @ Q_tridiag.T, 1e-10)
87+
assert eigenpy.is_approx(A_tridiag, Q_tridiag @ T_tridiag @ Q_tridiag.T)
8888

8989

9090
tri1_id = eigenpy.Tridiagonalization(dim)

0 commit comments

Comments
 (0)