Ë
    7^(h•<  ã                   óð  — 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
mZ d dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZ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) ddl*m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1  G d„ de'e«      Z2 e
jf                  ee2fe2«       d„ Z4d„ Z5d„ Z6d„ Z7d„ Z8d„ Z9d„ Z:d„ Z;d„ Z<e<e5e7e;e9e ed„ «      e6e8ee:fZ= e ee2 ee=Ž i«      «      Z>d „ Z?d!„ Z@e@ed<   y")#é    )ÚaskÚQ)Úhandlers_dict)ÚBasicÚsympifyÚS)ÚmulÚMul)ÚNumberÚInteger©ÚDummy)Úadjoint)Úrm_idÚunpackÚtypedÚflattenÚexhaustÚdo_oneÚnew)ÚNonInvertibleMatrixError)Ú
MatrixBase)Úsympy_deprecation_warning)Úvalidate_matmul_integeré   )ÚInverse)Ú
MatrixExpr)ÚMatPow)Ú	transpose)ÚPermutationMatrix)Ú
ZeroMatrixÚIdentityÚGenericIdentityÚ	OneMatrixc                   óª   ‡ — e Zd ZdZdZ e«       Zddddœd„Zed„ «       Z	e
d„ «       Zdd	„Zd
„ Zd„ Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zˆ xZS )ÚMatMula  
    A product of matrix expressions

    Examples
    ========

    >>> from sympy import MatMul, MatrixSymbol
    >>> A = MatrixSymbol('A', 5, 4)
    >>> B = MatrixSymbol('B', 4, 3)
    >>> C = MatrixSymbol('C', 3, 6)
    >>> MatMul(A, B, C)
    A*B*C
    TFN)ÚevaluateÚcheckÚ_sympifyc                óB  ‡ — |s‰ j                   S t        t        ˆ fd„|«      «      }|rt        t        t        |«      «      }t        j                  ‰ g|¢­Ž }|j                  «       \  }}|�t        ddd¬«       |durt        |Ž  |s|S |r‰ j                  |«      S |S )Nc                 ó"   •— ‰j                   | k7  S ©N)Úidentity)ÚiÚclss    €ú_/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/matrices/expressions/matmul.pyú<lambda>z MatMul.__new__.<locals>.<lambda>0   s   ø€  S§\¡\°QÑ%6€ ó    zaPassing check to MatMul 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)r-   ÚlistÚfilterÚmapr   r   Ú__new__Úas_coeff_matricesr   ÚvalidateÚ	_evaluate)r/   r'   r(   r)   ÚargsÚobjÚfactorÚmatricess   `       r0   r8   zMatMul.__new__*   s©   ø€ ÙØ—<‘<Ðô ”FÓ6¸Ó=Ó>ˆÙÜœœG TÓ*Ó+ˆDÜ�m‰m˜CÐ' $Ò'ˆØ×0Ñ0Ó2Ñˆ�àÐÜ%ØsØ)/Ø+Yõ[ð
 ˜ÑÜ�hÑáð ˆMáØ—=‘= Ó%Ð%àˆ
r2   c                 ó   — t        |«      S r,   )Úcanonicalize)r/   Úexprs     r0   r;   zMatMul._evaluateJ   s   € ä˜DÓ!Ð!r2   c                 ó”   — | j                   D �cg c]  }|j                  sŒ|‘Œ }}|d   j                  |d   j                  fS c c}w )Nr   éÿÿÿÿ)r<   Ú	is_MatrixÚrowsÚcols)ÚselfÚargr?   s      r0   ÚshapezMatMul.shapeN   sC   € à#'§9¡9Ö>˜C°·³’CÐ>ˆÐ>Ø˜‘× Ñ  (¨2¡,×"3Ñ"3Ð4Ð4ùò ?s
   �A¡Ac                 ó  ‡— ddl m} ddlmŠ | j	                  «       \  }}t        |«      dk(  r||d   ||f   z  S d gt        |«      dz   z  }d gt        |«      dz
  z  }	||d<   ||d<   d„ }
