§
    �ÅjÑ4  ã                   ó0  — d dl Z d dlZd dlmZ d dlmZ d dlZ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 d dlmZmZ dZej                             ¦   «         Zd„ Zd	„ Zd
„ Z edd¬¦  «        Z ej        g d¢¦  «        Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%g  edd¬¦  «        ¢ edd¬¦  «        ¢Z&d„ e&D ¦   «         Z&ej'         (                    de&¦  «        d„ ¦   «         Z)ej'         (                    de&¦  «        d„ ¦   «         Z*d„ Z+d„ Z,d„ Z-dZ.d„ Z/dS ) é    N)Útestmod)ÚPath)ÚAbstractBackend)Ú_optimize_transformationÚparse_shapeÚ	rearrange)Úcollect_test_backendsÚis_backend_testedzAlex Rogozhnikovc                  óÂ   — t          t          j        dt          t          ¬¦  «        ¬¦  «         t          t          j        dt          t          ¬¦  «        ¬¦  «         d S )NT)Únp)Úraise_on_errorÚ
extraglobs)r   ÚeinopsÚlayersÚdictr   © ó    úHC:\Projects\Historical\venv\Lib\site-packages\einops/tests/test_other.pyÚtest_doctests_examplesr      sF   € å�FŒM¨$½4Å2¸;¹;¼;ÐGÑGÔGÐGÝ�FŒM¨$½4Å2¸;¹;¼;ÐGÑGÔGÐGÐGÐGr   c                  ó@  — ddl m}  t           | ¦   «         ¦  «        }g }g }t          j        ¦   «         }|rB|                     ¦   «         }||                     ¦   «         z  }|                     |¦  «         |°B|D ]d}|j        |vrŒ	  |¦   «          |                     |j        ¦  «         Œ2# t          $ r&}|                     |j        |f¦  «         Y d}~Œ]d}~ww xY wt          |¦  «        dk    s
J |¦   «         ‚t          |¦  «        dk    sJ d|›d�¦   «         ‚dS )z™
    This test will fail if some of backends are not installed or can't be imported
    Other tests will just work and only test installed backends.
    é   )Úparse_backends_to_testNr   z%did not instantiate backends_to_test=z, they won't be tested)Ú r   Úsetr   Ú__subclasses__ÚpopÚappendÚframework_nameÚremoveÚ	ExceptionÚlen)r   Úbackends_to_testÚerrorsÚbackend_subclassesÚbackendsÚbackendÚbackend_typeÚes           r   Útest_backends_installedr)      sy  € ð
 )Ð(Ð(Ð(Ð(Ð(åÐ1Ð1Ñ3Ô3Ñ4Ô4ÐØ€FàÐÝÔ-Ñ/Ô/€HØ
ð +Ø—,’,‘.”.ˆØ�G×*Ò*Ñ,Ô,Ñ,ˆØ×!Ò! 'Ñ*Ô*Ð*ð ð +ð
 +ð <ð <ˆØÔ&Ð.>Ð>Ð>Øð	<àˆL‰NŒNˆNØ×#Ò# LÔ$?Ñ@Ô@Ð@Ð@øÝð 	<ð 	<ð 	<Ø�MŠM˜<Ô6¸Ð:Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;øøøøð	<øøøåˆv‰;Œ;˜!ÒÐÐ˜VÑÔÐÝÐÑ Ô  AÒ%Ð%Ð%Ð'gÐ>NÐ'gÐ'gÐ'gÑ%Ô%Ð%Ð%Ð%s   Â$B-Â-
CÂ7CÃCc                  óÀ  — t          d¦  «         d„ t          d¦  «        D ¦   «         } | d„ t          d¦  «        D ¦   «         z  } | g d¢gz  } | g d¢gz  } | D �]}t          d¦  «        D �]ñ}t          |¦  «        }t                               d	d
|¬¦  «                             dg¦  «        }|d d …         }t                               d	|dz   ¦  «        }t          t                               |¦  «        d |…         ¦  «        }t                               ||z
  ¦  «        }t                               d	dd¬¦  «        }	t          ||||	¦  «        x\  }
}}}}t          j
        |	|¦  «        sJ ‚|                     |¦  «                             |¬¦  «                             |¦  «                             dg¦  «        }|                     |
