§
    ŠŠtjQ`  ã                   ó\  — d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlZd dlmc mZ d dlZd dlmZmZ d dlmZ e j         G d„ d¦  «        ¦   «         Z G d„ d	¦  «        Zd
edefd„Zdedeeef         fd„Zdedefd„Zdedefd„Zdedefd„Z dedefd„Z!ddœdededefd„Z"dedefd„Z#dedefd„Z$defd„Z%d„ Z&dej'        deedf         d e(eef         deeej)        ef                  fd!„Z*d"„ Z+dedefd#„Z,defd$„Z-defd%„Z.d&„ Z/dej'        fd'„Z0dej'        fd(„Z1dej'        defd)„Z2dej'        dedz  fd*„Z3	 dBdee         d e(eef         d,edeej4                 fd-„Z5d.„ fd/„Z6d0„ fd1„Z7 G d2„ d3¦  «        Z8d4ej4        dej4        fd5„Z9dej:        j        defd6„Z;dej'        dee<e         e<e         f         fd7„Z=ej>        j?        ej>        j@        ej>        jA        ej>        jB        gZCe
d8d9œd:ed;e	d8         dej>        fd<„¦   «         ZDe
d:ed;e	d         dej>        dz  fd=„¦   «         ZDd8d9œd>„ZDejE        ejF        ejG        ejH        ejI        ejJ        ejK        ejL        ejM        ejN        ejO        hZPddd8d?œdedeedf         dz  d e(eef         dz  d@edef
dA„ZQdS )Cé    N)ÚCallableÚIterableÚIterator)ÚAnyÚLiteralÚoverload)Ú_CÚ_utils_internal)Ú
OpOverloadc                   ó.   — e Zd ZU dZeed<   eed<   d„ ZdS )ÚKernelz$Models a (function, source location)ÚfuncÚsourcec                 ó   —  | j         |i |¤ŽS ©N)r   )ÚselfÚargsÚkwargss      úR/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_library/utils.pyÚ__call__zKernel.__call__   s   € ØˆtŒy˜$Ð) &Ð)Ð)Ð)ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__Ústrr   © r   r   r   r      s=   € € € € € € à.Ð.à
€N€N�NØ€K€K�Kð*ð *ð *ð *ð *r   r   c                   ó&   — e Zd ZdZdefd„Zdd„ZdS )ÚRegistrationHandlez2Does something when someone calls .destroy() on itÚ
on_destroyc                 ó   — || _         d S r   ©Ú_on_destroy)r   r!   s     r   Ú__init__zRegistrationHandle.__init__   s   € Ø%ˆÔÐÐr   ÚreturnNc                 ó.   — |                       ¦   «          d S r   r#   )r   s    r   ÚdestroyzRegistrationHandle.destroy    s   € Ø×ÒÑÔÐÐÐr   )r&   N)r   r   r   r   r   r%   r(   r   r   r   r    r       sI   € € € € € Ø<Ð<ð& 8ð &ð &ð &ð &ðð ð ð ð ð r   r    Ú
stacklevelr&   c                 ót   — t          j        t          j        | ¦  «        ¦  «        }|j        › d|j        › �}|S )zÃGet a string that represents the caller.

    Example: "/path/to/foo.py:42"

    Use stacklevel=1 to get the caller's source
    Use stacklevel=2 to get the caller's caller's source
    etc.
    ú:)ÚinspectÚgetframeinfoÚsysÚ	_getframeÚfilenameÚlineno)r)   Úframer   s      r   Ú
get_sourcer3   $   s:   € õ Ô ¥¤¨zÑ!:Ô!:Ñ;Ô;€EØ”Ð/Ð/ ¤Ð/Ð/€FØ€Mr   Úqualnamec                 ó˜   — |                       d¦  «        }t          |¦  «        dk    rt          d| › d�¦  «        ‚|d         |d         fS )Nz::é   zAExpected `qualname` to be of the form "namespace::name", but got zf. The qualname passed to the torch.library APIs must consist of a namespace and a name, e.g. aten::sinr   é   )ÚsplitÚlenÚ
ValueError)r4   Úsplitss     r   Úparse_namespacer<   2   sb   € Ø�^Š^˜DÑ!Ô!€FÝ
ˆ6�{„{�aÒÐÝð9Ø*2ð9ð 9ð 9ñ
ô 
ð 	
ð �!Œ9�f˜Q”iÐÐr   c                 óØ   — t          | ¦  «        \  }}d|v r|                     d¦  «        \  }}nd}t          t          j        |¦  «        }t          ||¦  «        }t          ||¦  «        S )Nú.Údefault)r<   r8   ÚgetattrÚtorchÚops)r4   Ú	namespaceÚnamer   ÚnsÚpackets         r   Ú	lookup_oprG   >   sf   € Ý% hÑ/Ô/�O€IˆtØ
ˆd€{€{ØŸš C™œ‰ˆˆhˆhàˆÝ	•”˜IÑ	&Ô	&€BÝ�R˜ÑÔ€FÝ�6˜8Ñ$Ô$Ð$r   Úopc                 ó|   — t          | t          ¦  «        st          dt          | ¦  «        › �¦  «        ‚| j        dv S )Núop must be OpOverload, got >   ÚatenÚprimÚprims)Ú
isinstancer   ÚAssertionErrorÚtyperC   ©rH   s    r   Ú
is_builtinrR   I   s@   € Ý�b�*Ñ%Ô%ð GÝÐE½4À¹8¼8ÐEÐEÑFÔFÐFØŒ<Ð4Ð4Ð4r   c                 ó2   — t           j        j        | j        v S )z�Returns True if the operator has "out" semantics: its mutable arguments
    are write-only output buffers that are not read from.)rA   ÚTagÚoutÚtagsrQ   s    r   Úis_outrW   O   s   € õ Œ9Œ=˜BœGÐ#Ð#r   c                 ó2   — t           j        j        | j        v S )zpReturns True if the operator has inplace semantics: it mutates its first
    positional argument and returns it.)rA   rT   ÚinplacerV   rQ   s    r   Ú
is_inplacerZ   U   s   € õ Œ9Ô ¤Ð'Ð'r   F)Úallow_valid_viewÚschemar[   c                ó6  ‡— ˆfd„}t          | t          j        j        ¦  «        r || ¦  «        S ddlm} t          | t
          ¦  «        r|                     | ¦  «        } t          | |¦  «        st          dt          | ¦  «        › �¦  «        ‚ || ¦  «        S )af  Check if the schema is functional.

    An operator is functional if:
    - it does not mutate any of its inputs
    - If no view are allowed
        - it does not return a view on any of its inputs
    - If valid views are allowed
        - it is not a view or a view with a single input Tensor and single output Tensor
    - it has at least one return
    c                 ó�  •— | j         rdS | j        }t          |¦  «        dk    ot          d„ |D ¦   «         ¦  «        }d}d}t	          | t
          j        ¦  «        r]| j        D ]&}t	          |j        t
          j	        ¦  «        r|dz  }Œ'| j        D ]&}t	          |j        t
          j	        ¦  «        r|dz  }Œ'ntt	          | t          j        j        ¦  «        rU| j        j        D ] }|j                             ¦   «         r|dz  }Œ!| j        D ] }|j                             ¦   «         r|dz  }Œ!|r‰	o|dk    o|dk    S | j        sdS dS )NFr   c              3   óB   K  — | ]}|j         d uo|j         j         V — Œd S r   )Ú
alias_infoÚis_write)Ú.0Úrs     r   ú	<genexpr>z>is_functional_schema.<locals>.is_functional.<locals>.<genexpr>k   sG   è è € ð 5
ð 5
ØGHˆAŒL Ð$ÐB¨Q¬\Ô-BÐ)Bð5
ð 5
ð 5
ð 5
ð 5
ð 5
r   r7   T)Ú
is_mutableÚreturnsr9   ÚanyrN   rA   ÚFunctionSchemaÚ	argumentsrP   Ú
TensorTypeÚtorchgenÚmodelÚflat_non_outÚis_tensor_like)
r\   ÚretsÚis_non_mutating_viewÚnum_tensor_inputsÚnum_tensor_outputsÚargÚretÚargumentÚret_argr[   s
            €r   Úis_functionalz+is_functional_schema.<locals>.is_functionalg   s©  ø€ ØÔð 	Ø�5ØŒ~ˆÝ" 4™yœy¨1š}ð  
µð 5
ð 5
ØLPð5
ñ 5
ô 5
ñ 2
ô 2
Ðð ÐØÐå�f�eÔ2Ñ3Ô3ð 	,ØÔ'ð +ð +�Ý˜cœh­Ô(8Ñ9Ô9ð +Ø%¨Ñ*Ð%øà”~ð ,ð ,�Ý˜cœh­Ô(8Ñ9Ô9ð ,Ø&¨!Ñ+Ð&øð,õ ˜¥¤Ô =Ñ>Ô>ð 	,Ø"Ô,Ô9ð +ð +�Ø”=×/Ò/Ñ1Ô1ð +Ø%¨Ñ*Ð%øà!œ>ð ,ð ,�Ø”<×.Ò.Ñ0Ô0ð ,Ø&¨!Ñ+Ð&øàð 	Ø#ð Ø! QÒ&ÐBÐ+=ÀÒ+Bðð Œ~ð 	Ø�5Øˆtr   r   )rh   z#schema must be FunctionSchema, got )	rN   rA   r	   rh   Útorchgen.modelr   ÚparserO   rP   )r\   r[   rw   rh   s    `  r   Úis_functional_schemarz   [   s¿   ø€ ð"ð "ð "ð "ð "õH �&�%œ(Ô1Ñ2Ô2ð %Øˆ}˜VÑ$Ô$Ð$ð .Ð-Ð-Ð-Ð-Ð-å�&�#ÑÔð .Ø×%Ò% fÑ-Ô-ˆÝ�f˜nÑ-Ô-ð SÝÐQÅ4ÈÁ<Ä<ÐQÐQÑRÔRÐRØˆ=˜Ñ Ô Ð r   Útypc           	      ó2  — | t          j        t           j                             ¦   «         ¦  «        k    pã| t          j        t          j        t           j                             ¦   «         ¦  «        ¦  «        k    p�| t          j        t          j        t           j                             ¦   «         ¦  «        ¦  «        k    pW| t          j        t          j        t          j        t           j                             ¦   «         ¦  «        ¦  «        ¦  «        k    S r   )r	   ÚListTyperj   ÚgetÚOptionalType©r{   s    r   Úis_tensorlist_like_typer�   ™   sÃ   € à�rŒ{�2œ=×,Ò,Ñ.Ô.Ñ/Ô/Ò/ð 	UØ•"”+�bœo­b¬m×.?Ò.?Ñ.AÔ.AÑBÔBÑCÔCÒCð	Uà•"”/¥"¤+­b¬m×.?Ò.?Ñ.AÔ.AÑ"BÔ"BÑCÔCÒCð	Uð •"”/¥"¤+­b¬o½b¼m×>OÒ>OÑ>QÔ>QÑ.RÔ.RÑ"SÔ"SÑTÔTÒTð	r   c                 ó®   — | t           j                             ¦   «         k    p3| t          j        t           j                             ¦   «         ¦  «        k    S r   )r	   rj   r~   r   r€   s    r   Úis_tensor_like_typerƒ   £   s=   € Ø•"”-×#Ò#Ñ%Ô%Ò%ÐT¨µ´ÅÄ×@QÒ@QÑ@SÔ@SÑ0TÔ0TÒ)TÐTr   c                 óT  — | j         dk    rdS | j        }t          |j        ¦  «        dk    rdS |j        d         j        €dS |j        d         j        j        }t          |¦  «        dk    rdS t          t          |¦  «        ¦  «        }t          |j        ¦  «        dk     rdS |j        d         }|j        €dS |j        j	        sdS |j        j        }t          |¦  «        dk    rdS |t          t          |¦  «        ¦  «        k    rdS |j        dd…         D ]}|j        � dS ŒdS )aN  Check if an op is an inplace aten op, i.e. it mutates and returns the first arg.

    TODO: torchgen/model.py's FunctionSchema.parse is the source of truth for this,
    but not all PyTorch builds have torchgen (due to the yaml dependency being weird).
    Figure this out.

    Example: add_(Tensor(a!) x, Tensor y) -> Tensor(a)
    rK   Fr7   r   NT)
