a
    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yb   dZY n0 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, Zd-d.d/d0d1Ze!jjjZd.d2d.d3d4d5Zd6d2d7d8d9d:Zd;d<d=d>Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdHdIdJdKZejdLdMG dNdO dOZdPdQ ZdRdS ZejG dTdU dUZG dVdW dWejȃZejdXdYdZd[ZG d\d] d]eBZG d^d_ d_Zd`da ZG dbdc dceZejG ddde deZejG dfdg dgZG dhdi diejуZdgdjdkdldmZG dndo doZdpd<dqdrZdsdt Zdudv Zdwdx Zdydz Zd.d.d{d|d}Zd~ddd.dddZd~dXddd.dddZdd7dddZdd Zd~dXdddddd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   B/var/www/auris/lib/python3.9/site-packages/torch/_dynamo/guards.py__init__   s     
zGuardManagerWrapper.__init__c                 c  s*   t  | _zd V  W t  | _n
t  | _0 d S 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*|r` 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 }q0|rV 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 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'  s    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>/      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 ]\}\}}|d|  | \ |r\|d| |  | || |r|d| |  | || W d    q1 s0    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   |   | D ]`}t|tjjjjrb|| jvrP| j	| |
| | qr|
|jjg q|
| | qt|tr| || t| | D ]0\}}|| |d|   | || qW d    n1 s0    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|}|   | }d|_|jddd |jd	dd |d
 | | j| t| jdr| j D ]}|	| 
| q|| W  d    S 1 s0    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  s    zDGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.prefixFc                   s&   |rt  | n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  s   | j |S r   )r   checkr   xr   r   r   r   |  s    zGuardManagerWrapper.checkc                 C  s   | j |S r   )r   check_verboser   r   r   r   r     s    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 ]J}t|tjjjjrB|vrR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_debugging)N)N)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 0 t| tjtjfr(t | n| W  d    S 1 s@0    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>  r   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  sb   t d u r^tttjjttdd tt	t
tttjtd u r6d ntjtdtjtjjtjttjttda t S )Nc                 S  s   t || S r   )dict__contains__)r   br   r   r   <lambda>  r   z#_get_closure_vars.<locals>.<lambda>inf)Z___check_type_idZ___check_obj_idZ___odict_getitemZ___key_to_idZ___dict_versionZ___dict_containsZ___tuple_iterator_lenZ___normalize_range_iterZ___tuple_iterator_getitemZ___dataclass_fieldsZ#___get_torch_function_mode_stack_at__math_isnan__numpy_isnanr  Z__load_moduleZutils_devicedeviceZ___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  s0    r  ast.ASTstrr   returnc                 C  s   t | ddS )N
r   )astunparsereplacer   r   r   r   _ast_unparse  s    r  r%   )r   r   r  c                 C  s   d}|d urz|j rFt|j D ]&}|jt vrdt|dd } qzqn4|jrz|j }t|dkrvd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"  zUnion[str | list[str]]	list[str])r   r   r  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&  zOptional[int]r  c                 C  s6   | d u rd S t | s| S t| tjs(J | j S d S r   )r0   r   r   SymIntr   Zmaybe_as_intdimr   r   r   convert_int_to_concrete_values  s    r+  c                 C  s   dd | D S )Nc                 S  s   g | ]}t |qS r   )r+  )r   r*  r   r   r   r     r   z.convert_to_concrete_values.<locals>.<listcomp>r   )Zsize_or_strider   r   r   convert_to_concrete_values   s    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   Z_dispatch_tls_local_include_setZ_dispatch_tls_local_exclude_setdtyper  indexrequires_gradr   )valuenamesizesstridespytypedispatch_keysZdispatch_keyr.  Zdevice_indexr0  Z	guard_strr   r   r   get_tensor_guard_code_part  s"    r7  c                 C  s   t t| |S r   )r%  rf   r/  )dctkeyr   r   r   get_key_index  s    r:  c                 C  s   d|  d| dS )Nlist(dict.keys())[]r   )r   r/  r   r   r   get_key_index_source  s    r>  r   r   )objr  c                 C  s&   t dt|  d|  dd d d S )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)r?  r   r   r   raise_local_type_error  s    rG  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   rK  __annotations__rM  rN  r   r   r   r   rI  &  s   
rI  c           
      C  s   | j  }t| jtr | jj}nt|ts.J t|| j}t||}tt	|| }t|t
tfrt| d|d}	n| d| d}	t| jts|j||| jtjd| j| d|g |j||	||dS )N[r=  r/  r   example_valueguard_manager_enum == )baser2  r   r/  rB   r   r:  r>  r%  rf   intr  get_key_managerGuardManagerTypeGUARD_MANAGERadd_equals_match_guardget_value_manager)
r   base_guard_managerbase_example_valuerR  rS  base_source_namer/  
key_sourceZkey_example_valuevalue_sourcer   r   r   getitem_on_dict_manager5  s2    


	ra  c                 C  s4   | j }t|trdS |  r dS | o2t|t S NFT)originating_sourcer   rS   is_specialized_nn_moduleZis_dict_keyrO   )r   r   r   r   r   match_on_id_for_tensor^  s    
