
    'ii                        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 d dlmZmZ  edd      Z edd      Zej$                  j'                         Zg d	Zg d
Zg dZd Zd ZdAdZd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d e)       fd e)ddd d!"      fd# e)d$%      fd& e)dd$d'      fd( e)d)%      fd* e)d$d+      fd, e)       fd- e)dd +      fd. e)dd$+      fg	Z*d/ Z+d0 Z,d1 Z-d2 Z.d3 Z/d4 e)       fd5 e)d$d)d67      fd8 e)d %      fd9 e)       fd: e)dd +      fd; e)       fgZ0d< Z1d= Z2d> Z3d? Z4d@ Z5y)B    N)EinopsError)_enumerate_directions	rearrangereducerepeat)FLOAT_REDUCTIONS)collect_test_backendsis_backend_testedF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                  J   t        j                  g d      } t        | d       t        j                  t
              5  t        | d       d d d        t        | d       t        j                  t
              5  t        | d       d d d        y # 1 sw Y   DxY w# 1 sw Y   y xY w)N   r   r   r   r   za b c d ... ->  a b c ... dza b c d (...) ->  a b c ... dr   z(...) -> (...))npzerosr   pytestraisesr   xs    O/var/www/stems/demucs_env/lib/python3.12/site-packages/einops/tests/test_ops.py"test_collapsed_ellipsis_errors_outr   ,   s    
!Aa./	{	# 6!456 a!	{	# '!%&' '	6 6' 's   B7BBB"c            
         t        j                  d      j                  g d      } t        D ])  }t        j                  | t        | |            r$J |        t        D ]1  \  }}t        j                  t        | |      t        | |            r1J  dD ]@  }t        D ]5  \  }}t        j                  t        | ||      t        | ||            r5J  B g t        }t        D ]  }|j                  |        y )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_pairss          r   test_ellipsis_ops_numpyr6   7   s   
		#$,,_=A$ A~~a1g!67@@7A < N(~~i84i86LMMMN + v	"? 	vHh>>&H	"JFSTV^jsLtuuu	vv
 2016 5%%m45    c                    fd} ||      }t         j                  }d}	|rb|j                  D 
cg c]  }
t        j	                         |	k\  r|
nd }}
| j                  |      } ||      }| j                  |||fg      }n( || j                  |            }| j                  |      } |||       yc c}
w )z
    Helper to test result of operation (rearrange or transpose) against numpy
    if reduction == 'rearrange', rearrange op is tested, otherwise reduce
    c                 D    dk(  rt        | fi S t        | fi S )Nr   )r   r   )r   axes_lengthsr1   r)   s    r   	operationz)check_op_against_numpy.<locals>.operationO   s1    #Q8<88!Wi@<@@r7   g      ?N)shape)	r   r-   r<   rngrandomcreate_symboleval_symbol
