o
    ,h9                    @  s  U d Z 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 ddl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% dd
l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZH ddlImJZJ ddlKmLZLmMZMmNZNmOZOmPZP ddlQmRZS ddlTmUZU ddlVmWZWmXZX ddlYmZZZ ddl[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dZded< zddlZW n ey   dZY nw erddlmZ ddlmZ eeZe!jedZe!jed Ze!jed!Ze!jed"ZG d#d$ d$Zd%d& Zejd'd( Zdad)ed*< d+d, Zdd1d2Ze!jjjZdd6d7Zdd;d<Zdd>d?Zd@dA ZdBdC ZdDdE ZdFdG ZddKdLZejdMdNG dOdP dPZdQdR ZdSdT ZejG dUdV dVZG dWdX dXejȃZejdd[d\ZG d]d^ d^eBZG d_d` d`Zdadb ZG dcdd ddeZejG dedf dfZejG dgdh dhZG didj djejуZddmdnZG dodp dpZddrdsZdtdu Zdvdw Zdxdy Zdzd{ Zdd}d~ZdddZdddZdddZdd ZdddZe`e߃ dd Zdd ZddddZdS )a  
Core guard system for Dynamo that detects when compiled code needs to be recompiled due to
changes in program state. Guards are conditions that must remain true for previously-compiled
code to be valid for reuse.

This module provides the infrastructure for creating, managing and checking guards, including:
- Guard creation and composition
- Guard state management and invalidation
- Guard checking and failure handling
- Utilities for guard optimization and debugging
- Integration with Dynamo's compilation caching

The guard system is critical for Dynamo's ability to efficiently reuse compiled code while
maintaining correctness by detecting when recompilation is necessary due to changes in
program state, tensor properties, or control flow.
    )annotationsN)contextmanager)deepcopy)currentframe)AnyCallableNoReturnOptionalTYPE_CHECKINGUnion)ReferenceType)code_framelocals_names)
check_obj_idcheck_type_iddict_versionDictGuardManager install_no_tensor_aliasing_guardinstall_object_aliasing_guard!install_storage_overlapping_guardinstall_symbolic_shape_guardprofile_guard_managerRootGuardManager)get_global_source_nameget_local_source_nameIndexedSource$is_from_flatten_script_object_sourceis_from_local_sourceis_from_optimizer_sourceTensorPropertyTensorPropertySource)CompileEventLoggerget_metrics_context)	CompileContext	CompileIdDuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSourceStorageOverlap)
structured)justknobs_check)_CppShapeGuardsHelper_ShapeGuardsHelperEqualityConstraintis_symbolicSYMPY_INTERP)_pytree)
OrderedSet)format_framereport_compile_source_on_error)TensorWeakRef   )configconvert_frameexc)set_guard_error_hook)#AttrProxySource
AttrSourceCallFunctionNoArgsSourceCallMethodItemSourceChainedSourceConstantSourceConstDictKeySourceDataclassFieldsSourceDefaultsSourceDictGetItemSourceDictSubclassGetItemSourceFlattenScriptObjectSourceFloatTensorSourceFSDPNNModuleSourceGenericAttrSourceGetItemSourceGlobalSourceGlobalStateSourceGlobalWeakRefSource
GradSourceListGetItemSourceLocalSourceNNModuleSourceNumpyTensorSourceOptimizerSourceScriptObjectQualifiedNameSourceShapeEnvSourceSubclassAttrListSourceTorchFunctionModeStackSourceTupleIteratorGetItemSource
TypeSource"UnspecializedBuiltinNNModuleSourceUnspecializedNNModuleSourceUnspecializedParamBufferSourceWeakRefCallSource)
CacheEntryDynamoFrameType
ExtraStateGuardedCode	GuardFailGuardFilterEntryGuardFn)builtin_dict_keyscommon_constant_typesdataclass_fields	dict_keys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)OutputGraphGuardsState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  sn   |d u r	t  | _n|| _d | _d | _d | _g | _d | _d | _d | _d | _	d | _
i | _g | _t | _t | _d S N)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setprinted_relational_guardsr3   diff_guard_sources)selfr    r   O/var/www/html/scripts/venv/lib/python3.10/site-packages/torch/_dynamo/guards.py__init__   s    
zGuardManagerWrapper.__init__c                 c  s*    t  | _z
d V  W t  | _d S t  | _w r   )r   r   r   r   r   r   #_preserve_printed_relational_guards   s
   z7GuardManagerWrapper._preserve_printed_relational_guardsc                   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)r   r   r   r   )r   r   r   r   r   collect_diff_guard_sources   s
   

z.GuardManagerWrapper.collect_diff_guard_sourcesc                 C  s   |    |   d S r   )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   r   r   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)r   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__r   )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_line2  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   |  k | D ]0}t|tjjjjr1|| jvr(| j	| |
| | q	|
|jjg q	|
| | q	t|trE| || t| | D ]\}}|| |d|   | || qNW d    d S 1 srw   Y  d S )Nzaccessed_by=)r   get_leaf_guardsr   torch_C_dynamor{   RelationalGuardr   r   
writelinesr   r   r   r   r   zipget_accessorsr   r   r   reprr   )r   r   r   r   accessorr   r   r   r   r   F  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   prefixg     zDGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.prefixFc                   s(   |r
t  | d S t  d|  d S )Nz+- )superr   )r   lineskip_prefixr   r   r   r   j  s   zGGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.writelineF)r   
__module____qualname__r   r   __classcell__r   r   r   r   IndentedBufferWithPrefixf  s    r   r7    T)r   zTREE_GUARD_MANAGER:r   get_epilogue_lambda_guards)torch._inductor.utilsr   r   r   r   r   r   hasattrr   r   r   getvalue)r   r   r   r   r   r   r   r   __str__c  s   


$zGuardManagerWrapper.__str__c                 C     | j |S r   )r   checkr   xr   r   r   r   |     zGuardManagerWrapper.checkc                 C  r   r   )r   check_verboser   r   r   r   r     r   z!GuardManagerWrapper.check_verbosec                   s.   t  dd   fddj d S )Nc                 S  s2   g }|   D ]}|dd  }|| q|S )N#r   )r   splitrstripappend)
leaf_guardr   verbose_code_part	code_partr   r   r   get_code_parts  s
   zMGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.get_code_partsc                   sn   |   D ]%}t|tjjjjr!|vr j | 	| qj | q| 
 D ]}| q.d S r   )r   r   r   r   r   r{   r   r   extendr   r   )r   r   r   r   relational_guards_seenr   r   r   r   r     s   

zDGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.visit)r   r   r   r   r   r   !populate_code_parts_for_debugging  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   r      s"    

