§
    �Åji  ã                   ó  — d dl Z d dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZ  edd¬¦  «        Z edd¬¦  «        Zej                             ¦   «         Zg d	¢Zg d
¢Zg d¢Zd„ Zd„ ZdBd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d e)¦   «         fd e)d d d!d"¬#¦  «        fd$ e)d%¬&¦  «        fd' e)d d%d ¬(¦  «        fd) e)d*¬&¦  «        fd+ e)d%d ¬,¦  «        fd- e)¦   «         fd. e)d d!¬,¦  «        fd/ e)d d%¬,¦  «        fg	Z*d0„ Z+d1„ Z,d2„ Z-d3„ Z.d4„ Z/d5 e)¦   «         fd6 e)d%d*d7¬8¦  «        fd9 e)d!¬&¦  «        fd: e)¦   «         fd; e)d d!¬,¦  «        fd< e)¦   «         fgZ0d=„ Z1d>„ Z2d?„ Z3d@„ Z4dA„ Z5dS )Cé    N)ÚEinopsError)Ú_enumerate_directionsÚ	rearrangeÚreduceÚrepeat)ÚFLOAT_REDUCTIONS)Úcollect_test_backendsÚis_backend_testedF©ÚsymbolicÚlayersT)ú...->...za b c d e-> a b c d eza b c d e ...-> ... a b c d eza b c d e ...-> a ... b c d ez... a b c d e -> ... a b c d eza ... e-> a ... eza ... -> a ... za ... c d e -> a (...) c d e))za b c d e -> (a b) c d eza b ... -> (a b) ... )za b c d e -> a b (c d) ez... c d e -> ... (c d) e)za b c d e -> a b c d ez... -> ... )za b c d e -> (a b c d e)ú... ->  (...))za b c d e -> b (c d e) aza b ... -> b (...) a)za b c d e -> b (a c d) eza b ... e -> b (a ...) e))úa b c d e -> z	 ... ->  )za b c d e -> (e a)za ... e -> (e a))za b c d e -> d (a e)z a b c d e ... -> d (a e) )za b c d e -> (a b)z ... c d e  -> (...) c                  óx  — t          j        g d¢¦  «        } t          | d¦  «         t          j        t
          ¦  «        5  t          | d¦  «         d d d ¦  «         n# 1 swxY w Y   t          | d¦  «         t          j        t
          ¦  «        5  t          | d¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )N©é   r   r   r   r   za b c d ... ->  a b c ... dza b c d (...) ->  a b c ... dr   z(...) -> (...))ÚnpÚzerosr   ÚpytestÚraisesr   ©Úxs    úFC:\Projects\Historical\venv\Lib\site-packages\einops/tests/test_ops.pyÚ"test_collapsed_ellipsis_errors_outr   ,   s3  € Ý
Œ���Ñ!Ô!€AÝˆaÐ.Ñ/Ô/Ð/Ý	Œ•{Ñ	#Ô	#ð 6ð 6Ý�!Ð4Ñ5Ô5Ð5ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6õ ˆa�Ñ!Ô!Ð!Ý	Œ•{Ñ	#Ô	#ð 'ð 'Ý�!Ð%Ñ&Ô&Ð&ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'ð 'ð 's$   Á AÁA!Á$A!ÂB/Â/B3Â6B3c            
      ó(  — t          j        d¦  «                             g d¢¦  «        } t          D ]/}t          j        | t          | |¦  «        ¦  «        s
J |¦   «         ‚Œ0t          D ]8\  }}t          j        t          | |¦  «        t          | |¦  «        ¦  «        sJ ‚Œ9dD ]F}t          D ]<\  }}t          j        t          | ||¬¦  «        t          | ||¬¦  «        ¦  «        sJ ‚Œ=ŒGg t          ¢}t          D ]}| 	                    |¦  «         Œd S )NéÐ  ©é   é   é   é   é   ©ÚminÚmaxÚsum©Ú	reduction)
r   ÚarangeÚreshapeÚidentity_patternsÚarray_equalr   Úequivalent_rearrange_patternsÚequivalent_reduction_patternsr   Úextend)r   ÚpatternÚpattern1Úpattern2r)   Úall_rearrange_patternsÚpattern_pairss          r   Útest_ellipsis_ops_numpyr6   7   sN  € Ý
Œ	Ð#Ñ$Ô$×,Ò,¨_¨_¨_Ñ=Ô=€AÝ$ð Að AˆÝŒ~˜a¥¨1¨gÑ!6Ô!6Ñ7Ô7Ð@Ð@¸Ñ@Ô@Ð7Ð@å;ð Nð NÑˆ�(ÝŒ~�i¨¨8Ñ4Ô4µiÀÀ8Ñ6LÔ6LÑMÔMÐMÐMÐMÐMà*ð vð vˆ	Ý"?ð 	vð 	vÑˆH�hÝ”>¥&¨¨HÀ	Ð"JÑ"JÔ"JÍFÐSTÐV^ÐjsÐLtÑLtÔLtÑuÔuÐuÐuÐuÐuð	vð 2Õ0Ð1ÐÝ6ð 5ð 5ˆØ×%Ò% mÑ4Ô4Ð4Ð4ð5ð 5ó    r   c                 ól  ‡‡‡‡— ˆˆˆfd„} ||¦  «        }t           j        }dŠ|rNˆfd„|j        D ¦   «         }	|                      |	¬¦  «        }
 ||
¦  «        }|                      ||
|fg¦  «        }n3 ||                      |¦  «        ¦  «        }|                      |¦  «        } |||¦  «         dS )z�
    Helper to test result of operation (rearrange or transpose) against numpy
    if reduction == 'rearrange', rearrange op is tested, otherwise reduce
    c                 óJ   •— ‰dk    rt          | ‰fi ‰¤ŽS t          | ‰‰fi ‰¤ŽS )Nr   )r   r   )r   Úaxes_lengthsr1   r)   s    €€€r   Ú	operationz)check_op_against_numpy.<locals>.operationO   s@   ø€ Ø˜Ò#Ð#Ý˜Q Ð8Ð8¨<Ð8Ð8Ð8å˜!˜W iÐ@Ð@°<Ð@Ð@Ð@r7   g      à?c                 óR   •— g | ]#}t                                ¦   «         ‰k    r|nd ‘Œ$S ©N)ÚrngÚrandom)Ú.0ÚdÚp_none_dimensions     €r   ú
