U
    zh@                    @  s`  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	mZmZ d dlmZmZmZmZmZmZmZmZmZmZ d dlm Z  zd dl!Z"W n e#k
r   dZ"Y nX d dl$Z$d dl%Z$d dl&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d d	l5m6Z6m7Z7m8Z8 d d
l9m:Z:m;Z; d dl<m=Z= ddl>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZ ddlm[Z[m\Z\m]Z]m^Z^m_Z_ ddl`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZj ernd dlkmlZl emenZoe$jpqendZre$jpqendZse$jpqendZte$jpqendZue$jvjwjxjyZye$jvjwjxjzZze$jvjwjxj{Z{e$jvjwjxj|Z|e$jvjwjxj}Z}e$jvjwjxj~Z~e$jvjwjxjZe$jvjwjxjZG dd dZdd Zeddd Ze{ezejjefe|dd ejeieje"dkrbdne"jedeje$j`je$jee$je$e	d Zejdd! d"krz d dlZd#d$d%d&d'Zd(ZW n ek
r   d)ZY nX nd(Zd#d$d%d*d'Zd+d, Zd-d. Zd$d/d$d0d1d2Zd3d/d4d5d6d7Zd8d9 Zd:d; Zd<d= Zd>d? Zejd(d@G dAdB dBZdCdD ZdEdF ZejG dGdH dHZG dIdJ dJejZG dKdL dLe/ZG dMdN dNZdOdP ZG dQdR dRZG dSdT dTZdUdVdWdXZdYdZ Zd[d\ Zd]d^ Zd_d`dad$dbdcddZded4dfdgdhZd_d`dadidjdkdldmZeDe dndo Zdpdq Zd drdsdtZdS )u    )annotationsN)currentframegetframeinfo)
AnyCallableDictListOptionalSetTupleTypeTYPE_CHECKINGUnion)ReferenceType)$is_from_flatten_script_object_sourceis_from_local_sourceis_from_optimizer_sourceTensorPropertyTensorPropertySource)DuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSource)
structured)EqualityConstraintis_symbolicSYMPY_INTERP)format_framereport_compile_source_on_error)TensorWeakRef   )configconvert_frameexcmutation_guard)set_guard_error_hook)
AttrSourceChainedSourceConstDictKeySourceDefaultsSourceFlattenScriptObjectSourceFSDPNNModuleSourceGetItemSourceGlobalSourceGlobalStateSourceGlobalWeakRefSource
GradSourceLocalSourceNNModuleSourceNotNNModuleSourceNumpyTensorSourceODictGetItemSourceOptimizerSourceScriptObjectQualifiedNameSourceShapeEnvSourceTupleIteratorGetItemSource
TypeSource)
CacheEntry
ExtraStateGuardedCode	GuardFailGuardFn)
common_constant_typesdict_keys_reprguard_failuresistype	key_is_id	key_to_idorig_code_maptensor_always_has_static_shapetuple_iterator_getitemtuple_iterator_len)Symbolguards
recompilesrecompiles_verboseZverbose_guardsc                   @  sR   e Zd ZdZdd Zdd ZdddZd	d
 Zdd Zdd Z	dd Z
dd ZdS )GuardManagera  
    A helper class that contains the root guard manager. An instance of this
    class is stored in the Dynamo cache entry, so that the cache entry can
    access the RootGuardManager stored in the "root" attribute and directly call
    the check_nopybind from C++.
    c                 C  sH   t  | _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
g | _d S N)RootGuardManagerrootclosure_varsargs
code_partsverbose_code_partsglobal_scopeguard_fail_fncache_entryextra_stateid_matched_objsno_tensor_aliasing_sourcesself r`   F/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/guards.py__init__   s    zGuardManager.__init__c                   s&   |j j | } fdd|D }|S )Nc                   s   g | ]} d  | qS )z: r`   ).0partZ
guard_namer`   ra   
<listcomp>   s     z0GuardManager.get_guard_lines.<locals>.<listcomp>)	__class____name__rW   )r_   guardpartsr`   re   ra   get_guard_lines   s    zGuardManager.get_guard_linesNc                 C  s0   |  }|jj}|d | }|r,|d| 7 }|S )Nz	: source=, )
get_sourcerg   rh   )r_   guard_managerZaccessor_strsourcetsr`   r`   ra   get_manager_line   s    zGuardManager.get_manager_linec              
   C  s   t |  D ]|\}\}}|d|  | R |r\|d| |  | || |r|d| |  | || W 5 Q R X qd S )NzKeyValueManager pair at index=zKeyManager: zValueManager: )sortedZget_key_value_managersitems	writelineindentrr   construct_manager_string)r_   mgrbodyidxZkey_mgrZval_mgrr`   r`   ra   construct_dict_manager_string   s    
z*GuardManager.construct_dict_manager_stringc              
   C  s   |  ~ | D ]}|| | qt|tr>| || t| |	 D ]0\}}|
| |d|   | || qPW 5 Q R X d S )Nzaccessed_by=)rv   Zget_leaf_guards
writelinesrk   
isinstanceDictGuardManagerr{   zipZget_accessorsZget_child_managersru   rr   reprrw   )r_   rx   ry   ri   accessorZ	child_mgrr`   r`   ra   rw      s    

 z%GuardManager.construct_manager_stringc                 C  s   ddl m} G dd d|}| }d|_|jddd |jd	dd |d
 | | j| | j D ]}|| | qf|	 S )Nr   IndentedBufferc                      s&   e Zd Zdd Zd fdd	Z  ZS )z6GuardManager.__str__.<locals>.IndentedBufferWithPrefixc                 S  s   d| j | j  S )Nz| )_indenttabwidthr^   r`   r`   ra   prefix   s    z=GuardManager.__str__.<locals>.IndentedBufferWithPrefix.prefixFc                   s&   |rt  | nt  d|  d S )Nz+- )superru   )r_   lineskip_prefixrg   r`   ra   ru      s    z@GuardManager.__str__.<locals>.IndentedBufferWithPrefix.writeline)F)rh   
__module____qualname__r   ru   __classcell__r`   r`   r   ra   IndentedBufferWithPrefix   s   r   r"    T)r   zTREE_GUARD_MANAGER:rR   )
torch._inductor.utilsr   r   ru   rw   rS   Zget_epilogue_lambda_guardsr|   rk   getvalue)r_   r   r   ry   ri   r`   r`   ra   __str__   s    

