+
    ‹°³j¡, ã                  óB  € ^ RI Ht ^ RIt^ RIt^ RIHtHt ^ RIHt ^ RI	t	^ RI	H
t
 ^ RIt^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIH t  ^ RI!H"t"H#t# ^ RI$H%t% ^ RI&H't' ^ RI(H)t) ^ RI*H+t+ ^ RI,H-t-H.t.H/t/H0t0 ^ RI1H2t2 ^ RI3H4t4 ^ RI5H6t6H7t7 ^ RI(H8t8 ^ RI9H:t:H;t;H<t<H=t=H>t>H?t? ^ RI@HAtA ^ RIBHCtC ^ RIDHEtE  ! R R]4      tF ! R  R!]F4      tG ! R" R#]4      tH ! R$ R%]F4      tI ! R& R']F4      tJ ! R( R)]4      tK ! R* R+]K4      tL ! R, R-]K4      tM ! R. R/]K4      tN ! R0 R1]K4      tO ! R2 R3]K4      tP ! R4 R5]K4      tQ ! R6 R7]K4      tR ! R8 R94      tS ! R: R;4      tT ! R< R=4      tUR> tVR? tWR@ tXRA tYRB tZRC t[RD t\RE t]RF t^RG t_RH t`R# )Ié    )ÚannotationsN)ÚdefaultdictÚCounter)Úreduce)Ú
accumulate)ÚInteger)ÚEquality©ÚKroneckerDelta)ÚBasic)ÚTuple)ÚExpr)ÚFunctionÚLambda)ÚMul)ÚS©Údefault_sort_key)ÚDummyÚSymbol)Ú
MatrixBase)Údiagonalize_vector)Ú
MatrixExpr)Ú
ZeroMatrix)ÚpermutedimsÚtensorcontractionÚtensordiagonalÚtensorproduct)ÚImmutableDenseNDimArray)Ú	NDimArray)ÚIndexedÚIndexedBase)ÚMatrixElement)Ú$_apply_recursively_over_nested_listsÚ_sort_contraction_indicesÚ_get_mapping_from_subranksÚ*_build_push_indices_up_func_transformationÚ_get_contraction_linksÚ,_build_push_indices_down_func_transformation©ÚPermutation)Ú
_af_invert)Ú_sympifyc                  ó.   € ] tR t^'t$ R]R&   R tR tRtR# )Ú
_ArrayExprztuple[Expr, ...]Úshapec                	ó¨   € \        V\        P                  P                  4      '       g   V3p\        P                  W4       V P                  V4      # ©N)Ú
isinstanceÚcollectionsÚabcÚIterableÚArrayElementÚ_check_shapeÚ_get©ÚselfÚitems   &&Úq/home/luca/screen-checking/.venv/lib/python3.14/site-packages/sympy/tensor/array/expressions/array_expressions.pyÚ__getitem__Ú_ArrayExpr.__getitem__*   s<   € Ü˜$¤§¡× 8Ñ 8×9Ò9Ø�7ˆDÜ×!Ñ! $Ô-Ø�y‰y˜‹Ðó    c                	ó   € \        W4      # r2   )Ú_get_array_element_or_slicer:   s   &&r=   r9   Ú_ArrayExpr._get0   s   € Ü*¨4Ó6Ð6r@   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r>   r9   Ú__static_attributes__rD   r@   r=   r/   r/   '   s   ‡ ØÓòö7r@   r/   c                  óP   € ] tR t^4tRtRtR R lt]R 4       t]R 4       t	R t
RtR	# )
ÚArraySymbolz)
Symbol representing an array expression
Fc               ó    € V ^8„  d   QhRRRR/# )é   r0   ztyping.IterableÚreturnz'ArraySymbol'rD   )Úformats   "r=   Ú__annotate__ÚArraySymbol.__annotate__;   s   € ÷ ñ  Oð ¸ñ r@   c                	ó¤   € \        V\        4      '       d   \        V4      p\        \	        \
        V4      !  p\        P                  ! WV4      pV# r2   )r3   Ústrr   r   Úmapr-   r   Ú__new__)ÚclsÚsymbolr0   Úobjs   &&& r=   rV   ÚArraySymbol.__new__;   s>   € Ü�fœc×"Ò"Ü˜F“^ˆFä”sœ8 UÓ+Ñ,ˆÜ�lŠl˜3¨Ó.ˆØˆ
r@   c                	ó(   € V P                   ^ ,          # ©r   ©Ú_args©r;   s   &r=   ÚnameÚArraySymbol.nameC   ó   € à�z‰z˜!�}Ðr@   c                	ó(   € V P                   ^,          # ©é   r]   r_   s   &r=   r0   ÚArraySymbol.shapeG   rb   r@   c                	ó¦  € \         ;QJ d&    R  V P                   4       F  '       d   K   RM	  RM! R  V P                   4       4      '       g   \        R4      h\        P                  ! V P                   Uu. uF  p\        V4      NK  	  up!   Uu. uF  q V,          NK  	  pp\        V4      P                  ! V P                  !  # u upi u upi )c              3  ó8   "  € T F  qP                   x € K  	  R # 5ir2   ©Ú
is_Integer©Ú.0Úis   & r=   Ú	<genexpr>Ú*ArraySymbol.as_explicit.<locals>.<genexpr>L   ó   é € Ð4© A—<–<«ùó   ‚FTz1cannot express explicit array with symbolic shape)Úallr0   Ú
ValueErrorÚ	itertoolsÚproductÚranger   Úreshape)r;   Újrm   Údatas   &   r=   Úas_explicitÚArraySymbol.as_explicitK   s–   € ß‹sÑ4¨¯ªÓ4�s�sŠsÑ4¨¯ªÓ4×4Ò4ÜÐPÓQÐQÜ!*×!2Ò!2ÀtÇzÂzÓ4RÁzÀ!´U¸1¶XÁzÑ4RÒ!SÓTÑ!S˜A�Q—�Ñ!SˆÐTÜ& tÓ,×4Ò4°d·j±jÑAÐAùò 5SùÒTs   Á8C	ÂCrD   N)rE   rF   rG   rH   Ú__doc__Ú	_iterablerV   Úpropertyr`   r0   rz   rJ   rD   r@   r=   rL   rL   4   sA   † ñð €Iõð ñó ðð ñó ðöBr@   rL   c                  ób   € ] tR t^RtRtRtRtRtR t]	R 4       t
]R 4       t]R 4       tR tRtR	# )
r7   z
An element of an array.
Tc                	ó0  € \        V\        4      '       d   \        V4      p\        V4      p\        V\        P
                  P                  4      '       g   V3p\        \        V4      4      pV P                  W4       \        P                  ! WV4      pV# r2   )r3   rT   r   r-   r4   r5   r6   Útupler8   r   rV   )rW   r`   ÚindicesrY   s   &&& r=   rV   ÚArrayElement.__new__[   sp   € Ü�dœC× Ò Ü˜$“<ˆDÜ˜‹~ˆÜ˜'¤;§?¡?×#;Ñ#;×<Ò<Ø�jˆGÜœ5 ›>Ó*ˆØ×Ñ˜Ô'Ü�lŠl˜3 gÓ.ˆØˆ
r@   c                	ó   € \        V4      p\        VR 4      '       dœ   \        R4      p\        V4      \        VP                  4      8w  d   Vh\
        ;QJ d/    R \        W!P                  4       4       F  '       g   K   RM$	  RM ! R \        W!P                  4       4       4      '       d   \        R4      h\
        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   \        R4      hR# )	r0   z3number of indices does not match shape of the arrayc              3  ó4   "  € T F  w  rW8¬  R 8H  x € K  	  R# 5i)TNrD   )rl   rm   Úss   &  r=   rn   Ú,ArrayElement._check_shape.<locals>.<genexpr>m   s   é € ÐIÑ0H©¨�A‘F˜tÖ#Ó0Hùó   ‚TFzshape is out of boundsc              3  ó0   "  € T F  q^ 8  R8H  x € K  	  R# 5i)r   TNrD   rk   s   & r=   rn   r‡   o   s   é € Ð0© 1�A‘˜$Ž«ùs   ‚zshape contains negative valuesN)r�   ÚhasattrÚ
IndexErrorÚlenr0   ÚanyÚziprs   )rW   r`   r‚   Úindex_errors   &&& r=   r8   ÚArrayElement._check_shapef   s®   € ä˜“.ˆÜ�4˜×!Ò!Ü$Ð%ZÓ[ˆKÜ�7‹|œs 4§:¡:›Ô.Ø!Ð!ß‹sÑI´°G¿Z¹ZÔ0HÓI�s�sŠsÑI´°G¿Z¹ZÔ0HÓI×IÒIÜ Ð!9Ó:Ð:ß‹3Ñ0©Ó0�3�3Š3Ñ0©Ó0×0Ò0ÜÐ=Ó>Ð>ñ 1r@   c                	ó(   € V P                   ^ ,          # r\   r]   r_   s   &r=   r`   ÚArrayElement.namer   rb   r@   c                	ó(   € V P                   ^,          # rd   r]   r_   s   &r=   r‚   ÚArrayElement.indicesv   rb   r@   c                	óF  € \        V\        4      '       g   \        P                  # W8X  d   \        P                  # VP
                  V P
                  8w  d   \        P                  # \        P                  ! R  \        V P                  VP                  4       4       4      # )c              3  ó<   "  € T F  w  r\        W4      x € K  	  R # 5ir2   r
   ©rl   rm   rx   s   &  r=   rn   Ú0ArrayElement._eval_derivative.<locals>.<genexpr>„   s   é € ÐZÑ=Y±T°QœN¨1×0Ð0Ó=Yùs   ‚)
r3   r7   r   ÚZeroÚOner`   r   ÚfromiterrŽ   r‚   )r;   r†   s   &&r=   Ú_eval_derivativeÚArrayElement._eval_derivativez   sc   € Ü˜!œ\×*Ò*Ü—6‘6ˆMàŒ9Ü—5‘5ˆLà�6‰6�T—Y‘YÔÜ—6‘6ˆMä�|Š|ÑZ¼SÀÇÁÈqÏyÉyÔ=YÓZÓZÐZr@   rD   N)rE   rF   rG   rH   r|   Ú	_diff_wrtÚ	is_symbolÚis_commutativerV   Úclassmethodr8   r~   r`   r‚   rœ   rJ   rD   r@   r=   r7   r7   R   s_   † ñð €IØ€IØ€Nò	ð ñ	?ó ð	?ð ñó ðð ñó ðö
[r@   r7   c                  ó<   € ] tR t^‡tRtR t]R 4       tR tR t	Rt
R# )Ú	ZeroArrayzE
Symbolic array of zeros. Equivalent to ``ZeroMatrix`` for matrices.
c                	ó–   € \        V4      ^ 8X  d   \        P                  # \        \        V4      p\
        P                  ! V .VO5!  pV# r\   )rŒ   r   r™   rU   r-   r   rV   ©rW   r0   rY   s   &* r=   rV   ÚZeroArray.__new__Œ   s:   € Üˆu‹:˜Œ?Ü—6‘6ˆMÜ”H˜eÓ$ˆÜ�lŠl˜3Ð' Ó'ˆØˆ
r@   c                	ó   € V P                   # r2   r]   r_   s   &r=   r0   ÚZeroArray.shape“   ó   € à�z‰zÐr@   c                	óð   € \         ;QJ d&    R  V P                   4       F  '       d   K   RM	  RM! R  V P                   4       4      '       g   \        R4      h\        P                  ! V P                  !  # )c              3  ó8   "  € T F  qP                   x € K  	  R # 5ir2   ri   rk   s   & r=   rn   Ú(ZeroArray.as_explicit.<locals>.<genexpr>˜   rp   rq   FTú/Cannot return explicit form for symbolic shape.)rr   r0   rs   r   Úzerosr_   s   &r=   rz   ÚZeroArray.as_explicit—   sL   € ß‹sÑ4¨¯ªÓ4�s�sŠsÑ4¨¯ªÓ4×4Ò4ÜÐNÓOÐOÜ&×,Ò,¨d¯j©jÑ9Ð9r@   c                	ó"   € \         P                  # r2   )r   r™   r:   s   &&r=   r9   ÚZeroArray._getœ   s   € Ü�v‰vˆr@   rD   N©rE   rF   rG   rH   r|   rV   r~   r0   rz   r9   rJ   rD   r@   r=   r£   r£   ‡   s*   † ñòð ñó ðò:ö
r@   r£   c                  ó<   € ] tR t^ tRtR t]R 4       tR tR t	Rt
R# )ÚOneArrayz
Symbolic array of ones.
c                	ó–   € \        V4      ^ 8X  d   \        P                  # \        \        V4      p\
        P                  ! V .VO5!  pV# r\   )rŒ   r   rš   rU   r-   r   rV   r¥   s   &* r=   rV   ÚOneArray.__new__¥   s:   € Üˆu‹:˜Œ?Ü—5‘5ˆLÜ”H˜eÓ$ˆÜ�lŠl˜3Ð' Ó'ˆØˆ
r@   c                	ó   € V P                   # r2   r]   r_   s   &r=   r0   ÚOneArray.shape¬   r©   r@   c                	ó–  € \         ;QJ d&    R  V P                   4       F  '       d   K   RM	  RM! R  V P                   4       4      '       g   \        R4      h\        \	        \        \        P                  V P                  4      4       Uu. uF  p\        P                  NK  	  up4      P                  ! V P                  !  # u upi )c              3  ó8   "  € T F  qP                   x € K  	  R # 5ir2   ri   rk   s   & r=   rn   Ú'OneArray.as_explicit.<locals>.<genexpr>±   rp   rq   FTr­   )rr   r0   rs   r   rv   r   ÚoperatorÚmulr   rš   rw   )r;   rm   s   & r=   rz   ÚOneArray.as_explicit°   sƒ   € ß‹sÑ4¨¯ªÓ4�s�sŠsÑ4¨¯ªÓ4×4Ò4ÜÐNÓOÐOÜ&´u¼VÄHÇLÁLÐRV×R\ÑR\Ó=]Ô7^Ó'_Ñ7^°!¬¯¬Ñ7^Ñ'_Ó`×hÒhÐjn×jtÑjtÑuÐuùÒ'_s   ÂCc                	ó"   € \         P                  # r2   )r   rš   r:   s   &&r=   r9   ÚOneArray._getµ   s   € Ü�u‰uˆr@   rD   Nr²   rD   r@   r=   r´   r´       s+   † ñòð ñó ðòvö
r@   r´   c                  óB   € ] tR t^¹t]R 4       tR t]R 4       tR tRt	R# )Ú_CodegenArrayAbstractc                ó(   € V P                   R,          # )aN  
Returns the ranks of the objects in the uppermost tensor product inside
the current object.  In case no tensor products are contained, return
the atomic ranks.

Examples
========

>>> from sympy.tensor.array import tensorproduct, tensorcontraction
>>> from sympy import MatrixSymbol
>>> M = MatrixSymbol("M", 3, 3)
>>> N = MatrixSymbol("N", 3, 3)
>>> P = MatrixSymbol("P", 3, 3)

Important: do not confuse the rank of the matrix with the rank of an array.

>>> tp = tensorproduct(M, N, P)
>>> tp.subranks
[2, 2, 2]

>>> co = tensorcontraction(tp, (1, 2), (3, 4))
>>> co.subranks
[2, 2, 2]
ºNNN)Ú	_subranksr_   s   &r=   ÚsubranksÚ_CodegenArrayAbstract.subranks»   s   € ð4 �~‰~˜aÕ Ð r@   c                ó,   € \        V P                  4      # )z
The sum of ``subranks``.
)ÚsumrÆ   r_   s   &r=   ÚsubrankÚ_CodegenArrayAbstract.subrank×   s   € ô �4—=‘=Ó!Ð!r@   c                	ó   € V P                   # r2   ©Ú_shaper_   s   &r=   r0   Ú_CodegenArrayAbstract.shapeÝ   ó   € à�{‰{Ðr@   c           
     	óî   € VP                  R R4      pV'       dH   V P                  ! V P                   Uu. uF  q3P                  ! R/ VB NK  	  up!  P	                  4       # V P	                  4       # u upi )ÚdeepTrD   )ÚgetÚfuncÚargsÚdoitÚ_canonicalize)r;   ÚhintsrÒ   Úargs   &,  r=   rÖ   Ú_CodegenArrayAbstract.doitá   s_   € Ø�y‰y˜ Ó&ˆßØ—9’9¸D¿IºIÓF¹I°SŸxšxÑ0¨%Ô0¹IÑFÑG×UÑUÓWÐWà×%Ñ%Ó'Ð'ùò Gs   µA2rD   N)
rE   rF   rG   rH   r~   rÆ   rÊ   r0   rÖ   rJ   rD   r@   r=   rÂ   rÂ   ¹   s2   † àñ!ó ð!ò6"ð ñó ðö(r@   rÂ   c                  ó<   € ] tR t^ètRtR tR t]R 4       tR t	Rt
R# )ÚArrayTensorProductz>
Class to represent the tensor product of array-like objects.
c                	ó6  € V Uu. uF  p\        V4      NK  	  ppVP                  R R4      pV Uu. uF  p\        V4      NK  	  pp\        P                  ! V .VO5!  pWVn        V Uu. uF  p\        V4      NK  	  pp\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d	   RVn        M1\        ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      Vn        V'       d   VP                  4       # V# u upi u upi u upi )ÚcanonicalizeFc              3  ó(   "  € T F  qR J x € K
  	  R # 5ir2   rD   rk   s   & r=   rn   Ú-ArrayTensorProduct.__new__.<locals>.<genexpr>ø   ó   é € Ð)¡&˜Q�D�y£&ùó   ‚TNc              3  ó4   "  € T F  q F  q"x € K  	  K  	  R # 5ir2   rD   r—   s   &  r=   rn   rà   û   s   é € Ð<©& Qº!°Qœq¹!™q«&ùrˆ   )r-   ÚpopÚget_rankr   rV   rÅ   Ú	get_shaper�   rÎ   r�   r×   )	rW   rÕ   ÚkwargsrÙ   rÞ   ÚranksrY   rm   Úshapess	   &*,      r=   rV   ÚArrayTensorProduct.__new__í   sà   € Ù)-Ó.© #”˜–©ˆÐ.à—z‘z .°%Ó8ˆá*.Ó/©$ 3”˜#–©$ˆÐ/ä�mŠm˜CÐ' $Ó'ˆØŒÙ(,Ó-© 1”)˜A–,©ˆÐ-ç‹3Ñ)¡&Ó)�3�3Š3Ñ)¡&Ó)×)Ò)ØˆC�JçœÑ<©&Ó<Ÿ™Ñ<©&Ó<Ó<ˆCŒJßØ×$Ñ$Ó&Ð&Øˆ
ùò! /ùò 0ùò .s   …D±DÁ)Dc                	óP  aaa€ V P                   pV P                  V4      pV Uu. uF  p\        V4      NK  	  pp. p\        V4       F…  w  op\	        V\
        4      '       g   K  TP                  VP                  P                   UUu. uF&  qU Uu. uF  qf\        VR S 4      ,           NK  	  upNK(  	  upp4       VP                  VS&   K‡  	  V'       d=   \        \        V!  \        \        V4      ^,
          4      \        V4      ,          4      # \        V4      ^8X  d
   V^ ,          # \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d>   \!        \"        P$                  V Uu. uF  p\'        V4      NK  	  upR4      p\)        V!  # \        V4       UUu/ uF  w  rr\	        V\*        4      '       g   K  WrbK!  	  p	ppV	'       Ed   V Uu. uF/  p\	        V\*        4      '       d   \-        V4      M