<listcomp>z*check_op_against_numpy.<locals>.<listcomp>Y   s0   ø€ ÐcÐcÐcÈA�SŸZšZ™\œ\Ð-=Ò=Ð=˜˜À4ÐcÐcÐcr7   )ÚshapeN)r   r-   rD   Úcreate_symbolÚeval_symbolÚ
from_numpyÚto_numpy)ÚbackendÚnumpy_inputr1   r:   r)   Úis_symbolicr;   Únumpy_resultÚcheck_equalÚsymbol_shapeÚsymbolÚresult_symbolÚbackend_resultrB   s     ```        @r   Úcheck_op_against_numpyrR   I   sÿ   øøøø€ ðAð Að Að Að Að Að Að �9˜[Ñ)Ô)€LÝ”.€KØÐØð :ØcÐcÐcÐcÐQ\ÔQbÐcÑcÔcˆØ×&Ò&¨\Ð&Ñ:Ô:ˆØ!˜	 &Ñ)Ô)ˆØ ×,Ò,¨]¸fÀkÐ=RÐ<SÑTÔTˆˆà"˜ 7×#5Ò#5°kÑ#BÔ#BÑCÔCˆØ ×)Ò)¨.Ñ9Ô9ˆà€K�˜nÑ-Ô-Ð-Ð-Ð-r7   c                  ój  — t          j        d¦  «                             g d¢¦  «        } dD ]†}t          |d¬¦  «        D ]r}t          t          t          j        t          Ž ¦  «        z   D ]}t          || |i d|¬¦  «         ŒdD ]-}t          j        t          Ž D ]}t          || |i ||¬¦  «         ŒŒ.ŒsŒ‡d	S )
z'Checking various patterns against numpyr   r   )TFFr   r   )r:   r)   rK   r$   N)r   r*   r+   r	   r,   ÚlistÚ	itertoolsÚchainr.   rR   r/   )r   rK   rI   r1   r)   s        r   Útest_ellipsis_ops_imperativerW   d   s  € å
Œ	Ð#Ñ$Ô$×,Ò,¨_¨_¨_Ñ=Ô=€AØ$ð ð ˆÝ,°kÈ%ÐPÑPÔPð 
	ð 
	ˆGÝ,­tµI´OÕEbÐ4cÑ/dÔ/dÑdð ð �Ý&Ø˜Q °bÀKÐ]hðñ ô ð ð ð 3ð ð �	Ý(œÕ0MÐNð ð �GÝ*Ø  G¸"È	Ð_jðñ ô ð ð ððð
	ðð r7   c                  óÊ  — dd l } ddlm} | j        dk     rt	          j        ¦   «          t          j        d¦  «                             g d¢¦  «        }t          t          t          j        t          Ž ¦  «        z   D ]h}t          ||¦  «        }|                     |                      |¦  «        |¦  «        }t          j        |                     |dz   ¦  «        |¦  «        sJ ‚Œid S )Nr   ©Ú	array_apiú2.0.0r   r   )ÚnumpyÚeinopsrZ   Ú__version__r   Úskipr   r*   r+   r,   rT   rU   rV   r.   r   Úfrom_dlpackr-   Úasnumpy)ÚxpÚAAr   r1   ÚexpectedÚresults         r   Útest_rearrange_array_apirf   u   så   € ØÐÐÐà&Ð&Ð&Ð&Ð&Ð&à	„~˜ÒÐÝŒ‰Œˆå
Œ	Ð#Ñ$Ô$×,Ò,¨_¨_¨_Ñ=Ô=€AÝ$¥t­I¬OÕ=ZÐ,[Ñ'\Ô'\Ñ\ð @ð @ˆÝ˜Q Ñ(Ô(ˆØ—’˜bŸnšn¨QÑ/Ô/°Ñ9Ô9ˆÝŒ~˜bŸjšj¨°!©Ñ4Ô4°hÑ?Ô?Ð?Ð?Ð?Ð?ð@ð @r7   c            
      óÖ  — dd l } ddlm} | j        dk     rt	          j        ¦   «          t          j        d¦  «                             g d¢¦  «        }t          j
        t          Ž D ]ƒ}dD ]~}t          |||¬¦  «        }|                     |                      |¦  «        ||¬¦  «        }t          j        |                     t          j        |dz   ¦  «        ¦  «        |¦  «        sJ ‚ŒŒ„d S )Nr   rY   r[   r   r   r$   r(   )r\   r]   rZ   r^   r   r_   r   r*   r+   rU   rV   r/   r   r`   r-   ra   Úasarray)rb   rc   r   r1   r)   rd   re   s          r   Útest_reduce_array_apiri   „   s  € ØÐÐÐà&Ð&Ð&Ð&Ð&Ð&à	„~˜ÒÐÝŒ‰Œˆå
Œ	Ð#Ñ$Ô$×,Ò,¨_¨_¨_Ñ=Ô=€AÝ”?Õ$AÐBð Pð PˆØ.ð 	Pð 	PˆIÝ˜a °IÐ>Ñ>Ô>ˆHØ—Y’Y˜rŸ~š~¨aÑ0Ô0°'ÀY�YÑOÔOˆFÝ”> "§*¢*­R¬Z¸À¹
Ñ-CÔ-CÑ"DÔ"DÀhÑOÔOÐOÐOÐOÐOð	PðPð Pr7   c                  óB  — g d¢} t          j        t          j        | ¦  «        ¦  «                             | ¦  «        }dD ]L}t	          ||¦  «        }t          t          j        ||¦  «        ¦  «        dk    sJ ‚|j        |j        k    sJ ‚ŒMt	          |d¦  «        }t          j        | 	                    ¦   «         | 	                    ¦   «         ¦  «        sJ ‚t	          |d¦  «        }t          j        ||¦  «        sJ ‚t	          |d¦  «        }t	          |d¦  «        }t          j        ||¦  «        sJ ‚t	          t	          |d¦  «        d	d
d¬¦  «        }t          j        ||¦  «        sJ ‚t          t          d| ¦  «        ¦  «        }t	          |dfi |¤Ž}t	          |d	fi |¤Ž}t          j        ||¦  «        sJ ‚t          j        d¦  «                             g d¢¦  «        }t	          |d¦  «        }|d         |d         k    sJ ‚|d         |d         k    sJ ‚d S )N)r   r   r    r"   é   é   )za b c d e f -> a b c d e fzb a c d e f -> a b d e f cúa b c d e f -> f e d c b aza b c d e f -> (f e) d (c b a)za b c d e f -> (f e d c b a)r   za b c d e f -> a (b) (c d e) fz0a aa aa1 a1a1 aaaa a11 -> a aa aa1 a1a1 aaaa a11rm   zf e d c b a -> a b c d e fza b c d e f -> (f d) c (e b) az(f d) c (e b) a -> a b c d e fr   r"   )ÚbrA   Úabcdefé   ©r   r    r!   za b c -> b c a)r   r   r    )r   r    r   )r   r   r   )r   r   r   )r   r*   Úprodr+   r   ÚlenÚ	setdiff1dÚdtyper-   ÚflattenÚdictÚzip)	rD   r   r1   re   Úresult1Úresult2ÚsizesÚtempÚx2s	            r   Ú test_rearrange_consistency_numpyr~   ”   s/  € ØÐÐ€EÝ
Œ	•"”'˜%‘.”.Ñ!Ô!×)Ò)¨%Ñ0Ô0€Aðð 	'ð 	'ˆõ ˜1˜gÑ&Ô&ˆÝ•2”<  6Ñ*Ô*Ñ+Ô+¨qÒ0Ð0Ð0Ð0ØŒ|˜qœwÒ&Ð&Ð&Ð&Ð&å�qÐ:Ñ;Ô;€FÝŒ>˜!Ÿ)š)™+œ+ v§~¢~Ñ'7Ô'7Ñ8Ô8Ð8Ð8Ð8å�qÐLÑMÔM€FÝŒ>˜!˜VÑ$Ô$Ð$Ð$Ð$å˜Ð7Ñ8Ô8€GÝ˜Ð7Ñ8Ô8€GÝŒ>˜' 7Ñ+Ô+Ð+Ð+Ð+å•y Ð$DÑEÔEÐGgÐklÐpqÐrÑrÔr€FÝŒ>˜!˜VÑ$Ô$Ð$Ð$Ð$å•�X˜uÑ%Ô%Ñ&Ô&€EÝ�QÐ8ÐBÐB¸EÐBÐB€DÝ�tÐ=ÐGÐGÀÐGÐG€FÝŒ>˜!˜VÑ$Ô$Ð$Ð$Ð$å	Œ�9Ñ	Ô	×	%Ò	% i i iÑ	0Ô	0€BÝ�rÐ+Ñ,Ô,€FØˆgŒ;˜& œ/Ò)Ð)Ð)Ð)ØˆgŒ;˜& œ/Ò)Ð)Ð)Ð)Ð)Ð)r7   c                  ó”  — t          dd¦  «        D �]} t          j        d| z  ¦  «                             dg| z  ¦  «        }t                               | ¦  «        }d                     d„ t          | ¦  «        D ¦   «         ¦  «        }d                     d„ |D ¦   «         ¦  «        }|dz   |z   }t          ||¦  «        }t                               ddd| g¦  «        D ]6}|t          |¦  «                 |t          ||         ¦  «                 k    sJ ‚Œ7�Œt          dd¦  «        D �] } t          j        d| z  ¦  «                             dg| z  ¦  «        }t                               | ¦  «        }d                     d	„ t          | ¦  «        d d d
…         D ¦   «         ¦  «        }d                     d„ |d d d
…         D ¦   «         ¦  «        }|dz   |z   }t          ||¦  «        }|j
        |j
        k    sJ ‚t          j        |¦  «        }t          |¦  «        D ]\  }	}
