o
    i:                     @   s*	  d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZ ddlmZ dd	lmZmZmZ e	rLdd
lmZ ejejejejejejejejej ej ej!ej!ej"ej"ej#ej#ej$ej$ej%ej%i
Z&ejej ejej!ej ej ej!ej!ejej ejej!ej"ej"ej#ej#ej$ej$ej%ej%i
Z'ejej"ejej#ej ej"ej!ej#ejej"ejej#ej"ej"ej#ej#ej$ej$ej%ej%i
Z(ejej$ejej%ejej$ejej%ej$ej$ej%ej%ej ej$ej!ej%ej"ej$ej#ej%i
Z)dede*fddZ+dee de,fddZ-ddede*de,fddZ.eddG dd deZ/eddG dd deZ0eddG dd deZ1eddG dd deZ2eddG d d! d!eZ3eddG d"d# d#eZ4eddG d$d% d%eZ5eddG d&d' d'e5Z6eddG d(d) d)eZ7eddG d*d+ d+eZ8eddG d,d- d-eZ9eddG d.d/ d/eZ:eddG d0d1 d1eZ;eddG d2d3 d3eZ<eddG d4d5 d5eZ=eddG d6d7 d7eZ>eddG d8d9 d9e7Z?eddG d:d; d;e7Z@eddG d<d= d=eZAeddG d>d? d?eZBG d@dA dAejCZDeddG dBdC dCeZEeddG dDdE dEeZFeddG dFdG dGeZGeddG dHdI dIeZHeddG dJdK dKeZIeddG dLdM dMeZJeddG dNdO dOeZKG dPdQ dQeZLeddG dRdS dSeZMeddG dTdU dUeZNeddG dVdW dWeZOeddG dXdY dYeZPeddG dZd[ d[eZQeddG d\d] d]eZReddG d^d_ d_eNZSeddG d`da daeNZTeddG dbdc dceZUeddG ddde deeZVeddG dfdg dgeZWeddG dhdi dieZXeddG djdk dkeZYeddG dldm dmeYZZeddG dndo doeZZ[eddG dpdq dqeYZ\eddG drds dseZ]eddG dtdu dueZ^eddG dvdw dweZ_eddG dxdy dyeZ`eddG dzd{ d{eZaeddG d|d} d}eZbeddG d~d deZceddG dd deZdeddG dd deZeeddG dd deZfeddG dd deZgeddG dd deZhdddede*dee, fddZidddede*de*fddZjdede*fddZkdedee, fddZldede*fddZmdede*fddZndedede*fddZoejpdede*fddZqejpdede*fddZrejpdede*fddZsejpdede*fddZtejpdede*fddZuejpdede*fddZvejpdede*fddZwdS )a  
This module provides Source classes that track the origins of values in PyTorch Dynamo.
Sources represent where values come from (e.g. local variables, globals, attributes) and
are used for guard generation and code reconstruction during compilation.

The module includes specialized sources for:
- Local variables and synthetic locals
- Global variables and constants
- Object attributes and method calls
- NN module specialization (specialized vs unspecialized)
- Random values and tensor properties
- Default argument handling
- FSDP (Fully Sharded Data Parallel) modules

Sources play a key role in Dynamo's guard system by tracking value origins for
guard generation, and in code reconstruction by providing methods to rebuild
the code needed to recreate values.
    N)Callable)AnyOptionalTYPE_CHECKINGUnion)device)ChainedSourcedataclass_with_cached_hashGuardGuardSourceSource   )utils)create_binary_subscrcreate_build_tuplecreate_call_function)	PyCodegensourcereturnc                 C   s<   t | trdS z| jtjkrW dS W dS  ty   Y dS w NTF)
isinstanceConstantSourceguard_sourcer   CONSTANTNotImplementedErrorr    r   V/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/torch/_dynamo/source.pyis_constant_sourcem   s   
r   c                 C   s*   | d u rdS z| j W S  ty   Y dS w )Nz<unknown source>)namer   r   r   r   r   _get_source_debug_namey   s   r    Fs
apply_reprc                 C   s*   |rt | } nt| } | ddddS )a!  
    Escapes curly brackets for format strings.
    e.g. "frozenset({0})" becomes "frozenset({{0}})".
    This is used by _name_template for example, because it's
    expected to return a format string, but we may wish to include
    strings that should not be accidentally formatted.
    {z{{}z}})reprstrreplace)r!   r"   r   r   r   _esc_str   s   
r(   T)frozenc                   @   sr   e Zd ZU eed< dZeed< dZee	e  ed< dZ
eed< dd
dZed	efddZejd	efddZdS )LocalSource
local_nameFis_inputNdynamismis_derefed_cell_contentscodegenr   r   c                 C   s,   | j r|| j d S ||| j d S N)r.   
load_derefr+   append_outputcreate_loadselfr/   r   r   r   reconstruct   s   zLocalSource.reconstructc                 C      t jS r0   )r   LOCALr5   r   r   r   r         zLocalSource.guard_sourcec                 C      dt | jdd dS )NzL[Tr"   ]r(   r+   r9   r   r   r   _name_template      zLocalSource._name_templater/   r   r   N)__name__
__module____qualname__r&   __annotations__r,   boolr-   r   	frozensetr.   r6   propertyr   r   	functoolscached_propertyr?   r   r   r   r   r*      s   
 
r*   c                   @   sD   e Zd ZU eed< dddZedefdd	Zedefd
dZ	dS )TempLocalSourcer+   r/   r   r   Nc                 C      | || j d S r0   r2   r3   r+   r4   r   r   r   r6         zTempLocalSource.reconstructc                 C   r7   r0   )r   
TEMP_LOCALr9   r   r   r   r      r:   zTempLocalSource.guard_sourcec                 C   s   t d)NzhCannot create guard on TempLocalSource - this is an internal Dynamo bug. Please file an issue on GitHub.r   r9   r   r   r   r?      s   zTempLocalSource._name_templaterA   )
rB   rC   rD   r&   rE   r6   rH   r   r   r?   r   r   r   r   rK      s   
 
