Ë
    øÿæiÑ4  ã                   óL  — 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*                  j-                  «       Zd„ Zd	„ Zd
„ Z edd¬«      Z ej8                  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&e&D � cg c]  } | jN                  dk7  sŒ| ‘Œ c} Z&ejP                  jS                  de&«      d„ «       Z*ejP                  jS                  de&«      d„ «       Z+d„ Z,d„ Z-d„ Z.dZ/d„ Z0yc c} w ) é    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        ¬«      ¬«       y )NT)Únp)Úraise_on_errorÚ
extraglobs)r   ÚeinopsÚlayersÚdictr   © ó    úl/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/einops/tests/test_other.pyÚtest_doctests_examplesr      s*   € äŒF�M‰M¨$¼4Ä2¼;ÕGÜŒF�M‰M¨$¼4Ä2¼;ÖGr   c                  ó  — ddl m}  t         | «       «      }g }g }t        j                  «       }|r7|j                  «       }||j	                  «       z  }|j                  |«       |rŒ7|D ]4  }|j                  |vrŒ	  |«        |j                  |j                  «       Œ6 t        |«      dk(  sJ |«       ‚t        |«      dk(  sJ d|›d�«       ‚y# t        $ r'}|j                  |j                  |f«       Y d}~Œ‘d}~ww xY w)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)      s
  € õ
 )äÑ1Ó3Ó4ÐØ€FàÐÜ×-Ñ-Ó/€HÙ
Ø—,‘,“.ˆØ�G×*Ñ*Ó,Ñ,ˆØ×!Ñ! 'Ô*ò ó
 +ˆØ×&Ñ&Ð.>Ñ>Øð	<áŒNØ×#Ñ# L×$?Ñ$?Õ@ð +ô ˆv‹;˜!ÒÐ#˜VÓ#ÐÜÐÓ  AÒ%ÐgÐ)OÐ>NÐ=PÐPfÐ'gÓgÑ%øô ò 	<Ø�M‰M˜<×6Ñ6¸Ð:×;Ñ;ûð	<ús   Á="CÃ	D ÃC;Ã;D c                  ó2  — t        d«       t        d«      D � cg c]  } dg| z  ‘Œ
 }} |t        d«      D � cg c]  } dg| z  ‘Œ
 c} z  }|g d¢gz  }|g d¢gz  }|D �]°  }t        d«      D �]ž  }t        |«      } t        j	                  d	d
