o
    K+ ivi                     @   s$  d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZmZ edddZedddZg dZg d	Zg d
Zdd Zdd Zd\ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Z d$d% Z!d&d' Z"d(d) Z#d*d+ Z$d,d- Z%d.e& fd/e&d0d0d1d2d3fd4e&d5d6fd7e&d0d5d0d8fd9e&d:d6fd;e&d5d0d<fd=e& fd>e&d0d1d<fd?e&d0d5d<fg	Z'd@dA Z(dBdC Z)dDdE Z*dFdG Z+dHdI Z,dJe& fdKe&d5d:dLdMfdNe&d1d6fdOe& fdPe&d0d1d<fdQe& fgZ-dRdS Z.dTdU Z/dVdW Z0dXdY Z1dZd[ Z2dS )]    N)EinopsError)	rearrangereducerepeat_enumerate_directions)collect_test_backendsis_backend_testedFLOAT_REDUCTIONSFZsymbolicZlayersT)...->...za b c d e-> a b c d eza b c d e ...-> ... a b c d eza b c d e ...-> a ... b c d ez... a b c d e -> ... a b c d eza ... e-> a ... eza ... -> a ... za ... c d e -> a (...) c d e))za b c d e -> (a b) c d eza b ... -> (a b) ... )za b c d e -> a b (c d) ez... c d e -> ... (c d) e)za b c d e -> a b c d ez... -> ... )za b c d e -> (a b c d e)... ->  (...))za b c d e -> b (c d e) aza b ... -> b (...) a)za b c d e -> b (a c d) eza b ... e -> b (a ...) e))a b c d e -> z	 ... ->  )za b c d e -> (e a)za ... e -> (e a))za b c d e -> d (a e)z a b c d e ... -> d (a e) )za b c d e -> (a b)z ... c d e  -> (...) c                  C   s   t g d} t| d tt t| d W d    n1 s!w   Y  t| d tt t| d W d    d S 1 sAw   Y  d S )N   r   r   r   r   za b c d ... ->  a b c ... dza b c d (...) ->  a b c ... dr   z(...) -> (...))numpyZzerosr   pytestZraisesr   x r   a/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/einops/tests/test_ops.py"test_collapsed_ellipsis_errors_out*   s   

"r   c               
   C   s   t dg d} tD ]}t | t| |sJ |qtD ]\}}t t| |t| |s0J qdD ]}tD ]\}}t t| ||dt| ||dsMJ q7q3g t}tD ]}|	| qUd S )N                 minmaxsum	reduction)
r   arangereshapeidentity_patternsarray_equalr   equivalent_rearrange_patternsequivalent_reduction_patternsr   extend)r   patternpattern1pattern2r#   Zall_rearrange_patternsZpattern_pairsr   r   r   test_ellipsis_ops_numpy5   s   &r.   r   c                    s    fdd}||}t j}d|r1fdd|jD }	| j|	d}
||
}| ||
|fg}n|| |}| |}||| dS )z
    Helper to test result of operation (rearrange or transpose) against numpy
    if reduction == 'rearrange', rearrange op is tested, otherwise reduce
    c                    s.   dkrt | fi  S t| fi  S )Nr   )r   r   r   )axes_lengthsr+   r#   r   r   	operationM   s   z)check_op_against_numpy.<locals>.operationg      ?c                    s"   g | ]}t j  kr|nd qS N)r   random).0d)p_none_dimensionr   r   
<listcomp>W   s   " z*check_op_against_numpy.<locals>.<listcomp>shapeN)r   r'   r8   create_symboleval_symbol
from_numpyto_numpy)backendZnumpy_inputr+   r/   r#   is_symbolicr0   Znumpy_resultZcheck_equalZsymbol_shapesymbolZresult_symbolZbackend_resultr   )r/   r5   r+   r#   r   check_op_against_numpyG   s   
r@   c                  C   s   t dg d} dD ]8}t|ddD ]/}tttjt  D ]}t	|| |i d|d qdD ]}tjt
 D ]}t	|| |i ||d q5q.qqd	S )
z'Checking various patterns against numpyr   r   )TFFr
   r   )r/   r#   r>   r   N)r   r$   r%   r   r&   list	itertoolschainr(   r@   r)   )r   r>   r=   r+   r#   r   r   r   test_ellipsis_ops_imperativeb   s    rD   c                  C   s   dd l } ddlm} | jdk rt  t dg d}tt	t
