o
    ٷiH                  
   @   sh  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dg dgededdddg dededddg dgZdd Zdd Zg eededddddged ed!ddd"dd#ged$eddddd%gZd&d' Zd(d) Zd9d+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 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                  C   sT  t dddD ]} td| j tD ]\}}}}tjt|dd|}t||fi |}| 	 j
|fi |}|D ]}z|| tj|dd W td tyU   Y q9w tt|}	| || |}
| |	| |}t||
szJ t|
|sJ | 	 jdd	d
}| |}|||}|  t| |jdsJ qqd 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BaseExceptionAssertionErrorpickleloadsdumpsto_numpyallcloseReducebackwardgrad)backendr
   r   r   r   xresult_numpylayershapelayer2result1result2just_sumvariableresultr   r   L/home/ubuntu/.local/lib/python3.10/site-packages/einops/tests/test_layers.pytest_rearrange_imperative%   s2   
rL   c                  C   s>  t dddD ]} td| j tD ]\}}}}tjt|dd|}t||fi |}| 	 j
|fi |}d gt| }||g}	|	D ]V}
| |
}||fg}||}| ||}t||sbJ tt|}||}| ||}t||s|J | 	 jddd}| |||}t|}t||sJ qDqqd S )	NTr    r#   r$   r%   r(   r)   r*   )r   r,   r-   r.   r/   r0   r1   r2   r   r"   r3   lencreate_symboleval_symbolr<   r8   r9   r:   r=   r)   )r@   r
   r   r   _wrong_shapesrA   rB   rC   input_shape_of_nonesshapesrD   symboleval_inputsresult_symbol1rF   rE   result_symbol2rG   rH   result_sum1result_sum2r   r   rK   test_rearrange_symbolicE   s2   


rY   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                  C   s  t dddD ]} td| j tD ]}tD ]\}}}}t| ||||| tjddt| dd|}||	  }t
|||fi |}|  j||fi |}|D ]}	z|| tj|	dd W td tym   Y qQw tt|}
| || |}| |
| |}t||sJ t||sJ |  jd	d
d}| |}|||}|  | |j}|d
krt|dsJ |dkrt|| sJ |dv rtt|ddgsJ t|dksJ qqqd S )NFTr    r#   r   r$   r%   r'   r(   r)   r*   mean)maxminr   g      ?)r   r,   r-   
REDUCTIONSreduction_patternsr/   r0   r1   r2   r^   r   r"   r=   r4   r5   r6   r7   r8   r9   r:   r;   r<   r>   r?   r`   allisinr)   )r@   r+   r
   r   r   r   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r?   r   r   rK   test_reduce_imperativen   sJ    
re   c               	   C   s"  t dddD ]} td| j tD ]}}tD ]x\}}}}tjddt| dd|}||	  }t
|||fi |}|  j||fi |}d gt| }	||	g}
|
D ]8}| |}||fg}||}| ||}t||sqJ tt|}||}| ||}t||sJ qSqqqd S )NTr    r#   r   r$   r%   )r   r,   r-   ra   rb   r/   r0   r1   r2   r^   r   r"   r=   rM   rN   rO   r<   r8   r9   r:   )r@   r+   r
   r   r   rP   rA   rB   rC   rQ   rR   rD   rS   rT   rU   rF   rE   rV   rG   r   r   rK   test_reduce_symbolic   s0    

rf   Fc                 C   s   t ds
t  d S dd l}ddlm}m}m}m}m	} ddl
m}m}	m}
 ||dddd| r7|
d	d
dddn|dd|dddd|
d	d
ddd|rR|j|	dn|	d|d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EinMixr3   r=   r      )r   r   kernel_sizeb c (h h2) (w w2) -> b c h wr_   r   r      r   i  x   T   b c1 -> (b c2)c1 c2c2weight_shape
bias_shapec1rx   (b c2) -> b c3c2 c3c3rz   r{   rx   r   r   )r   pytestskip	torch.jittorch.nnrh   ri   rj   rk   rl   einops.layers.torchrn   r3   r=   jitscript)
use_reduceadd_scripted_layerrg   rh   ri   rj   rk   rl   rn   r3   r=   r   r   rK   create_torch_model   s*   r   c                  C   s4  t ds
t  d S dd l} dd l} tdd}tdd}| g d}| ||||r/J |t	
t	|  | ||||sHJ | jj||d}| jj||||ddd	 | jj||d
 ||d
 ddd	 | jj||d}| jj||||ddd	 | jj||d
 ||d
 ddd	 d S )Nrg   r   T)r   Fr   r       r   )example_inputsMbP?atolrtolr   )r   r   r   rg   r   r   randnr<   load_state_dictr8   r9   r:   
state_dictr   tracetestingassert_close)rg   model1model2inputmodel3model4r   r   rK   test_torch_layer   s    

