
    3jH                        S SK r S SKJr  S SKrS SKrS SKJrJrJ	r	  S SK
Jr  S SK
JrJr  Sr\" S/ SQ5      r\" S	\" S
S9SSSSS/ SQ/5      \" S\" SSS9S/ SQ5      \" S\" SS9S/ SQ5      /rS rS r/ \Q\" S\" SS9SSS/5      P\" S\" SSSS 9SS!/5      P\" S"\" SS9SSS#/5      PrS$ rS% rS-S& jrS' rS( rS) rS* rS+ rS, rg).    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                  J   [        SSS9 GH  n [        SU R                  5        [         GH  u  pp4[        R
                  " [        R                  " U5      SS9R                  U5      n[        XQ40 UD6nU R                  5       R                  " U40 UD6nU H7  n U" U R                  [        R                  " USS95      5        [        S5      e   [        R                   " [        R"                  " U5      5      n	U R%                  U" U R                  U5      5      5      n
U R%                  U	" U R                  U5      5      5      n[        R&                  " Xj5      (       d   e[        R&                  " X5      (       d   eU R                  5       R)                  SS	S
9nU R                  U5      nU" U" U5      5      nUR+                  5         [        R&                  " U R%                  UR,                  5      S5      (       a  GM   e   GM     g ! [         a     GM  f = f)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                  R/home/wildlama/miniconda3/lib/python3.13/site-packages/einops/tests/test_layers.pytest_rearrange_imperativerN   %   s   (%E!7!78@V@V<G;		"''+.i@HHUA$Q@<@LNN$..wG,GE%=',,RXXe9-MNO ));<< & \\&,,u"56F&&uW-?-?-B'CDG&&vg.@.@.C'DEG;;|5555;;w0000~~'..w%.HH))!,HeHo.FOO;;w//>BBBB3 AW F % s   *H
H"	!H"	c                     [        SSS9 GH  n [        SU R                  5        [         GH  u  pp4[        R
                  " [        R                  " U5      SS9R                  U5      n[        XQ40 UD6nU R                  5       R                  " U40 UD6nS /[        U5      -  nX8/n	U	 GH  n
U R                  U
5      nX4/nU" U5      nU R                  X5      n[        R                  " Xn5      (       d   e[        R                   " [        R"                  " U5      5      nU" U5      nU R                  UU5      n[        R                  " UU5      (       d   eU R                  5       R%                  SSS9nU R                  U" U5      U5      n[        R&                  " U5      n[        R                  " UU5      (       a  GM   e   GM     GM     g )	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!7!78AWAW=G;		"''+.i@HHUA$Q@<@LNN$..wG,GE$(6C,<#< !8F ..u5 &{m!&v!--nJ{{<9999fll5&9:!'!--nkJ{{7G4444 #>>+227e2L%11(>2JKX ffQi{{;<<<<'   BX E    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                     [        SSS9 GH  n [        SU R                  5        [         GH  n[         GH  u  p#pE[        XX#XE5        [
        R                  " SS[
        R                  " U5      -   SS9R                  U5      nXfR                  5       -  n[        XbU40 UD6nU R                  5       R                  " X!40 UD6nU H7  n	 U" U R                  [
        R                  " U	SS95      5        [        S5      e   ["        R$                  " ["        R&                  " U5      5      n
U R)                  U" U R                  U5      5      5      nU R)                  U
" U R                  U5      5      5      n[
        R*                  " X{5      (       d   e[
        R*                  " X5      (       d   eU R                  5       R                  S	S
S9nU R                  U5      nU" U" U5      5      nUR-                  5         U R)                  UR.                  5      nUS
:X  a  [
        R*                  " US5      (       d   eUS:X  a,  [
        R*                  " UUR1                  5       5      (       d   eUS;   d  GMD  [
        R2                  " [
        R4                  " USS/5      5      (       d   e[
        R6                  " U5      S:  a  GM   e   GM     GM     g ! [          a     GM   f = f)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   si   (%E!7!78#IDVDV@{g'[IIaRWW[%9!9KSST_`VVX%a)L|L(//SlS)EAg00%y1QRS --?@@ *  fll5&9:!**51C1CA1F+GH!**6'2D2DQ2G+HI{{<9999{{74444">>+227e2L"--a0!%/2!''6%;;tQ////&;;tTXXZ8888.66"''$A"7888866$<#---E EW $ F ) s   *K
K('K(c            
          [        SSS9 GH  n [        SU R                  5        [         GHZ  n[         GHK  u  p#pE[
        R                  " SS[
        R                  " U5      -   SS9R                  U5      nXfR                  5       -  n[        XbU40 UD6nU R                  5       R                  " X!40 UD6nS /[        U5      -  n	XI/n
U
 H  nU R                  U5      nX4/nU" U5      nU R                  X5      n[
        R                   " X5      (       d   e["        R$                  " ["        R&                  " U5      5      nU" U5      nU R                  UU5      n[
        R                   " UU5      (       a  M   e   GMN     GM]     GM     g )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!7!78#IEWEWA{IIaRWW[%9!9KSST_`VVX%a)L|L(//SlS(,vK0@'@$%<#E$2259F$*;-K%*6]N%11.NG;;|====#\\&,,u*=>F%+F^N%11.+NG;;w8888 $ FX $ Er]   c                    [        S5      (       d  [        R                  " 5         g SS KnSSKJnJnJnJnJ	n  SSK
JnJn	Jn
  U" U" SSSS9U (       a	  U
" S	S
SSS9OU" SS9U" SSSS9U
" S	S
SSS9U(       a!  UR                  R                  U	" S5      5      OU	" S5      U" SS5      U" 5       U" SS5      U" 5       U" SSSSSS9U" SSSSSS9U" SS5      5      $ )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AA1aV,ISF15Q1EYbopYq1bf-15Q1E! IIY'=>?12:s#F3OF#'drVXY#'drVXY2rN
 	
r]   c                     [        S5      (       d  [        R                  " 5         g SS Kn SS Kn [        SS9n[        SS9nU R                  / SQ5      nU R                  U" U5      U" U5      5      (       a   eUR                  [        R                  " [        R                  " UR                  5       5      5      5        U R                  U" U5      U" U5      5      (       d   eU R                  R                  X#S9nU R                  R!                  U" U5      U" U5      SSS	9  U R                  R!                  U" US
-   5      U" US
-   5      SSS	9  U R                  R                  X#S9nU R                  R!                  U" U5      U" U5      SSS	9  U R                  R!                  U" US
-   5      U" US
-   5      SSS	9  g )Nrn   r   T)r   Fr   r       r   )example_inputsMbP?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      su   W%% 	#t4#u5O,>>&-????v||FLL9J9J9L,MNO~~fUmVE];;;; >""6%=&-dQU"V""6%!)#4fUQY6GdY]"^>""6%=&-dQU"V""6%!)#4fUQY6GdY]"^r]   c                  *   [        S5      (       d  [        R                  " 5         g SS Kn S Hc  n[	        SUS9nU R
                  R                  U5      nU R                  / SQ5      nU R                  R                  U" U5      U" U5      SSS9  Me     g )	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      su    W%%)L'4LYFYY%%f-FKK0EMM&&ve}fUm$UY&Z *r]   c                    ^^^^^^^ [         R                  R                  5       n [        S5      (       d  [        R
                  " 5         g SS KnUR                  S:  a  [        R
                  " 5         SSKJ	m  SSKJ
m  SSKJm  SSKJm  SSKJmJmJmJn  UUUUUUU4S	 jnU" 5       nU" 5       nU R'                  / S
QS9R)                  S5      n[         R*                  " UR-                  U5      UR-                  U5      5      (       a   eSn[/        SU5        UR0                  R2                  R5                  XG5        UR0                  R2                  R7                  XrS9n[         R8                  R;                  UR-                  U5      UR-                  U5      5        Sn	UR0                  R2                  R=                  UR?                  5       US9n
URA                  U	5        U
RC                  U	5        URC                  U	5        [         R8                  R;                  UR-                  U5      UR-                  U5      5        [         R8                  R;                  UR-                  U5      U
R-                  U5      5        g )N
tensorflowr   z2.16.)Conv2D)Dense)rr   )rs   )ru   r5   r?   keras_custom_objectsc                     > T" T " SS/ SQS9T" SSSSS9T " S	SS
9T" SSSSS9T" S5      T" S5      T" 5       T" S5      T" 5       T" SSSSSS9T" SSSSSS9T" S5      /5      $ )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_model,test_keras_layer.<locals>.create_keras_model  s    1!E95Q1M21-95Q1M453KF2JF+'dWY^`a+'dWY^`a2J 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\**>>G#KKM<;06WW	 	$ $%#%


077	B;;v66u=v?V?VW\?]^^^^ 7 "45
""6>++,>+d


""6#:#:5#A6CZCZ[`Cab;001ARf0gO,O,O,


""6#:#:5#A6CZCZ[`Cab 	

""6#:#:5#A6CZCZ[`Cabr]   c                    ^^^^^^^ [        S5      (       d  [        R                  " 5         gSSKn SSKnSSKJm  SSKJm  SSKJ	mJ
mJm   " UUUU4S jSTR                  5      nU" 5       mTR                  / SQ5      mTR                  UR                  R!                  S5      T5      nUUU4S	 jnUR#                  U5      nU" U5      nU" U5      u  pxTR%                  Xg5      (       d   eUR&                  S
:  a  UR(                  n	OUR*                  R,                  n	U	" S X85      n
U" U
5      nXk:  d   Xk45       eU R.                  R1                  U5      nU R.                  R3                  X<5      ng)zp
One-off simple tests for Flax layers.
Unfortunately, Flax layers have a different interface from other layers.
jaxr   N)linenrt   c                   F   > \ rS rSr YR                  U UU4S j5       rSrg)test_flax_layers.<locals>.NNiC  c                    > T" SSS[        SSSSS9S	9" U5      nT" S
[        SS9S	9" U5      nT" SS[        SS95      " U5      nU$ )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__%test_flax_layers.<locals>.NN.__call__D  sc    6X\`afgkltuXv 4D1IFqI<)1DEaHr]   r   N)__name__
__module____qualname____firstlineno__compactr   __static_attributes__)ru   r5   r?   nns   rM   NNr   C  s    ZZ r]   r   )r   r   	   r   c                 Z   > TR                   R                  TR                  U T5      5      $ )N)linalgnormapply)paramsfixed_inputjnpmodels    rM   eval_at_point'test_flax_layers.<locals>.eval_at_pointQ  s!    ::??5;;v{#CDDr]   z0.6.0c                     XS-  -
  $ )Nr   r   )x1x2s     rM   <lambda>"test_flax_layers.<locals>.<lambda>]  s
    "Ez/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  s4   
 U##$@@	 	 	 hh45CJJ..q1;?	E ""=1v&f||F++++??W$||Hxx||H96Iw'1&!11 ##,,V4$$//?r]   c                     SSK Jn   U " SSSSSS9nUR                  b   eUR                  b   eUR                  S
:X  d   eUR
                  / SQ:X  d   eUR                  b   eU " SSSSSSSSS9nUR                  b   eUR                  b   eUR                  S
:X  d   eUR
                  / SQ:X  d   eUR                  / SQ:X  d   eU " SSSS9nUR                  b   eUR                  b   eUR                  S:X  d   eUR
                  / :X  d   eUR                  / :X  d   eU " SSSSSS9nUR                  b   eUR                  b   eUR                  S:X  d   eUR
                  / SQ:X  d   eUR                  b   eU " SSSSSS9nUR                  S:X  d   eUR                  [        SSS9:X  d   eUR                  S:X  d   eUR                  S:X  d   eUR
                  / SQ:X  d   eUR                  b   eU " SS S!SSSS"9nUR                  S#:X  d   eUR                  [        SSS$9:X  d   eUR                  S%:X  d   eUR                  S&:X  d   eUR
                  SS/:X  d   eUR                  / S'Q:X  d   eU " S(S)S*SSSS+9nUR                  S,:X  d   eUR                  [        SSS-9:X  d   eUR                  S.:X  d   eUR                  S/:X  d   eUR
                  / S0Q:X  d   eUR                  / S1Q:X  d   eg	)2zH
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  s    6 
qAF
 %%---&&...  $6666$$	111""*** 
qAa	F %%---&&...  $6666$$	111""o555F
 %%---&&...  K///$$***""b(((
qAF
 %%---&&...  $6666$$	111""*** 
qAF
 %%)????%%Q777&&*@@@@  $6666$$	111""***$
qA	F %%)CCCC%%Q777&&*DDDD  $7777$$A...""i///$
qA	F %%)CCCC%%Q777&&*DDDD  $8888$$	111""i///r]   c            	         SSK Jn   [        R                  " [        5         U " SSSSS9  SSS5        [        R                  " [        5         U " SS	SSS
S9  SSS5        [        R                  " [        5         U " SSS
S9  SSS5        [        R                  " [        5         U " SSS
SS9  SSS5        g! , (       d  f       N= f! , (       d  f       Nw= f! , (       d  f       N]= f! , (       d  f       g= f)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$    s     6	{	#$ 1	
 
$ 
{	#$ 1	
 
$ 
{	#	
 
$ 
{	#	
 
$	#) 
$	# 
$	# 
$	# 
$	#s/   
B8C	:	C%
C+8
C	
C
C(+
C9)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)     sI    "   1 1 7 A
j"\] r
	UL"24DE	 2a*	 r
	 ,C@=Br
,<ul>ST /a1HJZ]m\no ^TBZ)9E8;LM	 &.R94
6_4[=c@0@fW0t
r]   