1
r   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 rSi 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dtjdtd u r5d ntjdtddtjdtjjdtj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   t || S r   )dict__contains__)r  br   r   r   <lambda>      z#_get_closure_vars.<locals>.<lambda>___tuple_iterator_len___normalize_range_iter___tuple_iterator_getitem___dataclass_fields#___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__rp   r   ru   rq   rt   rh   rl   mathisnanr  float	importlibimport_moduler   utils_devicer+  r  _as_tensor_fullprecr	  r   r   r   r   _get_closure_vars  sT   	
r9  r   ast.ASTreturnstrc                 C  s   t | ddS )N
r   )astunparsereplacer   r   r   r   _ast_unparse     rA  r   r   r%   c                 C  s   d}|d ur=|j r#t|j D ]}|jt vr!dt|dd } nqn|jr=|j }t|dkr;dt|d  }nd}| d| S )	Nr   z  # T)r   r   z  # <unknown>z<60)
user_stackreversedfilenamer  r4   stacksummarylen)r   r   extrafsrH  r   r   r   get_verbose_code_part  s   
rL  r   Union[str | list[str]]	list[str]c                   s"   t | ts| g}  fdd| D S )Nc                   s   g | ]}t | qS r   )rL  )r   r   r   r   r   r     r  z*get_verbose_code_parts.<locals>.<listcomp>)r   list)r   r   r   rO  r   get_verbose_code_parts  s   
rQ  Optional[int]c                 C  s2   | d u rd S t | s| S t| tjsJ | j S r   )r0   r   r   SymIntr   maybe_as_intdimr   r   r   convert_int_to_concrete_values  s   
rW  c                 C  s   dd | D S )Nc                 S     g | ]}t |qS r   )rW  )r   rV  r   r   r   r         z.convert_to_concrete_values.<locals>.<listcomp>r   )size_or_strider   r   r   convert_to_concrete_values      r[  c                 C  sh   |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=))	r   r   _dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper+  indexrequires_gradr   )valuenamesizesstridespytypedispatch_keysdispatch_keyr`  device_indexrb  	guard_strr   r   r   get_tensor_guard_code_part  s"   rl  c                 C  s   t t| |S r   )rP  rf   ra  )dctkeyr   r   r   get_key_index  s   ro  c                 C  s   d|  d| dS )Nlist(dict.keys())[]r   )r   ra  r   r   r   get_key_index_source  rB  rs  objr   r   c                 C  s"   t dt|  d|  dd d )NType  for object  cannot be saved @into torch.compile() package since it's defined in local scope. @Please define the class at global scope (top level of a module).)	TypeErrortype)rt  r   r   r   raise_local_type_error  s   r|  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_dictNOptional[str]l1_keyl2_key)r   r   r   r  __annotations__r  r  r   r   r   r   r~  &  s   
 r~  c           
      C  s   | j  }t| jtr| jj}nt|tsJ t|| j}t||}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[rr  ra  r   example_valueguard_manager_enum == )baserd  r   ra  rB   r  ro  rs  rP  rf   intr<  get_key_managerGuardManagerTypeGUARD_MANAGERadd_equals_match_guardget_value_manager)
r   base_guard_managerbase_example_valuer  r  base_source_namera  
key_sourcekey_example_valuevalue_sourcer   r   r   getitem_on_dict_manager5  s4   


r  c                 C  s4   | j }t|tr
dS |  rdS | ot|t S NFT)originating_sourcer   rS   is_specialized_nn_moduleis_dict_keyrO   )r   r   r   r   r   match_on_id_for_tensor^  s   
r  c                   @     e Zd ZU ded< ded< dS )GuardCodeListrN  	code_listr%   r   Nr   r   r   r  r   r   r   r   r  m     
 r  c                   @  s   e Zd ZdZdZdS )r  r7      N)r   r   r   r  DICT_GUARD_MANAGERr   r   r   r   r  s  s    r  codetypes.CodeTypec                 C  s   t tt| S r   )rP  rE  r   )r  r   r   r   &code_framelocals_names_reversed_cachedx     r  c                   @  s  e Zd Z	ddd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ddd4d5Zdd7d8Zdd:d;Zdd<d=Zddd?d@ZddAdBZddCdDZddHdIZddJdKZddLdMZddNdOZdddPdQZddRdSZddTdUZddVdWZddXdYZddZd[Z dd\d]Z!ddd_d`Z"ddadbZ#ddcddZ$ddedfZ%ddgdhZ&ddidjZ'dkdl Z(dmdn Z)dodp Z*dqdr Z+dsdt Z,dudv Z-dwdx Z.dydz Z/dd{d|Z0dd}d~Z1dddZ2dddZ3dddZ4dddZ5ddddZ6dddZ7dS )GuardBuilderNf_coder  id_refCallable[[Any, str], str]
source_refCallable[[Source], str]lookup_weakrefs)Callable[[object], ReferenceType[object]]local_scopedict[str, object]r   r   r   check_fn_managerCheckFunctionManagerserialization_moder  c
                 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  r  scopebuiltins__dict__copyr   packagepackage_importer_package_imported_modulesr   r@  r   argnamesr  shape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managersr  r   key_order_guarded_dict_idsoutput_graphguard_on_key_orderr   idgetrd  r   _cached_guard_managers_cached_duplicate_input_guardsr  )r   r  r  r  r  r  r   r   r  r  rd  package_moduler   r   r   r   r   ~  s8   
zGuardBuilder.__init__c           	      C  s   |  |}t|trtd|j |j }t|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 )ra  r  rr  rn  r   r  r  )
get_guard_managerr   r   NotImplementedErrorrd  r  rf   rE   get_guard_manager_typedict_getitem_manager)	r   r  r   dict_mgrdict_sourcern  rc  r  r  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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 r  z__check_obj_id(r   r]  r  )r  r   r   r  rd  	enumeraterf   rs  r  r  r  ro   r  add_id_match_guardrQ  r  )	r   rc  r   r  r   rn  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  r7   zMGuards may run slower on Python 3.13.0. Consider upgrading to Python 3.13.1+.)r8   issue_3_13_0_warningsysversion_infowarningswarnRuntimeWarning)r  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 )Nrp  rq  rr  r  r  r  )	r   r   ro  r  r  r  r  r  r  )r   rn  source_namer  r  r  ra  r  r   r   r   getitem_on_dict_mgr.  s,   

z>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrFNT_parameters_buffers_modulesattrr   r  r  	.__dict__r   r  r  )r   rn  r  r  r  r  )memberr  r   r	  getmror   updatekeysr~  r  getattr_managerr  r  r=   r  rd  r  get_generic_dict_managerr  r  r  )r   r   r  r  r  r  r  r  r  	attr_namemod_dictall_class_attribute_namesr   accessor_infor  r  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)rd  r  r  r  )r   r   r  obj_idr   r   r   requires_key_order_guarding  s
   
z(GuardBuilder.requires_key_order_guardingc                 C  s<   t j}| |rt|trt j}|S t|tsJ t j}|S r   )r  r  r  r   ri   r  r  )r   r   r  r  r   r   r   r    s   

z#GuardBuilder.get_guard_manager_typec                 C  s
   |t jkS r   )r  r  )r   mgr_enumr   r   r   manager_guards_on_keys     
z#GuardBuilder.manager_guards_on_keysc                 C  s$   | j jj| jd d| jd tjdS )Nr  )	f_globalsr   r  r  )r   r   globals_dict_managerr  r  r  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rpt| j}
t|
|
 j d }|j j|f|||d}n't tr|  j j|||d}nt tr|  j j|||d}nt tr|S t tr|S t tr|sJ |j|||d}nt ttt t!t"fr|sJ |}nt t#r|j$ fdd|||d}nt t%r|sJ |j&|||d}nt t'r|sJ |j( j)|||d	}nt t*t+fr;|sJ t|t,j-j.r/t/|t0u r/| 1 ||||||}nh|j2 j)|||d	}n\t t3t4fr|sHJ t|t5t6j7fsSJ t|t8rk| 9|	saJ t: ||||}n,t jt;rvt<d