re  c                   @  s   e Zd ZU ded< ded< dS )GuardCodeListr#  	code_listr%   r   Nr   r   r   rO  r   r   r   r   rf  m  s   
rf  c                   @  s   e Zd ZdZdZdS )rX  r7      N)r   r   r   rY  DICT_GUARD_MANAGERr   r   r   r   rX  s  s   rX  types.CodeTypecodec                 C  s   t tt| S r   )r%  r  r   rl  r   r   r   &code_framelocals_names_reversed_cachedx  s    rn  c                   @  s  e Zd Zdddddddddd	d
	d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dd d!d"Zdd$d%Zdd&d'd(d)d*d+Zd,d&d-d.d/Zdd&d0d1d2Zdd d3d4Zddd5d-d6d7Zdd5d-d8d9Zdd d:d;Zdd&d<d=d>d?Zdd d@dAZdd dBdCZdd dDdEZddd dFdGZdd dHdIZdd dJdKZdd dLdMZdd dNdOZdd dPdQZ dd dRdSZ!ddd	dTdUdVZ"dd dWdXZ#dd dYdZZ$dd d[d\Z%dd d]d^Z&dd d_d`Z'dadb Z(dcdd Z)dedf Z*dgdh Z+didj Z,dkdl Z-dmdn Z.dodp Z/dd dqdrZ0dd dsdtZ1dd dudvZ2dd dwdxZ3dd dydzZ4dd d{d|Z5ddd d}d~Z6dddZ7dS )GuardBuilderNrk  zCallable[[Any, str], str]zCallable[[Source], str]z)Callable[[object], ReferenceType[object]]dict[str, object]r~   CheckFunctionManagerrL  )	f_codeid_ref
source_reflookup_weakrefslocal_scoper   r   check_fn_managerserialization_modec
                 C  s   || _ || _|| _|| _||d| _tj | jd< tj	j
