test_spfuncs.py 3.2 KB

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