
    ȅiF                        % S r SSKJr  SSKJr  SSKJrJr  SSKJ	r	J
r
JrJrJrJrJrJrJr  \\-  \\S4   -  S-  r\\S	'    " S
 S5      rS\S\S   4S jr " S S\5      r\\-  r\\S'   \\S4   \-  S-  r\\S'   \\-  \\S4   -  S-  r\\S'   S\\\S4   -  S\4S jrS\S\4S jrS\S\4S jrS-S\S\S\4S jjr S-S\S\S\4S jjr!S\S\S\4S jr"S.S\S\S\4S  jjr#S\S-  S\S-  4S! jr$S\S-  S\S-  4S" jr%S\S\S\4S# jr&S\S\S\4S$ jr'S%\S\S\S\4S& jr(S\S\S\4S' jr)S\S\S\4S( jr*S\S\S\4S) jr+S\S\S\4S* jr,S+\\S4   S\S\\\4   4S, jr-g)/z
Definition of CuTe Layouts and functions to manipulate them which works with the order
of lexicographic instead of co-lexicographic as implemented in the original layout.py
    )chain)	TypeAlias)SelfTypeIs   )	crd2idxflattenhas_noneIntTupleis_intis_tupleproductslice_suffix_product.NCoordinateTypec                       \ rS rSrSrg)