zGuardManager.__str__c                 C  s   | j |S rQ   )rS   checkr_   xr`   r`   ra   r      s    zGuardManager.checkc                 C  s   | j |S rQ   )rS   check_verboser   r`   r`   ra   r      s    zGuardManager.check_verbose)N)rh   r   r   __doc__rb   rk   rr   r{   rw   r   r   r   r`   r`   r`   ra   rP      s   
rP   c                 C  s    t | tjtjfrt| S | S rQ   )r}   npZgenericZndarraytorch	as_tensor)ar`   r`   ra   
from_numpy   s    r   c                  C  s    dd l } | jjg}dd |D S )Nr   c                 S  s   h | ]}t |qS r`   )inspectgetfile)rc   mr`   r`   ra   	<setcomp>   s     z&uninteresting_files.<locals>.<setcomp>)Ztorch._dynamo.external_utils_dynamoZexternal_utils)r   Zmodsr`   r`   ra   uninteresting_files   s    r   c                 C  s   | |kS rQ   r`   )r   br`   r`   ra   <lambda>       r   inf)Z___check_type_idZ___check_obj_idZ___odict_getitemZ___key_to_idZ___dict_versionZ___dict_containsZ___tuple_iterator_lenZ___tuple_iterator_getitem__math_isnan__numpy_isnanr   Z__load_moduleZutils_devicedeviceZ___from_numpyZ___as_tensorr   r      )      ast.ASTstrnodereturnc                 C  s   t | ddS N
r   )
astunparseunparsereplacer   r`   r`   ra   _ast_unparse  s    r   TFc                 C  s   t | ddS r   )astr   r   r   r`   r`   ra   r     s    c                 C  sb   t d}d}| D ]F}|dkr$d}q|dkrP|rX|dkrX||rXt|  S q||7 }qt| S )z
    "___odict_getitem(a, 1)" => "a"
    "a.layers[slice(2)][0]._xyz" ==> "a"
    "getattr(a.layers[slice(2)][0]._abc, '0')" ==> "a"
    "getattr(getattr(a.x[3], '0'), '3')" ==> "a"
    "a.layers[slice(None, -1, None)][0]._xyz" ==> "a"
    z[A-Za-z_].*r   z (z),[]None)recompilematchstrip_function_callstrip_getattr_getitem)nameZ
valid_namecurrcharr`   r`   ra   r   "  s    	

r   c                 C  s   t d| d S )z*
    "a[1]" => "a"
    "a.foo" => "a"
    z[.\[]r   )r   split)r   r`   r`   ra   r   9  s    r   r   )	code_partri   r   c                 C  sj   d}|j r>t|j D ]&}|jt krdt|dd } q\qn|jr\dt|j d  }| d| S )Nr   z  # T)r   z<60)
user_stackreversedfilenamer   r   stacksummary)r   ri   extrafsr`   r`   ra   get_verbose_code_partA  s    r   zUnion[str | List[str]]	List[str])rV   ri   r   c                   s"   t | ts| g}  fdd| D S )Nc                   s   g | ]}t | qS r`   )r   )rc   r   ri   r`   ra   rf   S  s     z*get_verbose_code_parts.<locals>.<listcomp>)r}   list)rV   ri   r`   r   ra   get_verbose_code_partsN  s    
r   c                 C  sF   g }| D ]8}t |s || qt|tjs0t||j  q|S rQ   )r   appendr}   r   ZSymIntAssertionErrorr   Zmaybe_as_int)Zsize_or_strideZ	converteddimr`   r`   ra   convert_to_concrete_valuesV  s    r   c           
      C  sx   t | }tj| tj B tj  }| j}| jj}| j	}d| d|j
 d| d| d| d| d| d| d}	|	S )Nzcheck_tensor(rl   z	, device=z, requires_grad=z, size=z	, stride=))typer   _CZ_dispatch_keysZ_dispatch_tls_local_include_setZ_dispatch_tls_local_exclude_setdtyper   indexrequires_gradr   )
valuer   sizesstridesZpytypeZdispatch_keyr   Zdevice_indexr   Z	guard_strr`   r`   ra   get_tensor_guard_code_parta  s    6r   c                 C  s   t |  |S rQ   )r   keysr   )dctkeyr`   r`   ra   get_key_indexp  s    r   c                 C  s   d|  d| dS )Nlist(	.keys())[]r`   )ro   r   r`   r`   ra   get_key_index_sourcet  s    r   )frozenc                   @  s2   e Zd ZU dZded< dZded< dZded< dS )NNModuleAttrAccessorInfoFboolpresent_in_generic_dictNzOptional[str]l1_keyl2_key)rh   r   r   r   __annotations__r   r   r`   r`   r`   ra   r   x  s   
r   c                 C  s   | j  }|  }t| jtr(| jj}nt|ts6tt|| j}t||}t	|
 | }	t|	ttfr|| d|	d}
n| d| d}
t| jts|j||| jtjd| j| d|	g |j||
||dS )N[r   r   ro   example_valueguard_manager_enum == )baser   r}   r   r*   dictr   r   r   r   r   intr   get_key_managerGuardManagerTypeGUARD_MANAGERadd_equals_match_guardget_value_manager)ro   base_guard_managerbase_example_valuer   r   base_source_namesource_namer   
key_sourceZkey_example_valuevalue_sourcer`   r`   ra   getitem_on_dict_manager  s6    


 	r  c                 C  s   | j }| ot|t S rQ   )originating_sourceZis_dict_keyr}   r2   )ri   ro   r`   r`   ra   match_on_id_for_tensor  s    r  c                   @  s   e Zd ZU ded< ded< dS )GuardCodeListr   	code_listr   ri   Nrh   r   r   r   r`   r`   r`   ra   r    s   
r  c                   @  s   e Zd ZdZdZdZdS )r   r"   r   r   N)rh   r   r   r   DICT_GUARD_MANAGERDICT_SUBCLASS_GUARD_MANAGERr`   r`   r`   ra   r     s   r   c                   @  sx  e Zd Zdddddddddd	Zd
d Zdd Zdd Zdd Zdd Zdd Z	dd Z
dd ZddddZedfdd Zd!d"d#d$d%Zd&d!d'd(d)Zdd!d*d+d,Zddd-d.Zdxdd0d'd1d2Zdd0d'd3d4Zddd5d6Zdd!d7d8d9d:Zddd;d<Zddd=d>Zdyddd?d@ZdddAdBZdddCdDZdddEdFZdddGdHZdddIdJZdddKdLZdddMdNZ dddOdPZ!dddQdRZ"dddSdTZ#dddUdVZ$dWdX Z%dYdZ Z&d[d\ Z'd]d^ Z(d_d` Z)dadb Z*dcdd Z+dddedfZ,dddgdhZ-dddidjZ.dddkdlZ/dddmdnZ0dddodpZ1dzdddqdrZ2d{dtduZ3d|dvdwZ4d/S )}GuardBuilderzCallable[[Any], str]zCallable[[Source], str]z)Callable[[object], ReferenceType[object]]Dict[str, object]zOptional[GuardManager]CheckFunctionManager)id_ref
source_reflookup_weakrefslocal_scoperX   rn   check_fn_managerc                 C  s   || _ || _|| _||d| _tj | jd< tjj	j
 D ]<\}}	|dddddd}|	| jd |< |	| j|< q<|| _g | _g | _g | _g | _g | _g | _g | _|| _t | _| jjjD ]}
| jt| |
 qi | _i | _d S )NLG__builtins__>_<.Z_dot_)r  r  r  scopebuiltins__dict__copyr   packageZpackage_importerZ_package_imported_modulesrt   r   rn   argnamescodeshape_env_codetensor_check_namestensor_check_examplestensor_check_guardstensor_check_guard_managersr  setkey_order_guarded_dict_idsoutput_graphZguard_on_key_orderaddidgetr\   _cached_guard_managers)r_   r  r  r  r  rX   rn   r  r   Zpackage_moduler   r`   r`   ra   rb     s6    
zGuardBuilder.__init__c           	      C  s   |  |}t|tr$td|j |j }| D ]D}|| }t|j|d}| ||}|j	|| d|d||d q6d S )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )r   r   r   r   ro   r   r   )
get_guard_managerr}   r~   NotImplementedErrorr   r  r   r.   get_guard_manager_typedict_getitem_manager)	r_   r   ri   dict_mgrZdict_sourcer   r   r  r   r`   r`   ra   #guard_on_dict_keys_and_ignore_order	  s&    



 z0GuardBuilder.guard_on_dict_keys_and_ignore_orderc           	   
   C  s   |  |}t|ts$td|j t|ts2tt| D ]x\}}t|j|}|j	|||t
