o
    K+ i8H                  
   @   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ZsymboliclayersTest layer for float32Z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   d/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/einops/tests/test_layers.pytest_rearrange_imperative$   s2   
rJ   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-   r.   r/   r0   r   r!   r1   lencreate_symboleval_symbolr:   r6   r7   r8   r;   r'   )r>   r
   r   r   r   r?   r@   rA   input_shape_of_nonesshapesrB   symboleval_inputsresult_symbol1rD   rC   result_symbol2rE   rF   Zresult_sum1Zresult_sum2r   r   rI   test_rearrange_symbolicD   s2   


rT   zb c h w -> b ()z b c (h1 h2) (w1 w2) -> b c h1 w1   )Z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-   r.   r/   r0   rX   r   r!   r;   r2   r3   r4   r5   r6   r7   r8   r9   r:   r<   r=   rZ   allZin1dr'   )r>   r)   r
   r   r   r   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   r=   r   r   rI   test_reduce_imperativel   sJ    
r^   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[   r\   r-   r.   r/   r0   rX   r   r!   r;   rK   rL   rM   r:   r6   r7   r8   )r>   r)   r
   r   r   r   r?   r@   rA   rN   rO   rB   rP   rQ   rR   rD   rC   rS   rE   r   r   rI   test_reduce_symbolic   s0    

r_   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)r1   r;   EinMixr      )r   r   kernel_sizeb c (h h2) (w w2) -> b c h wrY   r   r      r   i  x   T   b c1 -> (b c2)c1 c2c2weight_shape
bias_shapec1rp   (b c2) -> b c3c2 c3c3rr   rs   rp   rw   r   )r   pytestskipZtorch.nnra   rb   rc   rd   re   Zeinops.layers.torchr1   r;   rf   	torch.jitjitscript)
use_reduceadd_scripted_layerra   rb   rc   rd   re   r1   r;   rf   r`   r   r   rI   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 )Nr`   r   T)r~   Fr   r       r   )Zexample_inputsMbP?ZatolZrtolr   )r   ry   rz   r`   r{   r   randnr:   Zload_state_dictr6   r7   r8   Z
state_dictr|   tracetestingassert_close)r`   model1model2inputmodel3model4r   r   rI   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 )	Nr`   r   )FTT)r~   r   r   r   r   )
r   ry   rz   r`   r   r|   r}   r   r   r   )r`   Zscript_layerr   r   r   r   r   rI   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.)ra   )Conv2DDensere   )r1   r;   rf   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 )Nrg   r   )r   r   r   )ri   r   rj   rY   r   r   rk   rh   r   rl   rm   rn   ro   rp   rq   ru   rv   rw   rx   r   r   r   rb   rf   rd   re   r1   r;   ra   r   rI   create_keras_model   s   
z,test_keras_layer.<locals>.create_keras_model)r   r   r   r   )sizer#   z/tmp/einops_tf_model.h5Ztemp_path_keras1)Zcustom_objectsz/tmp/einops_tf_model.weights.h5)!r   ry   rz   r   __version__Ztensorflow.keras.modelsra   Ztensorflow.keras.layersr   r   re   Zeinops.layers.kerasr1   r;   rf   r   r-   randomnormalZastyper:   Zpredict_on_batchr*   ZkerasmodelsZ
save_modelZ
load_modelr   Zassert_allcloseZmodel_from_jsonto_jsonZsave_weightsZload_weights)
tfr   r   r   r   r   Ztmp_model_filenamer   Zweight_filenamer   r   r   rI   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)rf   r;   r1   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 -> brX   r   )Zhwc)dict)selfr?   )rf   r1   r;   r   rI   __call__=  s   z%test_flax_layers.<locals>.NN.__call__N)__name__
__module____qualname__compactr   r   )rf   r1   r;   nnr   rI   NN<  s    r   )r   r   	   r   c                    s   j |  S )N)ZlinalgZnormapply)params)fixed_inputjnpmodelr   rI   eval_at_pointJ  s   z'test_flax_layers.<locals>.eval_at_pointc                 S   s   | |d  S )Nr   r   )x1Zx2r   r   rI   <lambda>R  s    z"test_flax_layers.<locals>.<lambda>)r   ry   rz   r   Z	jax.numpyr-   flaxr   Zeinops.layers.flaxrf   r;   r1   ModuleZonesinitr   ZPRNGKeyZvalue_and_gradr:   Ztree_mapZserializationto_bytes
from_bytes)r   r   r   r   r   ZvandgZvalue0Zvalue1Zgrad1Zparams2Zvalue2Zfbytes_loadedr   )rf   r1   r;   r   r   r   r   rI   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   rr   dar   Nzabcde,dab->edcba)r   r   r   z	a b c d er   r   )rr   rs   r   r   r   r   e)r   r   r   )r   r   r   r   r   z
... -> ... )rr   rs   z	...,->...zb a ...  -> b c ...zb a c)rr   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)rr   rs   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)rr   rs   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   Zpre_reshape_patternZpost_reshape_patternZeinsum_patternZsaved_weight_shapeZsaved_bias_shapeZpre_reshape_lengthsr   )r   Zmixin1Zmixin2Zmixin3Zmixin4Zmixin5Zmixin6Zmixin7r   r   rI   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   )rr   r   r   Nzw a br   r   z(...) a -> ... ar   )rr   r   z(...) a -> a ...)rr   r   rs   )r   r   ry   Zraisesr   r   r   r   rI   test_einmix_restrictions  s8   "r   )FF)r6   collectionsr   r-   ry   Zeinopsr   r   r   Zeinops.testsr   r   r   r[   
__author__r	   r   r,   rJ   rT   r\   r^   r_   r   r   r   r   r   r   r   r   r   r   rI   <module>   sV    
 !)
</Z