Ë
    7^(h`6  ã                   óâ   — d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZmZmZmZmZ d dlmZ d„ Z G d„ de«      Zd„ Z d„ Z! G d„ de«      Z"y)é    )Ú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                  ón   — | st        d«      ‚t        | «      dk(  r| d   S t        | Ž j                  «       S )au  
    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    úa/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/matrices/expressions/hadamard.pyÚhadamard_productr      s=   € ñ" ÜÐ=Ó>Ð>Ü
ˆ8ƒ}˜ÒØ˜‰{ÐÜ˜HÐ%×*Ñ*Ó,Ð,ó    c                   ó\   ‡ — e Zd ZdZdZdddœˆ fd„
Zed„ «       Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zˆ xZS )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                ó&  •— t        t        t        |«      «      }t        |«      dk(  rt	        d«      ‚t        d„ |D «       «      st        d«      ‚|�t        ddd¬«       |d	urt        |Ž  t        ‰| �(  | g|¢­Ž }|r|j                  d	¬
«      }|S )Nr   z+HadamardProduct needs at least one argumentc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­w©N)Ú
isinstancer
   )Ú.0Úargs     r   ú	<genexpr>z*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   r3   zHadamardProduct.__new__A   s™   ø€ Ü”Cœ Ó&Ó'ˆÜˆt‹9˜Š>äÐJÓKÐKäÑ?¸$Ô?Ô?ÜÐ>Ó?Ð?àÐÜ%Ø|Ø)/Ø+Yõ[ð
 ˜ÑÜ�d‰Oä‰g‰o˜cÐ) DÒ)ˆÙØ—(‘( �(Ó&ˆCØˆ
r   c                 ó4   — | j                   d   j                  S ©Nr   )r5   Úshape©Úselfs    r   r:   zHadamardProduct.shapeX   s   € à�y‰y˜‰|×!Ñ!Ð!r   c           
      óp   — t        | j                  D �cg c]  } |j                  ||fi |¤Ž‘Œ c}Ž S c c}w r$   )r   r5   Ú_entry)r<   ÚiÚjÚkwargsr'   s        r   r>   zHadamardProduct._entry\   s1   € Ü¸4¿9¹9ÖE°C�Z�S—Z‘Z  1Ñ/¨Ó/ÒEÐFÐFùÒEs   ”3c                 óX   — ddl m} t        t        t	        || j
                  «      «      Ž S ©Nr   )Ú	transpose)Ú$sympy.matrices.expressions.transposerD   r   r-   r.   r5   ©r<   rD   s     r   Ú_eval_transposezHadamardProduct._eval_transpose_   s    € ÝBÜ¤¤S¨°D·I±IÓ%>Ó ?Ð@Ð@r   c           	      óÄ  ‡—  | j                   ˆfd„| j                  D «       Ž }ddlm} ddlm} |j                  D �cg c]  }t        ||«      sŒ|‘Œ }}|rp|j                  D �cg c]	  }||vsŒ|‘Œ }}  |t        |Ž D �cg c]  }t        j                  |«      ‘Œ c}«      j                  | j                  Ž }t        |g|z   Ž }t        |«      S c c}w c c}w c c}w )Nc              3   óB   •K  — | ]  } |j                   di ‰¤Ž–— Œ y ­w)N© )r   )r&   r?   Úhintss     €r   r(   z'HadamardProduct.doit.<locals>.<genexpr>d   s   øè ø€ Ò>¨q˜6˜1Ÿ6™6™? E�?Ñ>ùs   ƒr   )Ú
MatrixBase)ÚImmutableMatrix)Úfuncr5   Úsympy.matrices.matrixbaserL   Úsympy.matrices.immutablerM   r%   Úzipr   ÚfromiterÚreshaper:   r   Úcanonicalize)	r<   rK   ÚexprrL   rM   r?   ÚexplicitÚ	remainderÚexpl_mats	    `       r   r   zHadamardProduct.doitc   sÍ   ø€ Øˆt�y‰yÓ>°D·I±IÔ>Ð?ˆå8Ý<à#Ÿy™yÖF˜!¬J°q¸*Õ,E’AÐFˆÐFÙØ$(§I¡IÖC˜q°¸(Ò1BšÐCˆIÐCð‘Ü),¨h¨ö(Ø$%”—‘˜Q•ò(ó ç‰w˜Ÿ
™
ð$ˆHô # h Z°)Ñ%;Ð=ˆDä˜DÓ!Ð!ùò GùâCùò(s   ¾CÁCÁ&	CÁ0CÂC
c                 ó  — g }t        | j                  «      }t        t        |«      «      D ]=  }|d | ||   j	                  |«      gz   ||dz   d  z   }|j                  t        |Ž «       Œ? t        j                  |«      S ©Nr   )	r-   r5   Úranger   ÚdiffÚappendr   r   rR   )r<   ÚxÚtermsr5   r?   Úfactorss         r   Ú_eval_derivativez HadamardProduct._eval_derivatives   s}   € ØˆÜ�D—I‘I‹ˆÜ”s˜4“yÓ!ò 	5ˆAØ˜2˜A�h $ q¡'§,¡,¨q£/Ð!2Ñ2°T¸!¸A¹#¸$°ZÑ?ˆGØ�L‰LÔ)¨7Ð3Õ4ð	5ô �|‰|˜EÓ"Ð"r   c                 ó–  — ddl m} ddl m} ddlm} t        | j                  «      D ��cg c]  \  }}|j                  |«      sŒ|‘Œ }}}g }|D �]i  }	| j                  d |	 }
| j                  |	dz   d  }| j                  |	   j                  |«      }t        ||
z   Ž }ddg}t        |«      D ��cg c]  \  }}| j                  |   dk7  sŒ|‘Œ }}}|D ]ã  }|j                  |j                     }|j                  |j                     }t        |t        |t        ||g«      |t        ||g«      g«      g|¢«      }|j                  d   j                  d   j                  |_        d|_        |j                  d   j                  d   j                  |_        d|_        |g|_        |j'                  |«       Œå �Œl |S c c}}w c c}}w )	Nr   ©ÚArrayDiagonal©ÚArrayTensorProduct©Ú_make_matrixr   )r   é   ©é   é   ri   )Ú0sympy.tensor.array.expressions.array_expressionsrd   rf   Ú"sympy.matrices.expressions.matexprrh   Ú	enumerater5   ÚhasÚ_eval_derivative_matrix_linesr   r:   Ú_linesÚ_first_line_indexÚ_second_line_indexr   Ú_first_pointer_parentÚ_first_pointer_indexÚ_second_pointer_parentÚ_second_pointer_indexr]   )r<   r^   rd   rf   rh   r?   r'   Ú
with_x_indÚlinesÚindÚ	left_argsÚ
right_argsÚdÚhadamÚdiagonalr@   ÚeÚl1Úl2Úsubexprs                       r   rq   z-HadamardProduct._eval_derivative_matrix_lines{   sÃ  € ÝRÝWÝCä&/°·	±	Ó&:×I™F˜A˜s¸c¿g¹gÀa½j’aÐIˆ
ÑIØˆØó 	 ˆCØŸ	™	 $ 3˜ˆIØŸ™ 3 q¡5 6Ð*ˆJà—	‘	˜#‘×<Ñ<¸QÓ?ˆAÜ$ z°IÑ'=Ð?ˆEØ Ð'ˆHÜ&/°Ó&9×P™d˜a ¸T¿Z¹ZÈ¹]ÈaÓ=OšÐPˆ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   «F?ÁF?Â0GÃG)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úis_HadamardProductr3   Úpropertyr:   r>   rG   r   ra   rq   Ú__classcell__©r7   s   @r   r   r   )   sI   ø„ ñð* Ðà%*°$ö ð. ñ"ó ð"òGòAò"ò #ö'r   r   c                 ó  — t        d„ t        «      }t        |«      } || «      } t        d„ t        d„ «      «      } || «      } d„ }t        d„ |«      } || «      } t	        | t
        «      rit        | j                  «      }g }|j                  «       D ]7  \  }}|dk(  r|j                  |«       Œ|j                  t        ||«      «       Œ9 t        |Ž } t        d„ t        t        «      «      } || «      } t        | «      } | S )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                 ó"   — t        | t        «      S r$   ©r%   r   ©r^   s    r   ú<lambda>zcanonicalize.<locals>.<lambda>û   ó   € ”j ¤OÓ4€ r   c                 ó"   — t        | t        «      S r$   r�   r�   s    r   r‘   zcanonicalize.<locals>.<lambda>  r’   r   c                 ó"   — t        | t        «      S r$   )r%   r   r�   s    r   r‘   zcanonicalize.<locals>.<lambda>  s   € œJ q¬)Ó4€ r   c                 ób   — t        d„ | j                  D «       «      rt        | j                  Ž S | S )Nc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr$   )r%   r   )r&   Úcs     r   r(   z/canonicalize.<locals>.absorb.<locals>.<genexpr>
  s   è ø€ Ò9¨QŒz˜!œZ×(Ñ9ùr)   )Úanyr5   r   r:   r�   s    r   Úabsorbzcanonicalize.<locals>.absorb	  s(   € ÜÑ9°!·&±&Ô9Ô9Ü˜qŸw™wÐ'Ð'àˆHr   c                 ó"   — t        | t        «      S r$   r�   r�   s    r   r‘   zcanonicalize.<locals>.<lambda>  r’   r   r   c                 ó"   — t        | t        «      S r$   r�   r�   s    r   r‘   zcanonicalize.<locals>.<lambda>#  r’   r   )r   r   r   r   r%   r   r   r5   Úitemsr]   ÚHadamardPowerr   r   r   )r^   ÚruleÚfunr™   ÚtallyÚnew_argÚbaseÚexps           r   rT   rT   §   s
  € ôf Ù4Üó
€Dô �$‹-€CÙˆA‹€Aô Ù4ÜÑ4Ó5ó
€Cñ 	ˆA‹€Aòô
 Ù4Øó
€Cñ 	ˆA‹€Aô �!”_Ô%Ü˜Ÿ™“ˆàˆØŸ™›ò 	9‰IˆD�#Ø�aŠxØ—‘˜tÕ$à—‘œ}¨T°3Ó7Õ8ð		9ô ˜WÐ%ˆô Ù4ÜÔ!Ó"ó
€Cñ 	ˆA‹€Aô 	ˆq‹	€AØ€Hr   c                 ó¤   — t        | «      } t        |«      }|dk(  r| S | j                  s| |z  S |j                  rt        d«      ‚t        | |«      S )Nr   z#cannot raise expression to a matrix)r   Ú	is_Matrixr/   r�   )r¢   r£   s     r   Úhadamard_powerr¦   -  sQ   € Ü�4‹=€DÜ
�#‹,€CØ
ˆa‚xØˆØ�>Š>Ø�S‰yÐØ
‡}‚}ÜÐ>Ó?Ð?Ü˜˜sÓ#Ð#r   c                   ój   ‡ — e Zd ZdZˆ fd„Zed„ «       Zed„ «       Zed„ «       Zd„ Z	d„ Z
d„ Zd	„ Zˆ xZS )
r�   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                 óè   •— t        |«      }t        |«      }|j                  r|j                  r||z  S t        |t        «      rt        |t        «      rt	        ||«       t
        ‰| �  | ||«      }|S r$   )r   Ú	is_scalarr%   r
   r1   r2   r3   )r4   r¢   r£   r6   r7   s       €r   r3   zHadamardPower.__new__r  s`   ø€ Ü�t‹}ˆÜ�c‹lˆà�>Š>˜cŸmšmØ˜3‘;Ðä�dœJÔ'¬J°s¼JÔ,GÜ�T˜3Ôä‰g‰o˜c 4¨Ó-ˆØˆ
r   c                 ó    — | j                   d   S r9   ©Ú_argsr;   s    r   r¢   zHadamardPower.base  ó   € à�z‰z˜!‰}Ðr   c                 ó    — | j                   d   S rZ   r«   r;   s    r   r£   zHadamardPower.expƒ  r­   r   c                 ó†   — | j                   j                  r| j                   j                  S | j                  j                  S r$   )r¢   r¥   r:   r£   r;   s    r   r:   zHadamardPower.shape‡  s+   € à�9‰9×ÒØ—9‘9—?‘?Ð"Ø�x‰x�~‰~Ðr   c                 ój  — | j                   }| j                  }|j                  r |j                  ||fi |¤Ž}n)|j                  r|}nt        dj                  |«      «      ‚|j                  r |j                  ||fi |¤Ž}||z  S |j                  r|}||z  S t        dj                  |«      «      ‚)Nz)The base {} must be a scalar or a matrix.z-The exponent {} must be a scalar or a matrix.)r¢   r£   r¥   r>   r©   r/   Úformat)r<   r?   r@   rA   r¢   r£   ÚaÚbs           r   r>   zHadamardPower._entry�  s¾   € Ø�y‰yˆØ�h‰hˆà�>Š>Ø�—‘˜A˜qÑ+ FÑ+‰AØ�^Š^Ø‰AäØ;×BÑBÀ4ÓHóJð Jð �=Š=Ø�—
‘
˜1˜aÑ* 6Ñ*ˆAð �A‰vˆð �]Š]ØˆAð
 �A‰vˆô Ø?×FÑFÀsÓKóMð Mr   c                 óZ   — ddl m} t         || j                  «      | j                  «      S rC   )rE   rD   r�   r¢   r£   rF   s     r   rG   zHadamardPower._eval_transpose£  s   € ÝBÜ™Y t§y¡yÓ1°4·8±8Ó<Ð<r   c                 óÖ   — | j                   j                  |«      }| j                  j                  t        «      }|j                  |«      }t        ||z  | j                   |z  z   | «      S r$   )r£   r\   r¢   Ú	applyfuncr	   r   )r<   r^   ÚdexpÚlogbaseÚdlbases        r   ra   zHadamardPower._eval_derivative§  sY   € Ø�x‰x�}‰}˜QÓˆØ—)‘)×%Ñ%¤cÓ*ˆØ—‘˜a“ˆÜØ�‰L˜4Ÿ8™8 F™?Ñ*Øó
ð 	
r   c                 ó*  — ddl m} ddl m} ddlm} | j
                  j                  |«      }|D �]Y  }ddg}t        |«      D ��	cg c]$  \  }}	| j
                  j                  |   dk7  sŒ#|	‘Œ& }}}	|j                  |j                     }
|j                  |j                     }t        |t        |t        ||
g«      | j                  t        | j
                  | j                  dz
  «      z  t        ||g«      g«      g|¢|j                  ¬«      }|j                   d   j                   d   j                   |_        d|_        d|_
        |j                   d   j                   d	   j                   |_        d|_        d|_        |g|_	        �Œ\ |S c c}	}w )
Nr   re   rc   rg   )r   ri   rj   r   )Ú	validatorri   )rm   rf   rd   rn   rh   r¢   rq   ro   r:   rr   rs   rt   r   r£   r¦   Ú	_validater5   ru   rv   rw   rx   )r<   r^   rf   rd   rh   Úlrr?   r€   r@   r�   r‚   rƒ   r„   s                r   rq   z+HadamardPower._eval_derivative_matrix_lines°  sy  € ÝWÝRÝCà�Y‰Y×4Ñ4°QÓ7ˆØó 	!ˆAØ Ð'ˆHÜ&/°Ó&9×U™d˜a ¸T¿Y¹Y¿_¹_ÈQÑ=OÐSTÓ=TšÐUˆHÑUØ—‘˜!×-Ñ-Ñ.ˆBØ—‘˜!×.Ñ.Ñ/ˆBÜ!ØäØ*ä'¨°r°dÓ;Ø ŸH™H¤^°D·I±I¸t¿x¹xÈ¹zÓ%JÑJÜ'¨°r°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)r…   r†   r‡   rˆ   r3   rŠ   r¢   r£   r:   r>   rG   ra   rq   r‹   rŒ   s   @r   r�   r�   9  s^   ø„ ñ6ôpð ñó ðð ñó ðð ñó ðò
ò,=ò
ö r   r�   N)#Úcollectionsr   Ú
sympy.corer   r   Úsympy.core.addr   Úsympy.core.exprr   Úsympy.core.sortingr   Ú&sympy.functions.elementary.exponentialr	   rn   r
   Ú!sympy.matrices.expressions._shaper   r1   Ú"sympy.matrices.expressions.specialr   r   Úsympy.strategiesr   r   r   r   r   r   Úsympy.utilities.exceptionsr   r   r   rT   r¦   r�   rJ   r   r   ú<module>rÈ      s^   ðÝ ç #Ý Ý 'Ý /Ý 6Ý 9Ý Qß D÷÷ õ Aò-ô0y�jô yò|CòL	$ôW�Jõ Wr   