|||	z	  dz  |
z  z  }Œt          j        ||¦  «        sJ ‚�Œ"d S )Nr   é
   r   ú c              3   ó:   K  — | ]}d t          |¦  «        z   V — ŒdS ©ÚiN©Ústr©r@   Úaxiss     r   ú	<genexpr>z4test_rearrange_permutations_numpy.<locals>.<genexpr>¿   s,   è è € Ð"MÐ"M°t 3­¨T©¬¡?Ð"MÐ"MÐ"MÐ"MÐ"MÐ"Mr7   c              3   ó:   K  — | ]}d t          |¦  «        z   V — ŒdS rƒ   r…   r‡   s     r   r‰   z4test_rearrange_permutations_numpy.<locals>.<genexpr>À   s,   è è € Ð#LÐ#L¸ C­#¨d©)¬)¡OÐ#LÐ#LÐ#LÐ#LÐ#LÐ#Lr7   ú -> r   c              3   ó:   K  — | ]}d t          |¦  «        z   V — ŒdS rƒ   r…   r‡   s     r   r‰   z4test_rearrange_permutations_numpy.<locals>.<genexpr>Ê   s,   è è € Ð"SÐ"S°t 3­¨T©¬¡?Ð"SÐ"SÐ"SÐ"SÐ"SÐ"Sr7   éÿÿÿÿc              3   ó:   K  — | ]}d t          |¦  «        z   V — ŒdS rƒ   r…   r‡   s     r   r‰   z4test_rearrange_permutations_numpy.<locals>.<genexpr>Ë   s,   è è € Ð#RÐ#R¸ C­#¨d©)¬)¡OÐ#RÐ#RÐ#RÐ#RÐ#RÐ#Rr7   )Úranger   r*   r+   r>   ÚpermutationÚjoinr   ÚintegersÚtuplerD   Ú
zeros_likeÚ	enumerater-   )Ún_axesÚinputr�   Úleft_expressionÚright_expressionÚ
expressionre   ÚpickÚexpected_resultÚoriginal_axisÚresult_axiss              r   Ú!test_rearrange_permutations_numpyrŸ   º   sd  € å˜˜2‘,”,ð 	Jñ 	JˆÝ”	˜!˜V™)Ñ$Ô$×,Ò,¨a¨S°6©\Ñ:Ô:ˆÝ—o’o fÑ-Ô-ˆØŸ(š(Ð"MÐ"M½uÀV¹}¼}Ð"MÑ"MÔ"MÑMÔMˆØŸ8š8Ð#LÐ#LÀÐ#LÑ#LÔ#LÑLÔLÐØ$ vÑ-Ð0@Ñ@ˆ
Ý˜5 *Ñ-Ô-ˆå—L’L  A¨¨F |Ñ4Ô4ð 	Jð 	JˆDØ�˜t™œÔ%¨µ°d¸;Ô6GÑ0HÔ0HÔ)IÒIÐIÐIÐIÐIñ	Jõ ˜˜2‘,”,ð 7ñ 7ˆÝ”	˜!˜V™)Ñ$Ô$×,Ò,¨a¨S°6©\Ñ:Ô:ˆÝ—o’o fÑ-Ô-ˆØŸ(š(Ð"SÐ"S½uÀV¹}¼}ÈTÈTÈrÈTÔ?RÐ"SÑ"SÔ"SÑSÔSˆØŸ8š8Ð#RÐ#RÀÈDÈDÈbÈDÔ@QÐ#RÑ#RÔ#RÑRÔRÐØ$ vÑ-Ð0@Ñ@ˆ
Ý˜5 *Ñ-Ô-ˆØŒ|˜uœ{Ò*Ð*Ð*Ð*Ýœ-¨Ñ.Ô.ˆÝ*3°KÑ*@Ô*@ð 	Mð 	MÑ&ˆM˜;Ø ¨-Ñ!7¸1Ñ <ÀÑLÑLˆOˆOåŒ~˜f oÑ6Ô6Ð6Ð6Ð6Ñ6ð7ð 7r7   c                  ó  — t           D �]z} t          d| j        ¦  «         t          D �]Y}t	          j        dd¬¦  «                             g d¢¦  «        }|dv r*||                     d¦  «                             ¦   «         z  }di  t          ||¦  «        ¦   «         gd	i  t          ||¦  «        ¦   «         gd
t          dd¬¦  «         t          ||¦  «        ¦   «         gdi  t          ||¦  «        d¬¦  «                             ddd¦  «                             ddg¦  «        gdi  t          ||¦  «        d¬¦  «                             ddd¦  «                             ddg¦  «        gdi  t          ||¦  «        d¬¦  «                             ddd¦  «                             ddg¦  «        gdi  t          ||¦  «        d¬¦  «                             ddd¦  «                             dg¦  «        gdt          d¬¦  «        |gg}|D ]r\  }}}t          |                      |                     ¦   «         ¦  «        |fd|i|¤Ž}|                      |¦  «        }t	          j        ||¦  «        sJ d|› �¦   «         ‚Œs�Œ[�Œ|d S )NúReduction tests for r   Úint64©ru   r   ©Úmeanrr   Úfloat64r   ú	a ... -> z(a1 a2) ... (e1 e2) -> r   r   )Úa1Úe2úa b c d e -> (e c) a©r   r    ©rˆ   r   r�   úa ... c d e -> (e c) aúa b c d e ... -> (e c) aúa b c d e -> (e c a)ú(a a2) ... -> (a2 a) ...©Úa2r)   z
Failed at )Úimp_op_backendsÚprintÚframework_nameÚ
REDUCTIONSr   r*   r+   Úastyper¥   Úgetattrrw   Ú	transposer   rG   ÚcopyrH   Úallclose)rI   r)   r—   Ú
test_casesr1   r:   rœ   re   s           r   Útest_reduction_imperativesr½   Ö   sã  € Ý"ð  Tñ  TˆÝÐ$ gÔ&<Ñ=Ô=Ð=Ý#ð 	Tñ 	TˆIå”IÐ/°wÐ?Ñ?Ô?×GÒGÈÈÈÑXÔXˆEØÐ,Ð,Ð,Ø §¢¨YÑ 7Ô 7× <Ò <Ñ >Ô >Ñ>�à  "Ð&?¥g¨e°YÑ&?Ô&?Ñ&AÔ&AÐBØ˜bÐ";¥'¨%°Ñ";Ô";Ñ"=Ô"=Ð>Ø*­D°A¸!Ð,<Ñ,<Ô,<Ð>W½gÀeÈYÑ>WÔ>WÑ>YÔ>YÐZà*ØØ-•G˜E 9Ñ-Ô-°6Ð:Ñ:Ô:×DÒDÀQÈÈ1ÑMÔM×UÒUÐWYÐ[\ÐV]Ñ^Ô^ðð -ØØ-•G˜E 9Ñ-Ô-°6Ð:Ñ:Ô:×DÒDÀQÈÈ1ÑMÔM×UÒUÐWYÐ[\ÐV]Ñ^Ô^ðð /ØØ-•G˜E 9Ñ-Ô-°6Ð:Ñ:Ô:×DÒDÀQÈÈ1ÑMÔM×UÒUÐWYÐ[\ÐV]Ñ^Ô^ðð
 (¨Ð-F­W°U¸IÑ-FÔ-FÈFÐ-SÑ-SÔ-S×-]Ò-]Ð^_ÐabÐdeÑ-fÔ-f×-nÒ-nÐprÐosÑ-tÔ-tÐuØ+­T°Q¨Z©Z¬Z¸Ð?ð)ˆJð, ;Eð Tð TÑ6�˜ Ý × 2Ò 2°5·:²:±<´<Ñ @Ô @À'ÐoÐoÐU^ÐoÐbnÐoÐo�Ø ×)Ò)¨&Ñ1Ô1�Ý”{ 6¨?Ñ;Ô;ÐSÐSÐ=SÈ'Ð=SÐ=SÑSÔSÐ;ÐSñTñ7	Tð Tð  Tr7   c                  ój  — t           D �])} t          d| j        ¦  «         t          D �]}t	          j        dd¬¦  «                             g d¢¦  «        }||                     d¦  «                             ¦   «         z  }di  t          ||¦  «        ¦   «         gdi  t          ||¦  «        ¦   «         gd	t          d
