o
    wÖ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©ÚsymbolicÚ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(...) -> (...))ÚnumpyÚzerosr   ÚpytestÚraisesr   ©Úx© r   úR/home/ubuntu/sommelier/.venv/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'   Úall_rearrange_patternsÚpattern_pairsr   r   r   Útest_ellipsis_ops_numpy5   s   &ÿÿr4   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+   r>   Úcreate_symbolÚeval_symbolÚ
from_numpyÚto_numpy)ÚbackendÚnumpy_inputr/   r5   r'   Úis_symbolicr6   Únumpy_resultÚcheck_equalÚsymbol_shapeÚsymbolÚresult_symbolÚbackend_resultr   )r5   r;   r/   r'   r   Úcheck_op_against_numpyG   s   
rL   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   )r5   r'   rE   r"   N)r   r(   r)   r   r*   ÚlistÚ	itertoolsÚchainr,   rL   r-   )r   rE   rC   r/   r'   r   r   r   Útest_ellipsis_ops_imperativeb   s    ÿÿÿÿúÿrP   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   ÚeinopsrR   Ú__version__r   Úskipr(   r)   r*   rM   rN   rO   r,   r   Úfrom_dlpackr+   Úasnumpy)ÚxpÚAAr   r/   ÚexpectedÚresultr   r   r   Útest_rearrange_array_apis   s   

ýr]   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   rQ   rS   r   r   r"   r&   )r   rT   rR   rU   r   rV   r(   r)   rN   rO   r-   r   rW   r+   rX   ÚnpÚasarray)rY   rZ   r   r/   r'   r[   r\   r   r   r   Útest_reduce_array_api   s   
"ýÿr`   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  ||¡s‘J ‚t  d¡ g d¢¡}t|dƒ}|d |d ksªJ ‚|d |d ks´J ‚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 a11rc   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    )Úbr:   Ú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   ÚlenÚ	setdiff1dÚdtyper+   ÚflattenÚdictÚzip)	r>   r   r/   r\   Úresult1Úresult2ÚsizesÚtempÚx2r   r   r   Ú test_rearrange_consistency_numpy   s.   





rt   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s¦J ‚t |¡}t|ƒD ]\}	}
|||	? d@ |
> O }q¯t ||¡sÆJ ‚q^d S )Nr   é
   r   ú c                 s   ó    | ]	}d t |ƒ V  qdS ©ÚiN©Ústr©r9   Úaxisr   r   r   Ú	<genexpr>»   ó   € z4test_rearrange_permutations_numpy.<locals>.<genexpr>c                 s   rw   rx   rz   r|   r   r   r   r~   ¼   r   ú -> r   c                 s   rw   rx   rz   r|   r   r   r   r~   Æ   r   éÿÿÿÿc                 s   rw   rx   rz   r|   r   r   r   r~   Ç   r   )Úranger   r(   r)   r8   ÚpermutationÚjoinr   ÚrandintÚtupler>   Ú