|¬«      j                  dg«      }|d d  }t        j	                  d	| dz   «      }t        t        j                  | «      d | «      }t        j                  | |z
  «      }t        j	                  d	dd¬«      }	t        ||||	«      x\  }
}}}}t        j                  |	|«      sJ ‚|j                  |«      j                  |¬«      j                  |«      j                  dg«      }|j                  |
«      j                  |¬«      j                  |«      j                  dg«      }t        j                  ||«      sJ ‚t        |Ž }t        ||«      D ]  \  }}t        j                  ||«      rŒJ ‚ �Œ¡ �Œ³ y c c} w c c} w )NzTesting optimizationsé   é   é   é   )r,   r.   é   é   )r,   r.   r/   r0   é   é   r/   r   i   )Úsizeéÿÿÿÿr   i   iM  )Úaxis)ÚprintÚranger!   ÚrngÚintegersÚreshapeÚtupleÚpermutationr   r   Úarray_equalÚsumÚ	transposeÚzip)Ún_dimensionsÚshapesÚshapeÚ_attemptÚ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_numpyrU   8   s  € Ü	Ð
!Ô"Ü5:¸2´YÓ?±Y \ˆqˆc�LÓ °Y€FÐ?Ø
´e¸A´hÓ?±h l�ˆs�\Ó!°hÑ?Ñ?€FØ
Š|ˆnÑ€FØ
Ò#Ð$Ñ$€FäˆÜ˜aŸˆHÜ˜u›:ˆLÜ—‘˜Q ¨E�Ó2×:Ñ:¸B¸4Ó@ˆAØ™q˜ˆJÜŸ™ Q¨°qÑ(8Ó9ˆIÜ ¤§¡°Ó!>¸zÀ	Ð!JÓKˆLÜ!Ÿo™o¨l¸YÑ.FÓGˆOÜŸ,™, q¨$°S˜,Ó9ˆKäXpØ˜L¨/¸;óYð ÑFˆK˜Ð(8¸,Èô —>‘> +¨|Ô<Ð<Ð<Ø—i‘i 
Ó+×/Ñ/°\Ð/ÓB×LÑLÈ_Ó]×eÑeÐgiÐfjÓkˆGØ—i‘i Ó,×0Ñ0°mÐ0ÓD×NÑNÐO_Ó`×hÑhÐjlÐimÓnˆGÜ—>‘> '¨7Ô3Ð3Ð3ô 4°\ÐBˆLÜ˜L¨,Ö7‘��1Ü—~‘~ a¨Õ+Ð+Ð+ò 8ò) !ñ ùò @ùÚ?s
   ™H¶HF©Úsymbolicr   ©é
   é   é   é(   c                  ó  — t         D ]�  } t        d| j                  «       t        t        d«      }t        | j                  t        «      d«      }||cxk(  rt        dddd¬«      k(  sJ ‚ J ‚|t        dddd¬«      cxk7  r|k7  rŒ~J ‚ J ‚ y )	NzShape parsing for úa b c drY   rZ   r[   r\   )rS   rT   ÚcÚdr   )Ú_IMPERATIVE_BACKENDSr6   r   r   Úx_npÚ
from_numpyr   ©r&   Úparsed1Úparsed2s      r   Útest_parse_shape_imperativerg   ]   sˆ   € ß'ˆÜÐ" G×$:Ñ$:Ô;Üœd IÓ.ˆÜ˜g×0Ñ0´Ó6¸	ÓBˆØ˜'ÔA¤T¨B°"¸¸bÔ%AÒAÐAÑAÐAÐAØœ$  b¨B°"Ô5Ô@¸Ó@Ð@Ñ@Ð@Ð@ñ (r   c                  ó¨   — t         D ]I  } t        t        d«      }t        | j                  t        «      d«      }||cxk(  rt	        «       k(  rŒFJ ‚ J ‚ y )Nz_ _ _ _©ra   r   rb   rc   r   rd   s      r   Útest_underscorerj   f   sJ   € ß'ˆÜœd IÓ.ˆÜ˜g×0Ñ0´Ó6¸	ÓBˆØ˜'Ô+¤T£VÓ+Ð+Ñ+Ð+Ð+ñ (r   c                  ó¬   — t         D ]K  } t        t        d«      }t        | j                  t        «      d«      }||cxk(  rt	        d¬«      k(  rŒHJ ‚ J ‚ y )Nz_ _ _ hellor\   )Úhellori   rd   s      r   Útest_underscore_onerm   m   sL   € ß'ˆÜœd MÓ2ˆÜ˜g×0Ñ0´Ó6¸ÓFˆØ˜'Ô3¤T°¤^Ó3Ð3Ñ3Ð3Ð3ñ (r   c                  ó®   — t         D ]L  } t        t        d«      }t        | j                  t        «      d«      }||cxk(  rt	        dd¬«      k(  rŒIJ ‚ J ‚ y )Nz_ _ a1 a1a111ar[   r\   )Úa1Úa1a111ari   rd   s      r   Útest_underscore_severalrq   t   sQ   € ß'ˆÜœdÐ$4Ó5ˆÜ˜g×0Ñ0´Ó6Ð8HÓIˆØ˜'Ô<¤T¨R¸Ô%<Ó<Ð<Ñ<Ð<Ð<ñ (r   c                  óX  — t        j                  t        j                  «      5  t	        t
        d«       d d d «       t        D ]M  } t        j                  t        j                  «      5  t	        | j                  t
        «      d«       d d d «       ŒO y # 1 sw Y   Œ`xY w# 1 sw Y   ŒfxY w)Nza a b b)ÚpytestÚraisesr   ÚEinopsErrorr   rb   ra   rc   ©r&   s    r   Útest_repeatingrw   {   sp   € Ü	�‰”v×)Ñ)Õ	*Ü”D˜)Ô$÷ 
