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_verboseZ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   Z/home/www/facesmatcher.com/frenv_anti/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   Z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   )Znode_mgrchosen_sourcesr   r   	filter_fn'     z@GuardManagerWrapper.clone_with_chosen_sources.<locals>.filter_fn)r   Z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Z
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_managerZ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   zipZ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)Z
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   Z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   Z	overridesZ_enable_torch_functionr   npZgenericZndarrayZ	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>)Ztorch._dynamo.external_utilsZtorch._dynamo.polyfillsr   Zexternal_utilsZ	polyfillsZtorch._dynamo.polyfills.loaderr   r   )r   Z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 )NZ___check_type_idZ___check_obj_idZ___odict_getitemZ___key_to_idZ___dict_versionZ___dict_containsc                 S  s   t || S r   )dict__contains__)r   br   r   r   <lambda>      z#_get_closure_vars.<locals>.<lambda>Z___tuple_iterator_lenZ___normalize_range_iterZ___tuple_iterator_getitemZ___dataclass_fieldsZ#___get_torch_function_mode_stack_at__math_isnan__numpy_isnaninfZ__load_moduleZutils_devicedevice)Z___from_numpyZ___as_tensorr   r   )r  r   r   collectionsOrderedDict__getitem__rp   r   ru   rq   rt   rh   rl   mathisnanr   float	importlibimport_moduler   utilsZ_devicer
  r   _as_tensor_fullprecr   r   r   r   r   _get_closure_vars  sT   	
r  r   ast.ASTreturnstrc                 C  s   t | ddS )N
r   )astunparsereplacer   r   r   r   _ast_unparse     r  r   r   r%   c                 C  s   d}|d ur=|j r#t|j D ]}|jt vr!dt|dd } q"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fsr$  r   r   r   get_verbose_code_part  s   
r(  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   )r(  )r   r   r   r   r   r     r   z*get_verbose_code_parts.<locals>.<listcomp>)r   list)r   r   r   r+  r   get_verbose_code_parts  s   
r-  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   Zmaybe_as_intdimr   r   r   convert_int_to_concrete_values  s   
r2  c                 C  s   dd | D S )Nc                 S     g | ]}t |qS r   )r2  )r   r1  r   r   r   r         z.convert_to_concrete_values.<locals>.<listcomp>r   )Zsize_or_strider   r   r   convert_to_concrete_values      r5  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   Z_dispatch_tls_local_include_setZ_dispatch_tls_local_exclude_setdtyper
  indexrequires_gradr   )valuenamesizesstridespytypedispatch_keysZdispatch_keyr8  Zdevice_indexr:  Z	guard_strr   r   r   get_tensor_guard_code_part  s"   rA  c                 C  s   t t| |S r   )r,  rf   r9  )dctkeyr   r   r   get_key_index  s   rD  c                 C  s   d|  d| dS )Nlist(dict.keys())[]r   )r   r9  r   r   r   get_key_index_source  r  rH  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)rI  r   r   r   raise_local_type_error  s   rQ  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   rU  __annotations__rW  rX  r   r   r   r   rS  &  s   
 rS  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[rG  r9  r   example_valueguard_manager_enum == )baser<  r   r9  rB   r  rD  rH  r,  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_namer9  
key_sourceZkey_example_valuevalue_sourcer   r   r   getitem_on_dict_manager5  s4   


rk  c                 C  s4   | j }t|tr
dS |  rdS | ot|t S NFT)originating_sourcer   rS   is_specialized_nn_moduleZis_dict_keyrO   )r   r   r   r   r   match_on_id_for_tensor^  s   
ro  c                   @     e Zd ZU ded< ded< dS )GuardCodeListr*  	code_listr%   r   Nr   r   r   rY  r   r   r   r   rq  m     
 rq  c                   @  s   e Zd ZdZdZdS )rb  r7      N)r   r   r   rc  DICT_GUARD_MANAGERr   r   r   r   rb  s  s    rb  codetypes.CodeTypec                 C  s   t tt| S r   )r,  r!  r   )rw  r   r   r   &code_framelocals_names_reversed_cachedx     ry  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_coderx  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_moderV  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__>_<.Z_dot_)!r|  r}  r  r  scopebuiltins__dict__copyr   packageZpackage_importerZ_package_imported_modulesr   r  r   argnamesrw  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getr<  r   _cached_guard_managers_cached_duplicate_input_guardsr  )r   r|  r}  r  r  r  r   r   r  r  r<  Z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 )r9  rZ  rG  rC  r   r\  r]  )
