Ë
    7^(h¡, ã                  ó@  — d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	Z	d dl	m
Z
 d dlZd dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 d dl(m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE  G d„ de«      ZF G d „ d!eF«      ZG G d"„ d#e«      ZH G d$„ d%eF«      ZI G d&„ d'eF«      ZJ G d(„ d)e«      ZK G d*„ d+eK«      ZL G d,„ d-eK«      ZM G d.„ d/eK«      ZN G d0„ d1eK«      ZO G d2„ d3eK«      ZP G d4„ d5eK«      ZQ G d6„ d7eK«      ZR G d8„ d9«      ZS G d:„ d;«      ZT G d<„ d=«      ZUd>„ ZVd?„ ZWd@„ ZXdA„ ZYdB„ ZZdC„ Z[dD„ Z\dE„ Z]dF„ Z^dG„ Z_dH„ Z`y)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                  ó$   — e Zd ZU ded<   d„ Zd„ Zy)Ú
_ArrayExprztuple[Expr, ...]Úshapec                óž   — t        |t        j                  j                  «      s|f}t        j                  | |«       | j                  |«      S ©N)Ú
isinstanceÚcollectionsÚabcÚIterableÚArrayElementÚ_check_shapeÚ_get©ÚselfÚitems     ún/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/tensor/array/expressions/array_expressions.pyÚ__getitem__z_ArrayExpr.__getitem__*   s;   € Ü˜$¤§¡× 8Ñ 8Ô9Ø�7ˆDÜ×!Ñ! $¨Ô-Ø�y‰y˜‹Ðó    c                ó   — t        | |«      S r2   )Ú_get_array_element_or_slicer:   s     r=   r9   z_ArrayExpr._get0   s   € Ü*¨4°Ó6Ð6r?   N)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r>   r9   © r?   r=   r/   r/   '   s   … ØÓòó7r?   r/   c                  óB   — e Zd ZdZdZdd„Zed„ «       Zed„ «       Zd„ Z	y)	ÚArraySymbolz1
    Symbol representing an array expression
    Fc                ó–   — t        |t        «      rt        |«      }t        t	        t
        |«      Ž }t        j                  | ||«      }|S r2   )r3   Ústrr   r   Úmapr-   r   Ú__new__)ÚclsÚsymbolr0   Úobjs       r=   rL   zArraySymbol.__new__;   s=   € Ü�fœcÔ"Ü˜F“^ˆFä”sœ8 UÓ+Ð,ˆÜ�l‰l˜3 ¨Ó.ˆØˆ
r?   c                ó    — | j                   d   S ©Nr   ©Ú_args©r;   s    r=   ÚnamezArraySymbol.nameC   ó   € à�z‰z˜!‰}Ðr?   c                ó    — | j                   d   S ©Né   rR   rT   s    r=   r0   zArraySymbol.shapeG   rV   r?   c                ó.  — t        d„ | j                  D «       «      st        d«      ‚t        j                  | j                  D �cg c]  }t        |«      ‘Œ c}Ž D �cg c]  }| |   ‘Œ	 }} t        |«      j                  | j                  Ž S c c}w c c}w )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr2   ©Ú
is_Integer©Ú.0Úis     r=   ú	<genexpr>z*ArraySymbol.as_explicit.<locals>.<genexpr>L   ó   è ø€ Ò4 A�1—<•<Ñ4ùó   ‚z1cannot express explicit array with symbolic shape)Úallr0   Ú
ValueErrorÚ	itertoolsÚproductÚranger   Úreshape)r;   Újr`   Údatas       r=   Úas_explicitzArraySymbol.as_explicitK   s{   € ÜÑ4¨¯©Ô4Ô4ÜÐPÓQÐQÜ!*×!2Ñ!2ÀtÇzÁzÖ4RÀ!´U¸1µXÒ4RÐ!SÖT˜A��Q“ÐTˆÐTØ4Ô& tÓ,×4Ñ4°d·j±jÐAÐAùò 5SùÒTs   ÁBÁBN)r0   ztyping.IterableÚreturnz'ArraySymbol')
rB   rC   rD   Ú__doc__Ú	_iterablerL   ÚpropertyrU   r0   rl   rF   r?   r=   rH   rH   4   sA   „ ñð €Ióð ñó ðð ñó ðóBr?   rH   c                  óX   — e Zd ZdZdZdZdZd„ Zed„ «       Z	e
d„ «       Ze
d„ «       Zd„ Zy)	r7   z!
    An element of an array.
    Tc                ó  — t        |t        «      rt        |«      }t        |«      }t        |t        j
                  j                  «      s|f}t        t        |«      «      }| j                  ||«       t        j                  | ||«      }|S r2   )r3   rJ   r   r-   r4   r5   r6   Útupler8   r   rL   )rM   rU   ÚindicesrO   s       r=   rL   zArrayElement.__new__[   sn   € Ü�dœCÔ Ü˜$“<ˆDÜ˜‹~ˆÜ˜'¤;§?¡?×#;Ñ#;Ô<Ø�jˆGÜœ5 ›>Ó*ˆØ×Ñ˜˜wÔ'Ü�l‰l˜3  gÓ.ˆØˆ
r?   c                ó*  — t        |«      }t        |d«      r_t        d«      }t        |«      t        |j                  «      k7  r|‚t        d„ t        ||j                  «      D «       «      rt        d«      ‚t        d„ |D «       «      rt        d«      ‚y )Nr0   z3number of indices does not match shape of the arrayc              3  ó2   K  — | ]  \  }}||k\  d k(  –— Œ y­w)TNrF   )r_   r`   Úss      r=   ra   z,ArrayElement._check_shape.<locals>.<genexpr>m   s   è ø€ ÒI©¨¨1�A˜‘F˜tÕ#ÑIùs   ‚zshape is out of boundsc              3  ó,   K  — | ]  }|d k  dk(  –— Œ y­w)r   TNrF   r^   s     r=   ra   z,ArrayElement._check_shape.<locals>.<genexpr>o   s   è ø€ Ò0 1��A‘˜$�Ñ0ùs   ‚zshape contains negative values)rs   ÚhasattrÚ
IndexErrorÚlenr0   ÚanyÚzipre   )rM   rU   rt   Úindex_errors       r=   r8   zArrayElement._check_shapef   s~   € ä˜“.ˆÜ�4˜Ô!Ü$Ð%ZÓ[ˆKÜ�7‹|œs 4§:¡:›Ò.Ø!Ð!ÜÑI´°G¸T¿Z¹ZÓ0HÔIÔIÜ Ð!9Ó:Ð:ÜÑ0¨Ô0Ô0ÜÐ=Ó>Ð>ð 1r?   c                ó    — | j                   d   S rQ   rR   rT   s    r=   rU   zArrayElement.namer   rV   r?   c                ó    — | j                   d   S rX   rR   rT   s    r=   rt   zArrayElement.indicesv   rV   r?   c                ó2  — t        |t        «      st        j                  S || k(  rt        j                  S |j
                  | j
                  k7  rt        j                  S t        j                  d„ t        | j                  |j                  «      D «       «      S )Nc              3  ó:   K  — | ]  \  }}t        ||«      –— Œ y ­wr2   r
   ©r_   r`   rj   s      r=   ra   z0ArrayElement._eval_derivative.<locals>.<genexpr>„   s   è ø€ ÒZ±T°Q¸œN¨1¨a×0ÑZùó   ‚)
r3   r7   r   ÚZeroÚOnerU   r   Úfromiterr}   rt   )r;   rw   s     r=   Ú_eval_derivativezArrayElement._eval_derivativez   sb   € Ü˜!œ\Ô*Ü—6‘6ˆMà�Š9Ü—5‘5ˆLà�6‰6�T—Y‘YÒÜ—6‘6ˆMä�|‰|ÑZ¼SÀÇÁÈqÏyÉyÓ=YÔZÓZÐZr?   N)rB   rC   rD   rn   Ú	_diff_wrtÚ	is_symbolÚis_commutativerL   Úclassmethodr8   rp   rU   rt   rˆ   rF   r?   r=   r7   r7   R   s_   „ ñð €IØ€IØ€Nò	ð ñ	?ó ð	?ð ñó ðð ñó ðó
[r?   r7   c                  ó2   — e Zd ZdZd„ Zed„ «       Zd„ Zd„ Zy)Ú	ZeroArrayzM
    Symbolic array of zeros. Equivalent to ``ZeroMatrix`` for matrices.
    c                óŽ   — t        |«      dk(  rt        j                  S t        t        |«      }t        j                  | g|¢­Ž }|S rQ   )r{   r   r…   rK   r-   r   rL   ©rM   r0   rO   s      r=   rL   zZeroArray.__new__Œ   s:   € Üˆu‹:˜Š?Ü—6‘6ˆMÜ”H˜eÓ$ˆÜ�l‰l˜3Ð' Ò'ˆØˆ
r?   c                ó   — | j                   S r2   rR   rT   s    r=   r0   zZeroArray.shape“   ó   € à�z‰zÐr?   c                óˆ   — t        d„ | j                  D «       «      st        d«      ‚t        j                  | j                  Ž S )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr2   r\   r^   s     r=   ra   z(ZeroArray.as_explicit.<locals>.<genexpr>˜   rb   rc   ú/Cannot return explicit form for symbolic shape.)rd   r0   re   r   ÚzerosrT   s    r=   rl   zZeroArray.as_explicit—   s5   € ÜÑ4¨¯©Ô4Ô4ÜÐNÓOÐOÜ&×,Ñ,¨d¯j©jÐ9Ð9r?   c                ó"   — t         j                  S r2   )r   r…   r:   s     r=   r9   zZeroArray._getœ   s   € Ü�v‰vˆr?   N©	rB   rC   rD   rn   rL   rp   r0   rl   r9   rF   r?   r=   rŽ   rŽ   ‡   s*   „ ñòð ñó ðò:ó
r?   rŽ   c                  ó2   — e Zd ZdZd„ Zed„ «       Zd„ Zd„ Zy)ÚOneArrayz!
    Symbolic array of ones.
    c                óŽ   — t        |«      dk(  rt        j                  S t        t        |«      }t        j                  | g|¢­Ž }|S rQ   )r{   r   r†   rK   r-   r   rL   r�   s      r=   rL   zOneArray.__new__¥   s:   € Üˆu‹:˜Š?Ü—5‘5ˆLÜ”H˜eÓ$ˆÜ�l‰l˜3Ð' Ò'ˆØˆ
r?   c                ó   — | j                   S r2   rR   rT   s    r=   r0   zOneArray.shape¬   r’   r?   c           	     ó,  — t        d„ | j                  D «       «      st        d«      ‚ t        t	        t        t        j                  | j                  «      «      D �cg c]  }t        j                  ‘Œ c}«      j                  | j                  Ž S c c}w )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr2   r\   r^   s     r=   ra   z'OneArray.as_explicit.<locals>.<genexpr>±   rb   rc   r•   )rd   r0   re   r   rh   r   ÚoperatorÚmulr   r†   ri   )r;   r`   s     r=   rl   zOneArray.as_explicit°   si   € ÜÑ4¨¯©Ô4Ô4ÜÐNÓOÐOØhÔ&´u¼VÄHÇLÁLÐRV×R\ÑR\Ó=]Ó7^Ö'_°!¬¯«Ò'_Ó`×hÑhÐjn×jtÑjtÐuÐuùÒ'_s   ÁB
c                ó"   — t         j                  S r2   )r   r†   r:   s     r=   r9   zOneArray._getµ   s   € Ü�u‰uˆr?   Nr˜   rF   r?   r=   rš   rš       s+   „ ñòð ñó ðòvó
r?   rš   c                  ó8   — e Zd Zed„ «       Zd„ Zed„ «       Zd„ Zy)Ú_CodegenArrayAbstractc                ó    — | j                   dd S )aÞ  
        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]
        N)Ú	_subranksrT   s    r=   Úsubranksz_CodegenArrayAbstract.subranks»   s   € ð4 �~‰~™aÐ Ð r?   c                ó,   — t        | j                  «      S )z*
        The sum of ``subranks``.
        )Úsumr¦   rT   s    r=   Úsubrankz_CodegenArrayAbstract.subrank×   s   € ô �4—=‘=Ó!Ð!r?   c                ó   — | j                   S r2   ©Ú_shaperT   s    r=   r0   z_CodegenArrayAbstract.shapeÝ   ó   € à�{‰{Ðr?   c           
     óÞ   — |j                  dd«      }|rE | j                  | j                  D �cg c]  } |j                  di |¤Ž‘Œ c}Ž j	                  «       S | j	                  «       S c c}w )NÚdeepTrF   )ÚgetÚfuncÚargsÚdoitÚ_canonicalize)r;   Úhintsr¯   Úargs       r=   r³   z_CodegenArrayAbstract.doitá   sa   € Ø�y‰y˜ Ó&ˆÙØ�4—9‘9¸D¿I¹IÖF°S˜x˜sŸx™xÑ0¨%Ó0ÒFÐG×UÑUÓWÐWà×%Ñ%Ó'Ð'ùò Gs   ¯A*N)rB   rC   rD   rp   r¦   r©   r0   r³   rF   r?   r=   r£   r£   ¹   s2   „ àñ!ó ð!ò6"ð ñó ðó(r?   r£   c                  ó2   — e Zd ZdZd„ Zd„ Zed„ «       Zd„ Zy)ÚArrayTensorProductzF
    Class to represent the tensor product of array-like objects.
    c                ó˜  — |D �cg c]  }t        |«      ‘Œ }}|j                  dd«      }|D �cg c]  }t        |«      ‘Œ }}t        j                  | g|¢­Ž }||_        |D �cg c]  }t        |«      ‘Œ }}t        d„ |D «       «      rd |_        nt        d„ |D «       «      |_        |r|j                  «       S |S c c}w c c}w c c}w )NÚcanonicalizeFc              3  ó$   K  — | ]  }|d u –— Œ
 y ­wr2   rF   r^   s     r=   ra   z-ArrayTensorProduct.__new__.<locals>.<genexpr>ø   ó   è ø€ Ò)˜Qˆq�DŒyÑ)ùó   ‚c              3  ó.   K  — | ]  }|D ]  }|–— Œ Œ y ­wr2   rF   rƒ   s      r=   ra   z-ArrayTensorProduct.__new__.<locals>.<genexpr>û   s   è ø€ Ò< Q¸!Ò<°QœqÐ<˜qÑ<ùs   ‚)r-   ÚpopÚget_rankr   rL   r¥   Ú	get_shaper|   r¬   rs   r´   )	rM   r²   Úkwargsr¶   rº   ÚranksrO   r`   Úshapess	            r=   rL   zArrayTensorProduct.__new__í   s¾   € Ø)-Ö. #”˜•Ð.ˆÐ.à—z‘z .°%Ó8ˆà*.Ö/ 3”˜#•Ð/ˆÐ/ä�m‰m˜CÐ' $Ò'ˆØˆŒØ(,Ö- 1”)˜A•,Ð-ˆÐ-äÑ) &Ô)Ô)ØˆC�JäÑ<¨&Ô<Ó<ˆCŒJÙØ×$Ñ$Ó&Ð&Øˆ
ùò! /ùò 0ùò .s   …B=¯CÁ$Cc                ó,
  ‡‡‡— | j                   }| j                  |«      }|D �cg c]  }t        |«      ‘Œ }}g }t        |«      D ]w  \  Š}t	        |t
        «      sŒ|j                  |j                  j                  D ��cg c]!  }|D �cg c]  }|t        |d ‰ «      z   ‘Œ c}‘Œ# c}}«       |j                  |‰<   Œy |r3t        t        |Ž t        t        |«      dz
  «      t        |«      z  «      S t        |«      dk(  r|d   S t        d„ |D «       «      r:t!        t"        j$                  |D �cg c]  }t'        |«      ‘Œ c}d«      }t)        |Ž S t        |«      D ��ci c]  \  }}t	        |t*        «      sŒ||“Œ }	}}|	rÕ|D �cg c](  }t	        |t*        «      rt-        |«      n
t        |«      ‘Œ* }}t/        t1        dg|z   «      «      d d Št        |D �cg c]   }t	        |t*        «      r|j                  n|‘Œ" c}Ž }
|	j3                  «       D �‡��cg c]+  \  Š}|j4                  D ]  }t7        ˆˆfd„|D «       «      ‘Œ Œ- }}}}t9        |
g|¢­Ž S t        |«      D ��ci c]  \  }}t	        |t:        «      sŒ||“Œ }}}|�r!g }g }|D �cg c]  }t        |«      ‘Œ }}t/        t1        dg|z   «      «      d d Št        |«      D ]ã  \  Š}t	        |t:        «      r—t        |«      t        |j<                  «      z
  }t        |j<                  «      }|j                  t?        |«      D �cg c]
  }‰‰   |z   ‘Œ c}«       |j                  t?        |||z   «      D �cg c]
  }‰‰   |z   ‘Œ c}«       Œ­|j                  t?        t        |«      «      D �cg c]
  }‰‰   |z   ‘Œ c}«       Œå |j                  |«       t        |D �cg c]   }t	        |t:        «      r|j                  n|‘Œ" c}Ž }