rK   c                   @   F   e Zd ZU eed< dddZedefdd	Ze	j
defd
dZdS )SyntheticLocalSourcer+   r/   r   r   Nc                 C   rL   r0   rM   r4   r   r   r   r6      rN   z SyntheticLocalSource.reconstructc                 C   r7   r0   )r   SYNTHETIC_LOCALr9   r   r   r   r      r:   z!SyntheticLocalSource.guard_sourcec                 C   r;   )NzSYNTHETIC_LOCAL[Tr<   r=   r>   r9   r   r   r   r?      r@   z#SyntheticLocalSource._name_templaterA   rB   rC   rD   r&   rE   r6   rH   r   r   rI   rJ   r?   r   r   r   r   rR         
 
rR   c                   @   sF   e Zd ZU eed< edefddZddd	Ze	j
defd
dZdS )RandomValueSourcerandom_call_indexr   c                 C   r7   r0   )r   RANDOM_VALUEr9   r   r   r   r      r:   zRandomValueSource.guard_sourcer/   r   Nc                 C   s8   | ||jjj | || j | t  d S r0   )r2   r3   txoutputrandom_values_varcreate_load_constrW   r   r4   r   r   r   r6      s   zRandomValueSource.reconstructc                 C      dt | j S )Nrandom_value_)r(   rW   r9   r   r   r   r?         z RandomValueSource._name_templaterA   )rB   rC   rD   intrE   rH   r   r   r6   rI   rJ   r&   r?   r   r   r   r   rV      s   
 
rV   c                   @   rQ   )GlobalSourceglobal_namer/   r   r   Nc                 C      | |j| jdd d S NTaddr2   create_load_globalrb   r4   r   r   r   r6         zGlobalSource.reconstructc                 C   r7   r0   r   GLOBALr9   r   r   r   r      r:   zGlobalSource.guard_sourcec                 C   r;   )NG[Tr<   r=   r(   rb   r9   r   r   r   r?      r@   zGlobalSource._name_templaterA   rT   r   r   r   r   ra      rU   ra   c                   @   rQ   )GlobalWeakRefSourcerb   r/   r   r   Nc                    (      fdd  tdd d S )Nc                      s      jjddS rd   rg   r   r/   r5   r   r   <lambda>   s    z1GlobalWeakRefSource.reconstruct.<locals>.<lambda>r   Fadd_push_nullextend_outputr   r4   r   rp   r   r6      s   zGlobalWeakRefSource.reconstructc                 C   r7   r0   rj   r9   r   r   r   r     r:   z GlobalWeakRefSource.guard_sourcec                 C   r;   )Nrl   Tr<   z]()rm   r9   r   r   r   r?     r@   z"GlobalWeakRefSource._name_templaterA   rT   r   r   r   r   rn      s   
 
rn   c                   @   (   e Zd Zd	ddZedefddZdS )
WeakRefCallSourcer/   r   r   Nc                    ro   )Nc                      s
    j S r0   baser   rp   r   r   rq     s   
 z/WeakRefCallSource.reconstruct.<locals>.<lambda>r   Frr   r4   r   rp   r   r6     s   zWeakRefCallSource.reconstructc                 C      dS )Nz{0}()r   r9   r   r   r   r?        z WeakRefCallSource._name_templaterA   rB   rC   rD   r6   rH   r&   r?   r   r   r   r   rv         