\        V4      NK1  	  pp\/        \1        ^ .V,           4      4      R R o\        V Uu. uF'  p\	        V\*        4      '       d   VP                  MTNK)  	  up!  p
V	P3                  4        UaUUu. uFL  w  oq"P4                   F7  p\6        ;QJ d    . VV3R lV 4       F  NK  	  5M! VV3R lV 4       4      NK9  	  KN  	  pppp\9        V
.VO5!  # \        V4       UUu/ uF  w  rr\	        V\:        4      '       g   K  WrbK!  	  pppV'       Ed�   . p. pV Uu. uF  p\        V4      NK  	  pp\/        \1        ^ .V,           4      4      R R o\        V4       EF  w  op\	        V\:        4      '       d´   \        V4      \        VP<                  4      ,
          p\        VP<                  4      pTP                  \?        V4       Uu. uF  pSS,          V,           NK  	  up4       TP                  \?        WÿV,           4       Uu. uF  pSS,          V,           NK  	  up4       KÐ  TP                  \?        \        V4      4       Uu. uF  pSS,          V,           NK  	  up4       EK  	  VP                  V4       \        V Uu. uF'  p\	        V\:        4      '       d   VP                  MTNK)  	  up!  p
V Uu. uF/  p\	        V\:        4      '       d   \-        V4      M
\        V4      NK1  	  pp\/        \1        ^ .V,           4      4      R R oVP3                  4        UaUUu. uFL  w  oq"P<                   F7  p\6        ;QJ d    . VV3R lV 4       F  NK  	  5M! VV3R lV 4       4      NK9  	  KN  	  pppp\        \A        V
.VO5!  \C        V4      4      # V PD                  ! VRR/ # u upi u upi u uppi u upi u uppi u upi u upi u upppi u uppi u upi u upi u upi u upi u upi u upi u upppi )	Nc              3  óN   "  € T F  p\        V\        \        34      x € K  	  R # 5ir2   )r3   r£   r   )rl   rÙ   s   & r=   rn   Ú3ArrayTensorProduct._canonicalize.<locals>.<genexpr>  s   é € ÐHÁ4¸CŒz˜#¤	¬:Ð6×7Ð7Ã4ùs   ‚#%TFc              3  óD   <"  € T F  pSS,          V,           x € K  	  R # 5ir2   rD   )rl   ÚkÚcumulative_ranksrm   s   & €€r=   rn   rí     s   øé € Ð(LÉ!ÀQÐ)9¸!Õ)<¸q×)@Ò)@Ë!ùó   ƒ c              3  óD   <"  € T F  pSS,          V,           x € K  	  R # 5ir2   rD   )rl   rï   Úcumulative_ranks2rm   s   & €€r=   rn   rí   4  s   øé € Ð%JÉÀ1Ð&7¸Õ&:¸Q×&>Ò&>Ëùrñ   rÞ   rD   éÿÿÿÿ)#rÕ   Ú_flattenrå   Ú	enumerater3   ÚPermuteDimsÚextendÚpermutationÚcyclic_formrÉ   ÚexprÚ_permute_dimsÚ_array_tensor_productr+   rŒ   r�   r   r¼   Úaddræ   r£   ÚArrayContractionÚ_get_subrankÚlistr   ÚitemsÚcontraction_indicesr�   Ú_array_contractionÚArrayDiagonalÚdiagonal_indicesrv   Ú_array_diagonalr,   rÔ   )r;   rÕ   rÙ   rè   Úpermutation_cyclesrx   rï   rm   ré   ÚcontractionsÚtpr  Ú	diagonalsÚinverse_permutationÚ	last_permÚi1Úi2Úranks2r  rð   ró   s   &      `           @@r=   r×   Ú ArrayTensorProduct._canonicalize   s;  ú€ Ø�y‰yˆØ�}‰}˜TÓ"ˆá*.Ó/©$ 3”˜#–©$ˆÐ/ð  ÐÜ –o‰FˆAˆsÜ˜c¤;×/Ò/ÙØ×%Ñ%ÐPS×P_ÑP_×PkÒPkÔ&lÑPkÈ1ÀAÓ'FÁA¸q¬C°°b°q°	«N×(:Ð(:ÁAÔ'FÑPkÒ&lÔmØ—h‘hˆD�‹Gñ	 &÷
 Ü Ô!6¸Ñ!=¼{Ì3ÈuË:ÐVWÍ<Ó?XÔYdÐewÓYxÕ?xÓyÐyäˆt‹9˜Œ>Ø˜•7ˆN÷ ‹3ÑHÁ4ÓH�3�3Š3ÑHÁ4ÓH×HÒHÜœHŸL™LÁÓ*FÁ¸A¬9°Q®<ÁÑ*FÈÓKˆFÜ˜fÑ%Ð%ô .7°t¬_Ôb©_¡6 1Ä
È3ÔP`×@aœ˜š©_ˆÑbßˆ<ÙjnÓoÑjnÐcf¬*°SÔ:J×*KÒ*K”\ #Ô&ÔQYÐZ]ÓQ^Ò^ÑjnˆEÐoÜ#¤J°¨s°U­{Ó$;Ó<¸S¸bÐAÐÜ&ÑkoÓ(pÑkoÐdg´ZÀÔEU×5VÒ5V¨¯ªÐ\_Ò)_ÑkoÑ(pÑqˆBØ[g×[mÑ[mÔ[oö  #RÑ[oÑQWÐQRÐTW÷  zQô  zQÐtu§5¤5Õ(LÉ!Ó(L§5¡5Õ(LÉ!Ó(LÖ#Lñ  zQÑ#LÑ[oÐò  #RÜ% bÐ?Ð+>Ó?Ð?ä*3°D¬/Ô\©/¡ ¼ZÈÌ]×=[”V�Q’V©/ˆ	Ñ\ßˆ9Ø"$ÐØˆIÙ.2Ó3©d s”X˜c–]©dˆEÐ3Ü#¤J°¨s°U­{Ó$;Ó<¸S¸bÐAÐÜ# DŸ/‘��3Ü˜c¤=×1Ò1Ü! #›¬¨S×-AÑ-AÓ)BÕB�BÜ˜S×1Ñ1Ó2�BØ'×.Ñ.ÔQVÐWYÔQZÓ/[ÑQZÈAÐ0@ÀÕ0CÀa×0GÐ0GÑQZÑ/[Ô\Ø×$Ñ$ÄuÈRÐVXÕQXÔGYÓ%ZÑGYÀ!Ð&6°qÕ&9¸A×&=Ð&=ÑGYÑ%ZÖ[à'×.Ñ.ÔQVÔW_Ð`cÓWdÔQeÓ/fÑQeÈAÐ0@ÀÕ0CÀa×0GÐ0GÑQeÑ/f×gñ *ð  ×&Ñ& yÔ1Ü&ÑhlÓ(mÑhlÐad´ZÀÄ]×5SÒ5S¨¯ªÐY\Ò)\ÑhlÑ(mÑnˆBÙhlÓmÑhlÐad¬:°c¼=×+IÒ+I”l 3Ô'ÌxÐX[Ë}Ò\ÑhlˆFÐmÜ $¤Z°°°fµÓ%=Ó >¸sÀÐ CÐØYb×YhÑYhÔYjö   JÑYjÉvÈqÐRU÷  uIô  uIÐop§¤Õ%JÉÓ%J§¡Õ%JÉÓ%JÖ Jñ  uIÑ JÑYjÐò   JÜ ¤°Ð!GÐ6FÓ!GÌÐTgÓIhÓiÐià�yŠy˜$Ð3¨UÑ3Ð3ùòg 0ùò (GùÓ&lùò +Gùó
 cùâoùâ(pùô #Rùó ]ùò 4ùò 0\ùÚ%Zùâ/fùâ(mùÚmùô  Jsƒ   ¥WÂ
WÂWÂ/WÆ W!
Æ3W&ÇW&Ç(5W,É-W1Ê W6Ê/1W6Ë?W=ÌW=Ì8XÏ'X
Ð&X
Ñ)X
Ò(-XÓ5XÕ	 X!Õ*1X!×Wc                	ó„   € V UUu. uF+  p\        W 4      '       d   VP                  MV. F  q3NK  	  K-  	  pppV# u uppi r2   )r3   rÕ   )rW   rÕ   rÙ   rm   s   &&  r=   rõ   ÚArrayTensorProduct._flatten9  sA   € á!ÔY™T�c¼
À3×8LÒ8L¨C¯HªHÐSVÐRWÒ,W a’Ñ,W‘™TˆÑYØˆùó Zs   †1<c           	     	ó–   € \        V P                   Uu. uF'  p\        VR 4      '       d   VP                  4       MTNK)  	  up!  # u upi ©rz   )r   rÕ   rŠ   rz   ©r;   rÙ   s   & r=   rz   ÚArrayTensorProduct.as_explicit>  sB   € ÜÐdh×dmÒdmÓnÑdmÐ]`´G¸CÀ×4OÒ4O˜sŸ™Ô0ÐUXÒXÑdmÑnÑoÐoùÒns   ”-ArD   N)rE   rF   rG   rH   r|   rV   r×   r¡   rõ   rz   rJ   rD   r@   r=   rÜ   rÜ   è   s,   † ñòò&74ðr ñó ðöpr@   rÜ   c                  ó<   € ] tR tRtRtR tR t]R 4       tR t	Rt
R# )	ÚArrayAddiB  z(
Class for elementwise array additions.
c                	ó¸  € V Uu. uF  p\        V4      NK  	  ppV Uu. uF  p\        V4      NK  	  pp\        \        V4      4      p\	        V4      ^8w  d   \        R4      hV Uu. uF  q3P                  NK  	  pp\	        V Uu0 uF
  qff   K  VkK  	  up4      ^8”  d   \        R4      hVP                  RR4      p\        P                  ! V .VO5!  pWHn
        \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d	   RVn        MV^ ,          Vn        V'       d   VP                  4       # V# u upi u upi u upi u upi )re   z!summing arrays of different ranksNzmismatching shapes in additionrÞ   Fc              3  ó(   "  € T F  qR J x € K
  	  R # 5ir2   rD   rk   s   & r=   rn   Ú#ArrayAdd.__new__.<locals>.<genexpr>U  rá   râ   T)r-   rå   r  ÚsetrŒ   rs   r0   rä   r   rV   rÅ   r�   rÎ   r×   )	rW   rÕ   rç   rÙ   rè   ré   rm   rÞ   rY   s	   &*,      r=   rV   ÚArrayAdd.__new__G  s  € Ù)-Ó.© #”˜–©ˆÐ.Ù*.Ó/©$ 3”˜#–©$ˆÐ/Ü”S˜“ZÓ ˆÜˆu‹:˜Œ?ÜÐ@ÓAÐAÙ'+Ó,¡t —)”)¡tˆÐ,Ü™6Ó3™6�a—�™6Ñ3Ó4°qÔ8ÜÐ=Ó>Ð>à—z‘z .°%Ó8ˆä�mŠm˜CÐ' $Ó'ˆØŒß‹3Ñ)¡&Ó)�3�3Š3Ñ)¡&Ó)×)Ò)ØˆC�Jà �ˆCŒJßØ×$Ñ$Ó&Ð&Øˆ
ùò' /ùÚ/ùò -ùÚ3s   …EŸEÁ(EÂEÂEc                	ó  € V P                   pV P                  V4      pV Uu. uF  p\        V4      NK  	  ppV Uu. uF#  p\        V\        \
        34      '       d   K!  VNK%  	  pp\        V4      ^ 8X  dV   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   \        R4      h\	        V^ ,          !  # \        V4      ^8X  d
   V^ ,          # V P                  ! VRR/ # u upi u upi )r   c              3  ó0   "  € T F  qe   K  Vx € K  	  R # 5ir2   rD   rk   s   & r=   rn   Ú)ArrayAdd._canonicalize.<locals>.<genexpr>f  s   é € Ð2™f˜—1’1›fùs   ‚Œ
TFzIcannot handle addition of ZeroMatrix/ZeroArray and undefined shape objectrÞ   )
rÕ   Ú_flatten_argsræ   r3   r£   r   rŒ   r�   ÚNotImplementedErrorrÔ   )r;   rÕ   rÙ   ré   s   &   r=   r×   ÚArrayAdd._canonicalize]  sÐ   € Ø�y‰yˆð ×!Ñ! $Ó'ˆá,0Ó1©D S”)˜C–.©DˆÐ1Ù#ÓT™t˜¬:°c¼IÄzÐ;R×+S—�™tˆÐTÜˆt‹9˜Œ>ß‹sÑ2™fÓ2�s�sŠsÑ2™fÓ2×2Ò2Ü)Ð*uÓvÐvÜ˜f Q�iÑ(Ð(Ü�‹Y˜!Œ^Ø˜•7ˆNØ�yŠy˜$Ð3¨UÑ3Ð3ùò 2ùÚTs   ¢C7¼C<ÁC<c                	ó¤   € . pV FG  p\        V\        4      '       d   VP                  VP                  4       K6  VP	                  V4       KI  	  V# r2   )r3   r  rø   rÕ   Úappend)rW   rÕ   Únew_argsrÙ   s   &&  r=   r"  ÚArrayAdd._flatten_argsm  sA   € àˆÛˆCÜ˜#œx×(Ò(Ø—‘ §¡Ö)à—‘ Ö$ñ	 ð
 ˆr@   c           
     	ó¸   € \        \        P                  V P                   Uu. uF'  p\	        VR 4      '       d   VP                  4       MTNK)  	  up4      # u upi r  )r   r¼   rþ   rÕ   rŠ   rz   r  s   & r=   rz   ÚArrayAdd.as_explicitw  sM   € ÜÜ�L‰LØRV×R[ÒR[Ó\ÑR[È3¤'¨#¨}×"=Ò"=ˆS�_‰_ÔÀ3ÒFÑR[Ñ\ó^ð 	^ùâ\s   £-A
rD   N)rE   rF   rG   rH   r|   rV   r×   r¡   r"  rz   rJ   rD   r@   r=   r  r  B  s+   † ñòò,4ð  ñó ðö^r@   r  c                  óÆ   € ] tR tRtRtRR ltR t]R 4       t]R 4       t	]
R 4       t]
R	 4       t]
R
 4       t]
R 4       tR t]
R 4       tR t]
R 4       t]
R 4       tRtR# )r÷   i}  a  
Class to represent permutation of axes of arrays.

Examples
========

>>> from sympy.tensor.array import permutedims
>>> from sympy import MatrixSymbol
>>> M = MatrixSymbol("M", 3, 3)
>>> cg = permutedims(M, [1, 0])

The object ``cg`` represents the transposition of ``M``, as the permutation
``[1, 0]`` will act on its indices by switching them:

`M_{ij} \Rightarrow M_{ji}`

This is evident when transforming back to matrix form:

>>> from sympy.tensor.array.expressions.from_array_to_matrix import convert_array_to_matrix
>>> convert_array_to_matrix(cg)
M.T

>>> N = MatrixSymbol("N", 3, 2)
>>> cg = permutedims(N, [1, 0])
>>> cg.shape
(2, 3)

There are optional parameters that can be used as alternative to the permutation:

>>> from sympy.tensor.array.expressions import ArraySymbol, PermuteDims
>>> M = ArraySymbol("M", (1, 2, 3, 4, 5))
>>> expr = PermuteDims(M, index_order_old="ijklm", index_order_new="kijml")
>>> expr
PermuteDims(M, (0 2 1)(3 4))
>>> expr.shape
(3, 1, 2, 5, 4)

Permutations of tensor products are simplified in order to achieve a
standard form:

>>> from sympy.tensor.array import tensorproduct
>>> M = MatrixSymbol("M", 4, 5)
>>> tp = tensorproduct(M, N)
>>> tp.shape
(4, 5, 3, 2)
>>> perm1 = permutedims(tp, [2, 3, 1, 0])

The args ``(M, N)`` have been sorted and the permutation has been
simplified, the expression is equivalent:

>>> perm1.expr.args
(N, M)
>>> perm1.shape
(3, 2, 5, 4)
>>> perm1.permutation
(2 3)

The permutation in its array form has been simplified from
``[2, 3, 1, 0]`` to ``[0, 1, 3, 2]``, as the arguments of the tensor
product `M` and `N` have been switched:

>>> perm1.permutation.array_form
[0, 1, 3, 2]

We can nest a second permutation:

>>> perm2 = permutedims(perm1, [1, 0, 2, 3])
>>> perm2.shape
(2, 3, 5, 4)
>>> perm2.permutation.array_form
[1, 0, 3, 2]
Nc                	ó>  aa€ ^ RI Hp \        V4      p\        V4      pV P	                  SW4V4      oV! S4      oSP
                  pW‡8w  d   \        R4      hVP                  RR4      p	\        P                  ! WS4      p
\        V4      .V
n
        \        V4      oSf	   RV
n        M]\        ;QJ d*    . VV3R l\        \        S4      4       4       F  NK  	  5M#! VV3R l\        \        S4      4       4       4      V
n        V	'       d   V
P!                  4       # V
# )r   r*   z8Permutation size must be the length of the shape of exprrÞ   FNc              3  óB   <"  € T F  pSS! V4      ,          x € K  	  R # 5ir2   rD   )rl   rm   rù   r0   s   & €€r=   rn   Ú&PermuteDims.__new__.<locals>.<genexpr>Ù  s   øé € ÐPÑ>O¸˜u¡[°£^×4Ò4Ó>Oùó   ƒ)Úsympy.combinatoricsr+   r-   rå   Ú_get_permutation_from_argumentsÚsizers   rä   r   rV   rÅ   ræ   rÎ   r�   rv   rŒ   r×   )rW   rû   rù   Úindex_order_oldÚindex_order_newrç   r+   Ú	expr_rankÚpermutation_sizerÞ   rY   r0   s   &&f&&,     @r=   rV   ÚPermuteDims.__new__Ç  sá   ù€ Ý3Ü˜‹~ˆÜ˜T“Nˆ	Ø×9Ñ9¸+ÀÐirÓsˆÙ! +Ó.ˆØ&×+Ñ+ÐØÔ(ÜÐWÓXÐXà—z‘z .°%Ó8ˆä�mŠm˜C {Ó3ˆÜ! $›Ð(ˆŒÜ˜$“ˆØŠ=ØˆC�JçœÕP¼eÄCÈÃJÔ>OÓPŸ™ÕP¼eÄCÈÃJÔ>OÓPÓPˆCŒJßØ×$Ñ$Ó&Ð&Øˆ
r@   c                	óP  € V P                   pV P                  p\        V\        4      '       d#   VP                   pVP                  pW$,          pTp\        V\        4      '       d   V P                  W4      w  r\        V\        4      '       d   V P                  W4      w  r\        V\        \        34      '       d4   \        VP                   Uu. uF  qQP                  V,          NK  	  up!  # VP                  pV\        V4      8X  d   V# V P                  WR R7      # u upi )F)rÞ   )rû   rù   r3   r÷   rÿ   Ú'_PermuteDims_denestarg_ArrayContractionrÜ   Ú)_PermuteDims_denestarg_ArrayTensorProductr£   r   Ú
array_formr0   ÚsortedrÔ   )r;   rû   rù   ÚsubexprÚsubpermrm   Úplists   &      r=   r×   ÚPermuteDims._canonicalizeÞ  s÷   € Ø�y‰yˆØ×&Ñ&ˆÜ�dœK×(Ò(Ø—i‘iˆGØ×&Ñ&ˆGØ%Õ/ˆKØˆDÜ�dÔ,×-Ò-Ø $× LÑ LÈTÓ _ÑˆDÜ�dÔ.×/Ò/Ø $× NÑ NÈtÓ aÑˆDÜ�dœY¬
Ð3×4Ò4Ü°k×6LÒ6LÓMÑ6L°Ÿz™z¨!Ÿ}˜}Ñ6LÑMÑNÐNØ×&Ñ&ˆØ”F˜5“MÔ!ØˆKØ�y‰y˜¸ˆyÓ?Ð?ùò	 Ns   ÃD#c                	ó(   € V P                   ^ ,          # r\   ©rÕ   r_   s   &r=   rû   ÚPermuteDims.exprñ  ó   € à�y‰y˜�|Ðr@   c                	ó(   € V P                   ^,          # rd   rB  r_   s   &r=   rù   ÚPermuteDims.permutationõ  rD  r@   c           
     	óÄ  € \        VP                  4      p\        VP                  4      p\        \	        ^ .VP
                  ,           4      4      p\        \        V4      4       Uu. uF  qcWV,          WV^,           ,           NK  	  pp\        V4       UUu. uF  w  rhV\        V4      3NK  	  p	ppV	P                  R R7       V	 Uu. uF  qf^ ,          NK  	  p