jt  D ]}t||}|| ||}t ||d |sCJ q&d S )Nr   	array_api2.0.0r   r   )r   einopsrF   __version__r   skipr$   r%   r&   rA   rB   rC   r(   r   from_dlpackr'   asnumpy)xpAAr   r+   expectedresultr   r   r   test_rearrange_array_apis   s   

rQ   c               
   C   s   dd l } ddlm} | jdk rt  t dg d}tj	t
 D ])}dD ]$}t|||d}|j| |||d}t |t|d |sJJ q&q"d S )Nr   rE   rG   r   r   r   r"   )r   rH   rF   rI   r   rJ   r$   r%   rB   rC   r)   r   rK   r'   rL   npasarray)rM   rN   r   r+   r#   rO   rP   r   r   r   test_reduce_array_api   s   
"rT   c            	      C   sl  g d} t t | | }dD ]}t||}tt ||dks$J |j|jks,J qt|d}t |	 |	 s>J t|d}t ||sKJ t|d}t|d}t ||s]J tt|dd	d
dd}t ||spJ t
td| }t|dfi |}t|d	fi |}t ||sJ t dg d}t|d}|d |d ksJ |d |d ksJ d S )N)r   r   r   r         )za b c d e f -> a b c d e fzb a c d e f -> a b d e f ca b c d e f -> f e d c b aza b c d e f -> (f e) d (c b a)za b c d e f -> (f e d c b a)r   za b c d e f -> a (b) (c d e) fz0a aa aa1 a1a1 aaaa a11 -> a aa aa1 a1a1 aaaa a11rW   zf e d c b a -> a b c d e fza b c d e f -> (f d) c (e b) az(f d) c (e b) a -> a b c d e fr   r   )br4   abcdef   r   r   r   za b c -> b c a)r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r$   prodr%   r   lenZ	setdiff1ddtyper'   flattendictzip)	r8   r   r+   rP   result1result2sizestempZx2r   r   r    test_rearrange_consistency_numpy   s.   





rf   c                  C   s  t ddD ]S} td|  dg|  }tj| }ddd t | D }ddd |D }|d | }t||}tjd	dd| gD ]}|t	| |t	||  ksWJ qEqt ddD ]h} td|  dg|  }tj| }dd
d t | d d d D }ddd |d d d D }|d | }t||}|j
|j
ksJ t|}t|D ]\}	}
|||	? d@ |
> O }qt||sJ q^d S )Nr   
   r    c                 s       | ]	}d t | V  qdS iNstrr3   axisr   r   r   	<genexpr>       z4test_rearrange_permutations_numpy.<locals>.<genexpr>c                 s   ri   rj   rl   rn   r   r   r   rp      rq    -> r   c                 s   ri   rj   rl   rn   r   r   r   rp      rq   c                 s   ri   rj   rl   rn   r   r   r   rp      rq   )ranger   r$   r%   r2   permutationjoinr   randinttupler8   Z
zeros_like	enumerater'   )n_axesinputru   Zleft_expressionZright_expressionZ
expressionrP   pickexpected_resultZoriginal_axisZresult_axisr   r   r   !test_rearrange_permutations_numpy   s.   
""