rv   c                   @      e Zd ZdS )CallFunctionNoArgsSourceNrB   rC   rD   r   r   r   r   r~         r~   c                   @   >   e Zd ZU eed< dddZddd	Zejdefd
dZ	dS )
AttrSourcememberr   Nc                 C   b   | j sJ dd| jv r/| jd}t| dt| j d|d d  t| d|d  d S d S Nz9Can't construct an AttrSource without a valid base source.rx   r   rx   r   splitobject__setattr__r   joinr5   member_partsr   r   r   __post_init__     
zAttrSource.__post_init__r/   r   c                 C       || j  ||| j d S r0   rx   rt   create_load_attrsr   r4   r   r   r   r6   (     
zAttrSource.reconstructc                 C   s0   | j  sdt| j dd dS dt| j  S )Nzgetattr({0}, Tr<   ){0}.)r   isidentifierr(   r9   r   r   r   r?   ,  s   
zAttrSource._name_templater   NrA   
rB   rC   rD   r&   rE   r   r6   rI   rJ   r?   r   r   r   r   r        
 

	r   c                   @   r   )GenericAttrSourcer   r   Nc                 C   r   r   r   r   r   r   r   r   7  r   zGenericAttrSource.__post_init__r/   r   c                 C   r   r0   r   r4   r   r   r   r6   @  r   zGenericAttrSource.reconstructc                 C   r;   )Nzobject.__getattribute__({0}, Tr<   r   r(   r   r9   r   r   r   r?   D     z GenericAttrSource._name_templater   rA   r   r   r   r   r   r   3  r   r   c                   @   ru   )
TypeDictSourcer/   r   r   Nc                 C      || j  ||d d S )N__dict__rx   rt   r   r4   r   r   r   r6   N     
zTypeDictSource.reconstructc                 C   ry   )Nzdict({0}.__dict__)r   r9   r   r   r   r?   R  s   zTypeDictSource._name_templaterA   r{   r   r   r   r   r   L  r|   r   c                   @   ru   )
TypeMROSourcer/   r   r   Nc                 C   r   )N__mro__r   r4   r   r   r   r6   ^  r   zTypeMROSource.reconstructc                 C   ry   )Nz{0}.__mro__r   r9   r   r   r   r?   b  rz   zTypeMROSource._name_templaterA   r{   r   r   r   r   r   \  r|   r   c                   @   s$   e Zd ZU dZeed< d	ddZdS )
LocalCellSourcez
    Conceptually, this class is `LocalSource` for cell objects implicitly
    generated by Python (e.g., captured variables).
    r+   r/   r   r   Nc                 C   rL   r0   )r2   create_load_closurer+   r4   r   r   r   r6   p  s   zLocalCellSource.reconstructrA   )rB   rC   rD   __doc__r&   rE   r6   r   r   r   r   r   g  s   
 r   c                   @   ru   )

CodeSourcer/   r   r   Nc                 C   r   )N__code__r   r4   r   r   r   r6   }  r   zCodeSource.reconstructc                 C   ry   )Nz{0}.__code__r   r9   r   r   r   r?     rz   zCodeSource._name_templaterA   r{   r   r   r   r   r   {  r|   r   c                   @   ru   )
ClosureSourcer/   r   r   Nc                 C   r   )N__closure__r   r4   r   r   r   r6     r   zClosureSource.reconstructc                 C   ry   )Nz{0}.__closure__r   r9   r   r   r   r?     rz   zClosureSource._name_templaterA   r{   r   r   r   r   r     r|   r   c                   @   s8   e Zd ZU dZeed< dddZejdefd	d
Z	dS )
GradSourcegradr   r/   r   r   Nc                 C   r   r0   r   r4   r   r   r   r6     r   zGradSource.reconstructc                 C   r]   )Nr   r   r9   r   r   r   r?     r_   zGradSource._name_templaterA   )
rB   rC   rD   r   r&   rE   r6   rI   rJ   r?   r   r   r   r   r     s
   
 
r   c                   @       e Zd ZejdefddZdS )ParamBufferSourcer   c                 C      t | jj S r0   #_GUARD_SOURCE_SPECIALIZED_NN_MODULErx   r   r9   r   r   r   r        zParamBufferSource.guard_sourceNrB   rC   rD   rI   rJ   r   r   r   r   r   r   r         r   c                   @   r}   )UnspecializedParamBufferSourceNr   r   r   r   r   r     r   r   c                   @   sl   e Zd ZU dZee ed< edefddZ	e
jdefddZded	ef defd
dZdefddZdS )EphemeralSourceNdescr   c                 C   r7   r0   )r   	EPHEMERALr9   r   r   r   r     r:   zEphemeralSource.guard_sourcec                 C   s(   | j d ur
d| j  nd}dt| dS )Nz:  z
<ephemeral>)r   r(   )r5   r   r   r   r   r?     s   zEphemeralSource._name_templatefn.c                 C      t r0   rP   r5   r   r   r   r   
make_guard     zEphemeralSource.make_guardc                 C   ry   NTr   r9   r   r   r   is_ephemeral  r   zEphemeralSource.is_ephemeral)rB   rC   rD   r   r   r&   rE   rH   r   r   rI   rJ   r?   r   r   r
   r   rF   r   r   r   r   r   r     s   
 r   c                   @   ru   )
SkipGuardSourcer/   r   r   Nc                 C   s   | j | d S r0   )rx   r6   r4   r   r   r   r6        zSkipGuardSource.reconstructc                 C   ry   Nz{0}r   r9   r   r   r   r?     rz   zSkipGuardSource._name_templaterA   r{   r   r   r   r   r         
r   c                   @   s&   e Zd ZdZdZdZdefddZdS )TensorPropertyr   r      r   c                 C   s<   | t ju rdS | t ju rdS | t ju rdS tdt|  )Nsizestridestorage_offset
unhandled )r   SIZESTRIDESTORAGE_OFFSETAssertionErrorr(   r9   r   r   r   method_name  s   


zTensorProperty.method_nameN)rB   rC   rD   r   r   r   r&   r   r   r   r   r   r     s
    r   c                   @   sN   e Zd ZU eed< dZee ed< dddZdd	d
Z	e
jdefddZdS )TensorPropertySourcepropNidxr   c                 C   s>   | j d usJ | jtju r| jd u sJ d S | jd usJ d S r0   )rx   r   r   r   r   r9   r   r   r   r     s   z"TensorPropertySource.__post_init__r/   r   c                    s\      fdd  j jd ur  j  tjd ur'dndd d S )Nc                      s     tjdtj  S )Ncall_)load_import_fromr   rB   r(   r   r   r   rp   r   r   rq     s    z2TensorPropertySource.reconstruct.<locals>.<lambda>r   r   F)rs   rx   r   r2   r\   rt   r   r4   r   rp   r   r6     s   