jd}t|r| |}||td| d| d| q>||t| d|| q>d S )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for r   z__check_obj_id(rl   r   r   )r.  r}   r~   r/  r   r   	enumerater   r   r   r   r   rF   r  add_id_match_guardr   r   )	r_   r   ri   r2  rz   r   r   Zkey_managerid_valr`   r`   ra   guard_on_dict_keys_and_order   s6    



  z)GuardBuilder.guard_on_dict_keys_and_orderc                   s   fdd}|j }	|j}
t }t|jD ]}||j  q*tddd}|	|
krbtd|	d}nld|
kr|	|
d krtdd|	}nJd|
kr|	|
d krtdd|	}n(|	|krd|
kr|	|
d krtdd|	}|j	s|j
|j |||d	S |jst|j}|j | d
}d }}d }}d }} rdt|j|}| }|
| }| ||}|}|}| ||}n|}|}| ||}|j||
tjd}|||||
||d} r|| ||||dS |S dS )a(  
        This tries to avoid calling the expensive nn module custom getattr method by
        checking if the attribute is accessible via __dict__. For attributes that
        are not accessible via __dict__ (like descriptors), we fallback to
        PyObject_GetAttr.

        There are two cases that we optimize for
        1) attributes present directly in __dict__, e.g training.
        2) parameters/buffers/modules - they can be accessed via _parameters,
        _buffers, _modules keys in __dict__. For example, mod.linear can be
        accessed as mod.__dict__["_parameters"]["linear"]

        The most common and expensive case for nn module guards is of type
        mod.submod1.submod2.submod3.training. We avoid the python getattr of nn
        modules by going through the __dict__.
        c                   sv   t | tr`t||}d| d|d}| j|||tjd | d g | j||||dS | j||||dS d S )Nr   r   r   r   r   r-  )	r}   r~   r   r   r   r   r   r   r1  )rx   r   r   r   r   r   r   r   r   r`   ra   getitem_on_dict_mgr]  s0    

 z>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrFNT_parameters_buffersZ_modulesattrro   r   r   	.__dict__ro   r   r   )rx   r   r   r   r   r   )memberr  r&  r   getmrorg   updater   r   r   getattr_managerr   r   r   r(   r   r   r0  get_generic_dict_managerr   r   )r_   ro   r   r   r   r   r   r   r9  	attr_namemod_dictZall_class_attribute_namesr   Zaccessor_infor   mod_dict_sourceZl1_source_nameZl2_source_nameZl1_valueZl2_valueZl1_guard_manager_enumZl2_guard_manager_enumZ	l1_sourcemod_generic_dict_managerZl1_mgrr`   r8  ra   getattr_on_nn_moduleB  s     


  	z!GuardBuilder.getattr_on_nn_modulec                 C  s,   |  }|dkrdS t| |}|| jkS )Nr   F)r   r*  r+  r'  )r_   ro   r   obj_idr`   r`   ra   requires_key_order_guarding  s
    z(GuardBuilder.requires_key_order_guardingc                 C  sD   t j}| |r@t|tstt|jti jkr:t j}nt j	}|S rQ   )
r   r   rK  r}   r   r   r   r   r  r	  )r_   ro   r   r   r`   r`   ra   r0    s    
z#GuardBuilder.get_guard_manager_typec                 C  s   |t jkp|t jkS rQ   )r   r  r	  )r_   Zmgr_enumr`   r`   ra   manager_guards_on_keys  s    
z#GuardBuilder.manager_guards_on_keysc                 C  s.   | j s
t| j jj| jd d| jd tjdS )Nr  )	f_globalsro   r   r   )rn   r   rS   Zglobals_dict_managerr  r   r   r^   r`   r`   ra   get_global_guard_manager  s    
z%GuardBuilder.get_global_guard_managerc              	   C  s  | j s
t| j j}d }| }|dkr:|| jkr:| j| S |dkrL| |}| ||}d }d }d }tj}	t	|t
r|j }| |}| |j}| |j|}	t|tr|j|j|||d}
nDt|tr|  j|j|||d}
nt|tr|  j|j|||d}
nt|tr"|S t|tr2|S t|tr\|sHt|j|||d}
nt|ttttfr|szt|}
nt|tr|st|j|||d}
n\t|t r|stt	|t!j"j#r| $|||||||}
n|j%|j&|||d}
nt|t'r|stt	|t(t)j*frt	|t+rX| ,|	sFtt-|||||}
n*t	|j.t/rnt0d|j|j.|||d}
n|t	|t1r|j2s|j3|j.|||d}
nRt	|t4r|j2s|j5|j.|||d}
n(|j.}|j2r|6 }|j7||||d}
nt|t8r`t	|t+r>| ,|	s,tt-|||||}
n|sHt|j|j.|||d}
nt|t9r|svtt:|st|j;s|j<||j=tjdj7|j>|||d}
nR|j?}|d k	st|d }|j@||tjd}t	|t+rt|j|j>|||d}
n t|tAr2|st|jBtC|||d}
nt|tDr`|sHt|jBd	d
 |||d}
nt|tEr|svt|jBdd
 |||d}
nzt|tFr|st|jG|j.|||d}
nNt	|t/rt	|t+std|jH|j.|||d}
ntd| d|  |
| j| < |
S )Nr   r-  )global_namero   r   r   r?  r<  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_orderz.__kwdefaults__)Zpython_lambdaro   r   r   c                 S  s   |   S rQ   )Z__obj_flatten__r   r`   r`   ra   r     r   z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>c                 S  s   |    S rQ   )_typeZqualified_namerP  r`   r`   ra   r     r   r   z4ConstDictKeySource can only work on DictGuardManagerzmissing guard manager builder z - )Irn   r   rS   r   r,  r+  r0  r   r   r}   r)   r   get_guard_manager_from_sourcerE   r3   r1  
local_namer/   rN  rO  r1   Zglobal_weakref_managerr0   r:   r<   Ztype_managerr8   r4   r5   r-   r2   Zgrad_managerr(   r   nnModulerI  rC  r@  r.   r   collectionsOrderedDictr~   rL  r  r   r*   RuntimeErrorr   Zindex_is_sliceZlist_getitem_managertupleZtuple_getitem_managerZunpack_sliceZgetitem_managerr7   r+   callableZis_kwZfunc_defaults_manager__defaults__Zidx_key__kwdefaults__Zfunc_kwdefaults_managerr6   Zlambda_managerr   r,   r9   r;   Ztuple_iterator_getitem_managerr   )r_   ro   Zroot_guard_managerr   r   r   r   r   r   Zbase_guard_manager_enumoutr   
kwdefaultsZ	kw_sourcer2  r`   r`   ra   rR    s   





 























z*GuardBuilder.get_guard_manager_from_sourcer   r   c                 C  s   |  |jS rQ   )rR  r  r_   ri   r`   r`   ra   r.    s    zGuardBuilder.get_guard_managerTc                 C  s   d | }t||\}}t }d| jd i}	t||	| |d |  }
| jsVt|rl| jj	
|
| n| jj	|
| d S )Nrl   r  ___make_guard_fn)joinr   build_guard_functionr   r  execvaluesrn   r   rS   Zadd_epilogue_lambda_guardadd_lambda_guard)r_   rV   rW   rT   Zis_epiloguemake_guard_fn_args
guard_bodypycoder]  globals_for_guard_fnguard_fnr`   r`   ra   $add_python_lambda_leaf_guard_to_root  s    

 z1GuardBuilder.add_python_lambda_leaf_guard_to_rootr   r   )r   r   c                 C  s   t || jtS rQ   )evalr  CLOSURE_VARS)r_   r   r`   r`   ra   r+    s    zGuardBuilder.getzUnion[str, Guard])ri   r   c                 C  s`   t |tr|}n|j}tt|}|| jkr\td|r\td|rPt	d| | j