zeros_likeÚ	enumerater+   )Ún_axesÚinputrƒ   Úleft_expressionÚright_expressionÚ
expressionr\   ÚpickÚexpected_resultÚoriginal_axisÚ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 ||¡sÄJ d|› ƒ‚qqqd S )NúReduction tests for r   Úint64©rk   r   ©Úmeanrh   Úfloat64r   ú	a ... -> z(a1 a2) ... (e1 e2) -> r   r   )Úa1Úe2úa b c d e -> (e c) a©r   r   ©r}   r   r   ú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—   Úgetattrrm   Ú	transposer   rA   ÚcopyrB   Úallclose)rC   r'   rŠ   Ú
test_casesr/   r5   r   r\   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 ||¡sÐJ ‚q­	 g }i |¥}td|jƒD ]\}}||v rð| d ¡ |||< qÞ| |¡ qÞ|  |¡}	t|	|fd|i|¤Ž}
|  |
|	|fg¡}t ||¡sJ ‚q›qqd S )Nr“   r   r”   r•   r   r˜   r   r™   z(a a2) ... (e e2) -> r   )r¤   r›   rœ   r   rž   r   r   r   rŸ   r    r¡   r¢   r£   c                 S   s   g | ]}d ‘qS r7   r   )r9   Ú_r   r   r   r<     s    z+test_reduction_symbolic.<locals>.<listcomp>r'   TÚabcde)Úsym_op_backendsr¦   r§   r¨   r   r(   r)   r©   r—   rª   rm   r«   r>   r?   r   r@   r­   rn   Úappend)rC   r'   rŠ   r®   r/   r5   Úexpected_numpy_resultÚshapesr>   ÚsymÚ
result_symr\   Ú_axes_lengthsr}   Ú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r§t||ƒtt|ƒƒd}|||ƒs®J ‚t| |||i dd q2qqd S )NzStress-testing reduction for )r   r”   r–   r˜   rb   Úoneflowra   Úpaddleé	   r   r   ©Úsizer   r   r   rv   c                 s   rw   ©r   Nrz   ©r9   ry   r   r   r   r~   =  r   z4test_reduction_stress_imperatives.<locals>.<genexpr>c                 s   rw   rÀ   rz   rÁ   r   r   r   r~   >  r   ú->r•   rh   r&   rž   F)r'   r5   rE   )r¥   r¦   r§   r¨   r   r+   r­   r‚   r8   r…   rƒ   r„   r(   rh   r)   r—   r   r«   rª   r†   rL   )rC   r'   rk   ÚcoincideÚmax_dimr‰   r>   rƒ   ÚskippedÚleftÚrightr/   r   ro   rp   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 r7   )Ú	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   )Ú
tensorflowÚ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Í   )Útensorflow.keras.backendÚkerasrC   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Ë   Ú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$   Úeinops._backendsrÜ   rÝ   rÞ   rß   r§   r¥   rA   r-   r¦   r   r­   rB   )Úx_numpyrÌ   rÑ   rÕ   rÛ   rÜ   rÝ   rÞ   rß   Úbackend2callbackrC   Úbackend_callbackÚ	x_backendr0   r1   Úoutput_numpyÚ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    ra   )r¥   r¦   r§   r   r(   rh   r)   r   rA   ri   rn   rB   r>   r­   )rC   r>   r   Úaxes1Úaxes2Úax1Ú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(   rh   r)   rÁ   r=   r   r   r<   ’  s   ( z4test_concatenations_and_stacking.<locals>.<listcomp>c                    s   g | ]}ˆ   |¡‘qS r   )rA   )r9   Úarray)rC   r   r   r<   “  s    r   zb ... -> ... b)	r¥   r¦   r§   r‚   r   r_   r   r+   rB   )Ún_arraysrµ   Úarrays1Úarrays2Úresult0ro   rp   r   )rC   r>   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   é   rg   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¥   rA   Úhasattrr   ÚbackwardrB   r÷   r§   r¦   ÚkeysÚitemsr­   )r'   r   ÚresultsrC   Úy0Úy1Úy2Úy3Úy4r÷   Úname1Úgrad1Úname2Ú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)   ÚtilerA   rB   r+   )rC   rŠ   r®   Úrepeatsr[   Ú	convertedÚrepeatedr\   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
  r?   r>   r@   r+   ri   )rC   rŠ   r®   r  r[   r¶   r\   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¬   Úard   Ú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   Úrepeat_patternrq   rÆ   rÇ   Úreduce_patternr  Úreduced_minÚ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   rA   rB   r+   )r   rC   r/   r  r[   r  r  r\   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   r?   r>   r@   r+   )r   rC   r/   r  r[   r¶   r\   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   rQ   rS   r	  r  )r   rT   rR   rU   r   rV   r(   r)   r  r   rW   r+   rX   )rY   rZ   r   r/   r  r[   r\   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  r:   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 )Né0   )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   )rd   )r   r(   r)   r+   r   rM   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%   )Úca2)r>   r   r   )r   r  rd   r  Úotherr   r   r   Úfunc1V  s   z4test_torch_compile_with_dynamic_shape.<locals>.func1Ú	aot_eager)ÚdynamicÚ	fullgraphrC   )r   r    r!   r   r¾   )r!   r   r   r   r   )
r   r   rV   r(  Ú_dynamoÚconfigÚverboseÚcompileÚrandnÚequal)r(  r+  Úfunc1_compiled_dynamicr   r   r   r   Ú%test_torch_compile_with_dynamic_shapeN  s   

r6  c                    s   t ‡ fdd„tdƒD ƒƒS )Nc                 3   s    | ]	}ˆ |? d @ V  qdS )r   Nr   rÁ   r   r   r   r~   j  r   zbit_count.<locals>.<genexpr>é   )r%   r‚   r   r   r   r   Ú	bit_counti  s   r8  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  	|| |
¡¡s€J ‚q t j| ddd}t j| ddd}d}t| | ¡|dd}	t| | ¡|dd}
t  	|| |	¡¡s²J ‚t  	|| |
¡¡s½J ‚qdS )z5Checks that any/all reduction works in all frameworksc                 S   s   g | ]
}t |ƒd  dk‘qS )r   r   )r8  )r9   r   r   r   r   r<   o  s    z7test_reduction_imperatives_booleans.<locals>.<listcomp>é@   r   r!   zReduction any/all tests for T)r}   rÖ   re   Ú1rv   r€   rô   r&   rõ   )r   r   za b ... -> 1 1 ...N)r   r_   r‚   r)   r¥   r¦   r§   rô   rõ   r+   rM   r„   r   rA   rB   )Úx_nprC   r}   Úexpected_result_anyÚexpected_result_allÚaxesÚaxes_inÚaxes_outr/   Úres_anyÚres_allr   r   r   Ú#test_reduction_imperatives_booleansm  s0   $årC  )r   F)3rN   r   r^   r   rT   r   Úeinops.einopsr   r   r   r   Úeinops.testsr   r   r	   r¨   r¥   r²   r*   r,   r-   r   r4   rL   rP   r]   r`   rt   r’   r¯   rº   rÈ   rç   rí   ró   r  r  r  rm   r  r  r  r!  r"  r#  r%  r&  r'  r6  r8  rC  r   r   r   r   Ú<module>   sp    	
&$5 3ö	ù