j D ]<\}
}|
dddddd}
|| jd |
< || j|
< qB|| _g | _g | _g | _g | _g | _|| _t | _| jjjD ]}| jt| |  qi | _i | _t | _|	| _ d S )NLG__builtins__>_<.Z_dot_)!rr  rs  rt  ru  scopebuiltins__dict__copyr   packageZpackage_importerZ_package_imported_modulesr   r  r   argnamesrm  shape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managersrw  r   key_order_guarded_dict_idsoutput_graphguard_on_key_orderr   idgetr2  r   _cached_guard_managers_cached_duplicate_input_guardsrx  )r   rr  rs  rt  ru  rv  r   r   rw  rx  r2  Zpackage_moduler   r   r   r   r   ~  s8    zGuardBuilder.__init__c           	      C  s   |  |}t|tr$td|j |j }t|D ]D}|| }t|j|d}| ||}|j	|| d|d||d q6d S )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )r/  rP  r=  r9  r   rR  rS  )
get_guard_managerr   r   NotImplementedErrorr2  rc  rf   rE   get_guard_manager_typedict_getitem_manager)	r   rR  r   dict_mgrZdict_sourcer9  r1  r`  rS  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s2J tt|D ]z\}}t|j|}|j|||t	j
d}t|r| ||}||td| d| d| q>||t| d|| q>d S )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for rQ  z__check_obj_id(r   r-  rT  )r  r   r   r  r2  	enumeraterf   r>  rW  rX  rY  ro   rs  add_id_match_guardr&  rZ  )	r   r1  r   r  r   r9  r_  Zkey_managerid_valr   r   r   guard_on_dict_keys_and_order  s6    

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)rR  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}nld|
v r|	|
d v rtdd|	}nJd|
v r|	|
d v rtdd|	}n(|	|vrd|
v r|	|
d v rtdd|	}|j	s|j
|j |||d	S |jsJ |j}|j}| d
}d }}d }}d }}|r`t|j|}| }|
| }| ||}|}|}| ||}n|}|}| ||}|j|| |
tjd}|||||
||d}|r|||||||dS |S dS )a(  
        This tries to avoid calling the expensive nn module custom getattr method by
        checking if the attribute is accessible via __dict__. For attributes that
        are not accessible via __dict__ (like descriptors), we fallback to
        PyObject_GetAttr.

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

        The most common and expensive case for nn module guards is of type
        mod.submod1.submod2.submod3.training. We avoid the python getattr of nn
        modules by going through the __dict__.
        c                 S  sv   t | tr`t||}d| d|d}| j|||tjd|| d|g | j||||dS | j||||dS d S )Nr;  r<  r=  rQ  rT  r  )	r   r   r:  rW  rX  rY  rZ  r[  r  )r   r9  source_namer]  rR  rS  r/  r_  r   r   r   getitem_on_dict_mgr.  s.    

z>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrFNT_parameters_buffersZ_modulesattrr   rR  rS  	.__dict__r   rR  rS  )r   r9  r  r]  rR  rS  )memberr  r   r   getmror   updatekeysrI  rK  getattr_managerrM  rN  r=   rU  r2  r  get_generic_dict_managerr  rX  rY  )r   r   r\  r]  rR  r^  r  rS  r  	attr_namemod_dictZall_class_attribute_namesr   Zaccessor_inforM  rN  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)r2  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}| |r6t|tr"t j}nt|ts0J t j}|S r   )rX  rY  r  r   ri   rj  r   )r   r   rR  rS  r   r   r   r    s    

z#GuardBuilder.get_guard_manager_typec                 C  s
   |t jkS r   )rX  rj  )r   Zmgr_enumr   r   r   manager_guards_on_keys  s    z#GuardBuilder.manager_guards_on_keysc                 C  s$   | j jj| jd d| jd tjdS )Nr{  )	f_globalsr   rR  rS  )r   r   Zglobals_dict_managerr  rX  rY  r   r   r   r   get_global_guard_manager  s    z%GuardBuilder.get_global_guard_managerc              	     sX  | j j}d }  }|dkr0|| jv r0| j| S |dkrB| |}|  |}d }d }d }tj}	t t	r j
 }| |}|  j
}|  j
|}	t trt| j}
t|
|
 j d }|j j|f|||d}nft tr|  j j|||d}n>t tr0|  j j|||d}nt tr@|S t trP|S t trz|sfJ |j|||d}nt ttt t!t"fr|sJ |}nt t#r|j$ fdd|||d}nzt t%r|sJ |j&|||d}nPt t'r$|sJ |j( j)|||d	}n"t t*t+fr|s>J t|t,j-j.rtt/|t0u rt| 1 ||||||}n|j2 j)|||d	}nt t3t4fr|sJ t|t5t6j7fsJ t|t8r| 9|	sJ t: ||||}n*t jt;r t<d
|j j|||d}n.t t=rPt>|d j?j@  d jA|||d}nt tBr~|sfJ |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}nRt|tIr0 jHs0|jJ j|||d}n( j} jHrF K }|jL||||d}nt tMr|srJ tN|sJ  jOs|jP||jQtjdjL jR|||d}nR|jS}|d usJ |d }|jT||tjd}t|t8rJ |j jR|||d}nBt tUr0|sJ |j$tV|||d}nt tWr`|sFJ |j$dd |||d}nt tXr|svJ |j$dd |||d}nt tYr|sJ |j$dd |||d}nt tZr|sJ |j$dd |||d}nVt t[r |sJ |j$dd |||d}n&t t\rN|s6J |j$dd |||d}nt t]rz|sdJ |j^ j|||d}nt t;rt|t8st_d|j` j|||d}nt tar|sJ |jb|||d}nnt tcr |sJ |jd|||d}nFt ter.|sJ |j$dd |||d}nt_d  d   || j  < |S )Nr   r7   r  )global_namer   rR  rS  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   rR  rS  r  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_orderZtensor_property__manager)r   r   rR  rS  zUse DictGetItemSourcez.__kwdefaults__c                 S  s   |   d S r   __tensor_flatten__r   r   r   r   r     r   c                 S  s   |   S r   )Z__obj_flatten__r  r   r   r   r     r   c                 S  s   |    S r   )_typeZqualified_namer  r   r   r   r     r   c                 S  s   |   S r   )Zget_baser  r   r   r   r     r   c                 S  s   |   S r   )itemr  r   r   r   r     r   c                 S  s
   t | S r   )r   r  r  r   r   r   r     r   rQ  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   r2  r  r  r  rX  rY  r   r@   rU  get_guard_manager_from_sourcern   rQ   rn  rr  r  r/  
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  ra  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AssertionErrorrW  r^   Zweakref_call_managerr>   Zcall_function_no_args_managerrC   )r   r   Zroot_guard_managerrR  r  rS  r^  r]  r\  Zbase_guard_manager_enumZframelocals_names_reversedZframelocals_idxoutr/  
kwdefaultsZ	kw_sourcer  r   r  r   r    s   

























	

























z*GuardBuilder.get_guard_manager_from_sourcer%   r$  c                 C  s   |  |jS r   )r  rc  r   r   r   r   r   r  +  s    zGuardBuilder.get_guard_managerTc                 C  s   |d u rt  }d| }t||\}}i }d| jd i}	td| t||	| |d |  }
|rz| j	j
|
| n| 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  zOptional[dict[str, Any]]r   )r2  r   r  c                 C  s   |d u rt  }t|| j|S r   )r  evalr  )r   r2  r   r   r   r   r  Q  s    zGuardBuilder.getzUnion[str, Guard])r   r  c                 C  s^   t |tr|}n|j}t|}|| jvrZtjj|}|rZ|dkrNt	
d| | j| |S )Nri  zinvalid var name: %s)r   r  r2  strip_function_callr  r   r   r   Zis_valid_var_namelogwarningr   )r   r   r2  rU  Zis_validr   r   r   arg_ref[  s    

zGuardBuilder.arg_ref)r   r  c                 C  s.   t |j|}t|||j|jd}||  d S )N)r  r  )r=   rc  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  s<  |j }t|tr|j}t|ts0J d|j |j}| }|j}| |}t| 	||}d }|rzd| d|d}nd| d|d}| j
||g| 	|d | |}	|r&| 	| }
| 	|}| ||
}t|tjjrt|tu r| ||	||
|| |S |	j||j|
|d n|	|t|| d S )Nzinvalid source hasattr(r   r-  znot hasattr()provided_guarded_objectr  )rc  r   rR   rU  r=   r2  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_sourcerU  r  refvalrm  base_managerrR  r]  rS  r   r   r   HASATTRt  sV    




zGuardBuilder.HASATTRNonec           	      C  s   |d usJ |  |}| |j}t|tjjs4J | |}|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  r2  r   r   r  r  r  r  r  r  rX  rY  add_dict_contains_guardr&  )	r   r   r  r  r  r  r  r  rm  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rN|j	|j
krNt| | |d|j d}d| | d| d}| ||g | ||t|| d S )Nsavetype(r-  z___check_type_id(r   )r  r2  r   r   _subclasses
FakeTensorr5  rF  rx  r   r   rG  rs  r  r  r  Zadd_type_match_guardr&  )r   r   r1  r   r  rm  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() == )rx  r   r   r:   PackageErrorr  r  r2  r   r  r  Zadd_dict_version_guardr&  )r   r   r  r  versionrm  r   r   r   DICT_VERSION  s    



zGuardBuilder.DICT_VERSIONrJ  )r   r9  invertc                 C  sZ   |  |}|rdnd}| d|d| d}| ||g | || |t|| d S )Nnot r   z___dict_contains(r   r-  )r  r  r  r  r&  )r   r   r9  r  Zdict_refZ	maybe_notrm  r   r   r   DICT_CONTAINS  s    

zGuardBuilder.DICT_CONTAINSc                 C  sv   |  |}| |j}t|ts$J | d|g}| || |r\| |t|| n| |	t|| d S )NrT  )
r  r  r2  rn   rJ  r  r  Zadd_true_match_guardr&  Zadd_false_match_guardr   r   r  r  rm  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  r2  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rt|tjjr|jj}| |}|d ur|| j|< d S )Nr  z$ID_MATCH guard cannot be serialized.z___check_obj_id(r   r-  )rx  r   r   r:   r  r   rc  rZ   r  r%   rU  ro  r  r  r2  rs  r  r  r  r&  rQ   r  r  r  ru  r   )r   r   r  r  r  rm  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  r2  r   r   Tensorr  r  add_not_none_guardr&  )r   r   r1  r  r  rm  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  r2  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  ro  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  s    z#GuardBuilder.DUAL_LEVEL.<locals>.fn)rw  r  r	  r  r   Zautogradr
  r   r   r  r&  r   r   rm  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  r   z6GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.<listcomp>z5torch._functorch.pyfunctorch.compare_functorch_state(r-  c                   s    S r   r   r  Z
compare_fnZstatesr   r   r  _  s    z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn)rw  r  Zfunctorch_layersr  r   
_functorchZpyfunctorchZcompare_functorch_stater   r   r  r&  )r   r   Zcisrm  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  s    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rFt  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_metadatar1  r   r   metadata_checker  s    zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checkerc                   s   |   d  kS r  r  r  )r  r   r   r    s    Z___check_metadata_Z_c)r  r2  r   r  r   rw   r  r"   current_compile_idr  r  r&  )r   r   r  r  r   r  r   TENSOR_SUBCLASS_METADATA_MATCH  s    


z+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH)r   recompile_hintc                   sF  |  |}| |j}trLt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 rddlm} ddlm}	m }
m!}m"} ||||
||	f }ddl#m$} ||f }dd l%m&  m'} t(||s|)t|sJ dt| t(|t*rxt+,|rx| -| 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(||rt5|}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  rT  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  r2  r   Zint8int16int32int64Zuint8Zuint16Zuint32Zuint64float16float32float64r%  r   r  rg   rF  	frozensetslicerangeri   r   SizeZdistributedZis_availableZtorch.distributed.device_meshr!  Z(torch.distributed.tensor.placement_typesr"  r#  r$  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   rZ  )r   r   r   r  r  Znp_typesZok_mutable_typesZok_typesr!  r"  r#  r$  r%  r&  pytreerm  r   r   r'  r   r    s    
	







zGuardBuilder.EQUALS_MATCHc                 C  s\   |  |j}t|tr"| | n6|d u r6| | n"t|tjrN| | n
| 	| d S r   )
r  r2  rn   rJ  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rZt	|j
tsHJ | |dtj n 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)rx  r   r   r:   r  r  r  r2  r   rn   r8  rJ  r  ro  r7  Zunimplemented_v2rF  r6  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.)rx  r   r   r:   r  r  r  r   r   r   FUNCTION_MATCH#  s
    
zGuardBuilder.FUNCTION_MATCHc                 C  sl   | j dkrtjjd| |j}t|tj	kr^t
|dr^| |dtj | |dtj n
| | dS )z!matches a closure by __code__ id.r  z)CLOSURE_MATCH guard cannot be serialized.__code__N)rx  r   r   r:   r  r  r2  rF  r4  FunctionTyper   r  ro  r  r<  r6  r   r   r   CLOSURE_MATCH,  s    
zGuardBuilder.CLOSURE_MATCHc                 C  s
   |  |S r   )r<  r  r   r   r   BUILTIN_MATCH;  s    zGuardBuilder.BUILTIN_MATCHc                 C  s   |  |}| |j}t|ts*| | g }t|dkrL|d|  n|d| dt|  | || t|tr| 	|
t|t|| n| 	|t|t|| d S )Nr   r  zlen(r  )r  r  r2  r   r   r  r  r   r  r  Zadd_dict_length_check_guardr&  Zadd_length_check_guardr   r   r  r1  rm  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  r-  )r  r  r2  rF  r   ru   r  rs  r  Zadd_tuple_iterator_length_guardr&  )r   r   r  r1  r   rm  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  r-  )r  r  r2  rF  rq   r   r  rs  r  Zadd_range_iterator_match_guardr&  )r   r   r  r1  r   rm  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sBt|rFd 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 )rx  r   r   r:   r  r  r2  r   rc  r  r   r  r   r  r  r&  )r   r   source_bZref_aZref_br9  rm  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   )
rx  r   r   r:   r  r  r  r  r  r&  r   r   rm  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  r2  r   r%  r  r  r  Zadd_mapping_keys_guardrA  r   r   r   MAPPING_KEYS_CHECK  s    
zGuardBuilder.MAPPING_KEYS_CHECKc                 C  s   |  |}| |j}|tjjju r2| | dS | | g }|	d| dt
t| | || | |jr| || n| || dS )z6Insert guard to check that the keys of a dict are sameNr;  z)) == )r  r  r2  r   r  r2   ZSUPPORTED_NODESr  rB  r   r%  rf   r  r  rc  r  r  rA  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_guardsrB  r  r   r   r   EMPTY_NN_MODULE_HOOKS_DICT  s    z'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICTc                 C  s   d S r   r   r  r   r   r   	GRAD_MODE  s    zGuardBuilder.GRAD_MODEc                 C  s   d S r   r   r  r   r   r   DETERMINISTIC_ALGORITHMS  s    z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  s   d S r   r   r  r   r   r   TORCH_FUNCTION_STATE  s    z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  s   d S r   r   r  r   r   r   FSDP_TRAINING_STATE  s    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(   GLOBALrw  r  Zcurrent_devicer  r  Zadd_default_device_guardr&  rK  r   r   r   DEFAULT_DEVICE  s    
zGuardBuilder.DEFAULT_DEVICEc           "        s2  |j dksJ jjjdkr^jjd us0J jj}|j}|j}|jd urT|j}|j}nj	dd D fdd}j
ri }g }	g }
i }t }j
D ]:}|jjv rtjj||j||	|
|| qtd qt|	|
t| |dd	 nd   fd
d}tjrVz|d\}}}d}W n$ tyR   d}|d\}}Y n0 n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|s0J |j#|j  }}|sHd S |) D ]t\}}t|t*rjd}nXj|  i t+t, d}t|t-r|.||f n t|t/r|.||f nd}qP|sdd l0}ddl1m2} |sJ |j#|j  }}t3|| }zȇfddt4|D }d5dd t4|D }d5dd t4|D }|r^d| d}|rpd| d}t67d| d| dd 5| d!}t89d"||j# |:|} |;| j<|j=j>}!|!sJ W n tj?j@jAy   Y n"0 tB|tC|tC||!| |j# d S |j#r.jD|j#|j#i t+t, d d S )#Nr   loadc                 S  s   g | ]
}|j qS r   )Zsymbolic_contextr   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   r)  r   r   r     s   z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)t_idr*  )r  r)  r   get_sources  s    
z+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesz+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsrelaxed_sourcesZ	warn_onlyc              	     s8   j jdd D dd D  jjjj | dS )Nc                 S  s   g | ]
}|j qS r   )ZfakerX  r   r   r   r   %  r   zCGuardBuilder.SHAPE_ENV.<locals>._get_code_parts.<locals>.<listcomp>c                 S  s   g | ]
}|j qS r   r  rX  r   r   r   r   &  r   )input_contextsequalities_inputsrt  Zignore_staticlangs)	shape_envZproduce_guards_verbosert  rw  r  export)rb  ra  r!  r`  r  r   r   r   _get_code_parts#  s    
z/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts)pythonverbose_pythoncppT)rg  rh  r  cpp_code_parts)python_code_partsr   rj  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  s&   | ]\}\}}| d | dV  qdS )z = int_values[r=  Nr   r   ro  r~  symbolr   r   r   	<genexpr>  s   
z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>c                 s  s&   | ]\}\}}| d | dV  qdS )z = float_values[r=  Nr   rp  r   r   r   rr    s   
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)Er2  rw  r  rx  shape_code_partsrk  r   rj  rl  Ztracked_fakesZexport_constraintsr   rZ  rY  r   rd  Zdynamic_shapesZ_process_equalitiesrc  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  rV  r   r
  ctypesZtorch._inductor.codecachern  r   r  r  textwrapdedentr  r  rW  castr   c_void_pr1  Z	_inductorr:   ZInvalidCxxCompilerr   r  r  )"r   r   rt  rk  r   rj  rl  r[  namesr\  r]  r^  r_  