get_guard_managerr   r   NotImplementedErrorr<  rm  rf   rE   get_guard_manager_typedict_getitem_manager)	r   r\  r   dict_mgrZdict_sourcerC  r;  rj  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   r7  r^  )r  r   r   r  r<  	enumeraterf   rH  ra  rb  rc  ro   r}  add_id_match_guardr-  rd  )	r   r;  r   r  r   rC  ri  Z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   Z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 )NrE  rF  rG  r[  r^  r  )	r   r   rD  ra  rb  rc  rd  re  r  )r   rC  source_namerg  r\  r]  r9  ri  r   r   r   getitem_on_dict_mgr.  s,   

z>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrFNT_parameters_buffersZ_modulesattrr   r\  r]  	.__dict__r   r\  r]  )r   rC  r  rg  r\  r]  )memberr  r   r   getmror   updatekeysrS  rU  getattr_managerrW  rX  r=   r_  r<  r  get_generic_dict_managerr  rb  rc  )r   r   rf  rg  r\  rh  r  r]  r  	attr_namemod_dictZall_class_attribute_namesr   Zaccessor_inforW  rX  mod_dict_sourceZl1_source_nameZl2_source_nameZl1_valueZl2_valueZl1_guard_manager_enumZl2_guard_manager_enumZ	l1_sourcemod_generic_dict_managerZl1_mgrr   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)r<  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   )rb  rc  r  r   ri   rv  r  )r   r   r\  r]  r   r   r   r    s   

z#GuardBuilder.get_guard_manager_typec                 C  s
   |t jkS r   )rb  rv  )r   Z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   Zglobals_dict_managerr  rb  rc  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 ||||||}q|j2 j)|||d	}n\t t3t4fr|sHJ t|t5t6j7fsSJ t|t8rk| 9|	saJ t: ||||}qt 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}qt|tIr jHs|jJ j|||d}q j} jHr K }|jL||||d}nqt tMr{|s1J tN|s8J  jOsP|jP||jQtjdjL jR|||d}q|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   Z
_get_index)r  r   r   r   r  "  s    z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>)Zpython_lambdar   r\  r]  r  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_orderZ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   )Z__obj_flatten__r  r   r   r   r        c                 S  s   |    S r   )_typeZqualified_namer  r   r   r   r    r  c                 S  r  r   )Zget_baser  r   r   r   r    r  c                 S  r  r   )itemr  r   r   r   r    r  c                 S  s
   t | S r   )r   r  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   r<  r  r  r  rb  rc  r   r@   r_  get_guard_manager_from_sourcern   rQ   ry  r|  r%  r9  
local_nameZframelocals_managerrL   r  r  r  rN   Zglobal_weakref_managerrM   rV   rZ   Ztype_managerrT   rR   r\   r[   rI   rX   Zlambda_managerrO   Zgrad_managerrJ   Zgeneric_getattr_managerr  r=   r]   r   nnModulerj   rv   r  r  rE   rF   r  r  r  r   r  rk  rB   RuntimeErrorr   getattrproplowerr   r   Zindexed_managerrP   Zlist_getitem_managerrK   r,  Zindex_is_slicetupleZtuple_getitem_managerZunpack_sliceZgetitem_managerrD   callableZis_kwZfunc_defaults_manager__defaults__Zidx_key__kwdefaults__Zfunc_kwdefaults_managerrS   r   rW   rG   rU   r<   r?   rH   rY   Ztuple_iterator_getitem_managerAssertionErrorra  r^   Zweakref_call_managerr>   Zcall_function_no_args_managerrC   )r   r   Zroot_guard_managerr\  r  r]  rh  rg  rf  Zbase_guard_manager_enumZframelocals_names_reversedZframelocals_idxoutr9  
kwdefaultsZ	kw_sourcer  r   r  r   r    s  












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









	