pV
 Uu. uF  qdV,          NK  	  ppV
 Uu. uF  qgV,          NK  	  pp\        \        V UUu. uF  qf F  qÝNK  	  K  	  upp4      4      p\        V!  V3# u upi u uppi u upi u upi u upi u uppi )r   c                ó   € V ^,          # rd   rD   ©Úxs   &r=   Ú<lambda>ÚGPermuteDims._PermuteDims_denestarg_ArrayTensorProduct.<locals>.<lambda>  s   € ˜a ždr@   ©Úkey)r,   r;  r  rÕ   r   rÆ   rv   rŒ   rö   r<  Úsortr+   rý   )rW   rû   rù   Úperm_image_formrÕ   Úcumulrm   Úperm_image_form_in_componentsÚcompÚpsÚperm_args_image_formÚargs_sortedÚperm_image_form_sorted_argsrx   Únew_permutations   &&&            r=   r:  Ú5PermuteDims._PermuteDims_denestarg_ArrayTensorProductù  sJ  € ô % [×%;Ñ%;Ó<ˆÜ�D—I‘I‹ˆä”Z   d§m¡mÕ 3Ó4Ó5ˆô X]Ô]`ÐaeÓ]fÔWgÓ(hÑWgÐRS¸½À%È!ÍÅ*Ó)MÑWgÐ%Ð(hä/8Ð9VÔ/WÔXÑ/W¡G Aˆq”&˜“,ÓÑ/WˆÑXð 	�‰‘NˆÔ#á.0Ó1©b¨ !§ ©bÐÐ1á(<Ó=Ñ(< 1˜A—w�wÑ(<ˆÐ=áQeÓ&fÑQeÈAÀQ×'GÐ'GÑQeÐ#Ð&fÜ%¤jÑ=XÔ1dÑ=X¸ÒbcÐ]^²!Ñbc±!Ñ=XÒ1dÓ&eÓfˆÜ$ kÑ2°OÐCÐCùò )iùãXùò  2ùâ=ùâ&fùÛ1ds$   Á' EÂEÃ	EÃ EÃ7EÄEc                	óÐ  a€ \        V\        4      '       g   W3# \        VP                  \        4      '       g   W3# VP                  P                  pVP                  P                   Uu. uF  p\        V4      NK  	  ppVP                  pV UUu. uF  qw F  qˆNK  	  K  	  p	pp\        \        ^ .V,           4      4      p
. p\        VP                  4      p^ p\        \        V4      4       Fd  p. p\        W§,          W§^,           ,          4       F+  pW‰9   d   K  VP                  WÍ,          4       V^,          pK-  	  VP                  V4       Kf  	  \        VP                  4       UUu. uF-  w  r\        \        W§,          W§^,           ,          4      4      NK/  	  pppVP!                  VP                  V4      pVR,          pV UUu. uF  qw Uu. uF  qˆf   K  V! V4      NK  	  upNK!  	  ppp\        \        V4      4      pVP#                  R R7       V Uu. uF  qw^ ,          NK  	  ppV Uu. uF  pVV,          NK  	  pp\        V UUu. uF  qw F  qˆNK  	  K  	  upp4      oV Uu. uF  qsV,          NK  	  ppV Uu. uF5  p\$        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      NK7  	  pp\'        \)        V!  .VO5!  p\+        \        V Uu. uF  pVV,          NK  	  up UUu. uF  qw F  qˆNK  	  K  	  upp4      4      pVV3# u upi u uppi u uppi u upi u uppi u upi u upi u uppi u upi u upi u upi u uppi )r   c                ó   € V ^,          # rd   rD   rI  s   &r=   rK  ÚEPermuteDims._PermuteDims_denestarg_ArrayContraction.<locals>.<lambda>6  s   € ¨¨!®r@   rM  c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir2   rD   )rl   rx   Únew_index_perm_array_forms   & €r=   rn   ÚFPermuteDims._PermuteDims_denestarg_ArrayContraction.<locals>.<genexpr>>  s   øé € Ð(QÉqÈ!Ð)BÀ1×)EÒ)EËqùó   ƒrô   )r3   rÿ   rû   rÜ   rÕ   rå   r  r  r   r,   r;  rv   rŒ   r&  rö   rÆ   Ú_push_indices_uprO  r�   r  rý   r+   )rW   rû   rù   rÕ   rÙ   rÆ   r  rm   rx   Úcontraction_indices_flatrQ  Úpermutation_array_blocks_upÚ
image_formÚcounterÚcurrentÚeÚindex_blocksÚindex_blocks_upr  Úindex_blocks_up_permutedÚsorting_keysÚnew_perm_image_formÚnew_index_blocksr'  Únew_contraction_indicesÚnew_exprrï   rX  r^  s   &&&                         @r=   r9  Ú3PermuteDims._PermuteDims_denestarg_ArrayContraction  s4  ø€ ä˜$Ô 0×1Ò1ØÐ$Ð$Ü˜$Ÿ)™)Ô%7×8Ò8ØÐ$Ð$Ø�y‰y�~‰~ˆØ-1¯Y©Y¯^ª^Ó<©^ c”H˜S–M©^ˆÐ<à"×6Ñ6ÐÙ/BÔ#NÑ/B¨!ÊAÀq¢AÉA¡AÑ/BÐ Ñ#NÜ”Z   h¥Ó/Ó0ˆð ')Ð#Ü × 6Ñ 6Ó7ˆ
ØˆÜ”s˜8“}Ö%ˆAØˆGÜ˜5�8 U¨Q­3¥ZÖ0�ØÔ0ÙØ—‘˜zÕ2Ô3Ø˜1•’ñ	 1ð
 (×.Ñ.¨wÖ7ñ &ô GPÐPT×P]ÑP]ÔF^Ô_ÑF^¹d¸aœœU 5¥8¨U°Qµ3­ZÓ8Ö9ÑF^ˆÑ_Ø×/Ñ/°×0HÑ0HÈ,ÓWˆØ)¨BÕ/ÐÙbqÔ#rÑbqÐ]^ÀQÓ$XÁQÀÔ%;Ñ%8¸Ö%;ÁQÔ$XÑbqÐ Ñ#rô œIÐ&>Ó?Ó@ˆØ×Ñ™nÐÔ-ñ .:Ó:©\¨ Ÿt˜t©\ÐÐ:á5HÓIÑ5H°˜L¨ŸO˜OÑ5HÐÐIÜ$.Ñ;KÔ/WÑ;K°aÒUVÐPQ²ÑUV±Ñ;KÒ/WÓ$XÐ!Ù%8Ó9Ñ%8 ˜—G�GÑ%8ˆÐ9Ù[nÓ"oÑ[nÐVW§5¤5Ô(QÉqÓ(Q§5¡5Ô(QÉqÓ(QÖ#QÑ[nÐÐ"oÜ%Ô&;¸XÑ&FÐaÐI`ÓaˆÜ%¤jÑfyÓ=zÑfyÐabÐ>YÐZ[×>\Ð>\ÑfyÒ=zô  2GÑ=z¸ò  EFð  @A²!ñ  EF±!Ñ=zò  2Gó  'Hó  IˆØ˜Ð(Ð(ùòQ =ùó $Oùó$ `ùò %YùÓ#rùò ;ùâIùÛ/WùÚ9ùÚ"oùâ=zùó  2Gs`   Á,L'ÂL,Å13L2ÇL=ÇL8Ç#L8Ç/L=È$MÈ;MÉM
É7MÊMÊ+MË-MÌM"Ì8L=c                	ó:  € VP                   p\        VP                  4       UUUu. uF)  w  rE\        VP                   V,          4       F  qdNK  	  K+  	  pppp\        VP	                  4       4       Uu. uF
  qB! V4      NK  	  pp\        VP                  4      p	Wx^ ,          ,          p
. p. p\        4       p\        V4       FÌ  w  rNW~,          V
8w  d   VP                  V4       . pW~,          p
VP                  V4       W:,          p\        V4      V8X  g   KX  VP                  \        V4      4       V Uu. uF  qf\        V4      ,
          NK  	  ppWt,          p\        V	V,          \        V4      4      V	V&   VP                  V
4       . pKÎ  	  VP                  V4       \        \        \        V	4      4      4      p/ p^ .\        \        V4      4      ,           p\        \        V4      4       Fs  p\        VV,          VV^,           ,          4       Uu0 uF  qgWÆ,          ,          kK  	  pp\        V4      ^8w  d   KQ  \!        \#        V4      4      pVV8w  g   Kn  VVV&   Ku  	  . p. pV'       dŠ   \        V4      ^ 8X  d&   VP%                  4       w  ppVP                  V4       M%VR,          pVV9  d   . pKQ  VP'                  V4      pVV9   d   VP                  V4       . pK~  VP                  V4       K‘  V F;  p\        V4       F)  w  ppVVVV^,           \        V4      ,          ,          &   K+  	  K=  	  \        V4       UUUu. uF5  w  pp\        V4       Uu. uF  qlVV,          V,           ,          NK  	  upNK7  	  ppppV Uu. uF  qIV,          NK  	  p	pV Uu. uF  pVV,          NK  	  ppV UUu. uF  qD F  qfNK  	  K  	  ppp\)        V	!  \        V4      3# u upppi u upi u upi u upi u upi u upppi u upi u upi u uppi )r   rô   )rÆ   rö   rÕ   rv   rÊ   r  r  rø   r&  rŒ   r<  Úminrü   r+   rþ   r   ÚnextÚiterÚpopitemrä   rý   ) rW   rû   rù   rÆ   rm   rÙ   rx   Ú	index2argÚpermuted_indicesr'  Úarg_candidate_indexÚcurrent_indicesrX  Úinserted_arg_cand_indicesÚidxÚarg_candidate_rankÚlocal_current_indicesr  Úargs_positionsÚmapsÚcumulative_subranksr†   ÚelemÚlinesÚcurrent_linerï   ÚvÚlinerg  Úpermutation_blocksÚnew_permutation_blocksÚnew_permutation2s    &&&                             r=   Ú_check_permutation_mappingÚ&PermuteDims._check_permutation_mappingC  sº  € à—=‘=ˆÜ%.¨t¯y©yÔ%9Õ[Ñ%9™6˜1Ä5ÈÏÉÐWXÕIYÖCZ¸a’QÑCZ‘QÑ%9ˆ	Ò[Ü49¸$¿,¹,».Ô4IÓJÑ4I¨q˜K¨žNÑ4IÐÐJÜ˜Ÿ	™	“?ˆØ'¸Õ(;Õ<ÐØˆØˆÜ$'£EÐ!ÜÐ 0Ö1‰FˆAØ�~Ð!4Ô4Ø×&Ñ& Ô7Ø"$�Ø&/¥nÐ#Ø×"Ñ" 3Ô'Ø!)Õ!>ÐÜ�?Ó#Ð'9Ö9Ø×&Ñ&¤v¨oÓ'>Ô?ÙKZÓ([É?Àa¬S°Ó-A×)AÐ)AÉ?Ð%Ð([Ø•\�Ü,¨X°b­\¼;ÐG\Ó;]Ó^�˜‘Ø)×-Ñ-Ð.AÔBØ"$’ñ 2ð 	×Ñ˜Ô/ô œe¤C¨£MÓ2Ó3ˆàˆØ ˜c¤D¬°HÓ)=Ó$>Õ>ÐÜ”s˜8“}Ö%ˆAÜ8=Ð>QÐRSÕ>TÐViÐjkÐlmÕjmÕVnÔ8oÓpÑ8o°1˜?Õ-×.Ð.Ñ8oˆAÐpÜ�1‹v˜Œ{ÙÜœ˜Q›“=ˆDØ�DŽyØ��Q“ñ &ð ˆØˆßÜ�<Ó  AÔ%Ø—|‘|“~‘��1Ø×#Ñ# AÕ&à  Õ$�Ø˜D”=Ø#%�LÙØ—H‘H˜Q“K�Ø�LÔ Ø—‘˜\Ô*Ø!�ÙØ×Ñ Ö"ÛˆDÜ! $ž‘��1Ø<=�˜t Q¨¥U¬c°$«iÕ$7Õ8Ó9ó (ñ ô
 ktÐt|Ôj}Õ~Ñj}ÑbfÐbcÐefÔTYÐZ[ÔT\Ó]ÑT\ÈqÐ/BÀ1Õ/EÈÕ/I×JÐJÑT\Ô]Ñj}ÐÒ~Ù)7Ó8© A˜Q—K�K©ˆÐ8ÙAOÓ!PÁ¸AÐ"4°Q×"7Ð"7ÁÐÐ!PÙ'=ÔIÑ'= !ÂqÀ!šAÁq™AÑ'=ÐÑIÜ$ hÑ/´Ð=MÓ1NÐNÐNùôA \ùÚJùò )\ùò qùò< ^ùÔ~ùÚ8ùÚ!PùÛIsA   ¦/O+Á4O2Ä9O7ÈO<ÍPÍ$PÎPÎPÎ)PÏPÐPc                	óÜ  € \        VP                  4      pVP                  pVP                  p^ .\        \	        V4      4      ,           pV Uu. uF  p\        V4      NK  	  ppV Uu. uF  p\        V4      NK  	  p	p. p
\        V4       F±  w  r{Rp\        \        V4      ^,
          4       Fp  pW‡,          Wm,          8¼  g   K  W—,          Wm^,           ,          8  g   K4  \        W=,          \        V Uu. uF  qîWm,          ,
          NK  	  up.4      4      W=&   Rp M	  V'       g   K   V
P                  V4       K³  	  \        V!  \        W¢P                  R7      3# u upi u upi u upi )r   TF)r2  )r  rÕ   rÆ   rú   r   rr  Úmaxrö   rv   rŒ   rü   r+   r&  rý   r2  )rW   rû   rù   rÕ   rÆ   rú   r€  rm   Ú
cyclic_minÚ
cyclic_maxÚcyclic_keepÚcycleÚflagrx   rï   s   &&&            r=   Ú!_check_if_there_are_closed_cyclesÚ-PermuteDims._check_if_there_are_closed_cyclesˆ  s>  € ä�D—I‘I‹ˆØ—=‘=ˆØ!×-Ñ-ˆØ ˜c¤D¬°HÓ)=Ó$>Õ>ÐÙ&1Ó2¡k ”c˜!–f¡kˆ
Ð2Ù&1Ó2¡k ”c˜!–f¡kˆ
Ð2ØˆÜ! +Ö.‰HˆAØˆDÜœ3Ð2Ó3°aÕ7Ö8�Ø•=Ð$7Õ$:Ö:¸z½}ÐObÐefÕcfÕOgÖ?gä+¨D­G´[ÑglÓBmÑglÐbcÐGZÕG]×C]ÐC]ÑglÑBmÐAnÓ5oÓp�D‘GØ �DÙñ 9÷ ‰tØ×"Ñ" 5Ö)ñ /ô % dÑ+¬[¸×K[ÑK[Ô-\Ð\Ð\ùò 3ùÚ2ùò Cns   ÁEÁ(E$Ã6E)c                ó^   € V P                  V P                  V P                  4      pVf   V # V# )z
DEPRECATED.
)Ú_nest_permutationrû   rù   )r;   Úrets   & r=   Únest_permutationÚPermuteDims.nest_permutation�  s/   € ð ×$Ñ$ T§Y¡Y°×0@Ñ0@ÓAˆØŠ;ØˆKØˆ
r@   c           	     	ó^  a€ \        V\        4      '       d   \        V P                  W4      !  # \        V\        4      '       dœ   VP
                  p\        P                  ! V.VO5!  p\        V4      oVP                   Uu. uF5  p\        ;QJ d    . V3R  lV 4       F  NK  	  5M! V3R  lV 4       4      NK7  	  pp\        \        VP                  S4      .VO5!  # \        V\        4      '       d-   \        VP                   Uu. uF  p\        Wr4      NK  	  up!  # R# u upi u upi )c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir2   rD   )rl   rx   Únewpermutations   & €r=   rn   Ú0PermuteDims._nest_permutation.<locals>.<genexpr>¯  s   øé € Ð&DÁ!¸Q¡~°a×'8Ð'8Ã!ùó   ƒN)r3   rÜ   rü   r’  rÿ   rú   Ú'_convert_outer_indices_to_inner_indicesr+   r  r�   r  r÷   rû   r  Ú
_array_addrÕ   )	rW   rû   rù   ÚcyclesÚ	newcyclesrm   Únew_contr_indicesrÙ   r›  s	   &&&     @r=   r•  ÚPermuteDims._nest_permutation¦  sò   ø€ ä�dÔ.×/Ò/Ü  #×"GÑ"GÈÓ"ZÑ[Ð[Ü˜Ô.×/Ò/à ×,Ñ,ˆFÜ(×PÒPÐQUÐ_ÐX^Ó_ˆIÜ(¨Ó3ˆNØNR×NfÒNfÓ gÑNfÈ§¤Ô&DÁ!Ó&D§¡Ô&DÁ!Ó&DÖ!DÑNfÐÐ gÜ%¤k°$·)±)¸^Ó&LÐaÐO`ÓaÐaÜ˜œh×'Ò'ÜÈÏÊÓSÉÀ#¤¨CÖ =ÉÑSÑTÐTÙùò	 !hùò  Ts   ÂD%Â+D%Ä
D*c                	óˆ   € V P                   p\        VR 4      '       d   VP                  4       p\        WP                  4      # r  )rû   rŠ   rz   r   rù   ©r;   rû   s   & r=   rz   ÚPermuteDims.as_explicitµ  s7   € Ø�y‰yˆÜ�4˜×'Ò'Ø×#Ñ#Ó%ˆDÜ˜4×!1Ñ!1Ó2Ð2r@   c                	óœ   € Vf*   Ve   Vf   \        R4      h\        P                  W#V4      # Ve   \        R4      hVe   \        R4      hV# )NzPermutation not definedz2index_order_new cannot be defined with permutationz2index_order_old cannot be defined with permutation)rs   r÷   Ú"_get_permutation_from_index_orders)rW   rù   r3  r4  Údims   &&&&&r=   r1  Ú+PermuteDims._get_permutation_from_arguments»  s]   € àÒØÒ&¨/Ò*AÜ Ð!:Ó;Ð;Ü×AÑAÀ/ÐdgÓhÐhàÒ*Ü Ð!UÓVÐVØÒ*Ü Ð!UÓVÐVØÐr@   c                	ó`  € \        \        V4      4      V8w  d   \        R 4      h\        \        V4      4      V8w  d   \        R4      h\        \        P                  \        V4      \        V4      4      4      ^ 8”  d   \        R4      hV Uu. uF  qAP	                  V4      NK  	  ppV# u upi )z*wrong number of indices in index_order_newz*wrong number of indices in index_order_oldz>index_order_new and index_order_old must have the same indices)rŒ   r  rs   Úsymmetric_differenceÚindex)rW   r3  r4  r©  rm   rù   s   &&&&  r=   r¨  Ú.PermuteDims._get_permutation_from_index_ordersÈ  s˜   € äŒs�?Ó#Ó$¨Ô+ÜÐIÓJÐJÜŒs�?Ó#Ó$¨Ô+ÜÐIÓJÐJÜŒs×'Ñ'¬¨OÓ(<¼cÀ/Ó>RÓSÓTÐWXÔXÜÐ]Ó^Ð^Ù9HÓI¹°A×,Ñ,¨QÖ/¹ˆÐIØÐùò Js   ÂB+rD   )NNN)rE   rF   rG   rH   r|   rV   r×   r~   rû   rù   r¡   r:  r9  r‰  r’  r—  r•  rz   r1  r¨  rJ   rD   r@   r=   r÷   r÷   }  sÜ   † ñGôRò.@ð& ñó ðð ñó ðð ñDó ðDð0 ñ.)ó ð.)ð` ñBOó ðBOðH ñ]ó ð]ò(ð ñó ðò3ð ñ
ó ð
ð ñó ôr@   r÷   c                  óî   € ] tR tRtRtR tR t]R 4       t]R 4       t	]
R 4       t]
R 4       t]R	 4       t]R
 4       t]R 4       t]R R l4       tR tR t]R 4       t]R 4       t]R 4       tR tRtR# )r  iÔ  a×  
