ó
    ‰*£h`6  ã                   óâ   • S SK Jr  S SKJrJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJrJrJrJrJrJr  S SKJr  S r " S S\5      rS r S r! " S S\5      r"g)é    )ÚCounter)ÚMulÚsympify)ÚAdd)ÚExprBuilder)Údefault_sort_key)Úlog)Ú
MatrixExpr)Úvalidate_matadd_integer)Ú
ZeroMatrixÚ	OneMatrix)ÚunpackÚflattenÚ	conditionÚexhaustÚrm_idÚsort)Úsympy_deprecation_warningc                  óz   • U (       d  [        S5      e[        U 5      S:X  a  U S   $ [        U 6 R                  5       $ )aA  
Return the elementwise (aka Hadamard) product of matrices.

Examples
========

>>> from sympy import hadamard_product, MatrixSymbol
>>> A = MatrixSymbol('A', 2, 3)
>>> B = MatrixSymbol('B', 2, 3)
>>> hadamard_product(A)
A
>>> hadamard_product(A, B)
HadamardProduct(A, B)
>>> hadamard_product(A, B)[0, 1]
A[0, 1]*B[0, 1]
z#Empty Hadamard product is undefinedé   r   )Ú	TypeErrorÚlenÚHadamardProductÚdoit)Úmatricess    Ú`/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/matrices/expressions/hadamard.pyÚhadamard_productr      s=   € ö" ÜÐ=Ó>Ð>Ü
ˆ8ƒ}˜ÓØ˜‰{ÐÜ˜HÐ%×*Ñ*Ó,Ð,ó    c                   óh   ^ • \ rS rSrSrSrSSS.U 4S jjr\S 5       rS	 r	S
 r
S rS rS rSrU =r$ )r   é)   aì  
Elementwise product of matrix expressions

Examples
========

Hadamard product for matrix symbols:

>>> from sympy import hadamard_product, HadamardProduct, MatrixSymbol
>>> A = MatrixSymbol('A', 5, 5)
>>> B = MatrixSymbol('B', 5, 5)
>>> isinstance(hadamard_product(A, B), HadamardProduct)
True

Notes
=====

This is a symbolic object that simply stores its argument without
evaluating it. To actually compute the product, use the function
``hadamard_product()`` or ``HadamardProduct.doit``
TFN)ÚevaluateÚcheckc                ó6  >• [        [        [        U5      5      n[        U5      S:X  a  [	        S5      e[        S U 5       5      (       d  [        S5      eUb  [        SSSS9  US	La  [        U6   [        TU ](  " U /UQ76 nU(       a  UR                  S	S
9nU$ )Nr   z+HadamardProduct needs at least one argumentc              3   óB   #   • U  H  n[        U[        5      v •  M     g 7f©N)Ú
isinstancer
   )Ú.0Úargs     r   Ú	<genexpr>Ú*HadamardProduct.__new__.<locals>.<genexpr>G   s   é € Ð?º$°3”:˜c¤:×.Ð.º$ùó   ‚z Mix of Matrix and Scalar symbolszjPassing check to HadamardProduct is deprecated and the check argument will be removed in a future version.z1.11z,remove-check-argument-from-matrix-operations)Údeprecated_since_versionÚactive_deprecations_targetF)Údeep)ÚlistÚmapr   r   Ú
ValueErrorÚallr   r   ÚvalidateÚsuperÚ__new__r   )Úclsr!   r"   ÚargsÚobjÚ	__class__s        €r   r5   ÚHadamardProduct.__new__A   sœ   ø€ Ü”Cœ Ó&Ó'ˆÜˆt‹9˜‹>äÐJÓKÐKäÑ?¹$Ó?×?Ñ?ÜÐ>Ó?Ð?àÑÜ%Ø|Ø)/Ø+Yò[ð
 ˜ÒÜ�d‰Oä‰gŠo˜cÐ) DÒ)ˆÞØ—(‘( �(Ð&ˆCØˆ
r   c                 ó4   • U R                   S   R                  $ ©Nr   )r7   Úshape©Úselfs    r   r=   ÚHadamardProduct.shapeX   s   € à�y‰y˜‰|×!Ñ!Ð!r   c           
      ór   • [        U R                   Vs/ s H  oDR                  " X40 UD6PM     sn6 $ s  snf r%   )r   r7   Ú_entry)r?   ÚiÚjÚkwargsr(   s        r   rB   ÚHadamardProduct._entry\   s/   € Ü¸4¿9º9ÓEº9°C—Z’Z Ñ/¨Ô/¹9ÑEÐFÐFùÒEs   ”4c                 óV   • SSK Jn  [        [        [	        XR
                  5      5      6 $ ©Nr   )Ú	transpose)Ú$sympy.matrices.expressions.transposerI   r   r/   r0   r7   ©r?   rI   s     r   Ú_eval_transposeÚHadamardProduct._eval_transpose_   s   € ÝBÜ¤¤S¨·I±IÓ%>Ó ?Ð@Ð@r   c                 óò  ^• U R                   " U4S jU R                   5       6 nSSKJn  SSKJn  UR                   Vs/ s H  n[        XS5      (       d  M  UPM     nnU(       ay  UR                   Vs/ s H  oUU;  d  M
  UPM     nnU" [        U6  Vs/ s H  n[        R                  " U5      PM     sn5      R                  " U R                  6 n[        U/U-   6 n[        U5      $ s  snf s  snf s  snf )Nc              3   óF   >#   • U  H  oR                   " S0 TD6v •  M     g 7f)N© )r   )r'   rC   Úhintss     €r   r)   Ú'HadamardProduct.doit.<locals>.<genexpr>d   s   øé € Ð>²I¨qŸ6š6™? Ež?²Iùs   ƒ!r   )Ú
