§
    �ÅjëH  ã                   ó
  — d dl Z d dlmZ d dlZd dlZd dlmZmZm	Z	 d dl
mZ d dl
mZmZ dZ edg d¢¦  «        Z ed	 ed
¬¦  «        dddddg d¢g¦  «         ed edd¬¦  «        dg d¢¦  «         ed ed¬¦  «        dg d¢¦  «        gZd„ Zd„ Zg e¢ ed ed¬¦  «        dddg¦  «        ‘ ed eddd¬ ¦  «        dd!g¦  «        ‘ ed" ed¬¦  «        ddd#g¦  «        ‘Zd$„ Zd%„ Zd.d'„Zd(„ Zd)„ Zd*„ Zd+„ Zd,„ Zd-„ ZdS )/é    N)Ú
namedtuple)ÚEinopsErrorÚ	rearrangeÚreduce)ÚFLOAT_REDUCTIONS)Úcollect_test_backendsÚis_backend_testedzAlex RogozhnikovÚtestcase)ÚpatternÚaxes_lengthsÚinput_shapeÚwrong_shapesúb c h w -> b (c h w)é   ©Úc)é
   r   é   é(   © ©r   )r   r   r   )r   é   r   r   )é   r   r   r   r   z(b c (h1 h2) (w1 w2) -> b (c h2 w2) h1 w1é   ©Úh2Úw2)r   )r   r   r   r   )r   r   é   r   zb ... c -> c b ...r   )Úb)r   r   r   )r   r   )é   r   c                  ó’  — t          dd¬¦  «        D �]3} t          d| j        ¦  «         t          D �]\  }}}}t	          j        t	          j        |¦  «        d¬¦  «                             |¦  «        }t          ||fi |¤Ž} |  	                    ¦   «         j
        |fi |¤Ž}|D ]S}	  ||                      t	          j        |d¬¦  «        ¦  «        ¦  «         t          d¦  «        ‚# t          $ r Y ŒPw xY wt          j        t          j        |¦  «        ¦  «        }	|                       ||                      |¦  «        ¦  «        ¦  «        }
|                       |	|                      |¦  «        ¦  «        ¦  «        }t	          j        ||
¦  «        sJ ‚t	          j        |
|¦  «        sJ ‚|  	                    ¦   «                              dd	¬
¦  «        }|                      |¦  «        } | ||¦  «        ¦  «        }|                     ¦   «          t	          j        |                      |j        ¦  «        d¦  «        sJ ‚�Œ�Œ5d S )NFT©ÚsymbolicÚlayersúTest layer for Úfloat32©ÚdtypeúFailure expectedú...->Úsum©Ú	reductionr   )r   ÚprintÚframework_nameÚrearrangement_patternsÚnpÚarangeÚprodÚreshaper   r$   Ú	RearrangeÚ
from_numpyÚzerosÚAssertionErrorÚBaseExceptionÚpickleÚloadsÚdumpsÚto_numpyÚallcloseÚReduceÚbackwardÚgrad)Úbackendr   r   r   r   ÚxÚresult_numpyÚlayerÚshapeÚlayer2Úresult1Úresult2Újust_sumÚvariableÚresults                  úIC:\Projects\Historical\venv\Lib\site-packages\einops/tests/test_layers.pyÚtest_rearrange_imperativerN   %   sc  € Ý(°%ÀÐEÑEÔEð Cñ CˆÝÐ Ô!7Ñ8Ô8Ð8å@Vð 	Cñ 	CÑ<ˆG�\ ;°Ý”	�"œ' +Ñ.Ô.°iÐ@Ñ@Ô@×HÒHÈÑUÔUˆAÝ$ Q¨Ð@Ð@°<Ð@Ð@ˆLØ.�G—N’NÑ$Ô$Ô.¨wÐGÐG¸,ÐGÐGˆEØ%ð =ð =�ð=Ø�E˜'×,Ò,­R¬X°eÀ9Ð-MÑ-MÔ-MÑNÔNÑOÔOÐOõ )Ð);Ñ<Ô<Ð<øõ %ð ð ð Ø�Dðøøøõ ”\¥&¤,¨uÑ"5Ô"5Ñ6Ô6ˆFØ×&Ò& u u¨W×-?Ò-?ÀÑ-BÔ-BÑ'CÔ'CÑDÔDˆGØ×&Ò& v v¨g×.@Ò.@ÀÑ.CÔ.CÑ'DÔ'DÑEÔEˆGÝ”;˜|¨WÑ5Ô5Ð5Ð5Ð5Ý”;˜w¨Ñ0Ô0Ð0Ð0Ð0à—~’~Ñ'Ô'×.Ò.¨wÀ%Ð.ÑHÔHˆHà×)Ò)¨!Ñ,Ô,ˆHØ�X˜e˜e H™oœoÑ.Ô.ˆFà�OŠOÑÔÐÝ”;˜w×/Ò/°´Ñ>Ô>ÀÑBÔBÐBÐBÐBÑBñ3	CðCð Cs   Â'2C(Ã(
C5	Ã4C5	c                  óÒ  — t          dd¬¦  «        D �]Ó} t          d| j        ¦  «         t          D �]²\  }}}}t	          j        t	          j        |¦  «        d¬¦  «                             |¦  «        }t          ||fi |¤Ž} |  	                    ¦   «         j
        |fi |¤Ž}d gt          |¦  «        z  }||g}	|	D �]&}