d
¬¦  «         t          ||¦  «        ¦   «         gdi  t          ||¦  «        d¬¦  «                             dd
d¦  «                             ddg¦  «        gdi  t          ||¦  «        d¬¦  «                             dd
d¦  «                             ddg¦  «        gdi  t          ||¦  «        d¬¦  «                             dd
d¦  «                             ddg¦  «        gdi  t          ||¦  «        d¬¦  «                             dd
d¦  «                             dg¦  «        gdt          d
¬¦  «        |gg}|D �]$\  }}}|j        d„ |j        D ¦   «         g}|D ]W}|                      |¦  «        }	t          |	|fd|i|¤Ž}
|                      |
|	|fg¦  «        }t	          j        ||¦  «        sJ ‚ŒX	 g }i |¥}t#          d|j        ¦  «        D ]9\  }}||v r|                     d ¦  «         |||<   Œ$|                     |¦  «         Œ:|                      |¦  «        }	t          |	|fd|i|¤Ž}
|                      |
|	|fg¦  «        }t	          j        ||¦  «        sJ ‚�Œ&�Œ
�Œ+d S )Nr¡   r   r¢   r£   r   r¦   r   r§   z(a a2) ... (e e2) -> r   )r²   r©   rª   r«   r¬   r   r   r�   r­   r®   r¯   r°   r±   c                 ó   — g | ]}d ‘ŒS r=   © )r@   Ú_s     r   rC   z+test_reduction_symbolic.<locals>.<listcomp>  s   € Ð'BÐ'BÐ'B°¨Ð'BÐ'BÐ'Br7   r)   TÚabcde)Úsym_op_backendsr´   rµ   r¶   r   r*   r+   r·   r¥   r¸   rw   r¹   rD   rE   r   rF   r»   rx   Úappend)rI   r)   r—   r¼   r1   r:   Úexpected_numpy_resultÚshapesrD   ÚsymÚ
result_symre   Ú_axes_lengthsrˆ   Úlengths                  r   Útest_reduction_symbolicrË   ú   sÓ  € Ý"ð 1Fñ 1FˆÝÐ$ gÔ&<Ñ=Ô=Ð=Ý#ð /	Fñ /	FˆIÝ”IÐ/°wÐ?Ñ?Ô?×GÒGÈÈÈÑXÔXˆEØ˜EŸLšL¨Ñ3Ô3×8Ò8Ñ:Ô:Ñ:ˆEð ! "Ð&?¥g¨e°YÑ&?Ô&?Ñ&AÔ&AÐBØ˜bÐ";¥'¨%°Ñ";Ô";Ñ"=Ô"=Ð>Ø(­$°!¸Ð*:Ñ*:Ô*:Ð<U½GÀEÈ9Ñ<UÔ<UÑ<WÔ<WÐXà*ØØ-•G˜E 9Ñ-Ô-°6Ð:Ñ:Ô:×DÒDÀQÈÈ1ÑMÔM×UÒUÐWYÐ[\ÐV]Ñ^Ô^ðð -ØØ-•G˜E 9Ñ-Ô-°6Ð:Ñ:Ô:×DÒDÀQÈÈ1ÑMÔM×UÒUÐWYÐ[\ÐV]Ñ^Ô^ðð /ØØ-•G˜E 9Ñ-Ô-°6Ð:Ñ:Ô:×DÒDÀQÈÈ1ÑMÔM×UÒUÐWYÐ[\ÐV]Ñ^Ô^ðð
 (¨Ð-F­W°U¸IÑ-FÔ-FÈFÐ-SÑ-SÔ-S×-]Ò-]Ð^_ÐabÐdeÑ-fÔ-f×-nÒ-nÐprÐosÑ-tÔ-tÐuØ+­T°Q¨Z©Z¬Z¸Ð?ð)ˆJð, AKð Fñ FÑ<�˜Ð'<Øœ+Ð'BÐ'B°e´kÐ'BÑ'BÔ'BÐC�Ø#ð Fð F�EØ!×/Ò/°Ñ6Ô6�CÝ!'¨¨WÐ!ZÐ!ZÀ	Ð!ZÈ\Ð!ZÐ!Z�JØ$×0Ò0°¸sÀE¸l¸^ÑLÔL�FÝœ; vÐ/DÑEÔEÐEÐEÐEÐEðFØ�EØ$4 |Ð$4�MÝ(+¨G°U´[Ñ(AÔ(Að 1ð 1™˜˜fà 7˜?˜?Ø!ŸLšL¨Ñ.Ô.Ð.Ø28˜M¨$Ñ/Ð/à!ŸLšL¨Ñ0Ô0Ð0Ð0Ø!×/Ò/°Ñ6Ô6�CÝ!'¨¨WÐ![Ð![À	Ð![È]Ð![Ð![�JØ$×0Ò0°¸sÀE¸l¸^ÑLÔL�FÝœ; vÐ/DÑEÔEÐEÐEÐEÑEñ+Fñ5/	Fð1Fð 1Fr7   c                  ó.  — t           D �]} t          d| j        ¦  «         g t          ¢d‘D �]æ}d}t          j        }|dv rd}t          j        }d}d| j        v rd}d	| j        v rd
}t          |¦  «        D �]š}t           	                    dd|¬¦  «        }t           
                    |¦  «        }|dk    rdnt           	                    |dz   ¦  «        }d                     d„ t          |¦  «        D ¦   «         ¦  «        }	d                     d„ ||d …         D ¦   «         ¦  «        }
|	dz   |
z   }t	          j        ddt	          j        |¦  «        z   |¬¦  «                             |¦  «        }|dk    r||                     ¦   «         z  }t!          |||¬¦  «        }|                     |¦  «        }|dk    r4 t%          ||¦  «        t'          t          |¦  «        ¦  «        ¬¦  «        } |||¦  «        sJ ‚t)          | |||i d¬¦  «         �Œœ�Œè�Œd S )NzStress-testing reduction for r   r¢   r¤   r¦   rl   Úoneflowrk   Úpaddleé	   r   r!   ©Úsizer   r   r�   c              3   ó:   K  — | ]}d t          |¦  «        z   V — ŒdS ©r   Nr…   ©r@   r„   s     r   r‰   z4test_reduction_stress_imperatives.<locals>.<genexpr>A  s,   è è € ÐDÐD° ¥c¨!¡f¤f¡ÐDÐDÐDÐDÐDÐDr7   c              3   ó:   K  — | ]}d t          |¦  «        z   V — ŒdS rÓ   r…   rÔ   s     r   r‰   z4test_reduction_stress_imperatives.<locals>.<genexpr>B  s,   è è € Ð MÐ M°! ¥s¨1¡v¤v¡Ð MÐ MÐ MÐ MÐ MÐ Mr7   ú->r£   rr   r(   r¬   F)r)   r:   rK   )r³   r´   rµ   r¶   r   r-   r»   r�   r>   r’   r�   r‘   r*   rr   r+   r¥   r   r¹   r¸   r“   rR   )rI   r)   ru   ÚcoincideÚmax_dimr–   rD   r�   ÚskippedÚleftÚrightr1   r   ry   rz   s                  r   Ú!test_reduction_stress_imperativesrÜ   /  sF  € Ý"ð uñ uˆÝÐ-¨wÔ/EÑFÔFÐFØ3�:Ð3 {Ð3ð 	uñ 	uˆIØˆEÝ”~ˆHØÐ,Ð,Ð,Ø!�Ýœ;�ØˆGØ˜GÔ2Ð2Ð2Ø�Ø˜7Ô1Ð1Ð1Ø�Ý ™.œ.ð uñ u�ÝŸš Q¨°˜Ñ7Ô7�Ý!Ÿošo¨fÑ5Ô5�Ø(¨KÒ7Ð7˜!˜!½S¿\º\È&ÐSTÉ*Ñ=UÔ=U�Ø—x’xÐDÐDµe¸F±m´mÐDÑDÔDÑDÔD�ØŸšÐ MÐ M°{À7À8À8Ô7LÐ MÑ MÔ MÑMÔM�Ø ™+¨Ñ-�Ý”I˜a ¥R¤W¨U¡^¤^Ñ!3¸5ÐAÑAÔA×IÒIÈ%ÑPÔP�Ø Ò&Ð&Ø˜Ÿš™œ‘M�AÝ   G°yÐAÑAÔA�ØŸ+š+ kÑ2Ô2�Ø˜Q’;�;Ø9�g g¨yÑ9Ô9½uÅUÈ7Á^Ä^Ñ?TÔ?TÐUÑUÔU�GØ�x ¨Ñ1Ô1Ð1Ð1Ð1Ý& w°°7ÀiÐ^`ÐnsÐtÑtÔtÐtÑtñuñ	uðuð ur7   c                  óh  — t          j        d¦  «                             g d¢¦  «                             d¦  «        } | |                      ¦   «         z  } d„ }d„ }d„ }d„ }dd	lm}m}m}m	} |j
        ||j
        ||j
        ||j
        |i}	t          D ] }