|j j|||d}nt t=rt>|d j?j@  d jA|||d}nt tBr|sJ |jC jA|||d}nt tDr|sJ |jE j|||d}nt tFr&|sJ t|t5t6j7frJ dt|tGr jHs|jE j|||d}nt|tIr jHs|jJ j|||d}n j} jHr K }|jL||||d}nqt tMr{|s1J tN|s8J  jOsP|jP||jQtjdjL jR|||d}nG|jS}|d usZJ |d }|jT||tjd}t|t8roJ |j jR|||d}nt tUr|sJ |j$tV|||d}nt tWr|sJ |j$dd |||d}nt tXr|sJ |j$dd |||d}nt tYr|sJ |j$dd |||d}nt tZr|sJ |j$dd |||d}nt t[r|sJ |j$dd |||d}nt t\r|sJ |j$dd |||d}n|t t]r1|s&J |j^ j|||d}nft t;rLt|t8sAt_d|j` j|||d}nKt tar`|sWJ |jb|||d}n7t tcrt|skJ |jd|||d}n#t ter|sJ |j$dd |||d}nt_d  d   || j  < |S )Nr   r7   r  )global_namer   r  r  r  c                   s   t   S r   )rl   
_get_index)r  r   r   r   r  "  s    z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>)python_lambdar   r  r  r  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_ordertensor_property__manager)r   r   r  r  zUse DictGetItemSourcez.__kwdefaults__c                 S  s   |   d S r   __tensor_flatten__r   r   r   r   r    r   c                 S     |   S r   )__obj_flatten__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  c                 S  r  r   )itemr  r   r   r   r    r  c                 S  s
   t | S r   )r   r8  r  r   r   r   r    s   
 r  z4ConstDictKeySource can only work on DictGuardManagerc                 S  s   t | S r   )rh   r  r   r   r   r    r  zmissing guard manager builder z - )fr   r   rd  r  r  r  r  r  r   r@   r  get_guard_manager_from_sourcern   rQ   r  r  rI  ra  
local_nameframelocals_managerrL   r  r  r  rN   global_weakref_managerrM   rV   rZ   type_managerrT   rR   r\   r[   rI   rX   lambda_managerrO   grad_managerrJ   generic_getattr_managerr  r=   r]   r   nnModulerj   rv   r  r  rE   rF   r  r.  r/  r   r  r  rB   RuntimeErrorr   getattrproplowerr   r   indexed_managerrP   list_getitem_managerrK   rP  index_is_slicetupletuple_getitem_managerunpack_slicegetitem_managerrD   callableis_kwfunc_defaults_manager__defaults__idx_key__kwdefaults__func_kwdefaults_managerrS   r  rW   rG   rU   r<   r?   rH   rY   tuple_iterator_getitem_managerAssertionErrorr  r^   weakref_call_managerr>   call_function_no_args_managerrC   )r   r   root_guard_managerr  r  r  r  r  r  base_guard_manager_enumframelocals_names_reversedframelocals_idxoutra  
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_managerTc                 C  s   |d u rt  }d| }t||\}}i }d| jd i}	td| t||	| |d |  }
|r>| j	j
|
| d S | j	j
|
| d S )Nr   r  zPython shape guard function:
%s___make_guard_fn)r9  joinr  build_guard_functionr  
guards_logdebugexecvaluesr   r   add_epilogue_lambda_guardadd_lambda_guard)r   r   r   r   is_epiloguemake_guard_fn_args_guard_bodypycoderA  globals_for_guard_fnguard_fnr   r   r   $add_python_lambda_leaf_guard_to_root.  s   z1GuardBuilder.add_python_lambda_leaf_guard_to_rootrd  r<  r   Optional[dict[str, Any]]r;  r   c                 C  s   |d u rt  }t|| j|S r   )r9  evalr  )r   rd  r   r   r   r   r  Q  s   zGuardBuilder.getUnion[str, Guard]c                 C  s^   t |tr|}n|j}t|}|| jvr-tjj|}|r-|dkr't	
d| | j| |S )Nr  zinvalid var name: %s)r   r<  rd  strip_function_callr  r   r   r   is_valid_var_namelogwarningr   )r   r   rd  r  is_validr   r   r   arg_ref[  s   

zGuardBuilder.arg_refr  c                 C  s.   t |j|}t|||j|jd}||  d S )N)rG  rD  )r=   r  r%   rG  rD  create)r   r   r  rS  attr_source	new_guardr   r   r   _guard_on_attributek  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   r]  znot hasattr()provided_guarded_objectr  )r  r   rR   r  r=   rd  r  r]  r   r  _set_guard_export_infor  r  r   r%  r&  rj   rv   r  r  add_no_hasattr_guardrQ  )r   r   r   base_sourcer  r  refvalr  base_managerr  r  r  r   r   r   HASATTRt  sT   





zGuardBuilder.HASATTRNonec           	      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  rd  r   r   r%  r&  r  r  r  r  r  r  add_dict_contains_guardrQ  )	r   r   r  rg  rh  ri  r  r  r  r   r   r   NOT_PRESENT_IN_GENERIC_DICT  s   


z(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICTc                 C  s   |  |j}t|tjjr|jr|j}nt|}| jdkr'|j	|j
kr't| | |d|j d}d| | d| d}| ||g | ||t|| d S )Nsavetype(r]  z___check_type_id(r   )r  rd  r   r   _subclasses
FakeTensorrg  r{  r  r   r   r|  r  r]  rd  r  add_type_match_guardrQ  )r   r   rc  r   r  r  r   r   r   
TYPE_MATCH  s   


zGuardBuilder.TYPE_MATCHc                 C  sx   | j dkrtjjd| |}| |j}t| |j}d| d| }| 	||g | 
||t|| d S )Nrn  z(DICT_VERSION guard cannot be serialized.z___dict_version() == )r  r   r   r:   PackageErrorr]  r  rd  r   rd  r  add_dict_version_guardrQ  )r   r   rg  rh  versionr  r   r   r   DICT_VERSION  s   



zGuardBuilder.DICT_VERSIONrn  invertr  c                 C  sZ   |  |}|r	dnd}| d|d| d}| ||g | || |t|| d S )Nnot r   z___dict_contains(r   r]  )r]  rd  r  rl  rQ  )r   r   rn  ry  dict_ref	maybe_notr  r   r   r   DICT_CONTAINS  s   

zGuardBuilder.DICT_CONTAINSc                 C  sx   |  |}| |j}t|tsJ | d|g}| || |r/| |t|| d S | |	t|| d S )Nr  )
r]  r  rd  rn   r  rd  r  add_true_match_guardrQ  add_false_match_guardr   r   rg  rh  r  r   r   r   
BOOL_MATCH  s   


zGuardBuilder.BOOL_MATCHc                 C  sT   |  |}| |j}|d u sJ | dg}| || | |t|| d S )Nz is None)r]  r  rd  rd  r  add_none_match_guardrQ  r  r   r   r   
NONE_MATCH   s   

zGuardBuilder.NONE_MATCHc                 C  s   | j dkrtjjdt|jtr| t	|jj
tjS | |}| |j}| ||j}d| d| d}| ||g | ||t|| t|jtrlt|tjjrn|jj}| |}|d urp|| j|< d S d S d S d S )Nrn  z$ID_MATCH guard cannot be serialized.z___check_obj_id(r   r]  )r  r   r   r:   ru  r   r  rZ   rs  r%   r  r  r]  r  rd  r  rd  r  r  rQ  rQ   r%  r&  r  r  r   )r   r   rg  rh  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 )N is not None)
r]  r  rd  r   r   Tensorrd  r  add_not_none_guardrQ  )r   r   rc  rg  rh  r  r   r   r   NOT_NONE_MATCH,  s   


zGuardBuilder.NOT_NONE_MATCHc                 C  sT   |  |}| |j}t|tjjsJ | d|d}| ||t	|| d S )Nz.raw_repr() == z.raw_repr())
r]  r  rd  r   r   r   DispatchKeySetr  add_dispatch_key_set_guardrQ  )r   r   rg  rh  r   r   r   r   DISPATCH_KEY_SET_MATCH7  s   