+÷ (ˆÜ�]‰]œ6×-Ñ-Õ.Ü˜×*Ñ*¬4Ó0°)Ô<÷ /Ð.ñ (÷ 
+Ð	*ú÷ /Ð.ús   ¤BÁ) 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 ]R  \  }}}t        j                  |«      }t	        ||«      }t	        | j                  |«      |«      }||cxk(  r|k(  rŒOJ ‚ J ‚ �Œ y )NrY   rZ   ú...ú... a©rS   ©rY   rZ   r[   r[   rX   r\   úa ...ú a ... b©rS   rT   ©ra   r   r   Úonesr   rc   ©r&   rC   ÚpatternÚexpectedrE   re   rf   s          r   Útest_ellipsisr…   „   s  € ß'Ð'ˆà�"ˆX�uœd›fÐ%ØˆT�7œD 2œJÐ'Ø�"ˆX�w¤ r¤
Ð+Ú˜7¤D¨2¤JÐ/Ú˜w¬¨r¬
Ð3ØˆT�7œD 2œJÐ'Ø�"ˆX�w¤ r¤
Ð+Ú˜7¤D¨2¤JÐ/Ú˜w¬¨r¬
Ð3Ú˜z¬4°"¸Ô+;Ð<Ø�"ˆX�z¤4¨"°Ô#3Ð4ó)
Ñ$ˆE�7˜Hô —‘˜“ˆAÜ! ! WÓ-ˆGÜ! '×"4Ñ"4°QÓ"7¸ÓAˆGØ˜gÔ1¨Ó1Ð1Ñ1Ð1Ð1ò!)
ñ (r   c                  ó(  — t         D ]‰  } g d¢dt        d¬«      fg d¢dt        d¬«      fg d¢dt        d¬«      ffD ]R  \  }}}t        j                  |«      }t	        ||«      }t	        | j                  |«      |«      }||cxk(  r|k(  rŒOJ ‚ J ‚ Œ‹ y )	N©r   r,   r.   é   z1 2 3 arˆ   r{   )rY   r   r,   za 1 2rY   za () 2r€   r‚   s          r   Útest_parse_with_anonymous_axesr‰   ™   s”   € ß'ˆâ˜9¤d¨Q¤iÐ0Ú˜¤$¨¤*Ð-Ú˜¤4¨"¤:Ð.ó)
Ñ$ˆE�7˜Hô
 —‘˜“ˆAÜ! ! WÓ-ˆGÜ! '×"4Ñ"4°QÓ"7¸ÓAˆGØ˜gÔ1¨Ó1Ð1Ñ1Ð1Ð1ñ)
ñ (r   c                  ó&  — 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 ]W  \  }}t        j                  t        «      5  t	        j
                  |«      }t        | j                  |«      |«       d d d «       ŒY Œ~ y # 1 sw Y   ŒfxY w)Nr‡   za b cz2 a b cza b c ()z	a b c d eza b c d e ...)ra   rs   rt   ÚRuntimeErrorr   r�   r   rc   )r&   rC   rƒ   rE   s       r   Útest_failuresrŒ   ¦   s�   € ß'ˆò ˜7Ð#Ú˜9Ð%Ú˜:Ð&Ú˜;Ð'Ú˜?Ð+Ú˜:Ð&ó