Class to represent the diagonal operator.

Explanation
===========

In a 2-dimensional array it returns the diagonal, this looks like the
operation:

`A_{ij} \rightarrow A_{ii}`

The diagonal over axes 1 and 2 (the second and third) of the tensor product
of two 2-dimensional arrays `A \otimes B` is

`\Big[ A_{ab} B_{cd} \Big]_{abcd} \rightarrow \Big[ A_{ai} B_{id} \Big]_{adi}`

In this last example the array expression has been reduced from
4-dimensional to 3-dimensional. Notice that no contraction has occurred,
rather there is a new index `i` for the diagonal, contraction would have
reduced the array to 2 dimensions.

Notice that the diagonalized out dimensions are added as new dimensions at
the end of the indices.
c                	ó¾  € \        V4      pV Uu. uF  p\        \        V4      !  NK  	  ppVP                  R R4      p\	        V4      pVe+   V P
                  ! V.VO5/ VB  V P                  Wb4      w  rvMRp\        V4      ^ 8X  d   V# \        P                  ! W.VO5!  pWxn
        \        V4      Vn        Whn        V'       d   VP                  4       # V# u upi )rÞ   FN)r-   r   r<  rÓ   ræ   Ú	_validateÚ_get_positions_shaperŒ   r   rV   Ú
_positionsÚ_get_subranksrÅ   rÎ   r×   )	rW   rû   r  rç   rm   rÞ   r0   Ú	positionsrY   s	   &&*,     r=   rV   ÚArrayDiagonal.__new__î  sÕ   € Ü˜‹~ˆÙ7GÓHÑ7G°!œE¤6¨!£9Ô-Ñ7GÐÐHØ—z‘z .°%Ó8ˆä˜$“ˆØÒØ�MŠM˜$Ð<Ð!1Ò<°VÒ<à"×7Ñ7¸ÓPÑˆI�uàˆIÜÐÓ  AÔ%ØˆKÜ�mŠm˜CÐ9Ð(8Ó9ˆØ"ŒÜ% dÓ+ˆŒØŒ
ßØ×$Ñ$Ó&Ð&Øˆ
ùò% Is   �Cc                	ó¸  € V P                   pV P                  pV Uu. uF  p\        V4      ^8X  g   K  VNK  	  pp\        V4      ^ 8”  Ed¢   \        V4       UUu/ uF!  w  r5\        V4      ^8X  g   K  V^ ,          VbK#  	  ppp\        V4       UUu/ uF  w  r5\        V4      ^8”  g   K  WSbK  	  pppV Uu. uF  p\        V4      ^8”  g   K  VNK  	  pp\	        V 4      p	\        V4      p
Wš,
          p. p^ p\
        P                  V\        \        V	4      4      \	        V4      4      pV F  pW69   d!   VP                  W¶V,          ,           4       K)  \        V\        \        34      '       d   VP                  V4       V^,          pKa  VP                  W·V,          ,           4       K�  	  \        V4      p\        V4      ^ 8”  d   \        \        V.VO5!  V4      # \        W4      # \        V\         4      '       d   V P"                  ! V.VO5!  # \        V\
        4      '       d   V P$                  ! V.VO5!  # \        V\&        4      '       d   V P(                  ! V.VO5!  # \        V\*        \,        34      '       d)   V P/                  VP0                  V4      w  pp\+        V!  # V P2                  ! V.VO5RR/ # u upi u uppi u uppi u upi )re   rÞ   F)rû   r  rŒ   rö   rå   r  Ú_push_indices_downr  rv   r&  r3   r   Úintr,   rü   r  r  Ú_ArrayDiagonal_denest_ArrayAddÚ#_ArrayDiagonal_denest_ArrayDiagonalr÷   Ú!_ArrayDiagonal_denest_PermuteDimsr£   r   r²  r0   rÔ   )r;   rû   r  rm   Útrivial_diagsrg  Útrivial_posÚdiag_posÚdiagonal_indices_shortÚrank1Úrank2Úrank3Úinv_permutationÚcounter1Úindices_downrù   rµ  r0   s   &                 r=   r×   ÚArrayDiagonal._canonicalize  s‡  € Ø�y‰yˆØ×0Ñ0ÐÙ$4ÓDÑ$4˜q¼¸A»À!¹Ÿ˜Ñ$4ˆÐDÜˆ}Ó Õ!Ü/8Ð9IÔ/JÔZÑ/J¡t qÌcÐRSËfÐXYÉkœ7˜1˜Q�4 š7Ñ/JˆKÑZÜ)2Ð3CÔ)DÔSÑ)D¡ ÌÈAËÐQRÉ
œ˜šÑ)DˆHÑSÙ1AÓ%PÑ1A¨AÄSÈÃVÈaÁZ§a aÑ1AÐ"Ð%PÜ˜T“NˆEÜÐ(Ó)ˆEØ•MˆEØ ˆOØˆHÜ(×;Ñ;Ð<RÔTXÔY^Ð_dÓYeÓTfÔhpÐquÓhvÓwˆLÛ!�ØÔ#Ø#×*Ñ*¨5¸qµ>Õ+AÖBÜ ¤G¬S >×2Ò2Ø#×*Ñ*¨8Ô4Ø •M’Hà#×*Ñ*¨5¸Aµ;Õ+>Ö?ñ "ô % _Ó5ˆKÜÐ)Ó*¨QÔ.Ü$¤_°TÐ%SÐ<RÓ%SÐU`ÓaÐaä$ TÓ7Ð7Ü�dœH×%Ò%Ø×6Ò6°tÐOÐ>NÓOÐOÜ�dœM×*Ò*Ø×;Ò;¸DÐTÐCSÓTÐTÜ�dœK×(Ò(Ø×9Ò9¸$ÐRÐAQÓRÐRÜ�dœY¬
Ð3×4Ò4Ø#×8Ñ8¸¿¹ÐEUÓVÑˆI�uÜ˜eÑ$Ð$Ø�yŠy˜ÐEÐ 0ÒE¸uÑEÐEùòC EùãZùÛSùÚ%Ps.   �K´KÁKÁ4KÂKÂ,KÂ9KÃKc                	óô  a€ \        V 4      oV Fà  p\        ;QJ d    V3R  lV 4       F  '       g   K   RM	  RM! V3R  lV 4       4      '       d   \        R4      h\        V Uu0 uF  pSV,          kK  	  up4      ^8w  d   \        R4      hVP	                  RR4      '       g   \        V4      ^8:  d   \        R4      h\        \        V4      4      \        V4      8w  g   K×  \        R4      h	  R# u upi )	c              3  ó>   <"  € T F  q\        S4      8¬  x € K  	  R # 5ir2   ©rŒ   )rl   rx   r0   s   & €r=   rn   Ú*ArrayDiagonal._validate.<locals>.<genexpr>0  s   øé € Ð.©A qœ˜E›
–?«Aùs   ƒTFz%index is larger than expression shapez-diagonalizing indices of different dimensionsÚallow_trivial_diagsz%need at least two axes to diagonalizezaxis index cannot be repeatedN)ræ   r�   rs   rŒ   rÓ   r  )rû   r  rç   rm   rx   r0   s   &*,  @r=   r±  ÚArrayDiagonal._validate*  sÀ   ø€ ô ˜$“ˆÛ!ˆAß‹sÔ.©AÓ.�s�sŠsÔ.©AÓ.×.Ò.Ü Ð!HÓIÐIÜ¡aÓ(¡a �E˜!—H�H¡aÑ(Ó)¨QÔ.Ü Ð!PÓQÐQØ—:‘:Ð3°U×;Ò;ÄÀAÃÈ!ÄÜ Ð!HÓIÐIÜ”3�q“6‹{œc !›fÖ$Ü Ð!@ÓAÐAó "ùò )s   Á&C5
c                	ó°   € V Uu. uFE  q V^ ,          ,          ^8w  g   K  \         ;QJ d    . R V 4       F  NK  	  5M! R V 4       4      NKG  	  up# u upi )r   c              3  ó$   "  € T F  qx € K  	  R # 5ir2   rD   )rl   rx   s   & r=   rn   Ú;ArrayDiagonal._remove_trivial_dimensions.<locals>.<genexpr>;  s   é € �^¡˜A”a£ùs   ‚©r�   )r0   r  rm   s   &* r=   Ú_remove_trivial_dimensionsÚ(ArrayDiagonal._remove_trivial_dimensions9  sB   € á-=ÓRÑ-=¨ÀqÈÅtÅÐPQÑAQÔ#—”‘^¡“^—‘‘^¡“^Ö#Ñ-=ÑRÐRùÒRs   …A 
A«%Ac                	ó(   € V P                   ^ ,          # r\   rB  r_   s   &r=   rû   ÚArrayDiagonal.expr=  rD  r@   c                	ó(   € V P                   R ,          # ©ºre   NNrB  r_   s   &r=   r  ÚArrayDiagonal.diagonal_indicesA  ó   € à�y‰y˜�}Ðr@   c                	óP  a€ V P                   pV UUu. uF  q3 F  qDNK  	  K  	  pppVP                  4        \        V 4      p\        V4      pWg,
          p\	        V4       Uu. uF  p^ NK  	  upo^ p	^ p
\	        V4       FH  pW§8  d"   W•V
,          8¼  d   V	^,          p	V
^,          p
K'  SV;;,          V
,          uu&   V	^,          p	KJ  	  \
        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      pW!,           p\        V P                  .VO5!  # u uppi u upi )r   c              3  óˆ   <"  € T F7  p\         ;QJ d    . V3R  lV 4       F  NK  	  5M! V3R  lV 4       4      x € K9  	  R# 5i)c              3  óD   <"  € T F  pSV,          V,           x € K  	  R # 5ir2   rD   ©rl   rx   Úshiftss   & €r=   rn   Ú3ArrayDiagonal._flatten.<locals>.<genexpr>.<genexpr>W  s   øé € Ð,FÁA¸q¨V°A­Y¸¯]ª]ÃAùrñ   NrÑ  ©rl   rm   rß  s   & €r=   rn   Ú)ArrayDiagonal._flatten.<locals>.<genexpr>W  s/   øé € Ð&gÑPfÈ1§u¤uÔ,FÁAÓ,F§u¡uÔ,FÁAÓ,F×'FÐ'FÓPfùó
   ƒA“/A)r  rO  r   rŒ   rv   r�   r  rû   )rû   Úouter_diagonal_indicesÚinner_diagonal_indicesrm   rx   Ú	all_innerÚ
total_rankÚ
inner_rankÚ
outer_rankre  Úpointerr  rß  s   &*          @r=   rõ   ÚArrayDiagonal._flattenE  s  ø€ à!%×!6Ñ!6ÐÙ 6ÔBÑ 6˜1Â¸1’QÁ‘QÑ 6ˆ	ÑBØ�‰Ôä! $Ó'ˆ
Ü˜“^ˆ
ØÕ,ˆ
Ü" :Ô.Ó/Ñ.˜“!Ñ.Ñ/ˆØˆØˆÜ�zÖ"ˆAØÔ&¨7ÀÕ6HÔ+HØ˜1•�Ø˜1•’Ø�1�I˜Õ ‹IØ�q�LŠGñ #÷ "'¤Ô&gÑPfÓ&g§¡Ô&gÑPfÓ&gÓ!gÐØ1ÕJÐÜ˜tŸy™yÐ<Ð+;Ó<Ð<ùó# Cùò 0s   “DÁ#D#c           	     	óh   € \        VP                   Uu. uF  p\        V.VO5!  NK  	  up!  # u upi r2   )rŸ  rÕ   r  )rW   rû   r  rÙ   s   &&* r=   rº  Ú,ArrayDiagonal._ArrayDiagonal_denest_ArrayAdd[  s.   € äÈtÏyÊyÓYÉyÈœO¨CÐCÐ2BÖCÉyÑYÑZÐZùÒYó   ”/c                	ó*   € V P                   ! V.VO5!  # r2   ©rõ   )rW   rû   r  s   &&*r=   r»  Ú1ArrayDiagonal._ArrayDiagonal_denest_ArrayDiagonal_  s   € à�|Š|˜DÐ4Ð#3Ó4Ð4r@   c               ó   € V ^8„  d   QhRR/# )rN   rû   r÷   rD   )rP   s   "r=   rQ   ÚArrayDiagonal.__annotate__d  s   € ÷ 
ñ 
°[ñ 
r@   c           
     	óî  a€ V UUu. uF"  q3 Uu. uF  qAP                  V4      NK  	  upNK$  	  ppp\        \        V4      4       Uau. uFG  o\        ;QJ d    V3R  lV 4       F  '       g   K   RM	  RM! V3R  lV 4       4      '       d   KE  SNKI  	  ppV Uu. uF  q1P                  V4      NK  	  pp\	        \        V4      4       UUu/ uF  w  r8WƒbK	  	  p	ppV Uu. uF  q9V,          NK  	  p
p\        V
4      p\        \        V4      4       Uu. uF  q3V,           NK  	  ppW¬,           p\        \        VP                  .VO5!  V4      # u upi u uppi u upi u upi u uppi u upi u upi )c              3  ó.   <"  € T F
  pSV9   x € K  	  R # 5ir2   rD   ©rl   rx   rm   s   & €r=   rn   ÚBArrayDiagonal._ArrayDiagonal_denest_PermuteDims.<locals>.<genexpr>f  s   øé € Ð>`ÑO_È!¸qÀA¾vÓO_ùó   ƒTF)
rù   rv   rå   r�   rö   r<  rŒ   rü   r  rû   )rW   rû   r  rm   rx   Úback_diagonal_indicesÚnondiagÚback_nondiagrg  ÚremapÚnew_permutation1ÚshiftÚdiag_block_permrX  s   &&*`          r=   r¼  Ú/ArrayDiagonal._ArrayDiagonal_denest_PermuteDimsc  sE  ø€ áK[Ô \ÑK[Àa¸qÓ!A¹q¸!×"2Ñ"2°1Ö"5¹qÔ!AÑK[ÐÑ \Ü#¤H¨T£NÔ3ÔaÑ3˜¿3»3Ô>`ÑO_Ó>`¿3¿3º3Ô>`ÑO_Ó>`×;`—1�1Ñ3ˆÐaÙ5<Ó=±W°×(Ñ(¨Ö+±WˆÐ=Ü"+¬F°<Ó,@Ô"AÔBÑ"A™$˜!�’Ñ"AˆÑBÙ.:Ó;©l¨ !ŸH˜H©lÐÐ;ÜÐ$Ó%ˆÜ.3´CÐ8MÓ4NÔ.OÓPÑ.O¨˜uŸ9˜9Ñ.OˆÐPØ*Õ<ˆÜÜØ—	‘	ðà&óð ó
ð 	
ùò "BùÓ \ùÚaùÚ=ùÛBùÚ;ùâPsE   ‡E�E¨EÁ	EÁEÁ0EÂEÂE"ÃE'Ã"E-ÄE2ÅEc                	ó&   a € V 3R  lp\        W!4      # )c                ób   <€ V \        SP                  4      8  d   SP                  V ,          # R # r2   )rŒ   r³  )rJ  r;   s   &€r=   rK  Ú<ArrayDiagonal._push_indices_down_nonstatic.<locals>.<lambda>v  s'   ø€ °A¼¸D¿O¹OÓ8LÔ4L˜dŸo™o¨aÕ0ÐVÐRVÐVr@   ©r$   ©r;   r‚   Ú	transforms   f& r=   Ú_push_indices_down_nonstaticÚ*ArrayDiagonal._push_indices_down_nonstaticu  s   ø€ ÜVˆ	Ü3°IÓGÐGr@   c                	ó&   a € V 3R  lp\        W!4      # )c                óÀ   <€ \        SP                  4       FC  w  r\        V\        4      '       d   W8X  g!   \        V\        4      '       g   K9  W9   g   KA  Vu # 	  R # r2   )rö   r³  r3   r¹  r�   )rJ  rm   rg  r;   s   &  €r=   r  Ú;ArrayDiagonal._push_indices_up_nonstatic.<locals>.transform{  s@   ø€ Ü! $§/¡/Ö2‘�Ü˜q¤#×&Ò&¨1¬6´zÀ!ÄU×7KÔ7KÐPQÖPVØ’Hó 3r@   r  r  s   f& r=   Ú_push_indices_up_nonstaticÚ(ArrayDiagonal._push_indices_up_nonstaticy  s   ø€ õ	ô
 4°IÓGÐGr@   c                	ób   a€ V P                  \        V4      V4      w  opV3R  lp\        WR4      # )c                ó:   <€ V \        S4      8  d
   SV ,          # R # r2   rÊ  )rJ  rµ  s   &€r=   rK  Ú2ArrayDiagonal._push_indices_down.<locals>.<lambda>…  s   ø€ ¨a´#°i³.Ô.@˜i¨�lÐJÀdÐJr@   ©r²  rv   r$   ©rW   r  r‚   Úrankr0   r  rµ  s   &&&&  @r=   r¸  Ú ArrayDiagonal._push_indices_down‚  s/   ø€ à×3Ñ3´E¸$³KÐAQÓRÑˆ	�5ÜJˆ	Ü3°IÓGÐGr@   c                	ób   a€ V P                  \        V4      V4      w  opV3R  lp\        WR4      # )c                ó¸   <€ \        S4       FI  w  r\        V\        4      '       d   W8X  g'   \        V\        \        34      '       g   K?  W9   g   KG  Vu # 	  R # r2   )rö   r3   r¹  r�   r   )rJ  rm   rg  rµ  s   &  €r=   r  Ú1ArrayDiagonal._push_indices_up.<locals>.transformŒ  s@   ø€ Ü! )Ö,‘�Ü˜q¤#×&Ò&¨1¬6´zÀ!ÄeÌUÀ^×7TÔ7TÐZ[ÖZ`Ø’Hó -r@   r  r  s   &&&&  @r=   ra  ÚArrayDiagonal._push_indices_upˆ  s1   ø€ à×3Ñ3´E¸$³KÐAQÓRÑˆ	�5õ	ô
 4°IÓGÐGr@   c                	ón  aa€ \         ;QJ d     . V3R  l\        S4       4       F  NK  	  5M! V3R  l\        S4       4       4      pV'       d
   \        V!  MRw  rE\         ;QJ d    . V3R lS 4       F  NK  	  5M! V3R lS 4       4      pV'       d
   \        V!  MRw  rxWG,           p	WX,           oV	S3# )c              3  ó¸   <a"  € T FN  w  op\         ;QJ d    V3R  lS 4       F  '       g   K   RM	  RM! V3R  lS 4       4      '       d   KH  SV3x € KP  	  R# 5i)c              3  ó.   <"  € T F
  pSV9   x € K  	  R # 5ir2   rD   rö  s   & €r=   rn   Ú?ArrayDiagonal._get_positions_shape.<locals>.<genexpr>.<genexpr>•  s   øé € ÐHjÑYiÐTUÈÈaÎÓYiùrø  TFN©r�   )rl   Úshprm   r  s   & @€r=   rn   Ú5ArrayDiagonal._get_positions_shape.<locals>.<genexpr>•  s<   ùé € ÐkÑ-=¡6 1 cÇSÃSÔHjÑYiÓHjÇSÇSÂSÔHjÑYiÓHj×Ej”h�q˜#•hÓ-=ùs   „A—A®AÁAc              3  óF   <"  € T F  qSV^ ,          ,          3x € K  	  R# 5i)r   NrD   )rl   rm   r0   s   & €r=   rn   r  —  s   øé € ÐAÑ0@¨1˜%  !¥�+Õ&Ó0@ùs   ƒ!)rD   rD   )r�   rö   rŽ   )
rW   r0   r  Údata1Úpos1Úshp1Údata2Úpos2Úshp2rµ  s
   &ff       r=   r²  Ú"ArrayDiagonal._get_positions_shape“  s‚   ù€ ç”Ôk¬Y°uÔ-=Ók—‘Ôk¬Y°uÔ-=ÓkÓkˆß$)”S˜%’[¨x‰
ˆß”ÔAÑ0@ÓA—‘ÔAÑ0@ÓAÓAˆß$)”S˜%’[¨x‰
ˆØ•Kˆ	Ø•ˆØ˜%ÐÐr@   c                	óŒ   € V P                   p\        VR 4      '       d   VP                  4       p\        V.V P                  O5!  # r  )rû   rŠ   rz   r   r  r¥  s   & r=   rz   ÚArrayDiagonal.as_explicit�  s<   € Ø�y‰yˆÜ�4˜×'Ò'Ø×#Ñ#Ó%ˆDÜ˜dÐ; T×%:Ñ%:Ó;Ð;r@   rD   N)rE   rF   rG   rH   r|   rV   r×   Ústaticmethodr±  rÒ  r~   rû   r  rõ   r¡   rº  r»  r¼  r  r  r¸  ra  r²  rz   rJ   rD   r@   r=   r  r  Ô  s
  † ñò2ò,$FðL ñBó ðBð ñSó ðSð ñó ðð ñó ðð ñ=ó ð=ð* ñ[ó ð[ð ñ5ó ð5ð ô
ó ð
ò"HòHð ñHó ðHð
 ñHó ðHð ñ ó ð ö<r@   r  c                  óX   € ] tR tRtR t]R 4       t]R 4       t]R 4       tR t	R t