z TensorPropertySource.reconstructc                 C   sn   | j tju rdt| j dS | j tju rdt| j dS | j tju r-| jd u s+J dS tdt| j  )Nz{0}.size()[r=   z{0}.stride()[z{0}.storage_offset()r   )r   r   r   r(   r   r   r   r   r9   r   r   r   r?     s   z#TensorPropertySource._name_templater   rA   )rB   rC   rD   r   rE   r   r   r`   r   r6   rI   rJ   r&   r?   r   r   r   r   r     s   
 

r   c                   @   >   e Zd ZU eed< dddZddd	Zejde	fd
dZ
dS )IndexedSourcer   r   Nc                 C      | j d usJ d S r0   rw   r9   r   r   r   r        zIndexedSource.__post_init__r/   r   c                 C   r   r0   rP   r4   r   r   r   r6     r   zIndexedSource.reconstructc                 C   s   dt | j dS )N(z, {0}))r(   r   r9   r   r   r   r?     s   zIndexedSource._name_templater   rA   )rB   rC   rD   r`   rE   r   r6   rI   rJ   r&   r?   r   r   r   r   r     s   
 

r   c                   @   2   e Zd ZdddZdddZedefd	d
ZdS )NegateSourcer   Nc                 C   r   r0   rw   r9   r   r   r   r     r   zNegateSource.__post_init__r/   r   c                 C   r   r0   rP   r4   r   r   r   r6   "  r   zNegateSource.reconstructc                 C   ry   )Nz{0}.__neg__()r   r9   r   r   r   r?   %  s   zNegateSource._name_templater   rA   rB   rC   rD   r   r6   rH   r&   r?   r   r   r   r   r     
    

r   c                   @   r   )ConvertIntSourcer   Nc                 C   r   r0   rw   r9   r   r   r   r   -  r   zConvertIntSource.__post_init__r/   r   c                 C      || j  d S r0   rw   r4   r   r   r   r6   0     zConvertIntSource.reconstructc                 C   ry   )Nz%cast_symbool_to_symint_guardless({0})r   r9   r   r   r   r?   3  rz   zConvertIntSource._name_templater   rA   r   r   r   r   r   r   +  r   r   c                   @   s<   e Zd ZU eed< dddZddd	Zedefd
dZ	dS )DynamicScalarSourceis_intr   Nc                 C   r   r0   rw   r9   r   r   r   r   <  r   z!DynamicScalarSource.__post_init__r/   r   c                    0      fdd  | j  tdd d S )Nc                           ddS )Nbuiltinsr`   r   r   r/   r   r   rq   D      z1DynamicScalarSource.reconstruct.<locals>.<lambda>r   Frs   rx   rt   r   r4   r   r   r   r6   ?  s   
zDynamicScalarSource.reconstructc                 C   ry   )Nzint({0})r   r9   r   r   r   r?   H  rz   z"DynamicScalarSource._name_templater   rA   )
rB   rC   rD   rF   rE   r   r6   rH   r&   r?   r   r   r   r   r   8  s   
 

	r   c                   @   r   )FlattenScriptObjectSourcer   Nc                 C   r   r0   rw   r9   r   r   r   r   O  r   z'FlattenScriptObjectSource.__post_init__r/   r   c                 C   r   r0   rw   r4   r   r   r   r6   R  r   z%FlattenScriptObjectSource.reconstructc                 C   ry   )Nz{0}.__obj_flatten__()r   r9   r   r   r   r?   U  rz   z(FlattenScriptObjectSource._name_templater   rA   r   r   r   r   r   r   M  r   r   c                   @   r   )ScriptObjectQualifiedNameSourcer   Nc                 C   r   r0   rw   r9   r   r   r   r   \  r   z-ScriptObjectQualifiedNameSource.__post_init__r/   r   c                 C   r   r0   rw   r4   r   r   r   r6   _  r   z+ScriptObjectQualifiedNameSource.reconstructc                 C   ry   )Nz{0}._type().qualified_name()r   r9   r   r   r   r?   b  rz   z.ScriptObjectQualifiedNameSource._name_templater   rA   r   r   r   r   r   r   Z  r   r   c                   @   ru   )
AttrProxySourcer/   r   r   Nc                 C   r   r0   rw   r4   r   r   r   r6   h  r   zAttrProxySource.reconstructc                 C   ry   )Nz{0}.get_base()r   r9   r   r   r   r?   k  rz   zAttrProxySource._name_templaterA   r{   r   r   r   r   r   g  s    
r   c                   @   s   e Zd ZU eeef ed< dZeed< e	j
ddddZ
eed< e	j
ddddZeed< dd	d
ZdddZejdefddZdS )DefaultsSourceidx_keyFis_kw)initr%   comparefield_namer   Nc              	   C   s   | j sJ d| jr/t| jtsJ t| dd t| ddt| j dt| j d d S t| jt	s7J t| dd t| ddt| j d	t| j d
 d S )Nz]Base must be a valid source in order to properly track and guard this Defaults to its origin.r   __kwdefaults__r   r   z['z']__defaults__[r=   )