¦  «                             |¬¦  «                             |¦  «                             dg¦  «        }t          j
        ||¦  «        sJ ‚t          |Ž }t          ||¦  «        D ]\  }}t          j
        ||¦  «        sJ ‚Œ�Œó�Œd S )NzTesting optimizationsc                 ó   — g | ]}d g|z  ‘Œ	S )é   r   ©Ú.0Ún_dimensionss     r   ú
<listcomp>z7test_optimize_transformations_numpy.<locals>.<listcomp>:   s   € Ð?Ð?Ð? \ˆqˆc�LÑ Ð?Ð?Ð?r   é   c                 ó   — g | ]}d g|z  ‘Œ	S )é   r   r-   s     r   r0   z7test_optimize_transformations_numpy.<locals>.<listcomp>;   s   € Ð?Ð?Ð? l�ˆs�\Ñ!Ð?Ð?Ð?r   é   )r,   r3   é   é   )r,   r3   r5   r6   é   é   r5   r   i   )Úsizeéÿÿÿÿr   i   iM  )Úaxis)ÚprintÚranger!   ÚrngÚintegersÚreshapeÚtupleÚpermutationr   r   Úarray_equalÚsumÚ	transposeÚzip)ÚshapesÚshapeÚ_attemptr/   ÚxÚ
init_shapeÚ	n_reducedÚreduced_axesÚaxes_reorderingÚfinal_shapeÚinit_shape2Úreduced_axes2Úaxes_reordering2Úfinal_shape2Úcombination2Úresult1Úresult2Úcombination3ÚaÚbs                       r   Ú#test_optimize_transformations_numpyrZ   8   sq  € Ý	Ð
!Ñ"Ô"Ð"Ø?Ð?µU¸2±Y´YÐ?Ñ?Ô?€FØ
Ð?Ð?µe¸A±h´hÐ?Ñ?Ô?Ñ?€FØ
ˆ|ˆ|ˆ|ˆnÑ€FØ
Ð#Ð#Ð#Ð$Ñ$€Fàð ,ñ ,ˆÝ˜a™œð 	,ñ 	,ˆHÝ˜u™:œ:ˆLÝ—’˜Q ¨E�Ñ2Ô2×:Ò:¸B¸4Ñ@Ô@ˆAØ˜q˜q˜qœˆJÝŸš Q¨°qÑ(8Ñ9Ô9ˆIÝ ¥§¢°Ñ!>Ô!>¸zÀ	¸zÔ!JÑKÔKˆLÝ!Ÿošo¨l¸YÑ.FÑGÔGˆOÝŸ,š, q¨$°S˜,Ñ9Ô9ˆKåXpØ˜L¨/¸;ñYô Yð ÑFˆK˜Ð(8¸,Èõ ”> +¨|Ñ<Ô<Ð<Ð<Ð<Ø—i’i 
Ñ+Ô+×/Ò/°\Ð/ÑBÔB×LÒLÈ_Ñ]Ô]×eÒeÐgiÐfjÑkÔkˆGØ—i’i Ñ,Ô,×0Ò0°mÐ0ÑDÔD×NÒNÐO_Ñ`Ô`×hÒhÐjlÐimÑnÔnˆGÝ”> '¨7Ñ3Ô3Ð3Ð3Ð3õ 4°\ÐBˆLÝ˜L¨,Ñ7Ô7ð ,ð ,‘��1Ý”~ a¨Ñ+Ô+Ð+Ð+Ð+Ð+ñ,ñ)	,ð,ð ,r   F©Úsymbolicr   ©é
   é   é   é(   c                  óF  — t           D ]˜} t          d| j        ¦  «         t          t          d¦  «        }t          |                      t          ¦  «        d¦  «        }||cxk    rt          dddd¬¦  «        k    sn J ‚|t          dddd¬¦  «        cxk    r|k    sn J ‚Œ™d S )	NzShape parsing for úa b c dr^   r_   r`   ra   )rX   rY   ÚcÚdr   )Ú_IMPERATIVE_BACKENDSr<   r   r   Úx_npÚ
from_numpyr   ©r&   Úparsed1Úparsed2s      r   Útest_parse_shape_imperativerl   ]   sÎ   € Ý'ð Að AˆÝÐ" GÔ$:Ñ;Ô;Ð;Ý�d IÑ.Ô.ˆÝ˜g×0Ò0µÑ6Ô6¸	ÑBÔBˆØ˜'ÐAÐAÒAÐA¥T¨B°"¸¸bÐ%AÑ%AÔ%AÒAÐAÐAÐAÐAÐAØ�$  b¨B°"Ð5Ñ5Ô5Ð@Ð@Ò@Ð@¸Ò@Ð@Ð@Ð@Ð@Ð@Ð@ðAð Ar   c                  óÎ   — t           D ]\} t          t          d¦  «        }t          |                      t          ¦  «        d¦  «        }||cxk    rt	          ¦   «         k    sn J ‚Œ]d S )Nz_ _ _ _©rf   r   rg   rh   r   ri   s      r   Útest_underscorero   f   ss   € Ý'ð ,ð ,ˆÝ�d IÑ.Ô.ˆÝ˜g×0Ò0µÑ6Ô6¸	ÑBÔBˆØ˜'Ð+Ð+Ò+Ð+¥T¡V¤VÒ+Ð+Ð+Ð+Ð+Ð+Ð+ð,ð ,r   c                  óÒ   — t           D ]^} t          t          d¦  «        }t          |                      t          ¦  «        d¦  «        }||cxk    rt	          d¬¦  «        k    sn J ‚Œ_d S )Nz_ _ _ hellora   )Úhellorn   ri   s      r   Útest_underscore_onerr   m   sw   € Ý'ð 4ð 4ˆÝ�d MÑ2Ô2ˆÝ˜g×0Ò0µÑ6Ô6¸ÑFÔFˆØ˜'Ð3Ð3Ò3Ð3¥T° ^¡^¤^Ò3Ð3Ð3Ð3Ð3Ð3Ð3ð4ð 4r   c                  óÔ   — t           D ]_} t          t          d¦  «        }t          |                      t          ¦  «        d¦  «        }||cxk    rt	          dd¬¦  «        k    sn J ‚Œ`d S )Nz_ _ a1 a1a111ar`   ra   )Úa1Úa1a111arn   ri   s      r   Útest_underscore_severalrv   t   s~   € Ý'ð =ð =ˆÝ�dÐ$4Ñ5Ô5ˆÝ˜g×0Ò0µÑ6Ô6Ð8HÑIÔIˆØ˜'Ð<Ð<Ò<Ð<¥T¨R¸Ð%<Ñ%<Ô%<Ò<Ð<Ð<Ð<Ð<Ð<Ð<ð=ð =r   c                  ól  — t          j        t          j        ¦  «        5  t	          t
          d¦  «         d d d ¦  «         n# 1 swxY w Y   t          D ]`} t          j        t          j        ¦  «        5  t	          |                      t
          ¦  «        d¦  «         d d d ¦  «         n# 1 swxY w Y   Œad S )Nza a b b)ÚpytestÚraisesr   ÚEinopsErrorr   rg   rf   rh   )r&   s    r   Útest_repeatingr{   {   s  € Ý	Œ•vÔ)Ñ	*Ô	*ð %ð %Ý•D˜)Ñ$Ô$Ð$ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %õ (ð =ð =ˆÝŒ]�6Ô-Ñ.Ô.ð 	=ð 	=Ý˜×*Ò*­4Ñ0Ô0°)Ñ<Ô<Ð<ð	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=øð=ð =s#   ŸAÁAÁAÁ3)B(Â(B,	Â/B,	c                  ó”  — t           D �]>} ddgdt          ¦   «         fdgdt          d¬¦  «        fddgdt          d¬¦  «        fg d¢dt          d¬¦  «        fg d¢dt          d	¬¦  «        fdgd