|D �cg c](  }t	        |t:        «      rt-        |«      n
t        |«      ‘Œ* }}t/        t1        dg|z   «      «      d d Š|j3                  «       D �‡��cg c]+  \  Š}|j<                  D ]  }t7        ˆˆfd„|D «       «      ‘Œ Œ- }}}}t        tA        |
g|¢­Ž tC        |«      «      S  | jD                  |dd	iŽS c c}w c c}w c c}}w c c}w c c}}w c c}w c c}w c c}}}w c c}}w c c}w c c}w c c}w c c}w c c}w c c}w c c}}}w )
NrY   r   c              3  óH   K  — | ]  }t        |t        t        f«      –— Œ y ­wr2   )r3   rŽ   r   )r_   r¶   s     r=   ra   z3ArrayTensorProduct._canonicalize.<locals>.<genexpr>  s   è ø€ ÒH¸CŒz˜#¤	¬:Ð6×7ÑHùs   ‚ "rF   éÿÿÿÿc              3  ó.   •K  — | ]  }‰‰   |z   –— Œ y ­wr2   rF   )r_   ÚkÚcumulative_ranksr`   s     €€r=   ra   z3ArrayTensorProduct._canonicalize.<locals>.<genexpr>  s   øè ø€ Ò(LÀQÐ)9¸!Ñ)<¸qÕ)@Ñ(Lùó   ƒc              3  ó.   •K  — | ]  }‰‰   |z   –— Œ y ­wr2   rF   )r_   rÉ   Úcumulative_ranks2r`   s     €€r=   ra   z3ArrayTensorProduct._canonicalize.<locals>.<genexpr>4  s   øè ø€ Ò%JÀ1Ð&7¸Ñ&:¸QÕ&>Ñ%JùrË   rº   F)#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_indicesrs   Ú_array_contractionÚArrayDiagonalÚdiagonal_indicesrh   Ú_array_diagonalr,   r±   )r;   r²   r¶   rÃ   Úpermutation_cyclesrj   rÉ   r`   rÄ   ÚcontractionsÚtprÜ   Ú	diagonalsÚinverse_permutationÚ	last_permÚi1Úi2Úranks2rß   rÊ   rÍ   s          `           @@r=   r´   z ArrayTensorProduct._canonicalize   sç  ú€ Ø�y‰yˆØ�}‰}˜TÓ"ˆà*.Ö/ 3”˜#•Ð/ˆÐ/ð  ÐÜ “oò 	‰FˆAˆsÜ˜c¤;Ô/ØØ×%Ñ%ÐPS×P_ÑP_×PkÑPk×&lÈ1ÀAÖ'F¸q¨¬C°°b°q°	«NÓ(:Ô'FÓ&lÔmØ—h‘hˆD�ŠGð		ñ
 Ü Ô!6¸Ð!=¼{Ì3ÈuË:ÐVWÉ<Ó?XÔYdÐewÓYxÑ?xÓyÐyäˆt‹9˜Š>Ø˜‘7ˆNô ÑHÀ4ÔHÔHÜœHŸL™LÀÖ*F¸A¬9°Q­<Ò*FÈÓKˆFÜ˜fÐ%Ð%ô .7°t«_×b¡6 1 cÄ
È3ÔP`Õ@a˜˜3™ÐbˆÑbÙØjnÖoÐcf¬*°SÔ:JÔ*K”\ #Ô&ÔQYÐZ]ÓQ^Ñ^ÐoˆEÐoÜ#¤J°¨s°U©{Ó$;Ó<¸S¸bÐAÐÜ&ÐkoÖ(pÐdg´ZÀÔEUÔ5V¨¯ªÐ\_Ñ)_Ò(pÐqˆBØ[g×[mÑ[mÓ[o÷  #Rñ  #RÑQWÐQRÐTWÐy|÷  zQñ  zQò  #RÐtu¤5Ô(LÈ!Ô(LÕ#Lð  #RÐ#Lð  #RÐò  #RÜ% bÐ?Ð+>Ò?Ð?ä*3°D«/×\¡  3¼ZÈÌ]Õ=[�Q˜‘VÐ\ˆ	Ñ\ÚØ"$ÐØˆIØ.2Ö3 s”X˜c•]Ð3ˆEÐ3Ü#¤J°¨s°U©{Ó$;Ó<¸S¸bÐAÐÜ# D›/ò h‘��3Ü˜c¤=Ô1Ü! #›¬¨S×-AÑ-AÓ)BÑB�BÜ˜S×1Ñ1Ó2�BØ'×.Ñ.ÔQVÐWYÓQZÖ/[ÈAÐ0@ÀÑ0CÀaÓ0GÒ/[Ô\Ø×$Ñ$ÄuÈRÐQSÐVXÑQXÓGYÖ%ZÀ!Ð&6°qÑ&9¸AÓ&=Ò%ZÕ[à'×.Ñ.ÔQVÔW_Ð`cÓWdÓQeÖ/fÈAÐ0@ÀÑ0CÀaÓ0GÒ/fÕgðhð  ×&Ñ& yÔ1Ü&ÐhlÖ(mÐad´ZÀÄ]Ô5S¨¯ªÐY\Ñ)\Ò(mÐnˆBØhlÖmÐad¬:°c¼=Ô+I”l 3Ô'ÌxÐX[Ë}Ñ\ÐmˆFÐmÜ $¤Z°°°f±Ó%=Ó >¸sÀÐ CÐØYb×YhÑYhÓYj÷   Jñ   JÉvÈqÐRUÐtw÷  uIñ  uIò   JÐop¤Ô%JÈÔ%JÕ Jð   JÐ Jð   JÐò   JÜ ¤°Ð!GÐ6FÒ!GÌÐTgÓIhÓiÐiàˆt�y‰y˜$Ð3¨UÑ3Ð3ùòg 0ùò (GùÓ&lùò +Gùó
 cùâoùâ(pùô #Rùó ]ùò 4ùò 0\ùÚ%Zùâ/fùâ(mùÚmùô  Jsw   ¥R?Â	S	Â
SÂ"S	Ä2S
Å"SÅ;SÆ	-SÇ%SÈ0S$É(S+ÊS+ÊS1Ì2S6
Í$S;
ÎT 
Ï%TÏ;-T
Ñ0TÓS	c                ót   — |D ��cg c]$  }t        || «      r|j                  n|gD ]  }|‘Œ Œ& }}}|S c c}}w r2   )r3   r²   )rM   r²   r¶   r`   s       r=   rÎ   zArrayTensorProduct._flatten9  s?   € à!×Y�c¼
À3ÈÔ8L¨C¯HªHÐSVÐRWÒY a’ÐY�ÐYˆÑYØˆùó Zs   †)4c           	     ó„   — t        | j                  D �cg c]   }t        |d«      r|j                  «       n|‘Œ" c}Ž S c c}w ©Nrl   )r   r²   ry   rl   ©r;   r¶   s     r=   rl   zArrayTensorProduct.as_explicit>  s9   € ÜÐdh×dmÑdmÖnÐ]`´G¸CÀÔ4O˜sŸ™Ô0ÐUXÑXÒnÐoÐoùÒns   ”%=N)	rB   rC   rD   rn   rL   r´   rŒ   rÎ   rl   rF   r?   r=   r¸   r¸   è   s,   „ ñòò&74ðr ñó ðópr?   r¸   c                  ó2   — e Zd ZdZd„ Zd„ Zed„ «       Zd„ Zy)ÚArrayAddz0
    Class for elementwise array additions.
    c                ó8  — |D �cg c]  }t        |«      ‘Œ }}|D �cg c]  }t        |«      ‘Œ }}t        t        |«      «      }t	        |«      dk7  rt        d«      ‚|D �cg c]  }|j                  ‘Œ }}t	        |D �ch c]  }|€Œ|’Œ	 c}«      dkD  rt        d«      ‚|j                  dd«      }t        j                  | g|¢­Ž }||_
        t        d„ |D «       «      rd |_        n
|d   |_        |r|j                  «       S |S c c}w c c}w c c}w c c}w )NrY   z!summing arrays of different rankszmismatching shapes in additionrº   Fc              3  ó$   K  — | ]  }|d u –— Œ
 y ­wr2   rF   r^   s     r=   ra   z#ArrayAdd.__new__.<locals>.<genexpr>U  r¼   r½   r   )r-   rÀ   rÚ   Úsetr{   re   r0   r¿   r   rL   r¥   r|   r¬   r´   )	rM   r²   rÂ   r¶   rÃ   rÄ   r`   rº   rO   s	            r=   rL   zArrayAdd.__new__G  s  € Ø)-Ö. #”˜•Ð.ˆÐ.Ø*.Ö/ 3”˜#•Ð/ˆÐ/Ü”S˜“ZÓ ˆÜˆu‹:˜Š?ÜÐ@ÓAÐAØ'+Ö, �#—)“)Ð,ˆÐ,Ü˜6Ö3�a Q¡]’Ò3Ó4°qÒ8ÜÐ=Ó>Ð>à—z‘z .°%Ó8ˆä�m‰m˜CÐ' $Ò'ˆØˆŒÜÑ) &Ô)Ô)ØˆC�Jà ™ˆCŒJÙØ×$Ñ$Ó&Ð&Øˆ
ùò' /ùÚ/ùò -ùÚ3s   …D�DÁ"DÂ DÂDc                ó‚  — | j                   }| j                  |«      }|D �cg c]  }t        |«      ‘Œ }}|D �cg c]  }t        |t        t
        f«      rŒ|‘Œ }}t        |«      dk(  r(t        d„ |D «       «      rt        d«      ‚t	        |d   Ž S t        |«      dk(  r|d   S  | j                  |ddiŽS c c}w c c}w )Nr   c              3  ó&   K  — | ]	  }|�Œ|–— Œ y ­wr2   rF   r^   s     r=   ra   z)ArrayAdd._canonicalize.<locals>.<genexpr>f  s   è ø€ Ò2˜¨©	”1Ñ2ùs   ‚ŠzIcannot handle addition of ZeroMatrix/ZeroArray and undefined shape objectrY   rº   F)
r²   Ú_flatten_argsrÁ   r3   rŽ   r   r{   r|   ÚNotImplementedErrorr±   )r;   r²   r¶   rÄ   s       r=   r´   zArrayAdd._canonicalize]  s»   € Ø�y‰yˆð ×!Ñ! $Ó'ˆà,0Ö1 S”)˜C•.Ð1ˆÐ1Ø#ÖT˜¬:°c¼IÄzÐ;RÕ+S’ÐTˆÐTÜˆt‹9˜Š>ÜÑ2˜fÔ2Ô2Ü)Ð*uÓvÐvÜ˜f Q™iÐ(Ð(Ü�‹Y˜!Š^Ø˜‘7ˆNØˆt�y‰y˜$Ð3¨UÑ3Ð3ùò 2ùÚTs   ¢B7ºB<ÁB<c                ó’   — g }|D ]?  }t        |t        «      r|j                  |j                  «       Œ/|j	                  |«       ŒA |S r2   )r3   rï   rÑ   r²   Úappend)rM   r²   Únew_argsr¶   s       r=   rõ   zArrayAdd._flatten_argsm  sC   € àˆØò 	%ˆCÜ˜#œxÔ(Ø—‘ §¡Õ)à—‘ Õ$ð		%ð
 ˆr?   c           
     ó¨   — t        t        j                  | j                  D �cg c]   }t	        |d«      r|j                  «       n|‘Œ" c}«      S c c}w rì   )r   rŸ   r×   r²   ry   rl   rí   s     r=   rl   zArrayAdd.as_explicitw  sD   € ÜÜ�L‰LØRV×R[ÑR[Ö\È3¤'¨#¨}Ô"=ˆS�_‰_ÔÀ3ÑFÒ\ó^ð 	^ùâ\s   £%A
N)	rB   rC   rD   rn   rL   r´   rŒ   rõ   rl   rF   r?   r=   rï   rï   B  s+   „ ñòò,4ð  ñó ðó^r?   rï   c                  óº   — e Zd ZdZdd„Zd„ Zed„ «       Zed„ «       Ze	d„ «       Z
e	d„ «       Ze	d	„ «       Ze	d
„ «       Zd„ Ze	d„ «       Zd„ Ze	d„ «       Ze	d„ «       Zy)rÐ   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                óÌ  ‡‡— ddl m} t        |«      }t        |«      }| j	                  ‰|||«      Š |‰«      Š‰j
                  }||k7  rt        d«      ‚|j                  dd«      }	t        j                  | |‰«      }
t        |«      g|
_
        t        |«      Š‰€d |
