Spaces:
Sleeping
Sleeping
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 | |