RtR	# )
ÚArrayElementwiseApplyFunci¤  c                	ó¶   € \        V\        4      '       g   \        R 4      p\        W1! V4      4      p\        P	                  WV4      p\        V4      Vn        V# ©Úd)r3   r   r   rÂ   rV   r´  rÅ   )rW   ÚfunctionÚelementr/  rY   s   &&&  r=   rV   Ú!ArrayElementwiseApplyFunc.__new__¦  sK   € ä˜(¤F×+Ò+Ü�c“
ˆAÜ˜a ¨!£Ó-ˆHä#×+Ñ+¨C¸7ÓCˆÜ% gÓ.ˆŒØˆ
r@   c                	ó(   € V P                   ^ ,          # r\   rB  r_   s   &r=   r0  Ú"ArrayElementwiseApplyFunc.function°  rD  r@   c                	ó(   € V P                   ^,          # rd   rB  r_   s   &r=   rû   ÚArrayElementwiseApplyFunc.expr´  rD  r@   c                	ó.   € V P                   P                  # r2   ©rû   r0   r_   s   &r=   r0   ÚArrayElementwiseApplyFunc.shape¸  s   € à�y‰y�‰Ðr@   c                	ó¼   € \        R 4      pV P                  V4      pVP                  V4      p\        V\        4      '       d   \        V4      pV# \        W4      pV# r.  )r   r0  Údiffr3   r   Útyper   )r;   r/  r0  Úfdiffs   &   r=   Ú_get_function_fdiffÚ-ArrayElementwiseApplyFunc._get_function_fdiff¼  sU   € Ü�#‹JˆØ—=‘= Ó#ˆØ—‘˜aÓ ˆÜ�eœX×&Ò&Ü˜“KˆEð ˆô ˜1Ó$ˆEØˆr@   c                	ó”   € V P                   p\        VR 4      '       d   VP                  4       pVP                  V P                  4      # r  )rû   rŠ   rz   Ú	applyfuncr0  r¥  s   & r=   rz   Ú%ArrayElementwiseApplyFunc.as_explicitÆ  s9   € Ø�y‰yˆÜ�4˜×'Ò'Ø×#Ñ#Ó%ˆDØ�~‰~˜dŸm™mÓ,Ð,r@   rD   N)rE   rF   rG   rH   rV   r~   r0  rû   r0   r>  rz   rJ   rD   r@   r=   r,  r,  ¤  sM   † òð ñó ðð ñó ðð ñó ðòö-r@   r,  c                  ó’  € ] tR tRtRtR tR tR tR t]	R 4       t
]R 4       t]R	 4       t]R
 4       tR tR t]	R 4       t]	R 4       t]	R 4       t]	R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R R l4       t]R 4       tR t]	R 4       t]R 4       t]R 4       t]R 4       t ]R 4       t!R t"R t#R  t$R! t%R"t&R## )$rÿ   iÍ  zl
This class is meant to represent contractions of arrays in a form easily
processable by the code printers.
c                	óè  aa€ \        S4      o\        V4      pVP                  R R4      p\        P                  ! W.SO5!  p\        V4      Vn        \        VP                  4      Vn        \        \        VP                  4      4       Uau/ uFH  o\        ;QJ d    V3R lS 4       F  '       d   K   RM	  RM! V3R lS 4       4      '       g   KE  SSbKJ  	  ppWun        \        V4      pV P                  ! V.SO5!   V'       dE   \        ;QJ d     . V3R l\!        V4       4       F  NK  	  5M! V3R l\!        V4       4       4      pW…n        V'       d   VP%                  4       # V# u upi )rÞ   Fc              3  ó.   <"  € T F
  pSV9  x € K  	  R # 5ir2   rD   )rl   Úcindrm   s   & €r=   rn   Ú+ArrayContraction.__new__.<locals>.<genexpr>Ý  s'   øé € ð  SBñ  nAÐeiÐSTÐ\`ÖS`ó  nAùrø  Tc              3  ó´   <a"  € T FL  w  op\         ;QJ d    V3R  lS 4       F  '       g   K   RM	  RM! V3R  lS 4       4      '       d   KH  Vx € KN  	  R# 5i)c              3  ó.   <"  € T F
  pSV9   x € K  	  R # 5ir2   rD   rö  s   & €r=   rn   Ú5ArrayContraction.__new__.<locals>.<genexpr>.<genexpr>ã  s   øé € ÐGlÑXkÐSTÈÈQÎÓXkùrø  TFNr  )rl   r  rm   r  s   & @€r=   rn   rG  ã  s8   ùé € ÐmÑ,<¡& ! SÇCÃCÔGlÑXkÓGlÇCÇCÂCÔGlÑXkÓGl×DlŸ#š#Ó,<ùs   „A—A®AÁ
A)r%   r-   rÓ   r   rV   r´  rÅ   r&   Ú_mappingrv   rÉ   rr   Ú_free_indices_to_positionræ   r±  r�   rö   rÎ   r×   )	rW   rû   r  rç   rÞ   rY   rm   Úfree_indices_to_positionr0   s	   &&j,  `  r=   rV   ÚArrayContraction.__new__Ó  s2  ù€ Ü7Ð8KÓLÐÜ˜‹~ˆà—z‘z .°%Ó8ˆä�mŠm˜CÐ<Ð(;Ó<ˆÜ% dÓ+ˆŒÜ1°#·-±-Ó@ˆŒä27¼¸C¿M¹MÓ8JÔ2Kô  $CÑ2K¨QÏsËsô  SBñ  nAó  SBÏsÏsÊsô  SBñ  nAó  SB÷  PB¤D A q¢DÑ2KÐ ð  $CØ(@Ô%ä˜$“ˆØ�Š�dÐ1Ð0Ô1ßß”EÔm¬I°eÔ,<Óm—E‘EÔm¬I°eÔ,<ÓmÓmˆEØŒ
ßØ×$Ñ$Ó&Ð&Øˆ
ùò $Cs   ÂE/ÂE/Â5E/ÃE/c                	ó~  € V P                   pV P                  p\        V4      ^ 8X  d   V# \        V\        4      '       d   V P
                  ! V.VO5!  # \        V\        \        34      '       d   V P                  ! V.VO5!  # \        V\        4      '       d   V P                  ! V.VO5!  # \        V\        4      '       d9   V P                  W4      w  rV P                  W4      w  r\        V4      ^ 8X  d   V# \        V\        4      '       d   V P                  ! V.VO5!  # \        V\         4      '       d   V P"                  ! V.VO5!  # V Uu. uF5  p\        V4      ^8”  g!   \%        V4      V^ ,          ,          ^8w  g   K3  VNK7  	  pp\        V4      ^ 8X  d   V# V P&                  ! V.VO5RR/ # u upi )r   rÞ   F)rû   r  rŒ   r3   rÿ   Ú)_ArrayContraction_denest_ArrayContractionr£   r   Ú"_ArrayContraction_denest_ZeroArrayr÷   Ú$_ArrayContraction_denest_PermuteDimsrÜ   Ú_sort_fully_contracted_argsÚ_lower_contraction_to_addendsr  Ú&_ArrayContraction_denest_ArrayDiagonalr  Ú!_ArrayContraction_denest_ArrayAddræ   rÔ   )r;   rû   r  rm   s   &   r=   r×   ÚArrayContraction._canonicalizeé  sœ  € Ø�y‰yˆØ"×6Ñ6ÐäÐ"Ó# qÔ(ØˆKä�dÔ,×-Ò-Ø×AÒAÀ$Ð]ÐI\Ó]Ð]ä�dœY¬
Ð3×4Ò4Ø×:Ò:¸4ÐVÐBUÓVÐVä�dœK×(Ò(Ø×<Ò<¸TÐXÐDWÓXÐXä�dÔ.×/Ò/Ø(,×(HÑ(HÈÓ(cÑ%ˆDØ(,×(JÑ(JÈ4Ó(eÑ%ˆDÜÐ&Ó'¨1Ô,Ø�ä�dœM×*Ò*Ø×>Ò>¸tÐZÐFYÓZÐZä�dœH×%Ò%Ø×9Ò9¸$ÐUÐATÓUÐUñ +>ÓjÑ*= QÄÀQÃÈ!ÄÌyÐY]ËÐ_`ÐabÕ_cÕOdÐhiÑOiŸq˜qÑ*=ÐÐjÜÐ"Ó# qÔ(ØˆKà�yŠy˜ÐHÐ 3ÒHÀ%ÑHÐHùò	 ks   Å0F:Æ
F:c                	ó*   € V^8X  d   V # \        R4      h©re   zDProduct of N-dim arrays is not uniquely defined. Use another method.©r#  ©r;   Úothers   &&r=   Ú__mul__ÚArrayContraction.__mul__  ó   € Ø�AŒ:ØˆKä%Ð&lÓmÐmr@   c                	ó*   € V^8X  d   V # \        R4      hrY  rZ  r[  s   &&r=   Ú__rmul__ÚArrayContraction.__rmul__  r_  r@   c                	óÄ   € \        V 4      pVf   R # V FC  p\        V Uu0 uF  qBV,          R8w  g   K  W$,          kK  	  up4      ^8w  g   K:  \        R4      h	  R # u upi )Nz+contracting indices of different dimensionsrô   )ræ   rŒ   rs   )rû   r  r0   rm   rx   s   &*   r=   r±  ÚArrayContraction._validate  sX   € ä˜$“ˆØŠ=Ùó %ˆAÜ¡aÓ:¡a °­8°r©>”H�E—H�H¡aÑ:Ó;¸qÖ@Ü Ð!NÓOÐOó %ùÚ:s
    A
´A
c                	óŽ   € V UUu. uF  q3 F  qDNK  	  K  	  pppVP                  4        \        V4      p\        Wb4      # u uppi r2   )rO  r)   r$   ©rW   r  r‚   rm   rx   Úflattened_contraction_indicesr  s   &&&    r=   r¸  Ú#ArrayContraction._push_indices_down#  sK   € á4GÔ(SÑ4G¨qÒQRÈAªÑQR©Ñ4GÐ%Ñ(SØ%×*Ñ*Ô,Ü@ÐA^Ó_ˆ	Ü3°IÓGÐGùó )Tó   †Ac                	óŽ   € V UUu. uF  q3 F  qDNK  	  K  	  pppVP                  4        \        V4      p\        Wb4      # u uppi r2   )rO  r'   r$   rf  s   &&&    r=   ra  Ú!ArrayContraction._push_indices_up*  sK   € á4GÔ(SÑ4G¨qÒQRÈAªÑQR©Ñ4GÐ%Ñ(SØ%×*Ñ*Ô,Ü>Ð?\Ó]ˆ	Ü3°IÓGÐGùó )Tri  c           
     	óÆ  aaa€ \        V\        4      '       d   \        4       h\        V\        4      '       g   W3# VP                  p\        \        ^ .V,           4      4      o. pVP                   Uu. uF  p. NK  	  pp\        4       pV Fí  p\        \        VP                  4      4       F·  o\        VP                  S,          \        4      '       g   K,  \        ;QJ d     VV3R lV 4       F  '       d   K   RM	  RM! VV3R lV 4       4      '       g   Kp  VS,          P                  V U	u. uF  q™SS,          ,
          NK  	  up	4       VP                  V4        KÚ  	  VP                  V4       Kï  	  \        V4      \        V4      8X  d   W3# \        V4      p
\        \        \        V
4       Uu. uF  qUV9   d   ^M^ NK  	  up4      4      oV Uu. uF#  p\        P                   ! V3R lV 4       4      NK%  	  pp\#        \%        VP                  V4       UUu. uF  w  r¼\'        V.VO5!  NK  	  upp!  pWÔ3# u upi u up	i u upi u upi u uppi )r   c              3  óz   <"  € T F0  pSS,          Tu;8*  ;'       d    SS^,           ,          8  Mu x € K2  	  R# 5i©re   NrD   )rl   rï   Úcumranksrx   s   & €€r=   rn   ÚAArrayContraction._lower_contraction_to_addends.<locals>.<genexpr>@  s/   øé € ÐSÑAR¸A�x •{ a×7Ô7¨(°1°Qµ3­-×7Ñ7ÓARùs   ƒ;�;FTc              3  óB   <"  € T F  qSV,          ,
          x € K  	  R # 5ir2   rD   rÞ  s   & €r=   rn   rp  J  s   øé € Ð7QÉqÈ!¸FÀ1½I¿ºËqùr/  )r3   r  r#  rÜ   rÆ   r  r   rÕ   r  rv   rŒ   rr   r&  Úupdaterå   r   r›   rý   rŽ   r  )rW   rû   r  rÆ   Úcontraction_indices_remainingrm   Úcontraction_indices_argsÚ	backshiftÚcontraction_grouprï   rç  rÙ   Úcontrr–  ro  rx   rß  s   &&&           @@@r=   rT  Ú.ArrayContraction._lower_contraction_to_addends1  sý  ú€ ä�dœH×%Ò%Ü%Ó'Ð'Ü˜$Ô 2×3Ò3ØÐ,Ð,Ø—=‘=ˆÜœ
 A 3¨¥>Ó2Ó3ˆØ(*Ð%Ø04·	²	Ó#:±	¨1£B±	Ð Ð#:Ü“Eˆ	Û!4ÐÜœ3˜tŸy™y›>Ö*�Ü! $§)¡)¨A¥,´×9Ò9Ùß“3ÕSÑARÓS—3—3’3ÕSÑARÓS×SÔSØ,¨QÕ/×6Ñ6ÑQbÓ7cÑQbÈA¸HÀQ½K¿¸ÑQbÑ7cÔdØ×$Ñ$Ð%6Ô7Úñ +ð .×4Ñ4Ð5FÖGñ "5ô Ð,Ó-´Ð5HÓ1IÔIØÐ,Ð,Ü˜d“^ˆ
Ü”jÄeÈJÔFWÓ!XÑFWÀ¨I¤~¡!¸1Ò"<ÑFWÑ!XÓYÓZˆÙ[xÓ(yÑ[xÐVW¬¯ªÔ7QÉqÓ7QÖ)QÑ[xÐ%Ð(yÜ#Ü>AÀ$Ç)Á)ÐMeÔ>fô&
Ù>f±
°Ô˜sÐ+ UÖ+Ñ>fò&
ñ ˆð Ð1Ð1ùò) $;ùò 8dùò "YùÚ(yùó&
s   Á5I	Ä5IÆ=IÇ)IÈ(I
c           	     ó¢  aa€ \        V 4      pV P                  p. p\        V4       EFf  w  op\        V4      ^8:  d   K  VP	                  S4      pV P
                  P                  V^ ,          ,          p. p. pV Fí  w  ršVP                  V	,          pVP                  pVP                  V4      w  rÞ^V
,
          pWß,           o^VP                  9  go   V^8H  RJ d   VP                  R8w  gU   \        ;QJ d)    VV3R l\        V4       4       F  '       g   K   RM	  RM! VV3R l\        V4       4       4      '       d   VP                  Wº34       KÛ  VP                  Wº34       Kï  	  \        V4      ^8”  d   EKX  V F   w  pp
\        VP                  4      Vn        K"  	  VR,          V,           VR,          ,           pV^ ,          w  pp
VP                  V
,          pV^R  F‡  w  pp
VVP                  V
&   VP                  4       pVP                  P                  R4      ^V
,
          8X  g   Q hVVP                  VP                  P                  R4      &   VP                  V4       K‰  	  VR,          w  pp
VVP                  V
&   EKi  	  V F)  pVP!                  V\#        \%        ^4      R.4      4       K+  	  VP'                  4       # )	aè  
Recognize multiple contractions and attempt at rewriting them as paired-contractions.

This allows some contractions involving more than two indices to be
rewritten as multiple contractions involving two indices, thus allowing
the expression to be rewritten as a matrix multiplication line.

Examples:

* `A_ij b_j0 C_jk` ===> `A*DiagMatrix(b)*C`

Care for:
- matrix being diagonalized (i.e. `A_ii`)
- vectors being diagonalized (i.e. `a_i0`)

Multiple contractions can be split into matrix multiplications if
not more than two arguments are non-diagonals or non-vectors.
Vectors get diagonalized while diagonal matrices remain diagonal.
The non-diagonal matrices can be at the beginning or at the end
of the final matrix multiplication line.
Tc              3  óD   <"  € T F  w  rVS8w  g   K  SV9   x € K  	  R # 5ir2   rD   )rl   ÚliÚlÚindlÚother_arg_abss   &  €€r=   rn   Ú?ArrayContraction.split_multiple_contractions.<locals>.<genexpr>‘  s&   øé € ÐeÑ8V©u¨rÐZ\Ð`dÑZdÔ*˜¨Ö*Ó8Vùs   ƒ “ F:Nre   NrØ  N)re   re   rô   )Ú_EditArrayContractionr  rö   rŒ   Úget_mapping_for_indexrû   r0   Úargs_with_indr1  Úget_absolute_ranger�   r&  r   r‚   Úget_new_contraction_indexr­  Úinsert_afterÚ_ArgEr´   Úto_array_contraction)r;   Úeditorr  Úonearray_insertÚlinksrµ  Úcurrent_dimensionÚnot_vectorsÚvectorsÚarg_indÚrel_indrÙ   ÚmatÚabs_arg_startÚabs_arg_endÚother_arg_posr„  Úvectors_to_loopÚfirst_not_vectorÚ	new_indexÚlast_vecr}  r~  s   &                    @@r=   Úsplit_multiple_contractionsÚ,ArrayContraction.split_multiple_contractionsP  sq  ù€ ô. ' tÓ,ˆà"×6Ñ6Ðàˆä$Ð%8×9‰KˆD�%Ü�5‹z˜QŒÙð& ×4Ñ4°TÓ:ˆIð !%§	¡	§¡°°aµÕ 9ÐàˆKØˆGÛ$-Ñ �Ø×*Ñ*¨7Õ3�Ø—k‘k�Ø-3×-FÑ-FÀsÓ-KÑ*�Ø ! '¥	�Ø -Õ =�Ø˜cŸi™iÔ'Ø'¨1Ñ,°Ó5¸#¿)¹)ÀvÔ:Mß“CÕe¼	ÐBUÔ8VÓe—C—C’CÕe¼	ÐBUÔ8VÓe×eÒeà×&Ñ&¨ ~Ö6à—N‘N C >Ö2ñ %.ô �;Ó !Ô#ò ó
 &‘