constraintrf  Zmaybe_cpp_code_partsZmaybe_shape_env_sourcesrm  Zcompile_contextZint_source_to_symbolZfloat_source_to_symbolr   rx  r   rq  rR  r{  rn  Zguard_managersZint_symbols_strZfloat_symbols_strZfunc_strZclibZcguardr   re  r   	SHAPE_ENV  s6   














zGuardBuilder.SHAPE_ENVc              
   C  s  t jr| rd S t|r(| | nt|tr8| }|d urD|n
| |j}t	|}t
j|}t|t
jjr|jd ur|j}|jd ur|j}t|t
jsJ t jrt|t
jjrt }|d|  |d|j |dd | |}g }| jjjr| | g d}|D ]h}	| |d |	 }
t|
t
jt
j frb|!d| d|	 dt"|
 n|!| d|	 d	|
  qn| #|}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sD| j.j/0|j |j1d usTJ t2|d|j%d\}}|st3|dr|j4}d| d| d| d}|!| | #|5|t+|| n.d| d}|!| | #|6dt+|| t7|dkr| 8|| d S )NZparam_numelZparam_bytesZparam_countr7   )r.  r  r0  zndimension()r  zstr(r  rT  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_modulere  r  r   r6   r  r2  rF  r   r   _dispatch_keysr  r  r5  r6  r  Zlog_compilation_metricsr  	Parameterr!   	incrementZnumelnbytesr  rw  r  rd  r  rn   r  r.  r   r  r  Z,skip_no_tensor_aliasing_guards_on_parametersrc  rS   r  r  input_source_to_sizes_stridesr,  r&  r7  Zadd_tensor_match_guardr   r   r   r   rs   r   r  Zadd_dynamic_indices_guardr  r  r  )r   r   r1  r5  r6  Zmetrics_contextZtensor_namerm  ZtermsZ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 sJJ d| |d u rl|j}|s`d n| |}n|}|d urt	t
