o
    ߗi                    @  s  U 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 d dlm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$ d dl%Z%d dl&Z%d dl'Z%d dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d d	l2m3Z3m4Z4m5Z5m6Z6m7Z7 d d
l8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA d dlBmCZC d dlDmEZE d dlFmGZGmHZHmIZI d dlJmKZK d dlLmMZMmNZN d dlOmPZP ddlQmRZRmSZSmTZTmUZU ddlVmWZW ddlXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZt ddlmuZumvZvmwZwmxZxmyZymzZz ddl{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZmZmZmZ dZded< zd dlZW n ey   dZY nw e"rd dlmZ eeZe%jedZe%jedZe%jedZe%jedZG dd dZd d! Zedd"d# Zdad$ed%< d&d' Zdd,d-Zd.d/ Zd0d1 Zdd5d6Zdd:d;Zd<d= Zd>d? Zd@dA ZdBdC ZejdDdEG dFdG dGZdHdI ZdJdK ZejG dLdM dMZG dNdO dOejZG dPdQ dQe=ZG dRdS dSZdTdU ZG dVdW dWeZG dXdY dYZdd[d\Zd]d^ Zd_d` Zdadb Zdcdd ZddkdlZddodpZddsdtZdudv Zdd{d|ZeWe d}d~ Zdd Zd dddZdS )    )annotationsN)contextmanager)deepcopy)currentframegetframeinfo)
AnyCallableDictListOptionalSetTupleTypeTYPE_CHECKINGUnion)ReferenceType)	check_obj_idcheck_type_iddict_versionDictGuardManager install_no_tensor_aliasing_guardinstall_object_aliasing_guard!install_storage_overlapping_guardprofile_guard_managerRootGuardManager)$is_from_flatten_script_object_sourceis_from_local_sourceis_from_optimizer_sourceTensorPropertyTensorPropertySource)	CompileContext	CompileIdDuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSourceStorageOverlap)
structured)justknobs_check)EqualityConstraintis_symbolicSYMPY_INTERP)
OrderedSet)format_framereport_compile_source_on_error)TensorWeakRef   )configconvert_frameexcmutation_guard)set_guard_error_hook)AttrProxySource
AttrSourceCallFunctionNoArgsSourceChainedSourceConstDictKeySourceDefaultsSourceFlattenScriptObjectSourceFSDPNNModuleSourceGetItemSourceGlobalSourceGlobalStateSourceGlobalWeakRefSource
GradSourceLocalSourceNNModuleSourceNumpyTensorSourceODictGetItemSourceOptimizerSourceScriptObjectQualifiedNameSourceShapeEnvSourceSubclassAttrListSourceTorchFunctionModeStackSourceTupleIteratorGetItemSource
TypeSource"UnspecializedBuiltinNNModuleSourceUnspecializedNNModuleSourceUnspecializedParamBufferSourceWeakRefCallSource)
CacheEntryDynamoFrameType
ExtraStateGuardedCode	GuardFailGuardFn)common_constant_typesdict_keys_reprget_custom_getattrget_torch_function_mode_stack get_torch_function_mode_stack_atguard_failuresistype	key_is_id	key_to_idnormalize_range_iterorig_code_maptensor_always_has_static_shapetuple_iterator_getitemtuple_iterator_lenunpatched_nn_module_getattrverify_guard_fn_signaturez#Optional[Callable[[Any, Any], Any]]guard_manager_testing_hook_fn)Symbolguards
recompilesrecompiles_verboseverbose_guardsc                   @  s   e Zd ZdZdddZedd Zdd Zd	d
 Zd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d ZdS ) GuardManagerWrappera  
    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++.
    Nc                 C  sl   |d u r	t  | _n|| _d | _d | _d | _g | _d | _d | _d | _d | _	d | _
i | _g | _d| _t | _d S NT)r   rootdiff_guard_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print_no_tensor_aliasing_guardr.   diff_guard_sources)selfrr    r   R/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/guards.py__init__   s    
zGuardManagerWrapper.__init__c                 c  s$    d| _ z	d V  W d| _ d S d| _ w rq   )r~   r   r   r   r   '_preserve_print_no_tensor_aliasing_flag   s
   z;GuardManagerWrapper._preserve_print_no_tensor_aliasing_flagc                   s:    fdd fddfdd j   jS )Nc                   sd   |    jv p|  dk}t|   D ]\}\}}|||B O }q|r0 j|    |S Nr   )
get_sourcer   
fail_countsortedget_key_value_managersitemsadd)nodeis_diff_guard_nodeidxkey_mgrval_mgrr   visitr   r   visit_dict_manager   s   
zJGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_dict_managerc                   sZ   t | trJ |   jv p|  dk}|  D ]}||O }q|r+ j|   |S r   )
isinstancer   r   r   r   get_child_managersr   )r   r   	child_mgrr   r   r   visit_manager   s   zEGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_managerc                   s&   | d u rdS t | tr | S | S )NF)r   r   r   )r   r   r   r   r      s
   
z=GuardManagerWrapper.collect_diff_guard_sources.<locals>.visit)rr   r   r   r   )r   r   r   r   r   collect_diff_guard_sources   s
   

z.GuardManagerWrapper.collect_diff_guard_sourcesc                 C  s   |    |   d S N)r   populate_diff_guard_managerr   r   r   r   finalize   s   zGuardManagerWrapper.finalizec                 C  s&   |  | j| _| jr| j  d S d S r   )clone_with_chosen_sourcesr   rs   rz   update_diff_guard_root_managerr   r   r   r   r      s   	z/GuardManagerWrapper.populate_diff_guard_managerc                   s    fdd}| j |S )Nc                   s   |    v S r   )r   )node_mgrchosen_sourcesr   r   	filter_fn     z@GuardManagerWrapper.clone_with_chosen_sources.<locals>.filter_fn)rr   clone_manager)r   r   r   r   r   r   r     s   z-GuardManagerWrapper.clone_with_chosen_sourcesc                   s&   |j j | } fdd|D }|S )Nc                   s   g | ]} d  | qS ): r   ).0part
guard_namer   r   
<listcomp>  s    z7GuardManagerWrapper.get_guard_lines.<locals>.<listcomp>)	__class____name__rw   )r   guardpartsr   r   r   get_guard_lines  s   z#GuardManagerWrapper.get_guard_linesc                 C  s0   |  }|jj}|d | }|r|d| 7 }|S )Nz	: source=, )r   r   r   )r   guard_manageraccessor_strsourcetsr   r   r   get_manager_line  s   z$GuardManagerWrapper.get_manager_linec              	   C  s   t |  D ]H\}\}}|d|  | . |r.|d| |  | || |rA|d| |  | || W d    n1 sKw   Y  qd S )NzKeyValueManager pair at index=zKeyManager: zValueManager: )r   r   r   	writelineindentr   construct_manager_string)r   mgrbodyr   r   r   r   r   r   construct_dict_manager_string  s   
z1GuardManagerWrapper.construct_dict_manager_stringc              
   C  s   |  f | D ]+}t|tjjjjr,| jr#d| _|	| 
| q	|	|jjg q	|	| 
| q	t|tr@| || t| | D ]\}}|| |d|   | || qIW d    d S 1 smw   Y  d S )NFzaccessed_by=)r   get_leaf_guardsr   torch_C_dynamorl   NO_TENSOR_ALIASINGr~   
writelinesr   r   r   r   r   zipget_accessorsr   r   r   reprr   )r   r   r   r   accessorr   r   r   r   r   +  s,   