��7Ü.¨q¯y©yÓ9�–	ñ &à)¨"�o°Õ7¸+Àb½/ÕIˆOØ(7¸Õ(:Ñ%Ð˜gØ(×0Ñ0°Õ9ˆIà-¨a°Ó3‘
��7Ø%.�—	‘	˜'Ñ"Ø"×<Ñ<Ó>�	Ø—y‘y—‘ tÓ,°°GµÔ;Ð;Ð;Ø3<�—	‘	˜!Ÿ)™)Ÿ/™/¨$Ó/Ñ0Ø×&Ñ& qÖ)ñ 4ð !0°Õ 3ÑˆH�gØ(1ˆH×Ñ˜WÔ%ñA :óD !ˆAØ×Ñ ¤5¬°!«°t°fÓ#=Ö>ñ !ð ×*Ñ*Ó,Ð,r@   c           
     	óÒ  € \        V P                  \        4      '       g   V # V P                  P                  V P                  P                  V P
                  4      p. pV P                  P                  R ,          pV F–  p\        V4      pV F_  pV Uu. uF  qvV9   g   K  VNK  	  ppTP                  V UU	u. uF  qw F  q™NK  	  K  	  up	p4       V Uu. uF  qwV9  g   K  VNK  	  ppKa  	  VP                  \        \        V4      4      4       K˜  	  \        P                  W24      p\        \        V P                  P                  .VO5!  .VO5!  # u upi u up	pi u upi ©rÄ   )r3   rû   r  r¸  r  r  r  rø   r&  r<  r  ra  r  r  )
r;   Úcontraction_downrn  r  rm   rv  rx   rï   Údiagonal_withr|  s
   &         r=   Úflatten_contraction_of_diagonalÚ0ArrayContraction.flatten_contraction_of_diagonal´  sH  € Ü˜$Ÿ)™)¤]×3Ò3ØˆKØŸ9™9×7Ñ7¸¿	¹	×8RÑ8RÐTX×TlÑTlÓmÐØ"$ÐØŸ9™9×5Ñ5°aÕ8ÐÛ!ˆAÜ $ Q£ÐÛ�Ù,<Ó GÑ,< qÀQÁ§ Ñ,<�Ð GØ!×(Ñ(±]Ô)N±]°ÊAÀqª!ÉA©!±]Ò)NÔOÙ/?Ó#ZÑ/?¨!ÈMÑCY§A AÑ/?Ð Ð#ZÑ ñ ð $×*Ñ*¬6´#Ð6GÓ2HÓ+IÖJñ "ô #0×"@Ñ"@ÐAQÓ"kÐÜ!ÜØ—	‘	—‘ðà!óð
ð
 %ó
ð 	
ùò !HùÛ)NùÚ#Zs   ÂEÂ"EÂ:EÃE$Ã%E$c                	óœ   € / pV UUu. uF  q3 F  qDNK  	  K  	  ppp^ pV  F!  pWe9   d   V^,          pK  WbV&   V^,          pK#  	  V# u uppi r\   rD   )Úfree_indicesr  rM  rm   rx   rg  re  Úinds   &&      r=   Ú!_get_free_indices_to_position_mapÚ2ArrayContraction._get_free_indices_to_position_mapË  sf   € à#%Ð Ù4GÔ(SÑ4G¨qÒQRÈAªÑQR©Ñ4GÐ%Ñ(SØˆÛˆCØÔ:Ø˜1•’Ø,3 SÑ)Ø�q�LŠGñ	  ð
 (Ð'ùó )Ts   ˆAc                ó¬  € V P                   pV UUu. uF  q" F  q3NK  	  K  	  pppVP                  4        \        V 4      p\        V4      pWV,
          p\	        V4       Uu. uF  p^ NK  	  pp^ p	^ p
\	        V4       FG  pW¦8  d"   W”V
,          8¼  d   V	^,          p	V
^,          p
K'  W‚;;,          V
,          uu&   V	^,          p	KI  	  V# u uppi u upi )a  
Get the mapping of indices at the positions before the contraction
occurs.

Examples
========

>>> from sympy.tensor.array import tensorproduct, tensorcontraction
>>> from sympy import MatrixSymbol
>>> M = MatrixSymbol("M", 3, 3)
>>> N = MatrixSymbol("N", 3, 3)
>>> cg = tensorcontraction(tensorproduct(M, N), [1, 2])
>>> cg._get_index_shifts(cg)
[0, 2]

Indeed, ``cg`` after the contraction has two dimensions, 0 and 1. They
need to be shifted by 0 and 2 to get the corresponding positions before
the contraction (that is, 0 and 3).
)r  rO  r   rŒ   rv   )rû   Úinner_contraction_indicesrm   rx   ræ  rç  rè  ré  rß  re  rê  s   &          r=   Ú_get_index_shiftsÚ"ArrayContraction._get_index_shifts×  sÐ   € ð* %)×$<Ñ$<Ð!Ù 9ÔEÑ 9˜1Â1¸a’QÁ1‘QÑ 9ˆ	ÑEØ�‰Ôä! $Ó'ˆ
Ü˜“^ˆ
ØÕ,ˆ
Ü" :Ô.Ó/Ñ.˜“!Ñ.ˆÐ/ØˆØˆÜ�zÖ"ˆAØÔ&¨7ÀÕ6HÔ+HØ˜1•�Ø˜1•’Ø�I˜Õ ‹IØ�q�LŠGñ #ð ˆùó Fùò 0s   ’CÁ"Cc                	óš   a€ \         P                  V 4      o\        ;QJ d    . V3R  lV 4       F  NK  	  5pV# ! V3R  lV 4       4      pV# )c              3  óˆ   <"  € T F7  p\         ;QJ d    . V3R  lV 4       F  NK  	  5M! V3R  lV 4       4      x € K9  	  R# 5i)c              3  óD   <"  € T F  pSV,          V,           x € K  	  R # 5ir2   rD   rÞ  s   & €r=   rn   ÚUArrayContraction._convert_outer_indices_to_inner_indices.<locals>.<genexpr>.<genexpr>  s   øé € Ð/IÁqÀ!°°qµ	¸A·²Ãqùrñ   NrÑ  rá  s   & €r=   rn   ÚKArrayContraction._convert_outer_indices_to_inner_indices.<locals>.<genexpr>  s/   øé € Ð)mÑSlÈa¯%¬%Ô/IÁqÓ/I¯%©%Ô/IÁqÓ/I×*IÐ*IÓSlùrã  )rÿ   r§  r�   )rû   Úouter_contraction_indicesrß  s   &*@r=   rž  Ú8ArrayContraction._convert_outer_indices_to_inner_indicesþ  sF   ø€ ä!×3Ñ3°DÓ9ˆß$)¤EÔ)mÑSlÓ)m§EÐ!Ø(Ð(ð %*Ô)mÑSlÓ)mÓ$mÐ!Ø(Ð(r@   c                	óˆ   € V P                   p\        P                  ! V .VO5!  pW!,           p\        V P                  .VO5!  # r2   )r  rÿ   rž  r  rû   )rû   r®  r¦  r  s   &*  r=   rõ   ÚArrayContraction._flatten  sD   € à$(×$<Ñ$<Ð!Ü$4×$\Ò$\Ð]aÐ$~Ðd}Ó$~Ð!Ø7ÕSÐÜ! $§)¡)ÐBÐ.AÓBÐBr@   c                	ó*   € V P                   ! V.VO5!  # r2   rð  )rW   rû   r  s   &&*r=   rP  Ú:ArrayContraction._ArrayContraction_denest_ArrayContraction  s   € à�|Š|˜DÐ7Ð#6Ó7Ð7r@   c                	óÀ   € V UUu. uF  q3 F  qDNK  	  K  	  ppp\        VP                  4       UUu. uF  w  r6W59  g   K  VNK  	  ppp\        V!  # u uppi u uppi r2   )rö   r0   r£   )rW   rû   r  rm   rx   rb  rg  r0   s   &&*     r=   rQ  Ú3ArrayContraction._ArrayContraction_denest_ZeroArray  s]   € á/BÔ#NÑ/B¨!ÊAÀq¢AÉA¡AÑ/BÐ Ñ#NÜ(¨¯©Ô4ÔZÑ4‘t�q¸Ñ8Y—�Ñ4ˆÑZÜ˜%Ñ Ð ùó $OùÛZs   †A³
AÁAc           	     	óh   € \        VP                   Uu. uF  p\        V.VO5!  NK  	  up!  # u upi r2   )rŸ  rÕ   r  )rW   rû   r  rm   s   &&* r=   rV  Ú2ArrayContraction._ArrayContraction_denest_ArrayAdd  s4   € äÐQU×QZÒQZÓ[ÑQZÈAÔ.¨qÐGÐ3FÖGÑQZÑ[Ñ\Ð\ùÒ[rî  c                	óê  aa€ VP                   oSP                  pV Uu. uF5  p\        ;QJ d    . V3R  lV 4       F  NK  	  5M! V3R  lV 4       4      NK7  	  ppV Uau. uFG  o\        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   KE  SNKI  	  ppV P	                  WV4      p\        \        VP                  .VO5!  \        V4      4      # u upi u upi )c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir2   rD   )rl   rx   rù   s   & €r=   rn   ÚHArrayContraction._ArrayContraction_denest_PermuteDims.<locals>.<genexpr>  s   øé € Ð(CÁ¸A©°Q¯¨Ãùr�  c              3  ó.   <"  € T F
  pSV9   x € K  	  R # 5ir2   rD   rö  s   & €r=   rn   rº    s   øé € Ð0YÑAX¸A°°a¶ÓAXùrø  TF)	rù   r;  r�   r�   ra  rü   r  rû   r+   )rW   rû   r  r?  rm   rn  Ú	new_plistrù   s   &&* `  @r=   rR  Ú5ArrayContraction._ArrayContraction_denest_PermuteDims  s¿   ù€ à×&Ñ&ˆØ×&Ñ&ˆÙM`Ó"aÑM`È§5¤5Ô(CÁÓ(C§5¡5Ô(CÁÓ(CÖ#CÑM`ÐÐ"aÙ %ÔZ¡˜1¯S«SÔ0YÑAXÓ0Y¯S¯SªSÔ0YÑAXÓ0Y×-Y—Q�Q¡ˆ	ÐZØ×(Ñ(Ð)@ÓLˆ	ÜÜ˜tŸy™yÐCÐ+BÓCÜ˜	Ó"ó
ð 	
ùò #bùÚZs"   ŸC+¯+C+Á!C0Á1C0ÂC0Â(C0c               ó   € V ^8„  d   QhRR/# )rN   rû   z'ArrayDiagonal'rD   )rP   s   "r=   rQ   ÚArrayContraction.__annotate__&  s   € ÷ 
ñ 
¸/ñ 
r@   c                	ó8  a€ \        VP                  4      pVP                  VP                  V\        VP                  4      4      pV UUUu. uF=  qU UUu. uF,  p\        V\        \        34      '       d   TMV. F  qwNK  	  K.  	  uppNK?  	  pppp. pV F¡  p	V	R ,          p
\        V4       Fc  w  poSf   K  \        ;QJ d    V3R lV	 4       F  '       g   K   RM	  RM! V3R lV	 4       4      '       g   KN  V
P                  S4       RW6&   Ke  	  VP                  \        \        V
4      4      4       K£  	  V Uu. uF
  qUf   K  VNK  	  pp\        P                  W‹4      p\!        \#        VP                  .VO5!  .VO5!  # u uppi u upppi u upi )rÄ   Nc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir2   rD   )rl   rm   Údiag_indgrps   & €r=   rn   ÚJArrayContraction._ArrayContraction_denest_ArrayDiagonal.<locals>.<genexpr>1  s   øé € Ð>±¨A˜KÖ'³ùó   ƒTF)r  r  r¸  rå   rû   r3   r�   r   rö   r�   rø   r&  r<  r  rÿ   ra  r  r  )rW   rû   r  r  Údown_contraction_indicesrm   rx   rï   rn  Úcontr_indgrpr¢  Únew_diagonal_indices_downÚnew_diagonal_indicesrÂ  s   &&*          @r=   rU  Ú7ArrayContraction._ArrayContraction_denest_ArrayDiagonal%  s†  ø€ ä × 5Ñ 5Ó6ÐØ#'×#:Ñ#:¸4×;PÑ;PÐReÔgoÐpt×pyÑpyÓgzÓ#{Ð ñ tLõ  $Mñ  tLÐno°Ô$i±¨1ÄÈAÔPUÔW\È~×A^ÒA^¹AÐefÐdgÒ<g°a¢QÑ<g¡Q±Õ$iñ  tLÐ ò  $MØ"$ÐÛ4ˆLØ˜q•/ˆCÜ"+Ð,<Ö"=‘��;ØÒ&Ùß“3Ô>±Ó>—3—3’3Ô>±Ó>×>Ô>Ø—J‘J˜{Ô+Ø*.Ð$Ó'ñ #>ð $×*Ñ*¬6´#°c³(Ó+;Ö<ñ 5ñ 1AÓ$RÑ0@¨1§Q QÑ0@Ð!Ð$RÜ/×@Ñ@ÐAXÓtÐÜÜ˜tŸy™yÐCÐ+BÓCð
à!ó
ð 	
ùó %jùô  $Mùò %Ss$   Á	FÁ2F
ÂFÅFÅFÆ
Fc                	ót  aaaa€ SP                   f   SV3# \        \        ^ .SP                  ,           4      4      p\	        \        SP                  4      4       Uu. uF+  p\        \	        W4,          W4^,           ,          4      4      NK-  	  ppV UUu0 uF  qD F  qfkK  	  K  	  uppo\        SP                  4       UUu. uFy  w  rG\        ;QJ d<    V3R l\	        W4,          W4^,           ,          4       4       F  '       d   K   RM1	  RM-! V3R l\	        W4,          W4^,           ,          4       4       4      NK{  	  uppo\        \	        \        SP                  4      4      VV3R lR7      pV Uu. uF  pSP                  V,          NK  	  p	pV UUu. uF  qEV,           F  qfNK  	  K  	  p
pp\        V
4      oV Uu. uF5  p\        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      NK7  	  pp\        V4      p\        V	!  V3# u upi u uppi u uppi u upi u uppi u upi )Nc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir2   rD   )rl   rx   rb  s   & €r=   rn   Ú?ArrayContraction._sort_fully_contracted_args.<locals>.<genexpr>D  s   øé € ÐcÑGbÀ!Ð%=Ö =ÓGbùrÄ  FTc                ób   <€ SV ,          '       d   ^ \        SP                  V ,          4      3# R# )r   rd   )r   rÕ   )rJ  rû   Úfully_contracteds   &€€r=   rK  Ú>ArrayContraction._sort_fully_contracted_args.<locals>.<lambda>E  s<   ø€ ÐeuÐvw×exÔex¸qÔBRÐSW×S\ÑS\Ð]^ÕS_ÓB`Ð>að  ?Cð  Cð  ?Cr@   rM  c              3  ó6   <"  € T F  pSV,          x € K  	  R # 5ir2   rD   )rl   rx   Úindex_permutation_array_forms   & €r=   rn   rÌ  I  s   øé € Ð(TÑRSÈQÐ)EÀa×)HÒ)HÓRSùr`  )r0   r  r   rÆ   rv   rŒ   rÕ   rö   rr   r<  r,   r�   r%   rý   )rW   rû   r  rQ  rm   rh  rx   rÙ   Únew_posr'  Únew_index_blocks_flatrn  rb  rÎ  rÑ  s   &f&         @@@r=   rS  Ú,ArrayContraction._sort_fully_contracted_args=  sâ  û€ à�:‰:ÒØÐ,Ð,Ð,Ü”Z   d§m¡mÕ 3Ó4Ó5ˆÜCHÌÈTÏYÉYËÔCXÓYÑCX¸aœœU 5¥8¨U°Qµ3­ZÓ8Ö9ÑCXˆÐYÙ/BÔ#NÑ/B¨!ÊAÀq¢AÉA¡AÑ/BÒ#NÐ Ür{ð  }A÷  }Fñ  }Fô  sGô  Hñ  sGÑhnÐhiŸC›CÔcÄuÈUÍXÐW\Ð_`Õ]`ÕWaÔGbÓcŸCŸCšCÔcÄuÈUÍXÐW\Ð_`Õ]`ÕWaÔGbÓcÖcñ  sGò  HÐÜœœs 4§9¡9›~Ó.õ  5Cô  DˆÙ*1Ó2©' Q�D—I‘I˜a—L�L©'ˆÐ2Ù,3Ô M©G qÈ!¿_¸_¸¢¹_¡©GÐÑ MÜ'1Ð2GÓ'HÐ$Ù^qÓ"rÑ^qÐYZ§5¤5Ô(TÑRSÓ(T§5¡5Ô(TÑRSÓ(TÖ#TÑ^qÐÐ"rÜ";Ð<SÓ"TÐÜ$ hÑ/Ð1HÐHÐHùò ZùÛ#Nùó Hùâ2ùÛ Mùâ"rs1   Á1HÂHÃAH$Ä	9H$Å8H*ÆH/ÇH5Ç+H5c           	     ó–   € V P                   pV P                   UUu. uF  q" Uu. uF  q1V,          NK  	  upNK  	  upp# u upi u uppi )a6  
Return tuples containing the argument index and position within the
argument of the index position.

Examples
========

>>> from sympy import MatrixSymbol
>>> from sympy.abc import N
>>> from sympy.tensor.array import tensorproduct, tensorcontraction
>>> A = MatrixSymbol("A", N, N)
>>> B = MatrixSymbol("B", N, N)

>>> cg = tensorcontraction(tensorproduct(A, B), (1, 2))
>>> cg._get_contraction_tuples()
[[(0, 1), (1, 0)]]

Notes
=====

Here the contraction pair `(1, 2)` meaning that the 2nd and 3rd indices
of the tensor product `A\otimes B` are contracted, has been transformed
into `(0, 1)` and `(1, 0)`, identifying the same indices in a different
notation. `(0, 1)` is the second index (1) of the first argument (i.e.
        0 or `A`). `(1, 0)` is the first index (i.e. 0) of the second