|j                  d |
«       «      }t        dt        |«      «      D ]  }t        |«      ||<   Œ t        |d d «      D ]  \  }}|j                  d   dz
  |	|<   Œ t        |«      D ��cg c]"  \  }}|j                  ||   ||dz      |¬«      ‘Œ$ }}}t        j                  |«      }t        ˆfd	„|D «       «      rd
}| ||gt        |dd dgt        |	«      z  |	«      ¢­Ž z  }t        d„ |	D «       «      sd}|r|j!                  «       S |S c c}}w )Nr   )ÚSum)ÚImmutableMatrixr   rD   c               3   ó<   K  — d} 	 t        d| z  «      –— | dz  } Œ­w)Nr   zi_%ir   )Úcounters    r0   ÚfzMatMul._entry.<locals>.fb   s,   è ø€ ØˆGØÜ˜F WÑ,Ó-Ò-Ø˜1‘�ð ùó   ‚Údummy_generator)rR   c              3   ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­wr,   )Úhas)Ú.0ÚvrM   s     €r0   ú	<genexpr>z MatMul._entry.<locals>.<genexpr>q   s   øè ø€ Ò8¨!ˆq�u‰u�_×%Ñ8ùs   ƒTc              3   óH   K  — | ]  }t        |t        t        f«      –— Œ y ­wr,   )Ú
isinstancer   Úint)rU   rV   s     r0   rW   z MatMul._entry.<locals>.<genexpr>y   s   è ø€ ÒE°Q”:˜a¤'¬3 ×0ÑEùs   ‚ "F)Úsympy.concrete.summationsrL   Úsympy.matrices.immutablerM   r9   ÚlenÚgetÚrangeÚnextÚ	enumeraterJ   Ú_entryr
   ÚfromiterÚanyÚzipÚdoit)rH   r.   ÚjÚexpandÚkwargsrL   Úcoeffr?   ÚindicesÚ
ind_rangesrP   rR   rI   Úexpr_in_sumÚresultrM   s                  @r0   rb   zMatMul._entryS   s³  ø€ å1Ý<à×0Ñ0Ó2‰ˆˆxäˆx‹=˜AÒØ˜8 A™; q¨! tÑ,Ñ,Ð,à�&œ#˜h›-¨!Ñ+Ñ,ˆØ�VœS ›]¨QÑ.Ñ/ˆ
Øˆ�‰
Øˆ�‰ò	ð !Ÿ*™*Ð%6¹»Ó<ˆä�qœ#˜h›-Ó(ò 	/ˆAÜ˜oÓ.ˆG�AŠJð	/ô   ¨¨" Ó.ò 	-‰FˆAˆsØŸI™I a™L¨1Ñ,ˆJ�qŠMð	-ähqÐrzÓh{×|Ñ^dÐ^_Ðad�C—J‘J˜w q™z¨7°1°Q±3©<È�JÕYÐ|ˆÑ|Ü—l‘l 8Ó,ˆÜÓ8¨xÔ8Ô8ØˆFØ‘sØðä�W˜Q˜r�] Q C¬¨J«Ñ$7¸ÓDòñ ˆô ÑE¸*ÔEÔEØˆFÙ &ˆv�{‰{‹}Ð2¨FÐ2ùó }s   Ã%'F	c                 óø   — | j                   D �cg c]  }|j                  rŒ|‘Œ }}| j                   D �cg c]  }|j                  sŒ|‘Œ }}t        |Ž }|j                  du rt	        d«      ‚||fS c c}w c c}w )NFz3noncommutative scalars in MatMul are not supported.)r<   rE   r
   Úis_commutativeÚNotImplementedError)rH   ÚxÚscalarsr?   rj   s        r0   r9   zMatMul.as_coeff_matrices}   sq   € Ø"Ÿi™iÖ;˜¨q¯{«{’1Ð;ˆÐ;Ø#Ÿy™yÖ8˜!¨A¯K«K’AÐ8ˆÐ8Ü�W�ˆØ×Ñ 5Ñ(Ü%Ð&[Ó\Ð\à�hˆÐùò <ùÚ8s   �A2¡A2µA7ÁA7c                 ó<   — | j                  «       \  }}|t        |Ž fS r,   )r9   r&   )rH   rj   r?   s      r0   Úas_coeff_mmulzMatMul.as_coeff_mmul†   s$   € Ø×0Ñ0Ó2‰ˆˆxØ”f˜hÐ'Ð'Ð'r2   c                 óL   •— t        t        | �
  di |¤Ž}| j                  |«      S ©N© )Úsuperr&   rh   r;   )rH   ri   ÚexpandedÚ	__class__s      €r0   rh   zMatMul.expandŠ   s&   ø€ Üœ Ñ-Ñ7°Ñ7ˆØ�~‰~˜hÓ'Ð'r2   c           	      ó    — | j                  «       \  }}t        |g|ddd…   D �cg c]  }t        |«      ‘Œ c}¢­Ž j                  «       S c c}w )a¨  Transposition of matrix multiplication.

        Notes
        =====

        The following rules are applied.

        Transposition for matrix multiplied with another matrix:
        `\left(A B\right)^{T} = B^{T} A^{T}`

        Transposition for matrix multiplied with scalar:
        `\left(c A\right)^{T} = c A^{T}`

        References
        ==========

        .. [1] https://en.wikipedia.org/wiki/Transpose
        NrD   )r9   r&   r   rf   )rH   rj   r?   rI   s       r0   Ú_eval_transposezMatMul._eval_transposeŽ   sR   € ð& ×0Ñ0Ó2‰ˆˆxÜØð@Ø/7¹¸"¸©~Ö>¨”Y˜s•^Ò>ò@ß@DÁÃð	GùÚ>s   ¥A