rC   Ú_schemar9   rf   r`   Ú	after_setÚnextÚiterri   ra   )rH   r\   Ú	alias_setÚlocÚ	first_argrs   s         r   Úmutates_and_returns_first_argrŒ   §   sC  € ð 
„|�vÒÐØˆuØŒZ€FÝ
ˆ6Œ>ÑÔ˜aÒÐØˆuØ„~�aÔÔ#Ð+ØˆuØ”˜qÔ!Ô,Ô6€IÝ
ˆ9�~„~˜ÒÐØˆuÝ
�t�I‰ŒÑ
Ô
€CÝ
ˆ6ÔÑÔ˜qÒ Ð ØˆuØÔ  Ô#€IØÔÐ#ØˆuØÔÔ(ð ØˆuØÔ$Ô.€IÝ
ˆ9�~„~˜ÒÐØˆuØ
�d•4˜	‘?”?Ñ#Ô#Ò#Ð#ØˆuØÔ   Ô#ð ð ˆØŒ>Ð%Ø�5�5ð &àˆ4r   c                 óŒ  — g }i }t          t          | j        ¦  «        ¦  «        D ]Ž}| j        |         }|j        r/|j        |v r||j                 ||j        <   Œ5|j        ||j        <   ŒE|t          |¦  «        k     r|                     ||         ¦  «         Œt|                     |j        ¦  «         Œ�t          |¦  «        |fS r   )Úranger9   ri   Ú
kwarg_onlyrD   Údefault_valueÚappendÚtuple)r\   r   r   Únew_argsÚ
new_kwargsÚiÚinfos          r   Úfill_defaultsr—   Í   sË   € Ø€HØ€JÝ•3�vÔ'Ñ(Ô(Ñ)Ô)ð 4ð 4ˆØÔ Ô"ˆØŒ?ð 		4ØŒy˜FÐ"Ð"Ø(.¨t¬yÔ(9�
˜4œ9Ñ%Ð%à(,Ô(:�
˜4œ9Ñ%Ð%à•3�t‘9”9Š}ˆ}Ø—’  Q¤Ñ(Ô(Ð(Ð(à—’ Ô 2Ñ3Ô3Ð3Ð3Ý�‰?Œ?˜JÐ&Ð&r   r   .r   c           
   #   ó&  K  — t          | j        ¦  «        t          |¦  «        t          |¦  «        z   k     rEt          dt          | j        ¦  «        › dt          |¦  «        › dt          |¦  «        › d�¦  «        ‚t          t          | j        ¦  «        ¦  «        D ]r}| j        |         }|j        r|j        |v r|||j                 fV — Œ1|t          |¦  «        k    r"|j        s|j        |v r|||j                 fV — Œf|||         fV — ŒsdS )zÒzips schema.arguments and (args, kwargs) together.

    Assumes that (args, kwargs) were the inputs to some torch._ops.OpOverload:
    that is, (args, kwargs) must be bindable to the schema (args, kwargs).
    zschema has z arguments but got z
 args and z kwargsN)r9   ri   rO   rŽ   r�   rD   )r\   r   r   r•   r–   s        r   Ú
zip_schemar™   ß   s;  è è € õ ˆ6ÔÑÔ�s 4™yœy­3¨v©;¬;Ñ6Ò6Ð6ÝØm�#˜fÔ.Ñ/Ô/ÐmÐmÅCÈÁIÄIÐmÐmÕY\Ð]cÑYdÔYdÐmÐmÐmñ
ô 
ð 	
õ •3�vÔ'Ñ(Ô(Ñ)Ô)ð ð ˆØÔ Ô"ˆØŒ?ð 	ØŒy˜FÐ"Ð"Ø˜F 4¤9Ô-Ð-Ð-Ð-Ð-ØØ•�D‘	”	Š>ˆ>Ø”?ð . t¤y°FÐ':Ð':Ø˜F 4¤9Ô-Ð-Ð-Ð-Ð-ð Ø�D˜”GˆmÐÐÐÐØ
€Fr   c                 ó  ‡— ddl m} | j        }t          |t          j        j        ¦  «        st          d¦  «        ‚d„ Šg }| j        D ]Ç}t          |t          j	        j
        t          j	        j        j
        f¦  «        r|                      ‰|¦  «        ¦  «         ŒVt          |t          j	        j        j        t          t           f¦  «        r"|                     ˆfd„|D ¦   «         ¦  «         Œ©t          dt#          |¦  «        › �¦  «        ‚ t%          j        |j        ¦  «        j        |Ž } ‰| ¦  «        }|                     |j        t!          |j                             ¦   «         ¦  «        t          |¦  «        f¦  «        S )Nr   )ÚFunctionSchemaGenzfx_node's target must be a hop.c                 óÂ   — | j                              dd ¦  «        }|€A| j        dk    rt          d| j        ›�¦  «        ‚t	          | j        j        | j        ¦  «        }|S )NÚvalÚget_attrz1node.op must be 'get_attr' when val is None, got )Úmetar~   rH   rO   r@   ÚgraphÚowning_moduleÚtarget)ÚnodeÚmeta_vals     r   Ú_collect_example_valz5hop_schema_from_fx_node.<locals>._collect_example_val  sf   € Ø”9—=’= ¨Ñ-Ô-ˆØÐØŒw˜*Ò$Ð$Ý$ØSÈÌÐSÐSñô ð õ ˜tœzÔ7¸¼ÑEÔEˆHØˆr   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )rb   Úxr¥   s     €r   ú
<listcomp>z+hop_schema_from_fx_node.<locals>.<listcomp>  s%   ø€ Ð"HÐ"HÐ"H¸qÐ#7Ð#7¸Ñ#:Ô#:Ð"HÐ"HÐ"Hr   zUnsupported arg type )Útorchgen.gen_schema_utilsr›   r¢   rN   rA   Ú_opsÚHigherOrderOperatorÚRuntimeErrorr   ÚfxÚNoder£   r‘   Úimmutable_collectionsÚimmutable_listÚlistr’   rP   r,   Ú	signaturer   ÚbindÚfrom_exampleÚ_nameri   Úitems)r£   r›   ÚhopÚexample_inputsrs   Ú
bound_argsÚexample_outputr¥   s          @r   Úhop_schema_from_fx_noder»   ü   sš  ø€ Ø;Ð;Ð;Ð;Ð;Ð;à
Œ+€CÝ�c�5œ:Ô9Ñ:Ô:ð >ÝÐ<Ñ=Ô=Ð=ðð ð ð €NØŒyð Dð DˆÝ�c�EœHœM­5¬8¬=Ô+=Ð>Ñ?Ô?ð 	DØ×!Ò!Ð"6Ð"6°sÑ";Ô";Ñ<Ô<Ð<Ð<ÝØ•%”(Ô0Ô?ÅÅuÐMñ
ô 
ð 	Dð ×!Ò!Ð"HÐ"HÐ"HÐ"HÀCÐ"HÑ"HÔ"HÑIÔIÐIÐIåÐBµt¸C±y´yÐBÐBÑCÔCÐCð *N­Ô):¸3¼<Ñ)HÔ)HÔ)MØ	ð*€Jð *Ð)¨$Ñ/Ô/€NØ×)Ò)ØŒ	•5˜Ô-×3Ò3Ñ5Ô5Ñ6Ô6½¸nÑ9MÔ9MÐ8Oñô ð r   c                 ó(  — t          | t          ¦  «        st          dt          | ¦  «        › �¦  «        ‚t	          | ¦  «        rdS | j        }t          | ¦  «        rdS t          | ¦  «        rdS |j        sdS t          |j
        ¦  «        dk    rdS dS )NrJ   FTr   )rN   r   rO   rP   rR   r…   rW   rZ   re   r9   rf   )rH   r\   s     r   Úcan_generate_trivial_fake_implr½   %  s£   € Ý�b�*Ñ%Ô%ð GÝÐE½4À¹8¼8ÐEÐEÑFÔFÐFÝ�"�~„~ð ð ˆuØŒZ€FÝˆb�z„zð àˆtÝ�"�~„~ð àˆtàÔð ØˆuÝ
ˆ6Œ>ÑÔ˜QÒÐØˆuàˆ4r   c                 óö   ‡— t          | ¦  «        rQ| j        }t          |¦  «        \  }}t          ˆfd„|D ¦   «         ¦  «        }t	          |¦  «        dk    r|d         S |S t          | ¦  «        r|d         S dS )zëGenerate the result of a trivial fake impl for the given op.

    For ops with no returns: returns None.
    For Tag.out ops: returns the out= kwargs in declaration order.
    For Tag.inplace ops: returns the first positional arg.
    c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   )rb   rD   r   s     €r   rd   z-generate_trivial_fake_impl.<locals>.<genexpr>F  s'   øè è € ÐBÐB¨$˜ œÐBÐBÐBÐBÐBÐBr   r7   r   N)rW   r…   Úmutated_args_kwargsr’   r9   rZ   )rH   r   r   r\   Ú_Úout_kwarg_namesÚout_argss     `    r   Úgenerate_trivial_fake_implrÄ   <  sŠ   ø€ õ ˆb�z„zð Ø”ˆÝ0°Ñ8Ô8Ñˆˆ?ÝÐBÐBÐBÐB°/ÐBÑBÔBÑBÔBˆÝˆx‰=Œ=˜AÒÐØ˜A”;ÐØˆÝ�"�~„~ð Ø�AŒwˆØˆ4r   c                  ó.   — t          t          dd¦  «        S )zðIf an op was defined in C++ and extended from Python using the
    torch.library APIs, returns if we require that there have been a
    m.set_python_module("mylib.ops") call from C++ that associates
    the C++ op with a python module.
    ÚREQUIRES_SET_PYTHON_MODULET)r@   r
   r   r   r   Úrequires_set_python_modulerÇ   O  s   € õ •?Ð$@À$ÑGÔGÐGr   c                 óF  — t          | t          j        j        j        ¦  «        st          dt          | ¦  «        › �¦  «        ‚t          j        j                             || 	                    ¦   «         f¦  «        \  }}d„ |D ¦   «         }|  
                    ||||¦  «        S )Nz)curr_mode must be TorchDispatchMode, got c                 óì   — g | ]q}t          |t          j        ¦  «        ¯t          j                             |¦  «                             t          j        j        j        ¦  «        ¯bt          |¦  «        ‘ŒrS r   )	rN   rA   ÚTensorr	   Ú_dispatch_keysÚhasÚDispatchKeyÚPythonrP   ©rb   Úas     r   r¨   z(handle_dispatch_mode.<locals>.<listcomp>b  sp   € ð ð ð àÝ�a�œÑ&Ô&ðõ ŒH×#Ò# AÑ&Ô&×*Ò*­5¬8Ô+?Ô+FÑGÔGð	ÝˆQ‰Œðð ð r   )rN   rA   ÚutilsÚ_python_dispatchÚTorchDispatchModerO   rP   Ú_pytreeÚtree_flattenÚvaluesÚ__torch_dispatch__)Ú	curr_modeÚop_overloadr   r   Úargs_flattenedrÁ   Úoverload_typess          r   Úhandle_dispatch_moderÜ   X  s¥   € Ý�i¥¤Ô!=Ô!OÑPÔPð 
ÝØI½¸Y¹¼ÐIÐIñ
ô 
ð 	
õ œÔ+×8Ò8¸$ÀÇÂÁÄÐ9PÑQÔQÑ€N�Að
ð àðñ ô €Nð ×'Ò'¨°^ÀTÈ6ÑRÔRÐRr   c                 ó>   — t          d„ | j        D ¦   «         ¦  «        S )Nc              3   ó$   K  — | ]}|j         V — Œd S r   )r�   rÏ   s     r   rd   z&has_kwarg_only_args.<locals>.<genexpr>n  s$   è è € Ð6Ð6 ˆqŒ|Ð6Ð6Ð6Ð6Ð6Ð6r   ©rg   ri   ©r\   s    r   Úhas_kwarg_only_argsrá   m  s"   € ÝÐ6Ð6 VÔ%5Ð6Ñ6Ô6Ñ6Ô6Ð6r   c                 ó€   — | j         D ]5}t          |j        ¦  «        st          |j        ¦  «        sŒ+|j        sŒ3 dS dS )NTF)ri   rƒ   rP   r�   r�   )r\   rÐ   s     r   Úhas_kwarg_only_tensorsrã   q  sT   € ØÔð ð ˆÝ# A¤FÑ+Ô+ð 	Õ/FÀqÄvÑ/NÔ/Nð 	ØØŒ|ð 	ØØˆtˆtØˆ5r   c                 ó>   — t          d„ | j        D ¦   «         ¦  «        S )z”
    Given a schema, returns True if the schema has a Tensor arg.
    A Tensor arg is any arg with a type annotation that might involve Tensor.
    c              3   óf   K  — | ],}t          |j        ¦  «        pt          |j        ¦  «        V — Œ-d S r   )rƒ   rP   r�   rÏ   s     r   rd   z!has_tensor_arg.<locals>.<genexpr>€  sP   è è € ð ð àõ 