z#GuardBuilder.DISPATCH_KEY_SET_MATCHc                 C  s   |  |dtj d S )Nr   )ra  r  EQUALS_MATCHrD  r   r   r   
NAME_MATCHA  s   zGuardBuilder.NAME_MATCHc                   sT   | 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   fnM  r	  z#GuardBuilder.DUAL_LEVEL.<locals>.fn)r  r  r  rd  r   autogradr  r   r   rM  rQ  r   r   r  r  r   r  r   
DUAL_LEVELD  s   

zGuardBuilder.DUAL_LEVELc                   sd   | j 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   X  rY  z6GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.<listcomp>z5torch._functorch.pyfunctorch.compare_functorch_state(r]  c                   s    S r   r   r  
compare_fnstatesr   r   r  _     z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn)r  r  functorch_layersrd  r   
_functorchpyfunctorchcompare_functorch_stater   r   rM  rQ  )r   r   cisr  r  r   r  r   FUNCTORCH_STACK_MATCHT  s   


z"GuardBuilder.FUNCTORCH_STACK_MATCHc                   sp   t jjjjt jjjj  fdd d g}| || fdd}| jj	|t
|| d S )Nc                   s"    | sd S | \}}t tt| S r   )r.  mapr  )hooks	pack_hookunpack_hook)are_inline_hooksr   r   hooks_ids_fnl  s   z?GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.hooks_ids_fnzCtorch._functorch.aot_autograd.utils.top_saved_tensors_hooks ids == c                   s     kS r   r   r  )	get_hooksguard_hooks_idsr  r   r   r  z  r\  z5GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.fn)r   r  _aot_autogradr6  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineablerd  r   r   rM  rQ  r  r   )r  r  r  r  r   AUTOGRAD_SAVED_TENSORS_HOOKSf  s   


z)GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKSc                   s   |  |jt|  |j d  tdr#t  fdd}n fdd}dt| dt  }| 	|
|t|| d S )Nr7   __metadata_guard__c                   s     |  d S Nr7   )r  r  r  original_metadatarc  r   r   metadata_checker  s   zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checkerc                   s   |   d  kS r  r  r  )r  r   r   r    r   ___check_metadata__c)r  rd  r   r  r   rw   r  r"   current_compile_idr  rM  rQ  )r   r   r  r  r   r  r   TENSOR_SUBCLASS_METADATA_MATCH  s   


z+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCHrecompile_hintc                   s8  |  |}| |j}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tjh||B }tj r^ddlm} ddlm}	m }
m!}m"} ||||
||	f }ddl#m$} ||f }dd l%m&  m'} t(||s|)t|sJ dt| t(|t*rt+,|r| -| g }|.d| d | /|| | 0|1t2 d	 t3|| d S t(|t4rt,|r| -| g }|.d
| d | /|| | 0|1t2 d t3|| d S | d|g}t(||rt5|}t3||} r fdd|D }| 0|6|| | /|| d S )Nr   r   )
DeviceMesh)_StridedShardPartial	ReplicateShard)_IntWrapperzUnexpected type z__math_isnan(r]  r&  z__numpy_isnan(r'  r  c                   s   g | ]
}| d   dqS )z (HINT: r]  r   r   r  r   r   r     s    z-GuardBuilder.EQUALS_MATCH.<locals>.<listcomp>)7r]  r  rd  r  int8int16int32int64uint8uint16uint32uint64float16float32float64rP  r   r.  rg   r{  	frozensetslicerangeri   r   Sizedistributedis_availabletorch.distributed.device_meshr  (torch.distributed.tensor.placement_typesr  r  r  r  torch.export.dynamic_shapesr  torch.utils._pytreer6  r2   rn   is_constant_classr3  r1  r2  rs  r   rd  r  rM  r9  rQ  complexr   r  )r   r   r  rg  rh  np_typesok_mutable_typesok_typesr  r  r  r  r  r  pytreer  r   r   r  r   r    s   
	








zGuardBuilder.EQUALS_MATCHc                 C  sb   |  |j}t|tr| | d S |d u r| | d S t|tjr*| | d S | 	| d S r   )
r  rd  rn   r  r  r  typesCodeTyper  r  r   r   rh  r   r   r   CONSTANT_MATCH  s   
zGuardBuilder.CONSTANT_MATCHc                 C  s   | j dkrtjjd| | | |j}t|dr.t	|j
ts$J | |dtj d S tjdddt| ddgd	 d S )
Nrn  z%NN_MODULE guard cannot be serialized.trainingz-Attempted to guard on uninitialized nn.Moduler   zKAttempted to setup an NN_MODULE guard on uninitialized nn.Module subclass `z`.zIEnsure the `nn.Module` subclass instance has called `super().__init__()`.)gb_typecontextexplanationhints)r  r   r   r:   ru  r  r  rd  r   rn   r  r  ra  r  r  unimplemented_v2r{  r  r   r   r   	NN_MODULE  s$   



zGuardBuilder.NN_MODULEc                 C  s"   | j dkrtjjd| |S )z0things like torch.add and user defined functionsrn  z*FUNCTION_MATCH guard cannot be serialized.)r  r   r   r:   ru  r  rD  r   r   r   FUNCTION_MATCH#  s
   

zGuardBuilder.FUNCTION_MATCHc                 C  sn   | j dkrtjjd| |j}t|tj	kr0t
|dr0| |dtj | |dtj dS | | dS )z!matches a closure by __code__ id.rn  z)CLOSURE_MATCH guard cannot be serialized.__code__N)r  r   r   r:   ru  r  rd  r{  r  FunctionTyper   ra  r  rj  r  r  r   r   r   CLOSURE_MATCH,  s   
zGuardBuilder.CLOSURE_MATCHc                 C  s
   |  |S r   )r  rD  r   r   r   BUILTIN_MATCH;  r	  zGuardBuilder.BUILTIN_MATCHc                 C  s   |  |}| |j}t|ts| | g }t|dkr&|d|  n|d| dt|  | || t|trN| 	|
t|t|| d S | 	|t|t|| d S )Nr   rz  zlen(rt  )r]  r  rd  r   r  rs  rI  r   rd  r  add_dict_length_check_guardrQ  add_length_check_guardr   r   rg  rc  r  r   r   r   SEQUENCE_LENGTH>  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(rt  ro  r]  )r]  r  rd  r{  r   ru   rd  r  r  add_tuple_iterator_length_guardrQ  )r   r   rg  rc  r   r  r  r   r   r   TUPLE_ITERATOR_LENX  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(rt  ro  r]  )r]  r  rd  r{  rq   r   rd  r  r  add_range_iterator_match_guardrQ  )r   r   rg  rc  r   r  normalized_range_iterr  startstopstepr   r   r   RANGE_ITERATOR_MATCHh  s   


z!GuardBuilder.RANGE_ITERATOR_MATCHc                 C  s   | j dkrtjjd| |}| | }t|js!t|r#d S ||f}|| j	v r.d S | j	
||f | j	
||f | d| g}| || t| || |t|| d S )Nrn  z/DUPLICATE_INPUT guard cannot be serialized yet. is )r  r   r   r:   ru  r]  rd  r   r  r  r   rd  r   r  r  rQ  )r   r   source_bref_aref_brn  r  r   r   r   DUPLICATE_INPUT{  s0   


zGuardBuilder.DUPLICATE_INPUTc                 C  sP   | j dkrtjjd| | dg}| || | |t	|| d S )Nrn  z)WEAKREF_ALIVE guard cannot be serialized.r  )
r  r   r   r:   ru  r]  rd  r  r  rQ  r   r   r  r   r   r   WEAKREF_ALIVE  s   