$(r   c                  C   sl   t ds
t  d S dd l} dD ]#}td|d}| j|}| g d}| jj	||||ddd qd S )	Nrg   r   )FTT)r   r   r   r   r   )
r   r   r   rg   r   r   r   r   r   r   )rg   script_layerr   r   r   r   r   rK   test_torch_layers_scripting   s   r   c                     s  t j } tdst  d S dd l}|jdk rt  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	d
}| }| }| jg ddd}t ||||rkJ d}td| |jj|| |jjj||d}t j|||| d}	|jjj| |d}
| |	 |
!|	 |!|	 t j|||| t j|||
| d S )N
tensorflowr   z2.16.)Conv2D)Dense)rk   )rl   )rn   r3   r=   keras_custom_objectsc                      s~    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ddddddgS )Nro   r   )r   r   r   )rq   r   rr   r_   r   r   rs   rp   r   rt   ru   rv   rw   rx   ry   r}   r~   r   r   r   r   r   rh   rn   ri   rk   r3   r=   rl   r   rK   create_keras_model  s   
z,test_keras_layer.<locals>.create_keras_model)r   r   r   r   )sizer$   z/tmp/einops_tf_model.h5temp_path_keras1)custom_objectsz/tmp/einops_tf_model.weights.h5)"r/   randomdefault_rngr   r   r   r   __version__tensorflow.keras.layersr   r   rk   tensorflow.keras.modelsrl   einops.layers.kerasrn   r3   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   r   r   rK   test_keras_layer   s8   





r   c                     s6  t ds
t  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dj}| g d|jd}fd	d
}||}||}||\}}||siJ |jdk rr|j}	n|jj}	|	dd ||}
||
}||ksJ ||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)linenrm   c                       s"   e Zd Zj fddZdS )ztest_flax_layers.<locals>.NNc              
      sP    dddt dddddd	|}d
t ddd	|}ddt d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 -> br^   r   )hwc)dict)selfrA   rm   r   rK   __call__D  s   z%test_flax_layers.<locals>.NN.__call__N)__name__
__module____qualname__compactr   r   )rn   r3   r=   nnr   rK   NNC  s    r   )r   r   	   r   c                    s   j |  S )N)linalgnormapply)params)fixed_inputjnpmodelr   rK   eval_at_pointQ  s   z'test_flax_layers.<locals>.eval_at_pointz0.6.0c                 S   s   | |d  S )Nr   r   )x1x2r   r   rK   <lambda>]  s    z"test_flax_layers.<locals>.<lambda>)r   r   r   flaxr   	jax.numpynumpyr   einops.layers.flaxrn   r3   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_loadedr   )rn   r3   r=   r   r   r   r   rK   test_flax_layers4  s0   


r   c               
   C   s  ddl m}  | dddddd}|jd	u sJ |jd	u sJ |jd
ks$J |jg dks-J |jd	u s4J | ddddddddd}|jd	u sGJ |jd	u sNJ |jd
ksUJ |jg dks^J |jg dksgJ | dddd}|jd	u suJ |jd	u s|J |jdksJ |jg ksJ |jg ksJ | dddddd}|jd	u sJ |jd	u sJ |jdksJ |jg dksJ |jd	u sJ | dddddd}|jdksJ |jtdddksJ |jdksJ |jdksJ |jg dksJ |jd	u sJ | dd d!dddd"}|jd#ks
J |jtddd$ksJ |jd%ksJ |jd&ks&J |jddgks0J |jg d'ks:J | d(d)d*dddd+}|jd,ksLJ |jtddd-ksXJ |jd.ks`J |jd/kshJ |jg d0ksrJ |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   rz   dar   Nzabcde,dab->edcba)r   r   r   z	a b c d er   r   )rz   r{   r   r   r   r   e)r   r   r   )r   r   r   r   r   z
... -> ... )rz   r{   z	...,->...zb a ...  -> b c ...zb a c)rz   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)rz   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)rz   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mixin7r   r   rK   test_einmix_decompositiong  s   
r
  c                  C   s   ddl m}  tt | ddddd W d   n1 sw   Y  tt | dd	ddd
d W d   n1 s<w   Y  tt | ddd
d W d   n1 sXw   Y  tt | ddd
dd W d   dS 1 svw   Y  dS )z!
    Testing different cases
    r   r   r   r   r   r   )rz   r   r   Nzw a br   r   z(...) a -> ... ar   )rz   r   z(...) a -> a ...)rz   r   r{   )r   r   r   raisesr   r   r   r   rK   test_einmix_restrictions  s8   "r  )FF)r8   collectionsr   r   r/   r   einopsr   r   r   einops.testsr   ra   r   r   
__author__r	   r   r.   rL   rY   rb   re   rf   r   r   r   r   r   r
  r  r   r   r   rK   <module>   s`    
 !)
@3Z