˜QœVÑ	$Ô	$Ð	GÕ(?ÀÄÑ(GÔ(Gðð ð ð ð ð r   rß   rà   s    r   Úhas_tensor_argræ   {  s5   € õ
 ð ð àÔ!ðñ ô ñ ô ð r   c                 ó¢   — t          | j        ¦  «        D ]9\  }}|j        t          j                             ¦   «         u r|j        dk    r|c S Œ:dS )zx
    Given a schema, returns the id of the `device: torch.device` argument.
    If it does not exist, returns None.
    ÚdeviceN)Ú	enumerateri   rP   r	   ÚDeviceObjTyper~   rD   )r\   Úindexrs   s      r   Úget_device_arg_indexrì   †  sY   € õ
   Ô 0Ñ1Ô1ð ð ‰
ˆˆsØŒ8•rÔ'×+Ò+Ñ-Ô-Ð-Ð-°#´(¸hÒ2FÐ2FØˆLˆLˆLøØˆ4r   r7   Úallowed_nestingc              #   ó’   ‡K  — ˆfd„}| D ]} ||¦  «        E d {V —† Œ|                      ¦   «         D ]} ||¦  «        E d {V —† Œd S )Nc              3   óæ   •K  — t          | t          j        ¦  «        r| V — d S ‰dk    rEt          | t          t          f¦  «        r+t          t          | ¦  «        i ‰dz
  ¦  «        E d {V —† d S d S d S )Nr   r7   )rN   rA   rÊ   r’   r±   Úiter_tensors)rs   rí   s    €r   Úcheckziter_tensors.<locals>.check”  sŠ   øè è € Ý�c�5œ<Ñ(Ô(ð 	IØˆIˆIˆIˆIˆIØ˜qÒ Ð ¥Z°µe½T°]Ñ%CÔ%CÐ Ý#¥E¨#¡J¤J°°OÀaÑ4GÑHÔHÐHÐHÐHÐHÐHÐHÐHÐHÐHð !Ð Ð Ð r   )rÖ   )r   r   rí   rñ   rs   Úkwargs     `   r   rð   rð   ‘  s�   øè è € ðIð Ið Ið Ið Ið ð ð ˆØ�5˜‘:”:ÐÐÐÐÐÐÐÐØ—’‘”ð  ð  ˆØ�5˜‘<”<ÐÐÐÐÐÐÐÐð ð  r   c                  ó   — dS ©Nz???r   r   r   r   ú<lambda>rõ      s   € ÀU€ r   c                 óD  — d„ |D ¦   «         }|}t          |t          ¦  «        s|f}t          |i ¦  «        D ]h}|                     ¦   «         j        }|                     ¦   «         j        |v rt          | › d |¦   «         › d�¦  «        ‚|                     |¦  «         ŒidS )zO
    custom operators' outputs must not alias any inputs or other outputs.
    c                 ót   — h | ]5}t          |t          j        ¦  «        ¯|                     ¦   «         j        ’Œ6S r   )rN   rA   rÊ   Úuntyped_storageÚ_cdata)rb   Úts     r   ú	<setcomp>z,check_aliasing_constraint.<locals>.<setcomp>¤  s8   € ÐXÐXÐX¨q½JÀqÍ%Ì,Ñ<WÔ<WÐX�×!Ò!Ñ#Ô#Ô*ÐXÐXÐXr   ú (with implementation in á™  ): The output of this custom operator (1) must not also be an input to this custom operator and (2) may not alias any inputs to this custom operator or other returns. The most common way to trigger this error is if we have y = custom_op(x) and y and x are the same Tensor. Please instead return a clone of the offending output tensor(s) (e.g. return x.clone()) or refactor the custom operator to not return y.N)rN   r’   rð   rø   rù   r¬   Úadd)rD   ÚprevÚresultÚ
