123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- """Test functions for linalg.matmul_toeplitz function
- """
- import numpy as np
- from scipy.linalg import toeplitz, matmul_toeplitz
- from pytest import raises as assert_raises
- from numpy.testing import assert_allclose
- class TestMatmulToeplitz:
- def setup_method(self):
- self.rng = np.random.RandomState(42)
- self.tolerance = 1.5e-13
- def test_real(self):
- cases = []
- n = 1
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n)
- x = self.rng.normal(size=(n, 1))
- cases.append((x, c, r, False))
- n = 2
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n)
- x = self.rng.normal(size=(n, 1))
- cases.append((x, c, r, False))
- n = 101
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n)
- x = self.rng.normal(size=(n, 1))
- cases.append((x, c, r, True))
- n = 1000
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n)
- x = self.rng.normal(size=(n, 1))
- cases.append((x, c, r, False))
- n = 100
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n)
- x = self.rng.normal(size=(n, self.rng.randint(1, 10)))
- cases.append((x, c, r, False))
- n = 100
- c = self.rng.normal(size=(n, 1))
- r = self.rng.normal(size=(n, 1))
- x = self.rng.normal(size=(n, self.rng.randint(1, 10)))
- cases.append((x, c, r, True))
- n = 100
- c = self.rng.normal(size=(n, 1))
- r = None
- x = self.rng.normal(size=(n, self.rng.randint(1, 10)))
- cases.append((x, c, r, True, -1))
- n = 100
- c = self.rng.normal(size=(n, 1))
- r = None
- x = self.rng.normal(size=n)
- cases.append((x, c, r, False))
- n = 101
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n-27)
- x = self.rng.normal(size=(n-27, 1))
- cases.append((x, c, r, True))
- n = 100
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n//4)
- x = self.rng.normal(size=(n//4, self.rng.randint(1, 10)))
- cases.append((x, c, r, True))
- [self.do(*i) for i in cases]
- def test_complex(self):
- n = 127
- c = self.rng.normal(size=(n, 1)) + self.rng.normal(size=(n, 1))*1j
- r = self.rng.normal(size=(n, 1)) + self.rng.normal(size=(n, 1))*1j
- x = self.rng.normal(size=(n, 3)) + self.rng.normal(size=(n, 3))*1j
- self.do(x, c, r, False)
- n = 100
- c = self.rng.normal(size=(n, 1)) + self.rng.normal(size=(n, 1))*1j
- r = self.rng.normal(size=(n//2, 1)) +\
- self.rng.normal(size=(n//2, 1))*1j
- x = self.rng.normal(size=(n//2, 3)) +\
- self.rng.normal(size=(n//2, 3))*1j
- self.do(x, c, r, False)
- def test_exceptions(self):
- n = 100
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=2*n)
- x = self.rng.normal(size=n)
- assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
- n = 100
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n)
- x = self.rng.normal(size=n-1)
- assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
- n = 100
- c = self.rng.normal(size=n)
- r = self.rng.normal(size=n//2)
- x = self.rng.normal(size=n//2-1)
- assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
- # For toeplitz matrices, matmul_toeplitz() should be equivalent to @.
- def do(self, x, c, r=None, check_finite=False, workers=None):
- if r is None:
- actual = matmul_toeplitz(c, x, check_finite, workers)
- else:
- actual = matmul_toeplitz((c, r), x, check_finite)
- desired = toeplitz(c, r) @ x
- assert_allclose(actual, desired,
- rtol=self.tolerance, atol=self.tolerance)
|