Skip to content

Commit 01d7a96

Browse files
committed
MAINT: add comparison against our implementation in SLEPC comparison script.
1 parent 5e46eaa commit 01d7a96

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

scripts/compare-against-arpack.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,21 @@
22
import argparse
33
import os.path
44
import sys
5-
import time
65

76
import numpy as np
87

98
import scipy.io
109
import scipy.sparse as sp
1110

1211
from scipy.linalg import toeplitz
13-
from scipy.sparse.linalg import LinearOperator
14-
15-
from arnoldi.utils import arg_largest_magnitude, arg_largest_real
1612

1713

1814
HERE = os.path.dirname(__file__)
1915
sys.path.insert(0, HERE)
2016

17+
# ruff: noqa: E402
2118
from utils import (
22-
WHICH_TO_SORT, EigensolverParameters, MatvecCounter, arnoldi_py_eig, arpack_eig,
19+
WHICH_TO_SORT, EigensolverParameters, arnoldi_py_eig, arpack_eig,
2320
find_best_matching, load_suitesparse_mat, print_residuals
2421
)
2522

scripts/compare-against-slepc.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,17 @@
2222
import argparse
2323
import os.path
2424
import sys
25-
import time
2625

2726
import numpy as np
28-
import scipy.sparse as sp
29-
3027

28+
# ruff: noqa: E402
3129
HERE = os.path.dirname(__file__)
3230
sys.path.insert(0, HERE)
3331

3432
from utils import (
35-
WHICH_TO_SORT_SLEPC, ConvergenceTracker, EigensolverParameters, Statistics,
36-
load_suitesparse_mat, slepc_eig, print_residuals,
33+
WHICH_TO_SORT_SLEPC, ConvergenceTracker, EigensolverParameters,
34+
find_best_matching, load_suitesparse_mat, slepc_eig, print_residuals,
35+
arnoldi_py_eig,
3736
)
3837

3938

@@ -97,6 +96,20 @@ def main():
9796
print(f" BVMultVec (w-=V*c): {stats.count_multivec}")
9897
print(f" DSSolve (restart): {stats.count_ds_solve}")
9998

99+
print(f"\n--- Running partial_schur (p = {parameters.p}) ---")
100+
ps_vals, ps_vecs, ps_stats = arnoldi_py_eig(A, parameters)
101+
print(f" matvecs={ps_stats.matvecs}, elapsed={ps_stats.elapsed:.2f}s for {ps_stats.restarts} iterations")
102+
print_residuals("Krylov-Schur", A, ps_vals, ps_vecs)
103+
104+
print(f"\n--- Perf comparison ---")
105+
print(f" SLEPC: {stats.matvecs} matvecs in {stats.restarts} iterations ({stats.elapsed:.2f}s)")
106+
print(f" partial_schur: {ps_stats.matvecs} matvecs in {ps_stats.restarts} iterations ({ps_stats.elapsed:.2f}s)")
107+
108+
# Ensure the eigenvalues match. This check + ensure normalized residuals
109+
# are close to 0 should be enough to ensure the output is correct.
110+
x, y = find_best_matching(vals, ps_vals)
111+
np.testing.assert_allclose(x, y, rtol=args.tol)
112+
100113

101114
if __name__ == "__main__":
102115
main()

0 commit comments

Comments
 (0)