get_moduleÚstoragesÚtuple_resultÚtensorÚkeys           r   Úcheck_aliasing_constraintr     sÔ   € ð YÐX°DÐXÑXÔX€HØ€LÝ�f�eÑ$Ô$ð !Ø�yˆÝ˜|¨RÑ0Ô0ð ð ˆØ×$Ò$Ñ&Ô&Ô-ˆØ×!Ò!Ñ#Ô#Ô*¨hÐ6Ð6ÝØð 	-ð 	-°*°*±,´,ð 	-ð 	-ð 	-ñô ð ð 	�Š�SÑÔÐÐðð r   c                  ó   — dS rô   r   r   r   r   rõ   rõ   º  s   € ÐPU€ r   c                 ó    — |}t          |t          ¦  «        s|f}t          j        |||¦  «        rt	          | › d |¦   «         › d�¦  «        ‚dS )zÎ
    custom operators' outputs must not have any aliases
    This version uses C++ implementation for perf.
    Only List container is supported.
    Tensors in Lists with not only Tensors are checked.
    rü   rý   N)rN   r’   r	   Ú'_any_output_is_alias_to_input_or_outputr¬   )rD   r   r   r   r  r  s         r   Ú_c_check_aliasing_constraintr
  º  sy   € ð €LÝ�f�eÑ$Ô$ð !Ø�yˆÝ	Ô1°$¸ÀÑMÔMð 