|                      |
¦  «        }||fg} ||¦  «        }|                      ||¦  «        }t	          j        ||¦  «        sJ ‚t          j        t          j        |¦  «        ¦  «        } ||¦  «        }|                      ||¦  «        }t	          j        ||¦  «        sJ ‚|  	                    ¦   «                              dd¬¦  «        }|                       ||¦  «        |¦  «        }t	          j        |¦  «        }t	          j        ||¦  «        sJ ‚�Œ(�Œ´�ŒÕd S )	NTr"   r%   r&   r'   r*   r+   r,   )r   r.   r/   r0   r1   r2   r3   r4   r   r$   r5   ÚlenÚcreate_symbolÚeval_symbolr>   r:   r;   r<   r?   r+   )rB   r   r   r   Ú_wrong_shapesrC   rD   rE   Úinput_shape_of_nonesÚshapesrF   ÚsymbolÚeval_inputsÚresult_symbol1rH   rG   Úresult_symbol2rI   rJ   Úresult_sum1Úresult_sum2s                        rM   Útest_rearrange_symbolicr\   E   s
  € Ý(°$¸tÐDÑDÔDð =ñ =ˆÝÐ Ô!7Ñ8Ô8Ð8åAWð 	=ñ 	=Ñ=ˆG�\ ;°Ý”	�"œ' +Ñ.Ô.°iÐ@Ñ@Ô@×HÒHÈÑUÔUˆAÝ$ Q¨Ð@Ð@°<Ð@Ð@ˆLØ.�G—N’NÑ$Ô$Ô.¨wÐGÐG¸,ÐGÐGˆEØ$( 6­C°Ñ,<Ô,<Ñ#<Ð Ø!Ð#7Ð8ˆFàð =ñ =�Ø ×.Ò.¨uÑ5Ô5�Ø &¨˜{˜m�à!&  v¡¤�Ø!×-Ò-¨n¸kÑJÔJ�Ý”{ <°Ñ9Ô9Ð9Ð9Ð9åœ¥f¤l°5Ñ&9Ô&9Ñ:Ô:�Ø!' ¨¡¤�Ø!×-Ò-¨n¸kÑJÔJ�Ý”{ 7¨GÑ4Ô4Ð4Ð4Ð4ð #Ÿ>š>Ñ+Ô+×2Ò2°7ÀeÐ2ÑLÔL�à%×1Ò1°(°(¸>Ñ2JÔ2JÈKÑXÔX�Ý œf Q™iœi�å”{ ;°Ñ<Ô<Ð<Ð<Ð<Ñ<ñ'=ñ	=ð=ð =ó    zb c h w -> b ()z b c (h1 h2) (w1 w2) -> b c h1 w1é   )Úh1r   r   )r   r   é   r   zb ... c -> b)é   r   c                  ó  — t          dd¬¦  «        D �]ð} t          d| j        ¦  «         t          D �]Ï}t          D �]Ã\  }}}}t          | |||||¦  «         t          j        ddt          j        |¦  «        z   d¬¦  «                             |¦  «        }|| 	                    ¦   «         z  }t          |||fi |¤Ž} |                      ¦   «         j        ||fi |¤Ž}|D ]S}		  ||                      t          j        |	d¬¦  «        ¦  «        ¦  «         t          d¦  «        ‚# t           $ r Y ŒPw xY wt#          j        t#          j        |¦  «        ¦  «        }
|                       ||                      |¦  «        ¦  «        ¦  «        }|                       |
|                      |¦  «        ¦  «        ¦  «        }t          j        ||¦  «        sJ ‚t          j        ||¦  «        sJ ‚|                      ¦   «                              d	d
¬¦  «        }|                      |¦  «        } | ||¦  «        ¦  «        }|                     ¦   «          |                      |j        ¦  «        }|d
k    rt          j        |d¦  «        sJ ‚|dk    r)t          j        ||                     ¦   «         ¦  «        sJ ‚|dv rEt          j        t          j        |ddg¦  «        ¦  «        sJ ‚t          j        |¦  «        dk    sJ ‚�ŒÅ�ŒÑ�Œòd S )NFTr"   r%   r   r&   r'   r)   r*   r+   r,   Úmean)ÚmaxÚminr   g      à?)r   r.   r/   Ú
REDUCTIONSÚreduction_patternsr1   r2   r3   r4   rc   r   r$   r?   r6   r7   r8   r9   r:   r;   r<   r=   r>   r@   rA   re   ÚallÚisinr+   )rB   r-   r   r   r   r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rA   s                    rM   Útest_reduce_imperativerj   n   s,  € Ý(°%ÀÐEÑEÔEð %.ñ %.ˆÝÐ Ô!7Ñ8Ô8Ð8Ý#ð #	.ñ #	.ˆIÝDVð ".ñ ".Ñ@�˜ {°LÝ�g˜y¨'°<ÀÈlÑ[Ô[Ð[Ý”I˜a ¥R¤W¨[Ñ%9Ô%9Ñ!9ÀÐKÑKÔK×SÒSÐT_Ñ`Ô`�Ø�Q—V’V‘X”X‘�Ý% a¨°)ÐLÐL¸|ÐLÐL�Ø/˜ŸšÑ(Ô(Ô/°¸ÐSÐSÀlÐSÐS�Ø)ð Að A�EðAØ˜˜g×0Ò0µ´¸%ÀyÐ1QÑ1QÔ1QÑRÔRÑSÔSÐSõ -Ð-?Ñ@Ô@Ð@øõ )ð ð ð Ø˜ðøøøõ  œ¥f¤l°5Ñ&9Ô&9Ñ:Ô:�Ø!×*Ò*¨5¨5°×1CÒ1CÀAÑ1FÔ1FÑ+GÔ+GÑHÔH�Ø!×*Ò*¨6¨6°'×2DÒ2DÀQÑ2GÔ2GÑ+HÔ+HÑIÔI�Ý”{ <°Ñ9Ô9Ð9Ð9Ð9Ý”{ 7¨GÑ4Ô4Ð4Ð4Ð4à"Ÿ>š>Ñ+Ô+×2Ò2°7ÀeÐ2ÑLÔL�à"×-Ò-¨aÑ0Ô0�Ø!˜ % %¨¡/¤/Ñ2Ô2�à—’Ñ!Ô!Ð!Ø×'Ò'¨¬Ñ6Ô6�Ø Ò%Ð%Ýœ; t¨QÑ/Ô/Ð/Ð/Ð/Ø Ò&Ð&Ýœ; t¨T¯XªX©Z¬ZÑ8Ô8Ð8Ð8Ð8Ø Ð.Ð.Ýœ6¥"¤'¨$°°A°Ñ"7Ô"7Ñ8Ô8Ð8Ð8Ð8Ýœ6 $™<œ<¨#Ò-Ð-Ð-Ð-ùñE".ñ#	.ð%.ð %.s   Ã"2D#Ä#
D0Ä/D0c            
      ó:  — t          dd¬¦  «        D �]‡} t          d| j        ¦  «         t          D �]f}t          D �]Z\  }}}}t          j        ddt          j        |¦  «        z   d¬¦  «                             |¦  «        }|| 	                    ¦   «         z  }t          |||fi |¤Ž} |                      ¦   «         j        ||fi |¤Ž}d gt          |¦  «        z  }	||	g}
