o
    wi8H                  
   @   sZ  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
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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g Zd%d& Zd'd( Zd8d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 ZdS )9    N)
namedtuple)	rearrangereduceEinopsError)collect_test_backendsis_backend_testedFLOAT_REDUCTIONSz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numpy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   U/home/ubuntu/sommelier/.venv/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   r   rA   rB   rC   input_shape_of_nonesshapesrD   symboleval_inputsresult_symbol1rF   rE   result_symbol2rG   rH   result_sum1result_sum2r   r   rK   test_rearrange_symbolicD   s2   


rX   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in1dr)   )r@   r+   r
   r   r   r   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r?   r   r   rK   test_reduce_imperativel   sJ    
rd   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-   r`   ra   r/   r0   r1   r2   r]   r   r"   r=   rM   rN   rO   r<   r8   r9   r:   )r@   r+   r
   r   r   r   rA   rB   rC   rP   rQ   rD   rR   rS   rT   rF   rE   rU   rG   r   r   rK   test_reduce_symbolic   s0    

re   Fc                 C   s   t ds
t  d S ddlm}m}m}m}m} ddl	m
}m}m}	 dd l}
||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   )
SequentialConv2d	MaxPool2dLinearReLU)r3   r=   EinMixr      )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c1rv   (b c2) -> b c3c2 c3c3rx   ry   rv   r}   r   )r   pytestskiptorch.nnrg   rh   ri   rj   rk   einops.layers.torchr3   r=   rl   	torch.jitjitscript)
use_reduceadd_scripted_layerrg   rh   ri   rj   rk   r3   r=   rl   rf   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 )Nrf   r   T)r   Fr   r       r   )example_inputsMbP?atolrtolr   )r   r   r   rf   r   r   randnr<   load_state_dictr8   r9   r:   
state_dictr   tracetestingassert_close)rf   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 )	Nrf   r   )FTT)r   r   r   r   r   )
r   r   r   rf   r   r   r   r   r   r   )rf   script_layerr   r   r   r   r   rK   test_torch_layers_scripting   s   r   c            
         sx  t ds
t  d S dd l} | jdk rt  ddlm ddlm m	m
 ddlmmmm}  fdd}| }| }tjjg d	d
d}t||||r_J 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.)rg   )Conv2DDenserk   )r3   r=   rl   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 )Nrm   r   )r   r   r   )ro   r   rp   r^   r   r   rq   rn   r   rr   rs   rt   ru   rv   rw   r{   r|   r}   r~   r   r   r   rh   rl   rj   rk   r3   r=   rg   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   r   r   r   __version__tensorflow.keras.modelsrg   tensorflow.keras.layersr   r   rk   einops.layers.kerasr3   r=   rl   r   r/   randomnormalastyper<   predict_on_batchr,   kerasmodels
save_model
load_modelr   assert_allclosemodel_from_jsonto_jsonsave_weightsload_weights)
tfr   r   r   r   r   tmp_model_filenamer   weight_filenamer   r   r   rK   test_keras_layer   s2   




r   c                     s  t ds
t  dS ddl} ddlm ddl}ddlm ddlm	 m
m G  fdddj}| g d| jd}fd	d
}| |}||}||\}}||siJ | 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)linen)rl   r=   r3   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   )rl   r3   r=   r   rK   __call__=  s   z%test_flax_layers.<locals>.NN.__call__N)__name__
__module____qualname__compactr   r   )rl   r3   r=   nnr   rK   NN<  s    r   )r   r   	   r   c                    s   j |  S )N)linalgnormapply)params)fixed_inputjnpmodelr   rK   eval_at_pointJ  s   z'test_flax_layers.<locals>.eval_at_pointc                 S   s   | |d  S )Nr   r   )x1x2r   r   rK   <lambda>R  s    z"test_flax_layers.<locals>.<lambda>)r   r   r   r   	jax.numpyr/   flaxr   einops.layers.flaxrl   r=   r3   Moduleonesinitr   PRNGKeyvalue_and_gradr<   tree_mapserializationto_bytes
from_bytes)r   r   r   r   r   vandgvalue0value1grad1params2value2fbytes_loadedr   )rl   r3   r=   r   r   r   r   rK   test_flax_layers-  s*   

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   rx   dar   Nzabcde,dab->edcba)r   r   r   z	a b c d er   r   )rx   ry   r   r   r   r   e)r   r   r   )r   r   r   r   r   z
... -> ... )rx   ry   z	...,->...zb a ...  -> b c ...zb a c)rx   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)rx   ry   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)rx   ry   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_decomposition\  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   )rx   r   r   Nzw a br   r   z(...) a -> ... ar   )rx   r   z(...) a -> a ...)rx   r   ry   )r   r   r   raisesr   r   r   r   rK   test_einmix_restrictions  s8   "r  )FF)r8   collectionsr   r/   r   einopsr   r   r   einops.testsr   r   r   r`   
__author__r	   r   r.   rL   rX   ra   rd   re   r   r   r   r   r   r  r  r   r   r   rK   <module>   sV    
 !)
</Z