_        n,t        ˆˆfd„t        t        ‰«      «      D «       «      |
_        |	r|
j!                  «       S |
S )Nr   r*   z8Permutation size must be the length of the shape of exprrº   Fc              3  ó4   •K  — | ]  }‰ ‰|«         –— Œ y ­wr2   rF   )r_   r`   rÒ   r0   s     €€r=   ra   z&PermuteDims.__new__.<locals>.<genexpr>Ù  s   øè ø€ ÒP¸˜u¡[°£^Õ4ÑPùó   ƒ)Úsympy.combinatoricsr+   r-   rÀ   Ú_get_permutation_from_argumentsÚsizere   r¿   r   rL   r¥   rÁ   r¬   rs   rh   r{   r´   )rM   rÔ   rÒ   Úindex_order_oldÚindex_order_newrÂ   r+   Ú	expr_rankÚpermutation_sizerº   rO   r0   s     `        @r=   rL   zPermuteDims.__new__Ç  sÑ   ù€ Ý3Ü˜‹~ˆÜ˜T“Nˆ	Ø×9Ñ9¸+ÀÐXgÐirÓsˆÙ! +Ó.ˆØ&×+Ñ+ÐØ˜yÒ(ÜÐWÓXÐXà—z‘z .°%Ó8ˆä�m‰m˜C  {Ó3ˆÜ! $›Ð(ˆŒÜ˜$“ˆØˆ=ØˆC�JäÔP¼eÄCÈÃJÓ>OÔPÓPˆCŒJÙØ×$Ñ$Ó&Ð&Øˆ
r?   c                ó  — | j                   }| j                  }t        |t        «      r|j                   }|j                  }||z  }|}t        |t        «      r| j                  ||«      \  }}t        |t        «      r| j                  ||«      \  }}t        |t        t        f«      r-t        |j                  D �cg c]  }|j                  |   ‘Œ c}Ž S |j                  }|t        |«      k(  r|S | j                  ||d¬«      S c c}w )NF)rº   )rÔ   rÒ   r3   rÐ   rØ   Ú'_PermuteDims_denestarg_ArrayContractionr¸   Ú)_PermuteDims_denestarg_ArrayTensorProductrŽ   r   Ú
array_formr0   Úsortedr±   )r;   rÔ   rÒ   ÚsubexprÚsubpermr`   Úplists          r=   r´   zPermuteDims._canonicalizeÞ  só   € Ø�y‰yˆØ×&Ñ&ˆÜ�dœKÔ(Ø—i‘iˆGØ×&Ñ&ˆGØ%¨Ñ/ˆKØˆDÜ�dÔ,Ô-Ø $× LÑ LÈTÐS^Ó _ÑˆD�+Ü�dÔ.Ô/Ø $× NÑ NÈtÐU`Ó aÑˆD�+Ü�dœY¬
Ð3Ô4Ü°k×6LÑ6LÖM°˜tŸz™z¨!›}ÒMÐNÐNØ×&Ñ&ˆØ”F˜5“MÒ!ØˆKØ�y‰y˜˜{¸ˆyÓ?Ð?ùò	 Ns   Â;Dc                ó    — | j                   d   S rQ   ©r²   rT   s    r=   rÔ   zPermuteDims.exprñ  ó   € à�y‰y˜‰|Ðr?   c                ó    — | j                   d   S rX   r  rT   s    r=   rÒ   zPermuteDims.permutationõ  r  r?   c           
     ó€  — t        |j                  «      }t        |j                  «      }t        t	        dg|j
                  z   «      «      }t        t        |«      «      D �cg c]  }|||   ||dz       ‘Œ }}t        |«      D ��cg c]  \  }}|t        |«      f‘Œ }	}}|	j                  d„ ¬«       |	D �cg c]  }|d   ‘Œ	 }
}|
D �cg c]  }||   ‘Œ	 }}|
D �cg c]  }||   ‘Œ	 }}t        t        |D ��cg c]  }|D ]  }|‘Œ Œ c}}«      «      }t        |Ž |fS c c}w c c}}w c c}w c c}w c c}w c c}}w )Nr   rY   c                ó   — | d   S rX   rF   ©Úxs    r=   ú<lambda>zGPermuteDims._PermuteDims_denestarg_ArrayTensorProduct.<locals>.<lambda>  s
   € ˜a ™d€ r?   ©Úkey)r,   r	  rÚ   r²   r   r¦   rh   r{   rÏ   r
  Úsortr+   rÖ   )rM   rÔ   rÒ   Úperm_image_formr²   Úcumulr`   Úperm_image_form_in_componentsÚcompÚpsÚperm_args_image_formÚargs_sortedÚperm_image_form_sorted_argsrj   Únew_permutations                  r=   r  z5PermuteDims._PermuteDims_denestarg_ArrayTensorProductù  sB  € ô % [×%;Ñ%;Ó<ˆÜ�D—I‘I‹ˆä”Z   d§m¡mÑ 3Ó4Ó5ˆô X]Ô]`ÐaeÓ]fÓWgÖ(hÐRS¨¸¸q¹À%ÈÈ!ÉÁ*Ò)MÐ(hÐ%Ð(hä/8Ð9VÓ/W×X¡G A tˆq”&˜“,ÒÐXˆÑXð 	�‰‘NˆÔ#à.0Ö1¨  !£Ð1ÐÐ1à(<Ö= 1�t˜A“wÐ=ˆÐ=àQeÖ&fÈAÐ'DÀQÓ'GÐ&fÐ#Ð&fÜ%¤jÐ=X×1d¸ÐbcÒ1dÐ]^²!Ð1d°!Ó1dÓ&eÓfˆÜ$ kÐ2°OÐCÐCùò )iùãXùò  2ùâ=ùâ&fùÛ1ds$   Á#D ÂD%Â9D+ÃD0ÃD5Ã:D:c                óÜ  ‡— t        |t        «      s||fS t        |j                  t        «      s||fS |j                  j                  }|j                  j                  D �cg c]  }t        |«      ‘Œ }}|j                  }|D ��cg c]  }|D ]  }|‘Œ Œ }	}}t        t        dg|z   «      «      }
g }t        |j                  «      }d}t        t        |«      «      D ]M  }g }t        |
|   |
|dz      «      D ]   }||	v rŒ|j                  ||   «       |dz  }Œ" |j                  |«       ŒO t        |j                  «      D ��cg c]#  \  }}t        t        |
|   |
|dz      «      «      ‘Œ% }}}|j!                  |j                  |«      }|dz  }|D ��cg c]  }|D �cg c]  }|€Œ ||«      ‘Œ c}‘Œ }}}t        t        |«      «      }|j#                  d„ ¬«       |D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }||   ‘Œ	 }}t        |D ��cg c]  }|D ]  }|‘Œ Œ c}}«      Š|D �cg c]  }||   ‘Œ	 }}|D �cg c]  }t%        ˆfd„|D «       «      ‘Œ }}t'        t)        |Ž g|¢­Ž }t+        t        |D �cg c]  }||   ‘Œ	 c}D ��cg c]  }|D ]  }|‘Œ Œ c}}«      «      }||fS c c}w c c}}w c c}}w c c}w c c}}w c c}w c c}w c c}}w c c}w c c}w c c}w c c}}w )Nr   rY   rÇ   c                ó   — | d   S rX   rF   r  s    r=   r  zEPermuteDims._PermuteDims_denestarg_ArrayContraction.<locals>.<lambda>6  s
   € ¨¨!©€ r?   r  c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wr2   rF   )r_   rj   Únew_index_perm_array_forms     €r=   ra   zFPermuteDims._PermuteDims_denestarg_ArrayContraction.<locals>.<genexpr>>  s   øè ø€ Ò(QÈ!Ð)BÀ1Õ)EÑ(Qùó   ƒ)r3   rØ   rÔ   r¸   r²   rÀ   rÜ   rÚ   r   r,   r	  rh   r{   rø   rÏ   r¦   Ú_push_indices_upr  rs   rÝ   rÖ   r+   )rM   rÔ   rÒ   r²   r¶   r¦   rÜ   r`   rj   Úcontraction_indices_flatr  Ú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É   r"  r&  s                               @r=   r  z3PermuteDims._PermuteDims_denestarg_ArrayContraction  s  ø€ ä˜$Ô 0Ô1Ø˜Ð$Ð$Ü˜$Ÿ)™)Ô%7Ô8Ø˜Ð$Ð$Ø�y‰y�~‰~ˆØ-1¯Y©Y¯^©^Ö< c”H˜S•MÐ<ˆÐ<à"×6Ñ6ÐØ/B×#N¨!ÈAÒ#NÀq¢AÐ#N AÐ#NÐ Ñ#NÜ”Z   h¡Ó/Ó0ˆð ')Ð#Ü × 6Ñ 6Ó7ˆ
ØˆÜ”s˜8“}Ó%ò 	8ˆAØˆGÜ˜5 ™8 U¨1¨Q©3¡ZÓ0ò �ØÐ0Ñ0ØØ—‘˜z¨'Ñ2Ô3Ø˜1‘‘ð	ð
 (×.Ñ.¨wÕ7ð	8ô GPÐPT×P]ÑP]ÓF^×_¹d¸aÀœœU 5¨¡8¨U°1°Q±3©ZÓ8Õ9Ð_ˆÑ_Ø×/Ñ/°×0HÑ0HÈ,ÓWˆØ)¨BÑ/ÐØbq×#rÐ]^ÀQÖ$XÀÈ!É-Ñ%8¸Õ%;Ô$XÐ#rÐ Ñ#rô œIÐ&>Ó?Ó@ˆØ×Ñ™nÐÔ-ð .:Ö:¨˜q ›tÐ:ÐÐ:à5HÖI°˜L¨›OÐIÐÐIÜ$.Ð;K×/W°aÐUVÒ/WÐPQ²Ð/W°Ó/WÓ$XÐ!Ø%8Ö9 �D˜“GÐ9ˆÐ9Ø[nÖ"oÐVW¤5Ó(QÈqÔ(QÕ#QÐ"oÐÐ"oÜ%Ô&;¸XÐ&FÐaÐI`ÒaˆÜ%¤jÐfyÖ=zÐabÐ>YÐZ[Ó>\Ò=z÷  2G¸ð  EFò  2Gð  @A²!ð  2G°!ó  2Gó  'Hó  IˆØ˜Ð(Ð(ùòQ =ùó $Oùó$ `ùò %YùÓ#rùò ;ùâIùÛ/WùÚ9ùÚ"oùâ=zùó  2GsZ   Á"J-ÂJ2Å(J8Æ	KÆ!J>Æ)
J>Æ3KÇ&K	Ç8KÈK
È,KÈ>KÉ;K#ÊK(Ê>Kc                ó(  — |j                   }t        |j                  «      D ���cg c]$  \  }}t        |j                   |   «      D ]  }|‘Œ Œ& }}}}t        |j	                  «       «      D �cg c]
  } ||«      ‘Œ }}t        |j                  «      }	||d      }
g }g }t        «       }t        |«      D ]²  \  }}||   |
k7  r|j                  |«       g }||   }
|j                  |«       ||
   }t        |«      |k(  sŒK|j                  t        |«      «       |D �cg c]  }|t        |«      z
  ‘Œ }}||   }t        |	|   t        |«      «      |	|<   |j                  |
«       g }Œ´ |j                  |«       t        t        t        |	«      «      «      }i }dgt        t        |«      «      z   }t        t        |«      «      D ]X  }t        ||   ||dz      «      D �ch c]
  }|||      ’Œ }}t        |«      dk7  rŒ:t!        t#        |«      «      }||k7  sŒT|||<   ŒZ g }g }|r|t        |«      dk(  r%|j%                  «       \  }}|j                  |«       n|d   }||vrg }ŒA|j'                  |«      }||v r|j                  |«       g }Œj|j                  |«       |rŒ||D ],  }t        |«      D ]  \  }}||||dz   t        |«      z     <   Œ Œ. t        |«      D ���cg c]'  \  }}t        |«      D �cg c]  }|||   |z      ‘Œ c}‘Œ) }}}}|D �cg c]  }|	|   ‘Œ	 }	}|D �cg c]  }||   ‘Œ	 }}|D ��cg c]  }|D ]  }|‘Œ Œ }}}t)        |	Ž t        |«      fS c c}}}w c c}w c c}w c c}w c c}w c c}}}w c c}w c c}w c c}}w ©Nr   rY   rÇ   )r¦   rÏ   r²   rh   r©   rÚ   rò   rÑ   rø   r{   r
  ÚminrÕ   r+   r×   r   ÚnextÚiterÚpopitemr¿   rÖ   ) rM   rÔ   rÒ   r¦   r`   r¶   rj   Ú	index2argÚpermuted_indicesrù   Úarg_candidate_indexÚcurrent_indicesr"  Úinserted_arg_cand_indicesÚidxÚarg_candidate_rankÚlocal_current_indicesrç   Úargs_positionsÚmapsÚcumulative_subranksrw   ÚelemÚlinesÚcurrent_linerÉ   ÚvÚliner.  Úpermutation_blocksÚnew_permutation_blocksÚnew_permutation2s                                    r=   Ú_check_permutation_mappingz&PermuteDims._check_permutation_mappingC  sÖ  € à—=‘=ˆÜ%.¨t¯y©yÓ%9×[Ð[™6˜1˜cÄ5ÈÏÉÐWXÑIYÓCZÒ[¸a’QÐ[�QÐ[ˆ	Ò[Ü49¸$¿,¹,».Ó4IÖJ¨q™K¨�NÐJÐÐJÜ˜Ÿ	™	“?ˆØ'Ð(8¸Ñ(;Ñ<ÐØˆØˆÜ$'£EÐ!ÜÐ 0Ó1ò 	%‰FˆAˆsØ˜‰~Ð!4Ò4Ø×&Ñ& Ô7Ø"$�Ø&/°¡nÐ#Ø×"Ñ" 3Ô'Ø!)Ð*=Ñ!>ÐÜ�?Ó#Ð'9Ó9Ø×&Ñ&¤v¨oÓ'>Ô?ØKZÖ([Àa¨¬S°Ó-AÓ)AÐ([Ð%Ð([Ø˜q‘\�Ü,¨X°b©\¼;ÐG\Ó;]Ó^�˜‘Ø)×-Ñ-Ð.AÔBØ"$‘ð	%ð 	×Ñ˜Ô/ô œe¤C¨£MÓ2Ó3ˆàˆØ ˜c¤D¬°HÓ)=Ó$>Ñ>ÐÜ”s˜8“}Ó%ò 	ˆAÜ8=Ð>QÐRSÑ>TÐViÐjkÐlmÑjmÑVnÓ8oÖp°1�˜?¨1Ñ-Ó.Ðpˆ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}×~Ð~ÑbfÐbcÐefÔTYÐZ[ÓT\Ö]Èq˜Ð/BÀ1Ñ/EÈÑ/IÓJÔ]Ð~ÐÒ~Ø)7Ö8 A�H˜Q“KÐ8ˆÐ8ØAOÖ!P¸AÐ"4°QÓ"7Ð!PÐÐ!PØ'=×I !ÀqÒIÀ!šAÐI˜AÐIÐÑIÜ$ hÐ/´Ð=MÓ1NÐNÐNùôA \ùÚJùò )\ùò qùò< ^ùÔ~ùÚ8ùÚ!PùÛIsA   ¦)M"Á.M)ÄM.Ç M3Ë#M=Ë8M8Ì
M=ÌNÌ)N	Ì<NÍ8M=c                ór  — t        |j                  «      }|j                  }|j                  }dgt        t	        |«      «      z   }|D �cg c]  }t        |«      ‘Œ }}|D �cg c]  }t        |«      ‘Œ }	}g }
t        |«      D ]…  \  }}d}t        t        |«      dz
  «      D ]P  }||   ||   k\  sŒ|	|   ||dz      k  sŒt        ||   t        |D �cg c]
  }|||   z
  ‘Œ c}g«      «      ||<   d} n |sŒu|
j                  |«       Œ‡ t        |Ž t        |
|j                  ¬«      fS c c}w c c}w c c}w )Nr   TrY   F)r  )rÚ   r²   r¦   rÓ   r   r9  ÚmaxrÏ   rh   r{   rÕ   r+   rø   rÖ   r  )rM   rÔ   rÒ   r²   r¦   rÓ   rG  r`   Ú
cyclic_minÚ
cyclic_maxÚcyclic_keepÚcycleÚflagrj   rÉ   s                  r=   Ú!_check_if_there_are_closed_cyclesz-PermuteDims._check_if_there_are_closed_cyclesˆ  sQ  € ä�D—I‘I‹ˆØ—=‘=ˆØ!×-Ñ-ˆØ ˜c¤D¬°HÓ)=Ó$>Ñ>ÐØ&1Ö2 ”c˜!•fÐ2ˆ
Ð2Ø&1Ö2 ”c˜!•fÐ2ˆ
Ð2ØˆÜ! +Ó.ò 		*‰HˆAˆuØˆDÜœ3Ð2Ó3°aÑ7Ó8ò �Ø˜a‘=Ð$7¸Ñ$:Ó:¸zÈ!¹}ÐObÐcdÐefÑcfÑOgÓ?gä+¨D°©G´[ÐglÖBmÐbcÀ1ÐGZÐ[\ÑG]ÓC]ÒBmÐAnÓ5oÓp�D˜‘GØ �DÙðò Ø×"Ñ" 5Õ)ð		*ô % dÐ+¬[¸È;×K[ÑK[Ô-\Ð\Ð\ùò 3ùÚ2ùò Cns   Á
D*Á"D/ÃD4c                óZ   — | j                  | j                  | j                  «      }|€| S |S )z
        DEPRECATED.
        )Ú_nest_permutationrÔ   rÒ   )r;   Úrets     r=   Únest_permutationzPermuteDims.nest_permutation�  s/   € ð ×$Ñ$ T§Y¡Y°×0@Ñ0@ÓAˆØˆ;ØˆKØˆ
r?   c           	     óî  ‡— t        |t        «      rt        | j                  ||«      Ž S t        |t        «      rx|j
                  }t	        j                  |g|¢­Ž }t        |«      Š|j                  D �cg c]  }t        ˆfd„|D «       «      ‘Œ }}t        t        |j                  ‰«      g|¢­Ž S t        |t        «      r*t        |j                  D �cg c]  }t        ||«      ‘Œ c}Ž S y c c}w c c}w )Nc              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr2   rF   )r_   rj   Únewpermutations     €r=   ra   z0PermuteDims._nest_permutation.<locals>.<genexpr>¯  s   øè ø€ Ò&D¸Q¡~°a×'8Ñ&DùrË   )r3   r¸   rÕ   rX  rØ   rÓ   Ú'_convert_outer_indices_to_inner_indicesr+   rÜ   rs   rÝ   rÐ   rÔ   rï   Ú