rx   r   r   r   r&   r   r   r(   r   r`   r9   r   r   r   r   w  s     zDefaultsSource.__post_init__r/   r   c                 C   s>   || j  ||| j ||| j |t  d S r0   )rx   rt   r   r   r2   r\   r   r   r4   r   r   r   r6     s   
zDefaultsSource.reconstructc                 C      | j S r0   )r   r9   r   r   r   r?     r:   zDefaultsSource._name_templater   rA   )rB   rC   rD   r   r`   r&   rE   r   rF   dataclassesr   r   r   r6   rI   rJ   r?   r   r   r   r   r   p  s   
 

r   c                       s`   e Zd ZU eed< dZeed< d fddZdd
dZde	fddZ
ejdefddZ  ZS )GetItemSourceindexFindex_is_slicer   Nc                    sD   | j d usJ t| jtr t d| j  t dd d S d S )Nr   r   T)rx   r   r   slicesuperr   
__reduce__r9   	__class__r   r   r     s
   zGetItemSource.__post_init__r/   r   c                 C   sH   || j  | jr|||   n	||| j |t  d S r0   )rx   r   r2   r\   unpack_slicer   r   r4   r   r   r   r6     s
   
zGetItemSource.reconstructc                 C   s   | j sJ | j\}}|| S r0   )r   r   )r5   slice_class
slice_argsr   r   r   r    s   

zGetItemSource.unpack_slicec                 C   sD   t | jtrJ | jrdt|  dd dS dt| jdd dS )N{0}[Tr<   r=   )r   r   r   r   r(   r  r9   r   r   r   r?     s   zGetItemSource._name_templater   rA   )rB   rC   rD   r   rE   r   rF   r   r6   r   r  rI   rJ   r&   r?   __classcell__r   r   r  r   r     s   
 
r   c                   @   sB   e Zd ZU eed< dddZejdefdd	Z	de
fd
dZdS )ConstDictKeySourcer   r/   r   r   Nc                    B      fdd  | j   | j  tdd d S )Nc                           tjdS )Ndict_keys_getitemr   r   rB   r   r   r   r   rq         z0ConstDictKeySource.reconstruct.<locals>.<lambda>r   Frs   rx   r2   r\   r   rt   r   r4   r   r   r   r6        

zConstDictKeySource.reconstructc                 C   r;   )Nzlist(dict.keys({0}))[Tr<   r=   r(   r   r9   r   r   r   r?        z!ConstDictKeySource._name_templatec                 C   ry   r   r   r9   r   r   r   is_dict_key  r   zConstDictKeySource.is_dict_keyrA   )rB   rC   rD   r   rE   r6   rI   rJ   r&   r?   rF   r  r   r   r   r   r    s   
 
r  c                   @   sL   e Zd ZU eed< dddZddd	Zejde	fd
dZ
defddZdS )NonSerializableSetGetItemSourcer   r   Nc                 C   s    ddl m} || jsJ d S Nr   )ConstantVariable)	variablesr  
is_literalr   r5   r  r   r   r   r     s   z-NonSerializableSetGetItemSource.__post_init__r/   r   c                    r	  )Nc                      r
  )Nset_getitemr  r   r   r   r   rq     r  z=NonSerializableSetGetItemSource.reconstruct.<locals>.<lambda>r   Fr  r4   r   r   r   r6     r  z+NonSerializableSetGetItemSource.reconstructc                 C   r;   )Nz
list({0})[Tr<   r=   r  r9   r   r   r   r?     r  z.NonSerializableSetGetItemSource._name_templatec                 C   ry   )NFr   r9   r   r   r   r    r   z+NonSerializableSetGetItemSource.is_dict_keyr   rA   )rB   rC   rD   r`   rE   r   r6   rI   rJ   r&   r?   rF   r  r   r   r   r   r    s   
 

r  c                   @   r   )DictGetItemSourcer   r   Nc                 C   0   ddl m} t| jts|| jsJ d S d S r  r  r  r   r   r  r  r  r   r   r   r        
zDictGetItemSource.__post_init__r/   r   c                 C   sD   || j  t| jtr|| j n	||| j |t  d S r0   )rx   r   r   r   r2   r\   r   r4   r   r   r   r6     s
   
zDictGetItemSource.reconstructc                 C   s6   t | jtrdt| jj dS dt| jdd dS )Nr  r=   Tr<   r   r   r  r(   r   r9   r   r   r   r?        z DictGetItemSource._name_templater   rA   rB   rC   rD   r   rE   r   r6   rI   rJ   r&   r?   r   r   r   r   r    s   
 

r  c                   @   r   )DictSubclassGetItemSourcer   r   Nc                 C   r  r  r  r  r   r   r   r     r  z'DictSubclassGetItemSource.__post_init__r/   r   c                    sZ      fdd  | j t| jtr | j n	  | j  tdd d S )Nc                      r
  )Ndict_getitemr  r   r   r   r   rq      r  z7DictSubclassGetItemSource.reconstruct.<locals>.<lambda>r   F)	rs   rx   r   r   r   r2   r\   rt   r   r4   r   r   r   r6     s   