"z,GuardManagerWrapper.construct_manager_stringc                 C  s   ddl m} G dd d|}|  B | }d|_|jddd |jd	dd |d
 | | j| t| jdrI| j D ]
}|	| 
| q>| W  d    S 1 sWw   Y  d S )Nr   IndentedBufferc                      s&   e Zd Zdd Zd fdd	Z  ZS )z=GuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefixc                 S  s   d| j | j  S )Nz| )_indenttabwidthr   r   r   r   prefixL     zDGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.prefixFc                   s(   |r
t  | d S t  d|  d S )Nz+- )superr   )r   lineskip_prefixr   r   r   r   O  s   zGGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.writelineF)r   
__module____qualname__r   r   __classcell__r   r   r   r   IndentedBufferWithPrefixK  s    r   r2    T)r   zTREE_GUARD_MANAGER:r   get_epilogue_lambda_guards)torch._inductor.utilsr   r   r   r   r   rr   hasattrr   r   r   getvalue)r   r   r   r   r   r   r   r   __str__H  s   


$zGuardManagerWrapper.__str__c                 C     | j |S r   )rr   checkr   xr   r   r   r   a     zGuardManagerWrapper.checkc                 C  r   r   )rr   check_verboser   r   r   r   r   e  r   z!GuardManagerWrapper.check_verbosec                   s,   ddd   fddj  d S )NFc                 S  s2   g }|   D ]}|dd  }|| q|S )N#r   )rw   splitrstripappend)
leaf_guardrv   verbose_code_part	code_partr   r   r   get_code_partsm  s
   zMGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.get_code_partsc                   sd   |   D ] }t|tjjjjrsj | dqj | q| 	 D ]}| q)d S rq   )
r   r   r   r   r   rl   r   rv   extendr   )r   r   r   r   r   tensor_aliasing_guard_seenr   r   r   r   t  s   
zDGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.visit)rr   r   r   r   r   !populate_code_parts_for_debuggingi  s   z5GuardManagerWrapper.populate_code_parts_for_debuggingr   )r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rp      s"    

1
rp   c                 C  sN   t j  t| tjtjfrt | n| W  d    S 1 s w   Y  d S r   )r   	overrides_enable_torch_functionr   npgenericndarray	as_tensor)ar   r   r   
from_numpy  s   $r   c                  C  sD   dd l } dd l} | jj| jjg}ddlm} || dd |D S )Nr   )POLYFILLED_MODULESc                 S  s   h | ]}t |qS r   )inspectgetfile)r   mr   r   r   	<setcomp>      z&uninteresting_files.<locals>.<setcomp>)torch._dynamo.external_utilstorch._dynamo.polyfillsr   external_utils	polyfillstorch._dynamo.polyfills.loaderr   r   )r   modsr   r   r   r   uninteresting_files  s   
r  zOptional[Dict[str, object]]_CLOSURE_VARSc                   C  s   t d u rRi dtdtdtjjdtdtddd d	td
t	dt
dtdtjdtd u r2d ntjdtddtjdtjjdtjdttjttda t S )N___check_type_id___check_obj_id___odict_getitem___key_to_id___dict_version___dict_containsc                 S  s   | |v S r   r   )r   br   r   r   <lambda>      z#_get_closure_vars.<locals>.<lambda>___tuple_iterator_len___normalize_range_iter___tuple_iterator_getitem#___get_torch_function_mode_stack_at__math_isnan__numpy_isnaninf__load_moduleutils_devicedevice___from_numpy)___as_tensorr   r   )r  r   r   collectionsOrderedDict__getitem__rb   r   rg   rc   rf   r^   mathisnanr   float	importlibimport_moduler   utils_devicer  r   _as_tensor_fullprecr   r   r   r   r   _get_closure_vars  sR   	
r&  r   ast.ASTreturnstrc                 C  s   t | ddS )N
r   )astunparsereplacer   r   r   r   _ast_unparse     r.  c                 C  sb   t d}d}| D ]#}|dv rd}q	|dv r(|r'|dkr'||r't|  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)name
valid_namecurrcharr   r   r   r4    s   
	
r4  c                 C  s   t d| d S )z*
    "a[1]" => "a"
    "a.foo" => "a"
    z[.\[]r   )r1  r   r6  r   r   r   r5    s   r5  r   r   r#   c                 C  sr   d}|d ur2|j r#t|j D ]}|jt vr!dt|dd } nqn|jr2dt|j d  }| d| S )Nr   z  # T)r   z<60)
user_stackreversedfilenamer  r/   stacksummary)r   r   extrafsr   r   r   get_verbose_code_part  s   rC  rv   Union[str | List[str]]	List[str]c                   s"   t | ts| g}  fdd| D S )Nc                   s   g | ]}t | qS r   )rC  )r   r   r   r   r   r     r   z*get_verbose_code_parts.<locals>.<listcomp>)r   list)rv   r   r   rF  r   get_verbose_code_parts  s   
rH  c                 C  sF   g }| D ]}t |s|| qt|tjsJ ||j  q|S r   )r,   r   r   r   SymIntr   maybe_as_int)size_or_stride	converteddimr   r   r   convert_to_concrete_values  s   rN  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(r   z	, device=z, requires_grad=z, size=z	, stride=))typer   r   _dispatch_keys_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper  indexrequires_gradr   )
valuer6  sizesstridespytypedispatch_keyrT  device_indexrV  	guard_strr   r   r   get_tensor_guard_code_part  s$   r^  c                 C  s   t |  |S r   )rG  keysrU  )dctkeyr   r   r   get_key_index  r/  rb  c                 C  s   d|  d| dS )Nlist(	.keys())[]r   )r   rU  r   r   r   get_key_index_source  r/  rf  T)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)r   r   r   rj  __annotations__rk  rl  r   r   r   r   rh    s   
 rh  c                 C  s   | j  }|  }t| jtr| jj}nt|tsJ t|| j}t||}t|	 | }	t|	t
tfr>| d|	d}
n| d| d}
t| jtsb|j||| jtjd| j| d|	g |j||
||dS )N[re  rU  r   example_valueguard_manager_enum == )baser6  r   rU  r<   dictrb  rf  rG  r_  intr)  get_key_managerGuardManagerTypeGUARD_MANAGERadd_equals_match_guardget_value_manager)r   base_guard_managerbase_example_valuerp  rq  base_source_namesource_namerU  
key_sourcekey_example_valuevalue_sourcer   r   r   getitem_on_dict_manager#  s6   


r  c                 C  s   | j }| ot|t S r   )originating_sourceis_dict_keyr   rD   )r   r   r   r   r   match_on_id_for_tensorH  s   r  c                   @     e Zd ZU ded< ded< dS )GuardCodeListrE  	code_listr#   r   Nr   r   r   rm  r   r   r   r   r  O     
 r  c                   @  s   e Zd ZdZdZdZdS )rw  r2         N)r   r   r   rx  DICT_GUARD_MANAGERDICT_SUBCLASS_GUARD_MANAGERr   r   r   r   rw  U  s    rw  c                   @  s  e Zd ZdddZdd Zdd Zedd Zdd Zdd Z	dd Z