MatrixBase)ÚImmutableMatrix)Úfuncr7   Úsympy.matrices.matrixbaserS   Úsympy.matrices.immutablerT   r&   Úzipr   ÚfromiterÚreshaper=   r   Úcanonicalize)	r?   rQ   ÚexprrS   rT   rC   ÚexplicitÚ	remainderÚexpl_mats	    `       r   r   ÚHadamardProduct.doitc   sÏ   ø€ Ø�yŠyÔ>°D·I²IÓ>Ð?ˆå8Ý<à#ŸyšyÓFšy˜!¬J°q×,E—A™yˆÐFÞØ$(§I¢IÓC¢I˜q¸(Ñ1BŸ¡IˆIÐCÙ&Ü),¨h©ó(Ú)7 A”—’˜Q–©ñ(ó ç‰wðàŸ
™
ð$ˆHô # h Z°)Ñ%;Ð=ˆDä˜DÓ!Ð!ùò GùâCùò(s   ¿C*ÁC*Á4	C/ÂC/Â C4c                 ó  • / n[        U R                  5      n[        [        U5      5       H<  nUS U X4   R	                  U5      /-   X4S-   S  -   nUR                  [        U6 5        M>     [        R                  " U5      $ ©Nr   )	r/   r7   Úranger   ÚdiffÚappendr   r   rY   )r?   ÚxÚtermsr7   rC   Úfactorss         r   Ú_eval_derivativeÚ HadamardProduct._eval_derivatives   st   € ØˆÜ�D—I‘I‹ˆÜ”s˜4“yÖ!ˆAØ˜2˜A�h $¡'§,¡,¨q£/Ð!2Ñ2°T¸A¹#¸$°ZÑ?ˆGØ�L‰LÔ)¨7Ð3Ö4ñ "ô �|Š|˜EÓ"Ð"r   c                 ó¶  • SSK Jn  SSK Jn  SSKJn  [        U R                  5       VVs/ s H  u  pVUR                  U5      (       d  M  UPM!     nnn/ nU GHp  n	U R                  S U	 n
U R                  U	S-   S  nU R                  U	   R                  U5      n[        Xº-   6 nSS/n[        U5       VVs/ s H  u  nnU R                  U   S:w  d  M  UPM     nnnU Hä  nUR                  UR                     nUR                  UR                     n[        U[        U[        UU/5      U[        UU/5      /5      /UQ5      nUR                  S   R                  S   R                  Ul        SUl        UR                  S   R                  S   R                  Ul        SUl        U/Ul        UR'                  U5        Mæ     GMs     U$ s  snnf s  snnf )	Nr   ©ÚArrayDiagonal©ÚArrayTensorProduct©Ú_make_matrixr   )r   é   ©é   é   rr   )Ú0sympy.tensor.array.expressions.array_expressionsrm   ro   Ú"sympy.matrices.expressions.matexprrq   Ú	enumerater7   ÚhasÚ_eval_derivative_matrix_linesr   r=   Ú_linesÚ_first_line_indexÚ_second_line_indexr   Ú_first_pointer_parentÚ_first_pointer_indexÚ_second_pointer_parentÚ_second_pointer_indexre   )r?   rf   rm   ro   rq   rC   r(   Ú
with_x_indÚlinesÚindÚ	left_argsÚ
right_argsÚdÚhadamÚdiagonalrD   ÚeÚl1Úl2Úsubexprs                       r   rz   Ú-HadamardProduct._eval_derivative_matrix_lines{   s»  € ÝRÝWÝCä&/°·	±	Ô&:ÔIÒ&:™F˜A¸c¿g¹gÀa¿j—aÑ&:ˆ
ÑIØˆÜˆCØŸ	™	 $ 3˜ˆIØŸ™ 3 q¡5 6Ð*ˆJà—	‘	˜#‘×<Ñ<¸QÓ?ˆAÜ$ zÑ'=Ð?ˆEØ Ð'ˆHÜ&/°Ô&9ÔPÒ&9™d˜a ¸T¿Z¹ZÈ¹]ÈaÑ=OŸÑ&9ˆHÑPÛ�Ø—X‘X˜a×1Ñ1Ñ2�Ø—X‘X˜a×2Ñ2Ñ3�Ü%Ø!ä#Ø.ä +¨L¸2¸$Ó ?Ø %Ü +¨L¸2¸$Ó ?ðóð	ð ð	ó�ð +2¯,©,°q©/×*>Ñ*>¸qÑ*A×*FÑ*F�Ô'Ø)*�Ô&Ø+2¯<©<¸©?×+?Ñ+?ÀÑ+B×+GÑ+G�Ô(Ø*+�Ô'Ø#˜9�”Ø—‘˜Q–ô- ñ ð@ ˆùóE Jùó Qs   «GÁGÂ7GÃGrP   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úis_HadamardProductr5   Úpropertyr=   rB   rL   r   ri   rz   Ú__static_attributes__Ú__classcell__©r9   s   @r   r   r   )   sS   ø† ñð* Ðà%*°$÷ ð ð. ñ"ó ð"òGòAò"ò #÷'ð 'r   r   c                 ó  • [        S [        5      n[        U5      nU" U 5      n [        S [        S 5      5      nU" U 5      n S n[        S U5      nU" U 5      n [	        U [
        5      (       ak  [        U R                  5      n/ nUR                  5        H8  u  pgUS:X  a  UR                  U5        M  UR                  [        Xg5      5        M:     [        U6 n [        S [        [        5      5      nU" U 5      n [        U 5      n U $ )a  Canonicalize the Hadamard product ``x`` with mathematical properties.

Examples
========

>>> from sympy import MatrixSymbol, HadamardProduct
>>> from sympy import OneMatrix, ZeroMatrix
>>> from sympy.matrices.expressions.hadamard import canonicalize
>>> from sympy import init_printing
>>> init_printing(use_unicode=False)

>>> A = MatrixSymbol('A', 2, 2)
>>> B = MatrixSymbol('B', 2, 2)
>>> C = MatrixSymbol('C', 2, 2)

Hadamard product associativity:

>>> X = HadamardProduct(A, HadamardProduct(B, C))
>>> X
A.*(B.*C)
>>> canonicalize(X)
A.*B.*C

Hadamard product commutativity:

>>> X = HadamardProduct(A, B)
>>> Y = HadamardProduct(B, A)
>>> X
A.*B
>>> Y
B.*A
>>> canonicalize(X)
A.*B
>>> canonicalize(Y)
A.*B

Hadamard product identity:

>>> X = HadamardProduct(A, OneMatrix(2, 2))
>>> X
A.*1
>>> canonicalize(X)
A

Absorbing element of Hadamard product:

>>> X = HadamardProduct(A, ZeroMatrix(2, 2))
>>> X
A.*0
>>> canonicalize(X)
0

Rewriting to Hadamard Power

>>> X = HadamardProduct(A, A, A)
>>> X
A.*A.*A
>>> canonicalize(X)
 .3
A

Notes
=====

As the Hadamard product is associative, nested products can be flattened.

The Hadamard product is commutative so that factors can be sorted for
canonical form.

A matrix of only ones is an identity for Hadamard product,
so every matrices of only ones can be removed.

Any zero matrix will make the whole product a zero matrix.

Duplicate elements can be collected and rewritten as HadamardPower

References
==========

.. [1] https://en.wikipedia.org/wiki/Hadamard_product_(matrices)
c                 ó"   • [        U [        5      $ r%   ©r&   r   ©rf   s    r   Ú<lambda>Úcanonicalize.<locals>.<lambda>û   ó   € ”j ¤OÔ4r   c                 ó"   • [        U [        5      $ r%   r›   rœ   s    r   r�   rž     rŸ   r   c                 ó"   • [        U [        5      $ r%   )r&   r   rœ   s    r   r�   rž     s   € œJ q¬)Ô4r   c                 ól   • [        S U R                   5       5      (       a  [        U R                  6 $ U $ )Nc              3   óB   #   • U  H  n[        U[        5      v •  M     g 7fr%   )r&   r   )r'   Úcs     r   r)   Ú/canonicalize.<locals>.absorb.<locals>.<genexpr>
  s   é € Ð9²&¨QŒz˜!œZ×(Ð(²&ùr+   )Úanyr7   r   r=   rœ   s    r   ÚabsorbÚcanonicalize.<locals>.absorb	  s+   € ÜÑ9°!·&²&Ó9×9Ñ9Ü˜qŸw™wÐ'Ð'àˆHr   c                 ó"   • [        U [        5      $ r%   r›   rœ   s    r   r�   rž     rŸ   r   r   c                 ó"   • [        U [        5      $ r%   r›   rœ   s    r   r�   rž   #  rŸ   r   )r   r   r   r   r&   r   r   r7   Úitemsre   ÚHadamardPowerr   r   r   )rf   ÚruleÚfunr§   ÚtallyÚnew_argÚbaseÚexps           r   r[   r[   §   s  € ôf Ù4Üó
€Dô �$‹-€CÙˆA‹€Aô Ù4ÜÑ4Ó5ó
€Cñ 	ˆA‹€Aòô
 Ù4Øó
€Cñ 	ˆA‹€Aô �!”_×%Ñ%Ü˜Ÿ™“ˆàˆØŸ™ž‰IˆDØ�a‹xØ—‘˜tÖ$à—‘œ}¨TÓ7Ö8ñ	 'ô ˜WÐ%ˆô Ù4ÜÔ!Ó"ó
€Cñ 	ˆA‹€Aô 	ˆq‹	€AØ€Hr   c                 ó¶   • [        U 5      n [        U5      nUS:X  a  U $ U R                  (       d  X-  $ UR                  (       a  [        S5      e[        X5      $ )Nr   z#cannot raise expression to a matrix)r   Ú	is_Matrixr1   r¬   )r±   r²   s     r   Úhadamard_powerrµ   -  sM   € Ü�4‹=€DÜ
�#‹,€CØ
ˆaƒxØˆØ�>�>Ø‰yÐØ
‡}‡}ÜÐ>Ó?Ð?Ü˜Ó#Ð#r   c                   ót   ^ • \ rS rSrSrU 4S jr\S 5       r\S 5       r\S 5       r	S r
S rS	 rS
 rSrU =r$ )r¬   i9  a   
Elementwise power of matrix expressions

Parameters
==========

base : scalar or matrix

exp : scalar or matrix

Notes
=====

There are four definitions for the hadamard power which can be used.
Let's consider `A, B` as `(m, n)` matrices, and `a, b` as scalars.

Matrix raised to a scalar exponent:

.. math::
    A^{\circ b} = \begin{bmatrix}
    A_{0, 0}^b   & A_{0, 1}^b   & \cdots & A_{0, n-1}^b   \\
    A_{1, 0}^b   & A_{1, 1}^b   & \cdots & A_{1, n-1}^b   \\
    \vdots       & \vdots       & \ddots & \vdots         \\
    A_{m-1, 0}^b & A_{m-1, 1}^b & \cdots & A_{m-1, n-1}^b
    \end{bmatrix}

Scalar raised to a matrix exponent:

.. math::
    a^{\circ B} = \begin{bmatrix}
    a^{B_{0, 0}}   & a^{B_{0, 1}}   & \cdots & a^{B_{0, n-1}}   \\
    a^{B_{1, 0}}   & a^{B_{1, 1}}   & \cdots & a^{B_{1, n-1}}   \\
    \vdots         & \vdots         & \ddots & \vdots           \\
    a^{B_{m-1, 0}} & a^{B_{m-1, 1}} & \cdots & a^{B_{m-1, n-1}}
    \end{bmatrix}

Matrix raised to a matrix exponent:

.. math::
    A^{\circ B} = \begin{bmatrix}
    A_{0, 0}^{B_{0, 0}}     & A_{0, 1}^{B_{0, 1}}     &
    \cdots & A_{0, n-1}^{B_{0, n-1}}     \\
    A_{1, 0}^{B_{1, 0}}     & A_{1, 1}^{B_{1, 1}}     &
    \cdots & A_{1, n-1}^{B_{1, n-1}}     \\
    \vdots                  & \vdots                  &
    \ddots & \vdots                      \\
    A_{m-1, 0}^{B_{m-1, 0}} & A_{m-1, 1}^{B_{m-1, 1}} &
    \cdots & A_{m-1, n-1}^{B_{m-1, n-1}}
    \end{bmatrix}

Scalar raised to a scalar exponent:

.. math::
    a^{\circ b} = a^b
c                 ó
  >• [        U5      n[        U5      nUR                  (       a  UR                  (       a  X-  $ [        U[        5      (       a   [        U[        5      (       a  [	        X5        [
        TU ]  XU5      nU$ r%   )r   Ú	is_scalarr&   r
   r3   r4   r5   )r6   r±   r²   r8   r9   s       €r   r5   ÚHadamardPower.__new__r  s`   ø€ Ü�t‹}ˆÜ�c‹lˆà�>�>˜cŸmŸmØ‘;Ðä�dœJ×'Ñ'¬J°s¼J×,GÑ,GÜ�TÔä‰g‰o˜c¨Ó-ˆØˆ