z%DictSubclassGetItemSource.reconstructc                 C   s6   t | jtrdt| jj dS dt| jdd dS )Nzdict.__getitem__({0}, r   r  Tr<   r=   r  r9   r   r   r   r?   .  r  z(DictSubclassGetItemSource._name_templater   rA   r   r   r   r   r   r!    s   
 

r!  c                   @   s.   e Zd ZdZd
ddZejdefdd	ZdS )ListGetItemSourcezY
    Same as GetItemSource with reconstruct and name overridden to be list specific.
    r/   r   r   Nc                    sP      fdd  | j | jrtd  | j  tdd d S )Nc                      r
  )Nlist_getitemr  r   r   r   r   rq   B  r  z/ListGetItemSource.reconstruct.<locals>.<lambda>>List[slice] is a temporary object and should not have a sourcer   F)	rs   rx   r   RuntimeErrorr2   r\   r   rt   r   r4   r   r   r   r6   <  s   

zListGetItemSource.reconstructc                 C   s4   t | jtrJ | jrtddt| jdd dS )Nr%  zlist.__getitem__({0}, Tr<   r   )r   r   r   r   r&  r(   r9   r   r   r   r?   R  s   z ListGetItemSource._name_templaterA   )	rB   rC   rD   r   r6   rI   rJ   r&   r?   r   r   r   r   r#  6  s
    
r#  c                   @   s*   e Zd Zd	ddZejdefddZdS )
TupleIteratorGetItemSourcer/   r   r   Nc                    r	  )Nc                      r
  )Ntuple_iterator_getitemr  r   r   r   r   rq   d  r  z8TupleIteratorGetItemSource.reconstruct.<locals>.<lambda>r   Fr  r4   r   r   r   r6   b  r  z&TupleIteratorGetItemSource.reconstructc                 C   r;   )Nz___tuple_iterator_getitem({0}, Tr<   r   r  r9   r   r   r   r?   j  r   z)TupleIteratorGetItemSource._name_templaterA   )rB   rC   rD   r6   rI   rJ   r&   r?   r   r   r   r   r'  `  s    
r'  c                   @   ru   )
NamedTupleFieldsSourcer/   r   r   Nc                 C   r   )N_fieldsr   r4   r   r   r   r6   s  r   z"NamedTupleFieldsSource.reconstructc                 C   ry   )Nz___namedtuple_fields({0})r   r9   r   r   r   r?   w  rz   z%NamedTupleFieldsSource._name_templaterA   r{   r   r   r   r   r)  q  r|   r)  c                   @   ru   )
DataclassFieldsSourcer/   r   r   Nc                    r   )Nc                      r
  )Ndataclass_fieldsr  r   r   r   r   rq     r  z3DataclassFieldsSource.reconstruct.<locals>.<lambda>r   Fr   r4   r   r   r   r6   ~  s
   

z!DataclassFieldsSource.reconstructc                 C   ry   )Nz___dataclass_fields({0})r   r9   r   r   r   r?     rz   z$DataclassFieldsSource._name_templaterA   r{   r   r   r   r   r+  |  s    
r+  c                   @   r   )
TypeSourcer   Nc                 C   r   r0   rw   r9   r   r   r   r     r   zTypeSource.__post_init__r/   r   c                    r   )Nc                      r   )Nr   typer   r   r   r   r   rq     r   z(TypeSource.reconstruct.<locals>.<lambda>r   Fr   r4   r   r   r   r6        
zTypeSource.reconstructc                 C   ry   )Nz	type({0})r   r9   r   r   r   r?     rz   zTypeSource._name_templater   rA   r   r   r   r   r   r-    s
    

r-  c                   @   ru   )
OptimizerSourcer/   r   r   Nc                 C   r   r0   rw   r4   r   r   r   r6     r   zOptimizerSource.reconstructc                 C   ry   r   r   r9   r   r   r   r?     rz   zOptimizerSource._name_templaterA   r{   r   r   r   r   r0    r   r0  c                   @   s<   e Zd ZdddZejdefddZede	fd	d
Z
dS )NNModuleSourcer/   r   r   Nc                 C   r   r0   rw   r4   r   r   r   r6     r   zNNModuleSource.reconstructc                 C   r   r0   r   r9   r   r   r   r     r   zNNModuleSource.guard_sourcec                 C   ry   r   r   r9   r   r   r   r?     rz   zNNModuleSource._name_templaterA   )rB   rC   rD   r6   rI   rJ   r   r   rH   r&   r?   r   r   r   r   r1    s    
r1  c                   @   r   )UnspecializedNNModuleSourcer   c                 C   r   r0   )%_GUARD_SOURCE_UNSPECIALIZED_NN_MODULErx   r   r9   r   r   r   r     r   z(UnspecializedNNModuleSource.guard_sourceNr   r   r   r   r   r2    r   r2  c                   @   r   )"UnspecializedBuiltinNNModuleSourcer   c                 C   r   r0   )-_GUARD_SOURCE_UNSPECIALIZED_BUILTIN_NN_MODULErx   r   r9   r   r   r   r     r   z/UnspecializedBuiltinNNModuleSource.guard_sourceNr   r   r   r   r   r4    r   r4  c                   @   r   )FSDPNNModuleSourcer   c                 C   r   r0   )_GUARD_SOURCE_FSDP_MODULErx   r   r9   r   r   r   r     r   zFSDPNNModuleSource.guard_sourceNr   r   r   r   r   r6    r   r6  c                   @   0   e Zd ZedefddZedefddZdS )GlobalStateSourcer   c                 C   ry   Nr   r   r9   r   r   r   r?     rz   z GlobalStateSource._name_templatec                 C   r7   r0   rj   r9   r   r   r   r     r:   zGlobalStateSource.guard_sourceNrB   rC   rD   rH   r&   r?   r   r   r   r   r   r   r9    
    r9  c                       \   e Zd ZdZdededdf fddZedefdd	ZdddZ	ede