from_numpyto_numpy)backendnumpy_inputr1   r:   r)   is_symbolicr;   numpy_resultcheck_equalp_none_dimensiondsymbol_shapesymbolresult_symbolbackend_results     ```          r   check_op_against_numpyrN   I   s    A [)L..KQ\QbQbcASZZ\-==4Gcc&&\&:!&) ,,]fk=R<ST"7#5#5k#BC )).9n- ds   "B;c                  `   t        j                  d      j                  g d      } dD ]  }t        |d      D ]q  }t        t        t        j                  t               z   D ]  }t        || |i d|        dD ].  }t        j                  t         D ]  }t        || |i ||        0 s  y	)
z'Checking various patterns against numpyr   r   )TFFr   r   )r:   r)   rE   r$   N)r   r*   r+   r	   r,   list	itertoolschainr.   rN   r/   )r   rE   rC   r1   r)   s        r   test_ellipsis_ops_imperativerS   d   s    
		#$,,_=A$ ,k%P 
	G,tIOOEb4c/dd &QbK]h
 3 	(0MN G*G"	_j
	r7   c                     dd l } ddlm} | j                  dk  rt	        j
                          t        j                  d      j                  g d      }t        t        t        j                  t               z   D ]Y  }t        ||      }|j                  | j                  |      |      }t        j                   |j#                  |dz         |      rYJ  y )Nr   	array_api2.0.0r   r   )numpyeinopsrV   __version__r   skipr   r*   r+   r,   rP   rQ   rR   r.   r   from_dlpackr-   asnumpy)xpAAr   r1   expectedresults         r   test_rearrange_array_apirb   u   s    &	~~
		#$,,_=A$tIOO=Z,['\\ @Q(bnnQ/9~~bjj!4h???@r7   c            
         dd l } ddlm} | j                  dk  rt	        j
                          t        j                  d      j                  g d      }t        j                  t         D ]w  }dD ]p  }t        |||      }|j                  | j                  |      ||      }t        j                  |j                  t        j                   |dz               |      rpJ  y y )Nr   rU   rW   r   r   r$   r(   )rX   rY   rV   rZ   r   r[   r   r*   r+   rQ   rR   r/   r   r\   r-   r]   asarray)r^   r_   r   r1   r)   r`   ra   s          r   test_reduce_array_apire      s    &	~~
		#$,,_=A??$AB P. 	PIaI>HYYr~~a0'YYOF>>"**RZZ
-C"DhOOO	PPr7   c                     g d} t        j                  t        j                  |             j                  |       }dD ]M  }t	        ||      }t        t        j                  ||            dk(  sJ |j                  |j                  k(  rMJ  t	        |d      }t        j                  |j                         |j                               sJ t	        |d      }t        j                  ||      sJ t	        |d      }t	        |d      }t        j                  ||      sJ t	        t	        |d      d	d
d      }t        j                  ||      sJ t        t        d|             }t	        |dfi |}t	        |d	fi |}t        j                  ||      sJ t        j                  d      j                  g d      }t	        |d      }|d   |d   k(  sJ |d   |d   k(  sJ y )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 a11ri   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"   )brI   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   r1   ra   result1result2sizestempx2s	            r    test_rearrange_consistency_numpyrz      s   E
		"''%.!))%0A 	' 1g&2<<6*+q000||qww&&&	' q:;F>>!))+v~~'7888qLMF>>!V$$$78G78G>>'7+++y$DEGgklpqrF>>!V$$$Xu%&EQ8BEBDt=GGF>>!V$$$	9		%	%i	0Br+,Fg;&/)))g;&/)))r7   c                     t        dd      D ]  } t        j                  d| z        j                  dg| z        }t        j                  |       }dj                  d t        |       D              }dj                  d |D              }|dz   |z   }t        ||      }t        j                  ddd| g      D ]$  }|t        |         |t        ||            k(  r$J   t        dd      D ]  } t        j                  d| z        j                  dg| z        }t        j                  |       }dj                  d	 t        |       d d d
   D              }dj                  d |d d d
   D              }|dz   |z   }t        ||      }|j                  |j                  k(  sJ t        j                  |      }t        |      D ]  \  }	}
|||	z	  dz  |
z  z  } t        j                  ||      rJ  y )Nr   
   r    c              3   8   K   | ]  }d t        |      z     ywiNstr.0axiss     r   	<genexpr>z4test_rearrange_permutations_numpy.<locals>.<genexpr>   s     "Mt3T?"M   c              3   8   K   | ]  }d t        |      z     ywr   r   r   s     r   r   z4test_rearrange_permutations_numpy.<locals>.<genexpr>   s     #LC#d)O#Lr    -> r   c              3   8   K   | ]  }d t        |      z     ywr   r   r   s     r   r   z4test_rearrange_permutations_numpy.<locals>.<genexpr>   s     "St3T?"Sr   c              3   8   K   | ]  }d t        |      z     ywr   r   r   s     r   r   z4test_rearrange_permutations_numpy.<locals>.<genexpr>   s     #RC#d)O#Rr   )ranger   r*   r+   r=   permutationjoinr   integerstupler<   
zeros_like	enumerater-   )n_axesinputr   left_expressionright_expression
expressionra   pickexpected_resultoriginal_axisresult_axiss              r   !test_rearrange_permutations_numpyr      s   2, 	J		!V)$,,aS6\:oof-(("MuV}"MM88#L#LL$v-0@@
5*-LLAF|4 	JDt%d;6G0H)IIII	J	J 2, 7		!V)$,,aS6\:oof-(("SuV}TrT?R"SS88#RDbD@Q#RR$v-0@@
5*-||u{{***--.*3K*@ 	M&M;-!71 <LLO	M ~~fo6667r7   c                  .   t         D ]  } t        d| j                         t        D ]  }t	        j
                  dd      j                  g d      }|dv r"||j                  d      j                         z  }di  t        ||             gd	i  t        ||             gd
t        dd       t        ||             gdi  t        ||      d      j                  ddd      j                  ddg      gdi  t        ||      d      j                  ddd      j                  ddg      gdi  t        ||      d      j                  ddd      j                  ddg      gdi  t        ||      d      j                  ddd      j                  dg      gdt        d      |gg}|D ]c  \  }}}t        | j                  |j                               |fd|i|}| j                  |      }t	        j                   ||      r[J d|           y )NReduction tests for r   int64rq   r   meanrn   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   getattrrs   	transposer   rA   copyrB   allclose)rC   r)   r   
test_casesr1   r:   r   ra   s           r   test_reduction_imperativesr      sB   "  T$g&<&<=# 	TIII/w?GGXE,,Y 7 < < >> "&?geY&?&ABb";'%";"=>*DA!,<>WgeY>W>YZ*-GE9-6:DDQ1MUUWY[\V]^ --GE9-6:DDQ1MUUWY[\V]^ /-GE9-6:DDQ1MUUWY[\V]^
 (-FWUI-FF-S-]-]^_abde-f-n-npros-tu+TQZ?)J, ;E T6 2 25::< @'oU^obno ))&1{{6?;Sz'=SS;T7	T Tr7   c                     t         D ]  } t        d| j                         t        D ]  }t	        j
                  dd      j                  g d      }||j                  d      j                         z  }di  t        ||             gdi  t        ||             gd	t        d
d
       t        ||             gdi  t        ||      d      j                  dd
d      j                  ddg      gdi  t        ||      d      j                  dd
d      j                  ddg      gdi  t        ||      d      j                  dd
d      j                  ddg      gdi  t        ||      d      j                  dd
d      j                  dg      gdt        d
      |gg}|D ]  \  }}}|j                  |j                  D cg c]  }d  c}g}|D ]O  }	| j                  |	      }
t        |
|fd|i|}| j                  ||
|fg      }t	        j                   ||      rOJ  	 g }	i |}t#        d|j                        D ]1  \  }}||v r|	j%                  d        |||<   !|	j%                  |       3 | j                  |	      }
t        |
|fd|i|}| j                  ||
|fg      }t	        j                   ||      r J    y c c}w )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   r)   abcde)sym_op_backendsr   r   r   r   r*   r+   r   r   r   rs   r   r<   r?   r   r@   r   rt   append)rC   r)   r   r   r1   r:   expected_numpy_result_shapesr<   sym
result_symra   _axes_lengthsr   lengths                   r   test_reduction_symbolicr      s   " 1F$g&<&<=# /	FIII/w?GGXEELL388::E !"&?geY&?&ABb";'%";"=>($!*:<UGE9<U<WX*-GE9-6:DDQ1MUUWY[\V]^ --GE9-6:DDQ1MUUWY[\V]^ /-GE9-6:DDQ1MUUWY[\V]^
 (-FWUI-FF-S-]-]^_abde-f-n-npros-tu+TQZ?)J, AK F<'<++ekk'B'BC# FE!//6C!'W!Z	!Z\!ZJ$00sEl^LF;;v/DEEE	F E$4|$4M(+GU[[(A 1f7?!LL.28M$/!LL01 "//6C!'W![	![]![J$00sEl^LF;;v/DEEE+F5/	F1F: (Cs   	Kc                     t         D ]  } t        d| j                         g 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 ]M  }t        j                  dd|      }t        j                  |      }|dk(  rdnt        j                  |dz         }dj                  d t        |      D              }	dj                  d ||d  D              }
|	dz   |
z   }t	        j                  ddt	        j                  |      z   |      j                  |      }|dk(  r||j                         z  }t!        |||      }|j#                  |      }|dkD  r% t%        ||      t'        t        |                  } |||      sJ t)        | |||i d       P   y )NzStress-testing reduction for r   r   r   r   rh   oneflowrg   paddle	   r   r!   sizer   r   r}   c              3   8   K   | ]  }d t        |      z     ywr   Nr   r   r   s     r   r   z4test_reduction_stress_imperatives.<locals>.<genexpr>A  s     Dc!fDr   c              3   8   K   | ]  }d t        |      z     ywr   r   r   s     r   r   z4test_reduction_stress_imperatives.<locals>.<genexpr>B  s      M!s1v Mr   ->r   rn   r(   r   F)r)   r:   rE   )r   r   r   r   r   r-   r   r   r=   r   r   r   r*   rn   r+   r   r   r   r   r   rN   )rC   r)   rq   coincidemax_dimr   r<   r   skippedleftrightr1   r   ru   rv   s                  r   !test_reduction_stress_imperativesr   /  s   " u-w/E/EF3:3{3 	uIE~~H,,!;;GG2227111. uQ7!oof5(K7!S\\&ST*=UxxDeFmDD M{787L MM+-IIaRWWU^!35AII%P&MA GyA++k2Q;9ggy9uU7^?TUG111&w7i^`nstu	uur7   c                  n   t        j                  d      j                  g d      j                  d      } | | j	                         z  } d }d }d }d }dd	lm}m}m}m	} |j                  ||j                  ||j                  ||j                  |i}	t        D ]  }
|
j                  |	vr|	|
j                     }|
j                  |       }t        D ]`  \  }}t        d
|
j                  ||       t        | ||      }t        |||      }t        j                   ||
j#                  |            r`J   y )Nr   r   float32c                 $    | j                  |      S )N)	logsumexp)r   tuple_of_axess     r   logsumexp_torchzAtest_reduction_with_callable_imperatives.<locals>.logsumexp_torchS  s    {{=))r7   c                 .    dd l }|j                  | |      S Nr   )
tensorflowreduce_logsumexp)r   r   tfs      r   logsumexp_tfz>test_reduction_with_callable_imperatives.<locals>.logsumexp_tfV  s    ""1m44r7   c                 8    dd l mc m} |j                  | |      S r   )tensorflow.keras.backendkerasrC   r   )r   r   ks      r   logsumexp_keraszAtest_reduction_with_callable_imperatives.<locals>.logsumexp_keras[  s    ,,{{1m,,r7   c                     | j                  |      }| | j                  |d      z
  }t        j                  |      }t        j                  ||      }t        j                  |      |z   S )NT)keepdimsr   )r&   r   expr'   log)r   r   minusedys       r   logsumexp_numpyzAtest_reduction_with_callable_imperatives.<locals>.logsumexp_numpy`  sW    %%&md33FF1IFF1=)vvay7""r7   r   )NumpyBackendTensorflowBackendTFKerasBackendTorchBackendz!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_backendr2   r3   output_numpyoutput_backends                    r   (test_reduction_with_callable_imperativesr   O  s<   ii)*22?CJJ9UGw{{}G*5
