test_spfuncs.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from numpy import array, kron, diag
  2. from numpy.testing import assert_, assert_equal
  3. from scipy.sparse import _spfuncs as spfuncs
  4. from scipy.sparse import csr_matrix, csc_matrix, bsr_matrix
  5. from scipy.sparse._sparsetools import (csr_scale_rows, csr_scale_columns,
  6. bsr_scale_rows, bsr_scale_columns)
  7. class TestSparseFunctions:
  8. def test_scale_rows_and_cols(self):
  9. D = array([[1, 0, 0, 2, 3],
  10. [0, 4, 0, 5, 0],
  11. [0, 0, 6, 7, 0]])
  12. #TODO expose through function
  13. S = csr_matrix(D)
  14. v = array([1,2,3])
  15. csr_scale_rows(3,5,S.indptr,S.indices,S.data,v)
  16. assert_equal(S.toarray(), diag(v)@D)
  17. S = csr_matrix(D)
  18. v = array([1,2,3,4,5])
  19. csr_scale_columns(3,5,S.indptr,S.indices,S.data,v)
  20. assert_equal(S.toarray(), D@diag(v))
  21. # blocks
  22. E = kron(D,[[1,2],[3,4]])
  23. S = bsr_matrix(E,blocksize=(2,2))
  24. v = array([1,2,3,4,5,6])
  25. bsr_scale_rows(3,5,2,2,S.indptr,S.indices,S.data,v)
  26. assert_equal(S.toarray(), diag(v)@E)
  27. S = bsr_matrix(E,blocksize=(2,2))
  28. v = array([1,2,3,4,5,6,7,8,9,10])
  29. bsr_scale_columns(3,5,2,2,S.indptr,S.indices,S.data,v)
  30. assert_equal(S.toarray(), E@diag(v))
  31. E = kron(D,[[1,2,3],[4,5,6]])
  32. S = bsr_matrix(E,blocksize=(2,3))
  33. v = array([1,2,3,4,5,6])
  34. bsr_scale_rows(3,5,2,3,S.indptr,S.indices,S.data,v)
  35. assert_equal(S.toarray(), diag(v)@E)
  36. S = bsr_matrix(E,blocksize=(2,3))
  37. v = array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
  38. bsr_scale_columns(3,5,2,3,S.indptr,S.indices,S.data,v)
  39. assert_equal(S.toarray(), E@diag(v))
  40. def test_estimate_blocksize(self):
  41. mats = []
  42. mats.append([[0,1],[1,0]])
  43. mats.append([[1,1,0],[0,0,1],[1,0,1]])
  44. mats.append([[0],[0],[1]])
  45. mats = [array(x) for x in mats]
  46. blks = []
  47. blks.append([[1]])
  48. blks.append([[1,1],[1,1]])
  49. blks.append([[1,1],[0,1]])
  50. blks.append([[1,1,0],[1,0,1],[1,1,1]])
  51. blks = [array(x) for x in blks]
  52. for A in mats:
  53. for B in blks:
  54. X = kron(A,B)
  55. r,c = spfuncs.estimate_blocksize(X)
  56. assert_(r >= B.shape[0])
  57. assert_(c >= B.shape[1])
  58. def test_count_blocks(self):
  59. def gold(A,bs):
  60. R,C = bs
  61. I,J = A.nonzero()
  62. return len(set(zip(I//R,J//C)))
  63. mats = []
  64. mats.append([[0]])
  65. mats.append([[1]])
  66. mats.append([[1,0]])
  67. mats.append([[1,1]])
  68. mats.append([[0,1],[1,0]])
  69. mats.append([[1,1,0],[0,0,1],[1,0,1]])
  70. mats.append([[0],[0],[1]])
  71. for A in mats:
  72. for B in mats:
  73. X = kron(A,B)
  74. Y = csr_matrix(X)
  75. for R in range(1,6):
  76. for C in range(1,6):
  77. assert_equal(spfuncs.count_blocks(Y, (R, C)), gold(X, (R, C)))
  78. X = kron([[1,1,0],[0,0,1],[1,0,1]],[[1,1]])
  79. Y = csc_matrix(X)
  80. assert_equal(spfuncs.count_blocks(X, (1, 2)), gold(X, (1, 2)))
  81. assert_equal(spfuncs.count_blocks(Y, (1, 2)), gold(X, (1, 2)))