|
D ]²}|                      |¦  «        }||fg} ||¦  «        }|                      ||¦  «        }t          j        ||¦  «        sJ ‚t#          j        t#          j        |¦  «        ¦  «        } ||¦  «        }|                      ||¦  «        }t          j        ||¦  «        sJ ‚Œ³�Œ\�Œh�Œ‰d S )NTr"   r%   r   r&   r'   )r   r.   r/   rf   rg   r1   r2   r3   r4   rc   r   r$   r?   rP   rQ   rR   r>   r:   r;   r<   )rB   r-   r   r   r   rS   rC   rD   rE   rT   rU   rF   rV   rW   rX   rH   rG   rY   rI   s                      rM   Útest_reduce_symbolicrl   —   sÓ  € Ý(°$¸tÐDÑDÔDð 9ñ 9ˆÝÐ Ô!7Ñ8Ô8Ð8Ý#ð 	9ñ 	9ˆIÝEWð 9ñ 9ÑA�˜ {°MÝ”I˜a ¥R¤W¨[Ñ%9Ô%9Ñ!9ÀÐKÑKÔK×SÒSÐT_Ñ`Ô`�Ø�Q—V’V‘X”X‘�Ý% a¨°)ÐLÐL¸|ÐLÐL�Ø/˜ŸšÑ(Ô(Ô/°¸ÐSÐSÀlÐSÐS�Ø(, vµ°KÑ0@Ô0@Ñ'@Ð$Ø%Ð';Ð<�à#ð 9ð 9�EØ$×2Ò2°5Ñ9Ô9�FØ$*¨A ; -�Kà%* U¨6¡]¤]�NØ%×1Ò1°.À+ÑNÔN�GÝœ; |°WÑ=Ô=Ð=Ð=Ð=å#œ\­&¬,°uÑ*=Ô*=Ñ>Ô>�FØ%+ V¨F¡^¤^�NØ%×1Ò1°.À+ÑNÔN�GÝœ; w°Ñ8Ô8Ð8Ð8Ð8Ð8ñ9ñ9ñ	9ð9ð 9r]   Fc                 ó  — t          d¦  «        st          j        ¦   «          d S dd l}ddlm}m}m}m}m	} ddl
m}m}	m}
  | |ddd¬¦  «        | r |