|nd }	d }
t|jdddk}|rt|tjtfst	|}
|||	||
 d S )NzH_produce_guard_code must be called from inside GuardedCode. Called from __weakrefoffset__r   )r   f_backrr  co_namer   r  r2  r  weakrefr  rF  r  r   enumEnumr  Zset_export_info)r   r   rg  r  Z	cur_frameZcaller	func_namer2  Zguarded_objectZguarded_object_typeZobj_refZsupports_weakrefr   r   r   r  	  s6    
z#GuardBuilder._set_guard_export_info)N)NT)N)N)N)N)N)N)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  r  r  r7  r;  r<  r?  r@  rB  rC  rG  rJ  rL  rM  rN  rP  rQ  rR  rS  rT  rV  r  r  r  r   r   r   r   ro  }  sz     A&
   h  
#
	6 
l	
 m /ro  c                   @  s   e Zd ZdZejejejfZe	j
G dd dZG dd dejZG dd dejZdd	d
dZddddddZdddddZdddddZdS )PyExprCSEPassr7   c                   @  s   e Zd ZU ded< ded< dS )PyExprCSEPass.Configzdict[str, int]
expr_countzdict[str, str]expr_to_nameNrh  r   r   r   r   Config	  s   
r  c                      s4   e Zd ZdddddZddd fd	d
Z  ZS )zPyExprCSEPass.ExprCounterr  r  )r8   r  c                 C  s
   || _ d S r   )_config)r   r8   r   r   r   r   	  s    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r   r   r   r   r   r   r   r   r   r   ExprCounter	  s   r  c                      s:   e Zd Zdddd fddZddd	 fd