c                 ó†   — t        | j                  d d d…   D �cg c]  }t        |«      ‘Œ c}Ž j                  «       S c c}w )NrD   )r&   r<   r   rf   )rH   rI   s     r0   Ú_eval_adjointzMatMul._eval_adjoint¥   s4   € Ü°·	±	¹$¸B¸$±Ö@¨œ �Ò@ÐA×FÑFÓHÐHùÒ@s   š>c                 ór   — | j                  «       \  }}|dk7  rddlm} | ||j                  «       «      z  S y )Nr   )Útrace)ru   r�   rf   )rH   r>   Úmmulr�   s       r0   Ú_eval_tracezMatMul._eval_trace¨   s9   € Ø×)Ñ)Ó+‰ˆ�Ø�QŠ;Ý$Ø™E $§)¡)£+Ó.Ñ.Ð.ð r2   c           	      óš   — ddl m} | j                  «       \  }}t        |Ž }|| j                  z  t        t        t        ||«      «      Ž z  S )Nr   )ÚDeterminant)Ú&sympy.matrices.expressions.determinantr…   r9   Úonly_squaresrF   r
   r5   r7   )rH   r…   r>   r?   Úsquare_matricess        r0   Ú_eval_determinantzMatMul._eval_determinant®   sG   € ÝFØ×1Ñ1Ó3Ñˆ�Ü&¨Ð1ˆØ�t—y‘yÑ ¤3¬¬S°¸oÓ-NÓ(OÐ#PÑPÐPr2   c                 óª   — t        d„ | j                  D «       «      r-t        d„ | j                  d d d…   D «       Ž j                  «       S t	        | «      S )Nc              3   óV   K  — | ]!  }t        |t        «      sŒ|j                  –— Œ# y ­wr,   )rY   r   Ú	is_square©rU   rI   s     r0   rW   z'MatMul._eval_inverse.<locals>.<genexpr>µ   s   è ø€ ÒQ ´ZÀÄZÕ5Pˆs�}�}ÑQùs   ‚)˜)c              3   óf   K  — | ])  }t        |t        «      r|j                  «       n|d z  –— Œ+ y­w)rD   N)rY   r   Úinverser�   s     r0   rW   z'MatMul._eval_inverse.<locals>.<genexpr>¶   s0   è ø€ ò àô ",¨C´Ô!<�—‘”À#ÀrÁ'ÓIñùs   ‚/1rD   )Úallr<   r&   rf   r   )rH   s    r0   Ú_eval_inversezMatMul._eval_inverse´   sO   € ÜÑQ¨¯	©	ÔQÔQÜñ à#Ÿy™y©¨2¨™ôð ÷ ‰d‹fð	ô
 �t‹}Ðr2   c                 ó¨   ‡— ‰j                  dd«      }|rt        ˆfd„| j                  D «       «      }n| j                  }t        t	        |Ž «      }|S )NÚdeepTc              3   óB   •K  — | ]  } |j                   di ‰¤Ž–— Œ y ­wrw   )rf   )rU   rI   Úhintss     €r0   rW   zMatMul.doit.<locals>.<genexpr>À   s   øè ø€ Ò@¨s˜˜Ÿ™Ñ* EÕ*Ñ@ùs   ƒ)r^   Útupler<   rA   r&   )rH   r•   r“   r<   rB   s    `   r0   rf   zMatMul.doit½   sH   ø€ Ø�y‰y˜ Ó&ˆÙÜÓ@°d·i±iÔ@Ó@‰Dà—9‘9ˆDô œF D˜MÓ*ˆØˆr2   c           	      óœ  — | j                   D �cg c]  }|j                  sŒ|‘Œ }}| j                   D �cg c]  }|j                  rŒ|‘Œ }}|rlt        |«      }t        |«      }|rT|rRt        |«      |k7  rDt	        d|D �cg c],  }t        | j                   «      j                  |«      dkD  sŒ+|‘Œ. c}z  «      ‚||gS c c}w c c}w c c}w )Nz"repeated commutative arguments: %sr   )r<   rp   r]   ÚsetÚ
ValueErrorr5   Úcount)	rH   ÚcsetÚwarnri   rr   Úcoeff_cÚcoeff_ncÚclenÚcis	            r0   Úargs_cnczMatMul.args_cncÉ   sÀ   € Ø"Ÿi™iÖ<˜¨1×+;Ó+;’1Ð<ˆÐ<Ø#Ÿy™yÖA˜!°×0@Ó0@’AÐAˆÐAÙÜ�w“<ˆDÜ˜'“lˆGÙ™¤ W£°Ò!5Ü Ð!EØ/6Ö!X¨¼$¸t¿y¹y»/×:OÑ:OÐPRÓ:SÐVWÓ:W¢"Ò!Xñ"Yó Zð Zà˜Ð"Ð"ùò =ùÚAùò "Ys!   �B?¡B?µCÁCÂ,C	
Â.C	
c           	      óÔ  — ddl m} t        | j                  «      D ��cg c]  \  }}|j	                  |«      sŒ|‘Œ }}}g }|D �]  }| j                  d | }| j                  |dz   d  }	|	rt
        j                  |	«      }
nt        | j                  d   «      }
|rOt
        j                  t        |«      D �cg c]&  }|j                  r ||«      j                  «       n|‘Œ( c}«      }nt        | j                  d   «      }| j                  |   j                  |«      }|D ]5  }|j                  |«       |j                  |
«       |j                  |«       Œ7 �Œ |S c c}}w c c}w )Nr   )Ú	Transposer   )r   r£   ra   r<   rT   r&   rc   r"   rJ   ÚreversedrE   rf   Ú_eval_derivative_matrix_linesÚappend_firstÚappend_secondÚappend)rH   rr   r£   r.   rI   Ú
with_x_indÚlinesÚindÚ	left_argsÚ
right_argsÚ	right_matÚleft_revÚds                r0   r¥   z$MatMul._eval_derivative_matrix_linesÔ   s5  € Ý(Ü&/°·	±	Ó&:×I™F˜A˜s¸c¿g¹gÀa½j’aÐIˆ
ÑIØˆØó 	 ˆCØŸ	™	 $ 3˜ˆIØŸ™ 3 q¡5 6Ð*ˆJáÜ"ŸO™O¨JÓ7‘	ä$ T§Z¡Z°¡]Ó3�	ÙÜ!Ÿ?™?Ô_gÐhqÓ_rÖ+sÐZ[À1Ç;Â;©I°a«L×,=Ñ,=Ô,?ÐTUÑ,UÒ+sÓt‘ä# D§J¡J¨q¡MÓ2�à—	‘	˜#‘×<Ñ<¸QÓ?ˆAØò  �Ø—‘˜xÔ(Ø—‘ 	Ô*Ø—‘˜Q•ò ð	 ð& ˆùó+ Jùò ,ts   ŸE¹EÂ7+E%
)T)FT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	is_MatMulr#   r-   r8   Úclassmethodr;   ÚpropertyrJ   rb   r9   ru   rh   r}   r   rƒ   r‰   r‘   rf   r¡   r¥   Ú__classcell__)r{   s   @r0   r&   r&      sŒ   ø„ ñð €IáÓ €Hà%*°$Àô ð@ ñ"ó ð"ð ñ5ó ð5ó(3òTò(ô(òGò.Iò/òQòò	ó	#ör2   r&   c                  ó<   — | d   dk(  r| dd  } t        t        g| ¢­Ž S )Nr   r   )r   r&   )r<   s    r0   Únewmulrº   ñ   s(   € ØˆA�w�!‚|Ø�A�BˆxˆÜŒvÐ˜ÒÐr2   c                 óà   — t        d„ | j                  D «       «      rL| j                  D �cg c]  }|j                  sŒ|‘Œ }}t        |d   j                  |d   j
                  «      S | S c c}w )Nc              3   ól   K  — | ],  }|j                   xs |j                  xr |j                  –— Œ. y ­wr,   )Úis_zerorE   Úis_ZeroMatrixr�   s     r0   rW   zany_zeros.<locals>.<genexpr>÷   s3   è ø€ ò ,Øð �;‰;Ò?˜3Ÿ=™=Ò>¨S×->Ñ->Ó?ñ ,ùs   ‚24r   rD   )rd   r<   rE   r!   rF   rG   )r	   rI   r?   s      r0   Ú	any_zerosr¿   ö   sc   € Ü
ñ ,Ø"%§(¡(ô,ô ,à#&§8¡8Ö=˜C¨s¯}«}’CÐ=ˆÐ=Ü˜( 1™+×*Ñ*¨H°R©L×,=Ñ,=Ó>Ð>Ø€Jùò >s
   «A+½A+c                 óD  — t        d„ | j                  D «       «      s| S g }| j                  d   }| j                  dd D ]G  }t        |t        t        f«      rt        |t        t        f«      r||z  }Œ5|j                  |«       |}ŒI |j                  |«       t        |Ž S )a˜   Merge explicit MatrixBase arguments

    >>> from sympy import MatrixSymbol, Matrix, MatMul, pprint
    >>> from sympy.matrices.expressions.matmul import merge_explicit
    >>> A = MatrixSymbol('A', 2, 2)
    >>> B = Matrix([[1, 1], [1, 1]])
    >>> C = Matrix([[1, 2], [3, 4]])
    >>> X = MatMul(A, B, C)
    >>> pprint(X)
      [1  1] [1  2]
    A*[    ]*[    ]
      [1  1] [3  4]
    >>> pprint(merge_explicit(X))
      [4  6]
    A*[    ]
      [4  6]

    >>> X = MatMul(B, A, C)
    >>> pprint(X)
    [1  1]   [1  2]
    [    ]*A*[    ]
    [1  1]   [3  4]
    >>> pprint(merge_explicit(X))
    [1  1]   [1  2]
    [    ]*A*[    ]
    [1  1]   [3  4]
    c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr,   )rY   r   r�   s     r0   rW   z!merge_explicit.<locals>.<genexpr>  s   è ø€ ÒB¨sŒz˜#œz×*ÑBùrQ   r   r   N)rd   r<   rY   r   r   r¨   r&   )ÚmatmulÚnewargsÚlastrI   s       r0   Úmerge_explicitrÅ   ý   s—   € ô8 ÑB°f·k±kÔBÔBØˆØ€GØ�;‰;�q‰>€DØ�{‰{˜1˜2ˆò ˆÜ�cœJ¬Ð/Ô0´ZÀÄzÔSYÐFZÔ5[Ø˜#‘:‰Dà�N‰N˜4Ô Ø‰Dðð ‡N�N�4Ôä�7ÐÐr2   c                 óˆ   —  | j                   «       \  }} t        d„ «      |«      }||k7  rt        |g|j                  ¢­Ž S | S )zð Remove Identities from a MatMul

    This is a modified version of sympy.strategies.rm_id.
    This is necessary because MatMul may contain both MatrixExprs and Exprs
    as args.

    See Also
    ========

    sympy.strategies.rm_id
    c                 ó   — | j                   du S )NT)Úis_Identity©rr   s    r0   r1   zremove_ids.<locals>.<lambda>6  s   € ˜QŸ]™]¨dÐ2€ r2   )ru   r   rº   r<   )r	   r>   r‚   rn   s       r0   Ú
remove_idsrÊ   '  sJ   € ð %�3×$Ñ$Ó&�L€FˆDà3ŒUÑ2Ó3°DÓ9€FØ�‚~Ü�fÐ+˜vŸ{™{Ò+Ð+àˆ
r2   c                 óP   —  | j                   «       \  }}|dk7  rt        |g|¢­Ž S | S ©Nr   )r9   rº   )r	   r>   r?   s      r0   Úfactor_in_frontrÍ   <  s3   € Ø,�s×,Ñ,Ó.Ñ€FˆHØ�‚{Ü�fÐ(˜xÒ(Ð(Ø€Jr2   c                 ó$  —  | j                   «       \  }}|d   g}t        dt        |«      «      D �]A  }|d   }||   }t        |t        «      rnt        |j
                  t        «      rT|j
                  j                  }t        |«      }t        |«      || d k(  r!|d|  t        |j                  d   «      gz   }ŒŒt        |t        «      r‡t        |j
                  t        «      rm|j
                  j                  }	t        |	«      }t        |	«      ||||z    k(  r8t        |j                  d   «      }
|
|d<   t        |||z   «      D ]  }|
||<   Œ	 �Œ#|j                  dk(  s|j                  dk(  r|j                  |«       �ŒTt        |t        «      r|j                  \  }}n|t        j                  }}t        |t        «      r|j                  \  }}n|t        j                  }}||k(  r&||z   }t        ||«      j!                  d¬«      |d<   �Œãt        |t"        «      s>	 |j%                  «       }|�+||k(  r&||z
  }t        ||«      j!                  d¬«      |d<   �Œ1|j                  |«       �ŒD t)        |g|¢­Ž S # t&        $ r d}Y ŒZw xY w)a  Combine consecutive powers with the same base into one, e.g.
    $$A \times A^2 \Rightarrow A^3$$

    This also cancels out the possible matrix inverses using the
    knowledgebase of :class:`~.Inverse`, e.g.,
    $$ Y \times X \times X^{-1} \Rightarrow Y $$
    r   r   rD   NF)r“   )r9   r_   r]   rY   r   rI   r&   r<   r5   r"   rJ   rŒ   r¨   r   r   ÚOnerf   r   r�   r   rº   )r	   r>   r<   Únew_argsr.   ÚAÚBÚBargsÚlÚAargsr-   rg   ÚA_baseÚA_expÚB_baseÚB_expÚnew_expÚ
B_base_invs                     r0   Úcombine_powersrÜ   B  sb  € ð )�3×(Ñ(Ó*�L€FˆDØ�Q‘ˆy€Hä�1”c˜$“iÓ ó 0ˆØ�R‰LˆØ�‰Gˆä�aœÔ!¤j°·±¼Ô&?Ø—E‘E—J‘JˆEÜ�E“
ˆAÜ�E‹{˜h¨ r s˜mÒ+Ø# C a R˜=¬H°Q·W±W¸Q±ZÓ,@Ð+AÑA�Øä�aœÔ!¤j°·±¼Ô&?Ø—E‘E—J‘JˆEÜ�E“
ˆAÜ�E‹{˜d 1 Q q¡S˜kÒ)Ü# A§G¡G¨A¡JÓ/�Ø'�˜‘Ü˜q ! A¡#›ò '�AØ&�D˜’Gð'áà�;‰;˜%Ò 1§;¡;°%Ò#7Ø�O‰O˜AÔÙä�aœÔ ØŸF™F‰MˆF‘EàœqŸu™u�EˆFä�aœÔ ØŸF™F‰MˆF‘EàœqŸu™u�EˆFà�VÒØ˜e‘mˆGÜ! &¨'Ó2×7Ñ7¸UÐ7ÓCˆH�R‰LÙÜ˜F¤JÔ/ð"Ø#Ÿ^™^Ó-�
ð Ð%¨&°JÒ*>Ø %™-�Ü% f¨gÓ6×;Ñ;ÀÐ;ÓG�˜‘ÙØ�‰˜Öða0ôd �&Ð$˜8Ò$Ð$øô ,ò "Ø!’
ð"ús   È$JÊJÊJc                 óR  — | j                   }t        |«      }|dk  r| S |d   g}t        d|«      D ]m  }|d   }||   }t        |t        «      r@t        |t        «      r0|j                   d   }|j                   d   }t	        ||z  «      |d<   Œ]|j                  |«       Œo t        |Ž S )zGRefine products of permutation matrices as the products of cycles.
    é   r   r   rD   )r<   r]   r_   rY   r    r¨   r&   )	r	   r<   rÔ   rn   r.   rÑ   rÒ   Úcycle_1Úcycle_2s	            r0   Úcombine_permutationsrá   �  s¯   € ð �8‰8€DÜˆD‹	€AØˆ1‚uØˆ
à�1‰gˆY€FÜ�1�a‹[ò 	ˆØ�2‰JˆØ�‰GˆÜ�aÔ*Ô+Ü�qÔ+Ô,Ø—f‘f˜Q‘iˆGØ—f‘f˜Q‘iˆGÜ*¨7°WÑ+<Ó=ˆF�2ŠJà�M‰M˜!Õð	ô �6ˆ?Ðr2   c                 ó~  —  | j                   «       \  }}|d   g}|dd D ]�  }|d   }t        |t        «      rt        |t        «      s|j                  |«       Œ:|j	                  «        |j                  t        |j
                  d   |j
                  d   «      «       ||j
                  d   z  }Œ’ t        |g|¢­Ž S )zj
    Combine products of OneMatrix

    e.g. OneMatrix(2, 3) * OneMatrix(3, 4) -> 3 * OneMatrix(2, 4)
    r   r   NrD   )r9   rY   r$   r¨   ÚpoprJ   rº   )r	   r>   r<   rÐ   rÒ   rÑ   s         r0   Úcombine_one_matricesrä   —  s³   € ð )�3×(Ñ(Ó*�L€FˆDØ�Q‘ˆy€Hà�!�"ˆXò ˆØ�R‰LˆÜ˜!œYÔ'¬z¸!¼YÔ/GØ�O‰O˜AÔØØ�‰ŒØ�‰œ	 !§'¡'¨!¡*¨a¯g©g°a©jÓ9Ô:Ø�!—'‘'˜!‘*Ñ‰ðô �&Ð$˜8Ò$Ð$r2   c           
      ó¾  — | j                   }t        |«      dk(  r¸ddlm} |d   j                  rJ|d   j
                  r; ||d   j                   D �cg c]  }t        ||d   «      j                  «       ‘Œ! c}Ž S |d   j                  rJ|d   j
                  r; ||d   j                   D �cg c]  }t        |d   |«      j                  «       ‘Œ! c}Ž S | S c c}w c c}w )zr
    Simplify MatMul expressions but distributing
    rational term to MatMul.

    e.g. 2*(A+B) -> 2*A + 2*B
    rÞ   r   )ÚMatAddr   )r<   r]   Úmataddræ   Ú	is_MatAddÚis_Rationalr&   rf   )r	   r<   ræ   Úmats       r0   Údistribute_monomrë   «  s¿   € ð �8‰8€DÜ
ˆ4ƒy�A‚~Ý"Ø�‰7×Ò  a¡×!4Ò!4ÙÀ4ÈÁ7Ç<Á<ÖP¸CœF 3¨¨Q©Ó0×5Ñ5Õ7ÒPÐQÐQØ�‰7×Ò  a¡×!4Ò!4ÙÀ4ÈÁ7Ç<Á<ÖP¸CœF 4¨¡7¨CÓ0×5Ñ5Õ7ÒPÐQÐQØ€Jùò QùâPs   Á$CÂ+$Cc                 ó   — | dk(  S rÌ   rx   rÉ   s    r0   r1   r1   ¼  s   € ÐklÐpqÑkq€ r2   c            	      ó"  — | d   j                   | d   j                  k7  rt        d«      ‚g }d}t        | «      D ]R  \  }}|j                  | |   j                   k(  sŒ#|j	                  t        | ||dz    Ž j                  «       «       |dz   }ŒT |S )z'factor matrices only if they are squarer   rD   z!Invalid matrices being multipliedr   )rF   rG   ÚRuntimeErrorra   r¨   r&   rf   )r?   ÚoutÚstartr.   ÚMs        r0   r‡   r‡   Á  s—   € à��{×Ñ˜8 B™<×,Ñ,Ò,ÜÐ>Ó?Ð?Ø
€CØ€EÜ˜(Ó#ò ‰ˆˆ1Ø�6‰6�X˜e‘_×)Ñ)Ó)Ø�J‰J”v˜x¨¨a°©cÐ2Ð3×8Ñ8Ó:Ô;Ø�a‘C‰Eðð €Jr2   c                 ó$  — g }g }| j                   D ]1  }|j                  r|j                  |«       Œ!|j                  |«       Œ3 |d   }|dd D ]§  }||j                  k(  r8t	        t        j                  |«      |«      rt        |j                  d   «      }ŒJ||j                  «       k(  r8t	        t        j                  |«      |«      rt        |j                  d   «      }Œ•|j                  |«       |}Œ© |j                  |«       t        |Ž S )zè
    >>> from sympy import MatrixSymbol, Q, assuming, refine
    >>> X = MatrixSymbol('X', 2, 2)
    >>> expr = X * X.T
    >>> print(expr)
    X*X.T
    >>> with assuming(Q.orthogonal(X)):
    ...     print(refine(expr))
    I
    r   r   N)r<   rE   r¨   ÚTr   r   Ú
orthogonalr"   rJ   Ú	conjugateÚunitaryr&   )rB   ÚassumptionsrÃ   Úexprargsr<   rÄ   rI   s          r0   Úrefine_MatMulrù   Î  së   € ð €GØ€Hà—	‘	ò !ˆØ�>Š>Ø�O‰O˜DÕ!à�N‰N˜4Õ ð	!ð �A‰;€DØ˜˜ˆ|ò ˆØ�$—&‘&Š=œS¤§¡¨cÓ!2°KÔ@Ü˜CŸI™I a™LÓ)‰DØ�D—N‘NÓ$Ò$¬¬Q¯Y©Y°s«^¸[Ô)IÜ˜CŸI™I a™LÓ)‰Dà�N‰N˜4Ô Ø‰Dðð ‡N�N�4Ôä�7ÐÐr2   N)AÚsympy.assumptions.askr   r   Úsympy.assumptions.refiner   Ú
sympy.corer   r   r   Úsympy.core.mulr	   r
   Úsympy.core.numbersr   r   Úsympy.core.symbolr   Úsympy.functionsr   Úsympy.strategiesr   r   r   r   r   r   r   Úsympy.matrices.exceptionsr   Úsympy.matrices.matrixbaser   Úsympy.utilities.exceptionsr   Ú!sympy.matrices.expressions._shaper   r:   r�   r   Úmatexprr   Úmatpowr   r   Úpermutationr    Úspecialr!   r"   r#   r$   r&   Úregister_handlerclassrº   r¿   rÅ   rÊ   rÍ   rÜ   rá   rä   rë   ÚrulesrA   r‡   rù   rx   r2   r0   ú<module>r     s  ðß (Ý 2ß (Ñ (ß #ß .Ý #Ý #÷÷ ñ å >Ý 0Ý @Ý Qå Ý Ý Ý  Ý *ß EÓ EôSˆZ˜ô Sðj €× Ñ ˜3 ˜-¨Ô 0òò
ò(òTò*ò=%ò~ò,%ò(ð" �i Ð-AÀ>ÐSYÑ[`ÑaqÓ[rØ�O WÐ.Bð	D€ñ ‘u˜f¡f¨e nÐ5Ó6Ó7€ò
òðD (€ˆhÒ r2   