dd Zdd Zd d! Zdd$d%Z	&	'dd(d)Zdd.d/Zdd1d2Zdd4d5Zdd6d7Zddd9d:Zdd;d<Zdd=d>ZddBdCZddDdEZdddFdGZddHdIZddJdKZddLdMZddNdOZddPdQZddRdSZddTdUZ ddVdWZ!ddXdYZ"ddZd[Z#dd\d]Z$dd^d_Z%d`da Z&dbdc Z'ddde Z(dfdg Z)dhdi Z*djdk Z+dldm Z,dndo Z-ddpdqZ.ddrdsZ/ddtduZ0ddvdwZ1ddxdyZ2ddzd{Z3dd|d}Z4ddd~dZ5dddZ6d&S )GuardBuilderid_refCallable[[Any, str], str]
source_refCallable[[Source], str]lookup_weakrefs)Callable[[object], ReferenceType[object]]local_scopeDict[str, object]rx   r   rp   check_fn_managerCheckFunctionManagerc                 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 | _|| _t | _| jjjD ]}
| jt| |
 q[i | _i | _t | _d S )NLG__builtins__>_<._dot_)r  r  r  scopebuiltins__dict__copyr   packagepackage_importer_package_imported_modulesr   r-  r   argnamescodeshape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managersr  setkey_order_guarded_dict_idsoutput_graphguard_on_key_orderr   idgetr|   _cached_guard_managers_cached_duplicate_input_guards)r   r  r  r  r  rx   r   r  r6  package_moduler~  r   r   r   r   \  s4   
zGuardBuilder.__init__c           	      C  s   |  |}t|trtd|j |j }| D ]"}|| }t|j|d}| ||}|j	|| d|d||d qd S )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )rU  rn  re  ra  r   rp  rq  )
get_guard_managerr   r   NotImplementedErrorr6  r  r_  r@   get_guard_manager_typedict_getitem_manager)	r   rp  r   dict_mgrdict_sourcera  rW  r  rq  r   r   r   #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sJ t| D ]=\}}t|j|}|j|||t	j
d}t|rN| ||}||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 ro  z__check_obj_id(r   rO  rr  )r  r   r   r  r6  	enumerater_  rf  rv  rw  rx  ra   r  add_id_match_guardrH  ry  )	r   rW  r   r  r   ra  r  key_managerid_valr   r   r   guard_on_dict_keys_and_order  s8   

z)GuardBuilder.guard_on_dict_keys_and_orderc                 C  s.   t jrtjdkrtjdk rtdt d S | S )N)r     )r  r  r2   zMGuards may run slower on Python 3.13.0. Consider upgrading to Python 3.13.1+.)r3   issue_3_13_0_warningsysversion_infowarningswarnRuntimeWarning)rp  r   r   r   '_get_generic_dict_manager_example_value  s   

z4GuardBuilder._get_generic_dict_manager_example_valuec                 C  s  dd }|j }	|j}
t }t|jD ]
}||j  qtddd}|	|
v r/td|	d}n6d|
v r@|	|
d v r@tdd|	}n%d|
v rQ|	|
d v rQtdd|	}n|	|vred|
v re|	|
d v retdd|	}|j	sr|j
|j |||d	S |jswJ |j}|j}| d
}d }}d }}d }}|rt|j|}| }|
| }| ||}|}|}| ||}n
|}|}| ||}|j|| |
tjd}|||||
||d}|r|||||||dS |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                 S  sr   t | tr0t||}d| d|d}| j|||tjd|| d|g | j||||dS | j||||dS )Nrc  rd  re  ro  rr  r  )	r   r   rb  rv  rw  rx  ry  rz  r  )r   ra  r~  r|  rp  rq  rU  r  r   r   r   getitem_on_dict_mgr  s,   

z>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrFNT_parameters_buffers_modulesattrr   rp  rq  	.__dict__r   rp  rq  )r   ra  r~  r|  rp  rq  )memberr  r  r   getmror   updater_  rh  rj  getattr_managerrk  rl  r9   rs  r6  r  get_generic_dict_managerr  rw  rx  )r   r   r{  r|  rp  r}  r~  rq  r  	attr_namemod_dictall_class_attribute_namesr   accessor_infork  rl  mod_dict_sourcel1_source_namel2_source_namel1_valuel2_valuel1_guard_manager_enuml2_guard_manager_enum	l1_sourcemod_generic_dict_managerl1_mgrr   r   r   getattr_on_nn_module  s    

	z!GuardBuilder.getattr_on_nn_modulec                 C  s,   |  }|dkr
dS t| |}|| jv S )Nr   F)r6  r  r  r  )r   r   r~  obj_idr   r   r   requires_key_order_guardingy  s
   
z(GuardBuilder.requires_key_order_guardingc                 C  sF   t j}| |r!t|tsJ t|jti ju rt j}|S t j}|S r   )	rw  rx  r  r   rt  rP  r_  r  r  )r   r   rp  rq  r   r   r   r    s   
z#GuardBuilder.get_guard_manager_typec                 C  s   |t jkp	|t jkS r   )rw  r  r  )r   mgr_enumr   r   r   manager_guards_on_keys  s   
z#GuardBuilder.manager_guards_on_keysc                 C  s$   | j jj| jd d| jd tjdS )Nr  )	f_globalsr   rp  rq  )r   rr   globals_dict_managerr  rw  rx  r   r   r   r   get_global_guard_manager  s   z%GuardBuilder.get_global_guard_managerc              	     s  | j j}d }  }|dkr|| jv r| j| S |dkr!| |}|  |}d }d }d }tj}	t t	rL j
 }| |}|  j
}|  j
|}	t tr]|j j|||d}
nt trp|  j j|||d}
nt tr|  j j|||d}
nlt tr|S t tr|S t tr|sJ |j|||d}
nKt tttttfr|sJ |}
n9t tr|j fdd|||d}
n%t t r|sJ |j!|||d}
nt t"t#fr|sJ t|t$j%j&rt'|t(u r| ) ||||||}
n|j* j+|||d}
nt t,r|sJ t|t-t.j/frTt|t0r=| 1|	s3J t2 ||||}
nt j3t4rHt5d	|j j3|||d}
nt|t6rj j7sj|j8 j3|||d}
nt|t9r j7s|j: j3|||d}
no j3} j7r ; }|j<||||d}
nYt t=rt|t0r| 1|	sJ t2 ||||}
n;|sJ |j j3|||d}
n*t t>r|sJ t?|sJ  j@s|jA||jBtjdj< jC|||d}
n |jD}|d usJ |d
 }|jE||tjd}t|t0rJ |j jC|||d}