|
j
        |	vrŒ|	|
j
                 }|
                     | ¦  «        }t          D ]j\  }}t          d
|
j
        ||¦  «         t          | ||¬¦  «        }t          |||¬¦  «        }t          j        ||
                     |¦  «        ¦  «        sJ ‚ŒkŒ¡d S )Nr   r   Úfloat32c                 ó,   — |                       |¦  «        S r=   )Ú	logsumexp)r   Útuple_of_axess     r   Úlogsumexp_torchzAtest_reduction_with_callable_imperatives.<locals>.logsumexp_torchS  s   € Ø�{Š{˜=Ñ)Ô)Ð)r7   c                 ó6   — dd l }|                     | |¦  «        S ©Nr   )Ú
tensorflowÚreduce_logsumexp)r   rá   Útfs      r   Úlogsumexp_tfz>test_reduction_with_callable_imperatives.<locals>.logsumexp_tfV  s$   € ØÐÐÐà×"Ò" 1 mÑ4Ô4Ð4r7   c                 ó@   — dd l mc m} |                     | |¦  «        S rä   )Útensorflow.keras.backendÚkerasrI   rà   )r   rá   Úks      r   Úlogsumexp_keraszAtest_reduction_with_callable_imperatives.<locals>.logsumexp_keras[  s1   € Ø,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,à�{Š{˜1˜mÑ,Ô,Ð,r7   c                 óâ   — |                       |¦  «        }| |                       |d¬¦  «        z
  }t          j        |¦  «        }t          j        ||¬¦  «        }t          j        |¦  «        |z   S )NT)Úkeepdimsr¬   )r&   r   Úexpr'   Úlog)r   rá   ÚminusedÚys       r   Úlogsumexp_numpyzAtest_reduction_with_callable_imperatives.<locals>.logsumexp_numpy`  sa   € à—%’%˜Ñ&Ô&ˆØ�—’�m¨d�Ñ3Ô3Ñ3ˆÝŒF�1‰IŒIˆÝŒF�1˜=Ð)Ñ)Ô)ˆÝŒv�a‰yŒy˜7Ñ"Ð"r7   r   )ÚNumpyBackendÚTensorflowBackendÚTFKerasBackendÚTorchBackendz!Test reduction with callable for r(   )r   r*   r+   r·   r&   Úeinops._backendsrõ   rö   r÷   rø   rµ   r³   rG   r/   r´   r   r»   rH   )Úx_numpyrâ   rè   rí   rô   rõ   rö   r÷   rø   Úbackend2callbackrI   Úbackend_callbackÚ	x_backendr2   r3   Úoutput_numpyÚoutput_backends                    r   Ú(test_reduction_with_callable_imperativesr   O  s±  € ÝŒiÐ)Ñ*Ô*×2Ò2°?°?°?ÑCÔC×JÒJÈ9ÑUÔU€GØˆw�{Š{‰}Œ}Ñ€Gð*ð *ð *ð5ð 5ð 5ð
-ð -ð -ð
#ð #ð #ð _Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ð^ð 	Ô# _ØÔ(¨,ØÔ% ØÔ# _ð	Ðõ #ð ð ˆØÔ!Ð)9Ð9Ð9Øà+¨GÔ,BÔCÐà×&Ò& wÑ/Ô/ˆ	Ý"?ð 	ð 	ÑˆH�hÝÐ5°wÔ7MÈxÐYaÑbÔbÐbÝ! '¨8¸ÐOÑOÔOˆLÝ# I¨xÐCSÐTÑTÔTˆNÝ”;ØØ× Ò  Ñ0Ô0ñô ð ð ð ð ð		ðð r7   c                  óD  ‡— t           D �]Št          d‰j        ¦  «         g dgg d¢g d¢fD ]ñ} t          j        t          j        | ¦  «        ¦  «                             | ¦  «        }t          |¦  «        }t          ‰                     |¦  «        ¦  «        }t          |¦  «        t          |¦  «        cxk    rt          | ¦  «        k    sn J ‚ˆfd„|D ¦   «         }t          ||¦  «        D ].\  }}|j        |j        k    sJ ‚t          j        ||¦  «        sJ ‚Œ/Œò�Œd S )Nztesting directions forr   )r   r   r   ©r   r    r"   rk   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS rÀ   )rH   )r@   ÚaxrI   s     €r   rC   z/test_enumerating_directions.<locals>.<listcomp>Š  s'   ø€ Ð:Ð:Ð:¨b�W×%Ò% bÑ)Ô)Ð:Ð:Ð:r7   )r³   r´   rµ   r   r*   rr   r+   r   rG   rs   rx   rD   r»   )rD   r   Úaxes1Úaxes2Úax1Úax2rI   s         @r   Útest_enumerating_directionsr	  ‚  sF  ø€ Ý"ð 
-ñ 
-ˆÝÐ&¨Ô(>Ñ?Ô?Ð?Ø˜1˜#˜y˜y˜y¨,¨,¨,Ð7ð 	-ð 	-ˆEÝ”	�"œ' %™.œ.Ñ)Ô)×1Ò1°%Ñ8Ô8ˆAÝ)¨!Ñ,Ô,ˆEÝ)¨'×*<Ò*<¸QÑ*?Ô*?Ñ@Ô@ˆEÝ�u‘:”:¥ U¡¤Ð9Ð9Ò9Ð9­s°5©z¬zÒ9Ð9Ð9Ð9Ð9Ð9Ø:Ð:Ð:Ð:°EÐ:Ñ:Ô:ˆEÝ  uÑ-Ô-ð -ð -‘��SØ”y C¤IÒ-Ð-Ð-Ð-Ý”{ 3¨Ñ,Ô,Ð,Ð,Ð,Ð,ð-ñ	-ð
-ð 
-r7   c            	      óT  ‡‡— t           D �]Št          d‰j        ¦  «         dD �] } g dgddgg d¢dgdz  g}|D ]êŠˆfd„t          | ¦  «        D ¦   «         }ˆfd„|D ¦   «         }t	          j        |¦  «        }t          |d¦  «        }t          |d¦  «        }t	          j        ||¦  «        sJ ‚t	          j        |‰                     |¦  «        ¦  «        sJ ‚t          |d	¦  «        }t          |d	¦  «        }t	          j        |‰                     |¦  «        ¦  «        sJ ‚Œë�Œ�Œd S )
Nztesting shapes for )r   r   r"   r   r  r#   c           	      óŠ   •— g | ]?}t          j        ||t          j        ‰¦  «        z   ¦  «                             ‰¦  «        ‘Œ@S rÀ   )r   r*   rr   r+   )r@   r„   rD   s     €r   rC   z4test_concatenations_and_stacking.<locals>.<listcomp>–  s@   ø€ ÐdÐdÐdÈq�2œ9 Q¨­B¬G°E©N¬NÑ(:Ñ;Ô;×CÒCÀEÑJÔJÐdÐdÐdr7   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS rÀ   )rG   )r@   ÚarrayrI   s     €r   rC   z4test_concatenations_and_stacking.<locals>.<listcomp>—  s'   ø€ ÐJÐJÐJ¸˜7×-Ò-¨eÑ4Ô4ÐJÐJÐJr7   r   zb ... -> ... b)	r³   r´   rµ   r�   r   rh   r   r-   rH   )	Ún_arraysrÆ   Úarrays1Úarrays2Úresult0ry   rz   rI   rD   s	          @@r   Ú test_concatenations_and_stackingr  �  ss  øø€ Ý"ð Jñ JˆÝÐ# WÔ%;Ñ<Ô<Ð<Ø!ð 	Jñ 	JˆHØ˜1˜#  1˜v | | |°a°S¸1±WÐ=ˆFØð Jð J�ØdÐdÐdÐdÕTYÐZbÑTcÔTcÐdÑdÔd�ØJÐJÐJÐJÀ'ÐJÑJÔJ�Ýœ* WÑ-Ô-�Ý# G¨ZÑ8Ô8�Ý# G¨ZÑ8Ô8�Ý”~ g¨wÑ7Ô7Ð7Ð7Ð7Ý”~ g¨w×/?Ò/?ÀÑ/HÔ/HÑIÔIÐIÐIÐIå# GÐ-=Ñ>Ô>�Ý# GÐ-=Ñ>Ô>�Ý”~ g¨w×/?Ò/?ÀÑ/HÔ/HÑIÔIÐIÐIÐIÐIñJñ	JðJð Jr7   c                  óø  — t           D �]p} | dv rŒt          j        dd¦  «                             g d¢¦  «                             d¦  «        }i }t
          D ]©}|                     |¦  «        }t          |d¦  «        sŒ(t          |d| ¬¦  «        }t          |d	| ¬¦  «        }t          |d