ÝØð 	)ð 	)¨j¨j©l¬lð 	)ð 	)ð 	)ñ
ô 
ð 	
ð
ð 
r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚMutationCheckerz¥
    Check if an operator mutated its arguments.
    Usage:

    checker = MutationChecker(op, flat_args, args_spec)
    op(*args, **kwargs)
    checker.check()
    c                 óR   — || _         || _        || _        d„ |D ¦   «         | _        d S )Nc                 ód   — g | ]-}t          |t          j        ¦  «        rt          |¦  «        nd ‘Œ.S r   ©rN   rA   rÊ   Úhash_tensorrÏ   s     r   r¨   z,MutationChecker.__init__.<locals>.<listcomp>á  s@   € ð  
ð  
ð  
ØHI�j¨­E¬LÑ9Ô9ÐC�K˜‰NŒNˆN¸tð 
ð  
ð  
r   )rH   Ú	args_specÚ	flat_argsÚreal_pre_hashes)r   rH   r  r  s       r   r%   zMutationChecker.__init__Ý  s>   € ØˆŒØ"ˆŒØ"ˆŒð 
ð  
ØMVð 
ñ  
ô  
ˆÔÐÐr   c                 ó–  ‡ — d„ ‰ j         D ¦   «         }d„ t          ‰ j        |¦  «        D ¦   «         }t          j        |‰ j        ¦  «        \  }}t          ‰ j        j        ||¦  «        D ]^\  }}ˆ fd„}t          |j
        ¦  «        r |||¦  «         Œ+t          |j
        ¦  «        r|€dnt          |¦  «        } |||¦  «         Œ_d S )Nc                 ód   — g | ]-}t          |t          j        ¦  «        rt          |¦  «        nd ‘Œ.S r   r  rÏ   s     r   r¨   z)MutationChecker.check.<locals>.<listcomp>æ  sC   € ð 