_array_addr²   )	rM   rÔ   rÒ   ÚcyclesÚ	newcyclesr`   Únew_contr_indicesr¶   r_  s	           @r=   rZ  zPermuteDims._nest_permutation¦  sØ   ø€ ä�dÔ.Ô/Ü  #×"GÑ"GÈÈkÓ"ZÐ[Ð[Ü˜Ô.Ô/à ×,Ñ,ˆFÜ(×PÑPÐQUÐ_ÐX^Ò_ˆIÜ(¨Ó3ˆNØNR×NfÑNfÖ gÈ¤Ó&DÀ!Ô&DÕ!DÐ gÐÐ gÜ%¤k°$·)±)¸^Ó&LÐaÐO`ÒaÐaÜ˜œhÔ'ÜÈÏÉÖSÀ#¤¨C°Õ =ÒSÐTÐTØùò	 !hùò  Ts   Á5C-ÃC2c                ó~   — | j                   }t        |d«      r|j                  «       }t        || j                  «      S rì   )rÔ   ry   rl   r   rÒ   ©r;   rÔ   s     r=   rl   zPermuteDims.as_explicitµ  s6   € Ø�y‰yˆÜ�4˜Ô'Ø×#Ñ#Ó%ˆDÜ˜4 ×!1Ñ!1Ó2Ð2r?   c                óŠ   — |€&|�|€t        d«      ‚t        j                  |||«      S |�t        d«      ‚|�t        d«      ‚|S )NzPermutation not definedz2index_order_new cannot be defined with permutationz2index_order_old cannot be defined with permutation)re   rÐ   Ú"_get_permutation_from_index_orders)rM   rÒ   r  r  Údims        r=   r   z+PermuteDims._get_permutation_from_arguments»  s`   € àÐØÐ&¨/Ð*AÜ Ð!:Ó;Ð;Ü×AÑAÀ/ÐSbÐdgÓhÐhàÐ*Ü Ð!UÓVÐVØÐ*Ü Ð!UÓVÐVØÐr?   c                óR  — t        t        |«      «      |k7  rt        d«      ‚t        t        |«      «      |k7  rt        d«      ‚t        t        j                  t        |«      t        |«      «      «      dkD  rt        d«      ‚|D �cg c]  }|j	                  |«      ‘Œ }}|S c c}w )Nz*wrong number of indices in index_order_newz*wrong number of indices in index_order_oldr   z>index_order_new and index_order_old must have the same indices)r{   rò   re   Úsymmetric_differenceÚindex)rM   r  r  ri  r`   rÒ   s         r=   rh  z.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ˆÐIØÐùò Js   ÂB$)NNN)rB   rC   rD   rn   rL   r´   rp   rÔ   rÒ   rŒ   r  r  rP  rX  r\  rZ  rl   r   rh  rF   r?   r=   rÐ   rÐ   }  sÜ   „ ñGóRò.@ð& ñó ðð ñó ðð ñDó ðDð0 ñ.)ó ð.)ð` ñBOó ðBOðH ñ]ó ð]ò(ð ñó ðò3ð ñ
ó ð
ð ñó ñr?   rÐ   c                  óà   — e Zd ZdZd„ Zd„ Zed„ «       Zed„ «       Ze	d„ «       Z
e	d„ «       Zed„ «       Zed	„ «       Zed
„ «       Zedd„«       Zd„ Zd„ Zed„ «       Zed„ «       Zed„ «       Zd„ Zy)rÞ   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                óª  — t        |«      }|D �cg c]  }t        t        |«      Ž ‘Œ }}|j                  dd«      }t	        |«      }|�, | j
                  |g|¢­i |¤Ž | j                  ||«      \  }}nd }t        |«      dk(  r|S t        j                  | |g|¢­Ž }||_
        t        |«      |_        ||_        |r|j                  «       S |S c c}w )Nrº   Fr   )r-   r   r
  r°   rÁ   Ú	_validateÚ_get_positions_shaper{   r   rL   Ú
_positionsÚ_get_subranksr¥   r¬   r´   )	rM   rÔ   rß   rÂ   r`   rº   r0   Ú	positionsrO   s	            r=   rL   zArrayDiagonal.__new__î  sÝ   € Ü˜‹~ˆØ7GÖH°!œE¤6¨!£9Ò-ÐHÐÐHØ—z‘z .°%Ó8ˆä˜$“ˆØÐØˆC�M‰M˜$Ð<Ð!1Ò<°VÒ<à"×7Ñ7¸Ð?OÓPÑˆI‘uàˆIÜÐÓ  AÒ%ØˆKÜ�m‰m˜C Ð9Ð(8Ò9ˆØ"ˆŒÜ% dÓ+ˆŒØˆŒ
ÙØ×$Ñ$Ó&Ð&Øˆ
ùò% Is   �Cc                ó  — | j                   }| j                  }|D �cg c]  }t        |«      dk(  sŒ|‘Œ }}t        |«      dkD  �rnt        |«      D ��ci c]  \  }}t        |«      dk(  sŒ|d   |“Œ }}}t        |«      D ��ci c]  \  }}t        |«      dkD  sŒ||“Œ }}}|D �cg c]  }t        |«      dkD  sŒ|‘Œ }}t	        | «      }	t        |«      }
|	|
z
  }g }d}t
        j                  |t        t        |	«      «      t	        |«      «      }|D ]b  }||v r|j                  |||   z   «       Œt        |t        t        f«      r|j                  |«       |dz  }ŒL|j                  |||   z   «       Œd t        |«      }t        |«      dkD  rt        t        |g|¢­Ž |«      S t        ||«      S t        |t         «      r | j"                  |g|¢­Ž S t        |t
        «      r | j$                  |g|¢­Ž S t        |t&        «      r | j(                  |g|¢­Ž S t        |t*        t,        f«      r'| j/                  |j0                  |«      \  }}t+        |Ž S  | j2                  |g|¢­ddiŽS c c}w c c}}w c c}}w c c}w )NrY   r   rº   F)rÔ   rß   r{   rÏ   rÀ   rÞ   Ú_push_indices_downrÚ   rh   rø   r3   r   Úintr,   rÕ   rà   rï   Ú_ArrayDiagonal_denest_ArrayAddÚ#_ArrayDiagonal_denest_ArrayDiagonalrÐ   Ú!_ArrayDiagonal_denest_PermuteDimsrŽ   r   rp  r0   r±   )r;   rÔ   rß   r`   Útrivial_diagsr.  Útrivial_posÚdiag_posÚdiagonal_indices_shortÚrank1Úrank2Úrank3Úinv_permutationÚcounter1Úindices_downrÒ   rs  r0   s                     r=   r´   zArrayDiagonal._canonicalize  sƒ  € Ø�y‰yˆØ×0Ñ0ÐØ$4ÖD˜q¼¸A»À!»šÐDˆÐDÜˆ}Ó Ó!Ü/8Ð9IÓ/J×Z¡t q¨!ÌcÐRSËfÐXYËk˜1˜Q™4 ™7ÐZˆKÑZÜ)2Ð3CÓ)D×S¡  AÌÈAËÐQRË
˜˜1™ÐSˆHÑSØ1AÖ%P¨AÄSÈÃVÈaÃZ¢aÐ%PÐ"Ð%PÜ˜T“NˆEÜÐ(Ó)ˆEØ˜E‘MˆEØ ˆOØˆHÜ(×;Ñ;Ð<RÔTXÔY^Ð_dÓYeÓTfÔhpÐquÓhvÓwˆLØ!ò @�Ø˜Ñ#Ø#×*Ñ*¨5°;¸q±>Ñ+AÕBÜ ¤G¬S >Ô2Ø#×*Ñ*¨8Ô4Ø ‘M‘Hà#×*Ñ*¨5°8¸A±;Ñ+>Õ?ð@ô % _Ó5ˆKÜÐ)Ó*¨QÒ.Ü$¤_°TÐ%SÐ<RÒ%SÐU`ÓaÐaä$ T¨;Ó7Ð7Ü�dœHÔ%Ø6�4×6Ñ6°tÐOÐ>NÒOÐOÜ�dœMÔ*Ø;�4×;Ñ;¸DÐTÐCSÒTÐTÜ�dœKÔ(Ø9�4×9Ñ9¸$ÐRÐAQÒRÐRÜ�dœY¬
Ð3Ô4Ø#×8Ñ8¸¿¹ÐEUÓVÑˆI�uÜ˜eÐ$Ð$Øˆt�y‰y˜ÐEÐ 0ÒE¸uÑEÐEùòC EùãZùÛSùÚ%Ps.   �I0±I0ÁI5Á+I5ÂI;ÂI;Â'JÂ;Jc                ór  ‡— t        | «      Š|D ]¡  }t        ˆfd„|D «       «      rt        d«      ‚t        |D �ch c]  }‰|   ’Œ	 c}«      dk7  rt        d«      ‚|j	                  dd«      st        |«      dk  rt        d«      ‚t        t        |«      «      t        |«      k7  sŒ˜t        d«      ‚ y c c}w )	Nc              3  ó:   •K  — | ]  }|t        ‰«      k\  –— Œ y ­wr2   ©r{   )r_   rj   r0   s     €r=   ra   z*ArrayDiagonal._validate.<locals>.<genexpr>0  s   øè ø€ Ò. q�1œ˜E›
•?Ñ.ùs   ƒz%index is larger than expression shaperY   z-diagonalizing indices of different dimensionsÚallow_trivial_diagsFz%need at least two axes to diagonalizezaxis index cannot be repeated)rÁ   r|   re   r{   r°   rò   )rÔ   rß   rÂ   r`   rj   r0   s        @r=   ro  zArrayDiagonal._validate*  s«   ø€ ô ˜$“ˆØ!ò 	BˆAÜÓ.¨AÔ.Ô.Ü Ð!HÓIÐIÜ aÖ( �E˜!“HÒ(Ó)¨QÒ.Ü Ð!PÓQÐQØ—:‘:Ð3°UÔ;ÄÀAÃÈ!ÂÜ Ð!HÓIÐIÜ”3�q“6‹{œc !›fÓ$Ü Ð!@ÓAÐAñ	Bùò )s   ºB4
c                ód   — |D �cg c]   }| |d      dk7  sŒt        d„ |D «       «      ‘Œ" c}S c c}w )Nr   rY   c              3  ó    K  — | ]  }|–— Œ y ­wr2   rF   )r_   rj   s     r=   ra   z;ArrayDiagonal._remove_trivial_dimensions.<locals>.<genexpr>;  s   è ø€ ’^˜A”a‘^ùs   ‚©rs   )r0   rß   r`   s      r=   Ú_remove_trivial_dimensionsz(ArrayDiagonal._remove_trivial_dimensions9  s/   € à-=ÖR¨ÀÀqÈÁtÁÐPQÓAQ”‘^ ”^Õ#ÒRÐRùÒRs   …-–-c                ó    — | j                   d   S rQ   r  rT   s    r=   rÔ   zArrayDiagonal.expr=  r  r?   c                ó    — | j                   dd  S rX   r  rT   s    r=   rß   zArrayDiagonal.diagonal_indicesA  ó   € à�y‰y˜˜ˆ}Ðr?   c                óÞ  ‡— | j                   }|D ��cg c]  }|D ]  }|‘Œ Œ }}}|j                  «        t        | «      }t        |«      }||z
  }t	        |«      D �cg c]  }d‘Œ c}Šd}	d}
t	        |«      D ]9  }|
|k  r |	||
   k\  r|	dz  }	|
dz  }
|
|k  r	|	||
   k\  rŒ‰|xx   |
z  cc<   |	dz  }	Œ; t        ˆfd„|D «       «      }||z   }t        | j                  g|¢­Ž S c c}}w c c}w )Nr   rY   c              3  óF   •K  — | ]  }t        ˆfd „|D «       «      –— Œ y­w)c              3  ó.   •K  — | ]  }‰|   |z   –— Œ y ­wr2   rF   ©r_   rj   Úshiftss     €r=   ra   z3ArrayDiagonal._flatten.<locals>.<genexpr>.<genexpr>W  s   øè ø€ Ò,F¸q¨V°A©Y¸­]Ñ,FùrË   NrŠ  ©r_   r`   r“  s     €r=   ra   z)ArrayDiagonal._flatten.<locals>.<genexpr>W  s   øè ø€ Ò&gÈ1¤uÓ,FÀAÔ,F×'FÑ&gùó   ƒ!)rß   r  rÙ   r{   rh   rs   rà   rÔ   )rÔ   Úouter_diagonal_indicesÚinner_diagonal_indicesr`   rj   Ú	all_innerÚ
total_rankÚ
inner_rankÚ
outer_rankr,  Úpointerrß   r“  s               @r=   rÎ   zArrayDiagonal._flattenE  s  ø€ à!%×!6Ñ!6ÐØ 6×B˜1ÀÒB¸1’QÐB�QÐBˆ	ÑBØ�‰Ôä! $Ó'ˆ
Ü˜“^ˆ
Ø *Ñ,ˆ
Ü" :Ó.Ö/˜’!Ò/ˆØˆØˆÜ�zÓ"ò 	ˆAØ˜JÒ&¨7°iÀÑ6HÒ+HØ˜1‘�Ø˜1‘�ð ˜JÒ&¨7°iÀÑ6HÓ+Hð �1‹I˜Ñ ‹IØ�q‰L‰Gð	ô "'Ó&gÐPfÔ&gÓ!gÐØ1Ð4JÑJÐÜ˜tŸy™yÐ<Ð+;Ò<Ð<ùó# Cùò 0s   “C$Á	C*c           	     ó`   — t        |j                  D �cg c]  }t        |g|¢­Ž ‘Œ c}Ž S c c}w r2   )ra  r²   rà   )rM   rÔ   rß   r¶   s       r=   rw  z,ArrayDiagonal._ArrayDiagonal_denest_ArrayAdd[  s*   € äÈtÏyÉyÖYÈœO¨CÐCÐ2BÔCÒYÐZÐZùÒYó   ”+c                ó(   —  | j                   |g|¢­Ž S r2   ©rÎ   )rM   rÔ   rß   s      r=   rx  z1ArrayDiagonal._ArrayDiagonal_denest_ArrayDiagonal_  s   € àˆs�|‰|˜DÐ4Ð#3Ò4Ð4r?   c           
     ón  ‡— |D ��cg c]!  }|D �cg c]  }|j                  |«      ‘Œ c}‘Œ# }}}t        t        |«      «      D �‡cg c]  Št        ˆfd„|D «       «      rŒ‰‘Œ }}|D �cg c]  }|j                  |«      ‘Œ }}t	        t        |«      «      D ��ci c]  \  }}||“Œ
 }	}}|D �cg c]  }|	|   ‘Œ	 }
}t        |
«      }t        t        |«      «      D �cg c]  }||z   ‘Œ	 }}|
|z   }t        t        |j                  g|¢­Ž |«      S c c}w c c}}w c c}w c c}w c c}}w c c}w c c}w )Nc              3  ó&   •K  — | ]  }‰|v –— Œ
 y ­wr2   rF   ©r_   rj   r`   s     €r=   ra   zBArrayDiagonal._ArrayDiagonal_denest_PermuteDims.<locals>.<genexpr>f  s   øè ø€ Ò>`È!¸qÀA¼vÑ>`ùó   ƒ)
rÒ   rh   rÀ   r|   rÏ   r
  r{   rÕ   rà   rÔ   )rM   rÔ   rß   r`   rj   Úback_diagonal_indicesÚnondiagÚback_nondiagr.  ÚremapÚnew_permutation1ÚshiftÚdiag_block_permr"  s      `          r=   ry  z/ArrayDiagonal._ArrayDiagonal_denest_PermuteDimsc  s*  ø€ àK[× \Àa¸qÖ!A¸! $×"2Ñ"2°1Õ"5Ô!AÐ \ÐÑ \Ü#¤H¨T£NÓ3×a˜¼3Ó>`ÐO_Ô>`Õ;`’1ÐaˆÐaØ5<Ö=°˜×(Ñ(¨Õ+Ð=ˆÐ=Ü"+¬F°<Ó,@Ó"A×B™$˜!˜Q��A‘ÐBˆÑBØ.:Ö;¨˜E !›HÐ;ÐÐ;ÜÐ$Ó%ˆÜ.3´CÐ8MÓ4NÓ.OÖP¨˜1˜u›9ÐPˆÐPØ*¨_Ñ<ˆÜÜØ—	‘	ðà&òð ó
ð 	
ùò "BùÓ \ùÚaùÚ=ùÛBùÚ;ùâPs9   ‡	D�D¨DÁDÁ!DÁ+D"ÂD'Â0D-ÃD2ÄDc                ó&   ‡ — ˆ fd„}t        ||«      S )Nc                óV   •— | t        ‰j                  «      k  r‰j                  |    S d S r2   )r{   rq  )r  r;   s    €r=   r  z<ArrayDiagonal._push_indices_down_nonstatic.<locals>.<lambda>v  s%   ø€ °A¼¸D¿O¹OÓ8LÒ4L˜dŸo™o¨aÑ0€ ÐRV€ r?   ©r$   ©r;   rt   Ú	transforms   `  r=   Ú_push_indices_down_nonstaticz*ArrayDiagonal._push_indices_down_nonstaticu  s   ø€ ÛVˆ	Ü3°I¸wÓGÐGr?   c                ó&   ‡ — ˆ fd„}t        ||«      S )Nc                óœ   •— t        ‰j                  «      D ]3  \  }}t        |t        «      r| |k(  st        |t        «      sŒ,| |v sŒ1|c S  y r2   )rÏ   rq  r3   rv  rs   )r  r`   r.  r;   s      €r=   r°  z;ArrayDiagonal._push_indices_up_nonstatic.<locals>.transform{  sF   ø€ Ü! $§/¡/Ó2ò ‘��1Ü˜q¤#Ô&¨1°ª6´zÀ!ÄUÕ7KÐPQÐUVÒPVØ’Hñr?   r®  r¯  s   `  r=   Ú_push_indices_up_nonstaticz(ArrayDiagonal._push_indices_up_nonstaticy  s   ø€ ô	ô
 4°I¸wÓGÐGr?   c                ób   ‡— | j                  t        |«      |«      \  Š}ˆfd„}t        ||«      S )Nc                ó.   •— | t        ‰«      k  r‰|    S d S r2   r†  )r  rs  s    €r=   r  z2ArrayDiagonal._push_indices_down.<locals>.<lambda>…  s   ø€ ¨a´#°i³.Ò.@˜i¨™l€ Àd€ r?   ©rp  rh   r$   ©rM   rß   rt   Úrankr0   r°  rs  s         @r=   ru  z ArrayDiagonal._push_indices_down‚  s1   ø€ à×3Ñ3´E¸$³KÐAQÓRÑˆ	�5ÛJˆ	Ü3°I¸wÓGÐGr?   c                ób   ‡— | j                  t        |«      |«      \  Š}ˆfd„}t        ||«      S )Nc                ó”   •— t        ‰«      D ]9  \  }}t        |t        «      r| |k(  st        |t        t        f«      sŒ2| |v sŒ7|c S  y r2   )rÏ   r3   rv  rs   r   )r  r`   r.  rs  s      €r=   r°  z1ArrayDiagonal._push_indices_up.<locals>.transformŒ  sF   ø€ Ü! )Ó,ò ‘��1Ü˜q¤#Ô&¨1°ª6´zÀ!ÄeÌUÀ^Õ7TÐZ[Ð_`ÒZ`Ø’Hñr?   r·  r¸  s         @r=   r(  zArrayDiagonal._push_indices_upˆ  s3   ø€ à×3Ñ3´E¸$³KÐAQÓRÑˆ	�5ô	ô
 4°I¸wÓGÐGr?   c                óÀ   ‡‡— t        ˆfd„t        ‰«      D «       «      }|rt        |Ž nd\  }}t        ˆfd„‰D «       «      }|rt        |Ž nd\  }}||z   }	||z   Š|	‰fS )Nc              3  óX   •‡K  — | ]   \  Š}t        ˆfd „‰D «       «      rŒ‰|f–— Œ" y­w)c              3  ó&   •K  — | ]  }‰|v –— Œ
 y ­wr2   rF   r£  s     €r=   ra   z?ArrayDiagonal._get_positions_shape.<locals>.<genexpr>.<genexpr>•  s   øè ø€ ÒHjÐTUÈÈaÌÑHjùr¤  N©r|   )r_   Úshpr`   rß   s     @€r=   ra   z5ArrayDiagonal._get_positions_shape.<locals>.<genexpr>•  s'   ùè ø€ Òk¡6 1 cÄSÓHjÐYiÔHjÕEj�q˜#”hÑkùs   „*¡	*)rF   rF   c              3  ó2   •K  — | ]  }|‰|d       f–— Œ y­w)r   NrF   )r_   r`   r0   s     €r=   ra   z5ArrayDiagonal._get_positions_shape.<locals>.<genexpr>—  s   øè ø€ ÒA¨1�q˜%  !¡™+Ô&ÑAùs   ƒ)rs   rÏ   r}   )
