def test_entry(): from sympy.concrete import Sum assert MatPow(A, 1)[0, 0] == A[0, 0] assert MatPow(C, 0)[0, 0] == 1 assert MatPow(C, 0)[0, 1] == 0 assert isinstance(MatPow(C, 2)[0, 0], Sum)
def test_as_explicit_nonsquare(): A = ImmutableMatrix([[1, 2, 3], [4, 5, 6]]) assert MatPow(A, 1).as_explicit() == A raises(ShapeError, lambda: MatPow(A, 0).as_explicit()) raises(ShapeError, lambda: MatPow(A, 2).as_explicit()) raises(ShapeError, lambda: MatPow(A, -1).as_explicit()) raises(ValueError, lambda: MatPow(A, pi).as_explicit())
def test_entry_matrix(): X = ImmutableMatrix([[1, 2], [3, 4]]) assert MatPow(X, 0)[0, 0] == 1 assert MatPow(X, 0)[0, 1] == 0 assert MatPow(X, 1)[0, 0] == 1 assert MatPow(X, 1)[0, 1] == 2 assert MatPow(X, 2)[0, 0] == 7
def test_doit_nonsquare(): X = ImmutableMatrix([[1, 2, 3], [4, 5, 6]]) assert MatPow(X, 1).doit() == X raises(ShapeError, lambda: MatPow(X, 0).doit()) raises(ShapeError, lambda: MatPow(X, 2).doit()) raises(ShapeError, lambda: MatPow(X, -1).doit()) raises(ShapeError, lambda: MatPow(X, pi).doit())
def test_entry_symbol(): from sympy.concrete import Sum assert MatPow(C, 0)[0, 0] == 1 assert MatPow(C, 0)[0, 1] == 0 assert MatPow(C, 1)[0, 0] == C[0, 0] assert isinstance(MatPow(C, 2)[0, 0], Sum) assert isinstance(MatPow(C, n)[0, 0], MatrixElement)
def test_unchanged(): assert unchanged(MatPow, C, 0) assert unchanged(MatPow, C, 1) assert unchanged(MatPow, Inverse(C), -1) assert unchanged(Inverse, MatPow(C, -1), -1) assert unchanged(MatPow, MatPow(C, -1), -1) assert unchanged(MatPow, MatPow(C, 1), 1)
def test_combine_powers(): assert (C**1)**1 == C assert (C**2)**3 == MatPow(C, 6) assert (C**-2)**-3 == MatPow(C, 6) assert (C**-1)**-1 == C assert (((C**2)**3)**4)**5 == MatPow(C, 120) assert (C**n)**n == C**(n**2)
def test_as_explicit_symbol(): X = MatrixSymbol('X', 2, 2) assert MatPow(X, 0).as_explicit() == ImmutableMatrix(Identity(2)) assert MatPow(X, 1).as_explicit() == X.as_explicit() assert MatPow(X, 2).as_explicit() == (X.as_explicit())**2 assert MatPow(X, n).as_explicit() == ImmutableMatrix([ [(X**n)[0, 0], (X**n)[0, 1]], [(X**n)[1, 0], (X**n)[1, 1]], ]) a = MatrixSymbol("a", 3, 1) b = MatrixSymbol("b", 3, 1) c = MatrixSymbol("c", 3, 1) expr = (a.T * b)**S.Half assert expr.as_explicit() == Matrix( [[sqrt(a[0, 0] * b[0, 0] + a[1, 0] * b[1, 0] + a[2, 0] * b[2, 0])]]) expr = c * (a.T * b)**S.Half m = sqrt(a[0, 0] * b[0, 0] + a[1, 0] * b[1, 0] + a[2, 0] * b[2, 0]) assert expr.as_explicit() == Matrix([[c[0, 0] * m], [c[1, 0] * m], [c[2, 0] * m]]) expr = (a * b.T)**S.Half denom = sqrt(a[0, 0] * b[0, 0] + a[1, 0] * b[1, 0] + a[2, 0] * b[2, 0]) expected = (a * b.T).as_explicit() / denom assert expr.as_explicit() == expected expr = X**-1 det = X[0, 0] * X[1, 1] - X[1, 0] * X[0, 1] expected = Matrix([[X[1, 1], -X[0, 1]], [-X[1, 0], X[0, 0]]]) / det assert expr.as_explicit() == expected expr = X**m assert expr.as_explicit() == X.as_explicit()**m
def test_as_explicit_symbol(): X = MatrixSymbol('X', 2, 2) assert MatPow(X, 0).as_explicit() == ImmutableMatrix(Identity(2)) assert MatPow(X, 1).as_explicit() == X.as_explicit() assert MatPow(X, 2).as_explicit() == (X.as_explicit())**2 assert MatPow(X, n).as_explicit() == ImmutableMatrix([ [(X**n)[0, 0], (X**n)[0, 1]], [(X**n)[1, 0], (X**n)[1, 1]], ])
def test_Inverse(): assert Inverse(MatPow(C, 0)).doit() == Identity(n) assert Inverse(MatPow(C, 1)).doit() == Inverse(C) assert Inverse(MatPow(C, 2)).doit() == MatPow(C, -2) assert Inverse(MatPow(C, -1)).doit() == C assert MatPow(Inverse(C), 0).doit() == Identity(n) assert MatPow(Inverse(C), 1).doit() == Inverse(C) assert MatPow(Inverse(C), 2).doit() == MatPow(C, -2) assert MatPow(Inverse(C), -1).doit() == C
def test_zero_power(): z1 = ZeroMatrix(n, n) assert MatPow(z1, 3).doit() == z1 raises(ValueError, lambda:MatPow(z1, -1).doit()) assert MatPow(z1, 0).doit() == Identity(n) assert MatPow(z1, n).doit() == z1 raises(ValueError, lambda:MatPow(z1, -2).doit()) z2 = ZeroMatrix(4, 4) assert MatPow(z2, n).doit() == z2 raises(ValueError, lambda:MatPow(z2, -3).doit()) assert MatPow(z2, 2).doit() == z2 assert MatPow(z2, 0).doit() == Identity(4) raises(ValueError, lambda:MatPow(z2, -1).doit())
def test_Trace_doit(): X = Matrix([[1, 2], [3, 4]]) assert Trace(X).doit() == 5 q = MatPow(X, 2) assert Trace(q).arg == q assert Trace(q).doit() == 29 assert Trace(q).doit(deep=False).arg == q
def test_doit_args(): A = ImmutableMatrix([[1, 2], [3, 4]]) B = ImmutableMatrix([[2, 3], [4, 5]]) assert MatAdd(A, MatPow(B, 2)).doit() == A + B**2 assert MatAdd(A, MatMul(A, B)).doit() == A + A*B assert (MatAdd(A, X, MatMul(A, B), Y, MatAdd(2*A, B)).doit() == MatAdd(3*A + A*B + B, X, Y))
def test_Trace_doit_deep_False(): X = Matrix([[1, 2], [3, 4]]) q = MatPow(X, 2) assert Trace(q).doit(deep=False).arg == q q = MatAdd(X, 2 * X) assert Trace(q).doit(deep=False).arg == q q = MatMul(X, 2 * X) assert Trace(q).doit(deep=False).arg == q
def _to_matrix(expr): if expr in subst: return subst[expr] if isinstance(expr, Pow): return MatPow(_to_matrix(expr.args[0]), expr.args[1]) elif isinstance(expr, (Add, Mul)): return reduce(funcs[expr.func], [_to_matrix(a) for a in expr.args]) else: return expr * Identity(x)
def test_doit_with_MatrixBase(): X = ImmutableMatrix([[1, 2], [3, 4]]) assert MatPow(X, 0).doit() == ImmutableMatrix(Identity(2)) assert MatPow(X, 1).doit() == X assert MatPow(X, 2).doit() == X**2 assert MatPow(X, -1).doit() == X.inv() assert MatPow(X, -2).doit() == (X.inv())**2 # less expensive than testing on a 2x2 assert MatPow(ImmutableMatrix([4]), S.Half).doit() == ImmutableMatrix([2]) X = ImmutableMatrix([[0, 2], [0, 4]]) # det() == 0 raises(ValueError, lambda: MatPow(X,-1).doit()) raises(ValueError, lambda: MatPow(X,-2).doit())
def test_identity_power(): k = Identity(n) assert MatPow(k, 4).doit() == k assert MatPow(k, n).doit() == k assert MatPow(k, -3).doit() == k assert MatPow(k, 0).doit() == k l = Identity(3) assert MatPow(l, n).doit() == l assert MatPow(l, -1).doit() == l assert MatPow(l, 0).doit() == l
def test_as_explicit(): A = ImmutableMatrix([[1, 2], [3, 4]]) assert MatPow(A, 0).as_explicit() == ImmutableMatrix(Identity(2)) assert MatPow(A, 1).as_explicit() == A assert MatPow(A, 2).as_explicit() == A**2 assert MatPow(A, -1).as_explicit() == A.inv() assert MatPow(A, -2).as_explicit() == (A.inv())**2 # less expensive than testing on a 2x2 A = ImmutableMatrix([4]); assert MatPow(A, S.Half).as_explicit() == A**S.Half
def test_doit_nested_MatrixExpr(): X = ImmutableMatrix([[1, 2], [3, 4]]) Y = ImmutableMatrix([[2, 3], [4, 5]]) assert MatPow(MatMul(X, Y), 2).doit() == (X*Y)**2 assert MatPow(MatAdd(X, Y), 2).doit() == (X + Y)**2
def test_doit_symbol(): assert MatPow(C, 0).doit() == Identity(n) assert MatPow(C, 1).doit() == C assert MatPow(C, -1).doit() == C.I for r in [2, S.Half, S.Pi, n]: assert MatPow(C, r).doit() == MatPow(C, r)
def test_doit_square_MatrixSymbol_symsize(): assert MatPow(C, 0).doit() == Identity(n) assert MatPow(C, 1).doit() == C for r in [2, -1, pi]: assert MatPow(C, r).doit() == MatPow(C, r)
def test_doit_nonsquare_MatrixSymbol(): assert MatPow(A, 1).doit() == A for r in [0, 2, -1, pi]: assert MatPow(A, r).doit() == MatPow(A, r)
def test_nonsquare(): A = MatrixSymbol('A', 2, 3) B = ImmutableMatrix([[1, 2, 3], [4, 5, 6]]) for r in [-1, 0, 1, 2, S.Half, S.Pi, n]: raises(NonSquareMatrixError, lambda: MatPow(A, r)) raises(NonSquareMatrixError, lambda: MatPow(B, r))
def test_as_explicit_nonsquare_symbol(): X = MatrixSymbol('X', 2, 3) assert MatPow(X, 1).as_explicit() == X.as_explicit() for r in [0, 2, S.Half, S.Pi]: raises(ShapeError, lambda: MatPow(X, r).as_explicit())
def test_as_explicit_symbol(): X = MatrixSymbol('X', 2, 2) assert MatPow(X, 0).as_explicit() == ImmutableMatrix(Identity(2)) assert MatPow(X, 1).as_explicit() == X.as_explicit() assert MatPow(X, 2).as_explicit() == (X.as_explicit())**2
def test_inverse_matpow_canonicalization(): A = MatrixSymbol('A', 3, 3) assert Inverse(MatPow(A, 3)).doit() == MatPow(Inverse(A), 3).doit()
def test_doit_drills_down(): X = ImmutableMatrix([[1, 2], [3, 4]]) Y = ImmutableMatrix([[2, 3], [4, 5]]) assert MatMul(X, MatPow(Y, 2)).doit() == X * Y**2 assert MatMul(C, Transpose(D * C)).doit().args == (C, C.T, D.T)
def test_doit_equals_pow(): #17179 X = ImmutableMatrix ([[1,0],[0,1]]) assert MatPow(X, n).doit() == X**n == X