‰NˆE�7ô —‘œ|Õ,Ü—G‘G˜E“N�Ü˜G×.Ñ.¨qÓ1°7Ô;÷ -Ð,ñ
ñ (÷ -Ð,ús   Á	1BÂBTztensorflow.kerasr&   c           
      óf  — g d¢g d¢g d¢fD �]"  }t        d| j                  ›d|›�«       | j                  |«      }t        |d«      }i }|j	                  «       D ]D  \  }}t        |t        «      r|n)| j                  ||t        j                  g d¢«      fg«      ||<   ŒF t        |«       t        |dfi t        |d«      ¤d	d
i¤Ž}| j                  ||t        j                  g d¢«      fg«      }t        |j                  «       |j                  dk(  sJ ‚t        j                  |d«      r�Œ#J ‚ y )NrX   )rY   rZ   NN©NNNNz-special shape parsing backend.framework_name=z input_shape=r^   z*a b (c1 c2) (d1 d2) -> (a b d1) c1 (c2 d2)za b c1 _Úd2r,   )i   r[   r,   r   )r6   r   Úcreate_symbolr   ÚitemsÚ
isinstanceÚintÚeval_symbolr   Úzerosr   rC   Úallclose)	r&   Úinput_shapeÚinput_symbolÚshape_placeholderÚ	out_shapeÚnameÚsymbolÚresult_placeholderÚresults	            r   Útest_parse_shape_symbolicrŸ   À   s;  € ò 	ÚÚ ôˆô
 	Ð> w×'=Ñ'=Ð&?¸~ÀÀÐOÔPØ×,Ñ,¨[Ó9ˆä'¨°iÓ@ÐØˆ	Ø-×3Ñ3Ö5‰LˆD�&ô ˜f¤cÔ*ñ à×(Ñ(¨°<ÄÇÁÒJZÓA[Ð2\Ð1]Ó^ð �dŠOð 6ô 	ˆiÔÜ&ØÐFñ
ÜJUÐVbÐdnÓJoñ
Øtuò
Ðð ×$Ñ$Ð%7¸<ÌÏÉÒRbÓIcÐ:dÐ9eÓfˆÜˆf�l‰lÔØ�|‰|Ð8Ò8Ð8Ð8Ü�{‰{˜6 1Ö%Ð%Ð%ñ/r   c                 ó´  — 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 ]†  \  }}}}| j                  |«      }t        ||«      }i }|j                  «       D ]F  \  }}	t	        |	t
        «      r|	||<   Œ| j                  |	|t        j                  |«      fg«      ||<   ŒH ||k(  rŒ†J ‚ y )NrY   rZ   ry   rz   r{   r|   )NNNr[   rX   rŽ   r\   r}   r~   r   z	 a ... b )	r   r�   r   r‘   r’   r“   r”   r   r•   )
r&   Ústatic_shaperC   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Ð?Ú	Ò3°W¼dÀR¼jÐIØ
ˆ�ˆv�w¤ r¤
Ð+Ø
ˆbˆ�D˜$�< ¬$°¬*Ð5Ú	Ò)¨7´D¸2´JÐ?Ú	Ò3°W¼dÀR¼jÐIÚ	Ò3°ZÄÈÈbÔAQÐRØ
ˆbˆ�D˜$�< ¬d°R¸2Ô.>Ð?ó3Ñ.ˆ�e˜W hð ×,Ñ,¨UÓ3ˆÜ'¨°gÓ>ÐØˆ	Ø-×3Ñ3Ö5‰LˆD�&Ü˜&¤#Ô&Ø"(�	˜$’à")×"5Ñ"5°fÀÌbÏhÉhÐWcÓNdÐ?eÐ>fÓ"g�	˜$’ð	 6ð
 ˜HÓ$Ð$Ð$ñ+3r   c                  ó  — t        dd¬«      } | t        dd¬«      z  } | D ]_  }dD ]X  }d|v }t        j                  g d¢|¬«      }|j                  |«      }|j	                  |«      |k(  rŒFJ |||j
                  f«       ‚ Œa y )NFrV   T)Úint32Úint64Úfloat32Úfloat64Úfloat)r.   rˆ   r/   )Údtype)r	   r   r•   rc   Úis_float_typer©   )r%   r&   r©   Úis_floatÚinputs        r   Útest_is_float_typer­   ö   s‡   € Ü$¨e¸EÔB€HØÔ%¨u¸TÔBÑB€HÛˆÛ=ˆEØ %Ð'ˆHÜ—H‘HšY¨eÔ4ˆEØ×&Ñ& uÓ-ˆEØ×(Ñ(¨Ó/°8Ó;ÐZ¸eÀWÈeÏkÉkÐ=ZÓ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                  «      } |«       }| j                  |d	¬
