123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- import numpy as np
- from scipy.linalg import bandwidth, issymmetric, ishermitian
- import pytest
- from pytest import raises
- def test_bandwidth_dtypes():
- n = 5
- for t in np.typecodes['All']:
- A = np.zeros([n, n], dtype=t)
- if t in 'eUVOMm':
- raises(TypeError, bandwidth, A)
- elif t == 'G': # No-op test. On win these pass on others fail.
- pass
- else:
- _ = bandwidth(A)
- def test_bandwidth_non2d_input():
- A = np.array([1, 2, 3])
- raises(ValueError, bandwidth, A)
- A = np.array([[[1, 2, 3], [4, 5, 6]]])
- raises(ValueError, bandwidth, A)
- @pytest.mark.parametrize('T', [x for x in np.typecodes['All']
- if x not in 'eGUVOMm'])
- def test_bandwidth_square_inputs(T):
- n = 20
- k = 4
- R = np.zeros([n, n], dtype=T, order='F')
- # form a banded matrix inplace
- R[[x for x in range(n)], [x for x in range(n)]] = 1
- R[[x for x in range(n-k)], [x for x in range(k, n)]] = 1
- R[[x for x in range(1, n)], [x for x in range(n-1)]] = 1
- R[[x for x in range(k, n)], [x for x in range(n-k)]] = 1
- assert bandwidth(R) == (k, k)
- @pytest.mark.parametrize('T', [x for x in np.typecodes['All']
- if x not in 'eGUVOMm'])
- def test_bandwidth_rect_inputs(T):
- n, m = 10, 20
- k = 5
- R = np.zeros([n, m], dtype=T, order='F')
- # form a banded matrix inplace
- R[[x for x in range(n)], [x for x in range(n)]] = 1
- R[[x for x in range(n-k)], [x for x in range(k, n)]] = 1
- R[[x for x in range(1, n)], [x for x in range(n-1)]] = 1
- R[[x for x in range(k, n)], [x for x in range(n-k)]] = 1
- assert bandwidth(R) == (k, k)
- def test_issymetric_ishermitian_dtypes():
- n = 5
- for t in np.typecodes['All']:
- A = np.zeros([n, n], dtype=t)
- if t in 'eUVOMm':
- raises(TypeError, issymmetric, A)
- raises(TypeError, ishermitian, A)
- elif t == 'G': # No-op test. On win these pass on others fail.
- pass
- else:
- assert issymmetric(A)
- assert ishermitian(A)
- def test_issymmetric_ishermitian_invalid_input():
- A = np.array([1, 2, 3])
- raises(ValueError, issymmetric, A)
- raises(ValueError, ishermitian, A)
- A = np.array([[[1, 2, 3], [4, 5, 6]]])
- raises(ValueError, issymmetric, A)
- raises(ValueError, ishermitian, A)
- A = np.array([[1, 2, 3], [4, 5, 6]])
- raises(ValueError, issymmetric, A)
- raises(ValueError, ishermitian, A)
- def test_issymetric_complex_decimals():
- A = np.arange(1, 10).astype(complex).reshape(3, 3)
- A += np.arange(-4, 5).astype(complex).reshape(3, 3)*1j
- # make entries decimal
- A /= np.pi
- A = A + A.T
- assert issymmetric(A)
- def test_ishermitian_complex_decimals():
- A = np.arange(1, 10).astype(complex).reshape(3, 3)
- A += np.arange(-4, 5).astype(complex).reshape(3, 3)*1j
- # make entries decimal
- A /= np.pi
- A = A + A.T.conj()
- assert ishermitian(A)
- def test_issymmetric_approximate_results():
- n = 20
- rng = np.random.RandomState(123456789)
- x = rng.uniform(high=5., size=[n, n])
- y = x @ x.T # symmetric
- p = rng.standard_normal([n, n])
- z = p @ y @ p.T
- assert issymmetric(z, atol=1e-10)
- assert issymmetric(z, atol=1e-10, rtol=0.)
- assert issymmetric(z, atol=0., rtol=1e-12)
- assert issymmetric(z, atol=1e-13, rtol=1e-12)
- def test_ishermitian_approximate_results():
- n = 20
- rng = np.random.RandomState(987654321)
- x = rng.uniform(high=5., size=[n, n])
- y = x @ x.T # symmetric
- p = rng.standard_normal([n, n]) + rng.standard_normal([n, n])*1j
- z = p @ y @ p.conj().T
- assert ishermitian(z, atol=1e-10)
- assert ishermitian(z, atol=1e-10, rtol=0.)
- assert ishermitian(z, atol=0., rtol=1e-12)
- assert ishermitian(z, atol=1e-13, rtol=1e-12)
|