
    #Ki^                         S r SSKJr  SSKrSSKJr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OptionalTYPE_CHECKING)tree_map   )DimEntry)EnableAllLayers)
TensorInfo)Callablec                    U $ )z8Handle tensor conversion for torch function integration. )tensors    U/var/www/html/dynamic-report/venv/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)r0   r   )r   
__module____qualname____firstlineno__r   r&   r3   __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)r5   ndimkeepdimr<   is        r   	_wrap_dimrC   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.)rC   is_noneappend)r5   r@   rA   deresultds         r   
_wrap_dimsrJ   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   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R/                  U5      (       d  M1  Un  O   Uc6  TR                   Vs/ s H  n[1        U5      PM     nn[        S
U SU 35      eSUU'   UR3                  U5        M     / mU R                   (       aD  U(       d=  [+        TR                  5       H#  u  nnUU   (       a  M  TR3                  U5        M%     OTR                  SS m[	        U5      S:X  a  US   nO[5        U5      n[        U5      nUR7                  5       nTR8                  c   e[        TR8                  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_presentrA   matcheszTensor with dimensions z does not contain c                   > [        U [        R                  5      (       a#  SSKJn  UR	                  U TTR
                  5      $ U $ )Nr   )Tensor)r=   torchrP   r   from_positional
has_device)objrP   info
new_levelss     r   wrap_result'patched_dim_method.<locals>.wrap_result   s5    c5<<(( ))#z4??KK
r   )rT   r   r0   r   )r>   getr   r!   lenr   creater   r
   levelsbatchedtensorinplace_update_layerslistr   from_batchedrS   r$   r"   boolr@   rJ   	enumeratehasattrrN   r6   rF   tuplecopyr   r   )wrapperr*   r+   dim_argdim_idxguardnew_argsrH   rA   keepdim_argkeepdim_idxr@   dimsdim_indicesseenrI   midxrB   level
level_strs
py_indices
new_kwargsrW   rU   rV   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%%111''(:(: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((A *)^ Cs   8BP/1Q/
P>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)
r5   )r   ru   r!   r"   r#   r$   r3   )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.Tensorr0   r~   )F)r5   r   r@   r?   rA   ra   r0   r	   )r5   r   r@   r?   rA   ra   r0   zlist[DimEntry])rf   r   r*   r   r+   r   r0   r   )NNNNN)r   r   r!   Optional[int]r"   r   r   zOptional[str]r#   Optional[bool]r$   r   r0   r   )r   N)rf   r   r{   r   r|   rd   r*   rd   r+   zOptional[dict]r0   r   )r   
__future__r   r1   typingr   r   r   rQ   torch.utils._pytreer   
_dim_entryr	   _enable_all_layersr
   _tensor_infor   collections.abcr   r   r   rC   rJ   ru   rw   r}   r   r   r   <module>r      s    #  / /  (   / $ (
$ $N"	u)t !%$("!%! 
   "  	 
      N !AA
A A 	A
 A 	Ar   