z*GuardBuilder.get_guard_manager_from_sourcer   r%   c                 C  s   |  |jS r   )r  rm  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:
%sZ___make_guard_fn)r  joinr  build_guard_functionr  
guards_logdebugexecvaluesr   r   Zadd_epilogue_lambda_guardadd_lambda_guard)r   r   r   r   Zis_epilogueZmake_guard_fn_argsZ_guard_bodyZpycoder  globals_for_guard_fnguard_fnr   r   r   $add_python_lambda_leaf_guard_to_root.  s   z1GuardBuilder.add_python_lambda_leaf_guard_to_rootr<  r  r   Optional[dict[str, Any]]r  r   c                 C  s   |d u rt  }t|| j|S r   )r  evalr  )r   r<  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 )Nru  zinvalid var name: %s)r   r  r<  strip_function_callr  r   r   r   Zis_valid_var_namelogwarningr   )r   r   r<  r_  Zis_validr   r   r   arg_ref[  s   

zGuardBuilder.arg_refr  c                 C  s.   t |j|}t|||j|jd}||  d S )N)r#  r   )r=   rm  r%   r#  r   create)r   r   r  r  Zattr_sourceZ	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   r7  znot hasattr()provided_guarded_objectr  )rm  r   rR   r_  r=   r<  r  r  r   r  _set_guard_export_infor  r  r   r  r  rj   rv   r  r  add_no_hasattr_guardr-  )r   r   r   Zbase_sourcer_  r  refvalrw  base_managerr\  rg  r]  r   r   r   HASATTRt  sV   





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  r<  r   r   r  r  r  r  r  r  rb  rc  add_dict_contains_guardr-  )	r   r   r  r  r  r  r  r  rw  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(r7  z___check_type_id(r   )r  r<  r   r   _subclasses
FakeTensorr?  rP  r  r   r   rQ  r}  r  r  r  Zadd_type_match_guardr-  )r   r   r;  r   r  rw  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 )Nr  z(DICT_VERSION guard cannot be serialized.z___dict_version() == )r  r   r   r:   PackageErrorr  r  r<  r   r  r  Zadd_dict_version_guardr-  )r   r   r  r  versionrw  r   r   r   DICT_VERSION  s   



zGuardBuilder.DICT_VERSIONrC  invertrT  c                 C  sZ   |  |}|r	dnd}| d|d| d}| ||g | || |t|| d S )Nnot r   z___dict_contains(r   r7  )r  r  r  r  r-  )r   r   rC  r  Zdict_refZ	maybe_notrw  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  r<  rn   rT  r  r  Zadd_true_match_guardr-  Zadd_false_match_guardr   r   r  r  rw  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  r<  r  r  Zadd_none_match_guardr-  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 )Nr  z$ID_MATCH guard cannot be serialized.z___check_obj_id(r   r7  )r  r   r   r:   r
  r   rm  rZ   r  r%   r_  r{  r  r  r<  r}  r  r  r  r-  rQ   r  r  r  r  r   )r   r   r  r  r  rw  r  Z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  r<  r   r   Tensorr  r  add_not_none_guardr-  )r   r   r;  r  r  rw  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  r<  r   r   r   DispatchKeySetr  Zadd_dispatch_key_set_guardr-  )r   r   r  r  r   r   r   r   DISPATCH_KEY_SET_MATCH7  s   