nt tFr.|s$J |jtG|||d}
nt tHrE|s9J |jdd |||d}
nt tIr\|sPJ |jdd |||d}
nt tJrs|sgJ |jdd |||d}
n|t tKr|s~J |jdd |||d}
net tLr|sJ |jM j3|||d}
nOt t4rt|t0stNd|jO j3|||d}
n4t tPr|sJ |jQ|||d}
n t tRr|sJ |jS|||d}
ntNd  d   |
| j  < |
S )Nr   r  )global_namer   rp  rq  r  c                   s   t   S r   )r^   
_get_index)r  r   r   r   r    s    z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>)python_lambdar   rp  rq  r  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_orderz.__kwdefaults__c                 S  s   |   d S r   __tensor_flatten__r   r   r   r   r        c                 S     |   S r   )__obj_flatten__r  r   r   r   r    r  c                 S  s   |    S r   )_typequalified_namer  r   r   r   r    r  c                 S  r  r   )get_baser  r   r   r   r    r  ro  z4ConstDictKeySource can only work on DictGuardManagerzmissing guard manager builder z - )Tr   rr   r6  r  r  r  rw  rx  r   r;   rs  get_guard_manager_from_sourcer`   rE   r  
local_namerA   r  r  rC   global_weakref_managerrB   rK   rO   type_managerrI   rF   rQ   rP   r?   rM   lambda_managerrD   grad_managerr9   rR   r   nnModuler\   rh   r  r  r  r@   rt  r  r  r   r  r  rU  r<   RuntimeErrorrG  index_is_slicelist_getitem_managertupletuple_getitem_managerunpack_slicegetitem_managerrH   r=   callableis_kwfunc_defaults_manager__defaults__idx_key__kwdefaults__func_kwdefaults_managerrG   r   rL   r>   rJ   r8   rN   tuple_iterator_getitem_managerAssertionErrorrv  rS   weakref_call_managerr:   call_function_no_args_manager)r   r   root_guard_managerrp  r~  rq  r}  r|  r{  base_guard_manager_enumoutrU  
kwdefaults	kw_sourcer  r   r  r   r    s  







































z*GuardBuilder.get_guard_manager_from_sourcer   r#   c                 C  s   |  |jS r   )r  r  r   r   r   r   r   r    r   zGuardBuilder.get_guard_managerNTc                 C  s   |d u rt  }d| }t||\}}i }d| jd i}	t||	| |d |  }
|r8| jj	|
| d S | jj
|
| d S )Nr   r  ___make_guard_fn)r&  joinr_  build_guard_functionr  execvaluesr   rr   add_epilogue_lambda_guardadd_lambda_guard)r   rv   rw   rt   is_epiloguemake_guard_fn_args
guard_bodypycoder  globals_for_guard_fnguard_fnr   r   r   $add_python_lambda_leaf_guard_to_root  s   z1GuardBuilder.add_python_lambda_leaf_guard_to_rootr6  r)  r(  r   c                 C  s   t || jt S r   )evalr  r&  )r   r6  r   r   r   r    r   zGuardBuilder.getUnion[str, Guard]c                 C  s`   t |tr|}n|j}tt|}|| jvr.td|r.td|r(t	d| | j
| |S )Nz[a-zA-Z0-9_]+z^\d+$zinvalid var name: %s)r   r)  r6  r5  r4  r  r1  r3  logwarningr   )r   r   r6  rs  r   r   r   arg_ref  s   

zGuardBuilder.arg_refr  c                 C  s.   t |j|}t|||j|jd}||  d S )N)r?  r<  )r9   r  r#   r?  r<  create)r   r   r  r)  attr_source	new_guardr   r   r   _guard_on_attribute  s
   z GuardBuilder._guard_on_attributec              	   C  s8  |j }t|tr|j}t|tsJ d|j |j}| }|j}| |}t| 	||}d }|r=d| d|d}n	d| d|d}| j
||g| 	|d | |}	|r| 	| }
| 	|}| ||
}t|tjjrt|tu r| ||	||
|| |S |	j||j|
|d d S |	|t|| d S )Nzinvalid source hasattr(r   rO  znot hasattr()provided_guarded_objectr  )r  r   rF   rs  r9   r6  r  r/  r   r  _set_guard_export_infor  r  r   r  r  r\   rh   r  r  add_no_hasattr_guardrH  )r   r   r   base_sourcers  r  refvalr  base_managerrp  r|  rq  r   r   r   HASATTR  sT   





zGuardBuilder.HASATTRr0  c           	      C  s   |d usJ |  |}| |j}t|tjjsJ | |}|j d}|j|| 	|j
tjd}d|d| d}|d|t|| d S )Nr  r  znot ___dict_contains(r   z
.__dict__)F)r/  r  r6  r   r   r  r  r  r  r  r  rw  rx  add_dict_contains_guardrH  )	r   r   r  r9  r:  r;  r  r  r  r   r   r   NOT_PRESENT_IN_GENERIC_DICTE  s   


z(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICTc                 C  sh   t | |j}| |d|j d}d| | d| d}| ||g | ||t|| d S )Ntype(rO  z___check_type_id(r   )	rP  r  r6  r  r/  r6  r  add_type_match_guardrH  )r   r   r   r  r  r   r   r   
TYPE_MATCHY  s   

zGuardBuilder.TYPE_MATCHc                 C  s`   |  |}| |j}t| |j}d| d| }| ||g | ||t|| d S )Nz___dict_version() == )r/  r  r6  r   r6  r  add_dict_version_guardrH  )r   r   r9  r:  versionr  r   r   r   DICT_VERSIONd  s   


zGuardBuilder.DICT_VERSIONra  invertri  c                 C  sZ   |  |}|r	dnd}| d|d| d}| ||g | || |t|| d S )Nnot r   z___dict_contains(r   rO  )r/  r6  r  r=  rH  )r   r   ra  rF  dict_ref	maybe_notr  r   r   r   DICT_CONTAINSr  s   

zGuardBuilder.DICT_CONTAINSc                 C  s   t |jtr| t|jjtjS | |}| |j	}| 
||j	}d| d| d}| ||g | ||t|| t |jtr`t |tjjrb|jj}| |}|d urd|| j|< d S d S d S d S )Nz___check_obj_id(r   rO  )r   r  rO   rA  r#   rs  r  r/  r  r6  r  r6  r  r  rH  rE   r   r  r  r  r  r|   )r   r   r9  r:  r  r  r  weak_idr   r   r   ID_MATCH}  s*   



zGuardBuilder.ID_MATCHc                 C  sX   |  |}| |j}t|tjsJ | d}| ||g | |t	|| d S Nz is not None)
r/  r  r6  r   r   Tensorr6  r  add_not_none_guardrH  )r   r   rW  r9  r:  r  r   r   r   NOT_NONE_MATCH  s   


zGuardBuilder.NOT_NONE_MATCHc                 C  s   |  |dtj d S )Nr   )r3  r  EQUALS_MATCHr  r   r   r   
NAME_MATCH  s   zGuardBuilder.NAME_MATCHc                 C  sN   |  |j}| | d|  }| ||g | ||t|| d S )Nz.data_ptr() == )r  r6  r/  data_ptrr6  r  add_data_ptr_guardrH  )r   r   objr  r   r   r   DATA_PTR_MATCH  s   

zGuardBuilder.DATA_PTR_MATCHc                   sT   t jjj d  g}| ||g t jj fdd}| jj|t|| d S )Nz,torch.autograd.forward_ad._current_level == c                   s
   j  kS r   )_current_levelr  
dual_level
forward_adr   r   fn     
z#GuardBuilder.DUAL_LEVEL.<locals>.fn)	r   autogradrZ  rW  r6  r   rr   r#  rH  )r   r   r  r[  r   rX  r   
DUAL_LEVEL  s   

zGuardBuilder.DUAL_LEVELc                   sf   t jj }dd |D d dg}| || t jjj  fdd}| jj|t	|| d S )Nc                 S  s   g | ]}|  qS r   )	get_state)r   cir   r   r   r         z6GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.<listcomp>z5torch._functorch.pyfunctorch.compare_functorch_state(rO  c                   s    S r   r   r  
compare_fnstatesr   r   r[    s   z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn)
r   
_functorchpyfunctorch#retrieve_all_functorch_interpretersr6  compare_functorch_stater   rr   r#  rH  )r   r   cisr  r[  r   rb  r   FUNCTORCH_STACK_MATCH  s   

z"GuardBuilder.FUNCTORCH_STACK_MATCHc                   s   |  |jt|  |j d  tdr#t  fdd}n fdd}dt| dt  }| 	|
|t|| d S )Nr2   __metadata_guard__c                   s     |  d S Nr2   )rk  r  r  original_metadatarW  r   r   metadata_checker  s   zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checkerc                   s   |   d  kS rl  r  r  )rn  r   r   ro    r   ___check_metadata__c)r  r6  r   r  r   ri   r  r    current_compile_idr  r#  rH  )r   r   ro  r  r   rm  r   TENSOR_SUBCLASS_METADATA_MATCH  s   