| d¬¦  «        }t          |d| ¬¦  «        }| 	                    ¦   «          | 
                    |j        ¦  «        }	|	||j        <   Œªt          d|                     ¦   «         ¦  «         |                     ¦   «         D ]A\  }
}|                     ¦   «         D ]'\  }}t          j        ||¦  «        sJ |
|dg¦   «         ‚Œ(ŒB�Œrd S )N)ÚanyÚallr   é   rq   rÞ   Úgradza b c -> c ar(   z
c a -> a cza (c1 c2) -> ar   )r)   Úc1z... -> zcomparing gradients forzprovided different gradients)r¶   r   r*   r+   r·   r³   rG   Úhasattrr   ÚbackwardrH   r  rµ   r´   ÚkeysÚitemsr»   )r)   r   ÚresultsrI   Úy0Úy1Úy2Úy3Úy4r  Úname1Úgrad1Úname2Úgrad2s                 r   Útest_gradients_imperativesr'  £  s©  € åð añ aˆ	Ø˜Ð&Ð&ØÝŒI�a˜Ñ'Ô'×/Ò/°	°	°	Ñ:Ô:×AÒAÀ)ÑLÔLˆØˆÝ&ð 	3ð 	3ˆGØ×#Ò# AÑ&Ô&ˆBÝ˜2˜vÑ&Ô&ð Øå˜˜N°iÐ@Ñ@Ô@ˆBÝ˜˜L°IÐ>Ñ>Ô>ˆBÝ˜Ð,¸	ÀaÐHÑHÔHˆBÝ˜˜I°Ð;Ñ;Ô;ˆBà�KŠK‰MŒMˆMØ×#Ò# B¤GÑ,Ô,ˆDØ.2ˆG�GÔ*Ñ+Ð+åÐ'¨¯ª©¬Ñ8Ô8Ð8Ø#ŸMšM™OœOð 	að 	a‰LˆE�5Ø '§¢¡¤ð að a‘��uÝ”{ 5¨%Ñ0Ô0Ð`Ð`°5¸%ÐA_Ð2`Ñ`Ô`Ð0Ð`ðañ	að)að ar7   c                  ó„  — t           D ]·} t          d| j        ¦  «         t          j        dd¬¦  «                             g d¢¦  «        }g d¢}|D ]n}t          j        ||¦  «        }|                      |¦  «        }|                      ||¦  «        }|                      |¦  «        }t          j	        ||¦  «        sJ ‚ŒoŒ¸d S ©NzTiling tests for é   r¢   r£   )r   r   r    r   r"   )r   )r   r   r   r    r   )r    r   r   r!   r   )
r³   r´   rµ   r   r*   r+   ÚtilerG   rH   r-   )rI   r—   r¼   Úrepeatsrd   Ú	convertedÚrepeatedre   s           r   Útest_tiling_imperativesr/  ¾  sá   € Ý"ð 4ð 4ˆÝÐ! 7Ô#9Ñ:Ô:Ð:Ý”	˜)¨7Ð3Ñ3Ô3×;Ò;¸O¸O¸OÑLÔLˆð
ð 
ð 
ˆ
ð
 "ð 	4ð 	4ˆGÝ”w˜u gÑ.Ô.ˆHØ×*Ò*¨5Ñ1Ô1ˆIØ—|’| I¨wÑ7Ô7ˆHØ×%Ò% hÑ/Ô/ˆFÝ”> &¨(Ñ3Ô3Ð3Ð3Ð3Ð3ð	4ð4ð 4r7   c                  ót  — t           D �].} t          d| j        ¦  «         t          j        dd¬¦  «                             g d¢¦  «        }g d¢}|D ]ä}t          j        ||¦  «        }|                      |j        ¦  «        }|  	                    |                      ||¦  «        ||gg¦  «        }t          j
        ||¦  «        sJ ‚|                      d gt          |j        ¦  «        z  ¦  «        }|  	                    |                      ||¦  «        ||gg¦  «        }t          j
        ||¦  «        sJ ‚Œå�Œ0d S r)  )rÃ   r´   rµ   r   r*   r+   r+  rE   rD   rF   r-   rs   )rI   r—   r¼   r,  rd   rÇ   re   s          r   Útest_tiling_symbolicr1  Ï  sK  € Ý"ð 4ñ 4ˆÝÐ! 7Ô#9Ñ:Ô:Ð:Ý”	˜)¨7Ð3Ñ3Ô3×;Ò;¸O¸O¸OÑLÔLˆð
ð 
ð 
ˆ
ð
 "ð 	4ð 	4ˆGÝ”w˜u gÑ.Ô.ˆHØ×'Ò'¨¬Ñ4Ô4ˆCØ×(Ò(¨¯ª°c¸7Ñ)CÔ)CÀsÈEÀlÀ^ÑTÔTˆFÝ”> &¨(Ñ3Ô3Ð3Ð3Ð3à×'Ò'¨¨µ°U´[Ñ1AÔ1AÑ(AÑBÔBˆCØ×(Ò(¨¯ª°c¸7Ñ)CÔ)CÀsÈEÀlÀ^ÑTÔTˆFÝ”> &¨(Ñ3Ô3Ð3Ð3Ð3Ð3ñ	4ð4ð 4r7   za b c -> c a bza b c -> (c copy a b)r   r    r"   )rº   Úarn   Úcza b c -> (a copy) b c r   ©rº   za b c -> (c a) (copy1 b copy2))r2  Úcopy1Úcopy2za ...  -> a ... copyr!   z... c -> ... (copy1 c copy2))r5  r6  z...  -> ... z ...  -> copy1 ... copy2 za b c  -> copy1 a copy2 b c () c                 óþ   — |                      d¦  «        \  }}|dz   |z   }t          | |fi |¤Ž}t          ||fddi|¤Ž}t          ||fddi|¤Ž}t          j        | |¦  «        sJ ‚t          j        | |¦  «        sJ ‚dS )z*Checks repeat pattern by running reductionrÖ   r)   r%   r&   N)Úsplitr   r   r   r-   )	r   Úrepeat_patternr{   rÚ   rÛ   Úreduce_patternr.  Úreduced_minÚreduced_maxs	            r   Úcheck_reversionr=  ñ  s¬   € à ×&Ò& tÑ,Ô,�K€Dˆ%Ø˜T‘\ DÑ(€NÝ�a˜Ð1Ð1¨5Ð1Ð1€HÝ˜ >ÐLÐL¸UÐLÀeÐLÐL€KÝ˜ >ÐLÐL¸UÐLÀeÐLÐL€KÝŒ>˜!˜[Ñ)Ô)Ð)Ð)Ð)ÝŒ>˜!˜[Ñ)Ô)Ð)Ð)Ð)Ð)Ð)r7   c                  óì   — t          j        d¦  «                             g d¢¦  «        } t          | dd¬¦  «        }t          j        | d          |¦  «        sJ ‚t
          D ]\  }}t          | |fi |¤Ž Œd S )Nr*  ©r   r    r"   za b c -> copy a b c r   r4  )r   r*   r+   r   r-   Úrepeat_test_casesr=  )r   Úx1r1   Úaxis_dimensionss       r   Útest_repeat_numpyrC  ü  s�   € å