zGuardBuilder.WEAKREF_ALIVEc                 C  sZ   |  |}| |j}g }|d| dt|   | || | ||| dS )z7Guard on the key order of types.MappingProxyType objectzlist(z.keys()) == N)	r]  r  rd  r   rP  r  rd  r  add_mapping_keys_guardr  r   r   r   MAPPING_KEYS_CHECK  s   
zGuardBuilder.MAPPING_KEYS_CHECKc                 C  s   |  |}| |j}|tjjju r| | dS | | g }|	d| dt
t| | || | |jrC| || dS | || dS )z6Insert guard to check that the keys of a dict are sameNrp  z)) == )r]  r  rd  r   r6  r2   SUPPORTED_NODESrx  r  r   rP  rf   rd  r  r  r  r  r  r   r   r   DICT_KEYS_MATCH  s   


zGuardBuilder.DICT_KEYS_MATCHc                 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)r8   skip_nnmodule_hook_guardsr  rD  r   r   r   EMPTY_NN_MODULE_HOOKS_DICT  s   z'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICTc                 C     d S r   r   rD  r   r   r   	GRAD_MODE     zGuardBuilder.GRAD_MODEc                 C  r  r   r   rD  r   r   r   DETERMINISTIC_ALGORITHMS  r  z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  r  r   r   rD  r   r   r   TORCH_FUNCTION_STATE  r  z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  r  r   r   rD  r   r   r   FSDP_TRAINING_STATE  r  z GuardBuilder.FSDP_TRAINING_STATEc                 C  sH   |j tju sJ d| jjjg}| || | |t	|| dS )z/Guard on CURRENT_DEVICE per torch.utils._devicezutils_device.CURRENT_DEVICE == N)
r   r(   GLOBALr  r  current_devicerd  r  add_default_device_guardrQ  r  r   r   r   DEFAULT_DEVICE  s   
zGuardBuilder.DEFAULT_DEVICEc           "        s(  |j dksJ jjjdkr.jjd usJ jj}|j}|j}|jd ur*|j}|j}nj	dd D fdd}j
r{i }g }	g }
i }t }j
D ]}|jjv rgtjj||j||	|
|| qOtd qOt|	|
t| |dd	 nd   fd
d}tjrz|d\}}}d}W n ty   d}|d\}}Y n	w d}|d\}}jjjsj  jdkrt d}|d u st|tsJ |d u rg nt|j ! }t"|||||dj_|j#D ]	}$||g qt%&  }r|j'(|j# g }g }|s\|sJ |j#|j }}|sd S |) D ]=\}}t|t*r,d}qj|  i t+t, d}t|t-rI|.||f qt|t/rX|.||f qd}q|sdd l0}ddl1m2} |snJ |j#|j }}t3|| }zdfddt4|D }d5dd t4|D }d5dd t4|D }|rd| d}|rd| d}t67d| d| dd 5| d!}t89d"||j# |:|} |;| j<|j=j>}!|!sJ W n tj?j@jAy   Y nw tB|tC|tC||!| |j# d S |j#rjD|j#|j#i t+t, d d S d S )#Nr   loadc                 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   rU  r   r   r     s    z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)t_idrV  )r  rU  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              	     s8   j jdd D dd D  jjjj | dS )Nc                 S  r  r   )faker  r   r   r   r   %  r  zCGuardBuilder.SHAPE_ENV.<locals>._get_code_parts.<locals>.<listcomp>c                 S  r  r   r  r  r   r   r   r   &  r  )input_contextsequalities_inputsr  ignore_staticlangs)	shape_envproduce_guards_verboser  r  r  export)r   r  rK  r  r  r   r   r   _get_code_parts#  s   
z/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts)pythonverbose_pythoncppT)r&  r'  rn  cpp_code_parts)python_code_partsr   r)  python_fallbackshape_env_sources)r   r   )CppCodeCachec                   s    g | ]\}}  t||qS r   )r  r   )r   ir   r   r   r   r     s    r   c                 s  (    | ]\}\}}| d | dV  qdS )z = int_values[rr  Nr   r   r.  r  symbolr   r   r   	<genexpr>  
    

z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>c                 s  r/  )z = float_values[rr  Nr   r0  r   r   r   r2    r3  zint64_t ;zdouble a  
                #include <algorithm>
                #include <cstdint>
                #include <cmath>
                #include <c10/util/generic_math.h>

                #if defined(_MSC_VER)
                #  define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
                #else
                #  define EXTERN_DLL_EXPORT extern "C"
                #endif

                EXTERN_DLL_EXPORT int8_t guard(int64_t *int_values, double *float_values) {
                  z
                  z
                  return (z) && (z%);
                }
                zC++ shape guard function: %s %s)Erd  r  r  r  shape_code_partsr*  r   r)  r+  tracked_fakesexport_constraintsr   r  r  r   r#  dynamic_shapes_process_equalitiesr!  rZ  r[  r/   rP  rK  r8    enable_cpp_symbolic_shape_guardsOverflowErrorfreezelocalsr  r   r-   source_to_symbolr  ShapeCodePartsexprsrd  r"   try_getshape_env_guardsr   r   rA   r1   r9  r  r   r3  ctypestorch._inductor.codecacher-  r  r  rF  textwrapdedentrH  rI  r  castr   c_void_prc  	_inductorr:   InvalidCxxCompilerr   rI  rT  )"r   r   r5  r*  r   r)  r+  r  namesr  r  r  r  
constraintr%  maybe_cpp_code_partsmaybe_shape_env_sourcesr  compile_contextint_source_to_symbolfloat_source_to_symbolr   r>  r   r1  r  rC  r-  guard_managersint_symbols_strfloat_symbols_strfunc_strclibcguardr   r$  r   	SHAPE_ENV  s<  
















zGuardBuilder.SHAPE_ENVc              
   C  s   t jr	| r	d S t|r| | d S t|tr| }|d ur"|n| |j}t	|}t
j|}t|t
jjrI|jd urA|j}|jd urI|j}t|t
jsQJ t jrst|t
jjrst }|d|  |d|j |dd | |}g }| jjjr| | g d}|D ]2}	| |d |	 }
t|
t
jt
j fr|!d| d|	 dt"|
 q|!| d|	 d	|
  qn^| #|}t j$rt|t
jjst|j%t&s| j'!| | j(!| | jj}|j)|j% }t*|d
 }t*|d }t+t,|||||||}|-||||||| t|t
jjs| j.j/0|j |j1d us$J t2|d|j%d\}}|sot3|drX|j4}d| d| d| d}|!| | #|5|t+|| nd| d}|!| | #|6dt+|| t7|dkr~| 8|| d S d S )Nparam_numelparam_bytesparam_countr7   )r`  r+  rb  zndimension()r  zstr(rt  r  sizestrideT)	is_tensortensor_source_dynamo_dynamic_indicesz((z"._dynamo_dynamic_indices.issubset(z)) if hasattr(z', '_dynamo_dynamic_indices') else True)rb  z%, '_dynamo_dynamic_indices') == Falser   )9r8   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler  r  r   r6   r  rd  r{  r   r   _dispatch_keysrp  rq  rg  rh  r  log_compilation_metricsr%  	Parameterr!   	incrementnumelnbytesr]  r  r  r#  rs  rn   r+  r`  r   r<  r  ,skip_no_tensor_aliasing_guards_on_parametersr  rS   r  r  input_source_to_sizes_stridesr[  rQ  rl  add_tensor_match_guardr   r   r   r   rs   r   r`  add_dynamic_indices_guardre  rI  rd  )r   r   rc  rg  rh  metrics_contexttensor_namer  termsterm
real_valuer   r  metadatar\  r]  r   static_reasondynamic_indicesr   r   r   r   TENSOR_MATCH  s   





"