z#GuardBuilder.DISPATCH_KEY_SET_MATCHc                 C  s   |  |dtj d S )Nr   )r  r{  EQUALS_MATCHr  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   )Z_current_levelr  
dual_level
forward_adr   r   fnM  r  z#GuardBuilder.DUAL_LEVEL.<locals>.fn)r  r  r  r  r   Zautogradr  r   r   r  r-  r   r   rw  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   )Z	get_state)r   cir   r   r   r   X  r4  z6GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.<listcomp>z5torch._functorch.pyfunctorch.compare_functorch_state(r7  c                   s    S r   r   r  Z
compare_fnZstatesr   r   r  _     z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn)r  r  Zfunctorch_layersr  r   
_functorchZpyfunctorchZcompare_functorch_stater   r   r  r-  )r   r   Zcisrw  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  )hooksZ	pack_hookZ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  r6  z5GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.fn)r   r%  Z_aot_autogradr  Ztop_saved_tensors_hooksZ"saved_tensors_hooks_are_inlineabler  r   r   r  r-  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_metadatar;  r   r   metadata_checker  s   zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checkerc                   s   |   d  kS r/  r  r  )r1  r   r   r2    r   Z___check_metadata_Z_c)r  r<  r   r  r   rw   r  r"   current_compile_idr  r  r-  )r   r   r2  r  r   r0  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(r7  r  z__numpy_isnan(r  r^  c                   s   g | ]
}| d   dqS )z (HINT: r7  r   r   r5  r   r   r     s    z-GuardBuilder.EQUALS_MATCH.<locals>.<listcomp>)7r  r  r<  r   Zint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64Zfloat16Zfloat32Zfloat64r,  r   r  rg   rP  	frozensetslicerangeri   r   SizedistributedZis_availableZtorch.distributed.device_meshr6  Z(torch.distributed.tensor.placement_typesr7  r8  r9  r:  Ztorch.export.dynamic_shapesr;  Ztorch.utils._pytreer  r2   rn   Zis_constant_classr  r  r  r  r   r  r  r  r  r-  complexr   rd  )r   r   r5  r  r  Znp_typesZok_mutable_typesZok_typesr6  r7  r8  r9  r:  r;  pytreerw  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  r<  rn   rT  r  r  typesCodeTyper  r  r   r   r  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 )
Nr  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__()`.)Zgb_typecontextZexplanationhints)r  r   r   r:   r
  r  r  r<  r   rn   rH  rT  r  r{  rG  Zunimplemented_v2rP  rF  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 functionsr  z*FUNCTION_MATCH guard cannot be serialized.)r  r   r   r:   r
  r  r  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.r  z)CLOSURE_MATCH guard cannot be serialized.__code__N)r  r   r   r:   r
  r  r<  rP  rD  FunctionTyper   r  r{  r   rL  rF  r   r   r   CLOSURE_MATCH,  s   
zGuardBuilder.CLOSURE_MATCHc                 C  s
   |  |S r   )rL  r  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   r  zlen(r	  )r  r  r<  r   r  r  r%  r   r  r  Zadd_dict_length_check_guardr-  Zadd_length_check_guardr   r   r  r;  rw  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(r	  r  r7  )r  r  r<  rP  r   ru   r  r}  r  Zadd_tuple_iterator_length_guardr-  )r   r   r  r;  r   rw  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(r	  r  r7  )r  r  r<  rP  rq   r   r  r}  r  Zadd_range_iterator_match_guardr-  )r   r   r  r;  r   rw  Z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 )Nr  z/DUPLICATE_INPUT guard cannot be serialized yet. is )r  r   r   r:   r
  r  r<  r   rm  r  r   r  r   r  r  r-  )r   r   source_bZref_aZref_brC  rw  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 )Nr  z)WEAKREF_ALIVE guard cannot be serialized.r  )
r  r   r   r:   r
  r  r  r  r  r-  r   r   rw  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  r<  r   r,  r  r  r  Zadd_mapping_keys_guardrQ  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 sameNrE  z)) == )r  r  r<  r   r  r2   ZSUPPORTED_NODESr  rR  r   r,  rf   r  r  rm  r  r  rQ  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_guardsrR  r  r   r   r   EMPTY_NN_MODULE_HOOKS_DICT  s   z'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICTc                 C     d S r   r   r  r   r   r   	GRAD_MODE     zGuardBuilder.GRAD_MODEc                 C  ra  r   r   r  r   r   r   DETERMINISTIC_ALGORITHMS  rc  z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  ra  r   r   r  r   r   r   TORCH_FUNCTION_STATE  rc  z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  ra  r   r   r  r   r   r   FSDP_TRAINING_STATE  rc  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  Zcurrent_devicer  r  Zadd_default_device_guardr-  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 q ty   d}|d\}}Y qw 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   )Z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   ZSIZE)r   r   r0  r   r   r     s    z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)t_idr1  )r  r0  r   get_sources  s   
z+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesz+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsrelaxed_sourcesZ	warn_onlyc              	     s8   j jdd D dd D  jjjj | dS )Nc                 S  rj  r   )Zfakerk  r   r   r   r   %  rl  zCGuardBuilder.SHAPE_ENV.<locals>._get_code_parts.<locals>.<listcomp>c                 S  rj  r   r  rk  r   r   r   r   &  rl  )input_contextsequalities_inputsr  Zignore_staticlangs)	shape_envZproduce_guards_verboser  r  r  export)rv  ru  r'  rt  r  r   r   r   _get_code_parts#  s   
z/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts)pythonverbose_pythoncppT)r{  r|  r  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[rG  Nr   r   r  r  symbolr   r   r   	<genexpr>  
    

z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>c                 s  r  )z = float_values[rG  Nr   r  r   r   r   r    r  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)Er<  r  r  r  shape_code_partsr  r   r~  r  Ztracked_fakesZexport_constraintsr   rn  rm  r   rx  Zdynamic_shapesZ_process_equalitiesrw  r  r  r/   r,  r  r8   Z enable_cpp_symbolic_shape_guardsOverflowErrorfreezelocalsr  r   r-   source_to_symbolr  ShapeCodePartsexprsr  r"   Ztry_getZshape_env_guardsr   r   rA   r1   r  r`  r   r  ctypesZtorch._inductor.codecacher  r  r  r  textwrapdedentr  r  ri  castr   Zc_void_pr;  Z	_inductorr:   ZInvalidCxxCompilerr   r%  r  )"r   r   r  r  r   r~  r  ro  namesrp  rq  rr  rs  
constraintrz  Zmaybe_cpp_code_partsZmaybe_shape_env_sourcesrw  Zcompile_contextZint_source_to_symbolZfloat_source_to_symbolr   r  r   r  r\  r  r  Zguard_managersZint_symbols_strZfloat_symbols_strZfunc_strZclibZcguardr   ry  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 )NZparam_numelZparam_bytesZparam_countr7   )r8  r
  r:  zndimension()r  zstr(r	  r^  sizestrideT)Z	is_tensortensor_source_dynamo_dynamic_indicesz((z"._dynamo_dynamic_indices.issubset(z)) if hasattr(z', '_dynamo_dynamic_indices') else True)r  z%, '_dynamo_dynamic_indices') == Falser   )9r8   Z_unsafe_skip_fsdp_module_guardsZis_fsdp_modulero  r  r   r6   r  r<  rP  r   r   _dispatch_keysr  r  r?  r@  r  Zlog_compilation_metricsr  	Parameterr!   	incrementZnumelnbytesr  r  r  rx  r  rn   r
  r8  r   r  r  Z,skip_no_tensor_aliasing_guards_on_parametersrm  rS   r  r  input_source_to_sizes_stridesr5  r-  rA  Zadd_tensor_match_guardr   r   r   r   rs   r   r  Zadd_dynamic_indices_guardr  r%  r  )r   r   r;  r?  r@  Zmetrics_contextZtensor_namerw  Ztermsterm
real_valuer   r  metadatar  r  r   ZstaticZ_reasonZ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  r<  r  weakrefr  rP  r  r   enumEnumr  Zset_export_info)r   r   rr  r  Z	cur_frameZcaller	func_namer<  Zguarded_objectZguarded_object_typeZobj_refZsupports_weakrefr   r   r   r  	  s6   
z#GuardBuilder._set_guard_export_infor   )r|  rx  r}  r~  r  r  r  r  r  r  r   r  r   r~   r  r  r  rV  )r   r%   )NT)r<  r  r   r  r  r   )r   r  r  r  )r   r%   r  r  )r   r%   r  r  )r   r%   rC  r  r  rT  )r   r%   r5  rV  )8r   r   r   r   r  r  staticmethodr  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-  r4  r  rG  rK  rL  rO  rP  rR  rS  rW  rZ  r\  r]  r^  r`  rb  rd  re  rf  rh  r  r  r  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                   @  rp  )PyExprCSEPass.Configzdict[str, int]
expr_countzdict[str, str]expr_to_nameNrs  r   r   r   r   Config	  rt  r  c                      s(   e Zd ZdddZd fd
dZ  ZS )zPyExprCSEPass.ExprCounterr8   r  r  r  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  r  r   r   )r   r   r   r   r   r   	  s   zPyExprCSEPass.ExprCounter.visit)r8   r  r  r  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  r  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  r  r  r  USE_THRESHOLDr  r   r   r  r  r   r  NameLoad)r   r   exprZnode_Zexpr_var_namer   r   r   r   	  s   zPyExprCSEPass.Replacer.visit)r8   r  r  r  r  r  r  r  r   r   r   r   Replacer	  s    
r  r  r  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   r<  r   r   r   _new_var 
  s   zPyExprCSEPass._new_varr  r*  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   r  Z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  r  )r   r  replacernew_noder   r   r   r  
  s   zPyExprCSEPass.replaceN)r  r  )r  )r   r  r  r  )r  r*  r  r  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   rm  rD   r8   Z guard_nn_modules_using_dict_tags	create_fnr{  rK  r+  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~  rT  r  zlist[Source]r  Nrs  r   r   r   r   r  +
  s   
 r  c                   @  rp  )GuardsStaterz   r  Optional[ShapeCodeParts]r  Nrs  r   r   r   r   r  4
  rt  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   r  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   r  r  r  r  Zfrom_meta_and_devicer   r  from_raw_repr)r  meta_tensorr
  r?  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  rP  Z__tensor_unflatten__r?  r   r   r  r  r@  )r  r  r
  r?  r  ctx