-
# _^ 	##_((,%%##_	 # !!)99+G,B,BC&&w/	"? 	Hh5w7M7MxYab!'8OL#IxCSTN;;  0  		r7   c                  L   t         D ]  } t        d| j                         g dgg dg dfD ]  }t        j                  t        j
                  |            j                  |      }t        |      }t        | j                  |            }t        |      t        |      cxk(  rt        |      k(  sJ  J |D cg c]  }| j                  |       }}t        ||      D ]8  \  }}|j                  |j                  k(  sJ t        j                  ||      r8J    y c c}w )Nztesting directions forr   )r   r   r   r   r    r"   rg   )r   r   r   r   r*   rn   r+   r   rA   ro   rB   rt   r<   r   )rC   r<   r   axes1axes2axax1ax2s           r   test_enumerating_directionsr    s   " 
-&(>(>?1#y,7 	-E		"''%.)11%8A)!,E)'*<*<Q*?@Eu:U9s5z9999949:bW%%b):E:u- -SyyCII---{{3,,,-	-
- ;s   :D!c                     t         D ]U  } t        d| j                         dD ]6  }g dgddgg ddgdz  g}|D ]  }t        |      D cg c]=  }t	        j
                  ||t	        j                  |      z         j                  |      ? }}|D cg c]  }| j                  |       }}t	        j                  |      }t        |d      }	t        |d      }