rM   r0   rß   Údata1Úpos1Úshp1Údata2Úpos2Úshp2rs  s
    ``       r=   rp  z"ArrayDiagonal._get_positions_shape“  sh   ù€ äÓk¬Y°uÓ-=ÔkÓkˆÙ$)”S˜%‘[¨x‰
ˆˆdÜÓAÐ0@ÔAÓAˆÙ$)”S˜%‘[¨x‰
ˆˆdØ˜4‘Kˆ	Ø�t‘ˆØ˜%ÐÐr?   c                ó~   — | j                   }t        |d«      r|j                  «       }t        |g| j                  ¢­Ž S rì   )rÔ   ry   rl   r   rß   rf  s     r=   rl   zArrayDiagonal.as_explicit�  s9   € Ø�y‰yˆÜ�4˜Ô'Ø×#Ñ#Ó%ˆDÜ˜dÐ; T×%:Ñ%:Ò;Ð;r?   N)rÔ   rÐ   )rB   rC   rD   rn   rL   r´   Ústaticmethodro  r‹  rp   rÔ   rß   rÎ   rŒ   rw  rx  ry  r±  r´  ru  r(  rp  rl   rF   r?   r=   rÞ   rÞ   Ô  s
  „ ñò2ò,$FðL ñBó ðBð ñSó ðSð ñó ðð ñó ðð ñ=ó ð=ð* ñ[ó ð[ð ñ5ó ð5ð ò
ó ð
ò"HòHð ñHó ðHð
 ñHó ðHð ñ ó ð ó<r?   rÞ   c                  óN   — e Zd Zd„ Zed„ «       Zed„ «       Zed„ «       Zd„ Zd„ Z	y)ÚArrayElementwiseApplyFuncc                ó®   — t        |t        «      st        d«      }t        | ||«      «      }t        j	                  | ||«      }t        |«      |_        |S ©NÚd)r3   r   r   r£   rL   rr  r¥   )rM   ÚfunctionÚelementrÎ  rO   s        r=   rL   z!ArrayElementwiseApplyFunc.__new__¦  sJ   € ä˜(¤FÔ+Ü�c“
ˆAÜ˜a¡¨!£Ó-ˆHä#×+Ñ+¨C°¸7ÓCˆÜ% gÓ.ˆŒØˆ
r?   c                ó    — | j                   d   S rQ   r  rT   s    r=   rÏ  z"ArrayElementwiseApplyFunc.function°  r  r?   c                ó    — | j                   d   S rX   r  rT   s    r=   rÔ   zArrayElementwiseApplyFunc.expr´  r  r?   c                ó.   — | j                   j                  S r2   ©rÔ   r0   rT   s    r=   r0   zArrayElementwiseApplyFunc.shape¸  s   € à�y‰y�‰Ðr?   c                ó²   — t        d«      }| j                  |«      }|j                  |«      }t        |t        «      rt        |«      }|S t        ||«      }|S rÍ  )r   rÏ  Údiffr3   r   Útyper   )r;   rÎ  rÏ  Úfdiffs       r=   Ú_get_function_fdiffz-ArrayElementwiseApplyFunc._get_function_fdiff¼  sT   € Ü�#‹JˆØ—=‘= Ó#ˆØ—‘˜aÓ ˆÜ�eœXÔ&Ü˜“KˆEð ˆô ˜1˜eÓ$ˆEØˆr?   c                óˆ   — | j                   }t        |d«      r|j                  «       }|j                  | j                  «      S rì   )rÔ   ry   rl   Ú	applyfuncrÏ  rf  s     r=   rl   z%ArrayElementwiseApplyFunc.as_explicitÆ  s6   € Ø�y‰yˆÜ�4˜Ô'Ø×#Ñ#Ó%ˆDØ�~‰~˜dŸm™mÓ,Ð,r?   N)
rB   rC   rD   rL   rp   rÏ  rÔ   r0   rÙ  rl   rF   r?   r=   rË  rË  ¤  sM   „ òð ñó ðð ñó ðð ñó ðòó-r?   rË  c                  ó„  — e Zd ZdZd„ Zd„ Zd„ Zd„ Zed„ «       Z	e
d„ «       Ze
d„ «       Ze
d	„ «       Zd
„ Zd„ Zed„ «       Zed„ «       Zed„ «       Zed„ «       Ze
d„ «       Ze
d„ «       Ze
d„ «       Ze
d„ «       Ze
d!d„«       Ze
d„ «       Zd„ Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Z d„ Z!d„ Z"d„ Z#d„ Z$y )"rØ   zx
    This class is meant to represent contractions of arrays in a form easily
    processable by the code printers.
    c                ó$  ‡‡— t        ‰«      Št        |«      }|j                  dd«      }t        j                  | |g‰¢­Ž }t        |«      |_        t        |j                  «      |_        t        t        |j                  «      «      D �‡ci c]  Št        ˆfd„‰D «       «      sŒ‰‰“Œ }}||_        t        |«      } | j                  |g‰¢­Ž  |rt        ˆfd„t!        |«      D «       «      }||_        |r|j%                  «       S |S c c}w )Nrº   Fc              3  ó&   •K  — | ]  }‰|v–— Œ
 y ­wr2   rF   )r_   Úcindr`   s     €r=   ra   z+ArrayContraction.__new__.<locals>.<genexpr>Ý  s!   øè ø€ ò  SBÐeiÐSTÐ\`ÔS`ñ  SBùr¤  c              3  óT   •‡K  — | ]  \  Š}t        ˆfd „‰D «       «      rŒ|–— Œ  y­w)c              3  ó&   •K  — | ]  }‰|v –— Œ
 y ­wr2   rF   r£  s     €r=   ra   z5ArrayContraction.__new__.<locals>.<genexpr>.<genexpr>ã  s   øè ø€ ÒGlÐSTÈÈQÌÑGlùr¤  Nr¿  )r_   rÀ  r`   rÜ   s     @€r=   ra   z+ArrayContraction.__new__.<locals>.<genexpr>ã  s#   ùè ø€ Òm¡& ! SÄCÓGlÐXkÔGlÕDlœ#Ñmùs   „(¡()r%   r-   r°   r   rL   rr  r¥   r&   Ú_mappingrh   r¨   rd   Ú_free_indices_to_positionrÁ   ro  rs   rÏ   r¬   r´   )	rM   rÔ   rÜ   rÂ   rº   rO   r`   Úfree_indices_to_positionr0   s	     `   `  r=   rL   zArrayContraction.__new__Ó  s  ù€ Ü7Ð8KÓLÐÜ˜‹~ˆà—z‘z .°%Ó8ˆä�m‰m˜C Ð<Ð(;Ò<ˆÜ% dÓ+ˆŒÜ1°#·-±-Ó@ˆŒä27¼¸C¿M¹MÓ8JÓ2K÷  $C¨QÌsó  SBð  nAô  SBõ  PB A q¡Dð  $CÐ ð  $CØ(@ˆÔ%ä˜$“ˆØˆ�‰�dÐ1Ð0Ó1ÙÜÓm¬I°eÓ,<ÔmÓmˆEØˆŒ
ÙØ×$Ñ$Ó&Ð&Øˆ
ùò $Cs   ÂDÂ'Dc                ó
  — | j                   }| j                  }t        |«      dk(  r|S t        |t        «      r | j
                  |g|¢­Ž S t        |t        t        f«      r | j                  |g|¢­Ž S t        |t        «      r | j                  |g|¢­Ž S t        |t        «      r:| j                  ||«      \  }}| j                  ||«      \  }}t        |«      dk(  r|S t        |t        «      r | j                  |g|¢­Ž S t        |t         «      r | j"                  |g|¢­Ž S |D �cg c]'  }t        |«      dkD  st%        |«      |d      dk7  sŒ&|‘Œ) }}t        |«      dk(  r|S  | j&                  |g|¢­ddiŽS c c}w )Nr   rY   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Ü   r`   s       r=   r´   zArrayContraction._canonicalizeé  s�  € Ø�y‰yˆØ"×6Ñ6ÐäÐ"Ó# qÒ(ØˆKä�dÔ,Ô-ØA�4×AÑAÀ$Ð]ÐI\Ò]Ð]ä�dœY¬
Ð3Ô4Ø:�4×:Ñ:¸4ÐVÐBUÒVÐVä�dœKÔ(Ø<�4×<Ñ<¸TÐXÐDWÒXÐXä�dÔ.Ô/Ø(,×(HÑ(HÈÐObÓ(cÑ%ˆDÐ%Ø(,×(JÑ(JÈ4ÐQdÓ(eÑ%ˆDÐ%ÜÐ&Ó'¨1Ò,Ø�ä�dœMÔ*Ø>�4×>Ñ>¸tÐZÐFYÒZÐZä�dœHÔ%Ø9�4×9Ñ9¸$ÐUÐATÒUÐUð +>Öj QÄÀQÃÈ!ÂÌyÐY]ËÐ_`ÐabÑ_cÑOdÐhiÓOišqÐjÐÐjÜÐ"Ó# qÒ(ØˆKàˆt�y‰y˜ÐHÐ 3ÒHÀ%ÑHÐHùò	 ks   Ä,'F ÅF c                ó&   — |dk(  r| S t        d«      ‚©NrY   zDProduct of N-dim arrays is not uniquely defined. Use another method.©rö   ©r;   Úothers     r=   Ú__mul__zArrayContraction.__mul__  ó   € Ø�AŠ:ØˆKä%Ð&lÓmÐmr?   c                ó&   — |dk(  r| S t        d«      ‚rî  rï  rð  s     r=   Ú__rmul__zArrayContraction.__rmul__  ró  r?   c                óž   — t        | «      }|€y |D ]5  }t        |D �ch c]  }||   dk7  sŒ||   ’Œ c}«      dk7  sŒ,t        d«      ‚ y c c}w )NrÇ   rY   z+contracting indices of different dimensions)rÁ   r{   re   )rÔ   rÜ   r0   r`   rj   s        r=   ro  zArrayContraction._validate  s[   € ä˜$“ˆØˆ=Øð %ò 	PˆAÜ aÖ: ¨5°©8°r«>�E˜!“HÒ:Ó;¸qÓ@Ü Ð!NÓOÐOñ	PùÚ:s
   �A

«A

c                óŒ   — |D ��cg c]  }|D ]  }|‘Œ Œ }}}|j                  «        t        |«      }t        ||«      S c c}}w r2   )r  r)   r$   ©rM   rÜ   rt   r`   rj   Úflattened_contraction_indicesr°  s          r=   ru  z#ArrayContraction._push_indices_down#  sM   € à4G×(S¨qÐQRÒ(SÈAªÐ(S¨Ð(SÐ%Ñ(SØ%×*Ñ*Ô,Ü@ÐA^Ó_ˆ	Ü3°I¸wÓGÐGùó )Tó   †A c                óŒ   — |D ��cg c]  }|D ]  }|‘Œ Œ }}}|j                  «        t        |«      }t        ||«      S c c}}w r2   )r  r'   r$   rø  s          r=   r(  z!ArrayContraction._push_indices_up*  sM   € à4G×(S¨qÐQRÒ(SÈAªÐ(S¨Ð(SÐ%Ñ(SØ%×*Ñ*Ô,Ü>Ð?\Ó]ˆ	Ü3°I¸wÓGÐGùó )Trú  c           
     óú  ‡‡‡— t        |t        «      r
t        «       ‚t        |t        «      s||fS |j                  }t        t        dg|z   «      «      Šg }|j                  D �cg c]  }g ‘Œ }}t        «       }|D ]¤  }t        t        |j                  «      «      D ]p  Št        |j                  ‰   t        «      sŒ!t        ˆˆfd„|D «       «      sŒ7|‰   j                  |D �	cg c]
  }	|	‰‰   z
  ‘Œ c}	«       |j                  |«        Œ“ |j                  |«       Œ¦ t        |«      t        |«      k(  r||fS t        |«      }
t        t        t        |
«      D �cg c]
  }||v rdnd‘Œ c}«      «      Š|D �cg c]   }t        j                   ˆfd„|D «       «      ‘Œ" }}t#        t%        |j                  |«      D ��cg c]  \  }}t'        |g|¢­Ž ‘Œ c}}Ž }||fS c c}w c c}	w c c}w c c}w c c}}w )Nr   c              3  óP   •K  — | ]  }‰‰   |cxk  xr ‰‰d z      k  nc –— Œ y­w)rY   NrF   )r_   rÉ   Úcumranksrj   s     €€r=   ra   zAArrayContraction._lower_contraction_to_addends.<locals>.<genexpr>@  s*   øè ø€ ÒS¸A�x ‘{ aÖ7¨(°1°Q±3©-×7Ð7ÑSùs   ƒ#&rY   c              3  ó.   •K  — | ]  }|‰|   z
  –— Œ y ­wr2   rF   r’  s     €r=   ra   zAArrayContraction._lower_contraction_to_addends.<locals>.<genexpr>J  s   øè ø€ Ò7QÈ!¸¸FÀ1¹I½Ñ7QùrË   )r3   rï   rö   r¸   r¦   rÚ   r   r²   rò   rh   r{   rd   rø   ÚupdaterÀ   r   r‡   rÖ   r}   rÝ   )rM   rÔ   rÜ   r¦   Úcontraction_indices_remainingr`   Úcontraction_indices_argsÚ	backshiftÚcontraction_grouprÉ   r™  r¶   Úcontrr[  rþ  rj   r“  s                 @@@r=   rê  z.ArrayContraction._lower_contraction_to_addends1  sæ  ú€ ä�dœHÔ%Ü%Ó'Ð'Ü˜$Ô 2Ô3ØÐ,Ð,Ð,Ø—=‘=ˆÜœ
 A 3¨¡>Ó2Ó3ˆØ(*Ð%Ø04·	±	Ö#:¨1¢BÐ#:Ð Ð#:Ü“Eˆ	Ø!4ò 		HÐÜœ3˜tŸy™y›>Ó*ò H�Ü! $§)¡)¨A¡,´Ô9ØÜÔSÐARÔSÕSØ,¨QÑ/×6Ñ6ÐQbÖ7cÈA¸¸HÀQ¹K»Ò7cÔdØ×$Ñ$Ð%6Ô7ÙðHð .×4Ñ4Ð5FÕGð		Hô Ð,Ó-´Ð5HÓ1IÒIØÐ,Ð,Ð,Ü˜d“^ˆ
Ü”jÄeÈJÓFWÖ!XÀ q¨I¡~¡!¸1Ñ"<Ò!XÓYÓZˆØ[xÖ(yÐVW¬¯©Ó7QÈqÔ7QÕ)QÐ(yÐ%Ð(yÜ#Ü>AÀ$Ç)Á)ÐMeÓ>f÷&
Ù0:°°UÔ˜sÐ+ UÔ+ó&
ð ˆð Ð1Ð1Ð1ùò) $;ùò 8dùò "YùÚ(yùó&
s   Á&	G#Ã'G(Å!G-Å?%G2ÇG7
c           	     ó¤  ‡‡— t        | «      }| j                  }g }t        |«      D �]ê  \  Š}t        |«      dk  rŒ|j	                  ‰«      }| j
                  j                  |d      }g }g }|D ]§  \  }	}
|j                  |	   }|j                  }|j                  |«      \  }}d|
z
  }||z   Šd|j                  vs4|dk(  du r|j                  dk7  st        ˆˆfd„t        |«      D «       «      r|j                  ||
f«       Œ•|j                  ||
f«       Œ© t        |«      dkD  r�Œ|D ]  \  }}
t        |j                  «      |_        Œ! |dd |z   |dd z   }|d   \  }}
|j                  |
   }|dd D ]€  \  }}
||j                  |
<   |j                  «       }|j                  j                  d«      d|
z
  k(  sJ ‚||j                  |j                  j                  d«      <   |j                  |«       Œ‚ |d   \  }}
||j                  |
<   �Œí |D ](  }|j!                  |t#        t%        d«      dg«      «       Œ* |j'                  «       S )	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.
        é   r   rY   T)rY   rY   c              3  ó8   •K  — | ]  \  }}|‰k7  sŒ‰|v –— Œ y ­wr2   rF   )r_   ÚliÚlÚindlÚother_arg_abss      €€r=   ra   z?ArrayContraction.split_multiple_contractions.<locals>.<genexpr>‘  s#   øè ø€ Òe©u¨r°1ÐZ\Ð`dÓZd˜¨Ô*Ñeùs   ƒ‘	NrÇ   )Ú_EditArrayContractionrÜ   rÏ   r{   Úget_mapping_for_indexrÔ   r0   Úargs_with_indrÐ  Úget_absolute_ranger|   rø   r   rt   Úget_new_contraction_indexrl  Úinsert_afterÚ_ArgErš   Úto_array_contraction)r;   ÚeditorrÜ   Úonearray_insertÚlinksrs  Úcurrent_dimensionÚnot_vectorsÚvectorsÚarg_indÚrel_indr¶   ÚmatÚabs_arg_startÚabs_arg_endÚother_arg_posrK  Úvectors_to_loopÚfirst_not_vectorÚ	new_indexÚlast_vecr  r  s                        @@r=   Úsplit_multiple_contractionsz,ArrayContraction.split_multiple_contractionsP  s�  ù€ ô. ' tÓ,ˆà"×6Ñ6Ðàˆä$Ð%8Ó9ó @	2‰KˆD�%Ü�5‹z˜QŠØð& ×4Ñ4°TÓ:ˆIð !%§	¡	§¡°°a±Ñ 9ÐàˆKØˆGØ$-ò 3Ñ �˜Ø×*Ñ*¨7Ñ3�Ø—k‘k�Ø-3×-FÑ-FÀsÓ-KÑ*�˜{Ø ! '¡	�Ø -°Ñ =�Ø˜cŸi™iÑ'Ø'¨1Ñ,°Ñ5¸#¿)¹)ÀvÒ:MÜÔe¼	ÐBUÓ8VÔeÔeà×&Ñ&¨¨W ~Õ6à—N‘N C¨ >Õ2ð3ô �;Ó !Ò#ñ ð
 &ò :‘