zGuardBuilder.TENSOR_MATCHc                 C  s   t  }|d us	J |j}~|d usJ |jj}~|| jjv s%J d| |d u r6|j}|s0d n| |}n|}|d urCt	t
|nd }	d }
t|jdddk}|r_t|tjtfs_t	|}
|||	||
 d S )NzH_produce_guard_code must be called from inside GuardedCode. Called from __weakrefoffset__r   )r   f_backr  co_namer   r  rd  r  weakrefrg  r{  r(  r   enumEnumr.  set_export_info)r   r   r  rc  	cur_framecaller	func_namerd  guarded_objectguarded_object_typeobj_refsupports_weakrefr   r   r   rd  	  s6   
z#GuardBuilder._set_guard_export_infor   )r  r  r  r  r  r  r  r  r  r  r   r  r   r   r  r  r  r  )r   r%   )NT)rd  r<  r   rU  r;  r   )r   rW  r;  r<  )r   r%   r  r<  )r   r%   r;  rk  )r   r%   rn  r<  ry  r  )r   r%   r  r  )8r   r   r   r   r  r  staticmethodr  r  r  r  r  r  r  r  rT  r  r]  ra  rj  rm  rs  rx  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  rX  rv  rd  r   r   r   r   r  }  s|    A&
   
h
#



	6





 







l


	







 m /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 )PyExprCSEPassr7   c                   @  r  )PyExprCSEPass.Configzdict[str, int]
expr_countzdict[str, str]expr_to_nameNr  r   r   r   r   Config	  r  r  c                      s(   e Zd ZdddZd fd
dZ  ZS )zPyExprCSEPass.ExprCounterr8   r  r;  rk  c                 C  s
   || _ d S r   )_config)r   r8   r   r   r   r   	  r	  z"PyExprCSEPass.ExprCounter.__init__r   r:  r   c                   s4   t |tjr| jjt|  d7  < t | d S r  )r   r  ALLOWED_NODE_TYPESr  r  rA  r   r   )r   r   r   r   r   r   	  s   zPyExprCSEPass.ExprCounter.visit)r8   r  r;  rk  r   r:  r;  r   r   r   r   r   r   r   r   r   r   r   ExprCounter	  s    
r  c                      s,   e Zd Zd fddZd fddZ  ZS )zPyExprCSEPass.Replacerr8   r  gen_nameCallable[[], str]r;  rk  c                   s    t    || _|| _g | _d S r   )r   r   r  	_gen_namepreface)r   r8   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  rA  r  r  USE_THRESHOLDr  r   r   r  r  r   r>  NameLoad)r   r   exprnode_expr_var_namer   r   r   r   	  s   zPyExprCSEPass.Replacer.visit)r8   r  r  r  r;  rk  r  r  r   r   r   r   Replacer	  s    
r  r;  rk  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 r  )r  )r   r   rd  r   r   r   _new_var 
  s   zPyExprCSEPass._new_varr@  rN  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SyntaxErrorrZ  	exceptionlineno)r   r@  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>  r  r  rA  )r   r  replacernew_noder   r   r   r@  
  s   zPyExprCSEPass.replaceN)r;  rk  )r  )r   r<  r;  r<  )r@  rN  r;  rk  r  r<  r;  r  )r   r   r   r  r>  	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr  NodeTransformerr  r   r  r  r@  r   r   r   r   r  	  s    	
%
	r  c                 C  s   t | jtptjo| jtju S r   )r   r  rD   r8    guard_nn_modules_using_dict_tags	create_fnr  r  rO  r   r   r   must_add_nn_module_guards
  s   
r  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   reasonr   r   r   r   #
  s   

z#DeletedGuardManagerWrapper.__init__c                 C  s
   d | _ d S r   )r   r   r   r   r   r   '
  r	  z6DeletedGuardManagerWrapper.populate_diff_guard_manager)r   r   r   r   r   r   r   r   r   r   r  "
  s    r  c                   @  s6   e Zd ZU ded< ded< ded< ded< ded	< d
S )r?  r.   r*  r   zOptional[_CppShapeGuardsHelper]r)  r  r+  zlist[Source]r,  Nr  r   r   r   r   r?  +
  s   
 r?  c                   @  r  )GuardsStaterz   r  Optional[ShapeCodeParts]r5  Nr  r   r   r   r   r  4
  r  r  c                      s~   e Zd Z fddZedd Zedd Zedd ZedddZedddZ	edddZ
edd Zdd Z  ZS )GuardsStatePicklerc                   s0   t  j|i | tj | _tjj | _d S r   )	r   r   r   rp  FakeTensorMode	fake_modefake_tensorFakeTensorConvertertensor_converter)r   r   kwargsr   r   r   r   ;
  s   zGuardsStatePickler.__init__c                 C  s   t j }|| |S r   )r   r%  r&  __setstate__)clsstatemodr   r   r   _unpickle_module@
  s   

z#GuardsStatePickler._unpickle_modulec              	   C  s2   t j }t jj }|||||t jj|S r   )	r   rp  r  r  r  from_meta_and_devicer   r  from_raw_repr)r  meta_tensorr+  rg  dispatch_keys_rawr  r  r   r   r   _unpickle_tensorF
  s   
z#GuardsStatePickler._unpickle_tensorc                 C  s^   i }|D ]\}}	}
|	|
 ||< q|j | }}t|||||}||_tjj||_	|S r   )
shaper]  r{  __tensor_unflatten__rg  r   r   r  r  rh  )r  r  r+  rg  r  ctx
inner_datainner_tensorsr  unpickle_funcunpickle_func_args
outer_sizeouter_striderA  r   r   r   $_unpickle_traceable_wrapper_subclassR
  s   z7GuardsStatePickler._unpickle_traceable_wrapper_subclassaliasr<  c                 C  
   t |S r   )r4  r5  )r  r  r   r   r   _unpickle_python_modulec
     
z*GuardsStatePickler._unpickle_python_moduleraw_reprr  c                 C  s   t jj|S r   )r   r   r  r  )r  r  r   r   r   _unpickle_dispatch_key_setg
  s   z-GuardsStatePickler._unpickle_dispatch_key_setjsonbytesc                 C  s   t jjj|S r   )r   r   r  CInterpreterdeserialize)r  r  r   r   r   _unpickle_functorch_interpreterk
  r  z2GuardsStatePickler._unpickle_functorch_interpreterc                 C  r  r   )r  MappingProxyType)r  dr   r   r   _unpickle_mapping_proxyo
  r  z*GuardsStatePickler._unpickle_mapping_proxyc                 C  sR  dd l }t|tjro|jjdkroddlm} ||rVg }| \}}|D ]}t	||}| 
|\}	}
|||	|
f q$t| jtj|dd|jt|tj| ||ffS t| jtj|dd|jt|tj| ffS t|tjjrt|jt|jkrtS |jjtjjjkrt| j| ffS nrt|rt| j|jffS t|tjjrt| j| ffS t|tjjj rt| j!|" ffS t#|rt$||j%rt&|drt&|dsJ |j'|j(ffS t|tj)rt*d| d|j+ d	t|t,j-rt| j.|/ ffS t|jt|jkr'tj0j12d
t| d| dd d tS )Nr   meta)is_traceable_wrapper_subclass)r+  _torch_handler_name_torch_unpicklerzCannot serialize SymInt z (node: r]  ru  rv  rw  rx  ry  )3sympyr   r   r  r+  r{  torch.utils._python_dispatchr  r  r(  reducer_overrider   r  
empty_liker   rc  r  r  r%  r&  r   r   NotImplementedr   __getstate__r  r	  ismoduler  r  r  r  r  r  	serializeisclass
issubclassFunctionr   r  r  rS  r'  r   r  r  r  r  r   r:   ru  )r   rt  r  r  r  attrsr  r  innerfunc
args_tupler   r   r   r  s
  sr   
	

z#GuardsStatePickler.reducer_override)r  r<  )r  r  )r  r  )r   r   r   r   classmethodr  r  r  r  r  r  r  r  r   r   r   r   r   r  :
  s"    



r  r  r  c              
   C  sR   t  }t|}z