| |S )Nz[a-zA-Z0-9_]+z^\d+$zinvalid var name: %s)r}   r   r   r   r   r  r   r   logwarningr   )r_   ri   r   r   r`   r`   ra   arg_ref%  s    

zGuardBuilder.arg_ref)ri   rE  c                 C  s.   t |j|}t|||j|jd}||  d S )N)r   r   )r(   r  r   r   r   create)r_   ri   rE  rj  Zattr_sourceZ	new_guardr`   r`   ra   _guard_on_attribute4  s       z GuardBuilder._guard_on_attributec              	   C  sF  |j }t|tr|j}t|ts0td|j |j}| }|j}| |}t	| 
||}d }|rzd| d|d}nd| d|d}| j||g| 
|d tjr4| |}	|r | 
| }
| 
|}| ||
}t|tjjr
| ||	||
|| |S |	j||j|
|d n|	|t|| n| ||g d S )Nzinvalid source hasattr(rl   r   znot hasattr()provided_guarded_objectr<  )r  r}   r4   r   r(   r   r   r@  rp  hasattrr+  _set_guard_export_infor#   enable_cpp_guard_managerrR  r0  r   rT  rU  rI  rC  add_no_hasattr_guardr   _produce_guard_code)r_   ri   ro   Zbase_sourcer   r=  refvalr   base_managerr   r   r   r`   r`   ra   HASATTR=  sZ    

  


 zGuardBuilder.HASATTRNr   c           	      C  s   |d k	st | |}| |j}t|tjjs4t | |}|j d}|j	||j
tjd}d|d| d}|d|t|| d S )Nr>  r?  znot ___dict_contains(rl   z
.__dict__)F)r   rp  r+  r   r}   r   rT  rU  r.  rD  r  r   r   add_dict_contains_guardr   )	r_   ri   r=  rz  r{  r|  rG  rH  r   r`   r`   ra   NOT_PRESENT_IN_GENERIC_DICTt  s"    

  z(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICTc                 C  sr   t | |j}| |}d| | d| d}| ||g tjr`| |	|t
|| n| ||g d S )N___check_type_id(rl   r   )r   r+  r   r  rp  rv  r#   rw  r.  Zadd_type_match_guardr   ry  )r_   ri   rp   rJ  r   r`   r`   ra   
TYPE_MATCH  s    

 zGuardBuilder.TYPE_MATCHc                 C  sv   |  |}| |j}t| |j}d| d| }| ||g tjrd| ||t	|| n| 
||g d S )Nz___dict_version() == )rp  r+  r   dict_versionrv  r#   rw  r.  Zadd_dict_version_guardr   ry  )r_   ri   rz  r{  versionr   r`   r`   ra   DICT_VERSION  s    

 zGuardBuilder.DICT_VERSIONr   )ri   r   invertc                 C  sp   |  |}|rdnd}| d|d| d}| ||g tjr^| || |t|| n| ||g d S )Nnot r   z___dict_contains(rl   r   )rp  rv  r#   rw  r.  r~  r   ry  )r_   ri   r   r  Zdict_refZ	maybe_notr   r`   r`   ra   DICT_CONTAINS  s    

  zGuardBuilder.DICT_CONTAINSc                 C  sF   |  |}d| }| ||g tjr4| | n| ||g d S )Nr  )rp  rv  r#   rw  r.  ry  )r_   ri   rz  r   r`   r`   ra   
BOOL_FALSE  s    

zGuardBuilder.BOOL_FALSEc                 C  s   t |jtr"| t|jjtjS | |}| |j	}| 
|}d| d| d}| ||g tjr| ||t|| n| ||g t |jtrt |tjjr|jj}| |}|d k	r|| j|< d S )Nz___check_obj_id(rl   r   )r}   r  r<   r  r   r   r
  rp  r+  r   r  rv  r#   rw  r.  r5  r   ry  r3   r   rT  rU  rS  r  r\   )r_   ri   rz  r{  r6  r   rS  Zweak_idr`   r`   ra   ID_MATCH  s*    


 
zGuardBuilder.ID_MATCHc                 C  sn   |  |}| |j}t|tjs&t| d}| ||g tj	r\| 
|t|| n| ||g d S Nz is not None)rp  r+  r   r}   r   Tensorr   rv  r#   rw  r.  add_not_none_guardr   ry  )r_   ri   r   rz  r{  r   r`   r`   ra   NOT_NONE_MATCH  s    


zGuardBuilder.NOT_NONE_MATCHc                 C  s   |  |dtj d S )Nrh   )rr  r
  EQUALS_MATCHr_  r`   r`   ra   
NAME_MATCH  s    zGuardBuilder.NAME_MATCHc                 C  st   t js| | | |j}| | d|  }| ||g t jrb| |	|t
|| n| ||g d S )Nz.data_ptr() == )r#   rw  r  r+  r   rp  Zdata_ptrrv  r.  Zadd_data_ptr_guardr   ry  )r_   ri   objr   r`   r`   ra   DATA_PTR_MATCH  s    

 zGuardBuilder.DATA_PTR_MATCHc                   sr   t jjj d  g}| ||g tjrbt jj fdd}| jsJt| jj	
|t|| n| || d S )Nz,torch.autograd.forward_ad._current_level == c                   s
   j  kS rQ   )_current_levelrP  Z
dual_level
forward_adr`   ra   fn  s    z#GuardBuilder.DUAL_LEVEL.<locals>.fn)r   Zautogradr  r  rv  r#   rw  rn   r   rS   re  r   ry  )r_   ri   r   r  r`   r  ra   
DUAL_LEVEL  s    

 zGuardBuilder.DUAL_LEVELc                   s   t jj }dd |D d dg}| || tjrtt jjj  fdd}| js\t	| jj
|t|| n| || d S )Nc                 S  s   g | ]}|  qS r`   )Z	get_state)rc   cir`   r`   ra   rf   +  s     z6GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.<listcomp>z5torch._functorch.pyfunctorch.compare_functorch_state(r   c                   s    S rQ   r`   rP  Z
compare_fnZstatesr`   ra   r  3  s    z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn)r   Z
_functorchZpyfunctorchZ#retrieve_all_functorch_interpretersrv  r#   rw  Zcompare_functorch_statern   r   rS   re  r   ry  )r_   ri   Zcisr   r  r`   r  ra   FUNCTORCH_STACK_MATCH'  s    

 z"GuardBuilder.FUNCTORCH_STACK_MATCHc           	        s  |  |}| |j}t|}trTtjtjtjtjtj	tj