d	d
dd¬¦  «        n |d¬¦  «         |ddd¬¦  «         |
d	d
dd¬¦  «        |r#|j                              |	d¦  «        ¦  «        n
 |	d¦  «         |dd¦  «         |¦   «          |dd¦  «         |¦   «          |ddddd¬¦  «         |ddddd¬¦  «         |dd¦  «        ¦  «        S )NÚtorchr   )ÚConv2dÚLinearÚ	MaxPool2dÚReLUÚ
Sequential©ÚEinMixr5   r?   r   é   )r    r    ©Úkernel_sizeúb c (h h2) (w w2) -> b c h wrd   r   r   é   r   i�  éx   éT   úb c1 -> (b c2)úc1 c2Úc2©Úweight_shapeÚ
bias_shapeÚc1r   ú(b c2) -> b c3úc2 c3Úc3©r�   r‚   r   r†   r   )r	   ÚpytestÚskipÚ	torch.jitÚtorch.nnro   rp   rq   rr   rs   Úeinops.layers.torchru   r5   r?   ÚjitÚscript)Ú
use_reduceÚadd_scripted_layerrn   ro   rp   rq   rr   rs   ru   r5   r?   s              rM   Úcreate_torch_modelr‘   ±   sž  € Ý˜WÑ%Ô%ð 
ÝŒ‰ŒˆˆˆàÐÐÐØHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHàAÐAÐAÐAÐAÐAÐAÐAÐAÐAàˆzØˆF�1�a VÐ,Ñ,Ô,ØISÐqˆFˆFÐ1°5¸QÀ1ÐEÑEÔEÐEÐYbÐYbÐopÐYqÑYqÔYqØˆF�1�b fÐ-Ñ-Ô-ØˆFÐ1°5¸QÀ1ÐEÑEÔEà!ð3ˆEŒI×Ò˜Y˜YÐ'=Ñ>Ô>Ñ?Ô?Ð?à�Ð1Ñ2Ô2ØˆF�:˜sÑ#Ô#ØˆD‰FŒFØˆF�3˜‰OŒOØˆD‰FŒFØˆFÐ#°'ÀdÈrÐVXÐYÑYÔYØˆFÐ#°'ÀdÈrÐVXÐYÑYÔYØˆF�2�r‰NŒNñ
ô 
ð 	
r]   c                  ó  — t          d¦  «        st          j        ¦   «          d S dd l} dd l} t          d¬¦  «        }t          d¬¦  «        }|                      g d¢¦  «        }|                       ||¦  «         ||¦  «        ¦  «        rJ ‚|                     t          j
        t          j        |                     ¦   «         ¦  «        ¦  «        ¦  «         |                       ||¦  «         ||¦  «        ¦  «        sJ ‚| j                             ||¬¦  «        }| j                              ||¦  «         ||¦  «        dd¬	¦  «         | j                              ||d
z   ¦  «         ||d
z   ¦  «        dd¬	¦  «         | j                             ||¬¦  «        }| j                              ||¦  «         ||¦  «        dd¬	¦  «         | j                              ||d
z   ¦  «         ||d
z   ¦  «        dd¬	¦  «         d S )Nrn   r   T)r�   F©r   r   é    r”   )Úexample_inputsçü©ñÒMbP?©ÚatolÚrtolr   )r	   rˆ   r‰   rn   rŠ   r‘   Úrandnr>   Úload_state_dictr:   r;   r<   Ú
state_dictr�   ÚtraceÚtestingÚassert_close)rn   Úmodel1Úmodel2ÚinputÚmodel3Úmodel4s         rM   Útest_torch_layerr¥   Ì   s  € Ý˜WÑ%Ô%ð _ÝŒ‰Œˆˆˆð 	ˆˆˆØÐÐÐå#¨tÐ4Ñ4Ô4ˆÝ#¨uÐ5Ñ5Ô5ˆØ—’˜O˜O˜OÑ,Ô,ˆà—>’> & &¨¡-¤-°°¸±´Ñ?Ô?Ð?Ð?Ð?Ø×Ò�vœ|­F¬L¸×9JÒ9JÑ9LÔ9LÑ,MÔ,MÑNÔNÑOÔOÐOØ�~Š~˜f˜f U™mœm¨V¨V°E©]¬]Ñ;Ô;Ð;Ð;Ð;ð ”—’ ¸�Ñ>Ô>ˆØŒ×"Ò" 6 6¨%¡=¤=°&°&¸±-´-ÀdÐQUÐ"ÑVÔVÐVØŒ×"Ò" 6 6¨%°!©)Ñ#4Ô#4°f°f¸UÀQ¹YÑ6GÔ6GÈdÐY]Ð"Ñ^Ô^Ð^à”—’ ¸�Ñ>Ô>ˆØŒ×"Ò" 6 6¨%¡=¤=°&°&¸±-´-ÀdÐQUÐ"ÑVÔVÐVØŒ×"Ò" 6 6¨%°!©)Ñ#4Ô#4°f°f¸UÀQ¹YÑ6GÔ6GÈdÐY]Ð"Ñ^Ô^Ð^Ð^Ð^r]   c                  óD  — t          d¦  «        st          j        ¦   «          d S dd l} dD ]t}t	          d|¬¦  «        }| j                             |¦  «        }|                      g d¢¦  «        }| j         	                     ||¦  «         ||¦  «        dd¬¦  «         Œud S )	Nrn   r   )FTT)r�   r�   r“   r–   r—   )
r	   rˆ   r‰   rn   r‘   r�   rŽ   rš   rž   rŸ   )rn   Úscript_layerr    r¡   r¢   s        rM   Útest_torch_layers_scriptingr¨   æ   s·   € Ý˜WÑ%Ô%ð 
[ÝŒ‰Œˆˆˆàˆˆˆà)ð 	[ð 	[ˆLÝ'°4ÈLÐYÑYÔYˆFØ”Y×%Ò% fÑ-Ô-ˆFØ—K’K   Ñ0Ô0ˆEàŒM×&Ò& v v¨e¡}¤}°f°f¸U±m´mÈ$ÐUYÐ&ÑZÔZÐZÐZð	[ð 	[r]   c                  ód  ‡‡‡‡‡‡‡— t           j                             ¦   «         } t          d¦  «        st	          j        ¦   «          d S dd l}|j        dk     rt	          j        ¦   «          ddlm	Š ddlm
Š ddlmŠ ddlmŠ ddlmŠmŠmŠm} ˆˆˆˆˆˆˆfd	„} |¦   «         } |¦   «         }|                      g d
¢¬¦  «                             d¦  «        }t          j        |                     |¦  «        |                     |¦  «        ¦  «        rJ ‚d}t/          d|¦  «         |j        j                             ||¦  «         |j        j                             ||¬¦  «        }t           j                             |                     |¦  «        |                     |¦  «        ¦  «         d}	|j        j                             |                     ¦   «         |¬¦  «        }
|                      |	¦  «         |
 !                    |	¦  «         | !                    |	¦  «         t           j                             |                     |¦  «        |                     |¦  «        ¦  «         t           j                             |                     |¦  «        |
                     |¦  «        ¦  «         d S )NÚ
