from sympy.combinatorics import Permutation from sympy.core.symbol import symbols from sympy.matrices import Matrix from sympy.matrices.expressions import ( PermutationMatrix, BlockDiagMatrix, BlockMatrix) def test_connected_components(): a, b, c, d, e, f, g, h, i, j, k, l, m = symbols('a:m') M = Matrix([ [a, 0, 0, 0, b, 0, 0, 0, 0, 0, c, 0, 0], [0, d, 0, 0, 0, e, 0, 0, 0, 0, 0, f, 0], [0, 0, g, 0, 0, 0, h, 0, 0, 0, 0, 0, i], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [m, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, m, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, m, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [j, 0, 0, 0, k, 0, 0, 1, 0, 0, l, 0, 0], [0, j, 0, 0, 0, k, 0, 0, 1, 0, 0, l, 0], [0, 0, j, 0, 0, 0, k, 0, 0, 1, 0, 0, l], [0, 0, 0, 0, d, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, d, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, d, 0, 0, 0, 0, 0, 1]]) cc = M.connected_components() assert cc == [[0, 4, 7, 10], [1, 5, 8, 11], [2, 6, 9, 12], [3]] P, B = M.connected_components_decomposition() p = Permutation([0, 4, 7, 10, 1, 5, 8, 11, 2, 6, 9, 12, 3]) assert P == PermutationMatrix(p) B0 = Matrix([ [a, b, 0, c], [m, 1, 0, 0], [j, k, 1, l], [0, d, 0, 1]]) B1 = Matrix([ [d, e, 0, f], [m, 1, 0, 0], [j, k, 1, l], [0, d, 0, 1]]) B2 = Matrix([ [g, h, 0, i], [m, 1, 0, 0], [j, k, 1, l], [0, d, 0, 1]]) B3 = Matrix([[1]]) assert B == BlockDiagMatrix(B0, B1, B2, B3) def test_strongly_connected_components(): M = Matrix([ [11, 14, 10, 0, 15, 0], [0, 44, 0, 0, 45, 0], [1, 4, 0, 0, 5, 0], [0, 0, 0, 22, 0, 23], [0, 54, 0, 0, 55, 0], [0, 0, 0, 32, 0, 33]]) scc = M.strongly_connected_components() assert scc == [[1, 4], [0, 2], [3, 5]] P, B = M.strongly_connected_components_decomposition() p = Permutation([1, 4, 0, 2, 3, 5]) assert P == PermutationMatrix(p) assert B == BlockMatrix([ [ Matrix([[44, 45], [54, 55]]), Matrix.zeros(2, 2), Matrix.zeros(2, 2) ], [ Matrix([[14, 15], [4, 5]]), Matrix([[11, 10], [1, 0]]), Matrix.zeros(2, 2) ], [ Matrix.zeros(2, 2), Matrix.zeros(2, 2), Matrix([[22, 23], [32, 33]]) ] ]) P = P.as_explicit() B = B.as_explicit() assert P.T * B * P == M P, B = M.strongly_connected_components_decomposition(lower=False) p = Permutation([3, 5, 0, 2, 1, 4]) assert P == PermutationMatrix(p) assert B == BlockMatrix([ [ Matrix([[22, 23], [32, 33]]), Matrix.zeros(2, 2), Matrix.zeros(2, 2) ], [ Matrix.zeros(2, 2), Matrix([[11, 10], [1, 0]]), Matrix([[14, 15], [4, 5]]) ], [ Matrix.zeros(2, 2), Matrix.zeros(2, 2), Matrix([[44, 45], [54, 55]]) ] ]) P = P.as_explicit() B = B.as_explicit() assert P.T * B * P == M