ð 
ð 
àõ )¨­E¬LÑ9Ô9ÐC�K˜‰NŒNˆN¸tð
ð 
ð 
r   c                 óF  — g | ]ž\  }}t          |t          j        ¦  «        r}t          |t          j        ¦  «        rct          j        ||¦  «         oL|                     ¦   «                              ¦   «         o%|                     ¦   «                              ¦   «          nd ‘ŒŸS r   )rN   rA   rÊ   ÚequalÚisnanÚall)rb   ÚpreÚposts      r   r¨   z)MutationChecker.check.<locals>.<listcomp>ê  sž   € ð 
ð 
ð 
ñ
 ��Tõ ˜#�uœ|Ñ,Ô,ðå1;¸DÅ%Ä,Ñ1OÔ1Oð•”˜C Ñ&Ô&Ð&ð ?Ø—Y’Y‘[”[—_’_Ñ&Ô&Ð=¨4¯:ª:©<¬<×+;Ò+;Ñ+=Ô+=Ð>øàð	
ð 
ð 
r   c           
      ó˜   •— | j         |k    rd S t          ‰j        j        › d| j        › d‰j        j        › d| j         rdnd› d�¦  «        ‚)Nz: for argument 'z': the operator's schema z specified that the operator Úmutateszdoes not mutatea*   the argument, but this seems to be empirically wrong. Please make the schema and operator behavior consistent. You can specify that an operator mutates a Tensor by e.g. changing its schema type from 'Tensor name' to 'Tensor(a!) name'(use different identifiers (a, b, c, ...) for different Tensors))ra   r¬   rH   rµ   rD   r…   )r–   Úwas_mutatedr   s     €r   Ú	check_onez(MutationChecker.check.<locals>.check_oneø  s~   ø€ Ø”= KÒ/Ð/Ø�FÝ"Ø”w”}ð Xð X°d´ið Xð XØ”w”ðXð Xà15´Ð$U I IÐDUðXð Xð Xñ	ô 	ð 	r   F)r  Úzipr  ÚpytreeÚtree_unflattenr  r™   rH   r…   rƒ   rP   r�   rg   )r   Úreal_post_hashesr  Úwas_mutated_argsÚwas_mutated_kwargsr–   r  Úwas_any_mutateds   `       r   rñ   zMutationChecker.checkå  s(  ø€ ð
