126 lines
3.8 KiB
Python
126 lines
3.8 KiB
Python
"""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)
|