z+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCHc                   s"  |  |}| |j}t|}tr*t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f}ttttttttjh||B  tj r^ddlm} ddlm}m}	m }
  |
|	||f  t!|t"ryt# fddt$%|& |' D sxJ nt!| sJ dt| d  t!|t(rt)*|r| +| g }|,d	| d
 | -|| | .|/t0 d t1|| d S t!|t2rt*|r| +| g }|,d| d
 | -|| | .|/t0 d t1|| d S | d|g}t!||rt3|}| .|4|t1|| | -|| d S )Nr   r   )
DeviceMesh)Partial	ReplicateShardc                 3  s    | ]}t | V  qd S r   )r`   r   r   ok_typesr   r   	<genexpr>  s    

z,GuardBuilder.EQUALS_MATCH.<locals>.<genexpr>zUnexpected type z	, not in z__math_isnan(rO  r  z__numpy_isnan(r  rr  )5r/  r  r6  rP  r   int8int16int32int64uint8uint16uint32uint64float16float32float64rG  r  r  rZ   	frozensetsliceranger   Sizedistributedis_availabletorch.distributed.device_meshrt  (torch.distributed.tensor.placement_typesru  rv  rw  r`   rt  all	itertoolschainr_  r!  r   r  r  rA  r   r6  r  r#  r&  rH  complexr   ry  )r   r   r9  r:  r   np_typesok_mutable_typesrt  ru  rv  rw  r  r   ry  r   rQ    s   









zGuardBuilder.EQUALS_MATCHc                 C  s>   |  |j}t|ttd tjfr| | d S | | d S r   )	r  r6  r`   ri  rP  typesCodeTyperL  rQ  r   r   r:  r   r   r   CONSTANT_MATCHO  s   zGuardBuilder.CONSTANT_MATCHc                 C  s\   |  | | |j}t|dr"t|jtsJ | |dtj	 d S t
dt|  d S )Ntrainingz$Guard setup for uninitialized class )rL  r  r6  r   r`   r  ri  r3  r  r  r5   unimplementedrP  r  r   r   r   	NN_MODULEV  s   

zGuardBuilder.NN_MODULEc                 C  
   |  |S )z0things like torch.add and user defined functions)rL  r  r   r   r   FUNCTION_MATCH_  s   
zGuardBuilder.FUNCTION_MATCHc                 C  sV   |  |j}t|tjkr$t|dr$| |dtj | |dtj	 dS | 	| dS )z!matches a closure by __code__ id.__code__N)
r  r6  rP  r  FunctionTyper   r3  r  r<  r  r  r   r   r   CLOSURE_MATCHc  s
   zGuardBuilder.CLOSURE_MATCHc                 C  r  r   r  r  r   r   r   BUILTIN_MATCHm  r\  zGuardBuilder.BUILTIN_MATCHc                 C  r  r   r  r  r   r   r   PYMODULE_MATCHp  r\  zGuardBuilder.PYMODULE_MATCHc                 C  s   |  |}| |j}t|}t|ts| | g }t|dkr*|d|  n|d| dt|  | 	|| t|trR| 
|t|t|| d S | 
|t|t|| d S )Nr   rG  zlen(rB  )r/  r  r6  rP  r   rt  rA  lenr   r6  r  add_dict_length_check_guardrH  add_length_check_guardr   r   r9  rW  r   r  r   r   r   SEQUENCE_LENGTHs  s"   





zGuardBuilder.SEQUENCE_LENGTHc                 C  s   |  |}| |j}t|}g }|d| dt|  | || t|}| |d|j d}| |	t||t
|| d S )Nz___tuple_iterator_len(rB  r?  rO  )r/  r  r6  rP  r   rg   r6  r  r  add_tuple_iterator_length_guardrH  )r   r   r9  rW  r   r  r  r   r   r   TUPLE_ITERATOR_LEN  s   

zGuardBuilder.TUPLE_ITERATOR_LENc              	   C  s   |  |}| |j}t|}g }t|}|d| d|  | || t|}| |d|j d}|\}}	}
| |	||	|
|t
|| d S )Nz___normalize_range_iter(rB  r?  rO  )r/  r  r6  rP  rc   r   r6  r  r  add_range_iterator_match_guardrH  )r   r   r9  rW  r   r  normalized_range_iterr  startstopstepr   r   r   RANGE_ITERATOR_MATCH  s   


z!GuardBuilder.RANGE_ITERATOR_MATCHc                 C  s   |  |}|  | }t|jst|rd S | d| g}| || ||f}|| jv r0d S | j||f | j||f t| || 	|t
|| d S )N is )r/  r6  r   r  r6  r  r   r   r  r  rH  )r   r   source_bref_aref_br  ra  r   r   r   DUPLICATE_INPUT  s(   

zGuardBuilder.DUPLICATE_INPUTc                 C  s   |  |}| |j}t|}| | g }tdd | D }tt|t	|j
d}|r:|d| d|  n|d| d|  | || | |j
rY| || d S | || d S )Nc                 s  s    | ]}t |V  qd S r   )ra   )r   kr   r   r   r{        z)GuardBuilder.DICT_KEYS.<locals>.<genexpr>)localz___key_to_id(rB  rc  .keys()) == )r/  r  r6  rP  rA  anyr_  r[   rb   r   r  r   r6  r  r  r  )r   r   r9  rW  r   r  any_key_is_idconst_keys_reprr   r   r   	DICT_KEYS  s"   

zGuardBuilder.DICT_KEYSc                 C  s8   |  | dg}| || | |t|| d S rM  )r/  r6  r  rO  rH  )r   r   r  r   r   r   WEAKREF_ALIVE  s
   