||  W |
 S  ty( } z
tjjt	||d }~ww r   )ioBytesIOr  dumpAttributeErrorr   r   r:   ru  r<  r   )r  bufpicklerr  r   r   r   pickle_guards_state
  s   r  c                   @  sP   e Zd Z						ddd
dZ	dddZdd Zdd Zdd Zdd ZdS )r  Nr   %Optional[Callable[[GuardFail], None]]guard_filter_fn8Optional[Callable[[list[GuardFilterEntry]], list[bool]]]guards_serialization_moder  r5  r  c              	     s  |r|j nd }i _t|}	|_|_|r|jnd _|_tds(t	d t
|p,dtjd}
|
|	|||r;d nj\ }|r fdd|fdd|
D tt|
ks^J td	d
 D siJ fddt|
D }
|
|	||j\ }|_ |
|  jj_tdj  jj_d|jsjdkrj|jstj|jt }td| td urtj|j tjj|jdtdd t !dt" d _#jdkrjt$ t$ fdd}j% }|
D ]!}t&|j't(rjsJ jj)D ]}|| qq||j' qjj*D ]}|| q$dd t+j,|fdd|j- D fdd|j.- D t/j01fdd|
D t23t4|j5d}t6|jd}t7|_#t/j8j9d fd!d"d# j:  d _d S )$N!pytorch/compiler:guard_nn_modulesz9guard_nn_modules is turned off using justknobs killswitchr   )rn  c              	     s   t  }t| j}|dkrd}|}nd} | j}t| jd u}| j}t|tj	r-| jj
}t||||j| jr;t| jnd|| dS )Nr   FTr   )rd  	has_valuerc  
guard_typederived_guard_types	is_global
orig_guard)objectstrip_local_scoperd  r  r   r  r  r   	functoolspartialr  rd   r   guard_typesr.  )r   MISSINGrd  r  rc  r  rS  builderr   r   make_guard_filter_entry
  s,   
z>CheckFunctionManager.__init__.<locals>.make_guard_filter_entryc                   s   g | ]} |qS r   r   r   r   )r  r   r   r     rY  z1CheckFunctionManager.__init__.<locals>.<listcomp>c                 s  s    | ]	}t |tkV  qd S r   )r{  r  r   r   r   r   r   r2    s    z0CheckFunctionManager.__init__.<locals>.<genexpr>c                   s   g | ]
\}} | r|qS r   r   )r   r.  r   )filter_resultsr   r   r     s
    %sg        r  zGuard check failed: r7   zGuard eval latency = %s us.2fguard_latency_usrn  c                   sT   t |  }rt|tsJ  | d S t|  }r(t|ts!J | d S d S r   )r   r   r<  r   r   )r   rd  )used_global_varsused_local_varsr   r   prune_variable_  s   z5CheckFunctionManager.__init__.<locals>.prune_variablec                   sb   t | tjr/dd  t fdd| jD } fdd| j D }tj| jg|R i |S | S )Nc                 S  s   t | ttjfr|  S | S r   )r   r6   rz  rg  r  r   r   r   _refw  s   zHCheckFunctionManager.__init__.<locals>.normalize_create_fn.<locals>._refc                 3  s    | ]} |V  qd S r   r   r  r  r   r   r2  |      zMCheckFunctionManager.__init__.<locals>.normalize_create_fn.<locals>.<genexpr>c                   s   i | ]	\}}| |qS r   r   r   kvr  r   r   
<dictcomp>}  s    zNCheckFunctionManager.__init__.<locals>.normalize_create_fn.<locals>.<dictcomp>)r   r  r  r.  r   keywordsr   r  )r   new_argsnew_keywordsr   r  r   normalize_create_fnt  s   z:CheckFunctionManager.__init__.<locals>.normalize_create_fnc                      i | ]\}}| v r||qS r   r   r  )r  r   r   r"    
    z1CheckFunctionManager.__init__.<locals>.<dictcomp>c                   r'  r   r   r  )r  r   r   r"    r(  c                   s$   h | ]}t j|d d  |jdqS )N)obj_weakrefguarded_class_weakrefr  )r  r@  r  r  )r&  r   r   r    s    z0CheckFunctionManager.__init__.<locals>.<setcomp>)r  r   _guardsrj  )r  r5  dynamo_cpp_guards_strc                     s   j  d ddS )Nz
Guard latency = r  z us)r   r   )latencyr   r   r   r    rY  z/CheckFunctionManager.__init__.<locals>.<lambda>
payload_fn);r{   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesr  r5  torch_function_mode_stackr  r,   rZ  r[  r   r%   sort_keybuild_guardsrI  allr  r   compile_check_fnr   rH  rI  r#  r   r  get_guard_fail_reason_helperr"   r  r:  rx   r   r   r    increment_toplevelr  guards_stater   dump_guards_stater   r  rV   r,  r  r  r@  r   r   r   r+  	GuardsSetr  tree_maprW  rj  r  r  _loggingtrace_structuredclear)r   r  r  r   r   r  r  r5  r{   existing_diff_guard_sourcessorted_guardsr   reasonsr  output_graph_guards_stater   r   r9  r   )r  r  r-  r  r&  r   r  r  r   r   
  s   













zCheckFunctionManager.__init__c              
     s   t  }||_d   fdd}t|| j|| j|j|j|| |	}dd }	t||	 t	j
o.td}
|D ] }|
sL| rLd|jvrLd|jvrLt	jsKd|jvrLq1|| q1||fS )	Nc                   sB   |   }|tju r|  S  sJ   }|d usJ ||  S r   )guard_sourcer(   CONSTANTrd  r]  )r   rD  	r_builder	w_builderr   r   r    s   
z5CheckFunctionManager.build_guards.<locals>.source_refc                 S  s   |  }|r
d |_ d S d S r   )r  )weak_br  r   r   r   cleanup_builder  s   
z:CheckFunctionManager.build_guards.<locals>.cleanup_builderr  r5  r7  r  )r   r   r  r  r  r  r   rz  rg  r8   guard_nn_modulesr,   r  rd  r  r^  )r   rA  r@  r  r  r  r   r  r  rJ  guard_on_nn_modulesr   r   rG  r   r4    sB   



z!CheckFunctionManager.build_guardsc                   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rx| 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sAJ || j_-|| j_.| j/  | j_0|| j_1|| j_2d | j_3d | j_4|
| j_5d 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 )Nr  c                     s@    rj rtj  nd rjrtjdS d dS )N)r  rG  rD  )rG  r+   from_tracebackrH  rD  r   r   r   r   r   r    s   
zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>r   z
Stack:
z
User stack:
zGuard: %s%s%s)rL  rH  rI  r   verbose_guards_logisEnabledForloggingDEBUGrG  rF  formatrD  )r   r   log_onlyr   maybe_stackmaybe_user_stack)r   structured_guard_fnsr   rN  r   add_code_part  s0   

