You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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)