r~   c                  C   s  t D ]} td| j tD ]}tjdddg d}|dv r'||d  }di t	|| gd	i t	|| gd
t
dddt	|| gdi t	||dddddddggdi t	||dddddddggdi t	||dddddddggdi t	||ddddddggdt
dd|gg}|D ]'\}}}t| | |fd|i|}| |}t||sJ d| qqqd S )NReduction tests for r   int64r^   r   meanr\   float64r   	a ... -> z(a1 a2) ... (e1 e2) -> r   r   )Za1e2a b c d e -> (e c) ar   r   ro   r   rs   a ... c d e -> (e c) aa b c d e ... -> (e c) aa b c d e -> (e c a)(a a2) ... -> (a2 a) ...a2r#   z
Failed at )imp_op_backendsprintframework_name
REDUCTIONSr   r$   r%   astyper   getattrr`   	transposer   r;   copyr<   allclose)r=   r#   r{   
test_casesr+   r/   r}   rP   r   r   r   test_reduction_imperatives   s>   """& 
r   c                  C   s:  t D ]} td| j tD ]}tjdddg d}||d  }di t	|| gdi t	|| gd	t
d
d
dt	|| gdi t	||dddd
dddggdi t	||dddd
dddggdi t	||dddd
dddggdi t	||dddd
ddggdt
d
d|gg}|D ]}\}}}|jdd |jD g}|D ]#}| |}	t|	|fd|i|}
| |
|	|fg}t||sJ q	 g }i |}td|jD ]\}}||v r|d  |||< q|| q| |}	t|	|fd|i|}
| |
|	|fg}t||sJ qqqd S )Nr   r   r   r   r   r   r   r   z(a a2) ... (e e2) -> r   )r   r   r   r   r   r   r   rs   r   r   r   r   r   c                 S   s   g | ]}d qS r1   r   )r3   _r   r   r   r6     s    z+test_reduction_symbolic.<locals>.<listcomp>r#   TZabcde)sym_op_backendsr   r   r   r   r$   r%   r   r   r   r`   r   r8   r9   r   r:   r   ra   append)r=   r#   r{   r   r+   r/   Zexpected_numpy_resultshapesr8   symZ
result_symrP   Z_axes_lengthsro   lengthr   r   r   test_reduction_symbolic   sZ   