Œ	�)ÑÔ×$Ò$ Y Y YÑ/Ô/€AÝ	�Ð)°Ð	2Ñ	2Ô	2€BÝŒ>˜!˜Dœ' 2Ñ&Ô&Ð&Ð&Ð&Ý$5ð 7ð 7Ñ ˆ�Ý˜˜7Ð6Ð6 oÐ6Ð6Ð6Ð6ð7ð 7r7   c                  ój  — t          j        d¦  «                             g d¢¦  «        } t          D ]�}t	          d|j        ¦  «         t          D ]b\  }}t          | |fi |¤Ž}|                     | ¦  «        }t          ||fi |¤Ž}| 	                    |¦  «        }t          j
        ||¦  «        sJ ‚ŒcŒ‚d S ©Nr*  r?  zRepeat tests for )r   r*   r+   r³   r´   rµ   r@  r   rG   rH   r-   )r   rI   r1   rB  rd   r-  r.  re   s           r   Útest_repeat_imperativesrF    sØ   € Ý
Œ	�)ÑÔ×$Ò$ Y Y YÑ/Ô/€AÝ"ð 4ð 4ˆÝÐ! 7Ô#9Ñ:Ô:Ð:å(9ð 	4ð 	4Ñ$ˆG�_Ý˜a Ð<Ð<¨OÐ<Ð<ˆHØ×*Ò*¨1Ñ-Ô-ˆIÝ˜i¨ÐDÐD°OÐDÐDˆHØ×%Ò% hÑ/Ô/ˆFÝ”> &¨(Ñ3Ô3Ð3Ð3Ð3Ð3ð	4ð4ð 4r7   c            	      óx  — t          j        d¦  «                             g d¢¦  «        } t          D ]ˆ}t	          d|j        ¦  «         t          D ]i\  }}t          | |fi |¤Ž}|                     | j	        ¦  «        }| 
                    t          ||fi |¤Ž|| gg¦  «        }t          j        ||¦  «        sJ ‚ŒjŒ‰d S rE  )r   r*   r+   rÃ   r´   rµ   r@  r   rE   rD   rF   r-   )r   rI   r1   rB  rd   rÇ   re   s          r   Útest_repeat_symbolicrH    sá   € Ý
Œ	�)ÑÔ×$Ò$ Y Y YÑ/Ô/€Aå"ð 4ð 4ˆÝÐ! 7Ô#9Ñ:Ô:Ð:å(9ð 	4ð 	4Ñ$ˆG�_Ý˜a Ð<Ð<¨OÐ<Ð<ˆHà×'Ò'¨¬Ñ0Ô0ˆCØ×(Ò(­°°WÐ)PÐ)PÀÐ)PÐ)PÐTWÐYZÐS[ÐR\Ñ]Ô]ˆFÝ”> &¨(Ñ3Ô3Ð3Ð3Ð3Ð3ð	4ð4ð 4r7   c                  ó|  — dd l } ddlm} | j        dk     rt	          j        ¦   «          t          j        d¦  «                             g d¢¦  «        }t          D ]b\  }}t          ||fi |¤Ž} |j
        |                      |¦  «        |fi |¤Ž}t          j        |                     |dz   ¦  «        |¦  «        sJ ‚Œcd S )Nr   rY   r[   r*  r?  )r\   r]   rZ   r^   r   r_   r   r*   r+   r@  r   r`   r-   ra   )rb   rc   r   r1   rB  rd   re   s          r   Útest_repeat_array_apirJ     sä   € ØÐÐÐà&Ð&Ð&Ð&Ð&Ð&à	„~˜ÒÐÝŒ‰Œˆå
Œ	�)ÑÔ×$Ò$ Y Y YÑ/Ô/€Aå$5ð @ð @Ñ ˆ�Ý˜!˜WÐ8Ð8¨Ð8Ð8ˆà�”˜2Ÿ>š>¨!Ñ,Ô,¨gÐIÐI¸ÐIÐIˆÝŒ~˜bŸjšj¨°!©Ñ4Ô4°hÑ?Ô?Ð?Ð?Ð?Ð?ð	@ð @r7   za b c d -> c a d bza b c d -> (c 2 d a b)r#   )r2  r3  rA   z1 b c d -> (d copy 1) 3 b c z1 ...  -> 3 ... z"() ... d -> 1 (copy1 d copy2) ... z$1 b c d -> (1 1) (1 b) 2 c 3 d (1 1)c                  óŽ   — t          j        d¦  «                             g d¢¦  «        } t          D ]\  }}t	          | |fi |¤Ž Œd S )Né0   )r   r   r!   r#   )r   r*   r+   Útest_cases_repeat_anonymousr=  )r   r1   rB  s      r   Útest_anonymous_axesrN  <  s\   € Ý
Œ	�-Ñ Ô ×(Ò(¨¨¨Ñ6Ô6€AÝ$?ð 7ð 7Ñ ˆ�Ý˜˜7Ð6Ð6 oÐ6Ð6Ð6Ð6ð7ð 7r7   c                  óä  — t          j        d¦  «                             g d¢¦  «        } t          j        t	          t          | ¦  «        d¦  «        t	          | d¦  «        ¦  «        sJ ‚t          j        t          t          | ¦  «        dd¦  «        t          | dd¦  «        ¦  «        sJ ‚t          j        t          t          | ¦  «        dd¬¦  «        t          | dd¬¦  «        ¦  «        sJ ‚d S )	Nr   r   z... -> (...)za ... e -> (...)r%   z...  -> b (...)r    )rn   )r   r*   r+   r-   r   rT   r   r   r   s    r   Útest_list_inputsrP  B  sþ   € Ý
Œ	Ð#Ñ$Ô$×,Ò,¨_¨_¨_Ñ=Ô=€AåŒ>Ý•$�q‘'”'˜>Ñ*Ô*Ý�!�^Ñ$Ô$ñô ð ð ð õ Œ>Ý�t�A‰wŒwÐ*¨EÑ2Ô2ÝˆqÐ$ eÑ,Ô,ñô ð ð ð õ Œ>Ý�t�A‰wŒwÐ)¨QÐ/Ñ/Ô/ÝˆqÐ# qÐ)Ñ)Ô)ñô ð ð ð ð ð r7   c                  óš  — t          d¦  «        st          j        ¦   «          dd l} d| j        j        _        d„ }|                      |dd¬¦  «        }|                      |dd¬¦  «        }|                      g d¢¬¦  «        }|  	                     ||¦  «         ||¦  «        d	¬
¦  «        sJ ‚|  	                     ||¦  «         ||¦  «        d	¬
¦  «        sJ ‚|                      g d¢¬¦  «        }|  	                     ||¦  «         ||¦  «        d	¬
¦  «        sJ ‚|  	                     ||¦  «         ||¦  «        d	¬
¦  «        sJ ‚d S )NÚtorchr   Tc                 ól   — | j         ^}}}}t          | dd¬¦  «        } t          | dd|dz  ¬¦  «        } | S )Nz"(a a2) b c ... -> b (c a2) (a ...)r   r±   zb ca2 A -> b Ar'   )Úca2)rD   r   r   )r   r2  rn   r3  Úothers        r   Úfunc1z4test_torch_compile_with_dynamic_shape.<locals>.func1[  sF   € àœ'ˆˆˆ1ˆa�%Ý�aÐ=À!ÐDÑDÔDˆå�1Ð&¨°1°q±5Ð9Ñ9Ô9ˆØˆr7   F)ÚdynamicÚ	fullgraph)r!   r"   r#   r    rÐ   gñhãˆµøä>)Úatol)r#   r    r!   r   r    )
r
   r   r_   rR  Ú_dynamoÚconfigÚverboseÚcompileÚrandnr»   )rR  rV  Úfunc1_compiled_staticÚfunc1_compiled_dynamicr   s        r   Ú%test_torch_compile_with_dynamic_shapera  S  sr  € Ý˜WÑ%Ô%ð ÝŒ‰ŒˆØ€L€L€Lð $(€E„MÔÔ ðð ð ð "ŸMšM¨%¸È$˜MÑOÔOÐØ"Ÿ]š]¨5¸$È$˜]ÑOÔOÐà�Š˜˜˜ˆÑ&Ô&€AØ�>Š>Ð/Ð/°Ñ2Ô2°E°E¸!±H´HÀ4ˆ>ÑHÔHÐHÐHÐHØ�>Š>Ð0Ð0°Ñ3Ô3°U°U¸1±X´XÀDˆ>ÑIÔIÐIÐIÐIà�Š˜˜˜ˆÑ)Ô)€AØ�>Š>Ð/Ð/°Ñ2Ô2°E°E¸!±H´HÀ4ˆ>ÑHÔHÐHÐHÐHØ�>Š>Ð0Ð0°Ñ3Ô3°U°U¸1±X´XÀDˆ>ÑIÔIÐIÐIÐIÐIÐIr7   c                 óT   ‡ — t          ˆ fd„t          d¦  «        D ¦   «         ¦  «        S )Nc              3   ó(   •K  — | ]}‰|z	  d z  V — ŒdS )r   NrÀ   )r@   r„   r   s     €r   r‰   zbit_count.<locals>.<genexpr>q  s+   øè è € Ð/Ð/ ��Q‘˜!‰|Ð/Ð/Ð/Ð/Ð/Ð/r7   é   )r'   r�   r   s   `r   Ú	bit_countre  p  s,   ø€ ÝÐ/Ð/Ð/Ð/¥U¨2¡Y¤YÐ/Ñ/Ô/Ñ/Ô/Ð/r7   c                  ó  — t          j        d„ t          d¦  «        D ¦   «         ¦  «                             dgdz  ¦  «        } t          D �]=}t          d|j        ¦  «         t          d¦  «        D �]F}t          j        | |d¬¦  «        }t          j        | |d¬¦  «        }t          j	        ||¦  «        rJ ‚t          d¦  «        }t          |¦  «        }t          |¦  «        }d	||<   d
                     |¦  «        dz   d
                     |¦  «        z   }t          |                     | ¦  «        |d¬¦  «        }	t          |                     | ¦  «        |d¬¦  «        }