argument (i.e. 1 or `B`).
)rK  r  )r;   Úmappingrm   rx   s   &   r=   Ú_get_contraction_tuplesÚ(ArrayContraction._get_contraction_tuplesM  sC   € ð8 —-‘-ˆØ15×1IÒ1IÔJÑ1I¨A QÓ'¡Q ˜—�¡QÔ'Ñ1IÒJÐJùÒ'ùÓJs   œA¤A µAÁ Ac                	óâ   a€ V P                   p^ .\        \        V4      4      ,           oV Uu. uF5  p\        ;QJ d    . V3R lV 4       F  NK  	  5M! V3R lV 4       4      NK7  	  up# u upi )r   c              3  óH   <"  € T F  w  rSV,          V,           x € K  	  R # 5ir2   rD   )rl   rx   rï   rð   s   &  €r=   rn   ÚNArrayContraction._contraction_tuples_to_contraction_indices.<locals>.<genexpr>q  s!   øé € Ð:¹±°Ð& qÕ)¨!×+Ò+»ùs   ƒ")rÆ   r  r   r�   )rû   Úcontraction_tuplesrè   rm   rð   s   &&  @r=   Ú*_contraction_tuples_to_contraction_indicesÚ;ArrayContraction._contraction_tuples_to_contraction_indicesl  sX   ø€ ð —‘ˆØ˜3¤¤j°Ó&7Ó!8Õ8ÐÙDVÓWÑDV¸q—”Ô:¹Ó:—‘Ô:¹Ó:Ö:ÑDVÑWÐWùÒWs
   ®A,¾+A,c                	ó(   € V P                   R ,          # r›  )Ú_free_indicesr_   s   &r=   r¡  ÚArrayContraction.free_indicess  s   € à×!Ñ! !Õ$Ð$r@   c                	ó,   € \        V P                  4      # r2   )ÚdictrL  r_   s   &r=   rM  Ú)ArrayContraction.free_indices_to_positionw  s   € ä�D×2Ñ2Ó3Ð3r@   c                	ó(   € V P                   ^ ,          # r\   rB  r_   s   &r=   rû   ÚArrayContraction.expr{  rD  r@   c                	ó(   € V P                   R ,          # r×  rB  r_   s   &r=   r  Ú$ArrayContraction.contraction_indices  rÚ  r@   c                	óè   € V P                   p\        V\        4      '       g   \        R 4      hVP                  p/ p^ p\        V4       F%  w  rV\        V4       F  pWW3W4&   V^,          pK  	  K'  	  V# )z(only for contractions of tensor products)rû   r3   rÜ   r#  rÆ   rö   rv   )r;   rû   rè   rÖ  re  rm   r  rx   s   &       r=   Ú"_contraction_indices_to_componentsÚ3ArrayContraction._contraction_indices_to_componentsƒ  sq   € Ø�y‰yˆÜ˜$Ô 2×3Ò3Ü%Ð&PÓQÐQØ—‘ˆØˆØˆÜ  Ö'‰GˆAÜ˜4–[�Ø$% 6�Ñ Ø˜1•’ó !ñ (ð ˆr@   c                óö  € V P                   p\        V\        4      '       g   V # VP                  p\	        \        V4      R R7      p\        V!  w  rE\        V4       UUu/ uF  w  rgWdP                  V4      bK  	  pppV P                  4       p	V	 UU
Uu. uF   qf U
Uu. uF  w  r«WŠ,          V3NK  	  upp
NK"  	  p	p
pp\        V!  pV P                  VV	4      p\        V.VO5!  # u uppi u upp
i u upp
pi )a\  
Sort arguments in the tensor product so that their order is lexicographical.

Examples
========

>>> from sympy.tensor.array.expressions.from_matrix_to_array import convert_matrix_to_array
>>> from sympy import MatrixSymbol
>>> from sympy.abc import N
>>> A = MatrixSymbol("A", N, N)
>>> B = MatrixSymbol("B", N, N)
>>> C = MatrixSymbol("C", N, N)
>>> D = MatrixSymbol("D", N, N)

>>> cg = convert_matrix_to_array(C*D*A*B)
>>> cg
ArrayContraction(ArrayTensorProduct(A, D, C, B), (0, 3), (1, 6), (2, 5))
>>> cg.sort_args_by_name()
ArrayContraction(ArrayTensorProduct(A, D, B, C), (0, 3), (1, 4), (2, 7))
c                ó&   € \        V ^,          4      # rd   r   rI  s   &r=   rK  Ú4ArrayContraction.sort_args_by_name.<locals>.<lambda>©  s   € Ô<LÈQÈqÍTÔ<Rr@   rM  )rû   r3   rÜ   rÕ   r<  rö   rŽ   r­  r×  rý   rÝ  r  )r;   rû   rÕ   Úsorted_dataÚ
pos_sortedrV  rm   rÙ   Úreordering_maprÜ  rx   rï   Úc_tpr¢  s   &             r=   Úsort_args_by_nameÚ"ArrayContraction.sort_args_by_name�  sî   € ð* �y‰yˆÜ˜$Ô 2×3Ò3ØˆKØ�y‰yˆÜœY t›_Ñ2RÔSˆÜ"% {Ñ"3Ñˆ
Ü?HÈ¼ÔO¹±V°Q˜!×-Ñ-¨aÓ0Ò0¹ˆÑOØ!×9Ñ9Ó;ÐÙN`ÕaÑN`ÈÀ!ÔDÁ!¹$¸! Õ 1°1Ó5Á!ÕDÑN`ÐÒaÜ$ kÑ2ˆØ ×KÑKØØ"ó
Ðô " $Ð;Ð):Ó;Ð;ùó PùãDùÔas   Á!C(Â	C4ÂC.Â4C4Ã.C4c                óP   € \        V .V P                  .V P                  O5!  w  rV# )a  
Returns a dictionary of links between arguments in the tensor product
being contracted.

See the example for an explanation of the values.

Examples
========

>>> from sympy import MatrixSymbol
>>> from sympy.abc import N
>>> from sympy.tensor.array.expressions.from_matrix_to_array import convert_matrix_to_array
>>> A = MatrixSymbol("A", N, N)
>>> B = MatrixSymbol("B", N, N)
>>> C = MatrixSymbol("C", N, N)
>>> D = MatrixSymbol("D", N, N)

Matrix multiplications are pairwise contractions between neighboring
matrices:

`A_{ij} B_{jk} C_{kl} D_{lm}`

>>> cg = convert_matrix_to_array(A*B*C*D)
>>> cg
ArrayContraction(ArrayTensorProduct(B, C, A, D), (0, 5), (1, 2), (3, 6))

>>> cg._get_contraction_links()
{0: {0: (2, 1), 1: (1, 0)}, 1: {0: (0, 1), 1: (3, 0)}, 2: {1: (0, 0)}, 3: {0: (1, 1)}}

This dictionary is interpreted as follows: argument in position 0 (i.e.
matrix `A`) has its second index (i.e. 1) contracted to `(1, 0)`, that
is argument in position 1 (matrix `B`) on the first index slot of `B`,
this is the contraction provided by the index `j` from `A`.

The argument in position 1 (that is, matrix `B`) has two contractions,
the ones provided by the indices `j` and `k`, respectively the first
and second indices (0 and 1 in the sub-dict).  The link `(0, 1)` and
`(2, 0)` respectively. `(0, 1)` is the index slot 1 (the 2nd) of
argument in position 0 (that is, `A_{\ldot j}`), and so on.
)r(   rÆ   r  )r;   rÕ   Údlinkss   &  r=   r(   Ú'ArrayContraction._get_contraction_linksµ  s)   € ôR .¨t¨f°d·m±mÐ_Àd×F^ÑF^Ó_‰ˆØˆr@   c                	óŒ   € V P                   p\        VR 4      '       d   VP                  4       p\        V.V P                  O5!  # r  )rû   rŠ   rz   r   r  r¥  s   & r=   rz   ÚArrayContraction.as_explicitá  s<   € Ø�y‰yˆÜ�4˜×'Ò'Ø×#Ñ#Ó%ˆDÜ  ÐA¨×(@Ñ(@ÓAÐAr@   rD   N)'rE   rF   rG   rH   r|   rV   r×   r]  ra  r*  r±  r¡   r¸  ra  rT  r˜  rž  r£  r§  rž  rõ   rP  rQ  rV  rR  rU  rS  r×  rÝ  r~   r¡  rM  rû   r  rê  ró  r(   rz   rJ   rD   r@   r=   rÿ   rÿ   Í  sÓ  † ñò
ò,!IòFnònð ñPó ðPð ñHó ðHð ñHó ðHð ñ2ó ð2ò<b-òH
ð. ñ	(ó ð	(ð ñ$ó ð$ðL ñ)ó ð)ð
 ñCó ðCð ñ8ó ð8ð ñ!ó ð!ð
 ñ]ó ð]ð ñ	
ó ð	
ð ô
ó ð
ð. ñIó ðIòKð> ñXó ðXð ñ%ó ð%ð ñ4ó ð4ð ñó ðð ñó ðòò#<òJ*öXBr@   rÿ   c                  óL   € ] tR tRtRtR t]R 4       t]R 4       tR t	R t
RtR	# )
ÚReshapeiè  aŒ  
Reshape the dimensions of an array expression.

Examples
========

>>> from sympy.tensor.array.expressions import ArraySymbol, Reshape
>>> A = ArraySymbol("A", (6,))
>>> A.shape
(6,)
>>> Reshape(A, (3, 2)).shape
(3, 2)

Check the component-explicit forms:

>>> A.as_explicit()
[A[0], A[1], A[2], A[3], A[4], A[5]]
>>> Reshape(A, (3, 2)).as_explicit()
[[A[0], A[1]], [A[2], A[3]], [A[4], A[5]]]

c                	óP  € \        V4      p\        V\        4      '       g
   \        V!  p\        \        P
                  ! VP                  4      \        P
                  ! V4      4      R 8X  d   \        R4      h\        P                  ! WV4      p\        V4      Vn        Wn        V# )Fzshape mismatch)r-   r3   r   r	   r   r›   r0   rs   r   rV   r�   rÎ   Ú_expr)rW   rû   r0   rY   s   &&& r=   rV   ÚReshape.__new__ÿ  sw   € Ü˜‹~ˆÜ˜%¤×'Ò'Ü˜5‘MˆEÜ”C—L’L §¡Ó,¬c¯lªl¸5Ó.AÓBÀeÔKÜÐ-Ó.Ð.Ü�lŠl˜3 eÓ,ˆÜ˜5“\ˆŒ
ØŒ	Øˆ
r@   c                	ó   € V P                   # r2   rÍ   r_   s   &r=   r0   ÚReshape.shape
  rÐ   r@   c                	ó   € V P                   # r2   )rý  r_   s   &r=   rû   ÚReshape.expr  r©   r@   c                	ó  € VP                  R R4      '       d   V P                  P                  ! V/ VB pMV P                  p\        V\        \
        34      '       d   VP                  ! V P                  !  # \        W0P                  4      # )rÒ   T)	rÓ   rû   rÖ   r3   r   r    rw   r0   rû  )r;   rÕ   rç   rû   s   &*, r=   rÖ   ÚReshape.doit  sg   € Ø�:‰:�f˜d×#Ò#Ø—9‘9—>’> 4Ð2¨6Ñ2‰Dà—9‘9ˆDÜ�dœZ¬Ð3×4Ò4Ø—<’< §¡Ñ,Ð,Ü�tŸZ™ZÓ(Ð(r@   c                	ó  € V P                   p\        VR 4      '       d   VP                  4       p\        V\        4      '       d   ^ RIHp V! V4      pM\        V\        4      '       d   V # VP                  ! V P                  !  # )rz   )ÚArray)
rû   rŠ   rz   r3   r   Úsympyr  r   rw   r0   )r;   Úeer  s   &  r=   rz   ÚReshape.as_explicit  sb   € Ø�Y‰YˆÜ�2�}×%Ò%Ø—‘Ó!ˆBÜ�bœ*×%Ò%Ý#Ù�r“‰BÜ˜œJ×'Ò'ØˆKØ�zŠz˜4Ÿ:™:Ñ&Ð&r@   rD   N)rE   rF   rG   rH   r|   rV   r~   r0   rû   rÖ   rz   rJ   rD   r@   r=   rû  rû  è  s>   † ñò,	ð ñó ðð ñó ðò)ö	'r@   rû  c                  ó@   € ] tR tRt$ RtR]R&   R
R R lltR t]tR	t	R# )r†  i'  a<  
The ``_ArgE`` object contains references to the array expression
(``.element``) and a list containing the information about index
contractions (``.indices``).

Index contractions are numbered and contracted indices show the number of
the contraction. Uncontracted indices have ``None`` value.

For example:
``_ArgE(M, [None, 3])``
This object means that expression ``M`` is part of an array contraction
and has two indices, the first is not contracted (value ``None``),
the second index is contracted to the 4th (i.e. number ``3``) group of the
array contraction object.
zlist[int | None]r‚   Nc               ó   € V ^8„  d   QhRR/# )rN   r‚   zlist[int | None] | NonerD   )rP   s   "r=   rQ   Ú_ArgE.__annotate__9  s   € ÷ #ñ #Ð)@ñ #r@   c                	ó†   € Wn         Vf,   \        \        V4      4       Uu. uF  pR NK  	  upV n        R # W n        R # u upi r2   )r1  rv   rå   r‚   )r;   r1  r‚   rm   s   &&& r=   Ú__init__Ú_ArgE.__init__9  s9   € ØŒØŠ?Ü*/´¸Ó0AÔ*BÓCÑ*B Q›DÑ*BÑCˆDŽLà"ŽLùò Ds   ¡>c                	ó@   € R V P                   : RV P                  : R2# )z_ArgE(z, Ú)©r1  r‚   r_   s   &r=   Ú__str__Ú_ArgE.__str__@  s   � Ø"&§,¤,°·´Ð=Ð=r@   r  r2   )
rE   rF   rG   rH   r|   rI   r  r  Ú__repr__rJ   rD   r@   r=   r†  r†  '  s    ‡ ñð Ó÷#ò>ð „Hr@   r†  c                  ó6   € ] tR tRtRtR R ltR t]tR tRt	R# )	Ú_IndPosiF  z·
Index position, requiring two integers in the constructor:

- arg: the position of the argument in the tensor product,
- rel: the relative position of the index inside the argument.
c               ó    € V ^8„  d   QhRRRR/# )rN   rÙ   r¹  ÚrelrD   )rP   s   "r=   rQ   Ú_IndPos.__annotate__M  s   € ÷ ñ ˜Cð  cñ r@   c                	ó   € Wn         W n        R # r2   ©rÙ   r  )r;   rÙ   r  s   &&&r=   r  Ú_IndPos.__init__M  s   € ØŒØŽr@   c                	ó@   € R V P                   V P                  3,          # )z_IndPos(%i, %i)r  r_   s   &r=   r  Ú_IndPos.__str__Q  s   € Ø  D§H¡H¨d¯h©hÐ#7Õ7Ð7r@   c              #  	óR   "  € V P                   V P                  . R j  x€L
  R #  L5ir2   r  r_   s   &r=   Ú__iter__Ú_IndPos.__iter__V  s   é € Ø—H‘H˜dŸh™hÐ'×'Ô'ùs   ‚'ž%Ÿ'r  N)
rE   rF   rG   rH   r|   r  r  r  r!  rJ   rD   r@   r=   r  r  F  s   † ñõò8ð €Hö(r@   r  c                  óÀ   € ] tR tRtRtR R ltR R ltR tR tR	 t	R
 t
R R ltR R ltR R ltR R ltR R lt]R 4       tR tR R ltR R ltR R ltRtR# )r€  iZ  a´  
Utility class to help manipulate array contraction objects.

This class takes as input an ``ArrayContraction`` object and turns it into
an editable object.

The field ``args_with_ind`` of this class is a list of ``_ArgE`` objects
which can be used to easily edit the contraction structure of the
expression.

Once editing is finished, the ``ArrayContraction`` object may be recreated
by calling the ``.to_array_contraction()`` method.
c               ó   € V ^8„  d   QhRR/# )rN   Ú
base_arrayzAtyping.Union[ArrayContraction, ArrayDiagonal, ArrayTensorProduct]rD   )rP   s   "r=   rQ   Ú"_EditArrayContraction.__annotate__i  s   € ÷ 7Fñ 7FÐ#dñ 7Fr@   c                	ó  € \        V\        4      '       d2   \        VP                  4      pVP                  pVP
                  pRpEM7\        V\        4      '       dû   \        VP                  \        4      '       d�   \        VP                  P                  4      pVP                  P                  p\        P                  VP                  P
                  VP                  4      pVP                  P
                  pM�\        VP                  \        4      '       d   / pVP                  pVP                  p. pMD/ pVP                  pVP                  p. pM'\        V\        4      '       d   Tp. pRpM
\        4       h\        V\        4      '       d   \        VP                  4      pMV.pV Uu. uF  p\        V4      NK  	  pp\        V4       F.  w  ršV
 F#  pXV,          w  rÍW˜V,          P                  V&   K%  	  K0  	  W€n        \#        V4      V n        R V n        \        VP                  4      p\        V4       F?  w  ržV F4  pW+,          w  rÍRV	,
          V P                   V,          P                  V&   K6  	  KA  	  R # u upi )NrD   rô   )r3   rÿ   r&   rÆ   rû   r  r  r¸  r  rÜ   r#  r  rÕ   r†  rö   r‚   r‚  rŒ   Únumber_of_contraction_indicesÚ_track_permutation)r;   r%  rÖ  rû   r  ÚdiagonalizedrÕ   rÙ   r‚  rm   Úcontraction_tuplerx   Úarg_posÚrel_posrg  s   &&             r=   r  Ú_EditArrayContraction.__init__i  s$  € ô
 �jÔ"2×3Ò3Ü0°×1DÑ1DÓEˆGØ—?‘?ˆDØ",×"@Ñ"@ÐØŠLÜ˜
¤M×2Ò2ä˜*Ÿ/™/Ô+;×<Ò<Ü4°Z·_±_×5MÑ5MÓN�Ø!—‘×+Ñ+�Ü/×BÑBÀ:Ç?Á?×CfÑCfÐhr÷  iDñ  iDó   E�Ø&0§o¡o×&IÑ&IÑ#Ü˜JŸO™OÔ-?×@Ò@Ø�Ø!—‘�Ø)×:Ñ:�Ø&(Ñ#à�Ø!—‘�Ø)×:Ñ:�Ø&(Ñ#ä˜
Ô$6×7Ò7ØˆDØ"$ÐØ‰Lä%Ó'Ð'ä�dÔ.×/Ò/Ü˜Ÿ	™	“?‰Dà�6ˆDá<@Ó%A¹D°S¤e¨C¦j¹DˆÐ%AÜ$-Ð.AÖ$BÑ ˆAÛ&�Ø#*¨1¥:Ñ �Ø:;˜gÕ&×.Ñ.¨wÓ7ó 'ñ %Cð +8ÔÜ25Ð6IÓ2JˆÔ*Ø:>ˆÔä,¨Z×-@Ñ-@ÓAˆô ˜lÖ+‰DˆAÛ�Ø#*¥:Ñ �Ø?AÀA½v�×"Ñ" 7Õ+×3Ñ3°GÓ<ó ó ,ùò &Bs   Æ2Jc               ó    € V ^8„  d   QhRRRR/# )rN   rÙ   r†  Únew_argrD   )rP   s   "r=   rQ   r&  ¢  s   € ÷ 4ñ 4 ð 4°ñ 4r@   c                	ó‚   € V P                   P                  V4      pV P                   P                  V^,           V4       R# rn  )r‚  r­  Úinsert)r;   rÙ   r0  Úposs   &&& r=   r…  Ú"_EditArrayContraction.insert_after¢  s2   € Ø× Ñ ×&Ñ& sÓ+ˆØ×Ñ×!Ñ! #¨¥'¨7Ö3r@   c                	óZ   € V ;P                   ^,          un         V P                   ^,
          # rd   )r(  r_   s   &r=   r„  Ú/_EditArrayContraction.get_new_contraction_index¦  s$   € Ø×*Ò*¨aÕ/Õ*Ø×1Ñ1°AÕ5Ð5r@   c                	óŽ  € / pV P                    F4  pTP                  VP                   Uu/ uF  q3f   K  VRbK  	  up4       K6  	  \        \	        V4      4       F	  w  r4W1V&   K  	  \        V4      V n        V P                    F3  pVP                   Uu. uF  q1P                  VR 4      NK  	  upVn        K5  	  R # u upi u upi )Nrô   )r‚  rr  r‚   rö   r<  rŒ   r(  rÓ   )r;   ÚupdatesÚarg_with_indrm   rg  s   &    r=   Úrefresh_indicesÚ%_EditArrayContraction.refresh_indicesª  s¬   € ØˆØ ×.Ô.ˆLØ�N‰N¨<×+?Ò+?ÓQÑ+? aœE˜A˜ršEÑ+?ÑQÖRñ /äœf W›oÖ.‰DˆAØ�A‹Jñ /ä-0°«\ˆÔ*Ø ×.Ô.ˆLØBN×BVÒBVÓ#WÑBV¸Q§K¡K°°4Ö$8ÑBVÑ#WˆLÖ ó /ùò	 Rùò
 $Xs   «B=
µB=
ÂCc                	ó8  € . pV P                    F0  p\        VP                  4      ^ 8X  g   K  VP                  V4       K2  	  V F  pV P                   P	                  V4       K   	  \
        P                  ! V Uu. uF  q3P                  NK  	  up4      p\        V P                   4      ^ 8X  d'   V P                   P                  \        V4      4       R# ^ RI	H
p V! W@P                   ^ ,          P                  4      V P                   ^ ,          n        R# u upi )r   )Ú_a2m_tensor_productN)r‚  rŒ   r‚   r&  Úremover   r›   r1  r†  Ú3sympy.tensor.array.expressions.from_array_to_matrixr=  )r;   Úscalarsr9  rm   Úscalarr=  s   &     r=   Úmerge_scalarsÚ#_EditArrayContraction.merge_scalars´  sÒ   € ØˆØ ×.Ô.ˆLÜ�<×'Ñ'Ó(¨AÖ-Ø—‘˜|Ö,ñ /ó ˆAØ×Ñ×%Ñ% aÖ(ñ ä—’±'Ó:±'¨QŸyœy±'Ñ:Ó;ˆÜˆt×!Ñ!Ó" aÔ'Ø×Ñ×%Ñ%¤e¨F£mÖ4å_Ù,?À×HZÑHZÐ[\ÕH]×HeÑHeÓ,fˆD×Ñ˜qÕ!Ö)ùò ;s   Á;Dc           	     	ó  € ^ p\        \        4      p\        4       pV P                   F'  pVP	                  \        VP
                  4      4       K)  	  VR,          p. p. p\        4       p^ p	V P                   EFX  p^ p
VP
                   FÝ  pVf&   VP                  V	4       V
^,          p
V	^,          p	K,  V^ 8¼  d   K5  VRV,
          ,          P                  W,           4       W;,          ^8X  d8   W¸9  d2   VP                  V^,
          V,
          4       VP                  V4       M6W¸9  d1   VP                  V^,
          V,
          4       VP                  V4       V
^,          p
Kß  	  VP
                   Uu. uF  q»e
   V^ 8¼  d   TMRNK  	  upVn        T\        VP
                   Uu. uF  q»e
   V^ 8  g   K  VNK  	  up4      ,          pEK[  	  Wg,           p\        V4      pVP                  4        Uu. uF   p\        V4      ^8”  g   K  \        V4      NK"  	  ppV P                  4        V P                  4        V P                   Uu. uF  pVP                  NK  	  ppV P!                  4       p\#        \%        V!  .VO5!  p\'        V.VO5!  pV P(                  e<   \        V P(                   UUu. uF  q» F  pVNK  	  K  	  upp4      p\+        VV4      p\+        VV4      pV# u upi u upi u upi u upi u uppi )r   Nrô   )r   r  r   r‚  rr  r‚   r  r&  rþ   rŒ   r,   Úvaluesr�   rB  r:  r1  Úget_contraction_indicesr  rý   r  r)  rü   )r;   re  Údiag_indicesÚcount_index_freqr9  Úfree_index_countÚ	inv_perm1Ú	inv_perm2ÚdoneÚcounter4Úcounter2rm   r  rù   r„  Údiag_indices_filteredrÙ   rÕ   r  rû   Úexpr2rx   Úpermutation2Úexpr3s   &                       r=   r‡  Ú*_EditArrayContraction.to_array_contractionÂ  sË  € ð ˆä"¤4Ó(ˆä"›9ÐØ ×.Ô.ˆLØ×#Ñ#¤G¨L×,@Ñ,@Ó$AÖBñ /ð ,¨DÕ1Ðð ˆ	Øˆ	ä‹uˆð ˆà ×.Õ.ˆLð ˆHØ!×)Ô)�Ø’9Ø×$Ñ$ XÔ.Ø •M�HØ •M�HÙØ˜”6Ùà˜R !�VÕ$×+Ñ+¨GÕ,>Ô?Ø#Õ&¨!Ô+°´Ø×$Ñ$Ð%5¸Õ%9¸AÕ%=Ô>Ø—H‘H˜Q•KØ”]Ø×$Ñ$Ð%5¸Õ%9¸AÕ%=Ô>Ø—H‘H˜Q”KØ˜A•’ñ! *ð$ Vb×UiÒUiÓ#jÑUiÐPQª¸1À¼6¡AÀtÒ$KÑUiÑ#jˆLÔ Ø”s |×';Ò';ÓRÑ'; !ºyÈAÐPQÉEŸA˜AÑ';ÑRÓSÕS‹Gñ1 /ð4 (Õ3ÐÜ Ð!4Ó5ˆð 4@×3FÑ3FÔ3HÓ WÑ3H¨aÌCÐPQËFÐUVÉJ¤¤ q¦Ñ3HÐÐ Wà×ÑÔØ×ÑÔØ'+×'9Ò'9Ó:Ñ'9 �—”Ñ'9ˆÐ:Ø"×:Ñ:Ó<ÐÜ!Ô"7¸Ñ">ÐUÐATÓUˆÜ Ð=Ð'<Ó=ˆØ×"Ñ"Ò.Ü%°$×2IÒ2IÔ&UÑ2I¨QÒSTÈa£qÑST¡qÑ2IÒ&UÓVˆLÜ! %¨Ó6ˆEä˜e [Ó1ˆØˆùò) $kùÚRùò !Xùò ;ùó
 'Vs*   Å9K/Æ,K4Æ=K4Ç:K9ÈK9ÉK>Ê:L
c               ó   € V ^8„  d   QhRR/# )rN   rO   zlist[list[int]]rD   )rP   s   "r=   rQ   r&    s   € ÷ #ñ #¨ñ #r@   c                	óð   € \        V P                  4       Uu. uF  p. NK  	  pp^ pV P                   F:  pVP                   F'  pVe   W%,          P	                  V4       V^,          pK)  	  K<  	  V# u upi r\   )rv   r(  r‚  r‚   r&  )r;   rm   r  Úcurrent_positionr9  rx   s   &     r=   rF  Ú-_EditArrayContraction.get_contraction_indices  sz   € Ü<AÀ$×BdÑBdÔ<eÓ/fÑ<e°q³Ñ<eÐÐ/fØ !ÐØ ×.Ô.ˆLØ!×)Ô)�Ø’=Ø'Õ*×1Ñ1Ð2BÔCØ  AÕ%Ò ó *ñ /ð
 #Ð"ùò 0gs   ˜A3c               ó   € V ^8„  d   QhRR/# )rN   rO   zlist[_IndPos]rD   )rP   s   "r=   rQ   r&    s   € ÷ ñ ¨Mñ r@   c                	óü   € WP                   8¼  d   \        R 4      h. p\        V P                  4       FE  w  r4\        VP                  4       F'  w  rVW8X  g   K  VP                  \        W54      4       K)  	  KG  	  V# )z%index value exceeding the index range)r(  rs   rö   r‚  r‚   r&  r  )r;   r¢  rµ  rm   r9  rx   rŽ  s   &&     r=   r�  Ú+_EditArrayContraction.get_mapping_for_index  sl   € Ø×4Ñ4Ô4ÜÐDÓEÐEØ#%ˆ	Ü(¨×);Ñ);Ö<‰OˆAÜ'¨×(<Ñ(<Ö=‘
�Ø–>Ø×$Ñ$¤W¨Q£]Ö3ó >ñ  =ð Ðr@   c               ó   € V ^8„  d   QhRR/# )rN   rO   zlist[list[_IndPos]]rD   )rP   s   "r=   rQ   r&    s   € ÷ #ñ #Ð8Kñ #r@   c                	ó  € \        V P                  4       Uu. uF  p. NK  	  pp\        V P                  4       FI  w  r\        VP                  4       F+  w  rEVf   K  W%,          P                  \        W4      4       K-  	  KK  	  V# u upi r2   )rv   r(  rö   r‚  r‚   r&  r  )r;   rm   r  r9  rx   r¢  s   &     r=   Ú&get_contraction_indices_to_ind_rel_posÚ<_EditArrayContraction.get_contraction_indices_to_ind_rel_pos  sz   € Ü@EÀd×FhÑFhÔ@iÓ3jÑ@i¸1³BÑ@iÐÐ3jÜ(¨×);Ñ);Ö<‰OˆAÜ# L×$8Ñ$8Ö9‘�Ø”?Ø'Õ,×3Ñ3´G¸A³MÖBó :ñ  =ð #Ð"ùò 4ks   ˜B	c               ó    € V ^8„  d   QhRRRR/# )rN   r­  r¹  rO   rD   )rP   s   "r=   rQ   r&  !  s   € ÷ ñ ¨3ð °3ñ r@   c                óf   € ^ pV P                    F  pWP                  9   g   K  V^,          pK   	  V# )z:
Count the number of arguments that have the given index.
©r‚  r‚   )r;   r­  re  r9  s   &&  r=   Úcount_args_with_indexÚ+_EditArrayContraction.count_args_with_index!  s5   € ð ˆØ ×.Ô.ˆLØ×,Ñ,Ö,Ø˜1•’ñ /ð ˆr@   c               ó    € V ^8„  d   QhRRRR/# )rN   r­  r¹  rO   zlist[_ArgE]rD   )rP   s   "r=   rQ   r&  +  s   € ÷ ñ ¨ð °ñ r@   c                ój   € V P                    Uu. uF  q!VP                  9   g   K  VNK  	  ppV# u upi )z1
Get a list of arguments having the given index.
ra  )r;   r­  rm   r–  s   &&  r=   Úget_args_with_indexÚ)_EditArrayContraction.get_args_with_index+  s6   € ð (,×'9Ò'9ÓPÑ'9 !ÀaÇiÁiÑ=OŸA˜AÑ'9ˆÐPØˆ
ùò Qs   �0¦0c                	óÎ   € \        4       pV P                   F<  pTP                  VP                   Uu0 uF  q3f   K  V^ 8  g   K  VkK  	  up4       K>  	  \	        V4      # u upi r2   )r  r‚  rr  r‚   rŒ   )r;   ry   rÙ   rm   s   &   r=   Únumber_of_diagonal_indicesÚ0_EditArrayContraction.number_of_diagonal_indices2  sR   € ä‹uˆØ×%Ô%ˆCØ�K‰K C§K¢KÓK¡K˜qœÀQÈÁUŸ˜¡KÑKÖLñ &ä�4‹yÐùò Ls   ³A"
½A"
ÁA"
c                	ó–  € . p. p^ pRpV P                    Fj  p. pVP                   FD  pVe$   V^ 8  d   VP                  V4       V^,          pK*  VP                  V4       V^,          pKF  	  VP                  V4       Kl  	  V'       d   \        R V 4       4      MRpV Uu. uF  qxV,
          NK  	  ppW.,           V n        R# u upi )r   Nc              3  óJ   "  € T F  q'       d   \        V4      MRx € K  	  R# 5i)re   Nrô   )rŒ  rk   s   & r=   rn   Ú@_EditArrayContraction.track_permutation_start.<locals>.<genexpr>I  s   é € Ð?±;¨a¦”c˜!”f rÔ)³;ùs   ‚!#rô   )r‚  r‚   r&  rŒ  r)  )	r;   rù   Ú	perm_diagre  rN  r9  Úpermrm   Úmax_inds	   &        r=   Útrack_permutation_startÚ-_EditArrayContraction.track_permutation_start9  sÉ   € ØˆØˆ	ØˆØˆØ ×.Ô.ˆLØˆDØ!×)Ô)�Ø’=Ø˜1”uØ!×(Ñ(¨Ô2Ø  A�˜ÙØ—‘˜GÔ$Ø˜1•’ñ *ð ×Ñ˜tÖ$ñ /÷ DO”#Ñ?±;Ó?Ô?ÐTVˆÙ*3Ó4©) Q˜q—[�[©)ˆ	Ð4Ø"-°Õ";ˆÖùò 5s   Â#Cc               ó    € V ^8„  d   QhRRRR/# )rN   Údestinationr†  Úfrom_elementrD   )rP   s   "r=   rQ   r&  M  s   € ÷ 3ñ 3°5ð 3Èñ 3r@   c                	ó  € V P                   P                  V4      pV P                   P                  V4      pV P                  V,          P                  V P                  V,          4       V P                  P	                  V4       R # r2   )r‚  r­  r)  rø   rä   )r;   rt  ru  Úindex_destinationÚindex_elements   &&&  r=   Útrack_permutation_mergeÚ-_EditArrayContraction.track_permutation_mergeM  si   € Ø ×.Ñ.×4Ñ4°[ÓAÐØ×*Ñ*×0Ñ0°Ó>ˆØ×ÑÐ 1Õ2×9Ñ9¸$×:QÑ:QÐR_Õ:`ÔaØ×Ñ×#Ñ# MÖ2r@   c               ó    € V ^8„  d   QhRRRR/# ©rN   rÙ   r†  rO   ztyping.Tuple[int, int]rD   )rP   s   "r=   rQ   r&  S  s   € ÷ /ñ /¨5ð /Ð5Kñ /r@   c                óÔ   € ^ pV P                    FG  p\        VP                   Uu. uF
  qDe   K  VNK  	  up4      pW18X  d   W"V,           3u # W%,          pKI  	  \        R4      hu upi )z_
Return the range of the free indices of the arg as absolute positions
among all free indices.
úargument not found©r‚  rŒ   r‚   r‹   )r;   rÙ   re  r9  rm   Únumber_free_indicess   &&    r=   Úget_absolute_free_rangeÚ-_EditArrayContraction.get_absolute_free_rangeS  sn   € ð
 ˆØ ×.Ô.ˆLÜ"%°,×2FÒ2FÓ&TÑ2F¨Q§q qÑ2FÑ&TÓ"UÐØÔ"ØÐ*=Õ =Ð=Ò=ØÕ*ŠGñ	 /ô
 Ð-Ó.Ð.ùò	 'Us
   ¥A%
¯A%
c               ó    € V ^8„  d   QhRRRR/# r|  rD   )rP   s   "r=   rQ   r&  `  s   € ÷ /ñ / eð /Ð0Fñ /r@   c                ó    € ^ pV P                    F2  p\        VP                  4      pW18X  d   W"V,           3u # W$,          pK4  	  \        R4      h)zK
Return the absolute range of indices for arg, disregarding dummy
indices.
r~  r  )r;   rÙ   re  r9  Únumber_indicess   &&   r=   rƒ  Ú(_EditArrayContraction.get_absolute_range`  sS   € ð
 ˆØ ×.Ô.ˆLÜ  ×!5Ñ!5Ó6ˆNØÔ"Ø¨.Õ 8Ð8Ò8ØÕ%ŠGñ	 /ô
 Ð-Ó.Ð.r@   )r)  r‚  r(  N)rE   rF   rG   rH   r|   r  r…  r„  r:  rB  r‡  rF  r�  r]  rb  rf  r~   ri  rq  ry  r�  rƒ  rJ   rD   r@   r=   r€  r€  Z  sq   † ñõ7Fõr4ò6òXògòAõF#õõ#õõð ñó ðò<õ(3õ/÷/ñ /r@   r€  c                óÜ  € \        V \        \        34      '       d   ^# \        V \        4      '       d   \	        V P
                  4      # \        V \        4      '       d   V P                  4       # \        V \        4      '       d   V P                  # \        V \        4      '       d   V P
                  pVf   R# \	        V4      # \        V R4      '       d   \	        V P
                  4      # ^ # )rN   r0   rô   )r3   r   r#   rÂ   rŒ   r0   r    r  r!   r"   rŠ   r8  s   & r=   rå   rå   n  s«   € Ü�$œ¤]Ð3×4Ò4ÙÜ�$Ô-×.Ò.Ü�4—:‘:‹ÐÜ�$œ	×"Ò"Ø�y‰y‹{ÐÜ�$œ× Ò Ø�y‰yÐÜ�$œ×$Ò$Ø—
‘
ˆØŠ=ØˆIä�u“:ÐÜˆt�W×ÒÜ�4—:‘:‹ÐÙr@   c                ód   € \        V \        4      '       d   V P                  4       # \        V 4      # r2   )r3   rÂ   rÊ   rå   ©rû   s   &r=   r   r   ‚  s&   € Ü�$Ô-×.Ò.Ø�|‰|‹~ÐÜ�D‹>Ðr@   c                ó^   € \        V \        4      '       d   V P                  # \        V 4      .# r2   )r3   rÂ   rÆ   rå   r‰  s   &r=   r´  r´  ˆ  s'   € Ü�$Ô-×.Ò.Ø�}‰}Ðä˜“ÐÐr@   c                óB   € \        V R 4      '       d   V P                  # R# )r0   rD   )rŠ   r0   r‰  s   &r=   ræ   ræ   �  s   € Üˆt�W×ÒØ�z‰zÐØ€Ir@   c                óR   € \        V \        4      '       d   V P                  4       # V # r2   )r3   r÷   r—  r‰  s   &r=   r—  r—  •  s#   € Ü�$œ×$Ò$Ø×$Ñ$Ó&Ð&àˆr@   c                 ó   € \        V R R/VB # ©rÞ   T)rÜ   ©rÕ   rç   s   *,r=   rý   rý   œ  s   € Ü˜tÐA°$ÐA¸&ÑAÐAr@   c                ó$   € \        V .VO5R R/VB # rŽ  )rÿ   )rû   r  rç   s   &*,r=   r  r     s   € Ü˜DÐTÐ#6ÒTÀTÐTÈVÑTÐTr@   c                ó$   € \        V .VO5R R/VB # rŽ  )r  )rû   r  rç   s   &*,r=   r  r  ¤  s   € Ü˜ÐNÐ 0ÒN¸tÐNÀvÑNÐNr@   c                ó   € \        W3R R/VB # rŽ  )r÷   )rû   rù   rç   s   &&,r=   rü   rü   ¨  s   € Ü�tÑF°tÐF¸vÑFÐFr@   c                 ó   € \        V R R/VB # rŽ  )r  r�  s   *,r=   rŸ  rŸ  ¬  s   € Ü�TÐ7¨Ð7°Ñ7Ð7r@   c                ó   € \        W4      # r2   )r7   )rû   r‚   s   &&r=   rB   rB   °  s   € Ü˜Ó&Ð&r@   )aÚ
__future__r   Úcollections.abcr4   r¼   r   r   Ú	functoolsr   rt   r   ÚtypingÚsympy.core.numbersr   Úsympy.core.relationalr	   Ú(sympy.functions.special.tensor_functionsr   Úsympy.core.basicr   Úsympy.core.containersr   Úsympy.core.exprr   Úsympy.core.functionr   r   Úsympy.core.mulr   Úsympy.core.singletonr   Úsympy.core.sortingr   Úsympy.core.symbolr   r   Úsympy.matrices.matrixbaser   Ú#sympy.matrices.expressions.diagonalr   Ú"sympy.matrices.expressions.matexprr   Ú"sympy.matrices.expressions.specialr   Úsympy.tensor.array.arrayopr   r   r   r   Ú#sympy.tensor.array.dense_ndim_arrayr   Úsympy.tensor.array.ndim_arrayr    Úsympy.tensor.indexedr!   r"   r#   Ú$sympy.tensor.array.expressions.utilsr$   r%   r&   r'   r(   r)   r0  r+   Ú sympy.combinatorics.permutationsr,   Úsympy.core.sympifyr-   r/   rL   r7   r£   r´   rÂ   rÜ   r  r÷   r  r,  rÿ   rû  r†  r  r€  rå   r   r´  ræ   r—  rý   r  r  rü   rŸ  rB   rD   r@   r=   Ú<module>r¯     s‹  ðÝ "Û Û ß ,Ý Û Ý  ã å &Ý *Ý CÝ "Ý 'Ý  ß 2Ý Ý "Ý /ß -Ý 0Ý BÝ 9Ý 9ß fÓ fÝ GÝ 3ß 7Ý <÷1÷ 1õ ,Ý 7Ý 'ô
7�ô 
7ôB�*ô Bô<2[�4ô 2[ôj�
ô ô2ˆzô ô2-(˜Eô -(ô^WpÐ.ô Wpôt8^Ð$ô 8^ôvTÐ'ô Tôn
M<Ð)ô M<ô`&-Ð 5ô &-ôRXBÐ,ô XBôv<'Ð#ô <'÷~ñ ÷>(ñ (÷(Q/ñ Q/òhò(ò òòòBòUòOòGò8ô'r@   