«      }dD ]p  }| j                  ||dz   |dz   g«      }dD ]O  } |||«      }	 ||j!                  «       |«      j#                  «       }
| j$                  j'                  |	|
dd¬«       ŒQ Œr y)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>.TorchModuleWithOperationsc                 ó"   •— t         ‰| �  «        y )N)ÚsuperÚ__init__)ÚselfÚ	__class__s    €r   r¼   zLtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.__init__  s   ø€ Ü‰GÑÕ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                 ó„   •— | j                  «       }dj                  |D �cg c]  }|d   dvr|n|‰z   ‘Œ c}«      S c c}w )NÚ r4   Úacd)ÚsplitÚjoin)rƒ   ÚpartsÚpÚsuffixs      €r   ÚsufzXtest_torch_compile_for_functions.<locals>.TorchModuleWithOperations.forward.<locals>.suf  sF   ø€ ØŸ™›�Ø—x‘xÑRWÓ XÑRWÈQ a¨¡e°5Ñ&8¡¸aÀ&¹jÑ!HÐRWÑ XÓYÐYùÒ Xs   ¡=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)rT   za b c , a b c d -> d)rC   r!   r   )r½   Úx_abcrÇ   rS   rT   r_   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‘k‰GˆAˆq�!ôZñ ˜E¡3Ð'9Ó#:Ó;ˆFÙ˜6¡3Ð'9Ó#:¸EÓBˆEÙ˜u˜g¨¬S°«[©Ñ9¹3¸y»>ÓJ‰JˆF�BÙœY v©sÐ3LÓ/MÓNÐPRÐTaÓbˆGØ˜‘œc '›lÑ*ˆBÜ˜2™sÐ#8Ó9¸QÔ?ˆBÙ˜e V©SÐ1GÓ-HÓIÈ!ÑLˆHØ˜‘=Ð r   )ÚreturnN)r   )Ú__name__Ú
__module__Ú__qualname__r¼   rÑ   Ú__classcell__)r¾   r²   r³   r´   rµ   r¶   s   @€€€€€r   ÚTorchModuleWithOperationsr¹     s   ù„ õ	÷	!õ 	!r   r×   T©Ú	fullgraph)rY   rZ   r\   r   r,   )r   Úsuf1Úother_suffixgñhãˆµøä>)ÚatolÚrtol)r
   rs   Úskipr¯   r±   r   r²   r³   r´   rµ   r¶   Úeinops._torch_specificr·   ÚModuleÚcompileÚrandÚdoubler¨   ÚtestingÚassert_close)r¯   r±   r·   r×   ÚoriginalÚcompiledr3   rE   rÇ   rP   rQ   r²   r³   r´   rµ   r¶   s              @@@@@r   Ú test_torch_compile_for_functionsrè     sÏ   ü€ ô ˜WÔ%Ü�‰ŒÛÝç;Õ;ÝBáÔ!÷!ò ! B§I¡Iô !ñ, )Ó*€HØ�}‰}˜X°ˆ}Ó6€HÛˆØ�J‰J˜˜d Q™h¨¨q©Ð1Ó2ˆÛ2ˆFÙ˜q &Ó)ˆGÙ˜qŸx™x›z¨6Ó2×8Ñ8Ó:ˆGà�M‰M×&Ñ& w°¸dÈÐ&ÕNñ	 3ñ r   c                  ól  — t        d«      st        j                  «        ddl} ddlm} ddlm}m}m} |j                   |dd¬«       |d	d