LayoutBase=    N)__name__
__module____qualname____firstlineno____static_attributes__r       Z/home/james-whalen/.local/lib/python3.13/site-packages/torch/distributed/_pycute/layout.pyr   r   =   s    r   r   xreturnLayoutc                 "    [        U [        5      $ N)
isinstancer   )r   s    r   	is_layoutr#   A   s    a$$r   c                       \ rS rSrSS\S\S-  SS4S jjrS\S\4S jrS\	4S	 jr
S
\S\\	-  4S jrS\	S\4S jrS\	4S jrS\	4S jrS\4S jrS\4S jrSrg)r   E   N_shape_strider   c                 X    Xl         Uc  [        U R                   5      U l        g X l        g r!   )shaper   stride)selfr&   r'   s      r   __init__Layout.__init__F   s!    
?(4DK!Kr   otherc                     [        U[        5      (       d  gU R                  UR                  :H  =(       a    U R                  UR                  :H  $ )NF)r"   r   r)   r*   )r+   r.   s     r   __eq__Layout.__eq__N   s7    %((zzU[[(HT[[ELL-HHr   c                 b    [        U R                  5      (       a  [        U R                  5      $ gNr   )r   r)   lenr+   s    r   __len__Layout.__len__T   s"    DJJtzz?"r   argsc                    [        U5      (       a{  [        U5      S:X  a:  [        [        US   U R                  5      [        US   U R
                  5      5      $ [        [        XR                  5      [        XR
                  5      5      $ [        U5      S:X  a$  [        US   U R                  U R
                  5      $ [        XR                  U R
                  5      $ )z
Map a logical coordinate to a linear index (Coord has no Underscore slice operators)
OR
Slice the layout and return the sublayout (Coord has an Underscore slice op)

Follow the same behavior of `Layout::operator(Coord const&)` in cute C++
r   r   )r
   r4   r   r   r)   r*   r   )r+   r8   s     r   __call__Layout.__call__[   s     D>>4yA~fT!Wdjj96$q'4;;;WXXfT::6t[[8QRR4yA~tAw

DKK@@tZZ==r   ic                     [        U R                  5      (       a&  [        U R                  U   U R                  U   5      $ US:X  d   e[        U R                  U R                  5      $ )Nr   )r   r)   r   r*   )r+   r<   s     r   __getitem__Layout.__getitem__o   sN    DJJ$**Q-Q886M6$**dkk22r   c                 ,    [        U R                  5      $ r!   )r   r)   r5   s    r   sizeLayout.sizew   s    tzz""r   c                 :    U " U R                  5       S-
  5      S-   $ r3   )rA   r5   s    r   cosizeLayout.cosize{   s    DIIK!O$q((r   c                 8    U R                    SU R                   3$ )N:r)   r*   r5   s    r   __str__Layout.__str__   s    **Qt{{m,,r   c                 <    SU R                    SU R                   S3$ )NzLayout(,)rH   r5   s    r   __repr__Layout.__repr__   s    Adkk]!44r   rH   r!   )r   r   r   r   r   r,   objectboolr0   intr6   r   r   r:   r>   rA   rD   strrI   rN   r   r   r   r   r   r   E   s    "x "(T/ "T "IF It I >n > >(3S 3T 3#c #) )- -5# 5r   LayoutOrIntTupleLayoutProfileLayoutInputlayoutsc                      [        U 5      S:X  a  [        U S   5      (       d  U S   n [        S U  5       6 u  p[        X5      $ )Nr   r   c              3   P   #    U  H  oR                   UR                  4v   M     g 7fr!   rH   ).0as     r   	<genexpr>make_layout.<locals>.<genexpr>   s     ?w!77AHH-ws   $&)r4   r#   zipr   )rW   r)   r*   s      r   make_layoutr_      sB    
7|q71:!6!6!*?w?@ME%  r   layoutc                 X    [        U 5      (       a  U R                  5       $ [        U 5      $ r!   )r#   rA   r   r`   s    r   rA   rA      s#    {{}6?r   c                 "    U R                  5       $ r!   )rD   rb   s    r   rD   rD      s    ==?r   profilec                    ^ ^ [        T5      (       ar  [        T 5      [        T5      :  d   e[        [        U U4S j[	        [        T5      5       5       U 4S j[	        [        T5      [        T 5      5       5       5      5      $ S/nS/n[        [        [        T R                  5      5      [        [        T R                  5      5      5       H^  u  pEUS:X  a  M  US   S:X  a
  XBS'   XSS'   M   US   US   -  U:X  a  US   U-  US'   M<  UR                  U5        UR                  U5        M`     [        U5      S:X  a  [        US   US   5      $ UR                  5         UR                  5         [        [        U5      [        U5      5      $ )Nc              3   H   >#    U  H  n[        TU   TU   5      v   M     g 7fr!   )coalescerZ   r<   r`   rd   s     r   r\   coalesce.<locals>.<genexpr>   s%     N:MQ&)WQZ00:M   "c              3   .   >#    U  H
  nTU   v   M     g 7fr!   r   rZ   r<   r`   s     r   r\   ri           E$Dq$D   r   r   )r   r4   r_   r   ranger^   reversedr	   r)   r*   appendr   reversetupler`   rd   result_shaperesult_strider)   r*   s   ``    r   rg   rg      sk   6{c'l***N%G:MNEE#g,F$DE
 	
 3LCM &''&--2H)I A:""$ &""b 11V;+B/%7L &  (!$ <Al1o}Q'788eL)5+?@@r   c                 p  ^ ^ [        T5      (       ar  [        T 5      [        T5      :  d   e[        [        U U4S j[	        [        T5      5       5       U 4S j[	        [        T5      [        T 5      5       5       5      5      $ / n/ n[        [        T R                  5      [        T R                  5      5       H7  u  pEUS:X  a  M  US:X  a  M  UR                  U5        UR                  U5        M9     [        U5      S:X  a  [        SS5      $ [        [        [        U5      [        U5      5      5      $ )Nc              3   H   >#    U  H  n[        TU   TU   5      v   M     g 7fr!   )filterrh   s     r   r\   filter.<locals>.<genexpr>   s%     L8K1q	71:..8Krj   c              3   .   >#    U  H
  nTU   v   M     g 7fr!   r   rl   s     r   r\   r{      rm   rn   r   r   )r   r4   r_   r   rp   r^   r	   r)   r*   rr   r   rg   rt   ru   s   ``    r   rz   rz      s    6{c'l***Lc'l8KLEE#g,F$DE
 	
 LMWV\\2GFMM4JK
fk&  (	 L <Aa|u\2E-4HIJJr   layoutAlayoutBc                   ^ ^ Tc  T $ [        T5      (       a  [        T [        T5      5      $ [        T5      (       ar  [	        T 5      [	        T5      :  d   e[        [        U U4S j[        [	        T5      5       5       U 4S j[        [	        T5      [	        T 5      5       5       5      5      $ [        TR                  5      (       a  [        U 4S jT 5       5      $ TR                  S:X  a  [        TR                  S5      $ / n/ nTR                  nTR                  n[        T 5      n[        [        [        UR                  5      SS  5      [        [        UR                  5      SS  5      5       Hd  u  pxXu-  S:X  d
  XW-  S:X  d   e[        [        SXu-  5      U5      n	U	S:w  a$  UR!                  U	5        UR!                  XX-  5        XI-  nU* U-  * nMf     US:w  d  [	        U5      S:X  a;  UR!                  U5        UR!                  U[        UR                  5      S   -  5        UR#                  5         UR#                  5         [	        U5      S:X  a  [        US   US   5      $ [        [%        U5      [%        U5      5      $ )Nc              3   H   >#    U  H  n[        TU   TU   5      v   M     g 7fr!   compositionrZ   r<   r}   r~   s     r   r\   composition.<locals>.<genexpr>   s%     R>QWQZ44>Qrj   c              3   .   >#    U  H
  nTU   v   M     g 7fr!   r   rZ   r<   r}   s     r   r\   r           G%F%Frn   c              3   <   >#    U  H  n[        TU5      v   M     g 7fr!   r   )rZ   	layoutB_ir}   s     r   r\   r      s     TGy;w	::Gs   r   r   )r   r   r   r   r4   r_   r   rp   r)   r*   rg   r^   rq   r	   minmaxrr   rs   rt   )
r}   r~   rv   rw   
rest_shaperest_strideflat_A
curr_shapecurr_stride	new_shapes
   ``        r   r   r      s:   	7F7O44	'		7|s7|+++ReCL>QRGU3w<W%FG
 	
 
'--	 	 TGTTT~~gmmQ'']]
nn'" (+WV\\*12./'&--:PQRQS:T1U(
#J +q0K4LPQ4QQQC:#<=zJIA~##I.$$[%>?#0J
*K(
$ ?c,/14
+  wv}}/Ea/H!HI 	|!,q/=+;<<%-u]/CDDr   max_idxc                 t   [        U 5      (       a  [        [        U 5      5      $ / n/ nSn[        [	        [        U R                  5      [        U R                  5      5      5      nU H]  u  pgUS:X  d  US:X  a  M  XGU-  :*  n[        U5      [        Ld	  U(       d   eUR                  Xd-  5        UR                  U5        Xv-  nM_     UR                  X-   S-
  U-  5        UR                  U5        UR                  5         UR                  5         [        [        [        U5      [        U5      5      5      $ )Nr   r   )r   
complementr   sortedr^   r	   r*   r)   typerQ   rr   rs   rg   rt   )	r`   r   rv   rw   current_idx	sorted_DSr*   r)   in_bounds	            r   r   r   *  s   f~~&.))LMKs76==176<<3HIJI"Q;%1*&.0Xd*x77F12[)n # .2{BC% F5.m0DEFFr   c           	         U c  g [        U 5      (       a  [        U 5      $ / n/ nSn[        U R                  5      n[        U R                  5      n[        [        XT[        U5      5      5      nU H;  u  pxn	US:X  a  M  X7:w  a    O*UR                  U5        UR                  U	5        X-  nM=     UR                  5         UR                  5         [        [        [        U5      [        U5      5      5      $ r3   )r   r   r	   r)   r*   r   r^   r   rr   rs   rg   rt   )
r`   rv   rw   r   
flat_shapeflat_stride
sorted_DSAr*   r)   rstrides
             r   right_inverser   J  s    ~	f~LMK&J&--(KK^J5OPQJ",wA: E"W%n #- F5.m0DEFFr   c                 |    U c  g [        U 5      (       a  [        U 5      $ [        [        [	        U 5      U 5      5      $ r!   )r   r   r   r_   r   rb   s    r   left_inverser   g  s4    ~	f~Z%7@AAr   c                   ^ ^ Tc  T $ [        T5      (       a  [        T [        T5      5      $ [        T5      (       ar  [	        T 5      [	        T5      :  d   e[        [        U U4S j[        [	        T5      5       5       U 4S j[        [	        T5      [	        T 5      5       5       5      5      $ [        T [        T[        T[        T 5      5      5      5      $ )Nc              3   H   >#    U  H  n[        TU   TU   5      v   M     g 7fr!   )logical_divider   s     r   r\   !logical_divide.<locals>.<genexpr>{  s*      0 #71:wqz::0rj   c              3   .   >#    U  H
  nTU   v   M     g 7fr!   r   r   s     r   r\   r     r   rn   )r   r   r   r   r4   r_   r   rp   r   r   rA   r}   r~   s   ``r   r   r   q  s    	gvg77	'		7|s7|+++"3w<0 HU3w<W%FG	
 		
 GZg?@ r   c                   ^ ^ Tc  T $ [        T5      (       a  [        T [        T5      5      $ [        T5      (       ar  [	        T 5      [	        T5      :  d   e[        [        U U4S j[        [	        T5      5       5       U 4S j[        [	        T5      [	        T 5      5       5       5      5      $ [        T [        [        T [        T 5      [        T5      -  5      T5      5      $ )Nc              3   H   >#    U  H  n[        TU   TU   5      v   M     g 7fr!   )logical_productr   s     r   r\   "logical_product.<locals>.<genexpr>  s*      0 $GAJ
;;0rj   c              3   .   >#    U  H
  nTU   v   M     g 7fr!   r   r   s     r   r\   r     r   rn   )r   r   r   r   r4   r_   r   rp   r   r   rA   rD   r   s   ``r   r   r     s    	gvg77	'		7|s7|+++"3w<0 HU3w<W%FG	
 		
 JwWw(GH'R r   splitterc                    ^ ^^^ Tc  [        [        SS5      T5      $ [        T5      (       a  [        T5      [        T5      :  d   e[        UUU 4S j[	        [        T5      5       5       5      m[        [        U4S j[	        [        T5      5       5       5      [        [        U4S j[	        [        T5      5       5       U4S j[	        [        T5      [        T5      5       5       5      5      5      $ T " TT5      $ )Nr   r   c              3   J   >#    U  H  n[        TTU   TU   5      v   M     g 7fr!   )
hier_unzip)rZ   r<   r}   r~   r   s     r   r\   hier_unzip.<locals>.<genexpr>  s,      
( xWQZ88(s    #c              3   4   >#    U  H  nTU   S    v   M     g7f)r   Nr   rZ   r<   splits     r   r\   r     s     A-@a-@   c              3   4   >#    U  H  nTU   S    v   M     g7f)r   Nr   r   s     r   r\   r     s     >*=QU1Xa[*=r   c              3   .   >#    U  H
  nTU   v   M     g 7fr!   r   r   s     r   r\   r     s     K)JAWQZ)Jrn   )r_   r   r   r4   rp   r   )r   r}   r~   r   s   ```@r   r   r     s    
 6!Q<11	'		7|s7|+++ 
3w<(
 

 AU3w<-@AA>%G*=>Ks7|S\)JK
 	
 GW%%r   c                 "    [        [        X5      $ r!   )r   r   r   s     r   zipped_divider     s    ng77r   c           	          [        X5      n[        US   /[        [        US   5      5       Vs/ s H
  o2S   U   PM     sn-   5      $ s  snf Nr   r   )r   r_   rp   r4   r}   r~   resultr<   s       r   tiled_divider     sI    7,Fq	{E#fQi.<Q%R<QqQil<Q%RRSS%R   A	
c                 "    [        [        X5      $ r!   )r   r   r   s     r   zipped_productr     s    ow88r   c           	          [        X5      n[        US   /[        [        US   5      5       Vs/ s H
  o2S   U   PM     sn-   5      $ s  snf r   )r   r_   rp   r4   r   s       r   tiled_productr     sI    G-Fq	{E#fQi.<Q%R<QqQil<Q%RRSS%Rr   crdc                     [        [        XR                  5      [        XR                  5      5      [	        XR                  UR                  5      4$ r!   )r   r   r)   r*   r   )r   r`   s     r   slice_and_offsetr     s:    vc<<(&mm*DE\\6==1 r   r!   )r   ).__doc__	itertoolsr   typingr   typing_extensionsr   r   	int_tupler   r	   r
   r   r   r   r   r   r   rR   rt   rP   r   __annotations__r   r#   r   rT   rU   rV   r_   rA   rD   rg   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s  B
   *
 
 
 (NU63;''$. 	 
	 	% %F8, %?5Z ?5F %x/ ) / -6=y =(*U63;-??$FY F!&5#55 !& !! c 6 c 
&AV &Am &Av &ATK6 KM KV K6>E >E+ >E& >EDG' G# Gf G@G*T1 Gftm G:B)D0 BVd] BF [ V 4V k f 2&&& & 	&<86 8K 8F 8
T& T; T6 T9F 9[ 9V 9
T6 TK TF T
%, f vs{AS r   