��7Ü.¨q¯y©yÓ9�•	ð:à)¨"¨1˜o°Ñ7¸+ÀaÀb¸/ÑIˆOØ(7¸Ñ(:Ñ%Ð˜gØ(×0Ñ0°Ñ9ˆIà-¨a°Ð3ò *‘
��7Ø%.�—	‘	˜'Ñ"Ø"×<Ñ<Ó>�	Ø—y‘y—‘ tÓ,°°G±Ò;Ð;Ð;Ø3<�—	‘	˜!Ÿ)™)Ÿ/™/¨$Ó/Ñ0Ø×&Ñ& qÕ)ð*ð !0°Ñ 3ÑˆH�gØ(1ˆH×Ñ˜WÓ%ðA@	2ðD !ò 	?ˆAØ×Ñ ¤5¬°!«°t°fÓ#=Õ>ð	?ð ×*Ñ*Ó,Ð,r?   c           
     óœ  — t        | j                  t        «      s| S | j                  j                  | j                  j                  | j
                  «      }g }| j                  j                  d d  }|D ]‡  }t        |«      }|D ]R  }|D �cg c]	  }||v sŒ|‘Œ }}|j                  |D ��	cg c]  }|D ]  }	|	‘Œ Œ c}	}«       |D �cg c]	  }||vsŒ|‘Œ }}ŒT |j                  t        t        |«      «      «       Œ‰ t        j                  ||«      }t        t        | j                  j                  g|¢­Ž g|¢­Ž S c c}w c c}	}w c c}w r2   )r3   rÔ   rÞ   ru  rß   rÜ   rÚ   rÑ   rø   r
  rò   r(  rÝ   rà   )
r;   Úcontraction_downr5  rß   r`   r  rj   rÉ   Údiagonal_withr
  s
             r=   Úflatten_contraction_of_diagonalz0ArrayContraction.flatten_contraction_of_diagonal´  sM  € Ü˜$Ÿ)™)¤]Ô3ØˆKØŸ9™9×7Ñ7¸¿	¹	×8RÑ8RÐTX×TlÑTlÓmÐØ"$ÐØŸ9™9×5Ñ5±aÐ8ÐØ!ò 	KˆAÜ $ Q£ÐØò [�Ø,<Ö G qÀÀQÂ¢Ð G�Ð GØ!×(Ñ(°]×)N°ÈAÒ)NÀqª!Ð)N¨!Ó)NÔOØ/?Ö#Z¨!À1ÈMÒCY¢AÐ#ZÐ Ñ#Zð[ð $×*Ñ*¬6´#Ð6GÓ2HÓ+IÕJð	Kô #0×"@Ñ"@ÐAQÐSjÓ"kÐÜ!ÜØ—	‘	—‘ðà!òð
ð
 %ò
ð 	
ùò !HùÛ)NùÚ#Zs   Â	D>ÂD>Â+EÃ	E	ÃE	c                óˆ   — i }|D ��cg c]  }|D ]  }|‘Œ Œ }}}d}| D ]  }||v r
|dz  }||v rŒ
|||<   |dz  }Œ |S c c}}w ©Nr   rY   rF   )Úfree_indicesrÜ   rä  r`   rj   rù  r,  Úinds           r=   Ú!_get_free_indices_to_position_mapz2ArrayContraction._get_free_indices_to_position_mapË  s|   € à#%Ð Ø4G×(S¨qÐQRÒ(SÈAªÐ(S¨Ð(SÐ%Ñ(SØˆØò 	ˆCØÐ:Ñ:Ø˜1‘�ð Ð:Ò:à,3Ð$ SÑ)Ø�q‰L‰Gð		ð
 (Ð'ùó )Ts   ˆ>c                ó€  — | j                   }|D ��cg c]  }|D ]  }|‘Œ Œ }}}|j                  «        t        | «      }t        |«      }||z
  }t	        |«      D �cg c]  }d‘Œ }}d}	d}
t	        |«      D ]9  }|
|k  r |	||
   k\  r|	dz  }	|
dz  }
|
|k  r	|	||
   k\  rŒ||xx   |
z  cc<   |	dz  }	Œ; |S c c}}w c c}w )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   rY   )rÜ   r  rÙ   r{   rh   )rÔ   Úinner_contraction_indicesr`   rj   r˜  r™  rš  r›  r“  r,  rœ  s              r=   Ú_get_index_shiftsz"ArrayContraction._get_index_shifts×  só   € ð* %)×$<Ñ$<Ð!Ø 9×E˜1À1ÒE¸a’QÐE�QÐEˆ	ÑEØ�‰Ôä! $Ó'ˆ
Ü˜“^ˆ
Ø *Ñ,ˆ
Ü" :Ó.Ö/˜’!Ð/ˆÐ/ØˆØˆÜ�zÓ"ò 	ˆAØ˜JÒ&¨7°iÀÑ6HÒ+HØ˜1‘�Ø˜1‘�ð ˜JÒ&¨7°iÀÑ6HÓ+Hð �1‹I˜Ñ ‹IØ�q‰L‰Gð	ð ˆùó Fùò 0s   ’B5Á	B;c                óZ   ‡— t         j                  | «      Št        ˆfd„|D «       «      }|S )Nc              3  óF   •K  — | ]  }t        ˆfd „|D «       «      –— Œ y­w)c              3  ó.   •K  — | ]  }‰|   |z   –— Œ y ­wr2   rF   r’  s     €r=   ra   zUArrayContraction._convert_outer_indices_to_inner_indices.<locals>.<genexpr>.<genexpr>  s   øè ø€ Ò/IÀ!°°q±	¸AµÑ/IùrË   NrŠ  r”  s     €r=   ra   zKArrayContraction._convert_outer_indices_to_inner_indices.<locals>.<genexpr>  s   øè ø€ Ò)mÈa¬%Ó/IÀqÔ/I×*IÑ)mùr•  )rØ   r1  rs   )rÔ   Úouter_contraction_indicesr“  s     @r=   r`  z8ArrayContraction._convert_outer_indices_to_inner_indicesþ  s+   ø€ ä!×3Ñ3°DÓ9ˆÜ$)Ó)mÐSlÔ)mÓ$mÐ!Ø(Ð(r?   c                ó|   — | j                   }t        j                  | g|¢­Ž }||z   }t        | j                  g|¢­Ž S r2   )rÜ   rØ   r`  rÝ   rÔ   )rÔ   r5  r0  rÜ   s       r=   rÎ   zArrayContraction._flatten  sG   € à$(×$<Ñ$<Ð!Ü$4×$\Ñ$\Ð]aÐ$~Ðd}Ò$~Ð!Ø7Ð:SÑSÐÜ! $§)¡)ÐBÐ.AÒBÐBr?   c                ó(   —  | j                   |g|¢­Ž S r2   r   )rM   rÔ   rÜ   s      r=   ræ  z:ArrayContraction._ArrayContraction_denest_ArrayContraction  s   € àˆs�|‰|˜DÐ7Ð#6Ò7Ð7r?   c                ó²   — |D ��cg c]  }|D ]  }|‘Œ Œ }}}t        |j                  «      D ��cg c]  \  }}||vsŒ|‘Œ }}}t        |Ž S c c}}w c c}}w r2   )rÏ   r0   rŽ   )rM   rÔ   rÜ   r`   rj   r)  r.  r0   s           r=   rç  z3ArrayContraction._ArrayContraction_denest_ZeroArray  s^   € à/B×#N¨!ÈAÒ#NÀq¢AÐ#N AÐ#NÐ Ñ#NÜ(¨¯©Ó4×Z‘t�q˜!¸ÐAYÒ8Y’ÐZˆÑZÜ˜%Ð Ð ùó $OùÛZs   †A±A¾Ac           	     ó`   — t        |j                  D �cg c]  }t        |g|¢­Ž ‘Œ c}Ž S c c}w r2   )ra  r²   rÝ   )rM   rÔ   rÜ   r`   s       r=   rì  z2ArrayContraction._ArrayContraction_denest_ArrayAdd  s.   € äÐQU×QZÑQZÖ[ÈAÔ.¨qÐGÐ3FÔGÒ[Ð\Ð\ùÒ[rž  c                óL  ‡‡— |j                   Š‰j                  }|D �cg c]  }t        ˆfd„|D «       «      ‘Œ }}|D �‡cg c]  Št        ˆfd„|D «       «      rŒ‰‘Œ }}| j	                  ||«      }t        t        |j                  g|¢­Ž t        |«      «      S c c}w c c}w )Nc              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wr2   rF   )r_   rj   rÒ   s     €r=   ra   zHArrayContraction._ArrayContraction_denest_PermuteDims.<locals>.<genexpr>  s   øè ø€ Ò(C¸A©°Q¯Ñ(CùrË   c              3  ó&   •K  — | ]  }‰|v –— Œ
 y ­wr2   rF   r£  s     €r=   ra   zHArrayContraction._ArrayContraction_denest_PermuteDims.<locals>.<genexpr>  s   øè ø€ Ò0Y¸A°°a´Ñ0Yùr¤  )	rÒ   r	  rs   r|   r(  rÕ   rÝ   rÔ   r+   )rM   rÔ   rÜ   r  r`   r5  Ú	new_plistrÒ   s       `  @r=   rè  z5ArrayContraction._ArrayContraction_denest_PermuteDims  sœ   ù€ à×&Ñ&ˆØ×&Ñ&ˆØM`Ö"aÈ¤5Ó(CÀÔ(CÕ#CÐ"aÐÐ"aØ %×Z˜1¬SÓ0YÐAXÔ0YÕ-Y’QÐZˆ	ÐZØ×(Ñ(Ð)@À)ÓLˆ	ÜÜ˜tŸy™yÐCÐ+BÒCÜ˜	Ó"ó
ð 	
ùò #bùÚZs   ŸBÁB!ÁB!c                ó¬  ‡— t        |j                  «      }|j                  |j                  |t        |j                  «      «      }|D ���cg c]4  }|D ��cg c]$  }t        |t        t        f«      r|n|gD ]  }|‘Œ Œ& c}}‘Œ6 }}}}g }|D ]k  }	|	d d  }
t        |«      D ]3  \  }Š‰€Œ	t        ˆfd„|	D «       «      sŒ|
j                  ‰«       d ||<   Œ5 |j                  t        t        |
«      «      «       Œm |D �cg c]  }|€Œ|‘Œ	 }}t        j                  ||«      }t!        t#        |j                  g|¢­Ž g|¢­Ž S c c}}w c c}}}w c c}w )Nc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr2   rF   )r_   r`   Údiag_indgrps     €r=   ra   zJArrayContraction._ArrayContraction_denest_ArrayDiagonal.<locals>.<genexpr>1  s   øè ø€ Ò>¨A�q˜KÔ'Ñ>ùr¤  )rÚ   rß   ru  rÀ   rÔ   r3   rs   r   rÏ   r|   rÑ   rø   r
  rò   rØ   r(  rà   rÝ   )rM   rÔ   rÜ   rß   Údown_contraction_indicesr`   rj   rÉ   r5  Úcontr_indgrpr-  Únew_diagonal_indices_downÚnew_diagonal_indicesr@  s                @r=   rë  z7ArrayContraction._ArrayContraction_denest_ArrayDiagonal%  sx  ø€ ä × 5Ñ 5Ó6ÐØ#'×#:Ñ#:¸4×;PÑ;PÐReÔgoÐpt×pyÑpyÓgzÓ#{Ð ð tL÷  $Mð  $MÐno°×$i¨1ÄÈAÔPUÔW\È~ÔA^¹AÐefÐdgÒ$i°a¢QÐ$i QÕ$ið  $MÐ ò  $MØ"$ÐØ4ò 	=ˆLØ™q�/ˆCÜ"+Ð,<Ó"=ò /‘��;ØÐ&ØÜÓ>°Ô>Õ>Ø—J‘J˜{Ô+Ø*.Ð$ QÒ'ð/ð $×*Ñ*¬6´#°c³(Ó+;Õ<ð	=ð 1AÖ$R¨1ÀAÁM¢QÐ$RÐ!Ð$RÜ/×@Ñ@ÐAXÐZsÓtÐÜÜ˜tŸy™yÐCÐ+BÒCð
à!ò
ð 	
ùó %jùô  $Mùò %Ss$   Á
E
Á)EÂ E
Ä EÄEÅE
c                óT  ‡‡‡‡— ‰j                   €‰|fS t        t        dg‰j                  z   «      «      }t	        t        ‰j                  «      «      D �cg c]   }t        t	        ||   ||dz      «      «      ‘Œ" }}|D ��ch c]  }|D ]  }|’Œ Œ c}}Št        ‰j                  «      D ��cg c],  \  }}t        ˆfd„t	        ||   ||dz      «      D «       «      ‘Œ. c}}Št        t	        t        ‰j                  «      «      ˆˆfd„¬«      }|D �cg c]  }‰j                  |   ‘Œ }	}|D ��cg c]  }||   D ]  }|‘Œ Œ }
}}t        |
«      Š|D �cg c]  }t        ˆfd„|D «       «      ‘Œ }}t        |«      }t        |	Ž |fS c c}w c c}}w c c}}w c c}w c c}}w c c}w )Nr   rY   c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr2   rF   )r_   rj   r)  s     €r=   ra   z?ArrayContraction._sort_fully_contracted_args.<locals>.<genexpr>D  s   øè ø€ ÒcÀ! Ð%=Ô =Ñcùr¤  c                óF   •— ‰|    rdt        ‰j                  |    «      fS dS )Nr   )rY   )r   r²   )r  rÔ   Úfully_contracteds    €€r=   r  z>ArrayContraction._sort_fully_contracted_args.<locals>.<lambda>E  s1   ø€ ÐeuÐvwÒex¸qÔBRÐSW×S\ÑS\Ð]^ÑS_ÓB`Ð>a€ ð  C€ r?   r  c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wr2   rF   )r_   rj   Úindex_permutation_array_forms     €r=   ra   z?ArrayContraction._sort_fully_contracted_args.<locals>.<genexpr>I  s   øè ø€ Ò(TÈQÐ)EÀaÕ)HÑ(Tùr'  )r0   rÚ   r   r¦   rh   r{   r²   rÏ   rd   r
  r,   rs   r%   rÖ   )rM   rÔ   rÜ   r  r`   r/  rj   r¶   Únew_posrù   Únew_index_blocks_flatr5  r)  rH  rJ  s    `          @@@r=   ré  z,ArrayContraction._sort_fully_contracted_args=  s§  û€ à�:‰:ÐØÐ,Ð,Ð,Ü”Z   d§m¡mÑ 3Ó4Ó5ˆÜCHÌÈTÏYÉYËÓCXÖY¸aœœU 5¨¡8¨U°1°Q±3©ZÓ8Õ9ÐYˆÐYØ/B×#N¨!ÈAÒ#NÀq¢AÐ#N AÓ#NÐ Ür{ð  }A÷  }Fñ  }Fó  sG÷  HÑhnÐhiÐknœCÓcÄuÈUÐSTÉXÐW\Ð]^Ð_`Ñ]`ÑWaÓGbÔcÕcó  HÐÜœœs 4§9¡9›~Ó.ô  5Cô  DˆØ*1Ö2 Q�D—I‘I˜a“LÐ2ˆÐ2Ø,3× M q¸\È!¹_Ò M¸¢Ð M Ð MÐÑ MÜ'1Ð2GÓ'HÐ$Ø^qÖ"rÐYZ¤5Ó(TÐRSÔ(TÕ#TÐ"rÐÐ"rÜ";Ð<SÓ"TÐÜ$ hÐ/Ð1HÐHÐHùò ZùÛ#Nùó Hùâ2ùÛ Mùâ"rs$   Á%F	ÂFÂ/1FÄFÄ2FÅF%c           	     óŠ   — | j                   }| j                  D ��cg c]  }|D �cg c]  }||   ‘Œ	 c}‘Œ c}}S c c}w c c}}w )aÞ  
        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`).
        )râ  rÜ   )r;   Úmappingr`   rj   s       r=   Ú_get_contraction_tuplesz(ArrayContraction._get_contraction_tuplesM  s9   € ð8 —-‘-ˆØ15×1IÑ1I×J¨A QÖ' �˜“Ô'ÓJÐJùÒ'ùÓJs   œ	?¥:±?º?c                óš   ‡— | j                   }dgt        t        |«      «      z   Š|D �cg c]  }t        ˆfd„|D «       «      ‘Œ c}S c c}w )Nr   c              3  ó4   •K  — | ]  \  }}‰|   |z   –— Œ y ­wr2   rF   )r_   rj   rÉ   rÊ   s      €r=   ra   zNArrayContraction._contraction_tuples_to_contraction_indices.<locals>.<genexpr>q  s    øè ø€ Ò:±°°1Ð& qÑ)¨!Õ+Ñ:ùrþ   )r¦   rÚ   r   rs   )rÔ   Úcontraction_tuplesrÃ   r`   rÊ   s       @r=   Ú*_contraction_tuples_to_contraction_indicesz;ArrayContraction._contraction_tuples_to_contraction_indicesl  sD   ø€ ð —‘ˆØ˜3¤¤j°Ó&7Ó!8Ñ8ÐØDVÖW¸q”Ó:¸Ô:Õ:ÒWÐWùÒWs   ªAc                ó    — | j                   d d  S r2   )Ú_free_indicesrT   s    r=   r,  zArrayContraction.free_indicess  s   € à×!Ñ!¡!Ð$Ð$r?   c                ó,   — t        | j                  «      S r2   )Údictrã  rT   s    r=   rä  z)ArrayContraction.free_indices_to_positionw  s   € ä�D×2Ñ2Ó3Ð3r?   c                ó    — | j                   d   S rQ   r  rT   s    r=   rÔ   zArrayContraction.expr{  r  r?   c                ó    — | j                   dd  S rX   r  rT   s    r=   rÜ   z$ArrayContraction.contraction_indices  rŽ  r?   c                óÒ   — | j                   }t        |t        «      st        d«      ‚|j                  }i }d}t        |«      D ]!  \  }}t        |«      D ]  }||f||<   |dz  }Œ Œ# |S )Nz(only for contractions of tensor productsr   rY   )rÔ   r3   r¸   rö   r¦   rÏ   rh   )r;   rÔ   rÃ   rN  r,  r`   r¹  rj   s           r=   Ú"_contraction_indices_to_componentsz3ArrayContraction._contraction_indices_to_componentsƒ  s~   € Ø�y‰yˆÜ˜$Ô 2Ô3Ü%Ð&PÓQÐQØ—‘ˆØˆØˆÜ  Ó'ò 	‰GˆAˆtÜ˜4“[ò �Ø$% q 6�˜Ñ Ø˜1‘‘ñð	ð ˆr?   c                óÜ  — | j                   }t        |t        «      s| S |j                  }t	        t        |«      d„ ¬«      }t        |Ž \  }}t        |«      D ��ci c]  \  }}||j                  |«      “Œ }}}| j                  «       }	|	D ��
�cg c]  }|D �
�cg c]  \  }
}||
   |f‘Œ c}}
‘Œ }	}
}}t        |Ž }| j                  ||	«      }t        |g|¢­Ž S c c}}w c c}}
w c c}}
}w )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                ó   — t        | d   «      S rX   r   r  s    r=   r  z4ArrayContraction.sort_args_by_name.<locals>.<lambda>©  s   € Ô<LÈQÈqÉTÓ<R€ r?   r  )rÔ   r3   r¸   r²   r
  rÏ   r}   rl  rO  rÖ   rS  rÝ   )r;   rÔ   r²   Úsorted_dataÚ
pos_sortedr   r`   r¶   Úreordering_maprR  rj   rÉ   Úc_tprd  s                 r=   Úsort_args_by_namez"ArrayContraction.sort_args_by_name�  sð   € ð* �y‰yˆÜ˜$Ô 2Ô3ØˆKØ�y‰yˆÜœY t›_Ñ2RÔSˆÜ"% {Ð"3Ñˆ
�KÜ?HÈ»×O±V°Q¸˜!˜Z×-Ñ-¨aÓ0Ñ0ÐOˆÑOØ!×9Ñ9Ó;ÐØN`×aÐaÈÀ!×D¹$¸!¸Q ¨qÑ 1°1Ò5ÕDÐaÐÒaÜ$ kÐ2ˆØ ×KÑKØØ"ó
Ðô " $Ð;Ð):Ò;Ð;ùó PùãDùÔas   ÁCÂ
C'ÂC!Â+C'Ã!C'c                óP   — t        | g| j                  g| j                  ¢­Ž \  }}|S )ao  
        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(   z'ArrayContraction._get_contraction_linksµ  s+   € ôR .¨t¨f°d·m±mÐ_Àd×F^ÑF^Ò_‰ˆˆfØˆr?   c                ó~   — | j                   }t        |d«      r|j                  «       }t        |g| j                  ¢­Ž S rì   )rÔ   ry   rl   r   rÜ   rf  s     r=   rl   zArrayContraction.as_explicitá  s9   € Ø�y‰yˆÜ�4˜Ô'Ø×#Ñ#Ó%ˆDÜ  ÐA¨×(@Ñ(@ÒAÐAr?   N)rÔ   z'ArrayDiagonal')%rB   rC   rD   rn   rL   r´   rò  rõ  rÉ  ro  rŒ   ru  r(  rê  r%  r)  r.  r1  r`  rÎ   ræ  rç  rì  rè  rë  ré  rO  rS  rp   r,  rä  rÔ   rÜ   r[  rb  r(   rl   rF   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                  óB   — e Zd ZdZd„ Zed„ «       Zed„ «       Zd„ Zd„ Z	y)ÚReshapeaÈ  
    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                ó<  — t        |«      }t        |t        «      st        |Ž }t        t	        j
                  |j                  «      t	        j
                  |«      «      dk(  rt        d«      ‚t        j                  | ||«      }t        |«      |_        ||_        |S )NFzshape mismatch)r-   r3   r   r	   r   r‡   r0   re   r   rL   rs   r¬   Ú_expr)rM   rÔ   r0   rO   s       r=   rL   zReshape.__new__ÿ  sx   € Ü˜‹~ˆÜ˜%¤Ô'Ü˜5�MˆEÜ”C—L‘L §¡Ó,¬c¯l©l¸5Ó.AÓBÀeÒKÜÐ-Ó.Ð.Ü�l‰l˜3  eÓ,ˆÜ˜5“\ˆŒ
ØˆŒ	Øˆ
r?   c                ó   — | j                   S r2   r«   rT   s    r=   r0   zReshape.shape
  r­   r?   c                ó   — | j                   S r2   )ri  rT   s    r=   rÔ   zReshape.expr  r’   r?   c                ó  — |j                  dd«      r | j                  j                  |i |¤Ž}n| j                  }t        |t        t
        f«      r |j                  | j                  Ž S t        || j                  «      S )Nr¯   T)	r°   rÔ   r³   r3   r   r    ri   r0   rg  )r;   r²   rÂ   rÔ   s       r=   r³   zReshape.doit  sg   € Ø�:‰:�f˜dÔ#Ø!�4—9‘9—>‘> 4Ð2¨6Ñ2‰Dà—9‘9ˆDÜ�dœZ¬Ð3Ô4Ø�4—<‘< §¡Ð,Ð,Ü�t˜TŸZ™ZÓ(Ð(r?   c                óæ   — | j                   }t        |d«      r|j                  «       }t        |t        «      rddlm}  ||«      }nt        |t        «      r| S  |j                  | j                  Ž S )Nrl   r   )ÚArray)
rÔ   ry   rl   r3   r   Úsympyrn  r   ri   r0   )r;   Úeern  s      r=   rl   zReshape.as_explicit  s[   € Ø�Y‰YˆÜ�2�}Ô%Ø—‘Ó!ˆBÜ�bœ*Ô%Ý#Ù�r“‰BÜ˜œJÔ'ØˆKØˆr�z‰z˜4Ÿ:™:Ð&Ð&r?   N)
rB   rC   rD   rn   rL   rp   r0   rÔ   r³   rl   rF   r?   r=   rg  rg  è  s>   „ ñò,	ð ñó ðð ñó ðò)ó	'r?   rg  c                  ó0   — e Zd ZU dZded<   ddd„Zd„ ZeZy)	r  al  
    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]rt   Nc                ó~   — || _         |€(t        t        |«      «      D �cg c]  }d ‘Œ c}| _        y || _        y c c}w r2   )rÐ  rh   rÀ   rt   )r;   rÐ  rt   r`   s       r=   Ú__init__z_ArgE.__init__9  s7   € ØˆŒØˆ?Ü*/´¸Ó0AÓ*BÖC QšDÒCˆD�Là"ˆD�Lùò Ds    	:c                ó<   — d| j                   ›d| j                  ›d�S )Nz_ArgE(z, ú))rÐ  rt   rT   s    r=   Ú__str__z_ArgE.__str__@  s   � Ø"&§,£,°·³Ð=Ð=r?   r2   )rt   zlist[int | None] | None)rB   rC   rD   rn   rE   rs  rv  Ú__repr__rF   r?   r=   r  r  '  s    … ñð Óô#ò>ð �Hr?   r  c                  ó(   — e Zd ZdZdd„Zd„ ZeZd„ Zy)Ú_IndPoszÇ
    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                ó    — || _         || _        y r2   ©r¶   Úrel)r;   r¶   r|  s      r=   rs  z_IndPos.__init__M  s   € ØˆŒØˆ�r?   c                ó8   — d| j                   | j                  fz  S )Nz_IndPos(%i, %i)r{  rT   s    r=   rv  z_IndPos.__str__Q  s   € Ø  D§H¡H¨d¯h©hÐ#7Ñ7Ð7r?   c              #  óP   K  — | j                   | j                  gE d {  –—†  y 7 Œ­wr2   r{  rT   s    r=   Ú__iter__z_IndPos.__iter__V  s   è ø€ Ø—H‘H˜dŸh™hÐ'×'Ò'ús   ‚&ž$Ÿ&N)r¶   rv  r|  rv  )rB   rC   rD   rn   rs  rv  rw  r  rF   r?   r=   ry  ry  F  s   „ ñóò8ð €Hó(r?   ry  c                  óŽ   — e Zd ZdZdd„Zdd„Zd„ Zd„ Zd„ Zd„ Z	dd„Z
dd	„Zdd
„Zdd„Zdd„Zed„ «       Zd„ Zdd„Zdd„Zdd„Zy)r  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                ó   — t        |t        «      r1t        |j                  «      }|j                  }|j
                  }d}�nt        |t        «      rît        |j                  t        «      r€t        |j                  j                  «      }|j                  j                  }t        j                  |j                  j
                  |j                  «      }|j                  j
                  }nut        |j                  t        «      ri }|j                  }|j                  }g }n>i }|j                  }|j                  }g }n!t        |t        «      r|}g }d}n
t        «       ‚t        |t        «      rt        |j                  «      }n|g}|D �cg c]  }t        |«      ‘Œ }}t        |«      D ]&  \  }	}
|
D ]  }|   \  }}|	||   j                  |<   Œ Œ( || _        t#        |«      | _        d | _        t        |j                  «      }t        |«      D ]3  \  }	}|D ])  }||   \  }}d|	z
  | j                   |   j                  |<   Œ+ Œ5 y c c}w )NrF   rÇ   )r3   rØ   r&   r¦   rÔ   rÜ   rÞ   ru  rß   r¸   rö   rÚ   r²   r  rÏ   rt   r  r{   Únumber_of_contraction_indicesÚ_track_permutation)r;   Ú
base_arrayrN  rÔ   rÜ   Údiagonalizedr²   r¶   r  r`   Úcontraction_tuplerj   Úarg_posÚrel_posr.  s                  r=   rs  z_EditArrayContraction.__init__i  s7  € ô
 �jÔ"2Ô3Ü0°×1DÑ1DÓEˆGØ—?‘?ˆDØ",×"@Ñ"@ÐØŠLÜ˜
¤MÔ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ØˆDØ"$ÐØ‰Lä%Ó'Ð'ä�dÔ.Ô/Ü˜Ÿ	™	“?‰Dà�6ˆDà<@Ö%A°S¤e¨C¥jÐ%AˆÐ%AÜ$-Ð.AÓ$Bò 	<Ñ ˆAÐ Ø&ò <�Ø#*¨1¡:Ñ �˜Ø:;�˜gÑ&×.Ñ.¨wÒ7ñ<ð	<ð +8ˆÔÜ25Ð6IÓ2JˆÔ*Ø:>ˆÔä,¨Z×-@Ñ-@ÓAˆô ˜lÓ+ò 	F‰DˆAˆqØò F�Ø#*¨1¡:Ñ �˜Ø?AÀA¹v�×"Ñ" 7Ñ+×3Ñ3°GÒ<ñFñ	Fùò &Bs   ÆIc                óx   — | j                   j                  |«      }| j                   j                  |dz   |«       y rX   )r  rl  Úinsert)r;   r¶   Únew_argÚposs       r=   r  z"_EditArrayContraction.insert_after¢  s2   € Ø× Ñ ×&Ñ& sÓ+ˆØ×Ñ×!Ñ! #¨¡'¨7Õ3r?   c                óJ   — | xj                   dz  c_         | j                   dz
  S rX   )r‚  rT   s    r=   r  z/_EditArrayContraction.get_new_contraction_index¦  s$   € Ø×*Ò*¨aÑ/Õ*Ø×1Ñ1°AÑ5Ð5r?   c                óz  — i }| j                   D ]/  }|j                  |j                  D �ci c]  }|€Œ|d“Œ
 c}«       Œ1 t        t	        |«      «      D ]
  \  }}|||<   Œ t        |«      | _        | j                   D ]1  }|j                  D �cg c]  }|j                  |d «      ‘Œ c}|_        Œ3 y c c}w c c}w )NrÇ   )r  r   rt   rÏ   r
  r{   r‚  r°   )r;   ÚupdatesÚarg_with_indr`   r.  s        r=   Úrefresh_indicesz%_EditArrayContraction.refresh_indicesª  s»   € ØˆØ ×.Ñ.ò 	SˆLØ�N‰N¨<×+?Ñ+?ÖQ aÀ1Á=˜A˜r™EÒQÕRð	Säœf W›oÓ.ò 	‰DˆAˆqØˆG�AŠJð	ä-0°«\ˆÔ*Ø ×.Ñ.ò 	XˆLØBN×BVÑBVÖ#W¸Q G§K¡K°°4Õ$8Ò#WˆLÕ ñ	Xùò	 Rùò
 $Xs   «B3
³B3
ÂB8c                ó  — g }| j                   D ],  }t        |j                  «      dk(  sŒ|j                  |«       Œ. |D ]  }| j                   j	                  |«       Œ t        j                  |D �cg c]  }|j                  ‘Œ c}«      }t        | j                   «      dk(  r%| j                   j                  t        |«      «       y ddl	m
}  ||| j                   d   j                  «      | j                   d   _        y c c}w )Nr   )Ú_a2m_tensor_product)r  r{   rt   rø   Úremover   r‡   rÐ  r  Ú3sympy.tensor.array.expressions.from_array_to_matrixr“  )r;   Úscalarsr�  r`   Úscalarr“  s         r=   Úmerge_scalarsz#_EditArrayContraction.merge_scalars´  sÜ   € ØˆØ ×.Ñ.ò 	-ˆLÜ�<×'Ñ'Ó(¨AÓ-Ø—‘˜|Õ,ð	-ð ò 	)ˆAØ×Ñ×%Ñ% aÕ(ð	)ä—‘°'Ö:¨Q˜qŸy›yÒ:Ó;ˆÜˆt×!Ñ!Ó" aÒ'Ø×Ñ×%Ñ%¤e¨F£mÕ4å_Ù,?ÀÈ×HZÑHZÐ[\ÑH]×HeÑHeÓ,fˆD×Ñ˜qÑ!Õ)ùò ;s   Á3Dc           	     óP  — d}t        t        «      }t        «       }| j                  D ]&  }|j	                  t        |j
                  «      «       Œ( |d    }g }g }t        «       }d}	| j                  D �]  }d}