t	        j                  ||	      sJ t	        j                  |	| j                  |
            sJ t        |d      }	t        |d      }
t	        j                  |	| j                  |
            rJ  9 X y c c}w c c}w )Nztesting shapes for )r   r   r"   r   r   r#   r   zb ... -> ... b)r   r   r   r   r   r*   rn   r+   rA   rd   r   r-   rB   )rC   n_arraysr   r<   r   arrays1arrayarrays2result0ru   rv   s              r    test_concatenations_and_stackingr    sW   " J#W%;%;<! 	JH1#1v|aS1W=F JTYZbTcdq299QBGGEN(:;CCEJddBIJ7--e4JJ**W-#GZ8#GZ8~~gw777~~gw/?/?/HIII#G-=>#G-=>~~gw/?/?/HIIIJ	JJ
 eJs   
AE!
E&
c                     t         D ]F  } | dv r	t        j                  dd      j                  g d      j	                  d      }i }t
        D ]  }|j                  |      }t        |d      s!t        |d|       }t        |d	|       }t        |d
| d      }t        |d|       }|j                          |j                  |j                        }	|	||j                  <    t        d|j                                |j                         D ]=  \  }
}|j                         D ]%  \  }}t        j                   ||      rJ |
|dg        ? I y )N)anyallr      rm   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grad2s                 r   test_gradients_imperativesr     sG    a	&IIa'//	:AA)L& 	3G##A&B2v&Ni@BLI>B,	aHBI;BKKM##BGG,D.2GG**+	3 	'8#MMO 	aLE5 ' au{{5%0`5%A_2``0a	a)ar7   c                  p   t         D ]  } t        d| j                         t        j                  dd      j                  g d      }g d}|D ]d  }t        j                  ||      }| j                  |      }| j                  ||      }| j                  |      }t        j                  ||      rdJ   y 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repeatedra   s           r   test_tiling_imperativesr(    s    " 4!7#9#9:		)73;;OL


 " 	4Gwwug.H**51I||Iw7H%%h/F>>&(333	44r7   c                  V   t         D ]  } t        d| j                         t        j                  dd      j                  g d      }g d}|D ]  }t        j                  ||      }| j                  |j                        }| j                  | j                  ||      ||gg      }t        j                  ||      sJ | j                  d gt        |j                        z        }| j                  | j                  ||      ||gg      }t        j                  ||      rJ  " y r"  )r   r   r   r   r*   r+   r$  r?   r<   r@   r-   ro   )rC   r   r   r%  r`   r   ra   s          r   test_tiling_symbolicr*    s   " 4!7#9#9:		)73;;OL


 " 	4Gwwug.H''4C((c7)CsEl^TF>>&(333''U[[1A(ABC((c7)CsEl^TF>>&(333	44r7   za b c -> c a bza b c -> (c copy a b)r   r    r"   )r   arj   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                     |j                  d      \  }}|dz   |z   }t        | |fi |}t        ||fddi|}t        ||fddi|}t        j                  | |      sJ t        j                  | |      sJ y)z*Checks repeat pattern by running reductionr   r)   r%   r&   N)splitr   r   r   r-   )	r   repeat_patternrw   r   r   reduce_patternr'  reduced_minreduced_maxs	            r   check_reversionr6    s     &&t,KD%T\D(Na151H>LULeLK>LULeLK>>![)))>>![)))r7   c                      t        j                  d      j                  g d      } t        | dd      }t        j                  | d    |      sJ t
        D ]  \  }}t        | |fi |  y )Nr#  r   r    r"   za b c -> copy a b c r   r-  )r   r*   r+   r   r-   repeat_test_casesr6  )r   x1r1   axis_dimensionss       r   test_repeat_numpyr<    se    
		)$$Y/A	)	2B>>!D'2&&&$5 7 76o67r7   c                  V   t        j                  d      j                  g d      } t        D ]z  }t	        d|j
                         t        D ]Y  \  }}t        | |fi |}|j                  |       }t        ||fi |}|j                  |      }t        j                  ||      rYJ  | y Nr#  r8  zRepeat tests for )r   r*   r+   r   r   r   r9  r   rA   rB   r-   )r   rC   r1   r;  r`   r&  r'  ra   s           r   test_repeat_imperativesr?    s    
		)$$Y/A" 4!7#9#9:(9 	4$G_a<O<H**1-IiDODH%%h/F>>&(333	44r7   c            	      n   t        j                  d      j                  g d      } t        D ]  }t	        d|j
                         t        D ]e  \  }}t        | |fi |}|j                  | j                        }|j                  t        ||fi ||| gg      }t        j                  ||      reJ   y r>  )r   r*   r+   r   r   r   r9  r   r?   r<   r@   r-   )r   rC   r1   r;  r`   r   ra   s          r   test_repeat_symbolicrA    s    
		)$$Y/A" 4!7#9#9:(9 	4$G_a<O<H''0C((W)P)PTWYZS[R\]F>>&(333	44r7   c                  z   dd l } ddlm} | j                  dk  rt	        j
                          t        j                  d      j                  g d      }t        D ]_  \  }}t        ||fi |} |j                  | j                  |      |fi |}t        j                  |j                  |dz         |      r_J  y )Nr   rU   rW   r#  r8  )rX   rY   rV   rZ   r   r[   r   r*   r+   r9  r   r\   r-   r]   )r^   r_   r   r1   r;  r`   ra   s          r   test_repeat_array_apirC     s    &	~~
		)$$Y/A$5 @ !W882>>!,gII~~bjj!4h???	@r7   za b c d -> c a d bza b c d -> (c 2 d a b)r#   )r+  r,  rI   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                      t        j                  d      j                  g d      } t        D ]  \  }}t	        | |fi |  y )N0   )r   r   r!   r#   )r   r*   r+   test_cases_repeat_anonymousr6  )r   r1   r;  s      r   test_anonymous_axesrG  <  s>    
		- ((6A$? 7 76o67r7   c                     t        j                  d      j                  g d      } t        j                  t	        t        |       d      t	        | d            sJ t        j                  t        t        |       dd      t        | dd            sJ t        j                  t        t        |       dd      t        | dd            sJ y )	Nr   r   z... -> (...)za ... e -> (...)r%   z...  -> b (...)r    )rj   )r   r*   r+   r-   r   rP   r   r   r   s    r   test_list_inputsrI  B  s    
		#$,,_=A>>$q'>*!^$   >>tAw*E2q$e,   >>tAw)Q/q#q)  r7   c                  6   t        d      st        j                          dd l} d| j                  j
                  _        d }| j                  |dd      }| j                  |dd      }| j                  g d      }| j                   ||       ||      d	
      sJ | j                   ||       ||      d	
      sJ | j                  g d      }| j                   ||       ||      d	
      sJ | j                   ||       ||      d	
      sJ y )Ntorchr   Tc                 f    | j                   ^}}}}t        | dd      } t        | dd|dz        } | S )Nz"(a a2) b c ... -> b (c a2) (a ...)r   r   zb ca2 A -> b Ar'   )ca2)r<   r   r   )r   r+  rj   r,  others        r   func1z4test_torch_compile_with_dynamic_shape.<locals>.func1[  s<    ''1a%a=!D1&1q59r7   F)dynamic	fullgraph)r!   r"   r#   r    r   gh㈵>)atol)r#   r    r!   r   r    )
