§
    ŠŠtjÁ   ã                  óÖ   — d Z ddlmZ ddlZddl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 d1d„Z G d„ d¦  «        Zd2d3d„Zd2d4d„Zd5d„Z	 	 	 	 	 d6d7d*„Z	 	 d8d9d0„ZdS ):zM
Python implementation of function wrapping functionality for functorch.dim.
é    )ÚannotationsN)ÚAnyÚTYPE_CHECKING)Útree_mapé   )ÚDimEntry)ÚEnableAllLayers)Ú
TensorInfo)ÚCallableÚtensorútorch.TensorÚreturnc                ó   — | S )z8Handle tensor conversion for torch function integration.© )r   s    úQ/var/www/html/CA-Chatbot/venv/lib/python3.11/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dS )ÚWrappedOperatorzP
    This class wraps PyTorch operations to support first-class dimensions.
    ÚdimÚorigr   Úwrapper_implementationÚdim_nameÚstrc                ó   — || _         || _        t          |dd¦  «        | _        t          |dd ¦  «        | _        || _        d| _        d| _        d| _        d| _	        d| _
        | j        r | j        r| j        › d| j        › d	�| _        d S d S d S )
NÚ__name__Ú Ú__doc__Fr   r   Tz
Argument 'z5' can be either an integer or a torchdim.Dim object.
)r   r   ÚgetattrÚnameÚdocr   Úis_pointwiseÚ
dim_offsetÚkeepdim_offsetÚ
single_dimÚreduce)Úselfr   r   r   s       r   Ú__init__zWrappedOperator.__init__    s´   € ð ˆŒ	Ø&<ˆÔ#Ý˜D *¨bÑ1Ô1ˆŒ	Ý˜4 ¨DÑ1Ô1ˆŒØ ˆŒà!ˆÔØˆŒØˆÔØˆŒØˆŒð Œ8ð 	v˜œð 	vØœ(ÐuÐu°´ÐuÐuÐuˆDŒHˆHˆHð	vð 	vð 	vð 	vr   r   c                óf   ‡ — d	ˆ fd„}t          j        |‰ j        dd¬¦  «         ‰ j        |_        |S )
z@Create a wrapped function that calls our wrapper implementation.Úargsr   Úkwargsr   c                 ó&   •—  ‰j         ‰g| ¢R i |¤ŽS )N)r   )r*   r+   r'   s     €r   Úwrapped_funcz.WrappedOperator.function.<locals>.wrapped_func6   s&   ø€ Ø.�4Ô.¨tÐE°dÐEÐEÐE¸fÐEÐEÐEr   )r   r   )ÚassignedÚupdated)r*   r   r+   r   r   r   )Ú	functoolsÚupdate_wrapperr   r!   r   )r'   r-   s   ` r   ÚfunctionzWrappedOperator.function3   s`   ø€ ð	Fð 	Fð 	Fð 	Fð 	Fð 	Fõ 	Ô Ø˜$œ)¨mÀRð	
ñ 	
ô 	
ð 	
ð  $œxˆÔàÐr   N)r   )r   r   r   r   r   r   )r   r   )r   Ú
__module__Ú__qualname__r   r(   r2   r   r   r   r   r      sW   € € € € € ðð ð
 QVðvð vð vð vð vð&ð ð ð ð ð r   r   Fr   r   ÚndimÚintÚkeepdimÚboolr   c                óø   — ddl m} t          | |¦  «        r |rt          d¦  «        ‚t	          | ¦  «        S t          | t
          ¦  «        r"| }|dk    r||z  }|dk    °t	          |¦  «        S t	          ¦   «         S )z:Convert single dimension specification to DimEntry object.r   )ÚDimz8cannot preserve first-class dimensions with keepdim=Truer   )r   r:   Ú
isinstanceÚ
ValueErrorr   r6   )r   r5   r7   r:   Úis        r   Ú	_wrap_dimr>   B   s”   € àÐÐÐÐÐå�#�sÑÔð 
Øð 	YÝÐWÑXÔXÐXÝ˜‰}Œ}ÐÝ	�C�Ñ	Ô	ð ØˆØ�1ŠfˆfØ�‰IˆAð �1Šfˆfå˜‰{Œ{Ðå‰zŒzÐr   úlist[DimEntry]c                óÒ   — t          | ||¦  «        }g }|                     ¦   «         s|                     |¦  «         n)| D ]&}|                     t          |||¦  «        ¦  «         Œ'|S )z<Convert dimension specification to list of DimEntry objects.)r>   Úis_noneÚappend)r   r5   r7   ÚdeÚresultÚds         r   Ú
_wrap_dimsrF   S   sr   € å	�3˜˜gÑ	&Ô	&€BØ€FØ�:Š:‰<Œ<ð 7Ø�Š�bÑÔÐÐàð 	7ð 	7ˆAØ�MŠM�) A t¨WÑ5Ô5Ñ6Ô6Ð6Ð6Ø€Mr   Úwrapperr*   r+   c                ó  ‡‡— |st          d¦  «        ‚|                     | 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	        ¦  «         t          |¦  «        }t          ‰j
        ¦  «        |d<    | j        |i |¤Ž}|                     |‰j        ¦  «        cddd¦  «         S # 1 swxY w Y   t          j        |d         ¦  «        Š‰s | j        |i |¤ŽS d}| j        re|                     d	¦  «        }	|	€=| j        t	          |¦  «        k     r%| j        dz   }
