
    \h                         S SK Jr  S SKJr  S SKJrJrJr  S SKJ	r	  S SK
Jr   " S S\5      r " S S	\5      r " S
 S\5      rS rg)    )_sympify)
MatrixExpr)SEqGe)Mul)KroneckerDeltac                   R    \ rS rSrSr\" S 5      r\" S 5      r\S 5       rS r	Sr
g)	DiagonalMatrix	   a  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                      U R                   S   $ Nr   argsselfs    [/var/www/auris/envauris/lib/python3.13/site-packages/sympy/matrices/expressions/diagonal.py<lambda>DiagonalMatrix.<lambda>2       		!    c                 .    U R                   R                  $ N)argshaper   s    r   r   r   4   s    $((..r   c                 h   U R                   u  pUR                  (       a  UR                  (       a  [        X5      nU$ UR                  (       a  UR                  (       d  UnU$ UR                  (       a  UR                  (       d  UnU$ X:X  a  UnU$  [        X5      nU$ ! [         a    S n U$ f = fr   )r   
is_Integermin	TypeErrorr   rcms       r   diagonal_lengthDiagonalMatrix.diagonal_length6   s    zz<<ALLA	A  \\!,,A  \\!,,A  VA 	I   s   B! !B10B1c                    U R                   bl  [        XR                   5      [        R                  L a  [        R                  $ [        X R                   5      [        R                  L a  [        R                  $ [        X5      nU[        R                  L a  U R                  X4   $ U[        R                  L a  [        R                  $ U R                  X4   [        X5      -  $ r   )	r$   r   r   trueZeror   r   falser	   )r   ijkwargseqs        r   _entryDiagonalMatrix._entryH   s    +!))*aff4vvA++,6vvX<88AD>!177]66Mxx~nQ222r    N__name__
__module____qualname____firstlineno____doc__propertyr   r   r$   r.   __static_attributes__r0   r   r   r   r   	   s7    'P ,
-C01E "3r   r   c                   P    \ rS rSrSr\" S 5      r\S 5       r\S 5       rS r	Sr
g)	
DiagonalOfV   a  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                      U R                   S   $ r   r   r   s    r   r   DiagonalOf.<lambda>   r   r   c                    U R                   R                  u  pUR                  (       a  UR                  (       a  [        X5      nO^UR                  (       a  UR                  (       d  UnO9UR                  (       a  UR                  (       d  UnOX:X  a  UnO [        X5      nU[
        R                  4$ ! [         a    S n N f = fr   )r   r   r   r   r   r   Oner    s       r   r   DiagonalOf.shape   s    xx~~<<ALLA	A\\!,,A\\!,,AVAI !%%x  s   B7 7CCc                      U R                   S   $ r   )r   r   s    r   r$   DiagonalOf.diagonal_length   s    zz!}r   c                 <    U R                   R                  " X40 UD6$ r   )r   r.   )r   r*   r+   r,   s       r   r.   DiagonalOf._entry   s    xxq.v..r   r0   Nr1   r0   r   r   r:   r:   V   s@    *V ,
-C "  /r   r:   c                   F    \ rS rSrSrS r\S 5       rS rS r	S r
S rS	rg
)
DiagMatrix   z'
Turn a vector into a diagonal matrix.
c                     [        U5      n[        R                  " X5      nUR                  nUS   S:X  a  US   OUS   nUR                  S   S:w  a  SUl        OSUl        XD4Ul        Xl        U$ )Nr      TF)r   r   __new__r   	_iscolumn_shape_vector)clsvectorobjr   dims        r   rJ   DiagMatrix.__new__   so    &!  -(a-eAhU1X<<?a CM!CMZ

r   c                     U R                   $ r   )rL   r   s    r   r   DiagMatrix.shape   s    {{r   c                     U R                   (       a  U R                  R                  " US40 UD6nOU R                  R                  " SU40 UD6nX:w  a  U[        X5      -  nU$ r   )rK   rM   r.   r	   )r   r*   r+   r,   results        r   r.   DiagMatrix._entry   sX    >>\\((A88F\\((A88F6nQ**Fr   c                     U $ r   r0   r   s    r   _eval_transposeDiagMatrix._eval_transpose   s    r   c                 Z    SSK Jn  U" [        U R                  R	                  5       5      6 $ )Nr   )diag)sympy.matrices.denser\   listrM   as_explicit)r   r\   s     r   r_   DiagMatrix.as_explicit   s"    -T$,,224566r   c                 *   SSK JnJn  SSKJn  SSKJn  SSKJn  SSK	J
n  U R                  nU" UR                  U5      5      (       a  U$ [        X5      (       aS  U" [        UR                  5      5      n	[!        U	R                  S   5       H  n
X   XU
4'   M     [#        U5      " U	5      $ UR$                  (       a  UR&                   Vs/ s H  oR(                  (       d  M  UPM     nnUR&                   Vs/ s H  oU;  d  M
  UPM     nnU(       aM  [*        R,                  " U5      [/        UR-                  U5      R1                  5       5      R1                  5       -  $ [        X5      (       a  UR2                  n[/        U5      $ s  snf s  snf )Nr   )askQ)MatMul)	Transpose)eye)
MatrixBase)sympy.assumptionsrb   rc   !sympy.matrices.expressions.matmulrd   $sympy.matrices.expressions.transposere   r]   rf   sympy.matrices.matrixbaserg   rM   diagonal
isinstancemaxr   rangetype	is_MatMulr   	is_Matrixr   fromiterrF   doitr   )r   hintsrb   rc   rd   re   rf   rg   rO   retr*   r   matricesscalarss                 r   rt   DiagMatrix.doit   s%   ,<B,8qzz&!""Mf))c&,,'(C399Q<("IqD	 )<$$'-{{D{mm{HD&,kkIks5HskGI||G,Z8Q8V8V8X-Y-^-^-```f((ZZF&!! EIs   F%F;	FFr0   N)r2   r3   r4   r5   r6   rJ   r7   r   r.   rY   r_   rt   r8   r0   r   r   rF   rF      s4      7"r   rF   c                 4    [        U 5      R                  5       $ r   )rF   rt   )rO   s    r   diagonalize_vectorr{      s    f""$$r   N)sympy.core.sympifyr   sympy.matrices.expressionsr   
sympy.corer   r   r   sympy.core.mulr   (sympy.functions.special.tensor_functionsr	   r   r:   rF   r{   r0   r   r   <module>r      sG    ' 1      CJ3Z J3ZD/ D/N;" ;"|%r   