test_matmul_toeplitz.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. """Test functions for linalg.matmul_toeplitz function
  2. """
  3. import numpy as np
  4. from scipy.linalg import toeplitz, matmul_toeplitz
  5. from pytest import raises as assert_raises
  6. from numpy.testing import assert_allclose
  7. class TestMatmulToeplitz:
  8. def setup_method(self):
  9. self.rng = np.random.RandomState(42)
  10. self.tolerance = 1.5e-13
  11. def test_real(self):
  12. cases = []
  13. n = 1
  14. c = self.rng.normal(size=n)
  15. r = self.rng.normal(size=n)
  16. x = self.rng.normal(size=(n, 1))
  17. cases.append((x, c, r, False))
  18. n = 2
  19. c = self.rng.normal(size=n)
  20. r = self.rng.normal(size=n)
  21. x = self.rng.normal(size=(n, 1))
  22. cases.append((x, c, r, False))
  23. n = 101
  24. c = self.rng.normal(size=n)
  25. r = self.rng.normal(size=n)
  26. x = self.rng.normal(size=(n, 1))
  27. cases.append((x, c, r, True))
  28. n = 1000
  29. c = self.rng.normal(size=n)
  30. r = self.rng.normal(size=n)
  31. x = self.rng.normal(size=(n, 1))
  32. cases.append((x, c, r, False))
  33. n = 100
  34. c = self.rng.normal(size=n)
  35. r = self.rng.normal(size=n)
  36. x = self.rng.normal(size=(n, self.rng.randint(1, 10)))
  37. cases.append((x, c, r, False))
  38. n = 100
  39. c = self.rng.normal(size=(n, 1))
  40. r = self.rng.normal(size=(n, 1))
  41. x = self.rng.normal(size=(n, self.rng.randint(1, 10)))
  42. cases.append((x, c, r, True))
  43. n = 100
  44. c = self.rng.normal(size=(n, 1))
  45. r = None
  46. x = self.rng.normal(size=(n, self.rng.randint(1, 10)))
  47. cases.append((x, c, r, True, -1))
  48. n = 100
  49. c = self.rng.normal(size=(n, 1))
  50. r = None
  51. x = self.rng.normal(size=n)
  52. cases.append((x, c, r, False))
  53. n = 101
  54. c = self.rng.normal(size=n)
  55. r = self.rng.normal(size=n-27)
  56. x = self.rng.normal(size=(n-27, 1))
  57. cases.append((x, c, r, True))
  58. n = 100
  59. c = self.rng.normal(size=n)
  60. r = self.rng.normal(size=n//4)
  61. x = self.rng.normal(size=(n//4, self.rng.randint(1, 10)))
  62. cases.append((x, c, r, True))
  63. [self.do(*i) for i in cases]
  64. def test_complex(self):
  65. n = 127
  66. c = self.rng.normal(size=(n, 1)) + self.rng.normal(size=(n, 1))*1j
  67. r = self.rng.normal(size=(n, 1)) + self.rng.normal(size=(n, 1))*1j
  68. x = self.rng.normal(size=(n, 3)) + self.rng.normal(size=(n, 3))*1j
  69. self.do(x, c, r, False)
  70. n = 100
  71. c = self.rng.normal(size=(n, 1)) + self.rng.normal(size=(n, 1))*1j
  72. r = self.rng.normal(size=(n//2, 1)) +\
  73. self.rng.normal(size=(n//2, 1))*1j
  74. x = self.rng.normal(size=(n//2, 3)) +\
  75. self.rng.normal(size=(n//2, 3))*1j
  76. self.do(x, c, r, False)
  77. def test_empty(self):
  78. c = []
  79. r = []
  80. x = []
  81. self.do(x, c, r, False)
  82. x = np.empty((0, 0))
  83. self.do(x, c, r, False)
  84. def test_exceptions(self):
  85. n = 100
  86. c = self.rng.normal(size=n)
  87. r = self.rng.normal(size=2*n)
  88. x = self.rng.normal(size=n)
  89. assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
  90. n = 100
  91. c = self.rng.normal(size=n)
  92. r = self.rng.normal(size=n)
  93. x = self.rng.normal(size=n-1)
  94. assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
  95. n = 100
  96. c = self.rng.normal(size=n)
  97. r = self.rng.normal(size=n//2)
  98. x = self.rng.normal(size=n//2-1)
  99. assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
  100. # For toeplitz matrices, matmul_toeplitz() should be equivalent to @.
  101. def do(self, x, c, r=None, check_finite=False, workers=None):
  102. c = np.ravel(c)
  103. if r is None:
  104. actual = matmul_toeplitz(c, x, check_finite, workers)
  105. else:
  106. r = np.ravel(r)
  107. actual = matmul_toeplitz((c, r), x, check_finite)
  108. desired = toeplitz(c, r) @ x
  109. assert_allclose(actual, desired,
  110. rtol=self.tolerance, atol=self.tolerance)