r
   r   r[   rK  _dynamoconfigverbosecompilerandnr   )rK  rO  func1_compiled_staticfunc1_compiled_dynamicr   s        r   %test_torch_compile_with_dynamic_shaperZ  S  s   W% $(EMM  "MM%$MO"]]5$$]O&A>>/2E!H4>HHH>>03U1XD>III)A>>/2E!H4>HHH>>03U1XD>IIIr7   c                 >     t         fdt        d      D              S )Nc              3   .   K   | ]  }|z	  d z    yw)r   N )r   r   r   s     r   r   zbit_count.<locals>.<genexpr>q  s     /Q!|/s      )r'   r   r   s   `r   	bit_countr_  p  s    /U2Y///r7   c                     t        j                  t        d      D  cg c]  } t        |       dz  dk(   c}       j	                  dgdz        }t
        D ]  }t        d|j                         t        d      D ]  }t        j                  ||d      }t        j                  ||d      }t        j                  ||      rJ t        d      }t        |      }t        |      }d	||<   d
j                  |      dz   d
j                  |      z   }	t        |j                  |      |	d      }
t        |j                  |      |	d      }t        j                  ||j                  |
            sJ t        j                  ||j                  |            r J  t        j                  |dd      }t        j                  |dd      }d}	t        |j                  |      |	d      }