inner_dataZinner_tensorsr  Zunpickle_funcZunpickle_func_argsZ
outer_sizeZouter_strider  r   r   r   $_unpickle_traceable_wrapper_subclassR
  s   z7GuardsStatePickler._unpickle_traceable_wrapper_subclassaliasr  c                 C  
   t |S r   )r  r  )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%  CInterpreterZdeserialize)r  r  r   r   r   _unpickle_functorch_interpreterk
  rz  z2GuardsStatePickler._unpickle_functorch_interpreterc                 C  r  r   )rD  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: r7  rJ  rK  rL  rM  rN  )3sympyr   r   r  r
  rP  Ztorch.utils._python_dispatchr  r  r  reducer_overrider   r  Z
empty_liker   r  r  r  r  r  r   r   NotImplementedr   __getstate__r  r   ismoduler  r  r  r%  r  r  	serializeisclass
issubclassFunctionr   r  r  r/  r  r   rD  r  r  r  r   r:   r
  )r   rI  r  r  r  attrsr  r  innerfuncZ
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:   r
  r  r   )r  bufZ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_moderV  r  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   )rC  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   )r<  	has_valuer;  Z
guard_typeZderived_guard_types	is_globalZ
orig_guard)objectstrip_local_scoper<  r  r   rm  r  r   	functoolspartialr  rd   r   Zguard_typesr  )r   MISSINGr<  r  r;  r  r  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     r4  z1CheckFunctionManager.__init__.<locals>.<listcomp>c                 s  s    | ]	}t |tkV  qd S r   )rP  rT  r   r   r   r   r   r    s    z0CheckFunctionManager.__init__.<locals>.<genexpr>c                   s   g | ]
\}} | r|qS r   r   )r   r  r   )filter_resultsr   r   r     s
    %sg        ri  zGuard check failed: r7   zGuard eval latency = %s us.2fZguard_latency_usr  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   r<  )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   r  r  r  r   r   r   _refw  s   zHCheckFunctionManager.__init__.<locals>.normalize_create_fn.<locals>._refc                 3  s    | ]} |V  qd S r   r   rk  r.  r   r   r  |      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_argsZnew_keywordsr   r/  r   normalize_create_fnt  s   z:CheckFunctionManager.__init__.<locals>.normalize_create_fnc                      i | ]\}}| v r||qS r   r   r1  )r,  r   r   r4        z1CheckFunctionManager.__init__.<locals>.<dictcomp>c                   r8  r   r   r1  )r+  r   r   r4    r9  c                   s$   h | ]}t j|d d  |jdqS )N)Zobj_weakrefZguarded_class_weakrefr  )r  r  r  r&  )r7  r   r   r     s    z0CheckFunctionManager.__init__.<locals>.<setcomp>)r  r   _guardsr  )r  r  Zdynamo_cpp_guards_strc                     s   j  d ddS )Nz