tjtjtjtjtjf}nd}ttttttttttjh|B  t|trt fddt| | D st n"t| st dt| d  t|t!rNt"#|rN| $| t }|%d| d | &|| t'j(r>| )|*t+d t,|| n| -|| d S t|t.rt#|r| $| t }|%d	| d | &|| t'j(r| )|*t+d
 t,|| n| -|| d S t'j(r
| d|g}| )|/|t,|| | &|| d S t }t|ttfrh| 0| t1|D ]2\}}|%d| d| d| 2t| d q2n
| $| t|tjrt|}t|t3j4rt |%| d| | -|| | &|| d S )Nr`   c                 3  s   | ]}t | V  qd S rQ   )rE   )rc   r   Zok_typesr`   ra   	<genexpr>`  s    z,GuardBuilder.EQUALS_MATCH.<locals>.<genexpr>zUnexpected type z	, not in z__math_isnan(r   r   z__numpy_isnan(r   r   r  r   z], )5rp  r+  r   r   r   Zint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64Zfloat16Zfloat32Zfloat64rY  rB   r   r&  	frozensetsliceranger   SizerE   r   all	itertoolschainr   rd  r   floatmathisnanr  r   rv  r#   rw  r.  re  rm  r   ry  complexr   SEQUENCE_LENGTHr4  r  typesCodeType)	r_   ri   rz  r{  rp   Znp_typesr   rz   elemr`   r  ra   r  =  s    
	


 

 
 
 

zGuardBuilder.EQUALS_MATCHc                 C  s<   |  |j}t|ttd tjfr.| | n
| | d S rQ   )	r+  r   rE   r   r   r  r  r  r  r_   ri   r{  r`   r`   ra   CONSTANT_MATCH  s    zGuardBuilder.CONSTANT_MATCHc                 C  sZ   |  | | |j}t|drBt|jts0t| |dt	j
 ntdt|  d S )Ntrainingz$Guard setup for uninitialized class )r  r+  r   ru  rE   r  r   r   rr  r
  r  r%   Zunimplementedr   r  r`   r`   ra   	NN_MODULE  s    

zGuardBuilder.NN_MODULEc                 C  s
   |  |S )z0things like torch.add and user defined functions)r  r_  r`   r`   ra   FUNCTION_MATCH  s    zGuardBuilder.FUNCTION_MATCHc                 C  sT   |  |j}t|tjkrFt|drF| |dtj | |dtj	 n
| 	| dS )z!matches a closure by __code__ id.__code__N)
r+  r   r   r  FunctionTyperu  rr  r
  r}  r  r  r`   r`   ra   CLOSURE_MATCH  s
    zGuardBuilder.CLOSURE_MATCHc                 C  s
   |  |S rQ   r  r_  r`   r`   ra   BUILTIN_MATCH  s    zGuardBuilder.BUILTIN_MATCHc                 C  s
   |  |S rQ   r  r_  r`   r`   ra   PYMODULE_MATCH  s    zGuardBuilder.PYMODULE_MATCHc                 C  s   |  |}| |j}t|}| | t }t|dkrL|d|  n|d| dt|  | || t	j
rt|tr| |t|t|| q| |t|t|| n| || d S )Nr   r  zlen(r  )rp  r+  r   r   r  r   lenr   rv  r#   rw  r}   r   r.  Zadd_dict_length_check_guardr   Zadd_length_check_guardry  r_   ri   rz  r   rp   r   r`   r`   ra   r    s(    



 
 zGuardBuilder.SEQUENCE_LENGTHc                 C  s   |  |}| |j}t|}tjs.| | t }|d| dt	|  | 
|| tjrt|}| |}| |t	||t|| n| || d S )Nz___tuple_iterator_len(r  )rp  r+  r   r   r#   rw  r  r   r   rK   rv  r  r.  Zadd_tuple_iterator_length_guardr   ry  )r_   ri   rz  r   rp   r   rJ  r`   r`   ra   TUPLE_ITERATOR_LEN  s"    



  zGuardBuilder.TUPLE_ITERATOR_LENc                 C  s   |  |}|  | }t|js*t|r.d S | d| g}| || tjrpt| || 	|t
|| n| || d S )N is )rp  r   r   r  rv  r#   rw  install_tensor_aliasing_guardr.  rR  r   ry  )r_   ri   source_bZref_aZref_br   r`   r`   ra   DUPLICATE_INPUT  s"    
zGuardBuilder.DUPLICATE_INPUTc                 C  s   |  |}| |j}t|}| | t }tdd | D }tt	|t
|jd}|rv|d| d|  n|d| d|  | || tjr| |jr| || q| || n| || d S )Nc                 s  s   | ]}t |V  qd S rQ   )rF   )rc   kr`   r`   ra   r  "  s     z)GuardBuilder.DICT_KEYS.<locals>.<genexpr>)localz___key_to_id(r  r   .keys()) == )rp  r+  r   r   r  r   anyr   rC   rG   r   r  r   rv  r#   rw  rK  r7  r3  ry  )r_   ri   rz  r   rp   r   Zany_key_is_idZconst_keys_reprr`   r`   ra   	DICT_KEYS  s&    

zGuardBuilder.DICT_KEYSc                 C  sL   |  | dg}| || tjr<| |t|| n| || d S r  )rp  rv  r#   rw  r.  r  r   ry  )r_   ri   r   r`   r`   ra   WEAKREF_ALIVE5  s    
zGuardBuilder.WEAKREF_ALIVEc                   s   |  |}| |j}t|}dd | D  | | t }|d| d  | || t	j
r fdd}| ||t|| n| || d S )Nc                 S  s   h | ]\}}|qS r`   r`   rc   r  vr`   r`   ra   r   D  s     z5GuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.<setcomp>z{k for k, v in z.named_parameters()} == c                   s   dd |   D  kS )Nc                 S  s   h | ]\}}|qS r`   r`   r  r`   r`   ra   r   P  s     zAGuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.fn.<locals>.<setcomp>)named_parametersrP  r   r`   ra   r  O  s    z.GuardBuilder.NN_MODULE_PARAM_NAMES.<locals>.fn)rp  r+  r   r   r  r  r   r   rv  r#   rw  r.  re  r   ry  )r_   ri   rz  r   rp   r   r  r`   r  ra   NN_MODULE_PARAM_NAMES@  s    


 z"GuardBuilder.NN_MODULE_PARAM_NAMESc                 C  s   |  |}| |j}t|}tjs.| | t }|d| dt|	  | 
|| tjr| |jr~| || q| || n| || dS )zConstant keys matchr   r  N)rp  r+  r   r   r#   rw  r  r   r   r   rv  rK  r  r7  r3  ry  r  r`   r`   ra   DICT_CONST_KEYSX  s    