fddZ  ZS )TorchSourcezPoints to the actual `torch` module - used instead of GlobalSource
    in case the user has overridden `torch` in their local namespaceargskwargsr   Nc                    6   t  j|i | ddlm}m} || |j d S Nr   )GuardBuilderinstall_guardr   __init__guardsrC  rD  r   ID_MATCHr5   r?  r@  rC  rD  r  r   r   rF       zTorchSource.__init__c                 C   ry   )Nz__import__('torch')r   r9   r   r   r   r?     rz   zTorchSource._name_templater/   r   c                 C   $   | |dtd|dg d S )Nr   torchrt   r\   r   create_import_namer4   r   r   r   r6        zTorchSource.reconstructc                 C   r7   r0   rj   r9   r   r   r   r     r:   zTorchSource.guard_sourcerA   rB   rC   rD   r   r   rF  rH   r&   r?   r6   r   r   r  r   r   r  r   r>        
	r>  c                       r=  )CollectionsSourcezPoints to the actual `collections` module - used instead of GlobalSource
    in case the user has overridden `collections` in their local namespacer?  r@  r   Nc                    rA  rB  rE  rI  r  r   r   rF    rJ  zCollectionsSource.__init__c                 C   ry   )Nz__import__('collections')r   r9   r   r   r   r?     rz   z CollectionsSource._name_templater/   r   c                 C   rK  )Nr   collectionsrM  r4   r   r   r   r6     rO  zCollectionsSource.reconstructc                 C   r7   r0   rj   r9   r   r   r   r     r:   zCollectionsSource.guard_sourcerA   rP  r   r   r  r   rR    rQ  rR  c                   @   sT   e Zd ZU eed< ejdefddZdefddZ	dd
dZ
edefddZd	S )TorchFunctionModeStackSourceindr   c                 C   s   dt |   dS )Nz$___get_torch_function_mode_stack_at(r   )r(   
_get_indexr9   r   r   r   r?     s   z+TorchFunctionModeStackSource._name_templatec                 C   s   ddl m} || jS )Nr   )TorchFunctionModeStackVariable)variables.torch_functionrW  get_mode_indexrU  )r5   rW  r   r   r   rV    s   z'TorchFunctionModeStackSource._get_indexr/   r   Nc                    s<      fdd   |  g  tdd d S )Nc                      r
  )N get_torch_function_mode_stack_atr  r   r   r   r   rq     s    z:TorchFunctionModeStackSource.reconstruct.<locals>.<lambda>r   F)rs   rt   r\   rV  r   r4   r   r   r   r6     s
   
z(TorchFunctionModeStackSource.reconstructc                 C   r7   r0   rj   r9   r   r   r   r   !  r:   z)TorchFunctionModeStackSource.guard_sourcerA   )rB   rC   rD   r`   rE   rI   rJ   r&   r?   rV  r6   rH   r   r   r   r   r   r   rT    s   
 
	rT  c                   @   sX   e Zd ZU eed< dddZedefdd	Ze	j
defd
dZdedefddZdS )r   source_namer/   r   r   Nc                 C   rc   )NFre   )r2   rh   r[  r4   r   r   r   r6   *  ri   zConstantSource.reconstructc                 C   r7   r0   )r   r   r9   r   r   r   r   -  r:   zConstantSource.guard_sourcec                 C   r   r0   )r[  r9   r   r   r   r?   1  r:   zConstantSource._name_templater   c                 C   r   r0   rP   r   r   r   r   r   5  r   zConstantSource.make_guardrA   )rB   rC   rD   r&   rE   r6   rH   r   r   rI   rJ   r?   r   r   r   r   r   r   r   &  s   
 
r   c                   @   s(   e Zd ZedefddZd	ddZdS )
NumpyTensorSourcer   c                 C   ry   )Nz___from_numpy({0})r   r9   r   r   r   r?   ;  rz   z NumpyTensorSource._name_templater/   r   Nc                    r   )Nc                      r   )NrL  	as_tensorr   r   r   r   r   rq   @  r   z/NumpyTensorSource.reconstruct.<locals>.<lambda>r   Fr   r4   r   r   r   r6   ?  r/  zNumpyTensorSource.reconstructrA   )rB   rC   rD   rH   r&   r?   r6   r   r   r   r   r\  9  s    r\  c                   @      e Zd ZedefddZdS )SubclassAttrListSourcer   c                 C   ry   )Nz{0}.__tensor_flatten__()[0]r   r9   r   r   r   r?   G  rz   z%SubclassAttrListSource._name_templateNrB   rC   rD   rH   r&   r?   r   r   r   r   r_  E      r_  c                   @   r^  )FloatTensorSourcer   c                 C   ry   )Nz___as_tensor({0})r   r9   r   r   r   r?   P  rz   z FloatTensorSource._name_templateNr`  r   r   r   r   rb  N  ra  rb  c                   @   r^  )CallMethodItemSourcer   c                 C   ry   )Nz
{0}.item()r   r9   r   r   r   r?   W  rz   z#CallMethodItemSource._name_templateNr`  r   r   r   r   rc  U  ra  rc  c                   @   r8  )ShapeEnvSourcer   c                 C   ry   r:  r   r9   r   r   r   r?   a  rz   zShapeEnvSource._name_templatec                 C   r7   r0   )r   	SHAPE_ENVr9   r   r   r   r   e  r:   zShapeEnvSource.guard_sourceNr;  r   r   r   r   rd  _  r<  rd  c                   @   sF   e Zd ZU eed< ejdefddZddd	Z	e
defd
dZdS )CurrentStreamSourcer   r   c                 C   s"   dt | jj dt | jj dS )Nz$___get_current_stream(torch.device('z', z)))r(   r   r.  r   r9   r   r   r   r?   n  s   "z"CurrentStreamSource._name_templater/   r   Nc                    s   d}   fdd    fdd   | jjg | jjd ur4|d7 }  | jjg  t|d  tdd d S )Nr   c                      r
  )Nget_current_streamr  r   r   r   r   rq   u  r  z1CurrentStreamSource.reconstruct.<locals>.<lambda>c                      r   )NrL  r   r   r   r   r   r   rq   w  r   F)rs   rt   r\   r   r.  r   r   )r5   r/   num_argsr   r   r   r6   r  s   
