B
    [
                 @   s`   d dl mZmZ d dlmZ d dlmZmZmZ d dl	m
Z
 G dd deZG dd deZd	S )
    )print_functiondivision)
MatrixExpr)SEqGe)KroneckerDeltac               @   s<   e Zd ZdZedd Zedd Zedd Zdd Zd	S )
DiagonalMatrixa  DiagonalMatrix(M) will create a matrix expression that
    behaves as though all off-diagonal elements,
    `M[i, j]` where `i != j`, are zero.

    Examples
    ========

    >>> from sympy import MatrixSymbol, DiagonalMatrix, Symbol
    >>> n = Symbol('n', integer=True)
    >>> m = Symbol('m', integer=True)
    >>> D = DiagonalMatrix(MatrixSymbol('x', 2, 3))
    >>> D[1, 2]
    0
    >>> D[1, 1]
    x[1, 1]

    The length of the diagonal -- the lesser of the two dimensions of `M` --
    is accessed through the `diagonal_length` property:

    >>> D.diagonal_length
    2
    >>> DiagonalMatrix(MatrixSymbol('x', n + 1, n)).diagonal_length
    n

    When one of the dimensions is symbolic the other will be treated as
    though it is smaller:

    >>> tall = DiagonalMatrix(MatrixSymbol('x', n, 3))
    >>> tall.diagonal_length
    3
    >>> tall[10, 1]
    0

    When the size of the diagonal is not known, a value of None will
    be returned:

    >>> DiagonalMatrix(MatrixSymbol('x', n, m)).diagonal_length is None
    True

    c             C   s
   | j d S )Nr   )args)self r   Blib/python3.7/site-packages/sympy/matrices/expressions/diagonal.py<lambda>1   s    zDiagonalMatrix.<lambda>c             C   s   | j jS )N)argshape)r   r   r   r   r   3   s    c             C   s   | j \}}|jr"|jr"t||}nZ|jr4|js4|}nH|jrF|jsF|}n6||krT|}n(yt||}W n tk
rz   d }Y nX |S )N)r   
is_Integermin	TypeError)r   rcmr   r   r   diagonal_length5   s    

zDiagonalMatrix.diagonal_lengthc             C   s   | j d k	r:t|| j tjkr"tjS t|| j tjkr:tjS t||}|tjkr\| j||f S |tjkrltjS | j||f t|| S )N)	r   r   r   trueZZeror   r   Zfalser   )r   ijeqr   r   r   _entryG   s    



zDiagonalMatrix._entryN)	__name__
__module____qualname____doc__propertyr   r   r   r   r   r   r   r   r	      s
   (r	   c               @   s<   e Zd ZdZedd Zedd Zedd Zdd	 Zd
S )
DiagonalOfa  DiagonalOf(M) will create a matrix expression that
    is equivalent to the diagonal of `M`, represented as
    a single column matrix.

    Examples
    ========

    >>> from sympy import MatrixSymbol, DiagonalOf, Symbol
    >>> n = Symbol('n', integer=True)
    >>> m = Symbol('m', integer=True)
    >>> x = MatrixSymbol('x', 2, 3)
    >>> diag = DiagonalOf(x)
    >>> diag.shape
    (2, 1)

    The diagonal can be addressed like a matrix or vector and will
    return the corresponding element of the original matrix:

    >>> diag[1, 0] == diag[1] == x[1, 1]
    True

    The length of the diagonal -- the lesser of the two dimensions of `M` --
    is accessed through the `diagonal_length` property:

    >>> diag.diagonal_length
    2
    >>> DiagonalOf(MatrixSymbol('x', n + 1, n)).diagonal_length
    n

    When only one of the dimensions is symbolic the other will be
    treated as though it is smaller:

    >>> dtall = DiagonalOf(MatrixSymbol('x', n, 3))
    >>> dtall.diagonal_length
    3

    When the size of the diagonal is not known, a value of None will
    be returned:

    >>> DiagonalOf(MatrixSymbol('x', n, m)).diagonal_length is None
    True

    c             C   s
   | j d S )Nr   )r
   )r   r   r   r   r      s    zDiagonalOf.<lambda>c             C   s   | j j\}}|jr$|jr$t||}nZ|jr6|js6|}nH|jrH|jsH|}n6||krV|}n(yt||}W n tk
r|   d }Y nX |tjfS )N)r   r   r   r   r   r   ZOne)r   r   r   r   r   r   r   r      s    
zDiagonalOf.shapec             C   s
   | j d S )Nr   )r   )r   r   r   r   r      s    zDiagonalOf.diagonal_lengthc             C   s   | j ||f S )N)r   )r   r   r   r   r   r   r      s    zDiagonalOf._entryN)	r   r   r   r    r!   r   r   r   r   r   r   r   r   r"   U   s
   +r"   N)Z
__future__r   r   Zsympy.matrices.expressionsr   Z
sympy.corer   r   r   Z(sympy.functions.special.tensor_functionsr   r	   r"   r   r   r   r   <module>   s
   M