
    h/                     X    S SK r S SKJr  S\S\S\4S jr " S S\ R
                  5      rg)	    N)tree_mapsizealignment_valuereturnc                     SU S-
  U-  -   U-  $ N    )r   r   s     X/home/james-whalen/.local/lib/python3.13/site-packages/torchao/swizzle/swizzle_tensor.py_get_min_alignmentr      s    $(./?BB    c                       \ rS rSrSr SS\R                  S\4S jjrSS jr	S r
S rS	 rS
 r\S 5       rS r\SS j5       r\R&                  R(                  rSrg)SwizzleTensor   z
A Python-only swizzled tensor subclass.

Intended usage of this abstraction:
Swizzle weight Tensor to avoid LDS use during GEMMs on ROCm hardware.
originalshallowc                 j    [         R                  " USS9n[         R                  R                  X5      $ )Nmeta)device)torch
empty_likeTensor_make_subclass)clsr   r   wrappers       r   __new__SwizzleTensor.__new__   s+    
 ""8F;||**388r   c                    U(       a  g UR                   S:X  d   S5       eUR                  S:X  d  UR                  S:X  d   eUR                  S:X  a  SOSnUR                  S:X  a  SOSnUR                   S:X  a  UR                  u  pVSnUR                   S	:X  a  UR                  u  pun[        WS5      n[        WU5      n	X-
  n
X-
  n[        R
                  R                  R                  USUSU
4S
S5      nUR                   S:X  a/  UR                  US-  SX-  SU5      nUR                  SSS	SS5      nUR                   S	:X  a1  UR                  WUS-  SX-  SU5      nUR                  SSS	SSS5      nUR                  5       U l        WU l        XPl        X`l        Xl        Xl        Xl        Xl        UR                   U l        SU l        g )N   z"SwizzleTensor only supports ndim 2r	       @      r   r      constant      F)ndimitemsizeshaper   r   nn
functionalpadviewpermute
contiguousxBMKalignedMalignedKpaddedMpaddedKoriginal_ndimis_transposed)selfr   r   kdivlastdimr2   r3   r1   r4   r5   r6   r7   r0   s                r   __init__SwizzleTensor.__init__    s   }}!G#GG!  A%):):a)???&&!+r((A-!2==A>>DAA==AnnGA!%a,%a.,,HH##Hq'1g.F
TUV==Ax2~r8+;QHA		!Q1a(A==Aq(b."h.>7KA		!Q1a+A  %]]"r   c                 V    U R                   R                   SU R                  5        S3$ )Nz
(original=))	__class____name__	unswizzler:   s    r   __repr__SwizzleTensor.__repr__C   s(    ..))**T^^5E4FaHHr   c                 ,   S nU R                   S:X  a  U R                  R                  SSSSS5      R                  5       nUR	                  U R
                  U R                  5      nUSU R                  2SU R                  24   nUR	                  U R                  U R                  5      nU R                  (       a  UR                  nU R                   S:X  a  U R                  R                  SSSSSS5      R                  5       nUR	                  U R                  U R
                  U R                  5      nUSU R                  2SU R                  2SU R                  24   nUR	                  U R                  U R                  U R                  5      nU$ )Nr   r   r#   r	   r%   r&   )r8   r0   r.   r/   reshaper4   r5   r2   r3   r9   Tr1   )r:   undones     r   rC   SwizzleTensor.unswizzleF   s6   "VV^^Aq!Q2==?F^^DMM4==AFAJDFF
23F^^DFFDFF3F!!"VV^^Aq!Q15@@BF^^DFFDMM4==IFAJDFF
AJ>?F^^DFFDFFDFF;Fr   c                    U R                   S:X  aO  U R                  R                  U R                  U R                  5      nU R
                  (       a  UR                  nU$ U R                   S:X  aZ  U R                  R                  U R                  U R                  U R                  5      nU R
                  (       a  UR                  nU$ g )Nr   r#   )r8   r0   rH   r4   r5   r9   rI   r1   )r:   tmps     r   	as_tensorSwizzleTensor.as_tensorV   s    "&&..>C!!eeJ"&&..FC!!eeJ	 #r   c           	      f   U R                   S:X  a  U R                  U R                  4O"U R                  U R                  U R                  44n[	        [
        R                  " XR                  U R                  SS.6S5      nU R                  Ul	        U R                  Ul        U R                  Ul        U R                  Ul        U R                  Ul
        U R                  Ul        U R                  Ul        U R                  Ul        U R                   Ul         U R                  (       + Ul        U$ )Nr   r   )dtypelayoutr   T)r8   r2   r3   r1   r   r   emptyrQ   rR   r0   r4   r5   r6   r7   r9   )r:   r)   new_objs      r   shallow_transposeSwizzleTensor.shallow_transposec   s     $ 2 2a 7TVVTVVdffdffdff=U
  KKjjVT
 FF	FF	FF	FF	====,,,, $ 2 2$($6$6 6r   c                     [         R                  " U R                  (       a  U R                  U R                  45      $ U R                  U R                  45      $ N)r   Sizer9   r3   r2   rD   s    r   r)   SwizzleTensor.shapew   s;    zzd.@.@466466*WWtvvtvvFVWWr   c                 \    U R                   (       a  SU R                  4$ U R                  S4$ r   )r9   r3   rD   s    r   strideSwizzleTensor.stride{   s%    "00466{AtvvqkAr   Nc                     SSK Jn  X;   a  XQ   " XU5      $ S nS n[        Xq" [        Xc5      0 [        Xd5      D65      $ )Nr   )SWIZZLE_OPS_TABLEc                 P    [        U [        5      (       a  U R                  5       $ U $ rX   )
isinstancer   rC   es    r   unwrap0SwizzleTensor.__torch_dispatch__.<locals>.unwrap   s    $.q-$@$@1;;=GaGr   c                 Z    [        U [        R                  5      (       a  [        U 5      $ U $ rX   )ra   r   r   r   rb   s    r   wrap.SwizzleTensor.__torch_dispatch__.<locals>.wrap   s"    '1!U\\'B'B=#IIr   )torchao.swizzle.swizzle_opsr_   r   )r   functypesargskwargsr_   rd   rg   s           r   __torch_dispatch__ SwizzleTensor.__torch_dispatch__~   sM     	B$$*4v>>	H	J dHV$:Whv>VWXXr   )
r1   r3   r2   r5   r4   r9   r8   r7   r6   r0   )FrX   )rB   
__module____qualname____firstlineno____doc__r   r   boolr   r=   rE   rC   rN   rU   propertyr)   r\   classmethodrn   _C_disabled_torch_function_impl__torch_function____static_attributes__r
   r   r   r   r      s     9,,9 9!#FI ( X XB Y Y  ??r   r   )r   torch.utils._pytreer   intr   r   r   r
   r   r   <module>r}      s?     (CS C3 C3 C@ELL @r   