
    3j                        S r SSKJr  SSKrSSKJrJr  SSKrSSKJ	r	  SSK
Jr  SSKJr  SS	KJr  \(       a  SS
KJr  SS jr " S S5      rSSS jjrSSS jjrSS jr     S             SS jjr  S           SS jjrg)zM
Python implementation of function wrapping functionality for functorch.dim.
    )annotationsN)AnyTYPE_CHECKING)tree_map   )DimEntry)EnableAllLayers)
TensorInfo)Callablec                    U $ )z8Handle tensor conversion for torch function integration. )tensors    M/home/wildlama/miniconda3/lib/python3.13/site-packages/functorch/dim/_wrap.pyhandle_from_tensorr      s    M    c                  <    \ rS rSrSr S     SS jjrS	S jrSrg)
WrappedOperator   zH
This class wraps PyTorch operations to support first-class dimensions.
c                @   Xl         X l        [        USS5      U l        [        USS 5      U l        X0l        SU l        SU l        SU l        SU l	        SU l
        U R                  (       a4  U R
                  (       a"  U R                   SU R
                   S	3U l        g g g )
N__name__ __doc__Fr   r   Tz
Argument 'z5' can be either an integer or a torchdim.Dim object.
)origwrapper_implementationgetattrnamedocdim_nameis_pointwise
dim_offsetkeepdim_offset
single_dimreduce)selfr   r   r   s       r   __init__WrappedOperator.__init__    s     	&<#D*b1	4D1 ! 88((<>tuDH &8r   c                |   ^  SU 4S jjn[         R                  " UT R                  SSS9  T R                  Ul        U$ )z@Create a wrapped function that calls our wrapper implementation.c                 0   > TR                   " T/U Q70 UD6$ )N)r   )argskwargsr$   s     r   wrapped_func.WrappedOperator.function.<locals>.wrapped_func6   s    ..tEdEfEEr   )r   r   )assignedupdated)r)   r   r*   r   returnr   )	functoolsupdate_wrapperr   r   r   )r$   r+   s   ` r   functionWrappedOperator.function3   s:    	F 	  $))mR	
  $xxr   )