Guard latency = r*  z us)r   r   )latencyr   r   r   r    r4  z/CheckFunctionManager.__init__.<locals>.<lambda>
payload_fn);r{   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesr  r  torch_function_mode_stackr  r,   r  r  r   r%   sort_keybuild_guardsr%  allr  r   compile_check_fnr   r  r  rx  r   r  get_guard_fail_reason_helperr"   r3  r  rx   r   r   r    Zincrement_toplevelr`  guards_stater   Zdump_guards_stater   rm  rV   r  r  r  r  r   r   r   r:  Z	GuardsSetrC  Ztree_mapr2  r  r  r  _loggingtrace_structuredclear)r   r|  r  r   r   r  r  r  r{   existing_diff_guard_sourcessorted_guardsr   reasonsr-  Zoutput_graph_guards_stater   r   rF  r   )r$  r(  r;  r%  r7  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(   ZCONSTANTr<  r  )r   rM  Z	r_builderZ	w_builderr   r   r    s   
z5CheckFunctionManager.build_guards.<locals>.source_refc                 S  s   |  }|r
d |_ d S d S r   )r  )Zweak_br  r   r   r   cleanup_builder  s   
z:CheckFunctionManager.build_guards.<locals>.cleanup_builderr  r  r  r(  )r~   r   r{  r}  r  r  r   r  r  r8   Zguard_nn_modulesr,   rn  r<  r_  r  )r   rK  rJ  r|  r  r  r   r  r$  rO  Zguard_on_nn_modulesr   r   rN  r   rB    sH   
	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)rw  r#  r   )r#  r+   from_tracebackr$  r   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)r(  r  r  r   verbose_guards_logisEnabledForloggingDEBUGr#  r  formatr   )r   r   Zlog_onlyr   Zmaybe_stackZmaybe_user_stack)r   structured_guard_fnsr   rQ  r   add_code_part  s0   