zGuardBuilder.WEAKREF_ALIVEc                 C  sx   |  |}| |j}t|}g }|d| dt|  | || | |j	r4| 
|| dS | || dS )zConstant keys matchrc  r  N)r/  r  r6  rP  r   rG  r_  r6  r  r  r  r  r  r   r   r   DICT_CONST_KEYS  s   
zGuardBuilder.DICT_CONST_KEYSc                 C  s   t jrdS | | dS )z\Special guard to skip guards on empty hooks. This is controlled by skip_nnmodule_hook_guardsN)r3   skip_nnmodule_hook_guardsr  r  r   r   r   EMPTY_NN_MODULE_HOOKS_DICT  s   z'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICTc                 C  s   t | |j| j d S r   )r6   watchr  r6  r  r  r   r   r   OBJECT_MUTATION   s   zGuardBuilder.OBJECT_MUTATIONc                 C     d S r   r   r  r   r   r   	GRAD_MODE     zGuardBuilder.GRAD_MODEc                 C  r  r   r   r  r   r   r   DETERMINISTIC_ALGORITHMS  r  z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  r  r   r   r  r   r   r   TORCH_FUNCTION_STATE	  r  z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  r  r   r   r  r   r   r   FSDP_TRAINING_STATE  r  z GuardBuilder.FSDP_TRAINING_STATEc                 C  sV   |j tju sJ ddlm  m} d|jg}| || | |	t
|| dS )z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )r   r&   GLOBALtorch.utils._devicer#  r$  CURRENT_DEVICEr6  r  add_default_device_guardrH  )r   r   r   r  r   r   r   DEFAULT_DEVICE  s   
zGuardBuilder.DEFAULT_DEVICEc                   sP  |j dksJ | jj  j}dd |D } fdd} jrXi }g }g }i }t }	 jD ]}
|
j jv rDtj	j
|
| j|||||	 q,td q,t||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  }r|j| | j||i tt d d S )Nr   c                 S     g | ]}|j qS r   )symbolic_contextr   r   r   r   r   r   #      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   SIZE)r   r   rM  r   r   r   (  s    z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)t_idrM  r  r  r   get_sources%  s   
z+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesz+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsrelaxed_sources	warn_onlyc                 S  r  r   )faker  r   r   r   r   M  r  c                 S  r  r   r  r  r   r   r   r   N  r  )input_contextsequalities_inputsr  ignore_static)rt   )r6  r  r  tracked_fakesexport_constraintsr  r  r  r   exportdynamic_shapes_process_equalities	shape_envr-  r.  r+   rG  r!  produce_guards_verboser  freezer6  r    try_getshape_env_guardsr   r*  r-   r&  )r   r   rB  r  r  namesr  r  r  r  
constraintr  rv   rw   r  compile_contextr   r  r   	SHAPE_ENV  sh   






zGuardBuilder.SHAPE_ENVc              
   C  sf  |  r
t|jtrt|r| | d S t|tr| }|d ur#|n| |j}t|t	j
s1J | |}g }| jjjr|| | g d}|D ]2}| |d | }t|t	jt	jfrm|d| d| dt| qH|| d| d|  qHnT| |}tjrt|t	jjs| j| | j| | jj}	|	j|j }
t|
d }t|
d }tt|||||}| ||||| t|t	jjs| jj!j"#|j |j$d usJ t%|d|jd	\}}|s"t&|d
r|j'}d| d| d| d}|| | |(|t|| nd| d}|| | |)d
t|| t*|dkr1| +|| d S d S )N)rT  r  rV  zndimension()r  zstr(rB  rr  sizestrideT)	is_tensortensor_source_dynamo_dynamic_indicesz((z"._dynamo_dynamic_indices.issubset(z)) if hasattr(z', '_dynamo_dynamic_indices') else True)r4  z%, '_dynamo_dynamic_indices') == Falser   ),is_specialized_nn_moduler   r  rG   r  rL  r1   r  r6  r   rN  r/  r  r  r  rA  r`   r  rT  r   r)  r  r3   ,skip_no_tensor_aliasing_guards_on_parametersr  	Parameterr  r  input_source_to_sizes_stridesrN  rH  r^  add_tensor_match_guardr   r   r   r   re   r   r  add_dynamic_indices_guardr7  r  r6  )r   r   rW  tensor_namer  termsterm
real_valuer   r  metadatar  r  rw   staticreasondynamic_indicesr   r   r   r   TENSOR_MATCHj  s   




"



 






zGuardBuilder.TENSOR_MATCHc                 C  s   t  }|d us	J |j}~|d usJ t|d }~|t| jv s(J d| |d u rA|jd uo5|jdk}|r>| |jnd }n|}|d urNtt	|nd }	d }
t
|jdddk}|rjt|tjtfsjt|}
|||	||
 d S )Nr  zH_produce_guard_code must be called from inside GuardedCode. Called from r   __weakrefoffset__r   )r   f_backr   dirr   r6  r  weakrefr9  rP  getattrr   enumEnumr  set_export_info)r   r   r  r5  	cur_framecaller	func_name
name_validguarded_objectguarded_object_typeobj_refsupports_weakrefr   r   r   r6    s:   
z#GuardBuilder._set_guard_export_info)r  r  r  r  r  r  r  r  rx   r  r   rp   r  r  )r   r#   rq   )r6  r)  r(  r   )r   r,  r(  r)  )r   r#   r  r)  r   )r   r#   r(  r0  )r   r#   ra  r)  rF  ri  )7r   r   r   r   r  r  staticmethodr  r  r  r  r  r  r  r  r*  r  r/  r3  r<  r>  rA  rE  rJ  rL  rP  rR  rV  r^  rj  rs  rQ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r6  r   r   r   r   r  [  sv    
="
   
2

"


	6











e

	










O 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ZddddZdddZdddZdS )PyExprCSEPassr2   c                   @  r  )PyExprCSEPass.ConfigzDict[str, int]
expr_countzDict[str, str]expr_to_nameNr  r   r   r   r   ConfigN  r  r  c                      s(   e Zd ZdddZd fd
dZ  ZS )zPyExprCSEPass.ExprCounterr3   r  r(  r0  c                 C  s
   || _ d S r   )_config)r   r3   r   r   r   r   T  r\  z"PyExprCSEPass.ExprCounter.__init__r   r'  r   c                   s4   t |tjr| jjt|  d7  < t | d S rl  )r   r  ALLOWED_NODE_TYPESr  r  r.  r   r   )r   r   r   r   r   r   W  s   zPyExprCSEPass.ExprCounter.visit)r3   r  r(  r0  r   r'  r(  r   r   r   r   r   r   r   r   r   r   r   ExprCounterS  s    
r  c                      s,   e Zd Zd fddZd fddZ  ZS )zPyExprCSEPass.Replacerr3   r  gen_nameCallable[[], str]r(  r0  c                   s    t    || _|| _g | _d S r   )r   r   r  	_gen_namepreface)r   r3   r  r   r   r   r   ]  s   

zPyExprCSEPass.Replacer.__init__r   r'  r   c                   s   t |tjrGt|}| jj| tjkrG|| jjvr9t 	|}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   exprnode_expr_var_namer   r   r   r   g  s   zPyExprCSEPass.Replacer.visit)r3   r  r  r   r(  r0  r  r  r   r   r   r   Replacer\  s    
r*  r(  r0  c                 C  s$   d| _ | jtdd i d| _d S )Nr   c                   S  s   dS r   r   r   r   r   r   r        z(PyExprCSEPass.__init__.<locals>.<lambda>)r  r  )_counterr  r  defaultdictr  r   r   r   r   r     s   zPyExprCSEPass.__init___varr   r)  c                 C  s    | | j  }|  j d7  _ |S rl  )r,  )r   r   r6  r   r   r   _new_var  s   zPyExprCSEPass._new_varexprsrE  c                 C  sX   |  | j}|D ]!}z
|t| W q ty) } z	td|j|  d }~ww d S )Nz#Failed to visit expr at line %s.
%s)	r  r  r   r+  parseSyntaxErrorr-  	exceptionlineno)r   r0  countereexr   r   r   count  s   zPyExprCSEPass.countr&  Tuple[List[str], str]c                 C  s.   |  | j| j}|t|}|jt|fS r   )r*  r  r/  r   r+  r1  r"  r.  )r   r&  replacernew_noder   r   r   r-    s   zPyExprCSEPass.replaceN)r(  r0  )r.  )r   r)  r(  r)  )r0  rE  r(  r0  r&  r)  r(  r9  )r   r   r   r#  r+  	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr  NodeTransformerr*  r   r/  r8  r-  r   r   r   r   r  F  s    	
%
	r  c                 C  s   t | jtptjo| jtju S r   )r   r  r=   r3    guard_nn_modules_using_dict_tags	create_fnr  r  rF  r   r   r   must_add_nn_module_guards  s   
