ó
    ‰*£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    Ú`/home/mande/repo/quber/.venv/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£   € à�z‰z‰ˆØ�<�<˜AŸLŸLÜ�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    € Ø×ÑÑ+Ü�!×)Ñ)Ó*¬a¯f©fÒ4Ü—v‘v�Ü�A×+Ñ+Ó,´·±Ò6Ü—v‘v�Ü�‹XˆØ”—‘Š<Ø—8‘8˜A˜D‘>Ð!Ø”1—7‘7Š]Ü—6‘6ˆMØ�x‰x˜˜‰~œn¨QÓ2Ñ2Ð2r   © N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úpropertyr   r   r$   r.   Ú__static_attributes__r0   r   r   r   r   	   s7   † ñ'ñP Ñ,Ó
-€CáÑ0Ó1€Eàñó ðõ"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)	Ú
DiagonalOféV   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ˆ   € à�x‰x�~‰~‰ˆØ�<�<˜AŸLŸLÜ�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   € à�z‰z˜!‰}Ðr   c                 ó<   • U R                   R                  " X40 UD6$ r   )r   r.   )r   r*   r+   r,   s       r   r.   ÚDiagonalOf._entry™   s   € Ø�x‰x�Š˜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›-ˆe�AŠh¨U°1©XˆØ�<‰<˜‰?˜aÓØ ˆC�Mà!ˆCŒMØ�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°Ñ8‰Fà—\‘\×(Ò(¨¨AÑ8°Ñ8ˆFØ‹6Ø”n QÓ*Ñ*ˆ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$ [        X‡5      (       aS  U" [        UR                  5      5      n	[!        U	R                  S   5       H  n
XŠ   XšU
4'   M     [#        U5      " U	5      $ UR$                  (       a¥  UR&                   Vs/ s H  o»R(                  (       d  M  UPM     nnUR&                   Vs/ s H  o»U;  d  M
  UPM     nnU(       aM  [*        R,                  " U5      [/        UR-                  U5      R1                  5       5      R1                  5       -  $ [        X…5      (       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Ø—‘ˆáˆq�z‰z˜&Ó!×"Ñ"ØˆMÜ�f×)Ñ)Ù”c˜&Ÿ,™,Ó'Ó(ˆCÜ˜3Ÿ9™9 Q™<Ö(�Ø"™I��q�D“	ñ )ä˜”< Ó$Ð$Ø××Ø'-§{¢{ÓD¢{ ·mµmŸ¡{ˆHÐDØ&,§k¢kÓI¢k˜sÀÑ5H—s¡kˆGÐIÞÜ—|’| GÓ,¬Z¸¿¹ÈÓ8Q×8VÑ8VÓ8XÓ-Y×-^Ñ-^Ó-`Ñ`Ð`Ü�f×(Ñ(Ø—Z‘ZˆFÜ˜&Ó!Ð!ùò 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3�Zô J3ôZD/�ô D/ôN;"�ô ;"ó|%r   