tensorflowr   z2.16.)ÚConv2D)ÚDense)rr   )rs   )ru   r5   r?   Úkeras_custom_objectsc                  ó8  •—  ‰ ‰ ddg d¢¬¦  «         ‰dddd¬¦  «         ‰ d	d¬
¦  «         ‰dddd¬¦  «         ‰d¦  «         ‰d¦  «         ‰¦   «          ‰d¦  «         ‰¦   «          ‰ddddd¬¦  «         ‰ddddd¬¦  «         ‰d¦  «        g¦  «        S )Nrv   r    )r”   r”   r   )rx   r   ry   rd   r   r   rz   rw   r   r{   r|   r}   r~   r   r€   r„   r…   r†   r‡   r   r   )ro   ru   rp   rr   r5   r?   rs   s   €€€€€€€rM   Úcreate_keras_modelz,test_keras_layer.<locals>.create_keras_model  së   ø€ Ø�:à�F˜1¨!¸¸¸ÐEÑEÔEØ�FÐ9¸5ÀQÈ1ÐMÑMÔMØ�F˜2¨1Ð-Ñ-Ô-Ø�FÐ9¸5ÀQÈ1ÐMÑMÔMØ�IÐ4Ñ5Ô5Ø�F˜3‘K”KØ�D‘F”FØ�F˜2‘J”JØ�D‘F”FØ�FÐ+¸'ÈdÐWYÐ^`ÐaÑaÔaØ�FÐ+¸'ÈdÐWYÐ^`ÐaÑaÔaØ�F˜2‘J”Jðñô ð r]   )r   r”   r”   r   )Úsizer&   z/tmp/einops_tf_model.h5Útemp_path_keras1)Úcustom_objectsz/tmp/einops_tf_model.weights.h5)"r1   ÚrandomÚdefault_rngr	   rˆ   r‰   rª   Ú__version__Útensorflow.keras.layersr«   r¬   rr   Útensorflow.keras.modelsrs   Úeinops.layers.kerasru   r5   r?   r­   ÚnormalÚastyper>   Úpredict_on_batchr.   ÚkerasÚmodelsÚ
save_modelÚ
load_modelrž   Úassert_allcloseÚmodel_from_jsonÚto_jsonÚsave_weightsÚload_weights)ÚrngÚtfr­   r¯   r    r¡   r¢   Útmp_model_filenamer£   Úweight_filenamer¤   ro   ru   rp   rr   r5   r?   rs   s              @@@@@@@rM   Útest_keras_layerrÉ   ô   sÝ  øøøøøøø€ Ý
Œ)×
Ò
Ñ
!Ô
!€CÝ˜\Ñ*Ô*ð ;cÝŒ‰ŒˆˆˆàÐÐÐàŒ>˜GÒ#Ð#åŒK‰MŒMˆMØ<Ð<Ð<Ð<Ð<Ð<Ø;Ð;Ð;Ð;Ð;Ð;Ø0Ð0Ð0Ð0Ð0Ð0Ø6Ð6Ð6Ð6Ð6Ð6àWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð$ $Ð#Ñ%Ô%ˆØ#Ð#Ñ%Ô%ˆà—
’
   �
Ñ0Ô0×7Ò7¸	ÑBÔBˆå”;˜v×6Ò6°uÑ=Ô=¸v×?VÒ?VÐW\Ñ?]Ô?]Ñ^Ô^Ð^Ð^Ð^ð 7ÐåÐ Ð"4Ñ5Ô5Ð5Ø
ŒŒ×"Ò" 6Ð+=Ñ>Ô>Ð>Ø””×+Ò+Ð,>ÐOcÐ+ÑdÔdˆå
Œ
×"Ò" 6×#:Ò#:¸5Ñ#AÔ#AÀ6×CZÒCZÐ[`ÑCaÔCaÑbÔbÐbà;ˆà””×0Ò0°·²Ñ1AÔ1AÐRfÐ0ÑgÔgˆØ×Ò˜OÑ,Ô,Ð,Ø×Ò˜OÑ,Ô,Ð,Ø×Ò˜OÑ,Ô,Ð,å
Œ
×"Ò" 6×#:Ò#:¸5Ñ#AÔ#AÀ6×CZÒCZÐ[`ÑCaÔCaÑbÔbÐbõ 	Œ
×"Ò" 6×#:Ò#:¸5Ñ#AÔ#AÀ6×CZÒCZÐ[`ÑCaÔCaÑbÔbÐbÐbÐbr]   c                  óþ  ‡‡‡‡‡‡‡— t          d¦  «        st          j        ¦   «          dS ddl} ddl}ddlmŠ ddlmŠ ddlm	Šm
ŠmŠ  G ˆˆˆˆfd„d‰j        ¦  «        } |¦   «         Š‰                     g d¢¦  «        Š‰                     |j                             d¦  «        ‰¦  «        }ˆˆˆfd	„}|                     |¦  «        } ||¦  «        } ||¦  «        \  }}‰                     ||¦  «        sJ ‚|j        d
k     r|j        }	n|j        j        }	 |	d„ ||¦  «        }
 ||