zCurrentStreamSource.reconstructc                 C   r7   r0   rj   r9   r   r   r   r     r:   z CurrentStreamSource.guard_sourcerA   )rB   rC   rD   device_typerE   rI   rJ   r&   r?   r6   rH   r   r   r   r   r   r   rf  j  s   
 
rf  c                   @   r8  )BackwardStateSourcer   c                 C   ry   r:  r   r9   r   r   r   r?     rz   z"BackwardStateSource._name_templatec                 C   r7   r0   )r   BACKWARD_STATEr9   r   r   r   r     r:   z BackwardStateSource.guard_sourceNr;  r   r   r   r   rj    r<  rj  only_allow_inputrm  c                C   s:   t | trt| j|dS t | tsd S |r| jsd S | jS Nrl  )r   r   get_local_source_namerx   r*   r,   r+   r   rm  r   r   r   ro    s   


ro  c                C   s   t | |dd uS rn  )ro  rp  r   r   r   is_from_local_source  r   rq  c                 C   s   t | d uS r0   )get_global_source_namer   r   r   r   is_from_global_source  s   rs  c                 C   s(   t | tr
t| jS t | tsd S | jS r0   )r   r   rr  rx   ra   rb   r   r   r   r   rr    s
   


rr  c                 C   s,   t | tr
t| jS t | to| jo| j S r0   )r   r   is_from_nonlocal_sourcerx   r*   r.   r,   r   r   r   r   rt    s   


rt  c                 C   &   t | trdS t | trt| jS dS r   )r   r   r   is_from_closure_sourcerx   r   r   r   r   rv    s
   


rv  targetc                 C   s   t | trt| j|S | |kS r0   )r   r   is_from_sourcerx   )r   rw  r   r   r   rx    s   
rx  c                 C   ru  r   )r   r2  r   &is_from_unspecialized_nn_module_sourcerx   r   r   r   r   ry    
   


ry  c                 C   ru  r   )r   r4  r   .is_from_unspecialized_builtin_nn_module_sourcerx   r   r   r   r   r{    rz  r{  c                 C   ru  r   )r   r   r   )is_from_unspecialized_param_buffer_sourcerx   r   r   r   r   r|    rz  r|  c                 C   ru  r   )r   r   r   $is_from_flatten_script_object_sourcerx   r   r   r   r   r}    rz  r}  c                 C   ru  r   )r   r0  r   is_from_optimizer_sourcerx   r   r   r   r   r~    rz  r~  c                 C   sr   t | trdS t | trt | jtr| jjdkrdS t | tr-t | jtr-| jjdkr-dS t | tr7t| jS dS )NTr   r   F)	r   r   r  rx   r   r   r   r   is_from_defaultsr   r   r   r   r    s"   




r  c                 C   ru  r   )r   r   r   is_from_skip_guard_sourcerx   r   r   r   r   r    s
   


r  )F)xr   r   enumrI   collections.abcr   typingr   r   r   r   rL  r   ri  torch._guardsr   r	   r
   r   r   r   r   bytecode_transformationr   r   r   r/   r   r8   LOCAL_SPECIALIZED_NN_MODULErk   GLOBAL_SPECIALIZED_NN_MODULELOCAL_UNSPECIALIZED_NN_MODULEGLOBAL_UNSPECIALIZED_NN_MODULE%LOCAL_UNSPECIALIZED_BUILTIN_NN_MODULE&GLOBAL_UNSPECIALIZED_BUILTIN_NN_MODULELOCAL_FSDP_MODULEGLOBAL_FSDP_MODULEr   r3  r5  r7  rF   r   r&   r    r(   r*   rK   rR   rV   ra   rn   rv   r~   r   r   r   r   r   r   r   r   r   r   r   r   Enumr   r   r   r   r   r   r   r   r   r   r   r  r  r  r!  r#  r'  r)  r+  r-  r0  r1  r2  r4  r6  r9  r>  rR  rT  r   r\  r_  rb  rc  rd  rf  rj  ro  rq  rs  rr  rt  rv  rx  	lru_cachery  r{  r|  r}  r~  r  r  r   r   r   r   <module>   s   


	&	$$"()
	
	