r   r    r   r   r!   r   r   r#   r"   r   N)dim)r   r   r   r   r   str)r/   r   )r   
__module____qualname____firstlineno__r   r%   r2   __static_attributes__r   r   r   r   r      s4    
 QVvv6>vJMv&r   r   c                    SSK Jn  [        X5      (       a  U(       a  [        S5      e[	        U 5      $ [        U [
        5      (       a  U nUS:  a  XA-  nUS:  a  M  [	        U5      $ [	        5       $ )z:Convert single dimension specification to DimEntry object.r   )Dimz8cannot preserve first-class dimensions with keepdim=Truer   )r   r;   
isinstance
ValueErrorr   int)r4   ndimkeepdimr;   is        r   	_wrap_dimrB   B   sd    #WXX}	C		1fIA 1f{zr   c                    [        XU5      n/ nUR                  5       (       d  UR                  U5        U$ U  H  nUR                  [        XQU5      5        M      U$ )z<Convert dimension specification to list of DimEntry objects.)rB   is_noneappend)r4   r?   r@   deresultds         r   
_wrap_dimsrI   S   sU    	3g	&BF::<<b M AMM)AW56 Mr   c                  ^^ U(       d  [        S5      eUR                  U R                  5      nUc;  U R                  [	        U5      :  a"  U R                  S-   nU[	        U5      :  a  X   nUc  [
        R                  " US   SSS9mT(       d  U R                  " U0 UD6$ [        TR                  5       nTR                  c  [        S5      eUR                  TR                  TR                  5        [        U5      n[        TR                  5      US'   U R                  " U0 UD6nUR                  UTR                   5      sSSS5        $ [
        R                  " US   5      mT(       d  U R                  " U0 UD6$ SnU R"                  (       a]  UR                  S	5      n	U	c;  U R$                  [	        U5      :  a"  U R$                  S-   n
U
[	        U5      :  a  X   n	U	b  ['        U	5      nTR)                  5       n[+        X;U5      n/ nS/[	        TR                  5      -  nU H  nSn[-        TR                  5       H  u  nnUU:X  d  M  Un  O   Uc  [-        TR                  5       H3  u  nn[/        US
5      (       d  M  UR1                  U5      (       d  M1  Un  O   Uc6  TR                   Vs/ s H  n[3        U5      PM     nn[        SU SU 35      eSUU'   UR5                  U5        M     / mU R"                  (       aD  U(       d=  [-        TR                  5       H#  u  nnUU   (       a  M  TR5                  U5        M%     OTR                  SS m[	        U5      S:X  a  US   nO[7        U5      n[        U5      nUR9                  5       nTR:                  c  [        S5      e[        TR:                  5      US'   U R                  U;   a  UUU R                  '   O-U R                  S-   nU[	        U5      :  a  [        U5      nUXd'   U R                  " U0 UD6nSUU4S jjn[=        UU5      $ ! , (       d  f       GN= fs  snf )zB
This is the core method that handles dimension-aware operations.
z%Expected at least one argument (self)Nr   r   TF)ensure_batchedensure_presentz%Expected batchedtensor to be non-Noner@   matcheszTensor with dimensions z does not contain zExpected tensor to be non-Nonec                   > [        U [        R                  5      (       a#  SSKJn  UR	                  U TTR
                  5      $ U $ )Nr   )Tensor)r<   torchrO   r   from_positional
has_device)objrO   info
new_levelss     r   wrap_result'patched_dim_method.<locals>.wrap_result   s5    c5<<(( ))#z4??KK
r   )rS   r   r/   r   )r=   getr   r    lenr
   creater   r	   levelsbatchedtensorAssertionErrorinplace_update_layerslistr   from_batchedrR   r#   r!   boolr?   rI   	enumeratehasattrrM   r5   rE   tuplecopyr   r   )wrapperr)   r*   dim_argdim_idxguardnew_argsrG   r@   keepdim_argkeepdim_idxr?   dimsdim_indicesseenrH   midxrA   level
level_strs
py_indices
new_kwargsrV   rT   rU   s                          @@r   patched_dim_methodru   _   s    @AA jj))*G7--D	9$$q(SYmG   aeT<<000T[[)U!!)$%LMM''(:(:DKKHDzH,T-?-?@HQK\\86v6F%%fdoo> *) T!W%D||T,V,, G~~jj+7#9#9CI#E!0014KSY&"/";'G 99;DgW-D  K7S%%D!$++.HAuz /
 <%dkk255),,q1A1AD 3
 |6:kkBkUc%jk
B -j\9KA3O  T
4 + 0 J~~g!$++.HAu77!!%( / [[^
 ;1%a.
;'
 DzHJ{{=>>$T[[1HQK :%'1
7##$$$q(S]"H~H *H \\82z2F  K((E *)` Cs   8BQ:Q
Qc                    U=(       d    Sn[        U [        U5      nUb  Xl        Ub  X&l        Ub  XFl        Ub  XVl        UR                  5       $ )a  
Wrap a PyTorch function to support first-class dimensions.

Args:
    orig: Original function to wrap
    dim_offset: Offset for dimension argument (default: 0)
    keepdim_offset: Offset for keepdim argument (default: 1)
    dim_name: Name of dimension parameter (default: "dim")
    single_dim: Whether function takes single dimension (default: False)
    reduce: Whether function reduces dimensions (default: True)
r4   )r   ru   r    r!   r"   r#   r2   )r   r    r!   r   r"   r#   rf   s          r   _wraprw      s[    &  5Hd$6AG'!!/'r   c                <    Uc  0 nSSK Jn  UR                  XX45      $ )z8
Handle __torch_function__ calls for wrapped operators.
r   )_Tensor)r   ry   __torch_function__)rf   functypesr)   r*   ry   s         r   call_torch_functionr}      s(     ~  %%d4@@r   )r   torch.Tensorr/   r~   )F)r4   r   r?   r>   r@   ra   r/   r   )r4   r   r?   r>   r@   ra   r/   zlist[DimEntry])rf   r   r)   r   r*   r   r/   r   )NNNNN)r   r   r    
int | Noner!   r   r   z
str | Noner"   bool | Noner#   r   r/   r   )r   N)rf   r   r{   r   r|   rd   r)   rd   r*   zdict | Noner/   r   )r   
__future__r   r0   typingr   r   rP   torch.utils._pytreer   
_dim_entryr   _enable_all_layersr	   _tensor_infor
   collections.abcr   r   r   rB   rI   ru   rw   r}   r   r   r   <module>r      s    #  %  (   / $ (
$ $N"	w)x "!%" 
     	 
      N AA
A A 	A
 A 	Ar   