z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partTr7   zcheck_no_aliasing(r   r7  rX  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   r<  r[  r   r   r   r  h  r0  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>z], non_overlapping=[c                 s  r]  r   r^  r[  r   r   r   r  i  r0  z])zUnknown GuardEnvExpr: dynamo_guardsc                     s   dd  D S )Nc                 S  s   g | ]}| qS r   r   )r   fr   r   r   r     rl  zKCheckFunctionManager.compile_check_fn.<locals>.<lambda>.<locals>.<listcomp>r   r   )rW  r   r   r    s    z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>r<  )Z___check_tensorsZ___check_tensors_verboseZ___check_global_stateZ"___check_torch_function_mode_stackr  r   r   )6r  r  r  $make_torch_function_mode_stack_guardr@  r   r   Zadd_global_state_guardZ#add_torch_function_mode_stack_guardr   rw  rr  r   r   r  r%  r   r  r  r  aotautograd_guardsr   r$   Zinput_source_aZinput_source_br<  r   r  r*   Zoverlapping_sourcesZnon_overlapping_sourcesr   r  r  r   rG  rH  r9   Zinitial_global_stateZGlobalStateGuardr   r1   r  r   r  r   r   r   r   r   r   r   r   r   )r   r$  Z
guards_outr   largsZ"torch_function_mode_stack_check_fnrX  seenZgclrw  r  Zcheck_tensors_fnZcheck_tensors_verbose_fnrb  r   Zsource_arY  r   Zoverlapping_guard_managersZnon_overlapping_guard_managersZglobal_stater   r  r   )r$  r   rW  r   r   rD    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  Zdeleted_guard_managerr   r   r   re    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)rf  )	r  r>  r  r  r   r   r!  re  rO  )r   rI  rf  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  r>  )r   rI  r   r   r   r    s   z$CheckFunctionManager.lookup_weakrefs)NNNNNN)r   r  r  r  r  rV  r  r  r   )	r   r   r   r   rB  rD  re  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  Zcsepassr   r   r    r  z%build_guard_function.<locals>.replacec                 S  s   g | fS r   r   rh  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   Zclosure_argsr   r  Z
guard_bodyr  r  r   Zmake_guard_fnr   ri  r   r    s<   