t          d¬¦  «        fddgd
t          d¬¦  «        fg d¢d
t          d¬¦  «        fg d¢d
t          d¬¦  «        fg d¢dt          dd	¬¦  «        fdd	gdt          dd	¬¦  «        ffD ]^\  }}}t          j        |¦  «        }t	          ||¦  «        }t	          |                      |¦  «        |¦  «        }||cxk    r|k    sn J ‚Œ_�Œ@d S )Nr^   r_   ú...ú... a©rX   ©r^   r_   r`   r`   r]   ra   úa ...ú a ... b©rX   rY   ©rf   r   r   Úonesr   rh   ©r&   rH   ÚpatternÚexpectedrJ   rj   rk   s          r   Útest_ellipsisr‰   „   s•  € Ý'ð 2ñ 2ˆà�"ˆX�u�d™fœfÐ%ØˆT�7�D 2˜J™JœJÐ'Ø�"ˆX�w¥ r 
¡
¤
Ð+Øˆ\ˆ\˜7¥D¨2 J¡J¤JÐ/ØÐÐ˜w­¨r¨
©
¬
Ð3ØˆT�7�D 2˜J™JœJÐ'Ø�"ˆX�w¥ r 
¡
¤
Ð+Øˆ\ˆ\˜7¥D¨2 J¡J¤JÐ/ØÐÐ˜w­¨r¨
©
¬
Ð3ØÐÐ˜z­4°"¸Ð+;Ñ+;Ô+;Ð<Ø�"ˆX�z¥4¨"°Ð#3Ñ#3Ô#3Ð4ð)
ð 	2ð 	2Ñ$ˆE�7˜Hõ ”˜‘”ˆAÝ! ! WÑ-Ô-ˆGÝ! '×"4Ò"4°QÑ"7Ô"7¸ÑAÔAˆGØ˜gÐ1Ð1Ò1Ð1¨Ò1Ð1Ð1Ð1Ð1Ð1Ð1ñ!	2ð2ð 2r   c                  óT  — t           D ]Ÿ} g d¢dt          d¬¦  «        fg d¢dt          d¬¦  «        fg d¢dt          d¬¦  «        ffD ]^\  }}}t          j        |¦  «        }t	          ||¦  «        }t	          |                      |¦  «        |¦  «        }||cxk    r|k    sn J ‚Œ_Œ d S )	N©r   r,   r3   é   z1 2 3 arŒ   r   )r^   r   r,   za 1 2r^   za () 2r„   r†   s          r   Útest_parse_with_anonymous_axesr�   ™   sÝ   € Ý'ð 	2ð 	2ˆàˆ\ˆ\˜9¥d¨Q i¡i¤iÐ0ØˆZˆZ˜¥$¨ *¡*¤*Ð-ØˆZˆZ˜¥4¨" :¡:¤:Ð.ð)
ð 	2ð 	2Ñ$ˆE�7˜Hõ
 ”˜‘”ˆAÝ! ! WÑ-Ô-ˆGÝ! '×"4Ò"4°QÑ"7Ô"7¸ÑAÔAˆGØ˜gÐ1Ð1Ò1Ð1¨Ò1Ð1Ð1Ð1Ð1Ð1Ð1ð	2ð	2ð 	2r   c                  ó6  — t           D ]�} g d¢dfg d¢dfg d¢dfg d¢dfg d¢dfg d¢dffD ]m\  }}t          j        t          ¦  «        5  t	          j        |¦  «        }t          |                      |¦  «        |¦  «         d d d ¦  «         n# 1 swxY w Y   ŒnŒ‘d S )Nr‹   za b cz2 a b cza b c ()z	a b c d eza b c d e ...)rf   rx   ry   ÚRuntimeErrorr   r…   r   rh   )r&   rH   r‡   rJ   s       r   Útest_failuresr�   ¦   s  € Ý'ð <ð <ˆð ˆ\ˆ\˜7Ð#Øˆ\ˆ\˜9Ð%Øˆ\ˆ\˜:Ð&Øˆ\ˆ\˜;Ð'Øˆ\ˆ\˜?Ð+Øˆ\ˆ\˜:Ð&ð