dZ  ZS )zPyExprCSEPass.Replacerr  zCallable[[], str]r  )r8   gen_namer  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rt|}| jj| tjkr|| jjvrrt 	|}t|}| 
 }| j| d|  || jj|< n| jj| }t|t S t 	|S )Nz = )r   r  r  r  r  r  USE_THRESHOLDr  r   r   r  r  r   r  NameLoad)r   r   exprZnode_Zexpr_var_namer   r   r   r   	  s    zPyExprCSEPass.Replacer.visitr  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   	  r   z(PyExprCSEPass.__init__.<locals>.<lambda>)r  r  )_counterr  r  defaultdictr  r   r   r   r   r   	  s    zPyExprCSEPass.__init___varr  )r   r  c                 C  s    | | j  }|  j d7  _ |S r  )r  )r   r   r2  r   r   r   _new_var 
  s    zPyExprCSEPass._new_varr#  )rz  r  c                 C  sf   |  | j}|D ]P}z|t| W q ty^ } ztd|j|  W Y d }~qd }~0 0 qd S )Nz#Failed to visit expr at line %s.
%s)	r  r  r   r  parseSyntaxErrorr  	exceptionlineno)r   rz  countereexr   r   r   count
  s    zPyExprCSEPass.counttuple[list[str], str]r  r  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  	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   rc  rD   r8   Z guard_nn_modules_using_dict_tags	create_fnro  r;  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   '
  s    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 )ry  r.   rk  r   zOptional[_CppShapeGuardsHelper]rj  rJ  rl  zlist[Source]rm  Nrh  r   r   r   r   ry  +
  s
   
ry  c                   @  s   e Zd ZU ded< ded< dS )GuardsStaterz   r  Optional[ShapeCodeParts]rt  Nrh  r   r   r   r   r  4
  s   
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dZeddddZ	ed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  r5  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  rF  Z__tensor_unflatten__r5  r   r   r  r  r6  )r  r  r  r5  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_subclassr  )aliasc                 C  s
   t |S r   )r  r  )r  r  r   r   r   _unpickle_python_modulec
  s    z*GuardsStatePickler._unpickle_python_modulerV  )raw_reprc                 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bytes)jsonc                 C  s   t jjj|S r   )r   r   r  CInterpreterZdeserialize)r  r  r   r   r   _unpickle_functorch_interpreterk
  s    z2GuardsStatePickler._unpickle_functorch_interpreterc                 C  s
   t |S r   )r4  MappingProxyType)r  dr   r   r   _unpickle_mapping_proxyo
  s    z*GuardsStatePickler._unpickle_mapping_proxyc                 C  sj  dd l }t|tjr|jjdkrddlm} ||rg }| \}}|D ],}t	||}| 
|\}	}
|||	|
f qHt| 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r2t|jt|jkrtS |jjtjjjkr(t| j| ffS nt|rPt| j|jffS t|tjjrtt| 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)rt*d| d|j+ d	n"t|t,j-r(t| j.|/ ffS t|jt|jkrft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-  r@  rA  rB  rC  rD  )3sympyr   r   r  r  rF  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
issubclassZFunctionr   r  r  r(  r  r   r4  r  r  r  r   r:   r  )r   r?  r  r  r  attrsr  r  innerfuncZ
args_tupler   r   r   r  s
  sp    
	
z#GuardsStatePickler.reducer_override)r   r   r   r   classmethodr  r  r  r  r  r  r  r  r   r   r   r   r   r  :
  s    