ð 
à”^ð
ñ 
ô 
Ðð
ð 
õ
 ! Ô!5Ð7GÑHÔHð
ñ 
ô 
ˆõ 06Ô/DØ˜œñ0
ô 0
Ñ,ÐÐ,õ ",ØŒGŒOÐ-Ð/Añ"
ô "
ð 	1ð 	1ÑˆD�+ðð ð ð ð õ # 4¤9Ñ-Ô-ð 1Ø�	˜$ Ñ,Ô,Ð,Ð,Ý(¨¬Ñ3Ô3ð 1Ø+6Ð+> % %ÅCÈÑDTÔDT�Ø�	˜$ Ñ0Ô0Ð0øð-	1ð 	1r   N)r   r   r   r   r%   rñ   r   r   r   r  r  Ó  s<   € € € € € ðð ð
ð 
ð 
ð%1ð %1ð %1ð %1ð %1r   r  rú   c                 ór   — |                       ¦   «                              ¦   «                              ¦   «         S )zNSome inexpensive hash. Used as a quick and dirty indicator for tensor mutation)ÚdetachÚfloatÚmean)rú   s    r   r  r    s(   € à�8Š8‰:Œ:×ÒÑÔ×"Ò"Ñ$Ô$Ð$r   c                 óÐ  — t          | ¦  «        rdS | j        }t          j                             |d¦  «        rdS t          j        j                             |¦  «        }|€|t          j                             |d¦  «        rdS t          j        j        j	         
                    |¦  «        }|j        j        �dS t          j                             |d¦  «        rdS n	|j        �dS dS )z“If an operator (that stays alive until FakeTensorMode) has a Fake kernel.
    Don't use this if the operator decomposes before FakeTensorMode.
    TÚCompositeImplicitAutogradNÚCompositeExplicitAutogradÚMetaF)r½   rµ   rA   r	   Ú%_dispatch_has_kernel_for_dispatch_keyÚ_libraryÚ