ð 
	<ð 
	<‰NˆE�7õ ”�|Ñ,Ô,ð <ð <Ý”G˜E‘N”N�Ý˜G×.Ò.¨qÑ1Ô1°7Ñ;Ô;Ð;ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <øð
	<ð<ð <s   Á8BÂBÂBTc                 ó(   — g | ]}|j         d k    ¯|‘ŒS )ztensorflow.keras)r   )r.   r&   s     r   r0   r0   ½   s&   € ÐpÐpÐp 'À7ÔCYÐ]oÒCoÐCo�gÐCoÐCoÐCor   r&   c           
      ó’  — g d¢g d¢g d¢fD �]9}t          d| j        ›d|›�¦  «         |                      |¦  «        }t          |d¦  «        }i }|                     ¦   «         D ]L\  }}t          |t          ¦  «        r|n,|                      ||t          j	        g d¢¦  «        fg¦  «        ||<   ŒMt          |¦  «         t          |dfi t          |d¦  «        ¤d	d
i¤Ž}|                      ||t          j	        g d¢¦  «        fg¦  «        }t          |j        ¦  «         |j        dk    sJ ‚t          j        |d¦  «        sJ ‚�Œ;d S )Nr]   )r^   r_   NN©NNNNz-special shape parsing backend.framework_name=z input_shape=rc   z*a b (c1 c2) (d1 d2) -> (a b d1) c1 (c2 d2)za b c1 _Úd2r,   )i   r`   r,   r   )r<   r   Úcreate_symbolr   ÚitemsÚ
isinstanceÚintÚeval_symbolr   Úzerosr   rH   Úallclose)	r&   Úinput_shapeÚinput_symbolÚshape_placeholderÚ	out_shapeÚnameÚsymbolÚresult_placeholderÚresults	            r   Útest_parse_shape_symbolicr¤   À   s¶  € ð 	ÐÐØÐÐØ Ð Ð ðð &ñ &ˆõ
 	ÐO wÔ'=ÐOÐOÀÐOÐOÑPÔPÐPØ×,Ò,¨[Ñ9Ô9ˆå'¨°iÑ@Ô@ÐØˆ	Ø-×3Ò3Ñ5Ô5ð 	ð 	‰LˆD�&õ ˜f¥cÑ*Ô*ð_��à×(Ò(¨°<ÅÄÐJZÐJZÐJZÑA[ÔA[Ð2\Ð1]Ñ^Ô^ð �d‰OˆOõ
 	ˆiÑÔÐÝ&ØÐFð
ð 
ÝJUÐVbÐdnÑJoÔJoð
ð 
Øtuð
ð 
ð 
Ðð ×$Ò$Ð%7¸<ÍÌÐRbÐRbÐRbÑIcÔIcÐ:dÐ9eÑfÔfˆÝˆfŒlÑÔÐØŒ|Ð8Ò8Ð8Ð8Ð8ÝŒ{˜6 1Ñ%Ô%Ð%Ð%Ð%Ñ%ð/&ð &r   c                 ó0  — ddgd d gdt          ¦   «         fdgd gdt          d¬¦  «        fddgd d gdt          d¬¦  «        fg d¢g d¢dt          d¬¦  «        fg d	¢g d
¢dt          d¬¦  «        fdgd gdt          d¬¦  «        fddgd d gdt          d¬¦  «        fg d¢g d¢dt          d¬¦  «        fg d	¢g d
¢dt          d¬¦  «        fg d	¢g d
¢dt          dd¬¦  «        fddgd d gdt          dd¬¦  «        ffD ]™\  }}}}|                      |¦  «        }t          ||¦  «        }i }|                     ¦   «         D ]N\  }}	t	          |	t
          ¦  «        r|	||<   Œ |                      |	|t          j        |¦  «        fg¦  «        ||<   ŒO||k    sJ ‚Œšd S )Nr^   r_   r}   r~   r   r€   )NNNr`   r]   r“   ra   r�   r‚   rƒ   z	 a ... b )	r   r•   r   r–   r—   r˜   r™   r   rš   )