r  r  )r  r  c              
   C  s`   t  }t|}z||  W n8 tyV } z tjjt	||W Y d }~n
d }~0 0 |
 S r   )ioBytesIOr  dumpAttributeErrorr   r   r:   r  r  r   )r  bufZpicklerr  r   r   r   pickle_guards_state
  s    *r  c                   @  sL   e Zd ZddddddddZdd	d
Zdd Zdd Zdd Zdd ZdS )rq  Nz%Optional[Callable[[GuardFail], None]]z8Optional[Callable[[list[GuardFilterEntry]], list[bool]]]rL  r  )r   guard_filter_fnguards_serialization_modert  c              	     s  |r
|j nd }i _t|}	|_|_|r2|jnd _|_tdsPt	d t
|pXdtjd}
|
|	|||rvd nj\ }|r fdd|fdd|
D tt|
ksJ td	d
 D sJ 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rt$ t$ fdd}j% }|
D ]D}t&|j't(r>js$J jj)D ]}|| q,n
||j' qjj*D ]}|| qTd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   )r9  c              	     s   t  }t| j}|dkr"d}|}nd} | j}t| jd u}| j}t|tj	rZ| jj
}t||||j| jrvt| jnd|| dS )Nr   FTr   )r2  	has_valuer1  Z
guard_typeZderived_guard_types	is_globalZ
orig_guard)objectstrip_local_scoper2  r  r   rc  r  r   	functoolspartialr  rd   r   Zguard_typesr  )r   MISSINGr2  r  r1  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     r   z1CheckFunctionManager.__init__.<locals>.<listcomp>c                 s  s   | ]}t |tkV  qd S r   )rF  rJ  r   r   r   r   r   rr    r   z0CheckFunctionManager.__init__.<locals>.<genexpr>c                   s   g | ]\}} | r|qS r   r   )r   ro  r   )filter_resultsr   r   r     s   %sg        rW  zGuard check failed: r7   zGuard eval latency = %s us.2fZguard_latency_usr  c                   sN   t |  }r&t|tsJ  | n$t|  }rJt|ts@J | d S r   )r   r   r  r   r   )r   r2  )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   rX  r  r   r   rr  |  r   zMCheckFunctionManager.__init__.<locals>.normalize_create_fn.<locals>.<genexpr>c                   s   i | ]\}}| |qS r   r   r   kvr  r   r   
<dictcomp>}  r   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                   s   i | ]\}}| v r||qS r   r   r  )r  r   r   r    s   z1CheckFunctionManager.__init__.<locals>.<dictcomp>c                   s   i | ]\}}| v r||qS r   r   r  )r  r   r   r    s   c                   s$   h | ]}t j|d d  |jdqS )N)Zobj_weakrefZguarded_class_weakrefr  )r  r  r  r	  )r  r   r   r     s   z0CheckFunctionManager.__init__.<locals>.<setcomp>)rv  r   _guardsr  )r  rt  Zdynamo_cpp_guards_strc                     s   j  d ddS )Nz
Guard latency = r  z us)r   r   )latencyr   r   r   r     r   z/CheckFunctionManager.__init__.<locals>.<lambda>
payload_fn);r{   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesr  rt  torch_function_mode_stackr  r,   r  r  r   r%   sort_keybuild_guardsr  allr  r   compile_check_fnr   r  r  rd  r   rv  get_guard_fail_reason_helperr"   r  r  rx   r   r   r    Zincrement_toplevelrV  guards_stater   Zdump_guards_stater   rc  rV   rm  r  r  r  r   r   r   r  Z	GuardsSetr3  Ztree_mapr+  r  r  r  _loggingtrace_structuredclear)r   rr  r  r   r   r  r  rt  r{   existing_diff_guard_sourcessorted_guardsr   reasonsr  Zoutput_graph_guards_stater   r   r&  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 ]@}|
s| rd|jvrd|jvrt	jsbd|jvrqb|| qb||fS )	Nc                   sB   |   }|tju r|  S  s"J   }|d us4J ||  S r   )guard_sourcer(   ZCONSTANTr2  r  )r   r-  Z	r_builderZ	w_builderr   r   rt    s    
z5CheckFunctionManager.build_guards.<locals>.source_refc                 S  s   |  }|rd |_ 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   ro  rs  ru  rv  r   r  r  r8   Zguard_nn_modulesr,   rd  r2  rO  r  )r   r+  r*  rr  r  rx  r   rt  r  r/  Zguard_on_nn_modulesr   r   r.  r   r"    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 ]0}|jD ]$}	|	|vr||	|jd ||	 qqx j}
d }d }t|
d	krt j|
d
d|
 d g | jr| jjng }|D ]}t|trR|j}|j}|  d|  }t | ||g ||d d qt|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 qt d| q j!D ]"}|jD ]}	||	|jd qqr0t"j#j$dfddd t%j&}|d u rHt%' }|||j(|dt)t* }| j+  d j,d i}tdksJ || 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rd}d}d ur~jrbdd	j
  }jr~dd	j
  }td || |s  | d S )Nr  c                     s<    rj rtj  nd r4jr4tjnd dS )N)rm  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   r1  r   add_code_part  s.    

z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partTr7   zcheck_no_aliasing(r   r-  rH  c                   s   g | ]}  |qS r   r  r   r   r  r   r   r   ^  s   z9CheckFunctionManager.compile_check_fn.<locals>.<listcomp>c                   s   g | ]}  |qS r   r9  r:  r  r   r   r   b  s   zcheck_overlapping(overlapping=[c                 s  s   | ]}|  V  qd S r   r2  r:  r   r   r   rr  h  r   z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>z], non_overlapping=[c                 s  s   | ]}|  V  qd S r   r;  r:  r   r   r   rr  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   )r7  r   r   r     r   z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>r  )Z___check_tensorsZ___check_tensors_verboseZ___check_global_stateZ"___check_torch_function_mode_stackr{  r   )F)6r  r  r  $make_torch_function_mode_stack_guardr   r   r   Zadd_global_state_guardZ#add_torch_function_mode_stack_guardr   rm  rg  r   r   r  r  r   r  r  r  aotautograd_guardsr   r$   Zinput_source_aZinput_source_br2  r   r  r*   Zoverlapping_sourcesZnon_overlapping_sourcesr   r  r  r   r'  r(  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_fnr8  seenZgclrm  r  Zcheck_tensors_fnZcheck_tensors_verbose_fnr?  r   Zsource_arI  r   Zoverlapping_guard_managersZnon_overlapping_guard_managersZglobal_stater   r  r   )r  r   r7  r   r   r$    s    

)






	

z%CheckFunctionManager.compile_check_fnc                 C  s|   t | drxt| jtsx| jj }d urx| jj }d urxt|tsDJ t|tsRJ d| d}t|}||| || _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   rB    s    
zCheckFunctionManager.invalidatec                 C  sZ   z>t || jvr<t|| jt |< t|tj| j|d W n tyP   Y n0 t |S )zadd a weakref, return the id)rC  )	r  r  r  r  r   r  r  rB  rE  )r   r?  rC  r   r   r   rs    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   r?  r   r   r   ru    s    z$CheckFunctionManager.lookup_weakrefs)NNNNNN)N)	r   r   r   r   r"  r$  rB  rs  ru  r   r   r   r   rq  
  s          o 
? 1rq  ztuple[str, str]c           	   	     sv  ddl m} t  z" |  ddd fdd}W n" tyV   ddddd}Y n0 | }| D ]^}||\}}|| |d	| d
 |  |d W d    qb1 s0    Y  qb| }|d | $ || |d W d    n1 s0    Y  | }|d| d
 | $ || |d W d    n1 s\0    Y  |	 |	 fS )Nr   r   r  r  r  c                   s
     | S r   )r  r  Zcsepassr   r   r    s    z%build_guard_function.<locals>.replacec                 S  s   g | fS r   r   rD  r   r   r   r    s    zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guard)
r   r   r  r  RecursionErrorr   r   r   Zsplicer   )	r   Zclosure_argsr   r  Z
guard_bodyr  r  r   Zmake_guard_fnr   rE  r   r    s2    


*


*

*r  c                   C  s   t jjjdS )Nr|   r   r'  	_internalZ	log_stateZis_artifact_enabledr   r   r   r   is_recompiles_enabled  s    rI  c                   C  s   t jjjdS )Nr}   rG  r   r   r   r   is_recompiles_verbose_enabled  s    rJ  c                   s   dd | D   fdd}|S )Nc                 S  s   g | ]}t |qS r   )rF  r
  r   r   r   r     r   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 rb  )rk   r  r   rF  )Z	cur_stacktymoder4  r   r   check_torch_function_mode_stack  s    zMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stackr   )Zinitial_stackrN  r   rM  r   r>    s    r>  c                   sn   t | j}tt | jD ]*}||d< tt|||} | | q fdd D }d	|}d| gS )N__compile_source__c                   s&   g | ]}t  | d kr |  qS )r7   )r  )r   r9  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   rP  r   1recompilation_reason_for_no_tensor_aliasing_guard  s    




rQ  )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   rR  patternr   r   r   r     s    r  re   rp  r#   )r   f_locals
compile_idr  c              
   C  sF  || j d d}|| j g }d}g }| |}|jsd|j}t|dkrdd|d v r\d}n|}g }|rtt| |}n|D ]}t| j }	||	d< t	 N zt
||	|}
W n, ty   t rY W d	   qxn Y n0 W d	   n1 s0    Y  t|
tr|
s|}
t|
trx||
 t sx q*qx| 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{  ry  Fr7   zDuplicate tensor foundr   TrO  Nr   z; )r   r  r   r   resultr   r  rQ  r   r5   r  	ExceptionrJ  r   rJ  r  r   r  r  )r   rU  rV  r  r,  Zno_tensor_aliasing_check_failedr   Zguard_debug_infor   r   Zfail_reason
reason_strr   r   r   r%  -  sF    


&

r%  )r   rm  rU  rV  r  c                 C  s   t | tr| d| j S t| ||}tt|  | z&| jd ur\| t|pPdt|  W n t	yz   t
d Y n0 |S )Nr   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   r  r  r%  rm   rr   r   r   rc   rX  r  r  )r   rm  rU  rV  rY  r   r   r   get_guard_fail_reasonp  s    


rZ  r`   )framer  c                   s  g  | dur8t | j| j|j| j}|r0 | | j} q|j}t pHt	 }|sTt
jrt	 rtddd t D }ntd d}d| }d|j d	|j d
|j dt|d }|rt	 rt| n
t| t
jrt|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   ro  r  r   r   r   rr    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    Zartifactc                   S  s
   dddS )NZrecompile_reasonsr  )r2  encodingr   r   r   r   r   r     s    z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>c                     s    S r   r   r   r,  r   r   r     r   )Zmetadata_fnr  )rZ  r   rm  rU  rV  r   nextrr  rI  rJ  r8   Zerror_on_recompiler  r  r|  r   r  co_filenameco_firstlinenorecompiles_verbose_logr  recompiles_logr:   ZRecompileErrorr   r'  r(  )r   r[  r  rm  Zdo_recompiles_logZfailuresZguard_failure_detailsmessager   r_  r   'get_and_maybe_log_recompilation_reasons  sJ    







	rf  c                 C  sT   | }t  }| d ur*|| j  | j} q