|j
                  D ]¦  }|€|j                  |	«       |
dz  }
|	dz  }	Œ!|dk\  rŒ'|d|z
     j                  ||
z   «       ||   dk(  r-||vr)|j                  |dz
  |z
  «       |j                  |«       n,||vr(|j                  |dz
  |z
  «       |j                  |«       |
dz  }
Œ¨ |j
                  D �cg c]  }|�|dk\  r|nd ‘Œ c}|_        |t        |j
                  D �cg c]  }|�|dk  sŒ|‘Œ c}«      z  }�Œ ||z   }t        |«      }|j                  «       D �cg c]  }t        |«      dkD  sŒt        |«      ‘Œ }}| j                  «        | j                  «        | j                  D �cg c]  }|j                  ‘Œ }}| j!                  «       }t#        t%        |Ž g|¢­Ž }t'        |g|¢­Ž }| j(                  �8t        | j(                  D ��cg c]  }|D ]  }|‘Œ Œ c}}«      }t+        ||«      }t+        ||«      }|S c c}w c c}w c c}w c c}w c c}}w r8  )r   rÚ   r   r  r   rt   rò   rø   r×   r{   r,   Úvaluesrs   r˜  r‘  rÐ  Úget_contraction_indicesrÝ   rÖ   rà   rƒ  rÕ   )r;   r,  Údiag_indicesÚcount_index_freqr�  Úfree_index_countÚ	inv_perm1Ú	inv_perm2ÚdoneÚcounter4Úcounter2r`   rå   rÒ   rK  Údiag_indices_filteredr¶   r²   rÜ   rÔ   Úexpr2rj   Úpermutation2Úexpr3s                           r=   r  z*_EditArrayContraction.to_array_contractionÂ  sÓ  € ð ˆä"¤4Ó(ˆä"›9ÐØ ×.Ñ.ò 	CˆLØ×#Ñ#¤G¨L×,@Ñ,@Ó$AÕBð	Cð ,¨DÑ1Ðð ˆ	Øˆ	ä‹uˆð ˆà ×.Ñ.ó 	TˆLð ˆHØ!×)Ñ)ò �Ø�9Ø×$Ñ$ XÔ.Ø ‘M�HØ ‘M�HØØ˜’6Øà˜R !™VÑ$×+Ñ+¨G°hÑ,>Ô?Ø# AÑ&¨!Ò+°¸±Ø×$Ñ$Ð%5¸Ñ%9¸AÑ%=Ô>Ø—H‘H˜Q•KØ˜d‘]Ø×$Ñ$Ð%5¸Ñ%9¸AÑ%=Ô>Ø—H‘H˜Q”KØ˜A‘‘ð!ð$ Vb×UiÑUiÖ#jÐPQ¨¨¸1Àº6¡AÀtÑ$KÒ#jˆLÔ Ø”s |×';Ñ';ÖR !¸q¸yÈAÐPQËEšAÒRÓSÑSŠGð1	Tð4 (¨)Ñ3ÐÜ Ð!4Ó5ˆð 4@×3FÑ3FÓ3HÖ W¨aÌCÐPQËFÐUVËJ¤ q¥Ð WÐÐ Wà×ÑÔØ×ÑÔØ'+×'9Ñ'9Ö: �—“Ð:ˆÐ:Ø"×:Ñ:Ó<ÐÜ!Ô"7¸Ð">ÐUÐATÒUˆÜ Ð=Ð'<Ò=ˆØ×"Ñ"Ð.Ü%°$×2IÑ2I×&U¨QÐSTÒ&UÈa¢qÐ&U qÓ&UÓVˆLÜ! %¨Ó6ˆEä˜e [Ó1ˆØˆùò) $kùÚRùò !Xùò ;ùó
 'Vs*   Ä;JÅ)JÅ6JÆ(JÆ<JÇ9JÉJ"
c                óÒ   — t        | j                  «      D �cg c]  }g ‘Œ }}d}| j                  D ].  }|j                  D ]  }|�||   j	                  |«       |dz  }Œ Œ0 |S c c}w r+  )rh   r‚  r  rt   rø   )r;   r`   rÜ   Úcurrent_positionr�  rj   s         r=   r›  z-_EditArrayContraction.get_contraction_indices  sƒ   € Ü<AÀ$×BdÑBdÓ<eÖ/f°q²Ð/fÐÐ/fØ !ÐØ ×.Ñ.ò 	&ˆLØ!×)Ñ)ò &�Ø�=Ø'¨Ñ*×1Ñ1Ð2BÔCØ  AÑ%Ñ ñ&ð	&ð
 #Ð"ùò 0gs   ˜	A$c                óô   — || j                   k\  rt        d«      ‚g }t        | j                  «      D ]C  \  }}t        |j                  «      D ]&  \  }}||k(  sŒ|j                  t        ||«      «       Œ( ŒE |S )Nz%index value exceeding the index range)r‚  re   rÏ   r  rt   rø   ry  )r;   r-  rs  r`   r�  rj   r  s          r=   r  z+_EditArrayContraction.get_mapping_for_index  s€   € Ø�$×4Ñ4Ò4ÜÐDÓEÐEØ#%ˆ	Ü(¨×);Ñ);Ó<ò 	4‰OˆAˆ|Ü'¨×(<Ñ(<Ó=ò 4‘
��7Ø˜'“>Ø×$Ñ$¤W¨Q°£]Õ3ñ4ð	4ð Ðr?   c                ó
  — t        | j                  «      D �cg c]  }g ‘Œ }}t        | j                  «      D ]C  \  }}t        |j                  «      D ]&  \  }}|€Œ	||   j                  t        ||«      «       Œ( ŒE |S c c}w r2   )rh   r‚  rÏ   r  rt   rø   ry  )r;   r`   rÜ   r�  rj   r-  s         r=   Ú&get_contraction_indices_to_ind_rel_posz<_EditArrayContraction.get_contraction_indices_to_ind_rel_pos  s�   € Ü@EÀd×FhÑFhÓ@iÖ3j¸1²BÐ3jÐÐ3jÜ(¨×);Ñ);Ó<ò 	C‰OˆAˆ|Ü# L×$8Ñ$8Ó9ò C‘��3Ø‘?Ø'¨Ñ,×3Ñ3´G¸A¸q³MÕBñCð	Cð #Ð"ùò 4ks   ˜	B c                óT   — d}| j                   D ]  }||j                  v sŒ|dz  }Œ |S )zJ
        Count the number of arguments that have the given index.
        r   rY   ©r  rt   )r;   rl  r,  r�  s       r=   Úcount_args_with_indexz+_EditArrayContraction.count_args_with_index!  s<   € ð ˆØ ×.Ñ.ò 	ˆLØ˜×,Ñ,Ò,Ø˜1‘‘ð	ð ˆr?   c                ó`   — | j                   D �cg c]  }||j                  v sŒ|‘Œ }}|S c c}w )zA
        Get a list of arguments having the given index.
        r®  )r;   rl  r`   r[  s       r=   Úget_args_with_indexz)_EditArrayContraction.get_args_with_index+  s3   € ð (,×'9Ñ'9ÖP !¸UÀaÇiÁiÒ=OšAÐPˆÐPØˆ
ùò Qs   �+£+c                ó¼   — t        «       }| j                  D ]4  }|j                  |j                  D �ch c]  }|€Œ|dk  sŒ|’Œ c}«       Œ6 t	        |«      S c c}w rQ   )rò   r  r   rt   r{   )r;   rk   r¶   r`   s       r=   Únumber_of_diagonal_indicesz0_EditArrayContraction.number_of_diagonal_indices2  sU   € ä‹uˆØ×%Ñ%ò 	MˆCØ�K‰K C§K¡KÖK˜q°1±=ÀQÈÃUšÒKÕLð	Mä�4‹yÐùò Ls   ³A
»A
ÁA
c                óV  — g }g }d}d}| j                   D ]Z  }g }|j                  D ]6  }|�|dk  r|j                  |«       |dz  }Œ!|j                  |«       |dz  }Œ8 |j                  |«       Œ\ |rt        d„ |D «       «      nd}|D �cg c]  }||z
  ‘Œ	 }}||gz   | _        y c c}w )Nr   rÇ   rY   c              3  ó:   K  — | ]  }|rt        |«      nd –— Œ y­w)rÇ   N)rR  r^   s     r=   ra   z@_EditArrayContraction.track_permutation_start.<locals>.<genexpr>I  s   è ø€ Ò?¨a¡”c˜!”f rÓ)Ñ?ùr„   )r  rt   rø   rR  rƒ  )	r;   rÒ   Ú	perm_diagr,  r£  r�  Úpermr`   Úmax_inds	            r=   Útrack_permutation_startz-_EditArrayContraction.track_permutation_start9  sÔ   € ØˆØˆ	ØˆØˆØ ×.Ñ.ò 
	%ˆLØˆDØ!×)Ñ)ò �Ø�=Ø˜1’uØ!×(Ñ(¨Ô2Ø  A™˜ØØ—‘˜GÔ$Ø˜1‘‘ðð ×Ñ˜tÕ$ð
	%ñ DO”#Ñ?°;Ô?Ô?ÐTVˆØ*3Ö4 Q�W˜q“[Ð4ˆ	Ð4Ø"-°°Ñ";ˆÕùò 5s   ÂB&c                óü   — | j                   j                  |«      }| j                   j                  |«      }| j                  |   j                  | j                  |   «       | j                  j	                  |«       y r2   )r  rl  rƒ  rÑ   r¿   )r;   ÚdestinationÚfrom_elementÚindex_destinationÚindex_elements        r=   Útrack_permutation_mergez-_EditArrayContraction.track_permutation_mergeM  si   € Ø ×.Ñ.×4Ñ4°[ÓAÐØ×*Ñ*×0Ñ0°Ó>ˆØ×ÑÐ 1Ñ2×9Ñ9¸$×:QÑ:QÐR_Ñ:`ÔaØ×Ñ×#Ñ# MÕ2r?   c                óº   — d}| j                   D ];  }t        |j                  D �cg c]  }|�Œ|‘Œ	 c}«      }||k(  r	|||z   fc S ||z  }Œ= t        d«      ‚c c}w )zw
        Return the range of the free indices of the arg as absolute positions
        among all free indices.
        r   úargument not found©r  r{   rt   rz   )r;   r¶   r,  r�  r`   Únumber_free_indicess         r=   Úget_absolute_free_rangez-_EditArrayContraction.get_absolute_free_rangeS  sv   € ð
 ˆØ ×.Ñ.ò 	+ˆLÜ"%°,×2FÑ2FÖ&T¨QÈ!É)¢qÒ&TÓ"UÐØ˜sÒ"Ø Ð*=Ñ =Ð=Ò=ØÐ*Ñ*‰Gð		+ô
 Ð-Ó.Ð.ùò	 'Us
   ¥A
­A
c                óŽ   — d}| j                   D ]*  }t        |j                  «      }||k(  r	|||z   fc S ||z  }Œ, t        d«      ‚)zc
        Return the absolute range of indices for arg, disregarding dummy
        indices.
        r   rÁ  rÂ  )r;   r¶   r,  r�  Únumber_indicess        r=   r  z(_EditArrayContraction.get_absolute_range`  s^   € ð
 ˆØ ×.Ñ.ò 	&ˆLÜ  ×!5Ñ!5Ó6ˆNØ˜sÒ"Ø ¨.Ñ 8Ð8Ò8Ø�~Ñ%‰Gð		&ô
 Ð-Ó.Ð.r?   N)r„  zAtyping.Union[ArrayContraction, ArrayDiagonal, ArrayTensorProduct])r¶   r  r‹  r  )rm   zlist[list[int]])rm   zlist[_IndPos])rm   zlist[list[_IndPos]])rl  rv  rm   rv  )rl  rv  rm   zlist[_ArgE])r»  r  r¼  r  )r¶   r  rm   ztyping.Tuple[int, int])rB   rC   rD   rn   rs  r  r  r‘  r˜  r  r›  r  r¬  r¯  r±  rp   r³  r¹  r¿  rÄ  r  rF   r?   r=   r  r  Z  sl   „ ñó7Fór4ò6òXògòAóF#óó#óóð ñó ðò<ó(3ó/ô/r?   r  c                óŠ  — t        | t        t        f«      ryt        | t        «      rt	        | j
                  «      S t        | t        «      r| j                  «       S t        | t        «      r| j                  S t        | t        «      r| j
                  }|€yt	        |«      S t        | d«      rt	        | j
                  «      S y)Nr  rÇ   r0   r   )r3   r   r#   r£   r{   r0   r    r¹  r!   r"   ry   rÔ  s     r=   rÀ   rÀ   n  s—   € Ü�$œ¤]Ð3Ô4ØÜ�$Ô-Ô.Ü�4—:‘:‹ÐÜ�$œ	Ô"Ø�y‰y‹{ÐÜ�$œÔ Ø�y‰yÐÜ�$œÔ$Ø—
‘
ˆØˆ=Øä�u“:ÐÜˆt�WÔÜ�4—:‘:‹ÐØr?   c                óX   — t        | t        «      r| j                  «       S t        | «      S r2   )r3   r£   r©   rÀ   ©rÔ   s    r=   rÙ   rÙ   ‚  s#   € Ü�$Ô-Ô.Ø�|‰|‹~ÐÜ�D‹>Ðr?   c                óR   — t        | t        «      r| j                  S t        | «      gS r2   )r3   r£   r¦   rÀ   rÉ  s    r=   rr  rr  ˆ  s$   € Ü�$Ô-Ô.Ø�}‰}Ðä˜“ÐÐr?   c                ó4   — t        | d«      r| j                  S y)Nr0   rF   )ry   r0   rÉ  s    r=   rÁ   rÁ   �  s   € Üˆt�WÔØ�z‰zÐØr?   c                óF   — t        | t        «      r| j                  «       S | S r2   )r3   rÐ   r\  rÉ  s    r=   r\  r\  •  s    € Ü�$œÔ$Ø×$Ñ$Ó&Ð&àˆr?   c                 ó   — t        | ddi|¤ŽS ©Nrº   T)r¸   ©r²   rÂ   s     r=   rÖ   rÖ   œ  s   € Ü˜tÐA°$ÐA¸&ÑAÐAr?   c                ó$   — t        | g|¢­ddi|¤ŽS rÎ  )rØ   )rÔ   rÜ   rÂ   s      r=   rÝ   rÝ      s   € Ü˜DÐTÐ#6ÒTÀTÐTÈVÑTÐTr?   c                ó$   — t        | g|¢­ddi|¤ŽS rÎ  )rÞ   )rÔ   rß   rÂ   s      r=   rà   rà   ¤  s   € Ü˜ÐNÐ 0ÒN¸tÐNÀvÑNÐNr?   c                ó    — t        | |fddi|¤ŽS rÎ  )rÐ   )rÔ   rÒ   rÂ   s      r=   rÕ   rÕ   ¨  s   € Ü�t˜[ÑF°tÐF¸vÑFÐFr?   c                 ó   — t        | ddi|¤ŽS rÎ  )rï   rÏ  s     r=   ra  ra  ¬  s   € Ü�TÐ7¨Ð7°Ñ7Ð7r?   c                ó   — t        | |«      S r2   )r7   )rÔ   rt   s     r=   rA   rA   °  s   € Ü˜˜gÓ&Ð&r?   )aÚ
__future__r   Úcollections.abcr4   rŸ   r   r   Ú	functoolsr   rf   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)   rÿ   r+   Ú sympy.combinatorics.permutationsr,   Úsympy.core.sympifyr-   r/   rH   r7   rŽ   rš   r£   r¸   rï   rÐ   rÞ   rË  rØ   rg  r  ry  r  rÀ   rÙ   rr  rÁ   r\  rÖ   rÝ   rà   rÕ   ra  rA   rF   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?   