Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
"""
Generate all test cases for primme.svds with csr and LinearOperator matrix types.
"""
n = 10
for dtype in (np.float64, np.complex64):
A = Lauchli_like(n*2, n, dtype=dtype)
svl, sva, svr = np.linalg.svd(A, full_matrices=False)
sigma0 = sva[0]*.51 + sva[-1]*.49
for op in ((lambda x : x), csr_matrix, aslinearoperator):
which, sigma = 'SM', 0
prec = sqr_diagonal_prec(A, sigma)
k = 2
case_desc = ("A=%s(%d, %s), k=%d, M=%s, which=%s" %
("Lauchli_like_vert", n, dtype, k, bool(prec), which))
yield (svds_check, svds, op(A), k, prec, which, 1e-5, sva, dtype, case_desc, False)
def test_return_stats():
A, _ = diagonal(100)
evals, evecs, stats = primme.eigsh(A, 3, tol=1e-6, which='LA',
return_stats=True, return_history=True)
assert(stats["hist"]["numMatvecs"])
svecs_left, svals, svecs_right, stats = primme.svds(A, 3, tol=1e-6,
which='SM', return_stats=True, return_history=True)
assert(stats["hist"]["numMatvecs"])
print(stats["elapsedTime"], stats["numMatvecs"])
# Compute the square diagonal preconditioner
prec = scipy.sparse.spdiags(np.reciprocal(A.multiply(A).sum(axis=0)),
[0], 100, 100)
# Recompute the singular values but using the preconditioner
svecs_left, svals, svecs_right, stats = primme.svds(A, 3, which='SM', tol=1e-6,
precAHA=prec, return_stats=True)
assert_allclose(svals, A_svals, atol=1e-6*100)
print(stats["elapsedTime"], stats["numMatvecs"])
# Estimation of the smallest singular value
def convtest_sm(sval, svecl, svecr, rnorm):
return sval > 0.1 * rnorm
svec_left, sval, svec_right, stats = primme.svds(A, 1, which='SM',
convtest=convtest_sm, return_stats=True)
assert_allclose(sval, [ 1.], atol=.1)
# User-defined matvec: implicit rectangular matrix with nonzero elements on the diagonal only
Bdiag = np.arange(0, 100).reshape((100,1))
Bdiagr = np.concatenate((np.arange(0, 100).reshape((100,1)).astype(np.float32), np.zeros((100,1), dtype=np.float32)), axis=None).reshape((200,1))
def Bmatmat(x):
if len(x.shape) == 1: x = x.reshape((100,1))
return np.vstack((Bdiag * x, np.zeros((100, x.shape[1]), dtype=np.float32)))
def Brmatmat(x):
if len(x.shape) == 1: x = x.reshape((200,1))
return (Bdiagr * x)[0:100,:]
B = scipy.sparse.linalg.LinearOperator((200,100), matvec=Bmatmat, matmat=Bmatmat, rmatvec=Brmatmat, dtype=np.float32)
svecs_left, svals, svecs_right = primme.svds(B, 3, which='LM', tol=1e-6)
assert_allclose(svals, [ 99., 98., 97.], atol=1e-6*100)
# Sparse rectangular matrix 100x10 with non-zeros on the main diagonal
A = scipy.sparse.spdiags(range(10), [0], 100, 10)
# Compute the three closest to 4.1 singular values and the left and right corresponding
# singular vectors
svecs_left, svals, svecs_right = primme.svds(A, 3, tol=1e-6, which=4.1)
assert_allclose(sorted(svals), [ 3., 4., 5.], atol=1e-6*10)
print(svals) # [ 4., 5., 3.]
# Sparse random rectangular matrix 10^5x100
A = scipy.sparse.rand(10000, 100, density=0.001, random_state=10)
# Compute the three closest singular values to 6.0 with a tolerance of 1e-6
svecs_left, svals, svecs_right, stats = primme.svds(A, 3, which='SM', tol=1e-6,
return_stats=True)
A_svals = svals
print(svals)
print(stats["elapsedTime"], stats["numMatvecs"])
# Compute the square diagonal preconditioner
prec = scipy.sparse.spdiags(np.reciprocal(A.multiply(A).sum(axis=0)),
[0], 100, 100)
# Recompute the singular values but using the preconditioner
svecs_left, svals, svecs_right, stats = primme.svds(A, 3, which='SM', tol=1e-6,
precAHA=prec, return_stats=True)
assert_allclose(svals, A_svals, atol=1e-6*100)
print(stats["elapsedTime"], stats["numMatvecs"])
# Estimation of the smallest singular value
assert_allclose(evals, [ 99., 98., 97.], atol=1e-6*100)
# Sparse singular mass matrix
A = scipy.sparse.spdiags(np.asarray(range(100), dtype=np.float32), [0], 100, 100)
M = scipy.sparse.spdiags(np.asarray(range(99,-1,-1), dtype=np.float32), [0], 100, 100)
evals, evecs = primme.eigsh(A, 3, M=M, tol=1e-6, which='SA')
assert_allclose(evals, [ 0./99., 1./98., 2./97.], atol=1e-6*100)
print(evals)
# Sparse rectangular matrix 100x10 with non-zeros on the main diagonal
A = scipy.sparse.spdiags(range(10), [0], 100, 10)
# Compute the three closest to 4.1 singular values and the left and right corresponding
# singular vectors
svecs_left, svals, svecs_right = primme.svds(A, 3, tol=1e-6, which=4.1)
assert_allclose(sorted(svals), [ 3., 4., 5.], atol=1e-6*10)
print(svals) # [ 4., 5., 3.]
# Sparse random rectangular matrix 10^5x100
A = scipy.sparse.rand(10000, 100, density=0.001, random_state=10)
# Compute the three closest singular values to 6.0 with a tolerance of 1e-6
svecs_left, svals, svecs_right, stats = primme.svds(A, 3, which='SM', tol=1e-6,
return_stats=True)
A_svals = svals
print(svals)
print(stats["elapsedTime"], stats["numMatvecs"])
# Compute the square diagonal preconditioner
prec = scipy.sparse.spdiags(np.reciprocal(A.multiply(A).sum(axis=0)),
[0], 100, 100)
# Sparse random rectangular matrix 10^5x100
A = scipy.sparse.rand(10000, 100, density=0.001, random_state=10)
# Compute the three closest singular values to 6.0 with a tolerance of 1e-6
svecs_left, svals, svecs_right, stats = primme.svds(A, 3, which='SM', tol=1e-6,
return_stats=True)
A_svals = svals
print(svals)
print(stats["elapsedTime"], stats["numMatvecs"])
# Compute the square diagonal preconditioner
prec = scipy.sparse.spdiags(np.reciprocal(A.multiply(A).sum(axis=0)),
[0], 100, 100)
# Recompute the singular values but using the preconditioner
svecs_left, svals, svecs_right, stats = primme.svds(A, 3, which='SM', tol=1e-6,
precAHA=prec, return_stats=True)
assert_allclose(svals, A_svals, atol=1e-6*100)
print(stats["elapsedTime"], stats["numMatvecs"])
# Estimation of the smallest singular value
def convtest_sm(sval, svecl, svecr, rnorm):
return sval > 0.1 * rnorm
svec_left, sval, svec_right, stats = primme.svds(A, 1, which='SM',
convtest=convtest_sm, return_stats=True)
assert_allclose(sval, [ 1.], atol=.1)
# User-defined matvec: implicit rectangular matrix with nonzero elements on the diagonal only
Bdiag = np.arange(0, 100).reshape((100,1))
Bdiagr = np.concatenate((np.arange(0, 100).reshape((100,1)).astype(np.float32), np.zeros((100,1), dtype=np.float32)), axis=None).reshape((200,1))
def Bmatmat(x):
if len(x.shape) == 1: x = x.reshape((100,1))
svec_left, sval, svec_right, stats = primme.svds(A, 1, which='SM',
convtest=convtest_sm, return_stats=True)
assert_allclose(sval, [ 1.], atol=.1)
# User-defined matvec: implicit rectangular matrix with nonzero elements on the diagonal only
Bdiag = np.arange(0, 100).reshape((100,1))
Bdiagr = np.concatenate((np.arange(0, 100).reshape((100,1)).astype(np.float32), np.zeros((100,1), dtype=np.float32)), axis=None).reshape((200,1))
def Bmatmat(x):
if len(x.shape) == 1: x = x.reshape((100,1))
return np.vstack((Bdiag * x, np.zeros((100, x.shape[1]), dtype=np.float32)))
def Brmatmat(x):
if len(x.shape) == 1: x = x.reshape((200,1))
return (Bdiagr * x)[0:100,:]
B = scipy.sparse.linalg.LinearOperator((200,100), matvec=Bmatmat, matmat=Bmatmat, rmatvec=Brmatmat, dtype=np.float32)
svecs_left, svals, svecs_right = primme.svds(B, 3, which='LM', tol=1e-6)
assert_allclose(svals, [ 99., 98., 97.], atol=1e-6*100)