rF  c                      s$   e Zd Z fddZdd Z  ZS )DeletedGuardManagerWrapperc                   s   t    || _d S r   )r   r   invalidation_reason)r   r  r   r   r   r     s   

z#DeletedGuardManagerWrapper.__init__c                 C  s
   d | _ d S r   )rs   r   r   r   r   r     r\  z6DeletedGuardManagerWrapper.populate_diff_guard_manager)r   r   r   r   r   r   r   r   r   r   rG    s    rG  c                   @  s>   e Zd Z			ddddZdd Zdd	 Zd
d Zdd ZdS )r  Nry   %Optional[Callable[[GuardFail], None]]c                   s  |r|j nd }i  _t|}t  _| j_| _d |r |jnd  _fdd}t j	| j
|j|j j }dd }t||tjoHtd}	tdsRtd t|pVg tjdD ] }
|	sv|
 rvd|
jvrvd	|
jvrvtjsud
|
jvrvq[|
| q[ ||| |j j_tjjd fddd t !d j |j j_|j"s܈ j#|jst$ j|jt%& }t'd| t(d urt( j|j t )t*j+rt, jj-|j}t !d|d  j.  d  _d S )Nc                   sB   |   }|tju r|  S  sJ   }|d usJ ||  S r   )guard_sourcer&   CONSTANTr6  r/  )r   rJ  	r_builder)	w_builderr   r   r    s   
z1CheckFunctionManager.__init__.<locals>.source_refc                 S  s   |  }|r
d |_ d S d S r   )r  )weak_br  r   r   r   cleanup_builder  s   
z6CheckFunctionManager.__init__.<locals>.cleanup_builderz!pytorch/compiler:guard_nn_modulesz9guard_nn_modules is turned off using justknobs killswitch)ra  r  r  hooksdynamo_cpp_guards_strc                     s
   t  jS r   )r)  r   r   r   r   r   r  	  s   
 z/CheckFunctionManager.__init__.<locals>.<lambda>
payload_fn%szGuard check failed: zGuard eval latency = %s usz.2f)/rl   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesrp   r   r   r  torch_function_mode_stackr  r  r  r  rx   r  r9  r3   guard_nn_modulesr*   r-  r.  r   r#   sort_keyr  r6  r  r0  compile_check_fnr|   r   _loggingtrace_structured
guards_logdebugr  r   get_guard_fail_reason_helperr    rr  r  rj   isEnabledForloggingDEBUGr   rr   clear)r   r  rz   ry   rl   existing_diff_guard_sourcesr  builderrO  guard_on_nn_modulesr   reasonslatencyr   )r   rM  r   r     s   











zCheckFunctionManager.__init__c                   s   j }|dg7 }td g g g t| j}| jjdg | jj| jdg d | _dfdd	}t	 } j
D ]}|jD ]}	|	|vrS||	|jd ||	 qAq< j}
d }d }t|
d	krqt j|
d
d|
 d g | jrz| jjjjng }|D ]t}t|tr|j}|j}|  d|  }t | ||g ||d d q~t|tr fdd|jD } fdd|j D }dddd |jD  dddd |j D  d}t!|||g ||d d q~t"d|  j#D ]}|jD ]	}	||	|jd qqrt$j%j&dfddd t'j(}|d u r!t') }|||j*|dt+t, }| j-  d j.d i}tdksCJ || j_/|| j_0| j1  | j_2|| j_3|| j_4d | j_5d | j_6|
| j_7d S ) Nz**___kwargs_ignoredzGUARDS:z___check_global_state()z$___check_torch_function_mode_stack()Fc                   s   t  }td|  fdd ttjrGd}d}d ur?jr1dd	j
  }jr?dd	j
  }td || |sU  | d S d S )NrT  c                     s@    rj rtj  nd rjrtjdS d dS )N)r  r?  r<  )r?  r)   from_tracebackr@  r<  r   r   r   r   r   r  U	  s   
zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>r   z
Stack:
z
User stack:
zGuard: %s%s%s)rC  r]  r^  r   verbose_guards_logr`  ra  rb  r?  r  formatr<  )r   r   log_onlyr   maybe_stackmaybe_user_stack)rv   structured_guard_fnsrw   rj  r   add_code_partP	  s0   

z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partTr2   zcheck_no_aliasing(r   rO  r  c                      g | ]}  |qS r   r  r   r   re  r   r   r   	      z9CheckFunctionManager.compile_check_fn.<locals>.<listcomp>c                   rr  r   rs  rt  ru  r   r   r   	  rv  zcheck_overlapping(overlapping=[c                 s      | ]}|  V  qd S r   r:  rt  r   r   r   r{  	  r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>z], non_overlapping=[c                 s  rw  r   r:  rt  r   r   r   r{  	  r  z])zUnknown GuardEnvExpr: dynamo_guardsc                     s   dd  D S )Nc                 S  s   g | ]}| qS r   r   )r   fr   r   r   r   	  r  zKCheckFunctionManager.compile_check_fn.<locals>.<lambda>.<locals>.<listcomp>r   r   )rp  r   r   r  	  s    z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>rR  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr  r   r   )8r  r]  r^  $make_torch_function_mode_stack_guardrW  r   rr   add_global_state_guard#add_torch_function_mode_stack_guardr  r  r  r   r   r  r  r   r  r  r  tracing_contextguards_contextaotautograd_guardsr   r"   input_source_ainput_source_br6  r   r  r(   overlapping_sourcesnon_overlapping_sourcesr   r  r  r   r[  r\  r4   initial_global_stateGlobalStateGuardr   r-   r&  r   r  rt   ru   r   rw   rx   ry   rz   r{   r}   )r   re  
guards_outry   largs"torch_function_mode_stack_check_fnrq  seengclr  r  check_tensors_fncheck_tensors_verbose_fnr  r   source_ar  r   overlapping_guard_managersnon_overlapping_guard_managersglobal_statert   r(  r   )re  rv   rp  rw   r   rZ  7	  s   

)


	







	
z%CheckFunctionManager.compile_check_fnc                 C  s   t | dr>t| jts@| jj }d urB| jj }d urDt|ts"J t|ts)J d| d}t|}||| || _d S d S d S d S d S )Nr   zCache line invalidated because z got deallocated)	r   r   r   rG  rz   r{   rT   rV   
invalidate)r   obj_strrz   r{   r  deleted_guard_managerr   r   r   r  	  s   

zCheckFunctionManager.invalidatec                 C  sh   z't || jvr#t|| jt |< t|tj| j|d W t |S W t |S  ty3   Y t |S w )zadd a weakref, return the id)r  )	r  rU  r  r9  r   	functoolspartialr  	TypeError)r   rU  r  r   r   r   r  	  s   
zCheckFunctionManager.id_refc                 C  s    t || jv r| jt | S dS )zFLookup the _weakrefs created in id_ref function for ID_MATCH'd objectsN)r  rU  )r   rU  r   r   r   r  	
  s   z$CheckFunctionManager.lookup_weakrefs)NNN)ry   rI  )r   r   r   r   rZ  r  r  r  r   r   r   r   r    s     3r  Tuple[str, str]c           	   	     sD  ddl m} t   |  d fdd}| }| D ]/}||\}}|| |d	| d
 |  |d W d    n1 sDw   Y  q| }|d |  || |d W d    n1 skw   Y  | }|d| d
 |  || |d W d    n1 sw   Y  | | fS )Nr   r   r&  r)  r(  r9  c                   s
     | S r   )r-  )r&  csepassr   r   r-  
  r\  z%build_guard_function.<locals>.replacezif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr<  )	r   r   r  r8  r   r   r   splicer   )	rv   closure_argsr   r-  r&  r&  r"  r   make_guard_fnr   r  r   r  
  s4   







r  c                   C     t jjjdS )Nrm   r   r[  	_internal	log_stateis_artifact_enabledr   r   r   r   is_recompiles_enabled5
  r   r  c                   C  r  )Nrn   r  r   r   r   r   is_recompiles_verbose_enabled9
  r   r  c                   s   dd | D   fdd}|S )Nc                 S  s   g | ]}t |qS r   )rP  rx  r   r   r   r   ?
  ra  z8make_torch_function_mode_stack_guard.<locals>.<listcomp>c                    sD   t  } t| t krdS t | D ]\}}|t|kr dS qdS )NFT)r]   r  r   rP  )	cur_stacktymoder  r   r   check_torch_function_mode_stackA
  s   zMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stackr   )intial_stackr  r   r  r   r~  >
  s   r~  c                   sn   t | j}tt | jD ]}||d< tt|||} | | q fdd D }d	|}d| gS )N__compile_source__c                   s&   g | ]}t  | d kr |  qS )r2   )r  )r   ra  ids_to_sourcer   r   r   X
  s     zErecompilation_reason_for_no_tensor_aliasing_guard.<locals>.<listcomp>r   zDuplicate tensors found: )
rt  rx   r  r-  rG  r}   r  r+  r   r  )r   r  rx   r  	tensor_idduplicate_tensorsr  r   r  r   1recompilation_reason_for_no_tensor_aliasing_guardP
  s   




r  r   rY   f_localsr  
compile_idr!   c                 C  sH  || j d d}|| j g }d}g }| |}|js2|j}t|dkr2d|d v r.d}n|}g }|r:t| |}n^|D ][}t| j }	||	d< t	 - zt
||	|}
W n tyo } zt rjW Y d	}~W d	   q< d	}~ww W d	   n1 szw   Y  t|
tr|
s|}
t|
tr||
 t s nq<| d
d| }|S )z
    Return the reason why `guard_manager` failed.
    Updates `guard_failures` with the generated reason.
    Only the first failed check of guard_manager is reported.
    r  r  Fr2   zDuplicate tensor foundr   Tr  Nr   z; )rx   r  rt   r   resultrw   r  r  rt  r0   r+  	Exceptionr  r   ri  r)  r   r  )r   r  r  r  rg  no_tensor_aliasing_check_failedrw   guard_debug_infor   rx   fail_reasonr6  
reason_strr   r   r   r_  `
  sR   