|
t	          |¦  «        k     r||
         }	|	�t'          |	¦  «        }‰                     ¦   «         }t+          |||¦  «        }g }dgt	          ‰j	        ¦  «        z  }|D ]¯}d}t-          ‰j	        ¦  «        D ]\  }}||k    r|} nŒ|€kt-          ‰j	        ¦  «        D ].\  }}t/          |d
¦  «        r|                     |¦  «        r|} nŒ/|€&d„ ‰j	        D ¦   «         }t          d|› d|› �¦  «        ‚d||<   |                     |¦  «         Œ°g Š| j        r:|s8t-          ‰j	        ¦  «        D ]"\  }}||         s‰                     |¦  «         Œ#n‰j	        dd…         Št	          |¦  «        dk    r	|d         }nt5          |¦  «        }t          |¦  «        }|                     ¦   «         }‰j        €t          d¦  «        ‚t          ‰j        ¦  «        |d<   | j        |v r||| j        <   n1| j        dz   }|t	          |¦  «        k     rt          |¦  «        }|||<    | j        |i |¤Ž}dˆˆfd„}t;          ||¦  «        S )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-Noner7   Úmatchesc                ó,   — g | ]}t          |¦  «        ‘ŒS r   )r   )Ú.0Úlevels     r   ú
<listcomp>z&patched_dim_method.<locals>.<listcomp>¤   s   € ÐBÐBÐB¨U�c %™jœjÐBÐBÐBr   zTensor with dimensions z does not contain zExpected tensor to be non-NoneÚobjr   r   c                ó€   •— t          | t          j        ¦  «        r"ddlm} |                     | ‰‰j        ¦  «        S | S )Nr   )ÚTensor)r;   ÚtorchrR   r   Úfrom_positionalÚ
has_device)rP   rR   ÚinfoÚ
new_levelss     €€r   Úwrap_resultz'patched_dim_method.<locals>.wrap_resultÏ   sI   ø€ Ý�c�5œ<Ñ(Ô(ð 	LØ Ð Ð Ð Ð Ð à×)Ò)¨#¨z¸4¼?ÑKÔKÐKØˆ
r   )rP   r   r   r   )r<   Úgetr   r#   Úlenr
   Úcreater   r	   ÚlevelsÚbatchedtensorÚAssertionErrorÚinplace_update_layersÚlistr   Úfrom_batchedrU   r&   r$   r8   r5   rF   Ú	enumerateÚhasattrrK   rB   ÚtupleÚcopyr   r   )rG   r*   r+   Údim_argÚdim_idxÚguardÚnew_argsrD   r7   Úkeepdim_argÚkeepdim_idxr5   ÚdimsÚdim_indicesÚseenrE   Úmidxr=   rN   Ú
