def test_inverse(): pytest.raises(ShapeError, lambda: Inverse(A)) pytest.raises(ShapeError, lambda: Inverse(A * B)) pytest.raises(TypeError, lambda: Inverse(1)) assert Inverse(C).shape == (n, n) assert Inverse(A * E).shape == (n, n) assert Inverse(E * A).shape == (m, m) assert Inverse(C).inverse() == C assert isinstance(Inverse(Inverse(C)), Inverse) assert C.inverse().inverse() == C assert C.inverse() * C == Identity(C.rows) assert Identity(n).inverse() == Identity(n) assert (3 * Identity(n)).inverse() == Identity(n) / 3 # Simplifies Muls if possible (i.e. submatrices are square) assert (C * D).inverse() == D.inverse() * C.inverse() # But still works when not possible assert isinstance((A * E).inverse(), Inverse) assert Inverse(eye(3)).doit() == eye(3) assert Inverse(eye(3)).doit(deep=False) == eye(3) assert det(Inverse(C)) == 1 / det(C)
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_Identity(): A = MatrixSymbol('A', n, m) In = Identity(n) Im = Identity(m) assert A * Im == A assert In * A == A assert transpose(In) == In assert In.inverse() == In assert In.conjugate() == In
def test_identity_powers(): M = Identity(n) assert MatPow(M, 3).doit() == M**3 assert M**n == M assert MatPow(M, 0).doit() == M**2 assert M**-2 == M assert MatPow(M, -2).doit() == M**0 N = Identity(3) assert MatPow(N, 2).doit() == N**n assert MatPow(N, 3).doit() == N assert MatPow(N, -2).doit() == N**4 assert MatPow(N, 2).doit() == N**0
def test_zero_power(): z1 = ZeroMatrix(n, n) assert MatPow(z1, 3).doit() == z1 pytest.raises(ValueError, lambda: MatPow(z1, -1).doit()) assert MatPow(z1, 0).doit() == Identity(n) assert MatPow(z1, n).doit() == z1 pytest.raises(ValueError, lambda: MatPow(z1, -2).doit()) z2 = ZeroMatrix(4, 4) assert MatPow(z2, n).doit() == z2 pytest.raises(ValueError, lambda: MatPow(z2, -3).doit()) assert MatPow(z2, 2).doit() == z2 assert MatPow(z2, 0).doit() == Identity(4) pytest.raises(ValueError, lambda: MatPow(z2, -1).doit())
def test_Zero_power(): z1 = ZeroMatrix(n, n) assert z1**4 == z1 pytest.raises(ValueError, lambda: z1**-2) assert z1**0 == Identity(n) assert MatPow(z1, 2).doit() == z1**2 pytest.raises(ValueError, lambda: MatPow(z1, -2).doit()) z2 = ZeroMatrix(3, 3) assert MatPow(z2, 4).doit() == z2**4 pytest.raises(ValueError, lambda: z2**-3) assert z2**3 == MatPow(z2, 3).doit() assert z2**0 == Identity(3) pytest.raises(ValueError, lambda: MatPow(z2, -1).doit())
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]), Rational(1, 2)).doit() == ImmutableMatrix([2])
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, Rational(1, 2)).as_explicit() == A**Rational(1, 2)
def test_MatrixSymbol(): n = Symbol('n', integer=True) A = MatrixSymbol('A', n, n) B = MatrixSymbol('B', n, n) assert mcode(A * B) == "A*B" assert mcode(B * A) == "B*A" assert mcode(2 * A * B) == "2*A*B" assert mcode(B * 2 * A) == "2*B*A" assert mcode(A * (B + 3 * Identity(n))) == "A*(3*eye(n) + B)" assert mcode(A**(x**2)) == "A^(x.^2)" assert mcode(A**3) == "A^3" assert mcode(A**(S.Half)) == "A^(1/2)"
def test_multiplication(): A = MatrixSymbol('A', n, m) B = MatrixSymbol('B', m, l) C = MatrixSymbol('C', n, n) assert (2 * A * B).shape == (n, l) assert (A * 0 * B) == ZeroMatrix(n, l) pytest.raises(ShapeError, lambda: B * A) assert (2 * A).shape == A.shape assert A * ZeroMatrix(m, m) * B == ZeroMatrix(n, l) assert C * Identity(n) * C.inverse() == Identity(n) assert B / 2 == Rational(1, 2) * B pytest.raises(NotImplementedError, lambda: 2 / B) A = MatrixSymbol('A', n, n) B = MatrixSymbol('B', n, n) assert Identity(n) * (A + B) == A + B
def test_MatPow(): A = MatrixSymbol('A', n, n) AA = MatPow(A, 2) assert AA.exp == 2 assert AA.base == A assert (A**n).exp == n assert A**0 == Identity(n) assert A**1 == A assert A**2 == AA assert A**-1 == Inverse(A) assert A**Rational(1, 2) == sqrt(A) pytest.raises(ShapeError, lambda: MatrixSymbol('B', 3, 2)**2)
def test_invariants(): A = MatrixSymbol('A', n, m) B = MatrixSymbol('B', m, l) X = MatrixSymbol('X', n, n) objs = [ Identity(n), ZeroMatrix(m, n), MatMul(A, B), MatAdd(A, A), Transpose(A), Adjoint(A), Inverse(X), MatPow(X, 2), MatPow(X, -1), MatPow(X, 0) ] for obj in objs: assert obj == obj.__class__(*obj.args)
def test_ZeroMatrix(): A = MatrixSymbol('A', n, m) Z = ZeroMatrix(n, m) assert A + Z == A assert A * Z.T == ZeroMatrix(n, n) assert Z * A.T == ZeroMatrix(n, n) assert A - A == ZeroMatrix(*A.shape) assert not Z assert transpose(Z) == ZeroMatrix(m, n) assert Z.conjugate() == Z assert ZeroMatrix(n, n)**0 == Identity(n) with pytest.raises(ShapeError): Z**0 with pytest.raises(ShapeError): Z**2
def test_Identity_doit(): Inn = Identity(Add(n, n, evaluate=False)) assert isinstance(Inn.rows, Add) assert Inn.doit() == Identity(2 * n) assert isinstance(Inn.doit().rows, Mul)
def test_remove_ids(): assert remove_ids(MatMul(A, Identity(m), B, evaluate=False)) == \ MatMul(A, B, evaluate=False) assert null_safe(remove_ids)(MatMul(Identity(n), evaluate=False)) == \ MatMul(Identity(n), evaluate=False)
def test_xxinv(): assert xxinv(MatMul(D, Inverse(D), D, evaluate=False)) == \ MatMul(Identity(n), D, evaluate=False)
def test_equality(): a, b, c = Identity(3), eye(3), ImmutableMatrix(eye(3)) for x in [a, b, c]: for y in [a, b, c]: assert x.equals(y)
def test_ME_MM(): assert isinstance(Identity(3) + MM, MatrixExpr) assert isinstance(SM + MM, MatAdd) assert isinstance(MM + SM, MatAdd) assert (Identity(3) + MM)[1, 1] == 6
""" import pytest from diofant import symbols from diofant.matrices import (Matrix, MatrixSymbol, eye, Identity, ImmutableMatrix) from diofant.matrices.expressions import MatrixExpr, MatAdd from diofant.matrices.matrices import classof SM = MatrixSymbol('X', 3, 3) MM = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) IM = ImmutableMatrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) meye = eye(3) imeye = ImmutableMatrix(eye(3)) ideye = Identity(3) a, b, c = symbols('a,b,c') def test_IM_MM(): assert isinstance(MM + IM, ImmutableMatrix) assert isinstance(IM + MM, ImmutableMatrix) assert isinstance(2 * IM + MM, ImmutableMatrix) assert MM.equals(IM) def test_ME_MM(): assert isinstance(Identity(3) + MM, MatrixExpr) assert isinstance(SM + MM, MatAdd) assert isinstance(MM + SM, MatAdd) assert (Identity(3) + MM)[1, 1] == 6
def test_dft(): assert DFT(4).shape == (4, 4) assert Abs(simplify(det(Matrix(DFT(4))))) == 1 assert DFT(n) * IDFT(n) == Identity(n) assert DFT(n)[i, j] == exp(-2 * S.Pi * I / n)**(i * j) / sqrt(n)
def test_doit_square_MatrixSymbol_symsize(): assert MatPow(C, 0).doit() == Identity(n) assert MatPow(C, 0).doit(deep=False) == Identity(n) assert MatPow(C, 1).doit() == C for r in [2, -1, pi]: assert MatPow(C, r).doit() == MatPow(C, r)
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_special_matrices(): assert mcode(6 * Identity(3)) == "6*eye(3)"