r_  r  types.CodeTypec              
   C  s   t | tr| d| j S t| ||}tt|  | z| jd ur1| t|p(dt|  W |S W |S  t	yK } zt
d W Y d }~|S d }~ww )Nr   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   rG  rH  r_  r_   rd   r   ry   rX   r  r-  r3  )r   r  r  r  r  r6  r   r   r   get_guard_fail_reason
  s&   

	r  framerU   c                   s  g  | durt | j| j|j| j}|r | | j} | dus|j}t p't	 }|s-t
jrxt	 r=ddd t D }n	td d}d| }d|j d	|j d
|j dt|d }|rpt	 rkt| nt| t
jrxt|tjjddd  fddd  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)textwrapr   )r   ir  r   r   r   r{  
  s
    
z9get_and_maybe_log_recompilation_reason.<locals>.<genexpr>r*  r  z-triggered by the following guard failure(s):
zRecompiling function z in :z    artifactc                   S  s
   dddS )Nrecompile_reasonsjson)r6  encodingr   r   r   r   r   r  
  s   z8get_and_maybe_log_recompilation_reason.<locals>.<lambda>c                     s    S r   r   r   rg  r   r   r  
  r+  )metadata_fnrS  )r  r   r  r  r  r   nextf_coder  r  r3   error_on_recompiler  r  r  r   co_nameco_filenameco_firstlinenorecompiles_verbose_logr^  recompiles_logr5   RecompileErrorr   r[  r\  )rz   r  r  r  do_recompiles_logfailuresguard_failure_detailsmessager   r  r   &get_and_maybe_log_recompilation_reason
  sL   







	r  c                 C  s`   | }t  }| d ur|| j  | j} | d us	|} | d ur.|| j_| j  | j} | d us|S r   )r  r  r   r   r  r   r   )rz   first_cache_entryacc_diff_guard_sourcesr   r   r   rV  
  s   
rV  rU  ru  lastri  c                 C  s   t d|j d|j d|j  t dd| j d  t dd| j t |  d|i| j}| jD ]}z	t|| j	| W q3   t d|  Y q3d S )	NzERROR RUNNING GUARDS  r  zlambda r   z and
  r  zMalformed guard:
)
printr  r  r  r  ru   rv   rt   r+  rx   )r   r  r  rU  r  r  r   r   r   r   guard_error_hook  s   
r  c                 c  s.    t  }| D ]}||vr|V  || qd S r   )r  r   )seqr  r   r   r   r   unique*  s   
r  c                 C  sf   |r1|| kr1t |}t | }t|st| r%t|   d|  d||kr1t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   r5   UnsafeScriptObjectErrorr6  r  r  r  r  )
obj_sourcedupe_sourceser_source_is_localsource_is_localr   r   r   make_dupe_guard2  s   	r  )skipc                 G  s`   ddl m} ttjpttj}| jj	j
}|D ]}t|ts$J |||| d d qd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   )TracingContextr2   )collect_debug_stackr  N)torch._guardsr  r]  r`  ra  rb  rk  r  r  rx  r   r   r#   )r  rl   r  r  r   r   r   r   r   install_guardT  s   
r  )r   r'  r(  r)  )r   r)  r   r#   r(  r)  )rv   rD  r   r#   r(  rE  )r(  r  )r   rY   r  r  r  r!   r(  r)  )
r   rY   r  r  r  r  r  r!   r(  r)  )r  rU   r(  rE  )
r   rY   r  r  r  r  rU  ru  r  ri  )
__future__r   r+  r  r  r@  r	  r  r!  r   r  ra  r  r1  r  r  r  r  r  
contextlibr   r  r   r   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   torch.overridesr  torch._C._dynamo.guardsr   r   r   r   r   r   r   r   r   torch._dynamo.sourcer   r   r   r   r   r  r    r!   r"   r#   r$   r%   r&   r'   r(   torch._loggingr)   torch._utils_internalr*   %torch.fx.experimental.symbolic_shapesr+   r,   r-   torch.utils._ordered_setr.   torch.utils._tracebackr/   r0   torch.utils.weakr1   r   r3   r4   r5   r6   
eval_framer7   r   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r#  rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rm  numpyr   ModuleNotFoundErrorsympyrk   	getLoggerr   r-  r[  getArtifactLoggerr]  r  r  rk  rp   r   	lru_cacher  r  r&  r.  r4  r5  rC  rH  rN  r^  rb  rf  rA  rh  r  r  r  r
  rw  r  r  rF  rG  r  r  r  r  r~  r  r_  r  r  rV  r  r  r  r  r   r   r   r   <module>   s   0,,x H
 b	




%           vU  
[%

C
<
"