r&   Ústatic_shaperH   r‡   rˆ   r�   rž   rŸ   r    r¡   s
             r   Ú"test_parse_shape_symbolic_ellipsisr§   Ü   s  € ð ˆbˆ�D˜$�< ­©¬Ð/Ø
ˆ�ˆv�w¥ r 
¡
¤
Ð+Ø
ˆbˆ�D˜$�< ­$°¨*©*¬*Ð5Ø	ˆˆÐ)Ð)Ð)¨7µD¸2°J±J´JÐ?Ø	Ð	Ð	Ð3Ð3Ð3°W½dÀR¸j¹j¼jÐIØ
ˆ�ˆv�w¥ r 
¡
¤
Ð+Ø
ˆbˆ�D˜$�< ­$°¨*©*¬*Ð5Ø	ˆˆÐ)Ð)Ð)¨7µD¸2°J±J´JÐ?Ø	Ð	Ð	Ð3Ð3Ð3°W½dÀR¸j¹j¼jÐIØ	Ð	Ð	Ð3Ð3Ð3°ZÅÈÈbÐAQÑAQÔAQÐRØ
ˆbˆ�D˜$�< ­d°R¸2Ð.>Ñ.>Ô.>Ð?ð3ð %ð %Ñ.ˆ�e˜W hð ×,Ò,¨UÑ3Ô3ˆÝ'¨°gÑ>Ô>ÐØˆ	Ø-×3Ò3Ñ5Ô5ð 	hð 	h‰LˆD�&Ý˜&¥#Ñ&Ô&ð hØ"(�	˜$‘�à")×"5Ò"5°fÀÍbÌhÐWcÑNdÔNdÐ?eÐ>fÑ"gÔ"g�	˜$‘�Ø˜HÒ$Ð$Ð$Ð$Ð$ð+%ð %r   c                  ó  — t          dd¬¦  «        } | t          dd¬¦  «        z  } | D ]c}dD ]^}d|v }t          j        g d¢|¬¦  «        }|                     |¦  «        }|                     |¦  «        |k    sJ |||j        f¦   «         ‚Œ_Œdd S )NFr[   T)Úint32Úint64Úfloat32Úfloat64Úfloat)r3   rŒ   r5   )Údtype)r	   r   rš   rh   Úis_float_typer®   )r%   r&   r®   Úis_floatÚinputs        r   Útest_is_float_typer²   ö   sÈ   € Ý$¨e¸EÐBÑBÔB€HØÕ%¨u¸TÐBÑBÔBÑB€HØð [ð [ˆØ=ð 	[ð 	[ˆEØ %Ð'ˆHÝ”H˜Y˜Y˜Y¨eÐ4Ñ4Ô4ˆEØ×&Ò& uÑ-Ô-ˆEØ×(Ò(¨Ñ/Ô/°8Ò;Ð;Ð;¸eÀWÈeÌkÐ=ZÑ;Ô;Ð;Ð;ð		[ð[ð [r   c                  ó  ‡‡‡‡‡— t          d¦  «        st          j        ¦   «          ddl} ddlm} ddlmŠmŠmŠm	Šm
Š ddlm}  |¦   «           G ˆˆˆˆˆfd„d|j        ¦  «        } |¦   «         }|                      |d	¬
¦  «        }dD ]}|                      ||dz   |dz   g¦  «        }dD ]\} |||¦  «        }	 ||                     ¦   «         |¦  «                             ¦   «         }
| j                             |	|
dd¬¦  «         Œ]Œ€dS )a7  
    Test ensures that allow_ops_in_compiled_graph allows compiling in a single graph
    Additionally we ensure that after compilation cache works properly
     (by changing shapes and patterns)
    We additionally check that pack/unpack still can be handled
     despite variable number of inputs/outputs
    Útorchr   N©Únn)ÚeinsumÚpackÚreduceÚrepeatÚunpack)Úallow_ops_in_compiled_graphc                   ó6   •‡ — e Zd Zdˆ fd„Zdˆˆˆˆˆfd„	Zˆ xZS )úCtest_torch_compile_for_functions.<locals>.TorchModuleWithOperationsÚreturnNc                 óH   •— t          ¦   «                              ¦   «          d S )N)ÚsuperÚ__init__)ÚselfÚ	__class__s    €r   rÂ   zLtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.__init__  s   ø€ Ý‰GŒG×ÒÑÔÐÐÐr   r   c                 óÄ  •‡— |j         \  }}}ˆfd„} ‰| |d¦  «        ¦  «        } ‰| |d¦  «        d¦  «        } ‰|gdt          ‰¦  «        z   z   |d¦  «        ¦  «        \  }}	 ‰t          | |d¦  «        ¦  «        |	d¦  «        }