t        |j                  |      |	d      }t        j                  ||j                  |
            sJ t        j                  ||j                  |            rJ  yc c} w )z5Checks that any/all reduction works in all frameworks@   r   r   r#   zReduction any/all tests for T)r   r   rk   1r}   r   r  r(   r  )r   r   za b ... -> 1 1 ...N)r   rd   r   r_  r+   r   r   r   r  r  r-   rP   r   r   rA   rB   )r   x_nprC   r   expected_result_anyexpected_result_allaxesaxes_inaxes_outr1   res_anyres_alls               r   #test_reduction_imperatives_booleansrk  t  s   ::dD1	!q(Q.DEMMqcTUgVD" N,g.D.DE!H 	RD"$&&D4"H"$&&D4"H~~&9;NOOO>D4jGDzH HTNxx(F2chhx6HIGW//5w%PGW//5w%PG>>"5w7G7G7PQQQ>>"5w7G7G7PQQQ	R$ !ffTF ffTF&++D17eL++D17eL~~173C3CG3LMMM~~173C3CG3LMMM7N Es   I)r   F)6rQ   rX   r   r   rY   r   einops.einopsr   r   r   r   einops.testsr   r   r	   r
   r   r   r>   default_rngr=   r,   r.   r/   r   r6   rN   rS   rb   re   rz   r   r   r   r   r   r  r  r   r(  r*  rs   r9  r6  r<  r?  rA  rC  rF  rG  rI  rZ  r_  rk  r]  r7   r   <module>ro     s       J J 7 A'uE'eDii	 ! ! '5$.6"@P #*L78!TH2Fju@0f-J&a64"4, tvdQ!q9:t|,%taq'BCTq\*#T%;<TV $Qa"89&1A(>? *7
44@& 46"ta123#Tq\2 )4aq+AB+TV4 7"J:0Nr7   