¦  «        }||k    sJ ||f¦   «         ‚| j                             |¦  «        }| j                             ||¦  «        }dS )z|
    One-off simple tests for Flax layers.
    Unfortunately, Flax layers have a different interface from other layers.
    Újaxr   N)Úlinenrt   c                   ó8   •— e Zd Z”j        ˆ ˆˆfd„¦   «         ZdS )útest_flax_layers.<locals>.NNc                 óê   •—   ‰dddt          dddd¬¦  «        ¬	¦  «        |¦  «        }  ‰d
t          d¬¦  «        ¬	¦  «        |¦  «        }  ‰ddt          d¬¦  «        ¦  «        |¦  «        }|S )Nz b (h h2) (w w2) c -> b h w c_outzh2 w2 c c_outÚc_outr   r   é   r    )r   r   r   rÐ   )Úsizeszb h w c -> b (w h c)r   z
b hwc -> brc   r   )Úhwc)Údict)ÚselfrC   ru   r5   r?   s     €€€rM   Ú__call__z%test_flax_layers.<locals>.NN.__call__D  s    ø€ ð�F�FØ6¸ÈÕX\Ð`aÐfgÐklÐtuÐXvÑXvÔXvðñ ô àñô �ð G�I�IÐ4½DÀ1¸I¹I¼IÐFÑFÔFÀqÑIÔI�ØE�F�F˜<¨µ¸)Ð1DÑ1DÔ1DÑEÔEÀaÑHÔH�Ø�r]   N)Ú__name__Ú
__module__Ú__qualname__ÚcompactrÖ   )ru   r5   r?   Únns   €€€€rM   ÚNNrÎ   C  sD   ø€ € € € € ØŒZðð ð ð ð ð ñ ŒZðð ð r]   rÜ   )r   rÑ   é	   rÑ   c                 ó`   •— ‰j                              ‰                     | ‰¦  «        ¦  «        S )N)ÚlinalgÚnormÚapply)ÚparamsÚfixed_inputÚjnpÚmodels    €€€rM   Úeval_at_pointz'test_flax_layers.<locals>.eval_at_pointQ  s%   ø€ Ø”:—?’? 5§;¢;¨v°{Ñ#CÔ#CÑDÔDÐDr]   z0.6.0c                 ó   — | |dz  z
  S )Nr–   r   )Úx1Úx2s     rM   ú<lambda>z"test_flax_layers.<locals>.<lambda>]  s   € ¨"¨r°E©z©/€ r]   )r	   rˆ   r‰   ÚflaxrË   Ú	jax.numpyÚnumpyrÌ   Úeinops.layers.flaxru   r5   r?   ÚModuleÚonesÚinitr³   ÚPRNGKeyÚvalue_and_gradr>   rµ   Útree_mapÚtreeÚmapÚserializationÚto_bytesÚ
