test_matmul_toeplitz.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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_exceptions(self):
  78. n = 100
  79. c = self.rng.normal(size=n)
  80. r = self.rng.normal(size=2*n)
  81. x = self.rng.normal(size=n)
  82. assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
  83. n = 100
  84. c = self.rng.normal(size=n)
  85. r = self.rng.normal(size=n)
  86. x = self.rng.normal(size=n-1)
  87. assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
  88. n = 100
  89. c = self.rng.normal(size=n)
  90. r = self.rng.normal(size=n//2)
  91. x = self.rng.normal(size=n//2-1)
  92. assert_raises(ValueError, matmul_toeplitz, (c, r), x, True)
  93. # For toeplitz matrices, matmul_toeplitz() should be equivalent to @.
  94. def do(self, x, c, r=None, check_finite=False, workers=None):
  95. if r is None:
  96. actual = matmul_toeplitz(c, x, check_finite, workers)
  97. else:
  98. actual = matmul_toeplitz((c, r), x, check_finite)
  99. desired = toeplitz(c, r) @ x
  100. assert_allclose(actual, desired,
  101. rtol=self.tolerance, atol=self.tolerance)