custom_opsÚ_maybe_get_opdefÚsimple_registryÚ	singletonÚfindÚ	fake_implÚkernelÚ_abstract_fn)rH   rD   ÚopdefÚentrys       r   Úhas_fake_kernelr;    sï   € õ & bÑ)Ô)ð ØˆtØŒ8€DÝ„x×5Ò5ØÐ)ñô ð ð ˆtÝŒNÔ%×6Ò6°tÑ<Ô<€EØ€}åŒ8×9Ò9ØÐ-ñ
ô 
ð 	ð �4Ý”Ô.Ô8×=Ò=¸dÑCÔCˆØŒ?Ô!Ð-Ø�4ÝŒ8×9Ò9¸$ÀÑGÔGð 	Ø�4ð	ð ÔÐ)Ø�4Øˆ5r   c                 óÚ   — g }g }t          | j        ¦  «        D ]O\  }}|j        �C|j        j        r7|j        r|                     |j        ¦  «         Œ:|                     |¦  «         ŒP||fS r   )ré   ri   r`   ra   r�   r‘   rD   )r\   ÚidxsÚkeysr•   r–   s        r   rÀ   rÀ   0  sw   € Ø€DØ€DÝ˜VÔ-Ñ.Ô.ð ð ‰ˆˆ4ØŒ?Ð&¨4¬?Ô+CÐ&ØŒð Ø—’˜DœIÑ&Ô&Ð&Ð&à—’˜A‘”�øØ�ˆ:Ðr   T)Úwith_defaultÚfnr?  c                ó   — d S r   r   ©r@  r?  s     r   Úget_layout_constraint_tagrC  E  s	   € ð ˆSr   c                ó   — d S r   r   rB  s     r   rC  rC  L  s	   € ð �Cr   c                óÊ   — t           D ]}|| j        v r|c S Œ|rIt          | ¦  «        rt          j        j        S dd l}ddlm} t          |j        j        |j	        ¦  «        S d S )Nr   )Úconfig)
Útags_by_priorityrV   rR   r	   rT   Úflexible_layoutÚtorch._functorchrF  r@   Ú#custom_op_default_layout_constraint)r@  r?  ÚtagrA   rF  s        r   rC  rC  R  s†   € Ýð ð ˆØ�"”'ˆ>ˆ>ØˆJˆJˆJð àð QÝ�b‰>Œ>ð 	*Ý”6Ô)Ð)ØÐÐÐØ+Ð+Ð+Ð+Ð+Ð+å�u”x”| VÔ%OÑPÔPÐPØˆ4r   ©r   r   Úimpure_randomrM  c                óÖ  — ddl m} ddlm} t	          | t
          j        j        ¦  «        r,| |v rdS t          | dd¦  «        }|�t          ||||¬¦  «        S t	          | t
          j        j
        ¦  «        r/t          | dd¦  «        }|�	|j        rdS | |v rdS  || ¦  «        �dS t	          | t
          j        j        ¦  «        rb| t
          j        j        j        t
          j        j        j        fv r|rt#          |¦  «        dk    r
|d         |v S  || ¦  «        �dS | |v rdS d	S |rt          | d
d	¦  «        rdS | t$          v rdS t          | dd¦  «        }|�	|j        rdS | |v rdS d	S )a…  
    An operator is impure if it:
    - Mutates its inputs (has a mutable schema)
    - Has nondeterministic/random behavior that mutates RNG state
    - Is explicitly marked as effectful via torch.library._register_effectful_op

    Args:
        op: The operator to check (function, OpOverload, HigherOrderOperator, etc.)
        args: Optional arguments that would be passed to the callable
        kwargs: Optional keyword arguments that would be passed to the callable
        impure_random: Whether to treat random operations as impure (default: True)

    Returns:
        bool: True if the callable has side effects, False otherwise
    r   )Ú_get_effect)Ú_side_effectful_functionsTr?   NrL  r…   FÚ_nondeterministic_seeded)Útorch._higher_order_ops.effectsrO  Útorch.fx.noderP  rN   rA   rª   ÚOpOverloadPacketr@   Ú	is_impurer   re   r«   rB   Úhigher_orderÚauto_functionalizedÚauto_functionalized_v2r9   Ú_RANDOM_FUNCTIONS)rH   r   r   rM  rO  rP  r?   r\   s           r   rU  rU  p  sè  € ð. <Ð;Ð;Ð;Ð;Ð;Ø7Ð7Ð7Ð7Ð7Ð7å�"•e”jÔ1Ñ2Ô2ð ØÐ*Ð*Ð*Ø�4Ý˜"˜i¨Ñ.Ô.ˆØÐÝØ˜d¨6Àðñ ô ð õ �"•e”jÔ+Ñ,Ô,ð 	Ý˜˜Y¨Ñ-Ô-ˆØÐ &Ô"3ÐØ�4àÐ*Ð*Ð*Ø�4àˆ;�r‰?Œ?Ð&Ø�4å�"•e”jÔ4Ñ5Ô5ð ØÝŒIÔ"Ô6ÝŒIÔ"Ô9ð
ð 
ð 
ð ð <�˜D™	œ	 Aš˜Ø˜A”wÐ";Ð;Ð;àˆ;�r‰?Œ?Ð&Ø�4àÐ*Ð*Ð*Ø�4àˆuð ð � Ð%?ÀÑGÔGð Øˆtð 
ÕÐÐØˆtå�R˜ DÑ)Ô)€FØÐ˜fÔ/ÐØˆtà	Ð&Ð&Ð&Øˆtàˆ5r   )r7   )RÚdataclassesr,   r.   Úcollections.abcr   r   r   Útypingr   r   r   rA   Útorch.utils._pytreerÑ   rÔ   r!  rk   r	   r
   Ú
torch._opsr   Ú	dataclassr   r    Úintr   r3   r’   r<   rG   ÚboolrR   rW   rZ   rz   r�   rƒ   rŒ   r—   rh   ÚdictÚArgumentr™   r»   r½   rÄ   rÇ   rÜ   rá   rã   ræ   rì   rÊ   rð   r  r
  r  r  rª   r;  r±   rÀ   rT   Úneeds_exact_stridesÚneeds_contiguous_stridesÚneeds_fixed_stride_orderrH  rG  rC  ÚrandÚrandnÚrandintÚrandpermÚ	rand_likeÚ
randn_likeÚrandint_likeÚnormalÚpoissonÚ	bernoulliÚmultinomialrY  rU  r   r   r   ú<module>rr     s×  ðà Ð Ð Ð Ø €€€Ø 
€
€
€
Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à €€€Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø !Ð !Ð !Ð !Ð !Ð !ð Ôð*ð *ð *ð *ð *ñ *ô *ñ Ôð*ðð ð ð ð ñ ô ð ð˜3ð  3ð ð ð ð ð	 ˜cð 	  e¨C°¨H¤oð 	 ð 	 ð 	 ð 	 ð%˜ð % 
ð %ð %ð %ð %ð5�:ð 5 $ð 5ð 5ð 5ð 5ð$ˆzð $˜dð $ð $ð $ð $ð(�:ð ( $ð (ð (ð (ð (ð CHð :!ð :!ð :! ð :!¸4ð :!ÈDð :!ð :!ð :!ð :!ð| ð ¨ð ð ð ð ðU˜Sð U Tð Uð Uð Uð Uð# jð #ð #ð #ð #ðL'ð 'ð 'ð$ØÔðØ%*¨3°¨8¤_ðØ>BÀ3ÈÀ8¼nðàˆe�B”K Ð$Ô%Ô&ðð ð ð ð:&ð &ð &ðR zð °dð ð ð ð ð. :ð ð ð ð ð&H Dð Hð Hð Hð HðSð Sð Sð*7 Ô 1ð 7ð 7ð 7ð 7ð 2Ô#4ð ð ð ð ð˜2Ô,ð °ð ð ð ð ð Ô!2ð °s¸T±zð ð ð ð ð FGð ð  Ø
�Œ*ð Ø" 3¨ 8œnð Ø?Bð àˆeŒlÔð ð  ð  ð  ð >K¸]ð ð ð ð ð4 IVÈð 
ð 
ð 
ð 
ð271ð 71ð 71ð 71ð 71ñ 71ô 71ð 71ðt%�5”<ð % E¤Lð %ð %ð %ð %ð
˜œ
Ô-ð °$ð ð ð ð ð<	 Ô 1ð 	°e¸DÀ¼IÀtÈCÄyÐ<PÔ6Qð 	ð 	ð 	ð 	ð „FÔØ„FÔ#Ø„FÔ#Ø„FÔð	Ð ð 
à.2ðð ð ØðØ% dœmðà„Vðð ð ñ 
„ðð 
ðØðØ% eœnðà„Vˆd�]ðð ð ñ 
„ðð
 37ð ð ð ð ð ð  
„JØ	„KØ	„MØ	„NØ	„OØ	ÔØ	ÔØ	„LØ	„MØ	„OØ	ÔðÐ ð$ $(Ø$(ØðTð Tð TØðTð ��S�Œ/˜DÑ
 ðTð ��c�ŒN˜TÑ!ð	Tð
 ðTð 
ðTð Tð Tð Tð Tð Tr   