t          j	        ||                     |	¦  «        ¦  «        sJ ‚t          j	        ||                     |
¦  «        ¦  «        sJ ‚�ŒHt          j        | dd¬¦  «        }t          j        | dd¬¦  «        }d}t          |                     | ¦  «        |d¬¦  «        }	t          |                     | ¦  «        |d¬¦  «        }
t          j	        ||                     |	¦  «        ¦  «        sJ ‚t          j	        ||                     |
¦  «        ¦  «        sJ ‚�Œ?dS )z5Checks that any/all reduction works in all frameworksc                 ó:   — g | ]}t          |¦  «        d z  dk    ‘ŒS )r   r   )re  )r@   r   s     r   rC   z7test_reduction_imperatives_booleans.<locals>.<listcomp>v  s(   € ÐDÐDÐD°1�	 !™œ qÑ(¨QÒ.ÐDÐDÐDr7   é@   r   r#   zReduction any/all tests for T)rˆ   rï   ro   Ú1r�   r‹   r  r(   r  )r   r   za b ... -> 1 1 ...N)r   rh   r�   r+   r³   r´   rµ   r  r  r-   rT   r‘   r   rG   rH   )Úx_nprI   rˆ   Úexpected_result_anyÚexpected_result_allÚaxesÚaxes_inÚaxes_outr1   Úres_anyÚres_alls              r   Ú#test_reduction_imperatives_booleansrr  t  s{  € åŒ:ÐDÐD½¸d¹¼ÐDÑDÔDÑEÔE×MÒMÈqÈcÐTUÉgÑVÔV€DÝ"ð Nñ NˆÝÐ,¨gÔ.DÑEÔEÐEå˜!‘H”Hð 	Rñ 	RˆDÝ"$¤&¨°DÀ4Ð"HÑ"HÔ"HÐÝ"$¤&¨°DÀ4Ð"HÑ"HÔ"HÐÝ”~Ð&9Ð;NÑOÔOÐOÐOÐOå˜‘>”>ˆDÝ˜4‘j”jˆGÝ˜D‘z”zˆHØ ˆH�T‰NØ—x’x Ñ(Ô(¨FÑ2°c·h²h¸xÑ6HÔ6HÑIˆGå˜W×/Ò/°Ñ5Ô5°wÈ%ÐPÑPÔPˆGÝ˜W×/Ò/°Ñ5Ô5°wÈ%ÐPÑPÔPˆGå”>Ð"5°w×7GÒ7GÈÑ7PÔ7PÑQÔQÐQÐQÐQÝ”>Ð"5°w×7GÒ7GÈÑ7PÔ7PÑQÔQÐQÐQÐQÑQõ !œf T°ÀÐFÑFÔFÐÝ œf T°ÀÐFÑFÔFÐØ&ˆÝ˜×+Ò+¨DÑ1Ô1°7ÀeÐLÑLÔLˆÝ˜×+Ò+¨DÑ1Ô1°7ÀeÐLÑLÔLˆÝŒ~Ð1°7×3CÒ3CÀGÑ3LÔ3LÑMÔMÐMÐMÐMÝŒ~Ð1°7×3CÒ3CÀGÑ3LÔ3LÑMÔMÐMÐMÐMÑMð7Nð Nr7   )r   F)6rU   r\   r   r   r]   r   Úeinops.einopsr   r   r   r   Úeinops.testsr   r¶   r	   r
   r³   rÃ   r?   Údefault_rngr>   r,   r.   r/   r   r6   rR   rW   rf   ri   r~   rŸ   r½   rË   rÜ   r   r	  r  r'  r/  r1  rw   r@  r=  rC  rF  rH  rJ  rM  rN  rP  ra  re  rr  rÀ   r7   r   ú<module>rv     sû  ðØ Ð Ð Ð à Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aà'Ð'°¸uÐEÑEÔE€Ø'Ð'°¸eÐDÑDÔD€à„i×ÒÑÔ€ð	ð 	ð 	Ð ð!ð !ð !Ð ð!ð !ð !Ð ð'ð 'ð 'ð5ð 5ð 5ð$.ð .ð .ð .ð6ð ð ð"@ð @ð @ðPð Pð Pð #*ð #*ð #*ðL7ð 7ð 7ð8!Tð !Tð !TðH2Fð 2Fð 2Fðjuð uð uð@0ð 0ð 0ðf-ð -ð -ðJð Jð Jð&að að að64ð 4ð 4ð"4ð 4ð 4ð, �t�t‘v”vÐØ˜d˜d¨¨Q°!°qÐ9Ñ9Ô9Ð:Ø˜t˜t¨˜|™|œ|Ð,Ø% t t¨a°qÀÐ'BÑ'BÔ'BÐCØ˜T˜T q˜\™\œ\Ð*Ø# T T°¸Ð%;Ñ%;Ô%;Ð<Ø�T�T‘V”VÐØ  $ $¨Q°aÐ"8Ñ"8Ô"8Ð9Ø&¨¨°1¸AÐ(>Ñ(>Ô(>Ð?ðÐ ð*ð *ð *ð7ð 7ð 7ð
4ð 
4ð 
4ð4ð 4ð 4ð@ð @ð @ð& ˜4˜4™6œ6Ð"Ø˜t˜t a¨1°Ð2Ñ2Ô2Ð3Ø# T T¨q \¡\¤\Ð2Ø˜˜™œÐ Ø)¨4¨4°a¸qÐ+AÑ+AÔ+AÐBØ+¨T¨T©V¬VÐ4ðÐ ð7ð 7ð 7ðð ð ð"Jð Jð Jð:0ð 0ð 0ðNð Nð Nð Nð Nr7   