"""&



r   c                  C   sz  t D ]} td| j td D ]}d}tj}|dv rd}tj}d}d| jv r'd}d	| jv r.d
}t|D ]}tjj	dd|d}tj
|}|dkrIdntj	|d }ddd t|D }	ddd ||d  D }
|	d |
 }tjddt| |d|}|dkr||  }t|||d}||}|dkrt||tt|d}|||sJ t| |||i dd q2qqd S )NzStress-testing reduction for )r   r   r   r   rV   ZoneflowrU   Zpaddle	   r   r   sizer   r   r   rh   c                 s   ri   r   Nrl   r3   rk   r   r   r   rp   =  rq   z4test_reduction_stress_imperatives.<locals>.<genexpr>c                 s   ri   r   rl   r   r   r   r   rp   >  rq   ->r   r\   r"   r   F)r#   r/   r>   )r   r   r   r   r   r'   r   rt   r2   rw   ru   rv   r$   r\   r%   r   r   r   r   rx   r@   )r=   r#   r^   ZcoincideZmax_dimrz   r8   ru   Zskippedleftrightr+   r   rb   rc   r   r   r   !test_reduction_stress_imperatives+  s@   

 
r   c                  C   s   t dg dd} | |   } dd }dd }dd	 }d
d }ddlm}m}m}m	} |j
||j
||j
||j
|i}	tD ]:}
|
j
|	vrGq?|	|
j
 }|
| }tD ]%\}}td|
j
|| t| ||d}t|||d}t ||
|sxJ qSq?d S )Nr   r   float32c                 S   s
   |  |S r1   )	logsumexp)r   tuple_of_axesr   r   r   logsumexp_torchO  s   
zAtest_reduction_with_callable_imperatives.<locals>.logsumexp_torchc                 S   s   dd l }|| |S Nr   )Z
tensorflowZreduce_logsumexp)r   r   tfr   r   r   logsumexp_tfR  s   z>test_reduction_with_callable_imperatives.<locals>.logsumexp_tfc                 S   s   dd l m  m} || |S r   )Ztensorflow.keras.backendZkerasr=   r   )r   r   kr   r   r   logsumexp_kerasW  s   zAtest_reduction_with_callable_imperatives.<locals>.logsumexp_kerasc                 S   sB   |  |}| | j |dd }t|}tj||d}t|| S )NT)keepdimsr   )r    r   expr!   log)r   r   Zminusedyr   r   r   logsumexp_numpy\  s
   

zAtest_reduction_with_callable_imperatives.<locals>.logsumexp_numpyr   )TorchBackendTensorflowBackendTFKerasBackendNumpyBackendz!Test reduction with callable for r"   )r   r$   r%   r   r    Zeinops._backendsr   r   r   r   r   r   r;   r)   r   r   r   r<   )Zx_numpyr   r   r   r   r   r   r   r   Zbackend2callbackr=   Zbackend_callbackZ	x_backendr,   r-   Zoutput_numpyZoutput_backendr   r   r   (test_reduction_with_callable_imperativesK  s6   



r   c                  C   s   t D ]_} td| j g dgg dg dfD ]K}tt||}t|}t| |}t	|t	|  kr>t	|ksAJ  J t
||D ]\}}| |}|j|jksWJ t||s_J qFqqd S )Nztesting directions forr   )r   r   r   r   r   r   rU   )r   r   r   r   r$   r\   r%   r   r;   r]   ra   r<   r8   r   )r=   r8   r   Zaxes1Zaxes2Zax1Zax2r   r   r   test_enumerating_directions~  s   (
r   c               	      s   t D ]l td j dD ]a} g dgddgg ddgd g}|D ]Mfddt| D } fdd|D }t|}t|d	}t|d	}t||sLJ t| |sWJ t|d
}t|d
}t| |slJ qqqd S )Nztesting shapes for )r   r   r   r   r   r   c              	      s(   g | ]}t ||t    qS r   )r   r$   r\   r%   r   r7   r   r   r6     s   ( z4test_concatenations_and_stacking.<locals>.<listcomp>c                    s   g | ]}  |qS r   )r;   )r3   array)r=   r   r   r6     s    r   zb ... -> ... b)	r   r   r   rt   r   rS   r   r'   r<   )Zn_arraysr   Zarrays1Zarrays2Zresult0rb   rc   r   )r=   r8   r    test_concatenations_and_stacking  s$   




r   c                  C   s   t D ]y} | dv r	qtddg dd}i }tD ]9}||}t|ds(qt|d| d}t|d	| d}t|d
| dd}t|d| d}|	  |
|j}	|	||j< qtd|  | D ]\}
}| D ]\}}t||syJ |
|dgqhq`qd S )N)anyallr      r[   r   gradza b c -> c ar"   z
c a -> a cza (c1 c2) -> ar   )r#   c1z... -> zcomparing gradients forzprovided different gradients)r   r   r$   r%   r   r   r;   hasattrr   Zbackwardr<   r   r   r   keysitemsr   )r#   r   resultsr=   Zy0y1y2Zy3Zy4r   Zname1Zgrad1Zname2Zgrad2r   r   r   test_gradients_imperatives  s.   

r   c                  C   s   t D ];} td| j tjdddg d}g d}|D ] }t||}| |}| ||}| |}t	||s<J qqd S NzTiling tests for    r   r   )r   r   r   r   r   )r   )r   r   r   r   r   )r   r   r   r   r   )
r   r   r   r   r$   r%   tiler;   r<   r'   )r=   r{   r   repeatsrO   	convertedrepeatedrP   r   r   r   test_tiling_imperatives  s   

r   c                  C   s   t D ]^} td| j tjdddg d}g d}|D ]C}t||}| |j}| 	| ||||gg}t
||s?J | d gt|j }| 	| ||||gg}t
||s_J qqd S r   )r   r   r   r   r$   r%   r   r9   r8   r:   r'   r]   )r=   r{   r   r   rO   r   rP   r   r   r   test_tiling_symbolic  s   r   za b c -> c a bza b c -> (c copy a b)r   r   r   )r   arX   cza b c -> (a copy) b c r   r   za b c -> (c a) (copy1 b copy2))r   copy1copy2za ...  -> a ... copyr   z... c -> ... (copy1 c copy2))r   r   z...  -> ... z ...  -> copy1 ... copy2 za b c  -> copy1 a copy2 b c () c           	      K   s|   | d\}}|d | }t| |fi |}t||fddi|}t||fddi|}t| |s4J t| |s<J dS )z*Checks repeat pattern by running reductionr   r#   r   r    N)splitr   r   r   r'   )	r   Zrepeat_patternrd   r   r   Zreduce_patternr   Zreduced_minZreduced_maxr   r   r   check_reversion  s   r   c                  C   sZ   t dg d} t| ddd}t | d  |sJ tD ]\}}t| |fi | qd S )Nr   r   r   r   za b c -> copy a b c r   r   )r   r$   r%   r   r'   repeat_test_casesr   )r   x1r+   axis_dimensionsr   r   r   test_repeat_numpy  s   r   c                  C   s   t dg d} tD ]3}td|j tD ](\}}t| |fi |}|| }t||fi |}|	|}t 
||s>J qqd S Nr   r   zRepeat tests for )r   r$   r%   r   r   r   r   r   r;   r<   r'   )r   r=   r+   r   rO   r   r   rP   r   r   r   test_repeat_imperatives  s   

r   c                  C   s   t dg d} tD ]6}td|j tD ]+\}}t| |fi |}|| j	}|
t||fi ||| gg}t ||sAJ qqd S r   )r   r$   r%   r   r   r   r   r   r9   r8   r:   r'   )r   r=   r+   r   rO   r   rP   r   r   r   test_repeat_symbolic  s    r   c                  C   s   dd l } ddlm} | jdk rt  t dg d}tD ]'\}}t	||fi |}|j	| 
||fi |}t ||d |sFJ qd S )Nr   rE   rG   r   r   )r   rH   rF   rI   r   rJ   r$   r%   r   r   rK   r'   rL   )rM   rN   r   r+   r   rO   rP   r   r   r   test_repeat_array_api  s   
r   za b c d -> c a d bza b c d -> (c 2 d a b)r   )r   r   r4   z1 b c d -> (d copy 1) 3 b c z1 ...  -> 3 ... z"() ... d -> 1 (copy1 d copy2) ... z$1 b c d -> (1 1) (1 b) 2 c 3 d (1 1)c                  C   s8   t dg d} tD ]\}}t| |fi | qd S )N0   )r   r   r   r   )r   r$   r%   test_cases_repeat_anonymousr   )r   r+   r   r   r   r   test_anonymous_axes7  s   r   c                  C   s   t dg d} t tt| dt| dsJ t tt| ddt| dds,J t tt| dddt| ddds@J d S )	Nr   r   z... -> (...)za ... e -> (...)r   z...  -> b (...)r   )rX   )r   r$   r%   r'   r   rA   r   r   r   r   r   r   test_list_inputs=  s   
r   c                  C   s   t dst  dd l} d| jj_dd }| j|dddd}| jg dd	}| 	||||s2J | jg d
d	}| 	||||sFJ d S )Ntorchr   Tc                 S   s4   | j ^}}}}t| ddd} t| dd|d d} | S )Nz"(a a2) b c ... -> b (c a2) (a ...)r   r   zb ca2 A -> b Ar!   )Zca2)r8   r   r   )r   r   rX   r   otherr   r   r   func1V  s   z4test_torch_compile_with_dynamic_shape.<locals>.func1Z	aot_eager)ZdynamicZ	fullgraphr=   )r   r   r   r   r   )r   r   r   r   r   )
r   r   rJ   r   Z_dynamoconfigverbosecompileZrandnequal)r   r   Zfunc1_compiled_dynamicr   r   r   r   %test_torch_compile_with_dynamic_shapeN  s   

r   c                    s   t  fddtdD S )Nc                 3   s    | ]	} |? d @ V  qdS )r   Nr   r   r   r   r   rp   j  rq   zbit_count.<locals>.<genexpr>   )r!   rt   r   r   r   r   	bit_counti  s   r   c                  C   s  t dd tdD dgd } tD ]}td|j tdD ]`}t j| |dd}t j| |dd}t 	||r:J t
d	}t
|}t
|}d
||< d|d d| }t|| |dd}	t|| |dd}
t 	|||	suJ t 	|||
sJ q t j| ddd}t j| ddd}d}t|| |dd}	t|| |dd}
t 	|||	sJ t 	|||
sJ qdS )z5Checks that any/all reduction works in all frameworksc                 S   s   g | ]
}t |d  dkqS )r   r   )r   )r3   r   r   r   r   r6   o  s    z7test_reduction_imperatives_booleans.<locals>.<listcomp>@   r   r   zReduction any/all tests for T)ro   r   rY   1rh   rr   r   r"   r   )r   r   za b ... -> 1 1 ...N)r   rS   rt   r%   r   r   r   r   r   r'   rA   rv   r   r;   r<   )Zx_npr=   ro   Zexpected_result_anyZexpected_result_allZaxesZaxes_inZaxes_outr+   Zres_anyZres_allr   r   r   #test_reduction_imperatives_booleansm  s0   $r   )r   F)3rB   r   rR   r   rH   r   Zeinops.einopsr   r   r   r   Zeinops.testsr   r   r	   r   r   r   r&   r(   r)   r   r.   r@   rD   rQ   rT   rf   r~   r   r   r   r   r   r   r   r   r   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sp    	
&$5 3	