z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partTr7   zcheck_no_aliasing(r   r]  r  c                      g | ]}  |qS r   r  r   r   r  r   r   r   ^      z9CheckFunctionManager.compile_check_fn.<locals>.<listcomp>c                   rY  r   rZ  r[  r  r   r   r   b  r\  zcheck_overlapping(overlapping=[c                 s      | ]}|  V  qd S r   rd  r[  r   r   r   r2  h  r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>z], non_overlapping=[c                 s  r]  r   r^  r[  r   r   r   r2  i  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   )rW  r   r   r    s    z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>r.  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr  r   r   )6r  rH  rI  $make_torch_function_mode_stack_guardr2  r   r   add_global_state_guard#add_torch_function_mode_stack_guardr   r  r  r   r   r  rI  r   r  rF  r  aotautograd_guardsr   r$   input_source_ainput_source_brd  r   r  r*   overlapping_sourcesnon_overlapping_sourcesr   r'  r  r   r=  r>  r9   initial_global_stateGlobalStateGuardr   r1   r9  r   r  r   r   r   r   r   r   r   r   r   )r   r  
guards_outr   largs"torch_function_mode_stack_check_fnrX  seengclr  r  check_tensors_fncheck_tensors_verbose_fnrh  r   source_ar  r   overlapping_guard_managersnon_overlapping_guard_managersglobal_stater   rR  r   )r  r   rW  r   r   r6    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   r  r   r   r_   ra   
invalidate)r   obj_strr   r   r  deleted_guard_managerr   r   r   rz    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  r0  rz  rg  r   r  r  rz  rz  )r   rt  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  r0  )r   rt  r   r   r   r    s   z$CheckFunctionManager.lookup_weakrefs)NNNNNN)r   r   r  r  r  r  r5  r  r   )	r   r   r   r   r4  r6  rz  r  r  r   r   r   r   r  
  s      o
? 1r  tuple[str, str]c           	   	     sf  ddl m} t  z |  d fdd}W n ty%   dd	d}Y nw | }| D ]/}||\}}|| |d
| d |  |d W d    n1 sUw   Y  q+| }|d |  || |d W d    n1 s|w   Y  | }|d| d |  || |d W d    n1 sw   Y  |	 |	 fS )Nr   r   r  r<  r;  r  c                   s
     | S r   )r@  r  csepassr   r   r@    r	  z%build_guard_function.<locals>.replacec                 S  s   g | fS r   r   r~  r   r   r   r@    r  zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr  )
r   r   r  r  RecursionErrorr   r   r   splicer   )	r   closure_argsr   r@  
guard_bodyr  r  r   make_guard_fnr   r  r   rG    s<   







rG  c                   C     t jjjdS )Nr|   r   r=  	_internal	log_stateis_artifact_enabledr   r   r   r   is_recompiles_enabled  r   r  c                   C  r  )Nr}   r  r   r   r   r   is_recompiles_verbose_enabled  r   r  c                   s   dd | D   fdd}|S )Nc                 S  rX  r   )r{  r  r   r   r   r     rY  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 r  )rk   rI  r   r{  )	cur_stacktymoder  r   r   check_torch_function_mode_stack  s   zMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stackr   )initial_stackr  r   r  r   re    s   re  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 )r7   )rI  )r   rn  ids_to_sourcer   r   r     s     zErecompilation_reason_for_no_tensor_aliasing_guard.<locals>.<listcomp>r   zDuplicate tensors found: )
r  r   r.  r  rP  r   r  rV  r   rF  )r   r  r   r_  	tensor_idduplicate_tensorsr  r   r  r   1recompilation_reason_for_no_tensor_aliasing_guard  s   




r  r   c                 C  s   ddl }d}||d| S )z
    Replace occurrences of L[...] with just the inner content.
    Handles both single and double quotes.

    This is to generate user friendly recompilation messages.
    r   NzL\[\s*['\"](.*?)['\"]\s*\]z\1)resub)r   r  patternr   r   r   r     s   r  r   re   f_localsr  
compile_idr#   c              
   C  s:  || j d d}|| j g }d}g }| |}|js2|j}t|dkr2d|d v r.d}n|}g }|r:t| |}nU|D ]R}t| j }	||	d< t	 $ zt
||	|}
W n tyf   t reY W d	   q< w W d	   n1 sqw   Y  t|
tr|
s|}
t|
tr||
 t s nq<| d
d| }t|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  Fr7   zDuplicate tensor foundr   Tr  Nr   z; )r   r  r   r   resultr   rI  r  r  r5   rV  	Exceptionr  r   r  r<  r   rF  r  )r   r  r  r  rB  no_tensor_aliasing_check_failedr   guard_debug_infor   r   fail_reason
reason_strr   r   r   r7  -  sP   




r7  c                 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	yB   t
d Y |S w )Nr   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   r  r  r7  rm   rr   r   r   rc   r  rZ  r  )r   r  r  r  r  r   r   r   get_guard_fail_reasonp  s$   

	r  framer`   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)rE  r   )r   r.  r  r   r   r   r2    s
    
z:get_and_maybe_log_recompilation_reasons.<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_reasonsr  )rd  encodingr   r   r   r   r   r    s   z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>c                     s    S r   r   r   rB  r   r   r    r  )metadata_fnr/  )r  r   r  r  r  r   nextr  r  r  r8   error_on_recompilerF  r  rE  r   ry  co_filenameco_firstlinenorecompiles_verbose_logrI  recompiles_logr:   RecompileErrorr   r=  r>  )r   r  r  r  do_recompiles_logfailuresguard_failure_detailsmessager   r  r   'get_and_maybe_log_recompilation_reasons  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   )r   first_cache_entryacc_diff_guard_sourcesr   r   r   r1    s   
r1  ra  r  lastr  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:
)
printry  r  r  rF  r   r   r   rV  r   )r   r  r  ra  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   )seqrr  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 aliasing zC. This is not supported. Please do a clone for corresponding input.)r  )	r   r   r:   UnsafeScriptObjectErrorrd  r  r  r  r  )
obj_sourcedupe_sourceser_source_is_localsource_is_localr   r   r   make_dupe_guard  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   )TracingContextr7   )collect_debug_stackr  N)torch._guardsr  rH  rP  rQ  rR  rO  r  guards_contextr_  r   r   r%   )r  r{   r  r  r   r   r   r   r   install_guard!  s   
r  )r   r:  r;  r<  )r   r<  r   r%   r;  r<  )r   rM  r   r%   r;  rN  )r;  rR  )rt  r   r;  r   )r  r  )r  r  r;  r  )r;  r}  )r   r<  r;  r<  )r   re   r  r  r  r#   r;  r<  )
r   re   r  r  r  r  r  r#   r;  r<  )r  r`   r;  rN  )
r   re   r  r  r  r  ra  r  r  r  )r   
__future__r   r>  r  r.  r  r{  r  r4  r	  r  rQ  r1  pickler  rE  r  r  rz  
contextlibr   r  r   r   typingr   r   r   r	   r
   r   r   r   torch.overridestorch.utils._devicetorch._C._dynamo.eval_framer   torch._C._dynamo.guardsr   r   r   r   r   r   r   r   r   r   torch._dynamo.sourcer   r   r   r   r   r   r   r   torch._dynamo.utilsr    r!   r  r"   r#   r$   r%   r&   r'   r(   r)   r*   torch._loggingr+   torch._utils_internalr,   %torch.fx.experimental.symbolic_shapesr-   r.   r/   r0   r1   torch.utilsr2   r  torch.utils._ordered_setr3   torch.utils._tracebackr4   r5   torch.utils.weakr6   r   r8   r9   r:   
eval_framer;   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   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   r6  rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   r  numpyr  ModuleNotFoundErrorr  ry   torch._dynamo.output_graphrz   	getLoggerr   rZ  r=  getArtifactLoggerrH  r  r  rO  r   r  cacher  r  r9  rA  r   r   rX  rL  rQ  rW  r[  rl  ro  rs  r|  r  r~  r  r  r  r|  r  r  r  r  r  r  r?  r  Picklerr  r  r  rG  r  r  re  r  r  r7  r  r  r1  r  r  r  r  r   r   r   r   <module>   s   0(
,$%P	
 b	








)              PU	 
    
+


C
<
"