zGuardBuilder.DICT_CONST_KEYSc                 C  s   t | |j| j d S rQ   )r&   watchr+  r   r  r_  r`   r`   ra   OBJECT_MUTATIONn  s    zGuardBuilder.OBJECT_MUTATIONc                 C  s   d S rQ   r`   r_  r`   r`   ra   	GRAD_MODEq  s    zGuardBuilder.GRAD_MODEc                 C  s   d S rQ   r`   r_  r`   r`   ra   DETERMINISTIC_ALGORITHMSt  s    z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  s   d S rQ   r`   r_  r`   r`   ra   TORCH_FUNCTION_STATEw  s    z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  sj   |j tjkstddlm  m} d|jg}| || t	j
rZ| |t|| n| || dS )z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )ro   r   GLOBALr   torch.utils._deviceutils_deviceZCURRENT_DEVICErv  r#   rw  r.  Zadd_default_device_guardr   ry  )r_   ri   r   r   r`   r`   ra   DEFAULT_DEVICEz  s    
zGuardBuilder.DEFAULT_DEVICEc              	     sP  |j dkst| jj  j}dd |D } fdd} jrg }g }i } jD ]6}|j jkrztj	j
|| j||| qNtd qNt||t| dd}	nd }	 jjd	d |D d
d |D ||	| j| jjj	 d}
| jjj	s j  |
D ]}| ||g qtjr.|
}| j|t||ttd n|
D ]}| j||gdd q2d S )Nr   c                 S  s   g | ]
}|j qS r`   )Zsymbolic_contextrc   r   r`   r`   ra   rf     s     z*GuardBuilder.SHAPE_ENV.<locals>.<listcomp>c                   s    fddj |  D S )Nc                   s   g | ]}t |tj qS r`   )r   r   ZSIZE)rc   ro   r   r`   ra   rf     s   z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)t_idr   r(  r  ra   get_sources  s    
z+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesz+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsZ	warn_onlyc                 S  s   g | ]
}|j qS r`   )Zfaker  r`   r`   ra   rf     s     c                 S  s   g | ]
}|j qS r`   )ro   r  r`   r`   ra   rf     s     )input_contextsequalities_inputsr  Zignore_static)rT   T)	shape_env)r   r   r  r(  Ztracked_fakesZexport_constraintsr  r  r   exportZdynamic_shapesZ_process_equalitiesr  rn  ro  r   r   rd  Zproduce_guardsr  freezerv  r#   rw  rk  r   r   rm  ry  )r_   ri   r   r  r  r  r  r  
constraintr  rM   Zshape_guardrV   r`   r  ra   	SHAPE_ENV  sb    
	



zGuardBuilder.SHAPE_ENVc              
   C  s  |  r| st|jtr$t|r2| | nNt|trB| }|d k	rN|n
| |j	}t|t
jsjt| |}t }| jjjr| | ddddg}|D ]d}| |d | }t|t
jt
jfr|d| d| dt| q|| d| d|  qn| j| | j| | j| tjr| |}| j| | jj}	|	j|j }
t |
d	 }t |
d
 }t!t"|||||}|#||||| |j$d k	stt%|d|j$d\}}|sRt&|dr|j'}d| d| d| d}|| tjrR| |(|t!|| n6d| d}|| tjrR| |)dt!|| t*|dkr| +|| tjs| ,|| d S )Nr   r   r   zndimension()r  zstr(r  r   sizestrideT)Z	is_tensorguard_source_dynamo_dynamic_indicesz((z"._dynamo_dynamic_indices.issubset(z)) if hasattr(z', '_dynamo_dynamic_indices') else True)rs  z%, '_dynamo_dynamic_indices') == Falser   )-is_nn_moduleZis_fsdp_moduler}   r  r6   r  r  r!   r+  r   r   r  r   rp  r   r  r(  r  r  rE   r   r   r   r   r#  r"  r$  r#   rw  r.  r%  input_source_to_sizes_stridesr   r   r   Zadd_tensor_match_guardro   rI   ru  r  Zadd_dynamic_indices_guardrx  r  rv  ry  )r_   ri   r   Ztensor_namer   Ztermsterm
real_valuern   r(  metadatar  r  rW   ZstaticreasonZdynamic_indicesr   r`   r`   ra   TENSOR_MATCH  s    




"
$  


 


zGuardBuilder.TENSOR_MATCHFc                 C  s8   t jr
t|r"| jt|| n| jt|| d S rQ   )r#   rw  r   r!  r   r  r   )r_   ri   r  r  r`   r`   ra   ry  k  s    
z GuardBuilder._produce_guard_codec                 C  s   t  }|d k	st|j}~|d k	s&tt|d }~|t| jksPtd| |d kr|jd k	oj|jdk}|r|| |jnd }n|}|d k	rt	t
|nd }	d }
t|jdrt|tjst	|}
|||	||
 d S )Nr   zH_produce_guard_code must be called from inside GuardedCode. Called from r   __weakref__)r   r   f_backr   dirrg   r   r+  weakrefrz  r   ru  r}   enumEnumZset_export_info)r_   ri   r  rt  Z	cur_frameZcaller	func_nameZ
name_validZguarded_objectZguarded_object_typeZobj_refr`   r`   ra   rv  s  s<     
z#GuardBuilder._set_guard_export_info)N)N)N)F)N)5rh   r   r   rb   r3  r7  rI  rK  r0  rL  rN  rR  r.  rm  rk  r+  rp  rr  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ry  rv  r`   r`   r`   ra   r
    sn   I" 	  
!	7!q	
K 
r
  c                   @  s   e Zd ZdZejejejfZe	j
G dd dZG dd dejZG dd dejZdd	d
dZddddddZdddddZdddddZdS )PyExprCSEPassr"   c                   @  s   e Zd ZU ded< ded< dS )PyExprCSEPass.ConfigzDict[str, int]
expr_countzDict[str, str]expr_to_nameNr  r`   r`   r`   ra   Config  s   
r  c                      s4   e Zd ZdddddZddd fd	d
Z  ZS )zPyExprCSEPass.ExprCounterr  r   )r#   r   c                 C  s
   || _ d S rQ   )_config)r_   r#   r`   r`   ra   rb     s    z"PyExprCSEPass.ExprCounter.__init__r   r   r   c                   s4   t |tjr$| jjt|  d7  < t | d S Nr"   )r}   r  ALLOWED_NODE_TYPESr  r  r   r   visit)r_   r   r   r`   ra   r    s    zPyExprCSEPass.ExprCounter.visitrh   r   r   rb   r  r   r`   r`   r   ra   ExprCounter  s   r   c                      s:   e Zd Zdddd fddZddd	 fd
dZ  ZS )zPyExprCSEPass.Replacerr  zCallable[[], str]r   )r#   gen_namer   c                   s    t    || _|| _g | _d S rQ   )r   rb   r  	_gen_namepreface)r_   r#   r  r   r`   ra   rb     s    
zPyExprCSEPass.Replacer.__init__r   r   r   c                   s   t |tjrt|}| jj| tjkr|| jjkrrt 	|}t|}| 
 }| j| d|  || jj|< n| jj| }t|t S t 	|S )Nz = )r}   r  r  r   r  r  USE_THRESHOLDr  r   r  r  r  r   r   NameLoad)r_   r   exprZnode_Zexpr_var_namer   r`   ra   r    s    zPyExprCSEPass.Replacer.visitr  r`   r`   r   ra   Replacer  s   
r	  r   r   c                 C  s$   d| _ | jtdd i d| _d S )Nr   c                   S  s   dS )Nr   r`   r`   r`   r`   ra   r     r   z(PyExprCSEPass.__init__.<locals>.<lambda>)r  r  )_counterr  rV  defaultdictr  r^   r`   r`   ra   rb     s
     zPyExprCSEPass.__init___varr   )r   r   c                 C  s    | | j  }|  j d7  _ |S r  )r  )r_   r   r   r`   r`   ra   _new_var  s    zPyExprCSEPass._new_varr   )exprsr   c                 C  sd   |  | j}|D ]N}z|t| W q tk
r\ } ztd|j|  W 5 d }~X Y qX qd S )Nz#Failed to visit expr at line %s.
%s)	r   r  r  r   parseSyntaxErrorrn  	exceptionlineno)r_   r  countereexr`   r`   ra   count  s    zPyExprCSEPass.countTuple[List[str], str]r  r   c                 C  s.   |  | j| j}|t|}|jt|fS rQ   )r	  r  r  r  r   r  r  r   )r_   r  replacernew_noder`   r`   ra   r     s    zPyExprCSEPass.replaceN)r  )rh   r   r   r  r   	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr   NodeTransformerr	  rb   r  r  r   r`   r`   r`   ra   r    s   	%	r  c                 C  s   t | jtptjo| jtjkS rQ   )r}   r  r+   r#   Z guard_nn_modules_using_dict_tagsZ	create_fnr
  r  r   r`   r`   ra   must_add_nn_module_guards  s    
