test_sparsetools.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from sympy.matrices.sparsetools import _doktocsr, _csrtodok, banded
  2. from sympy.matrices.dense import (Matrix, eye, ones, zeros)
  3. from sympy.matrices import SparseMatrix
  4. from sympy.testing.pytest import raises
  5. def test_doktocsr():
  6. a = SparseMatrix([[1, 2, 0, 0], [0, 3, 9, 0], [0, 1, 4, 0]])
  7. b = SparseMatrix(4, 6, [10, 20, 0, 0, 0, 0, 0, 30, 0, 40, 0, 0, 0, 0, 50,
  8. 60, 70, 0, 0, 0, 0, 0, 0, 80])
  9. c = SparseMatrix(4, 4, [0, 0, 0, 0, 0, 12, 0, 2, 15, 0, 12, 0, 0, 0, 0, 4])
  10. d = SparseMatrix(10, 10, {(1, 1): 12, (3, 5): 7, (7, 8): 12})
  11. e = SparseMatrix([[0, 0, 0], [1, 0, 2], [3, 0, 0]])
  12. f = SparseMatrix(7, 8, {(2, 3): 5, (4, 5):12})
  13. assert _doktocsr(a) == [[1, 2, 3, 9, 1, 4], [0, 1, 1, 2, 1, 2],
  14. [0, 2, 4, 6], [3, 4]]
  15. assert _doktocsr(b) == [[10, 20, 30, 40, 50, 60, 70, 80],
  16. [0, 1, 1, 3, 2, 3, 4, 5], [0, 2, 4, 7, 8], [4, 6]]
  17. assert _doktocsr(c) == [[12, 2, 15, 12, 4], [1, 3, 0, 2, 3],
  18. [0, 0, 2, 4, 5], [4, 4]]
  19. assert _doktocsr(d) == [[12, 7, 12], [1, 5, 8],
  20. [0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3], [10, 10]]
  21. assert _doktocsr(e) == [[1, 2, 3], [0, 2, 0], [0, 0, 2, 3], [3, 3]]
  22. assert _doktocsr(f) == [[5, 12], [3, 5], [0, 0, 0, 1, 1, 2, 2, 2], [7, 8]]
  23. def test_csrtodok():
  24. h = [[5, 7, 5], [2, 1, 3], [0, 1, 1, 3], [3, 4]]
  25. g = [[12, 5, 4], [2, 4, 2], [0, 1, 2, 3], [3, 7]]
  26. i = [[1, 3, 12], [0, 2, 4], [0, 2, 3], [2, 5]]
  27. j = [[11, 15, 12, 15], [2, 4, 1, 2], [0, 1, 1, 2, 3, 4], [5, 8]]
  28. k = [[1, 3], [2, 1], [0, 1, 1, 2], [3, 3]]
  29. m = _csrtodok(h)
  30. assert isinstance(m, SparseMatrix)
  31. assert m == SparseMatrix(3, 4,
  32. {(0, 2): 5, (2, 1): 7, (2, 3): 5})
  33. assert _csrtodok(g) == SparseMatrix(3, 7,
  34. {(0, 2): 12, (1, 4): 5, (2, 2): 4})
  35. assert _csrtodok(i) == SparseMatrix([[1, 0, 3, 0, 0], [0, 0, 0, 0, 12]])
  36. assert _csrtodok(j) == SparseMatrix(5, 8,
  37. {(0, 2): 11, (2, 4): 15, (3, 1): 12, (4, 2): 15})
  38. assert _csrtodok(k) == SparseMatrix(3, 3, {(0, 2): 1, (2, 1): 3})
  39. def test_banded():
  40. raises(TypeError, lambda: banded())
  41. raises(TypeError, lambda: banded(1))
  42. raises(TypeError, lambda: banded(1, 2))
  43. raises(TypeError, lambda: banded(1, 2, 3))
  44. raises(TypeError, lambda: banded(1, 2, 3, 4))
  45. raises(ValueError, lambda: banded({0: (1, 2)}, rows=1))
  46. raises(ValueError, lambda: banded({0: (1, 2)}, cols=1))
  47. raises(ValueError, lambda: banded(1, {0: (1, 2)}))
  48. raises(ValueError, lambda: banded(2, 1, {0: (1, 2)}))
  49. raises(ValueError, lambda: banded(1, 2, {0: (1, 2)}))
  50. assert isinstance(banded(2, 4, {}), SparseMatrix)
  51. assert banded(2, 4, {}) == zeros(2, 4)
  52. assert banded({0: 0, 1: 0}) == zeros(0)
  53. assert banded({0: Matrix([1, 2])}) == Matrix([1, 2])
  54. assert banded({1: [1, 2, 3, 0], -1: [4, 5, 6]}) == \
  55. banded({1: (1, 2, 3), -1: (4, 5, 6)}) == \
  56. Matrix([
  57. [0, 1, 0, 0],
  58. [4, 0, 2, 0],
  59. [0, 5, 0, 3],
  60. [0, 0, 6, 0]])
  61. assert banded(3, 4, {-1: 1, 0: 2, 1: 3}) == \
  62. Matrix([
  63. [2, 3, 0, 0],
  64. [1, 2, 3, 0],
  65. [0, 1, 2, 3]])
  66. s = lambda d: (1 + d)**2
  67. assert banded(5, {0: s, 2: s}) == \
  68. Matrix([
  69. [1, 0, 1, 0, 0],
  70. [0, 4, 0, 4, 0],
  71. [0, 0, 9, 0, 9],
  72. [0, 0, 0, 16, 0],
  73. [0, 0, 0, 0, 25]])
  74. assert banded(2, {0: 1}) == \
  75. Matrix([
  76. [1, 0],
  77. [0, 1]])
  78. assert banded(2, 3, {0: 1}) == \
  79. Matrix([
  80. [1, 0, 0],
  81. [0, 1, 0]])
  82. vert = Matrix([1, 2, 3])
  83. assert banded({0: vert}, cols=3) == \
  84. Matrix([
  85. [1, 0, 0],
  86. [2, 1, 0],
  87. [3, 2, 1],
  88. [0, 3, 2],
  89. [0, 0, 3]])
  90. assert banded(4, {0: ones(2)}) == \
  91. Matrix([
  92. [1, 1, 0, 0],
  93. [1, 1, 0, 0],
  94. [0, 0, 1, 1],
  95. [0, 0, 1, 1]])
  96. raises(ValueError, lambda: banded({0: 2, 1: ones(2)}, rows=5))
  97. assert banded({0: 2, 2: (ones(2),)*3}) == \
  98. Matrix([
  99. [2, 0, 1, 1, 0, 0, 0, 0],
  100. [0, 2, 1, 1, 0, 0, 0, 0],
  101. [0, 0, 2, 0, 1, 1, 0, 0],
  102. [0, 0, 0, 2, 1, 1, 0, 0],
  103. [0, 0, 0, 0, 2, 0, 1, 1],
  104. [0, 0, 0, 0, 0, 2, 1, 1]])
  105. raises(ValueError, lambda: banded({0: (2,)*5, 1: (ones(2),)*3}))
  106. u2 = Matrix([[1, 1], [0, 1]])
  107. assert banded({0: (2,)*5, 1: (u2,)*3}) == \
  108. Matrix([
  109. [2, 1, 1, 0, 0, 0, 0],
  110. [0, 2, 1, 0, 0, 0, 0],
  111. [0, 0, 2, 1, 1, 0, 0],
  112. [0, 0, 0, 2, 1, 0, 0],
  113. [0, 0, 0, 0, 2, 1, 1],
  114. [0, 0, 0, 0, 0, 0, 1]])
  115. assert banded({0:(0, ones(2)), 2: 2}) == \
  116. Matrix([
  117. [0, 0, 2],
  118. [0, 1, 1],
  119. [0, 1, 1]])
  120. raises(ValueError, lambda: banded({0: (0, ones(2)), 1: 2}))
  121. assert banded({0: 1}, cols=3) == banded({0: 1}, rows=3) == eye(3)
  122. assert banded({1: 1}, rows=3) == Matrix([
  123. [0, 1, 0],
  124. [0, 0, 1],
  125. [0, 0, 0]])