Ë
    )êñiÝ   ã                  ó  — d Z ddlmZ ddlZddlmZmZmZ ddlZddl	m
Z
 ddlmZ ddlmZ dd	lmZ erdd
lmZ dd„Z G d„ d«      Zddd„Zddd„Zdd„Z	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zy)zM
Python implementation of function wrapping functionality for functorch.dim.
é    )ÚannotationsN)ÚAnyÚOptionalÚTYPE_CHECKING)Útree_mapé   )ÚDimEntry)ÚEnableAllLayers)Ú
TensorInfo)ÚCallablec                ó   — | S )z8Handle tensor conversion for torch function integration.© )Útensors    úU/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/functorch/dim/_wrap.pyÚhandle_from_tensorr      s   € à€Mó    c                  ó.   — e Zd ZdZ	 d	 	 	 	 	 dd„Zdd„Zy)ÚWrappedOperatorzP
    This class wraps PyTorch operations to support first-class dimensions.
    c                ó2  — || _         || _        t        |dd«      | _        t        |dd «      | _        || _        d| _        d| _        d| _        d| _	        d| _
        | j                  r/| j
                  r"| j                  › d| j
                  › d	�| _        y y y )
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__zWrappedOperator.__init__    s’   € ð ˆŒ	Ø&<ˆÔ#Ü˜D *¨bÓ1ˆŒ	Ü˜4 ¨DÓ1ˆŒØ ˆŒà!ˆÔØˆŒØˆÔØˆŒØˆŒð �8Š8˜ŸšØŸ(™(˜ <°·±¨Ð>tÐuˆD�Hð &ˆ8r   c                ó|   ‡ — dˆ fd„}t        j                  |‰ j                  dd¬«       ‰ j                  |_        |S )z@Create a wrapped function that calls our wrapper implementation.c                 ó0   •—  ‰j                   ‰g| ¢­i |¤ŽS )N)r   )ÚargsÚkwargsr$   s     €r   Úwrapped_funcz.WrappedOperator.function.<locals>.wrapped_func6   s    ø€ Ø.�4×.Ñ.¨tÐE°dÒE¸fÑEÐEr   )r   r   )ÚassignedÚupdated)r(   r   r)   r   Úreturnr   )Ú	functoolsÚupdate_wrapperr   r   r   )r$   r*   s   ` r   ÚfunctionzWrappedOperator.function3   s:   ø€ õ	Fô 	× Ñ Ø˜$Ÿ)™)¨mÀRõ	
ð  $Ÿx™xˆÔàÐr   N)Údim)r   r   r   r   r   Ústr)r-   r   )r   Ú
__module__Ú__qualname__r   r%   r0   r   r   r   r   r      s4   „ ñð
 QVðvØðvØ6>ðvØJMóvô&r   r   c                óÄ   — ddl m} t        | |«      r|rt        d«      ‚t	        | «      S t        | t
        «      r| }|dk\  r||z  }|dk\  rŒt	        |«      S t	        «       S )z:Convert single dimension specification to DimEntry object.r   )ÚDimz8cannot preserve first-class dimensions with keepdim=Truer   )r   r6   Ú