r#  c                   @  s   e Zd ZdS )DeletedGuardFnN)rh   r   r   r`   r`   r`   ra   r$    s   r$  c                   @  s<   e Zd ZdddddZdd Zdd	 Zd
d Zdd ZdS )r  Nz%Optional[Callable[[GuardFail], None]])rY   c                   s@  |r
|j nd }i  _d  _tjr(t  _| _d fdd}t j| j	|j
|j j }dd }t||t|pxg tjdD ]B}tjs| rd|jkrd|jkrtjsd|jkrq|| q ||| _|j j_tjr,tjjd	 fd
dd td j  jst|j j_ j _ j  d  _d S )Nc                   sB   |   }|tjkr|  S  s"t  }|d k	s4t||  S rQ   )r  r   ZCONSTANTr   r   rp  )ro   r  Z	r_builder)	w_builderr`   ra   r  )  s    
z1CheckFunctionManager.__init__.<locals>.source_refc                 S  s   |  }|rd |_ d S rQ   )r  )Zweak_br   r`   r`   ra   cleanup_builder>  s    z6CheckFunctionManager.__init__.<locals>.cleanup_builder)r   r[  r\  hooksZdynamo_cpp_guards_strc                     s
   t  jS rQ   )r   rn   r`   r^   r`   ra   r   b  r   z/CheckFunctionManager.__init__.<locals>.<lambda>Z
payload_fn%s) rM   	_weakrefsrn   r#   rw  rP   r(  r
  r  r  r  rX   r  rz  rs   r   sort_keyZguard_nn_modulesr  r   Zskip_nnmodule_hook_guardsrq  compile_check_fncheck_fnr\   r   _loggingtrace_structured
guards_logdebugr   clear)r_   r(  rY   rM   r  builderr&  ri   r`   )r_   r%  ra   rb     s^    
		
 



zCheckFunctionManager.__init__c           )   
     s&  |j }|dg7 }td g  g g tjrH| js6t| jjdg nd} 	| 	| d! fdd	}t
 }|jD ]2}|jD ]&}	|	|kr||	|jtj ||	 qq~|j}
d }d }|
rtjs|j}| jjrtd|j}g }g }t||D ]:\}}| jj|j }|	t|d  |	t|d	  qt|||d
}|j}|j}d|
dg } 	d| d 	d| d t|
D ]B\}}|| }|| }|| }t||||}|||| dd qt|
dkrtjrt|j |
dd|
 d g | jr| jj!j"j#ng }|D ]t}t$|t%r|j&}|j'}|(  d|(  }tjrxt)|*||*||g ||d tj nt+d| q$|j,D ]$}|jD ]}	||	|jtj qqt-j.j/dfddd t0j1}|d krt02 }|||j|
dt3t4} d|j5d i}!tjrH| js.t| j}"t dkstnt6t7 }#d| 8 }$t9|#|$\}%}&t:j;<dd dkrt=d|% t> }'zt?|&|!|' W n6 t@k
r }( ztABd|(jC|&  W 5 d }(~(X Y nX |'d  | D  }"| |"_E||"_F |"_G|"_H|!|"_I||"_Jd |"_Kd |"_L|
|"_M|"S )"Nz**___kwargs_ignoredzGUARDS:z___check_global_state()Fc                   s   t  }td|  fdd ttjrd}d}d k	r~jrbdd	j
  }jr~dd	j
  }td || |s  | d S )Nr)  c                     s4    j rtj  nd jr,tjnd dS )N)r   r   r   )r   r   from_tracebackr   r   r`   r   ri   r`   ra   r     s    zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>r   z
Stack:
z
User stack:
zGuard: %s%s%s)r   r0  r1  r   verbose_guards_logisEnabledForloggingDEBUGr   ra  formatr   )r   ri   log_onlyZverbose_code_partZmaybe_stackZmaybe_user_stackrV   structured_guard_fnsrW   r5  ra   add_code_part  s.    

z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partz,Illegal to set tensor_check_names in export.r  r  )dynamic_dims_sizesdynamic_dims_stridesrl   z%tensor_check_names=tensor_check_namesz___check_tensors(r   T)r;  r"   zcheck_no_aliasing(r  zUnknown GuardEnvExpr: dynamo_guardsc                     s   dd  D S )Nc                 S  s   g | ]
}| qS r`   r`   )rc   fr`   r`   ra   rf   	  s     zKCheckFunctionManager.compile_check_fn.<locals>.<lambda>.<locals>.<listcomp>r`   r`   )r=  r`   ra   r   	  r   z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>r(  )___check_tensors___check_tensors_verboseZ___check_global_stater"  r  r   ZTORCHDYNAMO_PRINT_GUARDS1zGUARDS
z#Failed to exec guard at line %s.
%sr`  )F)Nr  r0  r1  r#   rw  rn   r   rS   Zadd_global_state_guardr   r&  r   r  ri   r)  r"  r$  r(  r  r#  r   r  r  r   TensorGuardsr   r   ra  r4  r   r   install_no_tensor_aliasing_guardr%  Ztracing_contextguards_contextaotautograd_guardsr}   r   Zinput_source_aZinput_source_br   r  rR  rX  r!  r   r.  r/  r$   Zinitial_global_stateZGlobalStateGuardr   rm  r  r   uniquer   rb  osenvironr+  printr   rc  r  rn  r  r  rd  rT   rU   rV   rW   rX   rY   rZ   r[   r]   ))r_   r3  Z
guards_outrY   largsZglobal_guardr>  seenZgclr   r"  Zcheck_tensors_fnZcheck_tensors_verbose_fnr$  r#  r?  r@  rp   gr  Ztensor_guardsZtensor_check_argsir   r   r   r   rI  ri   Zsource_ar  Zglobal_staterT   ri  rj  Zunique_code_partsrf  rg  rh  r]  r  r`   r<  ra   r,  t  s    




%


	

 

	 
z%CheckFunctionManager.compile_check_fnc                 C  st   t | drp| jtk	rp| jj }d k	rp| jj }d k	rpt|tsBtt|tsPt|	| d | j_d | j_t| _d S )Nr-  )
ru  r-  r$  rZ   r[   r}   r=   r   r>   
invalidate)r_   rZ   r[   r`   r`   ra   rR  M	  s    
zCheckFunctionManager.invalidatec                 C  sR   z4t || jkr2t|| jt |< t|| j W n tk
rH   Y nX t |S )zadd a weakref, return the id)r*  r*  r  rz  finalizerR  	TypeErrorr_   r  r`   r`   ra   r  ^	  s    zCheckFunctionManager.id_refc                 C  s    t || jkr| jt | S dS )zFLookup the _weakrefs created in id_ref function for ID_MATCH'd objectsN)r*  r*  rU  r`   r`   ra   r  k	  s    z$CheckFunctionManager.lookup_weakrefs)NN)rh   r   r   rb   r,  rR  r  r  r`   r`   r`   ra   r    s     X Zr  zTuple[str, str]r
  c           	   
     s$  ddl m} tr6t   |  ddd fdd}nddddd}| }| D ]J}||\}}|| |d	| d
 |  |d W 5 Q R X qP| }|d |  || |d W 5 Q R X | }|d| d
 |  || |d W 5 Q R X |	 |	 fS )Nr   r   r   r  r  c                   s
     | S rQ   )r   r  Zcsepassr`   ra   r   y	  s    z%build_guard_function.<locals>.replacec                 S  s   g | fS rQ   r`   rV  r`   r`   ra   r   ~	  s    zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guard)