|
d	         t          |
¦  «        z   }t          | |d
¦  «        |¬¦  «        } ‰|| |d¦  «        ¦  «        d	         }||z   S )Nc                 ón   •— |                       ¦   «         }d                     ˆfd„|D ¦   «         ¦  «        S )Nú c                 ó2   •— g | ]}|d          dvr|n|‰z   ‘ŒS )r:   Úacdr   )r.   ÚpÚsuffixs     €r   r0   zltest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward.<locals>.suf.<locals>.<listcomp>  s/   ø€ Ð XÐ XÐ XÈQ a¨¤e°5Ð&8Ð&8  ¸aÀ&¹jÐ XÐ XÐ Xr   )ÚsplitÚjoin)r‡   ÚpartsrË   s     €r   ÚsufzXtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward.<locals>.suf  s8   ø€ ØŸš™œ�Ø—x’xÐ XÐ XÐ XÐ XÐRWÐ XÑ XÔ XÑYÔYÐYr   za b c -> a b c 4za b c d -> a b cÚminr,   za b * cza b d c -> (a b ) 1 c dzab one1 c *r   z(a b ) 1 c -> a b c)rY   za b c , a b c d -> d)rH   r!   r   )rÃ   Úx_abcrË   rX   rY   rd   rÏ   Úx_abcdÚx_abdcÚpsÚx_arrayÚx1Úadditionr·   r¸   r¹   rº   r»   s     `          €€€€€r   ÚforwardzKtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward  s#  øø€ Ø”k‰GˆAˆq�!ðZð Zð Zð Zð Zð �V˜E 3 3Ð'9Ñ#:Ô#:Ñ;Ô;ˆFØ�F˜6 3 3Ð'9Ñ#:Ô#:¸EÑBÔBˆEØ˜˜u˜g¨­S°©[¬[©Ñ9¸3¸3¸y¹>¼>ÑJÔJ‰JˆF�BØ�f�Y v¨s¨sÐ3LÑ/MÔ/MÑNÔNÐPRÐTaÑbÔbˆGØ˜”�c '™lœlÑ*ˆBÝ˜2˜s˜sÐ#8Ñ9Ô9¸QÐ?Ñ?Ô?ˆBØ�v˜e V¨S¨SÐ1GÑ-HÔ-HÑIÔIÈ!ÔLˆHØ˜‘=Ð r   )r¿   N)r   )Ú__name__Ú
__module__Ú__qualname__rÂ   rØ   Ú__classcell__)rÄ   r·   r¸   r¹   rº   r»   s   @€€€€€r   ÚTorchModuleWithOperationsr¾     sp   øø€ € € € € ð	ð 	ð 	ð 	ð 	ð 	ð	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!r   rÝ   T©Ú	fullgraph)r^   r_   ra   r   r,   )r   Úsuf1Úother_suffixgñhãˆµøä>)ÚatolÚrtol)r
   rx   Úskipr´   r¶   r   r·   r¸   r¹   rº   r»   Úeinops._torch_specificr¼   ÚModuleÚcompileÚrandÚdoubler­   ÚtestingÚassert_close)r´   r¶   r¼   rÝ   ÚoriginalÚcompiledr9   rJ   rË   rU   rV   r·   r¸   r¹   rº   r»   s              @@@@@r   Ú test_torch_compile_for_functionsrî     s¥  øøøøø€ õ ˜WÑ%Ô%ð ÝŒ‰ŒˆØ€L€L€LØÐÐÐÐÐà;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ØBÐBÐBÐBÐBÐBàÐÑ!Ô!Ð!ð!ð !ð !ð !ð !ð !ð !ð !ð !ð !ð ! B¤Iñ !ô !ð !ð, )Ð(Ñ*Ô*€HØ�}Š}˜X°ˆ}Ñ6Ô6€HØð Oð OˆØ�JŠJ˜˜d Q™h¨¨q©Ð1Ñ2Ô2ˆØ2ð 	Oð 	OˆFØ�h˜q &Ñ)Ô)ˆGØ�h˜qŸxšx™zœz¨6Ñ2Ô2×8Ò8Ñ:Ô:ˆGàŒM×&Ò& w°¸dÈÐ&ÑNÔNÐNÐNð		OðOð Or   c                  ó®  — t          d¦  «        st          j        ¦   «          ddl} ddlm} ddlm}m}m} | 	                     |dd¬¦  «         |d	d
dddd¬¦  «         |ddd¬¦  «        ¦  «        }|  
                    |d¬¦  «        }dD ]G}|                      ||g¦  «        } ||¦  «        }	 ||¦  «        }
|                      |	|
¦  «        sJ ‚ŒHdS )z‡
    Einops layers are in general very friendly towards tracing/compiling,
    but we still want to make sure we can compile them.
    r´   r   Nrµ   )ÚEinMixÚ	RearrangeÚReducezb (t c) -> b t cé   )rd   zb t c -> qkv b t coutz
qkv c coutzqkv coutr3   é   )Úweight_shapeÚ
bias_shapeÚqkvrd   Úcoutzqkv b t cout -> b t qkvrÐ   )rø   TrÞ   )ró   é    é@   )r
   rx   rä   r´   r¶   Úeinops.layers.torchrð   rñ   rò   Ú
Sequentialrç   rè   r›   )r´   r¶   rð   rñ   rò   rì   rí   r9   rJ   rU   rV   s              r   Útest_torch_compile_for_layersrý   4  s-  € õ
 ˜WÑ%Ô%ð ÝŒ‰Œˆà€L€L€LØÐÐÐÐÐà=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=à�}Š}Øˆ	Ð$¨Ð+Ñ+Ô+ØˆÐ&°\ÈjÐ^_ÐceÐlmÐnÑnÔnØˆÐ(¨%°aÐ8Ñ8Ô8ñô €Hð �}Š}˜X°ˆ}Ñ6Ô6€Hàð 0ð 0ˆØ�JŠJ˜˜d�|Ñ$Ô$ˆØ�(˜1‘+”+ˆØ�(˜1‘+”+ˆØ�~Š~˜g wÑ/Ô/Ð/Ð/Ð/Ð/ð	0ð 0r   aS  
import einops
import numpy as np
from concurrent.futures import ThreadPoolExecutor
import torch

def f():
    return einops.rearrange(np.ndarray((20, 150, 150)), "... i j -> ... j i")
with ThreadPoolExecutor(max_workers=2) as ex:
    fs = []
    for i in range(20):
        fs.append(ex.submit(f))
    for fut in fs:
        fut.result()
c                  óÖ  — t          d¦  «        st          j        ¦   «          t          d¦  «        st          j        ¦   «          t          j        ¦   «         5 } t          | ¦  «                             d¦  «        }|                     t          ¦  «         t          j
        d|                     ¦   «                              ¦   «         gd¬¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr´   Únumpyztest.pyÚpythonT)Úcheck)r
   rx   rä   ÚtempfileÚTemporaryDirectoryr   ÚjoinpathÚ
write_textÚsrcÚ
subprocessÚrunÚabsoluteÚas_posix)re   Útestfiles     r   Útest_einops_threadingr  a  s  € å˜WÑ%Ô%ð ÝŒ‰ŒˆÝ˜WÑ%Ô%ð ÝŒ‰Œˆå	Ô	$Ñ	&Ô	&ð O¨!Ý˜‘7”7×#Ò# IÑ.Ô.ˆØ×Ò�CÑ Ô Ð ÝŒ˜ (×"3Ò"3Ñ"5Ô"5×">Ò">Ñ"@Ô"@ÐAÈÐNÑNÔNÐNðOð Oð Oñ Oô Oð Oð Oð Oð Oð Oð Oð Oøøøð Oð Oð Oð Oð Oð Os   ÁA9CÃC"Ã%C")0r  r  Údoctestr   Úpathlibr   rÿ   r   rx   r   Úeinops.layersÚeinops._backendsr   Úeinops.einopsr   r   r   Úeinops.testsr	   r
   Ú
__author__ÚrandomÚdefault_rngr>   r   r)   rZ   rf   rš   rg   rl   ro   rr   rv   r{   r‰   r�   r�   Ú_SYMBOLIC_BACKENDSÚmarkÚparametrizer¤   r§   r²   rî   rý   r  r  r   r   r   ú<module>r     s®  ðØ Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ø €€€à €€€Ø Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aà€
à„i×ÒÑÔ€ðHð Hð Hðhð hð hð<,ð ,ð ,ð@ -Ð,°eÀEÐJÑJÔJÐ à€r„xÐ Ð Ð Ñ!Ô!€ðAð Að Að,ð ,ð ,ð4ð 4ð 4ð=ð =ð =ð=ð =ð =ð2ð 2ð 2ð*
2ð 
2ð 
2ð<ð <ð <ð ØÐ D°Ð7Ñ7Ô7ðàÐ D°Ð6Ñ6Ô6ðÐ ð qÐpÐ-?ÐpÑpÔpÐ ð „×Ò˜Ð$6Ñ7Ô7ð&ð &ñ 8Ô7ð&ð6 „×Ò˜Ð$6Ñ7Ô7ð%ð %ñ 8Ô7ð%ð2[ð [ð [ð0Oð 0Oð 0Oðf0ð 0ð 0ð8€ð"
Oð 
Oð 
Oð 
Oð 
Or   