level_strsÚ
py_indicesÚ
new_kwargsrX   rV   rW   s                          @@r   Úpatched_dim_methodrs   _   sû  øø€ ð ð BÝÐ@ÑAÔAÐAð �jŠj˜Ô)Ñ*Ô*€GØ€˜7Ô-µ°D±	´	Ò9Ð9àÔ$ qÑ(ˆØ•S˜‘Y”YÒÐØ˜7”mˆGð €ÝÔ   a¤¸ÈeÐTÑTÔTˆØð 	1Ø�7”< Ð0¨Ð0Ð0Ð0å˜Tœ[Ñ)Ô)ð 	?¨UØÔ!Ð)Ý$Ð%LÑMÔMÐMØ×'Ò'¨Ô(:¸D¼KÑHÔHÐHÝ˜D‘z”zˆHÝ,¨TÔ-?Ñ@Ô@ˆH�Q‰KØ!�W”\ 8Ð6¨vÐ6Ð6ˆFØ×%Ò% f¨d¬oÑ>Ô>ð	?ð 	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?õ Ô˜T !œWÑ%Ô%€DØð -ØˆwŒ|˜TÐ, VÐ,Ð,Ð,ð €GØ„~ð (Ø—j’j Ñ+Ô+ˆØÐ 7Ô#9½CÀ¹I¼IÒ#EÐ#EØ!Ô0°1Ñ4ˆKØ�S ™YœYÒ&Ð&Ø" ;Ô/�ØÐ"Ý˜;Ñ'Ô'ˆGð �9Š9‰;Œ;€DÝ�g˜t WÑ-Ô-€Dð  €KØˆ7•S˜œÑ%Ô%Ñ%€Dàð !ð !ˆØˆÝ! $¤+Ñ.Ô.ð 	ð 	‰HˆAˆuØ˜ŠzˆzØ�Ø�ð ð ˆ<å% d¤kÑ2Ô2ð ð ‘��5Ý˜5 )Ñ,Ô,ð °·²¸qÑ1AÔ1Að Ø�DØ�Eøàˆ|ØBÐB°d´kÐBÑBÔB�
Ý ØO¨jÐOÐOÈAÐOÐOñô ð ð ˆˆT‰
Ø×Ò˜4Ñ Ô Ð Ð ð €JØ„~ð $˜gð $Ý! $¤+Ñ.Ô.ð 	)ð 	)‰HˆAˆuØ˜”7ð )Ø×!Ò! %Ñ(Ô(Ð(øð	)ð ”[   ”^ˆ
õ ˆ;ÑÔ˜1ÒÐØ% aœ.ˆ
ˆ
å˜;Ñ'Ô'ˆ
õ �D‰zŒz€HØ—’‘”€JØ„{ÐÝÐ=Ñ>Ô>Ð>Ý$ T¤[Ñ1Ô1€HˆQ�Kð Ô˜:Ð%Ð%Ø'1ˆ
�7Ô#Ñ$Ð$àÔ$ qÑ(ˆØ•S˜‘]”]Ò"Ð"Ý˜H‘~”~ˆHØ *ˆH�WÑð ˆWŒ\˜8Ð2 zÐ2Ð2€Fðð ð ð ð ð ð õ �K Ñ(Ô(Ð(s   Â/BE Å EÅEr   r   r#   ú
int | Noner$   r   ú
str | Noner%   úbool | Noner&   c                ó¦   — |pd}t          | t          |¦  «        }|�||_        |�||_        |�||_        |�||_        |                     ¦   «         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)
    r   )r   rs   r#   r$   r%   r&   r2   )r   r#   r$   r   r%   r&   rG   s          r   Ú_wraprx   Ù   si   € ð& Ð ˜5€Hå˜dÕ$6¸ÑAÔA€GàÐØ'ˆÔØÐ!Ø!/ˆÔØÐØ'ˆÔØÐØˆŒà×ÒÑÔÐr   r   ÚfuncÚtypesrd   údict | Nonec                óF   — |€i }ddl m} |                     ||||¦  «        S )z@
    Handle __torch_function__ calls for wrapped operators.
    Nr   )Ú_Tensor)r   r}   Ú__torch_function__)rG   ry   rz   r*   r+   r}   s         r   Úcall_torch_functionr   ü   s>   € ð €~Øˆð ÐÐÐÐÐð ×%Ò% d¨E°4¸Ñ@Ô@Ð@r   )r   r   r   r   )F)r   r   r5   r6   r7   r8   r   r   )r   r   r5   r6   r7   r8   r   r?   )rG   r   r*   r   r+   r   r   r   )NNNNN)r   r   r#   rt   r$   rt   r   ru   r%   rv   r&   rv   r   r   )r   N)rG   r   ry   r   rz   rd   r*   rd   r+   r{   r   r   )r   Ú
__future__r   r0   Útypingr   r   rS   Útorch.utils._pytreer   Ú
_dim_entryr   Ú_enable_all_layersr	   Ú_tensor_infor
   Úcollections.abcr   r   r   r>   rF   rs   rx   r   r   r   r   ú<module>r‡      s™  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à €€€Ø (Ð (Ð (Ð (Ð (Ð (à  Ð  Ð  Ð  Ð  Ð  Ø /Ð /Ð /Ð /Ð /Ð /Ø $Ð $Ð $Ð $Ð $Ð $ð ð )Ø(Ð(Ð(Ð(Ð(Ð(ðð ð ð ð
$ð $ð $ð $ð $ñ $ô $ð $ðNð ð ð ð ð"	ð 	ð 	ð 	ð 	ðw)ð w)ð w)ð w)ðx "Ø!%ØØ"Øð ð  ð  ð  ð  ðN ØðAð Að Að Að Að Að Ar   