r   r   HAS_UNPARSE_FUNCTIONSr  r  r|   ru   rv   Zsplicer   )	rV   Zclosure_argsr   r   rg  r  r  ri   Zmake_guard_fnr`   rW  ra   rb  r	  s0    







rb  c                   C  s   t jjjdS )NrN   r   r.  	_internalZ	log_stateZis_artifact_enabledr`   r`   r`   ra   is_recompiles_enabled	  s    r[  c                   C  s   t jjjdS )NrO   rY  r`   r`   r`   ra   is_recompiles_verbose_enabled	  s    r\  c           	      C  s   g }t | j}tt}| jD ]*}||d< tt|||}|| | q|D ]$}t	|| dkrN|||   qNd
|}d| gS )N__compile_source__r"   rl   zDuplicate tensors found: )r   rX   rV  r  r   r]   r*  rl  r   r  ra  )	rn   r  Zduplicate_tensorsrX   Zids_to_sourceZtensor_sourceZ	tensor_idr   r  r`   r`   ra   1recompilation_reason_for_no_tensor_aliasing_guard	  s    



r^  rA   ztypes.CodeTyper  )rj  r   f_localsr   c                 C  s  || j d d}|| j g }d}g }tjrp| }||}|js|j}t|dkrd|d krfd}q|}g }n| j}|d |d	< |rt	| |}n|D ]}	t
| j }
|	|
d
< t X zt|	|
|}W n@ tk
r } z t rW Y W 5 Q R  qn W 5 d}~X Y nX W 5 Q R X t|tr&|s&|	}t|tr|| t s qHqd|}tt|  | z*| jdk	r| t|pdt|  W n. tk
r } ztd W 5 d}~X Y nX |S )z
    Return the reason why `guard_fn` failed.
    Updates `guard_failures` with the generated reason.
    Only the first failed check of guard_fn is reported.
    r  r  Fr"   zDuplicate tensor foundr   TrD  rC  r]  Nr   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)rX   rB  rT   r#   rw  r   resultrW   r  r^  r   r    rl  	Exceptionr\  r}   r   r   r   ra  rD   rH   rY   r@   rn  r  )rj  r   r_  r  reasonsZno_tensor_aliasing_check_failedrW   rn   Zguard_debug_inford   rX   Zfail_reasonr  Z
reason_strr`   r`   ra   get_guard_fail_reason	  s^    





rc  ztypes.FrameType)framer   c           	      C  s   g }| dk	r4t | j| j|j}|r,|| | j} q|j}t pDt }|sPt	j
rt rpddd t|D }ntd|d}d| }d|j d	|j d
|j dt|d }|rt rt| n
t| t	j
rt||S )z
    Return the list of guard failure reasons using cache_entry.
    Logs the recompilation reason if `recompiles` logging is enabled.
    Raises a RecompileError if `config.error_on_recompile` is enabled.
    Nz

c                 s  s*   | ]"\}}d | dt |d V  qdS )zguard z failures:
- N)textwraprv   )rc   rQ  r  r`   r`   ra   r  "
  s   z9get_and_maybe_log_recompilation_reason.<locals>.<genexpr>r   re  z-triggered by the following guard failure(s):
zRecompiling function z in :z    )rc  r-  r   r_  r   nextf_coder[  r\  r#   Zerror_on_recompilera  r4  rf  rv   co_nameco_filenameco_firstlinenorecompiles_verbose_logr1  recompiles_logr%   ZRecompileError)	rZ   rd  rb  r  r   Zdo_recompiles_logZfailuresZguard_failure_detailsmessager`   r`   ra   &get_and_maybe_log_recompilation_reason

  s:      



(

rp  r   r   )rj  r   r_  r   lastc                 C  s   t d|j d|j d|j  t dd| j d  t dd| j tjrXt |  d|i| j	}| jD ]2}zt
|| j| W ql   t d|  Y qlX qld S )	NzERROR RUNNING GUARDS  rg  zlambda rl   z and
  r  zMalformed guard:
)rM  rj  rk  rl  ra  rU   rV   r#   rw  rT   rl  rX   )rj  r   r_  r   rq  r  ri   r`   r`   ra   guard_error_hook:
  s    
rs  c                 c  s,   t  }| D ]}||kr
|V  || q
d S rQ   )r&  r)  )seqrO  r   r`   r`   ra   rJ  U
  s
    rJ  c                 C  sf   |rb|| krbt |}t | }t|s,t| rJt|   d|  d||krbtjtj|dS d S )Nz is alising zC. This is not supported. Please do a clone for corresponding input.)r  )	r   r   r%   ZUnsafeScriptObjectErrorr   	functoolspartialr
  r  )Z
obj_sourceZdupe_sourceZser_source_is_localZsource_is_localr`   r`   ra   make_dupe_guard]
  s    	rw  )skipc                 G  s`   ddl m} ttjp"ttj}| jj	j
}|D ]$}t|tsHt|||| d d q6dS )z
    Add dynamo guards to the current tracing context.

    Args:
        guards: guard(s) to add
        skip: number of stack frames to ignore for debug stack trace
    r   )TracingContextr"   )collect_debug_stackrx  N)torch._guardsry  r0  r7  r8  r9  r6  r+  rH  rA  r)  r}   r   r   )rx  rM   ry  rz  r)  ri   r`   r`   ra   install_guard
  s    
r|  )
__future__r   r   r  rV  r  r  ru  	importlibr   r  r8  r  rK  r   sysrf  r  r  r   r   typingr   r   r   r   r	   r
   r   r   r   r   r   numpyr   ModuleNotFoundErrorr   r  Ztorch._dynamo.sourcer   r   r   r   r   r{  r   r   r   r   r   r   Ztorch._loggingr   Z%torch.fx.experimental.symbolic_shapesr   r   r   Ztorch.utils._tracebackr   r    Ztorch.utils.weakr!   r   r#   r$   r%   r&   Z
eval_framer'   ro   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   r  rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   ZsympyrL   	getLoggerrh   rn  r.  ZgetArtifactLoggerr0  rn  rm  r6  r   r   rM   rF  Zcheck_obj_idZcheck_type_idr  rR   r~   r  rG  rP   r   	lru_cacher   rW  __getitem__r  r  import_moduler  r   r   rm  version_infor   r   rX  ImportErrorr   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r
  r  r#  r$  r  rb  r[  r\  r^  rc  rp  rs  rJ  rw  r|  r`   r`   r`   ra   <module>   s
  0
 	\0
 
b


%           {U	  Y+T0"