dddd¬«       |ddd¬«      «      }| j                  |d¬«      }dD ]9  }| j                  ||g«      } ||«      }	 ||«      }
| j                  |	|
«      rŒ9J ‚ y)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é   )r_   zb t c -> qkv b t coutz
qkv c coutzqkv coutr.   é   )Úweight_shapeÚ
bias_shapeÚqkvr_   Úcoutzqkv b t cout -> b t qkvrÉ   )rò   TrØ   )rí   é    é@   )r
   rs   rÞ   r¯   r±   Úeinops.layers.torchrê   rë   rì   Ú
Sequentialrá   râ   r–   )r¯   r±   rê   rë   rì   ræ   rç   r3   rE   rP   rQ   s              r   Útest_torch_compile_for_layersr÷   4  s³   € ô
 ˜WÔ%Ü�‰ŒãÝç=Ñ=à�}‰}ÙÐ$¨Ô+ÙÐ&°\ÈjÐ^_ÐceÐlmÔnÙÐ(¨%°aÔ8ó€Hð �}‰}˜X°ˆ}Ó6€HãˆØ�J‰J˜˜d�|Ó$ˆÙ˜1“+ˆÙ˜1“+ˆØ�~‰~˜g wÕ/Ð/Ð/ñ	 r   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        | «      j                  d«      }|j                  t        «       t        j                  d|j                  «       j                  «       gd¬«       d d d «       y # 1 sw Y   y xY w)Nr¯   Únumpyztest.pyÚpythonT)Úcheck)r
   rs   rÞ   ÚtempfileÚTemporaryDirectoryr   ÚjoinpathÚ
write_textÚsrcÚ
subprocessÚrunÚabsoluteÚas_posix)r`   Útestfiles     r   Útest_einops_threadingr  a  s…   € ä˜WÔ%Ü�‰ŒÜ˜WÔ%Ü�‰Œä	×	$Ñ	$Ô	&¨!Ü˜“7×#Ñ# IÓ.ˆØ×ÑœCÔ Ü�‰˜ (×"3Ñ"3Ó"5×">Ñ">Ó"@ÐAÈÕN÷ 
'×	&Ñ	&ús   ÁA%CÃC
)1r  rü   Údoctestr   Úpathlibr   rù   r   rs   r   Úeinops.layersÚeinops._backendsr   Úeinops.einopsr   r   r   Úeinops.testsr	   r
   Ú
__author__ÚrandomÚdefault_rngr8   r   r)   rU   ra   r•   rb   rg   rj   rm   rq   rw   r…   r‰   rŒ   Ú_SYMBOLIC_BACKENDSr   ÚmarkÚparametrizerŸ   r¢   r­   rè   r÷   r   r  rv   s   0r   Ú<module>r     s[  ðÛ Û Ý Ý ã Û ã Û Ý ,ß JÑ Jß Aà€
à‡i�i×ÑÓ€òHòhò<,ñ@ -°eÀEÔJÐ à€r‡x�xÒ Ó!€òAò,ò4ò=ò=ò2ò*
2ò<ð Ù D°Ô7ðá D°Ô6ðÐ ñ .@ÓpÑ-? 'À7×CYÑCYÐ]oÓCo’gÐ-?ÑpÐ ð ‡�×Ñ˜Ð$6Ó7ñ&ó 8ð&ð6 ‡�×Ñ˜Ð$6Ó7ñ%ó 8ð%ò2[ò0Oòf0ð8€ó"
OùòI qs   Â2D!ÃD!