isinstanceÚ
ValueErrorr	   Úint)r1   ÚndimÚkeepdimr6   Úis        r   Ú	_wrap_dimr=   B   sb   € åä�#�sÔÙÜÐWÓXÐXÜ˜‹}ÐÜ	�CœÔ	ØˆØ�1ŠfØ�‰IˆAð �1‹fä˜‹{Ðä‹zÐr   c                ó°   — t        | ||«      }g }|j                  «       s|j                  |«       |S | D ]  }|j                  t        |||«      «       Œ  |S )z<Convert dimension specification to list of DimEntry objects.)r=   Úis_noneÚappend)r1   r:   r;   ÚdeÚresultÚds         r   Ú
_wrap_dimsrD   S   s\   € ä	�3˜˜gÓ	&€BØ€FØ�:‰:Œ<Ø�‰�bÔð €Mð ò 	7ˆAØ�M‰Mœ) A t¨WÓ5Õ6ð	7à€Mr   c                ó  ‡‡— |st        d«      ‚|j                  | j                  «      }|€:| j                  t	        |«      k  r"| j                  dz   }|t	        |«      k  r||   }|€Üt        j                  |d   dd¬«      Š‰s | j                  |i |¤ŽS t        ‰j                  «      5 }‰j                  €t        d«      ‚|j                  ‰j                  ‰j                  «       t        |«      }t        ‰j                  «      |d<    | j                  |i |¤Ž}|j                  |‰j                   «      cddd«       S t        j                  |d   «      Š‰s | j                  |i |¤ŽS d}| j"                  rZ|j                  d	«      }	|	€:| j$                  t	        |«      k  r"| j$                  dz   }
|
t	        |«      k  r||
   }	|	�t'        |	«      }‰j)                  «       }t+        |||«      }g }dgt	        ‰j                  «      z  }|D ]¶  }d}t-        ‰j                  «      D ]  \  }}||k(  sŒ|} n |€tt-        ‰j                  «      D ]'  \  }}t/        |d
«      sŒ|j1                  |«      sŒ%|} n |€3‰j                  D �cg c]  }t3        |«      ‘Œ }}t        d|› d|› �«      ‚d||<   |j5                  |«       Œ¸ g Š| j"                  r7|s5t-        ‰j                  «      D ]  \  }}||   rŒ‰j5                  |«       Œ n‰j                  dd Št	        |«      dk(  r|d   }nt7        |«      }t        |«      }|j9                  «       }‰j:                  €t        d«      ‚t        ‰j:                  «      |d<   | j                  |v r||| j                  <   n-| j                  dz   }|t	        |«      k  rt        |«      }|||<    | j                  |i |¤Ž}dˆˆfd„}t=        ||«      S # 1 sw Y   �Œ¾xY wc c}w )zJ
    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                ó‚   •— t        | t        j                  «      r#ddlm} |j	                  | ‰‰j
                  «      S | S )Nr   )ÚTensor)r7   ÚtorchrJ   r   Úfrom_positionalÚ
has_device)ÚobjrJ   ÚinfoÚ
new_levelss     €€r   Úwrap_resultz'patched_dim_method.<locals>.wrap_resultÏ   s2   ø€ Ü�cœ5Ÿ<™<Ô(Ý à×)Ñ)¨#¨z¸4¿?¹?ÓKÐKØˆ
r   )rN   r   r-   r   )r8   Úgetr   r    Úlenr   Úcreater   r
   ÚlevelsÚbatchedtensorÚAssertionErrorÚinplace_update_layersÚlistr   Úfrom_batchedrM   r#   r!   Úboolr:   rD   Ú	enumerateÚhasattrrH   r2   r@   ÚtupleÚcopyr   r   )Úwrapperr(   r)   Údim_argÚdim_idxÚguardÚnew_argsrB   r;   Úkeepdim_argÚkeepdim_idxr:   ÚdimsÚdim_indicesÚseenrC   Úmidxr<   ÚlevelÚ