r  c                   C     t jjjdS )Nr|   r   rG  	_internalZ	log_stateZis_artifact_enabledr   r   r   r   is_recompiles_enabled  r   ro  c                   C  rl  )Nr}   rm  r   r   r   r   is_recompiles_verbose_enabled  r   rp  c                   s   dd | D   fdd}|S )Nc                 S  r3  r   )rP  r'  r   r   r   r     r4  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 rl  )rk   r%  r   rP  )Z	cur_stacktymoderD  r   r   check_torch_function_mode_stack  s   zMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stackr   )Zinitial_stackrt  r   rs  r   ra    s   ra  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   )r%  )r   rC  Zids_to_sourcer   r   r     s
    zErecompilation_reason_for_no_tensor_aliasing_guard.<locals>.<listcomp>r   zDuplicate tensors found: )
r  r   r  r  r,  r   r  r  r   r  )r   r  r   r  Z	tensor_idZduplicate_tensorsr  r   rv  r   1recompilation_reason_for_no_tensor_aliasing_guard  s   




rw  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   rx  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 qq<| 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   Tru  Nr   z; )r   r  r   r   resultr   r%  rw  r  r5   r  	Exceptionrp  r   rT  r  r   r  r  )r   r{  r|  r  rL  Zno_tensor_aliasing_check_failedr   Zguard_debug_infor   r   Zfail_reason
reason_strr   r   r   rE  -  sP   




rE  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  rE  rm   rr   r   r   rc   r~  r  r  )r   rw  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)r  r   )r   r  r  r   r   r   r    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 )NZrecompile_reasonsr  )r<  encodingr   r   r   r   r   r    s   z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>c                     s    S r   r   r   rL  r   r   r    r  )Zmetadata_fnr=  )r  r   rw  r{  r|  r   nextr|  ro  rp  r8   Zerror_on_recompiler  r  r  r   r  co_filenameco_firstlinenorecompiles_verbose_logr  recompiles_logr:   ZRecompileErrorr   rG  rH  )r   r  r  rw  Zdo_recompiles_logZfailuresZ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   Zfirst_cache_entryZacc_diff_guard_sourcesr   r   r   r?    s   
r?  r9  r`  lastrT  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  r   r   r   r  r   )r   rw  r{  r9  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   )seqrd  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.)rY  )	r   r   r:   ZUnsafeScriptObjectErrorr<  r   r!  r{  rZ  )Z
obj_sourceZdupe_sourceZser_source_is_localZ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  r  rS  rT  rU  rR  r  Z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   r)  r   r%   r  r*  )r  r.  )rI  r   r  r   )rw  rx  )r  r  r  r  )r  rg  )r   r  r  r  )r   re   r{  r  r|  r#   r  r  )
r   re   rw  rx  r{  r  r|  r#   r  r  )r  r`   r  r*  )
r   re   rw  rx  r{  r  r9  r`  r  rT  )r   
__future__r   r  r  r  r  r  r   r  r   r  rT  r  pickler  r  rD  r  r  
contextlibr   r  r   r   typingr   r   r   r	   r
   r   r   r   Ztorch.overridesZtorch.utils._deviceZtorch._C._dynamo.eval_framer   Ztorch._C._dynamo.guardsr   r   r   r   r   r   r   r   r   r   Ztorch._dynamo.sourcer   r   r   r   r   r   r   r   Ztorch._dynamo.utilsr    r!   r  r"   r#   r$   r%   r&   r'   r(   r)   r*   Ztorch._loggingr+   Ztorch._utils_internalr,   Z%torch.fx.experimental.symbolic_shapesr-   r.   r/   r0   r1   Ztorch.utilsr2   rC  Ztorch.utils._ordered_setr3   Ztorch.utils._tracebackr4   r5   Ztorch.utils.weakr6   r   r8   r9   r:   Z
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   r  rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   rY  numpyr   ModuleNotFoundErrorr  ry   Ztorch._dynamo.output_graphrz   	getLoggerr   r  rG  ZgetArtifactLoggerr  r  r  rR  r~   r   cacher   r  r  r  r   r   r  r(  r-  r2  r5  rA  rD  rH  rQ  r  rS  rk  ro  rq  r  rb  ry  r{  r  r  r  r  r  Picklerr  r  r  r  ro  rp  ra  rw  r  rE  r  r  r?  r  r  r  r  r   r   r   r   <module>   s   0(
,$%P	
 b	








)              PU	 
    
+


C
<
"