
    'iH                        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y).    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                  0   t        dd      D ]  } t        d| j                         t        D ]  \  }}}}t	        j
                  t	        j                  |      d      j                  |      }t        ||fi |} | j                         j                  |fi |}|D ]9  }	  || j                  t	        j                  |d                   t        d       t        j                   t        j"                  |            }	| j%                   || j                  |                  }
| j%                   |	| j                  |                  }t	        j&                  ||
      sJ t	        j&                  |
|      sJ | j                         j)                  dd	
      }| j                  |      } | ||            }|j+                          t	        j&                  | j%                  |j,                        d      rJ   y # t        $ r Y tw xY w)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/var/www/stems/demucs_env/lib/python3.12/site-packages/einops/tests/test_layers.pytest_rearrange_imperativerN   %   s   (%E C!7!78@V 	C<G\;		"''+.i@HHUA$Q@<@L.GNN$..wG,GE% ==',,RXXe9-MNO ));<<= \\&,,u"56F&&uW-?-?-B'CDG&&vg.@.@.C'DEG;;|W555;;w000~~'..w%.HH))!,HeHo.FOO;;w//>BBB3	CC % s   $,H	H	H	c                     t        dd      D ]  } t        d| j                         t        D ]  \  }}}}t	        j
                  t	        j                  |      d      j                  |      }t        ||fi |} | j                         j                  |fi |}d gt        |      z  }||g}	|	D ]  }
| j                  |
      }||fg} ||      }| j                  ||      }t	        j                  ||      sJ t        j                   t        j"                  |            } ||      }| j                  ||      }t	        j                  ||      sJ | j                         j%                  dd      }| j                   ||      |      }t	        j&                  |      }t	        j                  ||      rJ    y )	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8AW 	==G\;		"''+.i@HHUA$Q@<@L.GNN$..wG,GE$(6C,<#< !#78F = ..u5 &{m!&v!--nkJ{{<999fll5&9:!'!--nkJ{{7G444 #>>+227e2L%11(>2JKX ffQi{{;<<<'=	==    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 ]z  \  }}}}t        | |||||       t        j                  ddt        j                  |      z   d      j                  |      }||j                         z  }t        |||fi |} | j                         j                  ||fi |}|D ]9  }		  || j                  t        j                  |	d                   t        d       t#        j$                  t#        j&                  |            }
| j)                   || j                  |                  }| j)                   |
| j                  |                  }t        j*                  ||      sJ t        j*                  ||      sJ | j                         j                  d	d
      }| j                  |      } | ||            }|j-                          | j)                  |j.                        }|d
k(  rt        j*                  |d      sJ |dk(  r&t        j*                  ||j1                               sJ |dv s4t        j2                  t        j4                  |ddg            sJ t        j6                  |      dkD  r{J    y # t         $ r Y w xY w)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 %.!7!78# #	.IDV ".@{Lgy'<l[IIaRWW[%9!9KSST_`QVVX%a)L|L/(//SlS) AEAg00%y1QRS --?@@A  fll5&9:!**51C1CA1F+GH!**6'2D2DQ2G+HI{{<999{{7G444">>+227e2L"--a0!%/2!''6%;;tQ///&;;tTXXZ888.66"''$A"788866$<#---E".#	.%. ) s   ,J==	K
	K
c            
         t        dd      D ]t  } t        d| j                         t        D ]Q  }t        D ]D  \  }}}}t        j                  ddt        j                  |      z   d      j                  |      }||j                         z  }t        |||fi |} | j                         j                  ||fi |}d gt        |      z  }	||	g}
|
D ]  }| j                  |      }||fg} ||      }| j                  ||      }t        j                   ||      sJ t#        j$                  t#        j&                  |            } ||      }| j                  ||      }t        j                   ||      rJ  G T w y )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      sz   ($tD 9!7!78# 	9IEW 9A{MIIaRWW[%9!9KSST_`QVVX%a)L|L/(//SlS(,vK0@'@$%';<# 9E$2259F$*A;-K%*6]N%11.+NG;;|W===#\\&,,u*=>F%+F^N%11.+NG;;w88899	99r]   c                    t        d      st        j                          y 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                  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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                     t        d      st        j                          y dd l} dd l} t        d      }t        d      }| j                  g d      }| j                   ||       ||            rJ |j                  t        j                  t        j                  |j                                            | j                   ||       ||            sJ | j                  j                  ||      }| j                  j!                   ||       ||      dd	       | j                  j!                   ||d
z          ||d
z         dd	       | j                  j                  ||      }| j                  j!                   ||       ||      dd	       | j                  j!                   ||d
z          ||d
z         dd	       y )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      sp   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                  &   t        d      st        j                          y dd l} dD ]h  }t	        d|      }| j
                  j                  |      }| j                  g d      }| j                  j                   ||       ||      dd       j y )	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      sy    W%) 	[L'4LYFYY%%f-FKK0EMM&&ve}fUm$UY&Z	[r]   c                     t         j                  j                         } t        d      st	        j
                          y 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	} |       } |       }| j'                  g d
      j)                  d      }t        j*                  |j-                  |      |j-                  |            rJ d}t/        d|       |j0                  j2                  j5                  ||       |j0                  j2                  j7                  ||      }t         j8                  j;                  |j-                  |      |j-                  |             d}	|j0                  j2                  j=                  |j?                         |      }
|jA                  |	       |
jC                  |	       |jC                  |	       t         j8                  j;                  |j-                  |      |j-                  |             t         j8                  j;                  |j-                  |      |
j-                  |             y )N
tensorflowr   z2.16.)Conv2D)Dense)rr   )rs   )ru   r5   r?   keras_custom_objectsc                         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    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+=>++,>Oc+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                     t        d      st        j                          y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                        } |       j                  g d      j                  |j                  j!                  d            }fd	}|j#                  |      } ||      } ||      \  }}j%                  ||      sJ |j&                  d
k  r|j(                  }	n|j*                  j,                  }	 |	d ||      }
 ||
      }||k\  s	J ||f       | j.                  j1                  |      }| j.                  j3                  ||      }y)z|
    One-off simple tests for Flax layers.
    Unfortunately, Flax layers have a different interface from other layers.
    jaxr   N)linenrt   c                   <    e Zd ZW j                   fd       Zy)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  sl    F6X\`afgkltuXv GI4D1IFqIEF<)1DEaHr]   N)__name__
__module____qualname__compactr   )ru   r5   r?   nns   rM   NNr   C  s    ZZ r]   r   )r   r   	   r   c                 Z    j                   j                  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DDr]   z0.6.0c                     | |dz  z
  S )Nr   r   )x1x2s     rM   <lambda>z"test_flax_layers.<locals>.<lambda>]  s    "rEz/ 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#$@@	 	 	 hh45CJJ..q1;?	E ""=1v&f||FF+++??W$||Hxx||H965Iw'1&&!11 ##,,V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 y	)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  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                     ddl m}  t        j                  t              5   | dddd       ddd       t        j                  t              5   | dd	ddd
       ddd       t        j                  t              5   | ddd
       ddd       t        j                  t              5   | ddd
d       ddd       y# 1 sw Y   xY w# 1 sw Y   qxY w# 1 sw Y   PxY w# 1 sw Y   yxY w)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/   C C=C*C$ C	CC!$C-)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]   