level_strsÚ
py_indicesÚ
new_kwargsrQ   rO   rP   s                          @@r   Úpatched_dim_methodro   _   s  ù€ ñ ÜÐ@ÓAÐAð �j‰j˜×)Ñ)Ó*€GØ€˜7×-Ñ-´°D³	Ò9à×$Ñ$ qÑ(ˆØ”S˜“YÒØ˜7‘mˆGð €Ü× Ñ   a¡¸ÈeÔTˆÙØ�7—<‘< Ð0¨Ñ0Ð0ä˜TŸ[™[Ó)ð 	?¨UØ×!Ñ!Ð)Ü$Ð%LÓMÐMØ×'Ñ'¨×(:Ñ(:¸D¿K¹KÔHÜ˜D“zˆHÜ,¨T×-?Ñ-?Ó@ˆH�Q‰KØ!�W—\‘\ 8Ð6¨vÑ6ˆFØ×%Ñ% f¨d¯o©oÓ>÷	?ñ 	?ô ×Ñ˜T !™WÓ%€DÙØˆw�|‰|˜TÐ, VÑ,Ð,ð €GØ‡~‚~Ø—j‘j Ó+ˆØÐ 7×#9Ñ#9¼CÀ»IÒ#EØ!×0Ñ0°1Ñ4ˆKØœS ›YÒ&Ø" ;Ñ/�ØÐ"Ü˜;Ó'ˆGð �9‰9‹;€DÜ�g˜t WÓ-€Dð  €KØˆ7”S˜Ÿ™Ó%Ñ%€Dàò !ˆØˆÜ! $§+¡+Ó.ò 	‰HˆAˆuØ˜‹zØ�Ùð	ð
 ˆ<ä% d§k¡kÓ2ò ‘��5Ü˜5 )Õ,°·±¸qÕ1AØ�DÙðð
 ˆ|Ø6:·k±kÖB¨Uœc %�jÐB�
ÐBÜ Ø-¨j¨\Ð9KÈAÈ3ÐOóð ð ˆˆT‰
Ø×Ñ˜4Õ ð+!ð0 €JØ‡~‚~™gÜ! $§+¡+Ó.ò 	)‰HˆAˆuØ˜“7Ø×!Ñ! %Õ(ñ	)ð —[‘[¡�^ˆ
ô ˆ;Ó˜1ÒØ% a™.‰
ä˜;Ó'ˆ
ô �D‹z€HØ—‘“€JØ‡{�{ÐÜÐ=Ó>Ð>Ü$ T§[¡[Ó1€HˆQ�Kð ×Ñ˜:Ñ%Ø'1ˆ
�7×#Ñ#Ò$à×$Ñ$ qÑ(ˆØ”S˜“]Ò"Ü˜H“~ˆHØ *ˆH�WÑð ˆW�\‰\˜8Ð2 zÑ2€Föô �K Ó(Ð(÷E	?ñ 	?üò` Cs   Â-BO9ÊPÏ9Pc                ó˜   — |xs d}t        | t        |«      }|�||_        |�||_        |�||_        |�||_        |j                  «       S )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)
    r1   )r   ro   r    r!   r"   r#   r0   )r   r    r!   r   r"   r#   r`   s          r   Ú_wraprq   Ù   sc   € ð& Ò ˜5€Hä˜dÔ$6¸ÓA€GàÐØ'ˆÔØÐ!Ø!/ˆÔØÐØ'ˆÔØÐØˆŒà×ÑÓÐr   c                ó>   — |€i }ddl m} |j                  ||||«      S )z@
    Handle __torch_function__ calls for wrapped operators.
    r   )Ú_Tensor)r   rs   Ú__torch_function__)r`   ÚfuncÚtypesr(   r)   rs   s         r   Úcall_torch_functionrw   ü   s,   € ð €~Øˆõ ð ×%Ñ% d¨E°4¸Ó@Ð@r   )r   útorch.Tensorr-   rx   )F)r1   r   r:   r9   r;   r[   r-   r	   )r1   r   r:   r9   r;   r[   r-   zlist[DimEntry])r`   r   r(   r   r)   r   r-   r   )NNNNN)r   r   r    úOptional[int]r!   ry   r   zOptional[str]r"   úOptional[bool]r#   rz   r-   r   )r   N)r`   r   ru   r   rv   r^   r(   r^   r)   zOptional[dict]r-   r   )r   Ú
__future__r   r.   Útypingr   r   r   rK   Útorch.utils._pytreer   Ú
_dim_entryr	   Ú_enable_all_layersr
   Ú_tensor_infor   Úcollections.abcr   r   r   r=   rD   ro   rq   rw   r   r   r   ú<module>r‚      sõ   ðñõ #ã ß /Ñ /ã Ý (å  Ý /Ý $ñ Ý(ó÷
$ñ $ôNô"	ów)ðx !%Ø$(Ø"Ø!%Ø!ð Ø
ð àð ð "ð ð ð	 ð
 ð ð ð ð ó ðN Ø!ðAØðAà
ðAð ðAð ð	Að
 ðAð 	ôAr   