123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- from sympy.core.add import Add
- from sympy.core.expr import unchanged
- from sympy.core.mul import Mul
- from sympy.core.symbol import symbols
- from sympy.core.relational import Eq
- from sympy.concrete.summations import Sum
- from sympy.functions.elementary.complexes import im, re
- from sympy.functions.elementary.piecewise import Piecewise
- from sympy.matrices.immutable import ImmutableDenseMatrix
- from sympy.matrices.expressions.matexpr import MatrixSymbol
- from sympy.matrices.expressions.matadd import MatAdd
- from sympy.matrices.expressions.special import (
- ZeroMatrix, GenericZeroMatrix, Identity, GenericIdentity, OneMatrix)
- from sympy.matrices.expressions.matmul import MatMul
- from sympy.testing.pytest import raises
- def test_zero_matrix_creation():
- assert unchanged(ZeroMatrix, 2, 2)
- assert unchanged(ZeroMatrix, 0, 0)
- raises(ValueError, lambda: ZeroMatrix(-1, 2))
- raises(ValueError, lambda: ZeroMatrix(2.0, 2))
- raises(ValueError, lambda: ZeroMatrix(2j, 2))
- raises(ValueError, lambda: ZeroMatrix(2, -1))
- raises(ValueError, lambda: ZeroMatrix(2, 2.0))
- raises(ValueError, lambda: ZeroMatrix(2, 2j))
- n = symbols('n')
- assert unchanged(ZeroMatrix, n, n)
- n = symbols('n', integer=False)
- raises(ValueError, lambda: ZeroMatrix(n, n))
- n = symbols('n', negative=True)
- raises(ValueError, lambda: ZeroMatrix(n, n))
- def test_generic_zero_matrix():
- z = GenericZeroMatrix()
- n = symbols('n', integer=True)
- A = MatrixSymbol("A", n, n)
- assert z == z
- assert z != A
- assert A != z
- assert z.is_ZeroMatrix
- raises(TypeError, lambda: z.shape)
- raises(TypeError, lambda: z.rows)
- raises(TypeError, lambda: z.cols)
- assert MatAdd() == z
- assert MatAdd(z, A) == MatAdd(A)
- # Make sure it is hashable
- hash(z)
- def test_identity_matrix_creation():
- assert Identity(2)
- assert Identity(0)
- raises(ValueError, lambda: Identity(-1))
- raises(ValueError, lambda: Identity(2.0))
- raises(ValueError, lambda: Identity(2j))
- n = symbols('n')
- assert Identity(n)
- n = symbols('n', integer=False)
- raises(ValueError, lambda: Identity(n))
- n = symbols('n', negative=True)
- raises(ValueError, lambda: Identity(n))
- def test_generic_identity():
- I = GenericIdentity()
- n = symbols('n', integer=True)
- A = MatrixSymbol("A", n, n)
- assert I == I
- assert I != A
- assert A != I
- assert I.is_Identity
- assert I**-1 == I
- raises(TypeError, lambda: I.shape)
- raises(TypeError, lambda: I.rows)
- raises(TypeError, lambda: I.cols)
- assert MatMul() == I
- assert MatMul(I, A) == MatMul(A)
- # Make sure it is hashable
- hash(I)
- def test_one_matrix_creation():
- assert OneMatrix(2, 2)
- assert OneMatrix(0, 0)
- assert Eq(OneMatrix(1, 1), Identity(1))
- raises(ValueError, lambda: OneMatrix(-1, 2))
- raises(ValueError, lambda: OneMatrix(2.0, 2))
- raises(ValueError, lambda: OneMatrix(2j, 2))
- raises(ValueError, lambda: OneMatrix(2, -1))
- raises(ValueError, lambda: OneMatrix(2, 2.0))
- raises(ValueError, lambda: OneMatrix(2, 2j))
- n = symbols('n')
- assert OneMatrix(n, n)
- n = symbols('n', integer=False)
- raises(ValueError, lambda: OneMatrix(n, n))
- n = symbols('n', negative=True)
- raises(ValueError, lambda: OneMatrix(n, n))
- def test_ZeroMatrix():
- n, m = symbols('n m', integer=True)
- 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 Z
- assert Z.transpose() == ZeroMatrix(m, n)
- assert Z.conjugate() == Z
- assert Z.adjoint() == ZeroMatrix(m, n)
- assert re(Z) == Z
- assert im(Z) == Z
- assert ZeroMatrix(n, n)**0 == Identity(n)
- assert ZeroMatrix(3, 3).as_explicit() == ImmutableDenseMatrix.zeros(3, 3)
- def test_ZeroMatrix_doit():
- n = symbols('n', integer=True)
- Znn = ZeroMatrix(Add(n, n, evaluate=False), n)
- assert isinstance(Znn.rows, Add)
- assert Znn.doit() == ZeroMatrix(2*n, n)
- assert isinstance(Znn.doit().rows, Mul)
- def test_OneMatrix():
- n, m = symbols('n m', integer=True)
- A = MatrixSymbol('A', n, m)
- U = OneMatrix(n, m)
- assert U.shape == (n, m)
- assert isinstance(A + U, Add)
- assert U.transpose() == OneMatrix(m, n)
- assert U.conjugate() == U
- assert U.adjoint() == OneMatrix(m, n)
- assert re(U) == U
- assert im(U) == ZeroMatrix(n, m)
- assert OneMatrix(n, n) ** 0 == Identity(n)
- U = OneMatrix(n, n)
- assert U[1, 2] == 1
- U = OneMatrix(2, 3)
- assert U.as_explicit() == ImmutableDenseMatrix.ones(2, 3)
- def test_OneMatrix_doit():
- n = symbols('n', integer=True)
- Unn = OneMatrix(Add(n, n, evaluate=False), n)
- assert isinstance(Unn.rows, Add)
- assert Unn.doit() == OneMatrix(2 * n, n)
- assert isinstance(Unn.doit().rows, Mul)
- def test_OneMatrix_mul():
- n, m, k = symbols('n m k', integer=True)
- w = MatrixSymbol('w', n, 1)
- assert OneMatrix(n, m) * OneMatrix(m, k) == OneMatrix(n, k) * m
- assert w * OneMatrix(1, 1) == w
- assert OneMatrix(1, 1) * w.T == w.T
- def test_Identity():
- n, m = symbols('n m', integer=True)
- A = MatrixSymbol('A', n, m)
- i, j = symbols('i j')
- In = Identity(n)
- Im = Identity(m)
- assert A*Im == A
- assert In*A == A
- assert In.transpose() == In
- assert In.inverse() == In
- assert In.conjugate() == In
- assert In.adjoint() == In
- assert re(In) == In
- assert im(In) == ZeroMatrix(n, n)
- assert In[i, j] != 0
- assert Sum(In[i, j], (i, 0, n-1), (j, 0, n-1)).subs(n,3).doit() == 3
- assert Sum(Sum(In[i, j], (i, 0, n-1)), (j, 0, n-1)).subs(n,3).doit() == 3
- # If range exceeds the limit `(0, n-1)`, do not remove `Piecewise`:
- expr = Sum(In[i, j], (i, 0, n-1))
- assert expr.doit() == 1
- expr = Sum(In[i, j], (i, 0, n-2))
- assert expr.doit().dummy_eq(
- Piecewise(
- (1, (j >= 0) & (j <= n-2)),
- (0, True)
- )
- )
- expr = Sum(In[i, j], (i, 1, n-1))
- assert expr.doit().dummy_eq(
- Piecewise(
- (1, (j >= 1) & (j <= n-1)),
- (0, True)
- )
- )
- assert Identity(3).as_explicit() == ImmutableDenseMatrix.eye(3)
- def test_Identity_doit():
- n = symbols('n', integer=True)
- Inn = Identity(Add(n, n, evaluate=False))
- assert isinstance(Inn.rows, Add)
- assert Inn.doit() == Identity(2*n)
- assert isinstance(Inn.doit().rows, Mul)
|