from_bytes)rë   rË   rÜ   râ   ræ   ÚvandgÚvalue0Úvalue1Úgrad1rô   Úparams2Úvalue2ÚfbytesÚ_loadedru   r5   r?   rã   rä   rå   rÛ   s                 @@@@@@@rM   Útest_flax_layersr  4  s  øøøøøøø€ õ
 ˜UÑ#Ô#ð +@ÝŒ‰ŒˆˆˆàˆˆˆØˆ
ˆ
ˆ
ØÐÐÐÐÐØ$Ð$Ð$Ð$Ð$Ð$à@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	�”ñ 	ô 	ð 	ð �‘”ˆØ—h’hÐ4Ð4Ð4Ñ5Ô5ˆØ—’˜CœJ×.Ò.¨qÑ1Ô1°;Ñ?Ô?ˆð	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð ×"Ò" =Ñ1Ô1ˆØ�˜vÑ&Ô&ˆØ˜˜f™œ‰ˆ�Ø�|Š|˜F FÑ+Ô+Ð+Ð+Ð+ØŒ?˜WÒ$Ð$Ø”|ˆHˆHà”x”|ˆHà�(Ð9Ð9¸6À5ÑIÔIˆà�˜wÑ'Ô'ˆØ˜ÒÐÐ &¨&Ð!1ÑÔÐð Ô#×,Ò,¨VÑ4Ô4ˆØÔ$×/Ò/°¸Ñ?Ô?ˆˆˆr]   c            
      óú  — ddl m}   | ddddd¬¦  «        }|j        �J ‚|j        �J ‚|j        d
k    sJ ‚|j        g d¢k    sJ ‚|j        �J ‚ | dddddddd¬¦  «        }|j        �J ‚|j        �J ‚|j        d
k    sJ ‚|j        g d¢k    sJ ‚|j        g d¢k    sJ ‚ | ddd¬¦  «        }|j        �J ‚|j        �J ‚|j        dk    sJ ‚|j        g k    sJ ‚|j        g k    sJ ‚ | ddddd¬¦  «        }|j        �J ‚|j        �J ‚|j        dk    sJ ‚|j        g d¢k    sJ ‚|j        �J ‚ | ddddd¬¦  «        }|j        dk    sJ ‚|j        t          dd¬¦  «        k    sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚|j        g d¢k    sJ ‚|j        �J ‚ | dd d!ddd¬"¦  «        }|j        d#k    sJ ‚|j        t          dd¬$¦  «        k    sJ ‚|j        d%k    sJ ‚|j        d&k    sJ ‚|j        ddgk    sJ ‚|j        g d'¢k    sJ ‚ | d(d)d*ddd¬+¦  «        }|j        d,k    sJ ‚|j        t          dd¬-¦  «        k    sJ ‚|j        d.k    sJ ‚|j        d/k    sJ ‚|j        g d0¢k    sJ ‚|j        g d1¢k    sJ ‚d	S )2zP
    Testing that einmix correctly decomposes into smaller transformations.
    r   ©Ú_EinmixDebuggerúa b c d e -> e d c b aúd a br   r   r    ©r�   ÚdÚar   Nzabcde,dab->edcba)r   r   r    z	a b c d er   rÑ   )r�   r‚   r
  r   r   r	  Úe)rÑ   r   r   )r    rÑ   r   r   r   z
... -> ...Ú )r�   r‚   z	...,->...zb a ...  -> b c ...zb a c)r�   r
  r   r   zba...,bac->bc...)r   r   r   z(b a) ... -> b c (...)z(b a) ... -> b a ...)r
  r   zb c ... -> b c (...)zb ... (a c) -> b ... (a d)zc dza d)r�   r‚   r
  r   r	  zb ... (a c) -> b ... a c)r
  r   zb ... a d -> b ... (a d)zb...ac,cd->b...ad)r   r   rÑ   za ... (b c) -> a (... d b)zc d bzd b)r�   r‚   r   r   r	  za ... (b c) -> a ... b c)r   r   za ... d b -> a (... d b)za...bc,cdb->a...db)r   rÑ   r   )r   rÑ   r   )	Úeinops.layers._einmixr  Úpre_reshape_patternÚpost_reshape_patternÚeinsum_patternÚsaved_weight_shapeÚsaved_bias_shapeÚpre_reshape_lengthsrÔ   )r  Úmixin1Úmixin2Úmixin3Úmixin4Úmixin5Úmixin6Úmixin7s           rM   Útest_einmix_decompositionr  g  s7  € ð 6Ð5Ð5Ð5Ð5Ð5àˆ_Ø ØØ
ˆq�Aðñ ô €Fð
 Ô%Ð-Ð-Ð-ØÔ&Ð.Ð.Ð.ØÔ Ð$6Ò6Ð6Ð6Ð6ØÔ$¨	¨	¨	Ò1Ð1Ð1Ð1ØÔ"Ð*Ð*Ð*àˆ_Ø ØØØ