|} | d urP|| j_| j  | j} q.|S r   )r   r  r   r   r`  r   r   )r   Zfirst_cache_entryZacc_diff_guard_sourcesr   r   r   r    s    
r  rV  rJ  )r   rm  rU  r/  lastc                 C  s   t d|j d|j d|j  t dd| j d  t dd| j t |  d|i| j}| jD ]2}zt|| j	| W qf   t d|  Y qf0 qfd S )	NzERROR RUNNING GUARDS  r]  zlambda r   z and
  rz  zMalformed guard:
)
printr  ra  rb  r  r   r   r   r  r   )r   rm  rU  r/  rg  rv  r   r   r   r   guard_error_hook  s    
rj  c                 c  s,   t  }| D ]}||vr
|V  || q
d S r   )r   r   )seqrA  r   r   r   r   unique  s
    rl  c                 C  sf   |rb|| krbt |}t | }t|s,t| rJt|   d|  d||krbtjtj|dS d S )Nz is aliasing zC. This is not supported. Please do a clone for corresponding input.)rI  )	r   r   r:   ZUnsafeScriptObjectErrorr2  r  r  ro  rJ  )Z
obj_sourceZdupe_sourceZser_source_is_localZsource_is_localr   r   r   make_dupe_guard  s    	rm  )skipc                 G  s`   ddl m} ttjp"ttj}| jj	j
}|D ]$}t|tsHJ |||| d d q6dS )z
    Add dynamo guards to the current tracing context.

    Args:
        guards: guard(s) to add
        skip: number of stack frames to ignore for debug stack trace
    r   )TracingContextr7   )collect_debug_stackrn  N)torch._guardsro  r  r3  r4  r5  r2  r  Zguards_contextr<  r   r   r%   )rn  r{   ro  rp  r   r   r   r   r   install_guard!  s    
rr  )r   
__future__r   r  r  r  r  r  r  r  r   r  r4  r  pickler  r|  r4  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!   rq  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   r3  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   rO  numpyr   ModuleNotFoundErrorr  ry   Ztorch._dynamo.output_graphrz   	getLoggerr   r  r'  ZgetArtifactLoggerr  rd  rc  r2  r~   r   cacher   r   r  r  r   r   r  r"  r&  r+  r,  r7  r:  r>  rG  r  rI  ra  re  rf  r  rX  rn  ro  r  r  r  ry  r  Picklerr  r  rq  r  rI  rJ  r>  rQ  r  r%  rZ  rf  r  rj  rl  rm  rr  r   r   r   r   <module>   s   0(
,%$	P

 b	



)              PU	     +C<"