r   c                 ó    • U R                   S   $ r<   ©Ú_argsr>   s    r   r±   ÚHadamardPower.base  ó   € à�z‰z˜!‰}Ðr   c                 ó    • U R                   S   $ rb   r»   r>   s    r   r²   ÚHadamardPower.expƒ  r¾   r   c                 ó�   • U R                   R                  (       a  U R                   R                  $ U R                  R                  $ r%   )r±   r´   r=   r²   r>   s    r   r=   ÚHadamardPower.shape‡  s+   € à�9‰9××Ø—9‘9—?‘?Ð"Ø�x‰x�~‰~Ðr   c                 óŠ  • U R                   nU R                  nUR                  (       a  UR                  " X40 UD6nO.UR                  (       a  UnO[        SR                  U5      5      eUR                  (       a  UR                  " X40 UD6nXg-  $ UR                  (       a  UnXg-  $ [        SR                  U5      5      e)Nz)The base {} must be a scalar or a matrix.z-The exponent {} must be a scalar or a matrix.)r±   r²   r´   rB   r¸   r1   Úformat)r?   rC   rD   rE   r±   r²   ÚaÚbs           r   rB   ÚHadamardPower._entry�  s²   € Ø�y‰yˆØ�h‰hˆà�>�>Ø—’˜AÑ+ FÑ+‰AØ�^�^Ø‰AäØ;×BÑBÀ4ÓHóJð Jð �=�=Ø—
’
˜1Ñ* 6Ñ*ˆAð ‰vˆð �]�]ØˆAð
 ‰vˆô Ø?×FÑFÀsÓKóMð Mr   c                 óZ   • SSK Jn  [        U" U R                  5      U R                  5      $ rH   )rJ   rI   r¬   r±   r²   rK   s     r   rL   ÚHadamardPower._eval_transpose£  s   € ÝBÜ™Y t§y¡yÓ1°4·8±8Ó<Ð<r   c                 óÔ   • U R                   R                  U5      nU R                  R                  [        5      nUR                  U5      n[        X#-  U R                   U-  -   U 5      $ r%   )r²   rd   r±   Ú	applyfuncr	   r   )r?   rf   ÚdexpÚlogbaseÚdlbases        r   ri   ÚHadamardPower._eval_derivative§  sW   € Ø�x‰x�}‰}˜QÓˆØ—)‘)×%Ñ%¤cÓ*ˆØ—‘˜a“ˆÜØ‰L˜4Ÿ8™8 F™?Ñ*Øó
ð 	
r   c                 ó,  • SSK Jn  SSK Jn  SSKJn  U R
                  R                  U5      nU GHY  nSS/n[        U5       VV	s/ s H&  u  p‰U R
                  R                  U   S:w  d  M$  U	PM(     nnn	UR                  UR                     n
UR                  UR                     n[        U[        U[        XJ/5      U R                  [        U R
                  U R                  S-
  5      -  [        XK/5      /5      /UQUR                  S9nUR                   S   R                   S   R                   Ul        SUl        SUl
        UR                   S   R                   S	   R                   Ul        SUl        SUl        U/Ul	        GM\     U$ s  sn	nf )
Nr   rn   rl   rp   )r   rr   rs   r   )Ú	validatorrr   )rv   ro   rm   rw   rq   r±   rz   rx   r=   r{   r|   r}   r   r²   rµ   Ú	_validater7   r~   r   r€   r�   )r?   rf   ro   rm   rq   ÚlrrC   r‰   rD   rŠ   r‹   rŒ   r�   s                r   rz   Ú+HadamardPower._eval_derivative_matrix_lines°  sq  € ÝWÝRÝCà�Y‰Y×4Ñ4°QÓ7ˆÜˆAØ Ð'ˆHÜ&/°Ô&9ÔUÒ&9™d˜a¸T¿Y¹Y¿_¹_ÈQÑ=OÐSTÑ=TŸÑ&9ˆHÑUØ—‘˜!×-Ñ-Ñ.ˆBØ—‘˜!×.Ñ.Ñ/ˆBÜ!ØäØ*ä'¨°dÓ;Ø ŸH™H¤^°D·I±I¸t¿x¹xÈ¹zÓ%JÑJÜ'¨°dÓ;ðóð	ð ð	ð (×1Ñ1ñˆGð '.§l¡l°1¡o×&:Ñ&:¸1Ñ&=×&BÑ&BˆAÔ#Ø%&ˆAÔ"Ø"#ˆAÔØ'.§|¡|°A¡×';Ñ';¸AÑ'>×'CÑ'CˆAÔ$Ø&'ˆAÔ#Ø#$ˆAÔ Ø�yˆA�Hñ3 ð4 ˆ	ùó1 Vs   Á#FÁ-FrP   )r�   r�   r‘   r’   r“   r5   r•   r±   r²   r=   rB   rL   ri   rz   r–   r—   r˜   s   @r   r¬   r¬   9  sc   ø† ñ6õpð ñó ðð ñó ðð ñó ðò
ò,=ò
÷ ð  r   r¬   N)#Úcollectionsr   Ú
sympy.corer   r   Úsympy.core.addr   Úsympy.core.exprr   Úsympy.core.sortingr   Ú&sympy.functions.elementary.exponentialr	   rw   r
   Ú!sympy.matrices.expressions._shaper   r3   Ú"sympy.matrices.expressions.specialr   r   Úsympy.strategiesr   r   r   r   r   r   Úsympy.utilities.exceptionsr   r   r   r[   rµ   r¬   rP   r   r   Ú<module>rß      s^   ðÝ ç #Ý Ý 'Ý /Ý 6Ý 9Ý Qß D÷÷ õ Aò-ô0y�jô yò|CòL	$ôW�Jõ Wr   