ˆq�A˜˜að	ñ ô €Fð Ô%Ð-Ð-Ð-ØÔ&Ð.Ð.Ð.ØÔ Ð$6Ò6Ð6Ð6Ð6ØÔ$¨	¨	¨	Ò1Ð1Ð1Ð1ØÔ" o o oÒ5Ð5Ð5Ð5àˆ_ØØØðñ ô €Fð
 Ô%Ð-Ð-Ð-ØÔ&Ð.Ð.Ð.ØÔ  KÒ/Ð/Ð/Ð/ØÔ$¨Ò*Ð*Ð*Ð*ØÔ" bÒ(Ð(Ð(Ð(àˆ_ØØØ
ˆq�Aðñ ô €Fð
 Ô%Ð-Ð-Ð-ØÔ&Ð.Ð.Ð.ØÔ Ð$6Ò6Ð6Ð6Ð6ØÔ$¨	¨	¨	Ò1Ð1Ð1Ð1ØÔ"Ð*Ð*Ð*àˆ_Ø ØØ
ˆq�Aðñ ô €Fð
 Ô%Ð)?Ò?Ð?Ð?Ð?ØÔ%­°°Q¨©¬Ò7Ð7Ð7Ð7ØÔ&Ð*@Ò@Ð@Ð@Ð@ØÔ Ð$6Ò6Ð6Ð6Ð6ØÔ$¨	¨	¨	Ò1Ð1Ð1Ð1ØÔ"Ð*Ð*Ð*àˆ_Ø$ØØØ
ˆq�Að	ñ ô €Fð Ô%Ð)CÒCÐCÐCÐCØÔ%­°°Q¨©¬Ò7Ð7Ð7Ð7ØÔ&Ð*DÒDÐDÐDÐDØÔ Ð$7Ò7Ð7Ð7Ð7ØÔ$¨¨A¨Ò.Ð.Ð.Ð.ØÔ" i i iÒ/Ð/Ð/Ð/àˆ_Ø$ØØØ
ˆq�Að	ñ ô €Fð Ô%Ð)CÒCÐCÐCÐCØÔ%­°°Q¨©¬Ò7Ð7Ð7Ð7ØÔ&Ð*DÒDÐDÐDÐDØÔ Ð$8Ò8Ð8Ð8Ð8ØÔ$¨	¨	¨	Ò1Ð1Ð1Ð1ØÔ" i i iÒ/Ð/Ð/Ð/Ð/Ð/r]   c                  ó  — ddl m}  t          j        t          ¦  «        5   | dddd¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5   | dd	ddd
¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5   | ddd
¬¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5   | ddd
d¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z!
    Testing different cases
    r   r  r  r  r   r   )r�   r	  r
  Nzw a br   r  z(...) a -> ... ar
  )r�   r
  z(...) a -> a ...)r�   r
  r‚   )r  r  rˆ   Úraisesr   r  s    rM   Útest_einmix_restrictionsr  Á  sN  € ð 6Ð5Ð5Ð5Ð5Ð5å	Œ•{Ñ	#Ô	#ð 
ð 
ØˆØ$Ø Ø�1ð	
ñ 	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ 
Œ•{Ñ	#Ô	#ð 
ð 
ØˆØ$Ø Ø�1˜ð	
ñ 	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ 
Œ•{Ñ	#Ô	#ð 
ð 
ØˆØØ ð	
ñ 	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
õ 
Œ•{Ñ	#Ô	#ð 
ð 
ØˆØØ Øð	
ñ 	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
sE    <¼A ÁA Á A=Á=BÂBÂ!B<Â<C ÃC Ã C=Ã=DÄD)FF)r:   Úcollectionsr   rí   r1   rˆ   Úeinopsr   r   r   Úeinops.testsr   rf   r   r	   Ú
__author__r
   rÔ   r0   rN   r\   rg   rj   rl   r‘   r¥   r¨   rÉ   r  r  r  r   r]   rM   ú<module>r#     s›  ðØ €€€Ø "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aà€
àˆ:�jÐ"\Ð"\Ð"\Ñ]Ô]€ð €HØØˆˆrˆ
‰
Œ
ØØ	ˆU�LÐ"2Ð4DÐ4DÐ4DÐEñ	ô ð €HØ2Øˆ��aÐÑÔØØ*Ð*Ð*ñ	ô ð €HØØˆˆrˆ
‰
Œ
ØØÐÐñ	ô ðÐ ð,Cð Cð Cð@=ð =ð =ðBØðà€HÐ   r 
¡
¤
Ð,<¸uÀlÐ>SÑTÔTðð €HÐ/°°¸ÀÀaÐ1HÑ1HÔ1HÐJZÐ]mÐ\nÑoÔoðð €Hˆ^˜T˜T B˜Z™ZœZÐ)9¸EÀ8Ð;LÑMÔMð	Ð ð&.ð &.ð &.ðR9ð 9ð 9ð4
ð 
ð 
ð 
ð6_ð _ð _ð4[ð [ð [ð=cð =cð =cð@0@ð 0@ð 0@ðfW0ð W0ð W0ðt
ð 
ð 
ð 
ð 
r]   