o
    ^i                    @  sJ  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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  zddlm!Z! W n e"y   ddl#m!Z! Y nw dd	l#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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQ ddlRmSZSmTZT ddlUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZb ddlcmdZd ddlemfZfmgZgmhZhmiZimjZj ddlkmlZm ddlnmoZo ddlpmqZqmrZr ddlsmtZt ddlumvZvmwZwmxZx ddlymzZz ddl{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dZded< zddlZW n eĐy   dZY nw er/dd lmZmZmZ dd!lmZ dd"lmZ dd#lmZmZ e%d$ZeeҡZe'jԠed%Ze'jԠed&Ze'jԠed'Ze'jԠed(Zd)ZG d*d+ d+e`ZG d,d- d-Zdd2d3Zejdd5d6Zdad7ed8< dd:d;Zdd?d@Ze'jjjZddDdEZ	dddKdLZddOdPZddTdUZdd^d_ZddddeZddhdiZddldmZddodpZejdqdrG dsdt dtZdd}d~ZdddZejG dd dZG dd{ d{ejZejdddZG dd deZZG dd dZdddZG dd de܃ZejG dd dZejG dd dZG dd dZG dd dejZdddZ G dd dZdddZdddZdddZdddZe$deeef Z	dddZ
dddZdddZ	ddddZ	ddddÄZdddƄZddd˄Zeze dddЄZdddքZddלdddڄZd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)LiteralString)TypeAliasTypeTypeVar)ReferenceType)code_framelocals_names)check_obj_idcheck_type_idClosureGuardAccessorCodeGuardAccessordict_versionDictGetItemGuardAccessorDictGuardManagerFuncDefaultsGuardAccessorFuncKwDefaultsGuardAccessorGetAttrGuardAccessorGetGenericDictGuardAccessorGuardAccessorGuardDebugInfoGuardManager install_no_tensor_aliasing_guardinstall_object_aliasing_guard!install_storage_overlapping_guardinstall_symbolic_shape_guard	LeafGuardprofile_guard_managerRelationalGuardRootGuardManagerTupleGetItemGuardAccessorTypeDictGuardAccessorTypeGuardAccessorTypeMROGuardAccessor)
get_global_source_nameget_local_source_nameIndexedSource$is_from_flatten_script_object_sourceis_from_local_sourceis_from_optimizer_sourceis_from_skip_guard_source.is_from_unspecialized_builtin_nn_module_sourceTensorPropertyTensorPropertySource)CompileEventLoggerget_metrics_context)	CompileContext	CompileIdDuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSourceStorageOverlapIndentedBuffer)
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ClosureSource
CodeSourceConstantSourceConstDictKeySourceDataclassFieldsSourceDefaultsSourceDictGetItemSourceDictSubclassGetItemSourceFlattenScriptObjectSourceFloatTensorSourceFSDPNNModuleSourceGenericAttrSourceGetItemSourceGlobalSourceGlobalStateSourceGlobalWeakRefSource
GradSourceListGetItemSourceLocalSourceNamedTupleFieldsSourceNNModuleSourceNonSerializableSetGetItemSourceNumpyTensorSourceOptimizerSourceScriptObjectQualifiedNameSourceShapeEnvSourceSubclassAttrListSourceTorchFunctionModeStackSourceTorchSourceTupleIteratorGetItemSourceTypeDictSourceTypeMROSource
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], Any]]guard_manager_testing_hook_fn)	GeneratorKeysViewSequence)Symbol)DispatchKeySet)OutputGraphOutputGraphGuardsStateTguards
recompilesrecompiles_verboseverbose_guards)__defaults____kwdefaults____code____closure____annotations____func____mro__c                      s*   e Zd ZdddZdd fd
dZ  ZS )IndentedBufferWithPrefixreturnstrc                 C  s   d| j | j  S )Nz| )_indenttabwidthself r   O/var/www/html/RAG/RAG_venv/lib/python3.10/site-packages/torch/_dynamo/guards.pyprefix      zIndentedBufferWithPrefix.prefixFlineskip_prefixboolNonec                   s(   |r
t  | d S t  d|  d S )Nz+- )super	writeline)r   r   r   	__class__r   r   r      s   z"IndentedBufferWithPrefix.writeliner   r   F)r   r   r   r   r   r   )__name__
__module____qualname__r   r   __classcell__r   r   r   r   r      s    
r   c                   @  s   e Zd ZdZd;d<ddZed=d
dZd>ddZd?ddZd?ddZ	d?ddZ
d?ddZd@ddZdAddZ	d;dBd%d&ZdCd+d,ZdDd-d.ZdEd/d0ZdFd4d5ZdGd7d8Zd?d9d:ZdS )H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++.
    NrootOptional[RootGuardManager]r   r   c                 C  sn   |d u r	t  | _n|| _d | _d | _d | _g | _d | _d | _d | _d | _	d | _
i | _g | _t | _t | _d S N)r&   r   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_guardsrJ   diff_guard_sources)r   r   r   r   r   __init__   s    
zGuardManagerWrapper.__init__Generator[None, None, None]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_guardsOrderedSet[str]c                   s@   d fddd fdd	dfd
d j   jS )Nnoder   r   r   c                   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)r   is_diff_guard_nodeidxkey_mgrval_mgrr   visitr   r   visit_dict_manager)  s   
zJGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_dict_managerr   c                   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_manager7  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   E  
   
z=GuardManagerWrapper.collect_diff_guard_sources.<locals>.visit)r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   collect_diff_guard_sources  s
   

z.GuardManagerWrapper.collect_diff_guard_sourcesc                 C  s"   t jrtdr|   |   d S )Nz3pytorch/compiler:use_recursive_dict_tags_for_guards)rO   "use_recursive_dict_tags_for_guardsrC   find_tag_safe_rootsprepare_diff_guard_managerr   r   r   r   finalizeP  s
   zGuardManagerWrapper.finalizec                 C  s   |    |   d S r   )r   populate_diff_guard_managerr   r   r   r   r   W  s   z.GuardManagerWrapper.prepare_diff_guard_managerc                   sj   ddd dfddd fdddfdd| j }|D ]}t| tjjr2|  q#dS )uD  
        Identify ``tag safe nodes`` and ``tag safe roots`` within a guard tree.

        -----------------------------------------------------------------------
        tag safe node
        -----------------------------------------------------------------------
        A *tag safe node* is a ``GuardManager`` whose guarded value satisfies one
        of the following conditions:

        1. Immutable value - The value is intrinsically immutable according to
        ``is_immutable_object``. Tensors are considered immutable. To ensure
        that symbolic guards run, we also check that the GuardManager has no
        accessors.

        2. Nested tag safe dictionary - The value is a ``dict`` whose keys and
        values are all tag safe nodes  (checked recursively).  Such dictionaries
        allow entire nested structures to be skipped once their identity tag
        matches.

        3. Pure ``nn.Module`` - The value is an ``nn.Module`` whose sole
        accessor is ``GetGenericDictGuardAccessor``—i.e., it only exposes its
        ``__dict__`` and nothing else that could mutate between runs.

        For every tag safe node, verifying the identity/tag of just the top-level
        dictionary is enough to guarantee the entire subtree is unchanged, enabling
        a *fast-path* guard check.

        -----------------------------------------------------------------------
        tag safe root
        -----------------------------------------------------------------------
        A ``tag safe root`` is a tag safe node whose parent is not tag safe.
        These boundary nodes mark the points where guard evaluation can safely
        prune traversal: if a tag-safe root’s dictionary tag matches, the entire
        subtree beneath it is skipped.

        One strong requirement for tag safe root is for the guarded object to
        support weakref. Refer to more details in the Recursive dict tag
        matching note. In short, we need to save the weakref of the object on
        first invocation, and check if it is still valid in later iterations, to
        apply recursive dict tag optimizations. `dict` objects do NOT support
        weakref. Therefore, as of now, we only mark nn module related guard
        managers as tag safe roots.

        Algorithm
        ---------
        The search runs in post-order traversal

        1. Visit leaves and classify them as tag safe or not.
        2. Propagate tag-safety upward: a parent dictionary becomes tag safe only if
        all of its children are already tag-safe.
        3. Propagate tag-safe-rootness upward: if the whole subtree is tag safe,
        the current node becomes the new tag safe root, otherwise propagate the
        subtree tag safe roots.
        4. Collect every tag safe node and, by inspecting parent tags, label the
        subset that are tag safe roots.
        r   r   accepted_accessorstuple[type[GuardAccessor], ...]r   r   c                   s,   |   }|  }t fddt||D S )Nc                 3  s&    | ]\}}t | o| V  qd S r   )r   is_tag_safe.0accessormgrr   r   r   	<genexpr>  
    
zTGuardManagerWrapper.find_tag_safe_roots.<locals>.check_tag_safety.<locals>.<genexpr>)get_accessorsr   allzip)r   r   	accessors
child_mgrsr   r   r   check_tag_safety  s
   zAGuardManagerWrapper.find_tag_safe_roots.<locals>.check_tag_safetyr   list[GuardManager]c                   s   t |  ts	J g }d}t|   D ]\}\}}|d ur# | |d ur.| | qt|   D ]\}\}}|rE|| M }|rM|| M }q7|rT|   |S NT)	
issubclassget_type_of_guarded_valuedictr   r   r   extendr   mark_tag_safe)r   tag_safe_rootsis_subtree_tag_safer   r   r   )r   r   r   r     s,   

zCGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_dict_managerc                   s  t | trJ g }|  D ]	}|| q|  r7t|  tjr1| 	 r/| 
 s/|   |S |   |S t|  trZ|  }|  }tdd t||D }|rX|   |S t|  tjjru | ttf}|rs|   | gS |S |  tjtjttfv rtjr | tttttf}|  D ]}t |tr||  t!v M }q|r|   |S t|  tj"r͈ | tf}|tdd |  D M }|r|   |S t|  t#r| $ %t!rtjr | t&f}|r|   |S t|  t'r | t(t)f}|r|   |S )Nc                 s  s&    | ]\}}t |to| V  qd S r   )r   r   r   r   r   r   r   r     r   zQGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager.<locals>.<genexpr>c                 s  s&    | ]}t |to| d kV  qdS )cell_contentsN)r   r   get_attr_name)r   r   r   r   r   r     s    


)*r   r   r   r  is_guarded_value_immutabler  r	  torchTensorhas_no_accessorshas_object_aliasing_guardr  r
  r   r  r  nnModuler   r)   typesFunctionType
MethodTypestaticmethodclassmethodrO   )assume_dunder_attributes_remain_unchangedr   r   r   r   r   r  dunder_attrs_assumed_constantsCellTypetupler   endswithr'   typer(   r*   )r   r  r   r  r  r  r   )r  r   r   r   r     s   ^\SJ

%

z>GuardManagerWrapper.find_tag_safe_roots.<locals>.visit_managerc                   s&   | d u rg S t | tr | S | S r   r   r   r   r   r   r   +  r   z6GuardManagerWrapper.find_tag_safe_roots.<locals>.visitN)r   r   r   r   r   r   )r   r   r   r  )r   r   r   r  )r   r  r	  r  r  r  mark_tag_safe_root)r   r  r   r   )r  r   r   r   r   r   [  s   
:
n
z'GuardManagerWrapper.find_tag_safe_rootsc                 C  s&   |  | j| _| jr| j  d S d S r   )clone_with_chosen_sourcesr   r   r   update_diff_guard_root_managerr   r   r   r   r   7  s   	z/GuardManagerWrapper.populate_diff_guard_managerchosen_sourcesr&   c                   s   d fdd}| j |S )Nnode_mgrr   r   r   c                   s   |    v S r   )r   )r'  r&  r   r   	filter_fnG     z@GuardManagerWrapper.clone_with_chosen_sources.<locals>.filter_fn)r'  r   r   r   )r   clone_manager)r   r&  r)  r   r(  r   r$  D  s   z-GuardManagerWrapper.clone_with_chosen_sourcesguardr#   	list[str]c                   s&   |j j | } fdd|D }|S )Nc                   s   g | ]} d  | qS ): r   r   part
guard_namer   r   
<listcomp>O  s    z7GuardManagerWrapper.get_guard_lines.<locals>.<listcomp>)r   r   r   )r   r,  partsr   r1  r   get_guard_linesL  s   z#GuardManagerWrapper.get_guard_linesguard_managerr   accessor_strOptional[str]r   c                 C  s`   |  }|jj}|d | }|r|d| 7 }|d|  7 }|d|  d|  d7 }|S )Nz	: source=, z, type=z, tag_safe=())r   r   r   r	  r   is_tag_safe_root)r   r6  r7  sourcetsr   r   r   get_manager_lineR  s   z$GuardManagerWrapper.get_manager_liner   r   bodyr   c              	   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   r   indentr?  construct_manager_string)r   r   r@  r   r   r   r   r   r   construct_dict_manager_string^  s   
z1GuardManagerWrapper.construct_dict_manager_stringc              
   C  s   |  g | D ],}t|tr-|| jvr$| j| || | q	||jj	g q	|| | q	t|t
rA| || t| | D ]\}}|| |d|   | || qJW d    d S 1 snw   Y  d S )Nzaccessed_by=)rA  get_leaf_guardsr   r%   r   r   
writelinesr5  r   r   r   rC  r  r   r   r   r?  reprrB  )r   r   r@  r,  r   r   r   r   r   rB  l  s,   



"z,GuardManagerWrapper.construct_manager_stringc                 C  s   |   B t }d|_|jddd |jddd |d | | j| t| jdr;| j D ]
}|| 	| q0|
 W  d    S 1 sIw   Y  d S )NrN    T)r   zTREE_GUARD_MANAGER:r&   get_epilogue_lambda_guards)r   r   r   r   rB  r   hasattrrH  rE  r5  getvalue)r   r@  r,  r   r   r   __str__  s   

$zGuardManagerWrapper.__str__xr   r   c                 C     | j |S r   )r   checkr   rL  r   r   r   rN       zGuardManagerWrapper.checkr   c                 C  rM  r   )r   check_verboserO  r   r   r   rQ    rP  z!GuardManagerWrapper.check_verbosec                   s2   t  ddd d fd
dj d S )N
leaf_guardr#   r   r-  c                 S  s2   g }|   D ]}|dd  }|| q|S )N#r   )r   splitrstripappend)rR  r   verbose_code_part	code_partr   r   r   get_code_parts  s
   zMGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.get_code_partsr   r   r   c                   sf   |   D ]!}t|tr|vrj | | qj | q|  D ]}| q*d S r   )rD  r   r%   r   r  r   r   )r   r,  r   rY  relational_guards_seenr   r   r   r   r     s   


zDGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.visit)rR  r#   r   r-  )r   r   r   r   )r   r   r   r   rZ  r   !populate_code_parts_for_debugging  s   
z5GuardManagerWrapper.populate_code_parts_for_debuggingr   )r   r   r   r   )r   r   )r   r   r   r   )r&  r   r   r&   )r,  r#   r   r-  )r6  r   r7  r8  r   r   )r   r   r@  r   r   r   )r   r   r@  r   r   r   r   rL  r   r   r   )rL  r   r   r   )r   r   r   __doc__r   r   r   r   r   r   r   r   r$  r5  r?  rC  rB  rK  rN  rQ  r\  r   r   r   r   r      s*    

1

 
]






r   ar   r   torch.Tensorc                 C  sN   t j  t| tjtjfrt | n| W  d    S 1 s w   Y  d S r   )r  	overrides_enable_torch_functionr   npgenericndarray	as_tensor)r`  r   r   r   
from_numpy  s   $rh  set[str]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>  s    z&uninteresting_files.<locals>.<setcomp>)torch._dynamo.external_utilstorch._dynamo.polyfills_dynamoexternal_utils	polyfillstorch._dynamo.polyfills.loaderrj  r  )r  modsrj  r   r   r   uninteresting_files  s   
rv  Optional[dict[str, object]]_CLOSURE_VARSdict[str, object]c                   C  s   t d u rVi dtdtdtjjdtdtddd d	td
t	dt
dtddd dtdtjdtd u r:d ntjdtddtjdtjjtjttjttda t S )N___check_type_id___check_obj_id___odict_getitem___key_to_id___dict_version___dict_containsc                 S  s   t || S r   )r
  __contains__)r`  br   r   r   <lambda>      z#_get_closure_vars.<locals>.<lambda>___tuple_iterator_len___normalize_range_iter___tuple_iterator_getitem___dataclass_fields___namedtuple_fieldsc                 S     | j S r   _fieldsrL  r   r   r   r        #___get_torch_function_mode_stack_at__math_isnan__numpy_isnaninf__load_moduleutils_device)device___from_numpy___as_tensorr  rk  )rx  r   r   collectionsOrderedDict__getitem__r   r   r   r   r   r   r   mathisnanrd  float	importlibimport_moduler  utils_devicer  rh  _as_tensor_fullprecrk  r   r   r   r   _get_closure_vars  sV   	
r  r   ast.ASTr   c                 C  s   t | ddS )N
rG  )astunparsereplacer   r   r   r   _ast_unparse     r  rX  r,  Optional[Guard]c                 C  s   d}|d urJ|j r0t|j D ] }|jt vr.dt|dd }t|dkr,dt| } nqn|jrJ|j }t|dkrHdt|d  }nd}| d	| S )
NrG  z  # T)r   i   r   z  # <unknown>z<60)
user_stackreversedfilenamerv  rK   lenstacksummary)rX  r,  extrafsr  r   r   r   get_verbose_code_part  s"   

r  r   Union[str, list[str]]recompile_hintr8  r-  c                   s<   t | ts| g}  fdd| D }rfdd|D }|S )Nc                   s   g | ]}t | qS r   )r  )r   rX  r,  r   r   r3    s    
z*get_verbose_code_parts.<locals>.<listcomp>c                      g | ]
}| d   dqS z (HINT: r:  r   r/  r  r   r   r3        )r   list)r   r,  r  r   r   )r,  r  r   get_verbose_code_parts  s   


r  dimOptional[int]c                 C  s2   | d u rd S t | s| S t| tjsJ | j S r   )rG   r   r  SymIntr   maybe_as_intr  r   r   r   convert_int_to_concrete_values%  s   
r  size_or_stride	list[Any]list[Optional[int]]c                 C     dd | D S )Nc                 S     g | ]}t |qS r   )r  )r   r  r   r   r   r3  0      z.convert_to_concrete_values.<locals>.<listcomp>r   )r  r   r   r   convert_to_concrete_values/     r  valuenamesizesstridespytyper"  dispatch_keysr   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(r9  z	, device=z, requires_grad=z, size=z	, stride=r:  )	r  _C_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper  indexrequires_gradr   )r  r  r  r  r  r  dispatch_keyr  device_indexr  	guard_strr   r   r   get_tensor_guard_code_part3  s"   	r  dctdict[Any, Any]keyintc                 C  s   t t| |S r   )r  r   r  )r  r  r   r   r   get_key_indexH  s   r  r<  r  c                 C  s   d|  d| dS )Nlist(dict.keys())[]r   )r<  r  r   r   r   get_key_index_sourceP  r  r  objr   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).)	TypeErrorr"  )r  r   r   r   raise_local_type_errorT  s   r  r   c                 C  s    t | tjjotjpt| tu S r   )r   r  r  r  rO   inline_inbuilt_nn_modulesr   r   )r  r   r   r   $should_optimize_getattr_on_nn_module\  s   
r  T)frozenc                   @  s2   e Zd ZU dZded< dZded< dZded< dS )NNModuleAttrAccessorInfoFr   present_in_generic_dictNr8  l1_keyl2_key)r   r   r   r  r   r  r  r   r   r   r   r  f  s   
 r  3Union[DictGetItemSource, DictSubclassGetItemSource]base_guard_managerr   base_example_valueexample_valueguard_manager_enumGuardManagerTyper   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[r  r  r<  r  r   == )baser  r   r  r[   r
  r  r  r  r   r  r   get_key_managerr  GUARD_MANAGERadd_equals_match_guardget_value_manager)
r<  r  r  r  r  base_source_namer  
key_sourcekey_example_valuevalue_sourcer   r   r   getitem_on_dict_manageru  s4   


r  r:   c                 C  s4   | j }t|tr
dS |  rdS | ot|t S NFT)originating_sourcer   rn   is_specialized_nn_moduleis_dict_keyrh   )r,  r<  r   r   r   match_on_id_for_tensor  s   
r  c                   @     e Zd ZU ded< ded< dS )GuardCodeListr-  	code_listr:   r,  Nr   r   r   r   r   r   r   r   r       
 r  c                   @  s   e Zd ZdZdZdS )r  rN      N)r   r   r   r  DICT_GUARD_MANAGERr   r   r   r   r    s    codetypes.CodeTypec                 C  s   t tt| S r   )r  r  r   )r  r   r   r   &code_framelocals_names_reversed_cached  s   r  c                   @  sP  e Zd Z		ddddZdddZdd!d"Zedd%d&Zdd1d2Zdd4d5Z	dd7d8Z
dd:d;Zdd<d=Zdd>d?Zdd@dAZ		BdddHdIZdddLdMZddOdPZddTdUZddVdWZ	dddYdZZdd[d\Zdd]d^ZddadbZddcddZddedfZddgdhZdddkdlZ	dddmdnZdddodpZddqdrZddsdtZddudvZ ddwdxZ!ddydzZ"dd{d|Z#ddd}d~Z$dddZ%dddZ&dddZ'dddZ(dddZ)dddZ*dddZ+dddZ,dddZ-dddZ.dddZ/dddZ0dddZ1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7ddddZ8		ddddZ9dS )GuardBuilderFNf_coder  id_refCallable[[object, str], int]
source_refCallable[[Source], str]lookup_weakrefs1Callable[[object], Optional[weakref.ref[object]]]local_scopery  r   r6  r   check_fn_managerCheckFunctionManagersave_guardsr   runtime_global_scoperw  r   r   c                 C  s2  || _ || _|| _|| _||d| _|
p|| _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d usfJ | jjjD ]}| jt| |  qki | _i | _t | _ g | _!|	| _"t#j$ot%d| _$t& | _'d S )	NLG__builtins__>_<._dot_!pytorch/compiler:guard_nn_modules)(r  r  r  r  scoper"  builtins__dict__copyr  packagepackage_importer_package_imported_modulesr   r  r6  argnamesr  shape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managersr  r   key_order_guarded_dict_idsoutput_graphguard_on_key_orderr   idgetr  r   _cached_guard_managers_cached_duplicate_input_guardsobject_aliasing_guard_codesr!  rO   guard_nn_modulesrC   rJ   +already_guarded_not_present_in_generic_dict)r   r  r  r  r  r  r   r6  r  r!  r"  r  package_moduler<  r   r   r   r     sF   
zGuardBuilder.__init__r  r  r,  r:   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 )r  r  r  r  r<  r  r  )
get_guard_managerr   r   NotImplementedErrorr  r  r   r^   get_guard_manager_typedict_getitem_manager)	r   r  r,  dict_mgrdict_sourcer  r  r  r  r   r   r   #guard_on_dict_keys_and_ignore_order  s*   


z0GuardBuilder.guard_on_dict_keys_and_ignore_orderr  c           	   
   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(r9  r:  r  )rD  r   r   rE  r  	enumerater   r  r  r  r  r   r  add_id_match_guardr  r   )	r   r  r,  rH  r   r  r  key_managerid_valr   r   r   guard_on_dict_keys_and_order)  s8   

z)GuardBuilder.guard_on_dict_keys_and_orderr   Optional[Any]c                 C  s.   t jrtjdkrtjdk rtdt d S | S )N)      )rQ  rR  rN   zMGuards may run slower on Python 3.13.0. Consider upgrading to Python 3.13.1+.)rO   issue_3_13_0_warningsysversion_infowarningswarnRuntimeWarning)r  r   r   r   '_get_generic_dict_manager_example_valueO  s   

z4GuardBuilder._get_generic_dict_manager_example_valuer<  rT   r  r   r  r  r   source_namer  r  c                 C  s  ddd}|j }	|j}
t }t|jD ]
}||j  qtddd}|	|
v r0td|	d}n6d|
v rA|	|
d v rAtdd|	}n%d|
v rR|	|
d v rRtdd|	}n|	|vrfd|
v rf|	|
d v rftdd|	}|j	ss|j
|j |||dS |jsxJ |j}|j}| d}d }}d }}d }}|rt|j|}| }|
| }| ||}|}|}| ||}n
|}|}| ||}|j|| |
tjd}|||||
||d}|r|dur|dusJ |||||||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__.
        r   r   r  r   rZ  r   r  r  r  r  r   c                 S  sr   t | tr0t||}d| d|d}| j|||tjd|| d|g | j||||dS | j||||dS )Nr  r  r  r  r  rC  )	r   r   r  r  r  r  r   r  rG  )r   r  rZ  r  r  r  r  r  r   r   r   getitem_on_dict_mgr|  s,   

z>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrFNT_parameters_buffers_modulesattrr<  r  r  	.__dict__r<  r  r  )r   r  rZ  r  r  r  )r   r   r  r   rZ  r   r  r   r  r   r  r  r   r   )memberr/  r   rk  getmror   updatekeysr  r  getattr_managerr  r  rT   r  r  rF  get_generic_dict_managerrY  r  r  )r   r<  r  r  r  r  rZ  r  r[  	attr_namemod_dictall_class_attribute_namesrL  accessor_infor  r  mod_dict_sourcel1_source_namel2_source_namel1_valuel2_valuel1_guard_manager_enuml2_guard_manager_enum	l1_sourcemod_generic_dict_managerl1_mgrr   r   r   getattr_on_nn_modulea  s   
%

	z!GuardBuilder.getattr_on_nn_moduler>   c                 C  s,   |  }|dkr
dS t| |}|| jv S )NrG  F)r  r;  r<  r8  )r   r<  rZ  obj_idr   r   r   requires_key_order_guarding  s
   
z(GuardBuilder.requires_key_order_guardingHOptional[Union[KeysView[Any], set[Any], frozenset[Any], dict[Any, Any]]]c                 C  sT   t j}| |r(t|trt j}|S t|ttfrt j}|S t|ts%J t j}|S r   )	r  r  ry  r   r   r  r   	frozensetr
  )r   r<  r  r  r   r   r   rF    s   

	z#GuardBuilder.get_guard_manager_typemgr_enumc                 C  s
   |t jkS r   )r  r  )r   r|  r   r   r   manager_guards_on_keys     
z#GuardBuilder.manager_guards_on_keysc                 C  s    | j jj| jd| jd tjdS )Nr%  )	f_globalsr<  r  r  )r6  r   globals_dict_managerr"  r-  r  r  r   r   r   r   get_global_guard_manager  s   z%GuardBuilder.get_global_guard_managerc              	     s  | j j}d }  }|dkr|| jv r| j| S |dkr!| |}|  |}d }d }d }tj}	t t	rL j
 }| |}|  j
}|  j
|}	t trpt| j}
t|
|
 j d }|j j|f|||d}nt tr|  j j|||d}nt tr|  j j|||d}nt tr|S t tr|S t tr|sJ |j|||d}nt tr|sJ |j|||d}ntt t r|sJ |j!|||d}nat t"t#t$t%t&fr|sJ |}nOt t'r|j(dd |||d}n<t t)r|j( fd	d|||d}n't t*r,|s"J |j+|||d}nt t,rC|s7J |j- j.|||d
}nt t/t0fr{|sPJ t t/sXJ t1|ro|sbJ | 2 ||||||}n|j3 j.|||d
}nt t4t5fr|sJ t|t6t7j8fsJ t t4t5fsJ t|t9r| :|	sJ t; ||||}nt jt<rt=d|j j|||d}nrt t>rt?|d j@jA  d jB|||d}nVt tCr|sJ |jD jB|||d}n?t tEr|s
J |jF j|||d}n(t tGrp|s!J t|t6t7j8fr.J dt|tHrD jIsD|jF j|||d}nt|tJrZ jIsZ|jK j|||d}n j} jIre L }|jM||||d}nt tNr|s{J |sJ tO|sJ  jPs|jQ||jRtjdjM jS|||d}n|jT}|d usJ |d }|jU||tjd}t|t9rJ |j jS|||d}ntt tVr|sJ |j(tW|||d}n^t tXr|sJ |j(dd |||d}nFt tYr|sJ |j(dd |||d}n.t tZr(|sJ |j(dd |||d}nt t[r?|s3J |j(dd |||d}nt t\rV|sJJ |j(dd |||d}nt t]rm|saJ |j(dd |||d}nt t^r|sxJ |j_ j|||d}nt t<rt|t9st`d|ja j|||d}nt tbr|sJ |jc j|||d}nt tdr|sJ |je|||d}nvt tfr|sJ |jg|||d}nbt thr|sJ |j(dd |||d}nKt tir
|sJ |j(dd |||d}n4t tjr|sJ |jk|||d}n t tlr2|s)J |jm|||d}nt`d  d   || j  < |S )NrG  rN   rC  )global_namer<  r  r  rb  c                 S  s   t S r   )r  r(  r   r   r   r        z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>)python_lambdar<  r  r  c                   s   t   S r   )r   
_get_indexr  r<  r   r   r    s    r_  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_ordertensor_property__manager)r   r<  r  r  zUse DictGetItemSourcez.__kwdefaults__c                 S  s   |   d S r   __tensor_flatten__r  r   r   r   r  @  r  c                 S     |   S r   )__obj_flatten__r  r   r   r   r  H      c                 S  s   |    S r   )_typequalified_namer  r   r   r   r  P  r  c                 S  r  r   )get_baser  r   r   r   r  X  r  c                 S  r  r   )itemr  r   r   r   r  `  r  c                 S  s
   t | S r   )r  r  r  r   r   r   r  h  s   
 r  z4ConstDictKeySource can only work on DictGuardManagerc                 S  s   t | S r   )r   r  r   r   r   r    r  c                 S  r  r   r  r  r   r   r   r    r  zmissing guard manager builder z - )nr6  r   r  r=  r<  rF  r  r  r   rW   r  get_guard_manager_from_sourcer   rj   r  r  r  r  
local_nameframelocals_managerre   r  rG  r  rg   global_weakref_managerrf   rq   rx   type_managerrv   type_dict_managerrw   type_mro_managerro   rl   rz   ry   rb   rt   lambda_managerrs   rh   grad_managerrc   generic_getattr_managerrc  rT   r{   r  rw  rg  r^   r_   r
  r  r  r   r}  r  r[   RuntimeErrorr4   getattrproplowerr   r-   indexed_managerri   list_getitem_managerrd   r  index_is_slicer   tuple_getitem_managerunpack_slicegetitem_managerr]   callableis_kwfunc_defaults_managerr   idx_keyr   func_kwdefaults_managerrn   rh  rr   r`   rp   rS   rV   ra   ru   tuple_iterator_getitem_managerAssertionErrorr  rm   set_getitem_managerr|   weakref_call_managerrU   call_function_no_args_managerr\   rk   rY   code_managerrX   closure_manager)r   r<  root_guard_managerr  rZ  r  r  r  r  base_guard_manager_enumframelocals_names_reversedframelocals_idxoutr  
kwdefaults	kw_sourcerH  r   r  r   r  $  s  












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




















	































z*GuardBuilder.get_guard_manager_from_sourcec                 C  s   |  |jS r   )r  r  r   r,  r   r   r   rD    r*  zGuardBuilder.get_guard_managerTr   r-  r   r   is_epiloguec                 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 )Nr9  r%  zPython shape guard function:
%s___make_guard_fn)r  joinrf  build_guard_functionr-  
guards_logdebugexecvaluesr6  r   add_epilogue_lambda_guardadd_lambda_guard)r   r   r   r   r  make_guard_fn_args_guard_bodypycoder  globals_for_guard_fnguard_fnr   r   r   $add_python_lambda_leaf_guard_to_root  s   z1GuardBuilder.add_python_lambda_leaf_guard_to_rootr  Optional[dict[str, Any]]c                 C  s   |d u rt  }t|| j|S r   )r  evalr-  )r   r  r   r   r   r   r<    s   zGuardBuilder.getUnion[str, Guard]c                 C  s^   t |tr|}n|j}t|}|| jvr-tjj|}|r-|dkr't	
d| | j| |S )Nr  zinvalid var name: %s)r   r   r  strip_function_callr4  r  r  rq  is_valid_var_namelogwarningrV  )r   r,  r  r  is_validr   r   r   arg_ref  s   

zGuardBuilder.arg_refri  r  (Callable[[GuardBuilderBase, Guard], Any]c                 C  sB   |dkr
t |j}nt|j|}t|||j|jd}||  d S )Nr   )r  r  )rY   r  rT   r:   r  r  create)r   r,  ri  r  attr_source	new_guardr   r   r   _guard_on_attribute  s   z GuardBuilder._guard_on_attributec              	   C  s8  |j }t|tr|j}t|trd S t|tsJ d|j |j}| }|j}| |}t	| 
||}d }|rDd| d|d}n	d| d|d}| j||g| 
|d | |}	|r| 
| }
| 
|}| ||
}t|r| ||	||
|| | d S |	j||j|
|d d S |	|t|| d S )Nzinvalid source hasattr(r9  r:  znot hasattr()provided_guarded_objectr_  )r  r   rl   r  rY   rT   r  rc  r  rI  r<  _set_guard_export_infor  rF  r  rw  rg  add_no_hasattr_guardr  )r   r,  r<  base_sourcer  r`  refvalr  base_managerr  r  r  r   r   r   HASATTR  sP   






zGuardBuilder.HASATTRr`  c           	      C  s   |d usJ |  |}| |j}| |}||f| jv rd S |j d}|j|| |jtj	d}d|d| d}|
d|t|| | j||f d S )Nra  rb  znot ___dict_contains(r9  z
.__dict__)F)r  r<  r  rD  rA  rh  rY  r/  r  r  add_dict_contains_guardr  r   )	r   r,  r`  r  r  r  rm  ru  r  r   r   r   NOT_PRESENT_IN_GENERIC_DICTB  s"   


z(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICTc                 C  s   |  |j}t|tjjr|jr|j}nt|}|j|j	kr!d|_
| |d|j d}d| | d| d}| ||g | ||t|| d S )NTtype(r:  z___check_type_id(r9  )r<  r  r   r  _subclasses
FakeTensorr  r"  r   r   _unserializabler  r  r  rD  add_type_match_guardr  )r   r,  r  r=  rx  r  r   r   r   
TYPE_MATCH[  s   

zGuardBuilder.TYPE_MATCHc                 C  s`   |  |}| |j}t| |j}d| d| }| ||g | ||t|| d S )Nz___dict_version() == )r  r<  r  r   r  rD  add_dict_version_guardr  )r   r,  r  r  versionr  r   r   r   DICT_VERSIONp  s   


zGuardBuilder.DICT_VERSIONr  invertc                 C  sZ   |  |}|r	dnd}| d|d| d}| ||g | || |t|| d S )Nnot rG  z___dict_contains(r9  r:  )r  r  rD  r  r  )r   r,  r  r  dict_ref	maybe_notr  r   r   r   DICT_CONTAINS~  s   

zGuardBuilder.DICT_CONTAINSc                 C  sR   |  |}|}| }d| d|d}| ||g | |||t|| d S )Nzset.__contains__(r9  r:  )r  r  rD  add_set_contains_guardr  )r   r,  r  r  set_refr  containsr  r   r   r   SET_CONTAINS  s   

zGuardBuilder.SET_CONTAINSc                 C  sx   |  |}| |j}t|tsJ | d|g}| || |r/| |t|| d S | |	t|| d S )Nr  )
r  r<  r  r   r   r  rD  add_true_match_guardr  add_false_match_guardr   r,  r  r  r  r   r   r   
BOOL_MATCH  s   


zGuardBuilder.BOOL_MATCHc                 C  sT   |  |}| |j}|d u sJ | dg}| || | |t|| d S )Nz is None)r  r<  r  r  rD  add_none_match_guardr  r  r   r   r   
NONE_MATCH  s   

zGuardBuilder.NONE_MATCHr  r8  c                 C  s   |  ||S r   )id_match_unchecked)r   r,  r  r   r   r   ID_MATCH  r*  zGuardBuilder.ID_MATCHc           	      C  s   t |jtr| t|jjtjS | |}| |j	}| 
||j	}d| d| d}| j||gdd | ||t||| t |jtrct |tjjre|jj}| |}|d urg|| j|< d S d S d S d S )Nz___check_obj_id(r9  r:  r  )provided_func_name)r   r  rx   r  r:   r  r  r  r<  r  r  r  rD  rL  r  rj   r  r  r  r  r  r   )	r   r,  r  r  r  rN  r  r  weak_idr   r   r   r    s*   


zGuardBuilder.id_match_uncheckedc                 C  sX   |  |}| |j}t|tjsJ | d}| ||g | |t	|| d S Nz is not None)
r  r<  r  r   r  r  r  rD  add_not_none_guardr  )r   r,  r  r  r  r  r   r   r   NOT_NONE_MATCH  s   


zGuardBuilder.NOT_NONE_MATCHc                 C  sT   |  |}| |j}t|tjjsJ | d|d}| ||t	|| d S )Nz.raw_repr() == z.raw_repr())
r  r<  r  r   r  r  r   rD  add_dispatch_key_set_guardr  )r   r,  r  r  r   r   r   r   DISPATCH_KEY_SET_MATCH  s   


z#GuardBuilder.DISPATCH_KEY_SET_MATCHc                 C  s   |  |dtj d S )Nr   )r  r  EQUALS_MATCHr  r   r   r   
NAME_MATCH  s   zGuardBuilder.NAME_MATCHc                   sd   | j jd usJ | j jj d  g}| || tjjd fdd}| jj	|t
|| d S )	Nz,torch.autograd.forward_ad._current_level == rL  r   r   r   c                   s
   j  kS r   )_current_levelr  
dual_level
forward_adr   r   fn  r~  z#GuardBuilder.DUAL_LEVEL.<locals>.fnr^  )r  r9  r
  r  r  autogradr  r6  r   r  r  r   r,  r  r  r   r	  r   
DUAL_LEVEL  s   

zGuardBuilder.DUAL_LEVELc                   sv   | j jd usJ | j jj}dd |D d dg}| || tjjj d fd	d
}| jj	
|t|| d S )Nc                 S  s   g | ]}|  qS r   )	get_state)r   cir   r   r   r3    r  z6GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.<listcomp>z5torch._functorch.pyfunctorch.compare_functorch_state(r:  rL  r   r   r   c                   s    S r   r   r  
compare_fnstatesr   r   r  
     z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fnr^  )r  r9  functorch_layersr  r  
_functorchpyfunctorchcompare_functorch_stater6  r   r  r  )r   r,  cisr  r  r   r  r   FUNCTORCH_STACK_MATCH  s   


z"GuardBuilder.FUNCTORCH_STACK_MATCHc                   st   t jjjjt jjjj d fdd d g}| || dfdd}| jj	|t
|| d S )NhooksCtuple[Callable[[torch.Tensor], Any], Callable[[Any], torch.Tensor]]r   Optional[tuple[int, ...]]c                   s"    | sd S | \}}t tt| S r   )r   mapr;  )r  	pack_hookunpack_hook)are_inline_hooksr   r   hooks_ids_fn  s   z?GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.hooks_ids_fnzCtorch._functorch.aot_autograd.utils.top_saved_tensors_hooks ids == rL  r   r   c                   s     kS r   r   r  )	get_hooksguard_hooks_idsr#  r   r   r  '  r  z5GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.fn)r  r  r   r  r^  )r  r  _aot_autogradr  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineabler  r6  r   r  r  r  r   )r"  r$  r%  r#  r   AUTOGRAD_SAVED_TENSORS_HOOKS  s   

	
z)GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKSc                   s   |  |jt|  |j d  tdr$t d fdd}nd fd	d}d
t| dt  }| 	|
|t|| d S )NrN   __metadata_guard__rL  r   r   r   c                   s     |  d S NrN   )r*  r  r  original_metadatar  r   r   metadata_checker4  s   zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checkerc                   s   |   d  kS r+  r  r  )r-  r   r   r.  ;  r   ___check_metadata__cr^  )r<  r  r   r  rI  r   r;  r7   current_compile_idrD  r  r  )r   r,  r.  r  r   r,  r   TENSOR_SUBCLASS_METADATA_MATCH.  s   


z+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCHc                   s8  |  |}| |j}tr&tjtjtjtjtjtj	tj
tjtjtjtjf}nd}ttf}tttttttttjh||B }tj r^ddlm} ddlm}	m }
m!}m"} ||||
||	f }ddl#m$} ||f }dd l%m&  m'} t(||s|)t|sJ dt| t(|t*rt+,|r| -| g }|.d| d | /|| | 0|1t2 d	 t3|| d S t(|t4rt,|r| -| g }|.d
| d | /|| | 0|1t2 d t3|| d S | d|g}t(||rt5|}t3||} r fdd|D }| 0|6|| | /|| d S )Nr   r   )
DeviceMesh)_StridedShardPartial	ReplicateShard)_IntWrapperzUnexpected type z__math_isnan(r:  r  z__numpy_isnan(r  r  c                   r  r  r   r/  r  r   r   r3    r  z-GuardBuilder.EQUALS_MATCH.<locals>.<listcomp>)7r  r<  r  rd  int8int16int32int64uint8uint16uint32uint64float16float32float64r  r   r   r   r"  r{  sliceranger   r  Sizedistributedis_availabletorch.distributed.device_meshr3  (torch.distributed.tensor.placement_typesr4  r5  r6  r7  torch.export.dynamic_shapesr8  torch.utils._pytreer  rI   r   is_constant_classr  r  r  r  rV  r  rD  r  r  r  complexr   r   )r   r,  r  r  r  np_typesok_mutable_typesok_typesr3  r4  r5  r6  r7  r8  pytreer  r   r   r  r   r  C  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  r   r   r  r  r  CodeTyper  r  r   r,  r  r   r   r   CONSTANT_MATCH  s   
zGuardBuilder.CONSTANT_MATCHc                 C  st   |  |d | |j}t|dr(t|jtsJ | js&| |dt	j
 d S d S tjdddt| ddgd d S )	Nz%[inline-inbuilt-nn-modules-candidate]trainingz-Attempted to guard on uninitialized nn.ModulerG  zKAttempted to setup an NN_MODULE guard on uninitialized nn.Module subclass `z`.zIEnsure the `nn.Module` subclass instance has called `super().__init__()`.)gb_typecontextexplanationhints)r  r<  r  rI  r   rV  r   r@  r  r  rU  rQ   unimplemented_v2r"  rT  r   r   r   	NN_MODULE  s    

zGuardBuilder.NN_MODULEc                 C  s
   |  |S )z0things like torch.add and user defined functions)r  r  r   r   r   FUNCTION_MATCH  s   
zGuardBuilder.FUNCTION_MATCHc                 C  sV   |  |j}t|tjkr$t|dr$| |dtj | |dtj	 dS | 	| dS )z!matches a closure by __code__ id.r   N)
r<  r  r"  r  r  rI  r  r  r  r]  rT  r   r   r   CLOSURE_MATCH  s
   zGuardBuilder.CLOSURE_MATCHc                 C  s8   | j rt|jtr| jj|jj | |S | 	|S r   )
r!  r   r  r^   r  used_builtin_varsr   r  r  r  r  r   r   r   BUILTIN_MATCH  s   

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  rV  r  rD  add_dict_length_check_guardr  add_length_check_guardr   r,  r  r  r  r   r   r   SEQUENCE_LENGTH  s    





zGuardBuilder.SEQUENCE_LENGTHc                 C  s   |  |}| |j}t|}g }|d| dt|  | || t|}| |d|j d}| |	t||t
|| d S )Nz___tuple_iterator_len(r  r  r:  )r  r<  r  r"  rV  r   r  r  rD  add_tuple_iterator_length_guardr  )r   r,  r  r  r=  r  rx  r   r   r   TUPLE_ITERATOR_LEN	  s   

zGuardBuilder.TUPLE_ITERATOR_LENc              	   C  s   |  |}| |j}t|}g }t|}|d| d|  | || t|}| |d|j d}|\}}	}
| |	||	|
|t
|| d S )Nz___normalize_range_iter(r  r  r:  )r  r<  r  r"  r   rV  r  r  rD  add_range_iterator_match_guardr  )r   r,  r  r  r=  r  normalized_range_iterrx  startstopstepr   r   r   RANGE_ITERATOR_MATCH	  s   


z!GuardBuilder.RANGE_ITERATOR_MATCHsource_bc           
      C  s  | j rt| }r| jj| t| }r| jj| | |}| | }t	|j
s2t	|r4d S ||f}|| jv r?d S | j||f | j||f | d| g}| || tjru|d }t||d }	| j||	f d S t| || |t|| d S )N is r   )r!  r,   r  additional_used_local_varsr   r+   additional_used_global_varsr  r  r0   r  r>  r  rO   #use_lamba_guard_for_object_aliasingr  r?  rV  r    rD  r  )
r   r,  rm  r  ref_aref_br  r  rX  rW  r   r   r   DUPLICATE_INPUT&	  s:   

zGuardBuilder.DUPLICATE_INPUTc                 C  s8   |  | dg}| || | |t|| d S r  )r  r  rD  r  r  r   r,  r  r   r   r   WEAKREF_ALIVEN	  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  rV  r  rf  r  rD  add_mapping_keys_guardrc  r   r   r   MAPPING_KEYS_CHECKV	  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 sameNr  z)) == )r  r<  r  r  r  rI   SUPPORTED_NODESr  rd  rV  r  r   r  ry  r  rO  rJ  rc  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)rO   skip_nnmodule_hook_guardsrd  r  r   r   r   EMPTY_NN_MODULE_HOOKS_DICTy	  s   z'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICTc                 C     d S r   r   r  r   r   r   	GRAD_MODE	     zGuardBuilder.GRAD_MODEc                 C  r}  r   r   r  r   r   r   DETERMINISTIC_ALGORITHMS	  r  z%GuardBuilder.DETERMINISTIC_ALGORITHMSc                 C  r}  r   r   r  r   r   r   TORCH_FUNCTION_STATE	  r  z!GuardBuilder.TORCH_FUNCTION_STATEc                 C  r}  r   r   r  r   r   r   FSDP_TRAINING_STATE	  r  z GuardBuilder.FSDP_TRAINING_STATEc                 C  sX   |j tju sJ | jjdusJ d| jjjg}| || | |t	|| dS )z/Guard on CURRENT_DEVICE per torch.utils._deviceNzutils_device.CURRENT_DEVICE == )
r<  r=   GLOBALr  r9  current_devicer  rD  add_default_device_guardr  ru  r   r   r   DEFAULT_DEVICE	  s   
zGuardBuilder.DEFAULT_DEVICEc           #        sJ  ddl m} |jdksJ jjd usJ jjd ur3jj}|j}|j}|jd ur/|j}|j	}nt
|s:J jdd D d*fdd}jd usRJ jri }	g }
g }i }t }jD ]}|jjv r{tjj||j|	|
||| qctd qct|
|t| |dd nd  d+ fdd}tjrz|d\}}}d}W n ty   d}|d\}}Y n	w d}|d\}}js̈j  j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 }|sm|sJ |j%|j"}}|s+d S |+ D ]=\}}t
|t,r=d}q/j | i t-t. d}t
|t/rZ|0||f q/t
|t1ri|0||f q/d}q/|sdd l2}ddl3m4} |sJ |j%|j"}}t5|| }zdfddt6|D }d7dd t6|D }d7d d t6|D }|rd!| d"}|rd#| d"}t89d$| d%| d&d'7| d(} t:;d)| |j% |<| }!|=|!j>|j?j@}"|"sJ W n tjAjBjCy   Y nw tD|tE|tE||"|!|j% d S |j%r#jF|j%|j%i t-t. d d S d S ),Nr   r   rG  c                 S     g | ]}|j qS r   )symbolic_contextr   r`  r   r   r   r3  	      z*GuardBuilder.SHAPE_ENV.<locals>.<listcomp>t_idr  r  r   list[Source]c                   s    fddj |  D S )Nc                   s   g | ]	}t |tj qS r   )r4   r3   SIZE)r   r<  r  r   r   r3  	  s    z?GuardBuilder.SHAPE_ENV.<locals>.get_sources.<locals>.<listcomp>)tracked_fakes_id_to_source)r  r  )r9  r  r   get_sources	  s   
z+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesz+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsrelaxed_sources	warn_onlylangstuple[str, ...]list[_ShapeGuardsHelper]c              	     s4   j jdd D dd D  jj | dS )Nc                 S  r  r   )faker  r   r   r   r3  	  r  zCGuardBuilder.SHAPE_ENV.<locals>._get_code_parts.<locals>.<listcomp>c                 S  r  r   r  r  r   r   r   r3  	  r  )input_contextsequalities_inputsr  ignore_staticr  )	shape_envproduce_guards_verboser  export)r  r  r  r  r9  r   r   r   _get_code_parts	  s   z/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts)pythonverbose_pythoncppT)r  r  cpp_code_parts)python_code_partsr   r  python_fallbackshape_env_sources)r   )CppCodeCachec                   s    g | ]\}}  t||qS r   )r  r-   )r   ir<  r   r   r   r3  C
  s    r9  c                 s  (    | ]\}\}}| d | dV  qdS )z = int_values[r  Nr   r   r  r(  symbolr   r   r   r   H
  
    

z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>c                 s  r  )z = float_values[r  Nr   r  r   r   r   r   L
  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)r  r  r  r  r   r  )r  r  r   r  )Gtorch._dynamo.output_graphr   r  r  r9  shape_code_partsr  r   r  r  r   tracked_fakesr  export_constraintsr   r  r  r  r  dynamic_shapes_process_equalitiesr  r  rF   r  r  rO    enable_cpp_symbolic_shape_guardsOverflowErrorfreezer!  localsr<  rD   source_to_symbolrf  ShapeCodePartsexprsr  r7   try_getshape_env_guardsr  r   rZ   rH   r  r  rV  r  ctypestorch._inductor.codecacher  r
  rK  r  textwrapdedentr  r  loadcastr,  c_void_pr  	_inductorrQ   InvalidCxxCompilerr"   r  r  )#r   r,  r   r  r  r   r  r  r  namesr  r  r  r  
constraintr  maybe_cpp_code_partsmaybe_shape_env_sourcesr  compile_contextint_source_to_symbolfloat_source_to_symbolr   r  r<  r  r  r  r  guard_managersint_symbols_strfloat_symbols_strfunc_strclibcguardr   r  r   	SHAPE_ENV	  sB  













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d usJ | jjjr| | g d}|D ]2}	| |d |	 }
t|
t
jt
j fr|!d| d|	 dt"|
 q|!| d|	 d	|
  qnc| #|}t j$rt|t
jjst%|j&st|j&t's| j(!| | j)!| | jj}|j*|j& }t+|d
 }t+|d }t,t-|||||||}|.||||||| t|t
jjs)| j/j01|j |j2d us1J t3|d|j&d\}}|s|t4|dre|j5}d| d| d| d}|!| | #|6|t,|| nd| d}|!| | #|7dt,|| t8|dkr| 9|| d S d S )Nparam_numelparam_bytesparam_countrN   )r  r  r  zndimension()r*  zstr(r  r  sizestrideT)	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   ):rO   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler  r  r   rM   r<  r  r"  r  r  _dispatch_keysr  r  r  r  r  log_compilation_metricsr  	Parameterr6   	incrementnumelnbytesr  r  r9  r  r  r   r  r  rV  r   rD  ,skip_no_tensor_aliasing_guards_on_parametersr2   r  rn   r6  r7  input_source_to_sizes_stridesr  r  r  add_tensor_match_guardr6  r   r   r<  r   rI  r  add_dynamic_indices_guardr  r  r  )r   r,  r  r  r  metrics_contexttensor_namer  termsterm
real_valuer6  r9  metadatar  r  r   static_reasondynamic_indicesrX  r   r   r   TENSOR_MATCH
  s   





"








zGuardBuilder.TENSOR_MATCHr  r  r  c                 C  s   t  }|d us	J |j}~|d usJ |p|jj}~|| jjv s'J d| |d u r8|j}|s2d n| |}	n|}	|	d urEt	t
|	nd }
d }t|	jdddk}|rct|	tjttjfsct	|	}|||
|| 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  r"  r  r   enumEnumr   
ProxyTypesset_export_info)r   r,  r  r  r  	cur_framecaller	func_namer  guarded_objectguarded_object_typeobj_refsupports_weakrefr   r   r   r  C  s:   

z#GuardBuilder._set_guard_export_info)FN)r  r  r  r  r  r  r  r  r  ry  r   ry  r6  r   r  r   r!  r   r"  rw  r   r   )r  r  r,  r:   r   r   )r  r  r,  r:   r   r   )r  r   r   rP  )r<  rT   r  r   r  r   r  r   r  r   rZ  r   r  r  r   r   )r<  r>   r   r   )r<  r>   r  rz  r   r  )r|  r  r   r   )r   r   )r<  r>   r   r   )r,  r:   r   r   r  )
r   r-  r   r-  r   rw  r  r   r   r   r   )r  r   r   r  r   r   )r,  r  r   r   )r,  r:   ri  r   r  r  r   r   )r,  r:   r   r   )r,  r:   r`  rP  r   r   )r,  r:   r  r   r  r   r   r   )r,  r:   r  r   r  r   r   r   )r,  r:   r  r8  r   r   )r,  r:   r  rP  r   r   )r,  r:   rm  r>   r   r   )NN)
r,  r:   r  r-  r  rP  r  r8  r   r   ):r   r   r   r   rJ  rO  r  rY  rw  ry  rF  r}  r  r  rD  r  r<  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r2  r  rU  r\  r]  r^  r`  rd  rf  rl  rt  rv  rx  rz  r|  r~  r  r  r  r  r  r  r  r   r   r   r   r    s    
I
&
 




   
#



6













l








(









 q >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 )PyExprCSEPassrN   c                   @  r  )PyExprCSEPass.Configzdict[str, int]
expr_countzdict[str, str]expr_to_nameNr  r   r   r   r   Config  r  r  c                      s(   e Zd ZdddZd fd	d
Z  ZS )zPyExprCSEPass.ExprCounterrO   r  r   r   c                 C  s
   || _ d S r   )_config)r   rO   r   r   r   r     r~  z"PyExprCSEPass.ExprCounter.__init__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)rO   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.ReplacerrO   r  gen_nameCallable[[], str]r   r   c                   s    t    || _|| _g | _d S r   )r   r   r  	_gen_namepreface)r   rO   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  rV  r  NameLoad)r   r   exprnode_expr_var_namer   r   r   r     s   zPyExprCSEPass.Replacer.visit)rO   r  r  r  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    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  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.replaceNr]  )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   r  r]   rO    guard_nn_modules_using_dict_tags	create_fnr  r\  r  r   r   r   must_add_nn_module_guards  s   
r1  c                      s(   e Zd Zd	 fddZd
ddZ  ZS )DeletedGuardManagerWrapperreasonr   r   r   c                   s   t    || _d S r   )r   r   invalidation_reason)r   r3  r   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)r3  r   r   r   r]  )r   r   r   r   r   r   r   r   r   r   r2    s    r2  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  rE   r  r   zOptional[_CppShapeGuardsHelper]r  r   r  r  r  Nr  r   r   r   r   r    s   
 r  c                   @  r  )GuardsStater   r9  Optional[ShapeCodeParts]r  Nr  r   r   r   r   r5    r  r5  c                   @  s   e Zd ZdS )_MissingN)r   r   r   r   r   r   r   r7    s    r7  c                      s   e Zd Zd6 fddZed7d
dZed8ddZed9ddZed:dd Zed;d#d$Z	ed<d(d)Z
ed=d-d.Zed>d0d1Zd?d4d5Z  ZS )@GuardsStatePicklerr   r   kwargsr   r   c                   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   r9  r   r   r   r     s   zGuardsStatePickler.__init__statetorch.nn.Modulec                 C  s   t j }|| |S r   )r  r  r  __setstate__)clsr?  modr   r   r   _unpickle_module  s   

z#GuardsStatePickler._unpickle_modulemeta_tensorra  r  torch.devicer  r"  dispatch_keys_rawr  gradc           	   	   C  s<   t j }t jj }|||||t jj|}||_	|S r   )
r  r  r:  r<  r=  from_meta_and_devicer  r   from_raw_reprrH  )	rB  rE  r  r  rG  rH  r;  r>  retr   r   r   _unpickle_tensor  s   
	z#GuardsStatePickler._unpickle_tensorctx
inner_data5list[tuple[str, Callable[..., Any], tuple[Any, ...]]]c                 C  s^   i }|D ]\}}	}
|	|
 ||< q|j | }}t|||||}||_tjj||_	|S r   )
shaper  r"  __tensor_unflatten__r  r  r  r   rJ  r  )rB  rE  r  r  rG  rM  rN  inner_tensorsr`  unpickle_funcunpickle_func_args
outer_sizeouter_strider  r   r   r   $_unpickle_traceable_wrapper_subclass(  s   z7GuardsStatePickler._unpickle_traceable_wrapper_subclassaliasr   types.ModuleTypec                 C  
   t |S r   )r  r  )rB  rX  r   r   r   _unpickle_python_module?  s   
z*GuardsStatePickler._unpickle_python_moduleraw_reprtorch._C.DispatchKeySetc                 C  s   t jj|S r   )r  r  r   rJ  )rB  r\  r   r   r   _unpickle_dispatch_key_setC     z-GuardsStatePickler._unpickle_dispatch_key_setjsonbytes torch._C._functorch.CInterpreterc                 C  s   t jjj|S r   )r  r  r  CInterpreterdeserialize)rB  r`  r   r   r   _unpickle_functorch_interpreterG  s   z2GuardsStatePickler._unpickle_functorch_interpreterdr   types.MappingProxyType[Any, Any]c                 C  rZ  r   )r  MappingProxyType)rB  rf  r   r   r   _unpickle_mapping_proxyM  s   
z*GuardsStatePickler._unpickle_mapping_proxyr  c                 C  s   t tjj|S r   )r  r  opsr  )rB  r  r   r   r   _unpickle_c_opS  r_  z!GuardsStatePickler._unpickle_c_opr  6Union[tuple[Callable[..., Any], tuple[Any, ...]], Any]c                 C  s  dd l }t|tjrs|jjdkrsd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|jd|jt|tj| |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 nt|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| j0|1 ffS t|tj2j3r$|j45dr$t| j6|jffS |jj7dkr6|jjdkr6t8dfS t|t.j9rAt8dfS t:|r\|j;j<tj=@ r\|j|jksXJ t8dfS t|jt|jkr{tj>j?@dt| d| dd d tS )Nr   meta)is_traceable_wrapper_subclass)r  )r  r  _torch_handler_name_torch_unpicklerzCannot serialize SymInt z (node: r:  z_C::r.  	PyCapsuler   r  r  r  r  r  )Asympyr   r  r  r  r"  torch.utils._python_dispatchrn  r  r  reducer_overriderV  rW  
empty_liker  r  r\  rL  r  rH  r  r  r   r   NotImplementedr   __getstate__rD  rk  ismoduler[  r   r^  r  rc  re  	serializeisclassr  FunctionrI  rp  ro  r  r  r   r  rh  ri  r0  _opsOpOverloadPacket_qualified_op_name
startswithrk  r   r7  rS  
isfunctionr   co_flags	CO_NESTEDrq  rQ   PackageError)r   r  rr  rn  rN  attrsrM  r`  innerfunc
args_tupler   r   r   rt  W  s   
	


z#GuardsStatePickler.reducer_override)r   r   r9  r   r   r   )r?  r   r   r@  )rE  ra  r  rF  r  r"  rG  r  rH  ra  r   ra  )rE  ra  r  rF  r  r"  rG  r  rM  r   rN  rO  r   ra  )rX  r   r   rY  )r\  r  r   r]  )r`  ra  r   rb  )rf  r  r   rg  )r  r   r   r   )r  r   r   rl  )r   r   r   r   r  rD  rL  rW  r[  r^  re  ri  rk  rt  r   r   r   r   r   r8    s&    r8  r?  ra  c              
   C  sR   t  }t|}z
||  W |
 S  ty( } z
tjjt	||d }~ww r   )ioBytesIOr8  dumpAttributeErrorr  rq  rQ   r  r   rJ  )r?  bufpicklerr!  r   r   r   pickle_guards_state  s   r  c                   @  sp   e Zd ZU 							d7d8ddZdZded< d9d d!Zd:d%d&Zd;d)d*Zd<d-d.Z	d=d2d3Z
d>d5d6ZdS )?r   NFr  r  r9  r   r   Optional[CacheEntry]r   %Optional[Callable[[GuardFail], None]]guard_filter_fn8Optional[Callable[[list[GuardFilterEntry]], list[bool]]]r  r6  r"  r  r!  r   strict_errorc
              
     s  |r|j nd }
i _t|}|_jd usJ |_|r |jnd _t _t _t _	|_
tds;td tjjjrM|pEdd  d' fd	d
}t|
pQdtjd}|r||||d\}d(fdd|fdd|D tt|ksJ tdd D sJ fddt|D }|||||\}|_|| jj_tdj jj_d|js|js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 _,|rTdd l-m.} t/j|sJ z0|j_,W n1 t1j2yS } z#tjjj3s5|	r7|jj4d!t5| t67 8d"d# W Y d }~nd }~ww tj9j:d$fd%dd& j;  d _d S ))Nr,  z9guard_nn_modules is turned off using justknobs killswitchc                 S  r  )Nc                 S  s   g | ]}d qS )Tr   )r   gr   r   r   r3    s    zCCheckFunctionManager.__init__.<locals>.<lambda>.<locals>.<listcomp>r   )gsr   r   r   r        z/CheckFunctionManager.__init__.<locals>.<lambda>r   list[GuardFilterEntry]r   
list[bool]c                   sn   g }t  | | D ]+\}}|s|d q	|jdv sd|jv r/td|j|jj |d q	|d q	|S )NF)r  r^  rv  r  z7%s guard on %s is dropped with caching_precompile=True.T)r  rV  
guard_typederived_guard_typesr  r  
orig_guardr  )r   rK  keepr  )_guard_filter_fnr   r   r    s   

z6CheckFunctionManager.__init__.<locals>.guard_filter_fnr   )r  Fr,  r:   r   c              	     s   t  }t| j}|dkrd}|}nz
 | j}d}W n   |}d}Y t| jd u}t||||  | jr:t	| jnd|| dS )NrG  FTr   )r  	has_valuer  r  r  	is_globalr  )
objectstrip_local_scoper  r<  r+   r  r   create_fn_nameguard_typesr   )r,  MISSINGr  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   r3  .  r  z1CheckFunctionManager.__init__.<locals>.<listcomp>c                 s  s    | ]	}t |tkV  qd S r   )r"  r   r   rL  r   r   r   r   1  s    z0CheckFunctionManager.__init__.<locals>.<genexpr>c                   s   g | ]
\}} | r|qS r   r   )r   r  r,  )filter_resultsr   r   r3  2  s
    %sg        zGuard check failed: rN   zGuard eval latency = %s us.2fguard_latency_usr   r  zGuard evaluation failed: r  )	tracebackdynamo_cpp_guards_strc                     s   j  d ddS )Nz
Guard latency = r  z us)r6  r   )latencyr   r   r   r    r  
payload_fn)r   r  r   r  )r,  r:   r   r   )<r   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesr9  r  torch_function_mode_stackrJ   r_  ro  rp  r"  rC   r  r  r  rq  rO   caching_precompiler   r:   sort_keybuild_guardsr  r  rK  r6  compile_check_fnr   r  r  skip_guards_checkr  rN  r  get_guard_fail_reason_helperr7   r1  r  r   r$   r   r5   increment_toplevelr  guards_stater  r   r   serialize_guardsrQ   r  strict_precompilebypass_packager   r  
format_excrT  _loggingtrace_structuredclear)r   r  r9  r   r   r  r  r"  r!  r  r   existing_diff_guard_sourcessorted_guardsr6  reasonsr   r!  r   )r  r  r  r  r  r   r   r     s   










	

zCheckFunctionManager.__init__)r  r\  r  r]  r^  rv  ztuple[LiteralString, ...]%UNSUPPORTED_SERIALIZATION_GUARD_TYPESr  r  r  list[Guard]r   r   ra  c              	     s  |D ]G}|  }|jrt|jnd}|dv r$|jr#||j}t| q|tjv r3t	j
j| dtdd |D d  }rIt	j
j| dq|j t t d fd
d}	| }
|D ]}t|jtr{jsoJ jjD ]}|	| qsqb|	|j qb|jD ]}|	| qdddfdd|
j D }fdd|
j   D | < tj|
fdd|
j D |t	jfdd|D tt |
j!dd}
t"|
jd}t#|S )Nr   )r  r`  z guard cannot be serialized.c                 s  s    | ]
}|t jv r|V  qd S r   )r   r  )r   r  r   r   r   r     s    
z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>r<  r>   r   r   c                   sb   t |  }rt|tsJ | fvr| d S d S t|  }r/t|ts(J | d S d S r   )r+   r   r   r   r,   )r<  r  )builtins_dict_nameused_global_varsused_local_varsr   r   prune_variable  s   
z=CheckFunctionManager.serialize_guards.<locals>.prune_variablerL  Callable[..., None]c                   sd   t | tjr0d
dd t fdd| jD } fdd	| j D }tj| jg|R i |S | S )NrL  r   r   c                 S  s   t | ttjfr|  S | S r   )r   rM   r  r  r  r   r   r   _ref  s   zPCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>._refc                 3  s    | ]} |V  qd S r   r   r  r  r   r   r         zUCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>.<genexpr>c                   s   i | ]	\}}| |qS r   r   r   kvr  r   r   
<dictcomp>  s    zVCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>.<dictcomp>)rL  r   r   r   )r   	functoolspartialr   r   keywordsr   r  )rL  new_argsnew_keywordsr   r  r   normalize_create_fn  s   
zBCheckFunctionManager.serialize_guards.<locals>.normalize_create_fnc                   (   i | ]\}}|v s| j v r||qS r   )rp  r  )r   r  r   r   r    
    z9CheckFunctionManager.serialize_guards.<locals>.<dictcomp>c                   s    i | ]\}}| j v r||qS r   )r_  r  r   r   r   r    s
    
c                   r  r   )ro  r  )r   r  r   r   r    r  c                   s$   h | ]}t j|d d  |jdqS )N)obj_weakrefguarded_class_weakrefr0  )r+  r  r0  r  )r  r   r   rn    s    z8CheckFunctionManager.serialize_guards.<locals>.<setcomp>T)r  r   _guardsr  r  )r9  r  )r<  r>   r   r   )rL  r  r   r  )$r  r  r   r  r<  r  r  r   r  r  rq  rQ   r  next%name_of_builtins_dict_key_in_fglobalsr   dump_guards_stater   r  rq   r  r  r:  r   r   r+  r  r  r  	GuardsSetrR  tree_mapr  r  r5  r  )r   r  r  r9  r,  r  r  r  failedr  output_graph_guards_stater<  global_scope_stater  r   )r  r  r   r  r  r   r    s   
	







z%CheckFunctionManager.serialize_guardsr  r   (tuple[GuardBuilder, GuardManagerWrapper]c                   s   t  }||_d  d fdd}t|| j|| j|j|j|| || jd
}ddd}	t	||	 t
jo3td}
|D ] }|
sQ| rQd|jvrQd|jvrQt
jsPd|jvrQq6|| q6||fS )Nr<  r>   r   r   c                   sB   |   }|tju r|  S  sJ   }|d usJ ||  S r   )guard_sourcer=   CONSTANTr  r  )r<  r  	r_builder	w_builderr   r   r  *  s   
z5CheckFunctionManager.build_guards.<locals>.source_ref)r"  weak_bweakref.ref[GuardBuilder]r   c                 S  s   |  }|r
d |_ d S d S r   )r-  )r  r  r   r   r   cleanup_builderB  s   
z:CheckFunctionManager.build_guards.<locals>.cleanup_builderr,  r   r   r  )r<  r>   r   r   )r  r  r   r   )r   r   r  r  r  r  r   r"  r  r  rO   r@  rC   r	  r  r{  r  )r   r  r  r  r9  r!  r6  r  r  r  guard_on_nn_modulesr,  r   r  r   r    sD   




z!CheckFunctionManager.build_guards
guards_outr   c                   s>   j }|dg7 }td g g g | jd usJ t| j}| jjtt	
  | jd us1J | jj}| jj|dg | jj| jdg d | _	d'd(fdd}t } jD ]}	|	jD ]}
|
|vrs||
|	jd ||
 qaq\ j}d }d }t|dkrt j|dd| d g tjr jrttt j \}} || | jr| jj ng }|D ]u}t!|t"r|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|  j-D ]}	|	jD ]
}
||
|	jd q0q+rLt.j/j0d fd!d"d# t1j2d u rVt13 }|||j4|d$t5t6 }| j7  d% j8d% i}td&ksxJ || j_9|| j_:| j;  | j_<|| j_=|| j_>d | j_?d | j_@|| j_Ad S ))Nz**___kwargs_ignoredzGUARDS:z___check_global_state()z$___check_torch_function_mode_stack()FrX  r   r,  r  log_onlyr   r   r   c                   s   t  }td|  fdd ttjrGd}d}d ur?jr1dd	j
  }jr?dd	j
  }td || |sU  | d S d S )Nr  c                     s@    rj rtj  nd rjrtjdS d dS )N)r  r  r  )r  rB   from_tracebackr  r  r   rX  r,  r   r   r    s   
zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>rG  z
Stack:
z
User stack:
zGuard: %s%s%s)r  r  r  rV  verbose_guards_logisEnabledForloggingDEBUGr  r  formatr  )rX  r,  r  rW  maybe_stackmaybe_user_stack)r   structured_guard_fnsr   r  r   add_code_part  s0   

z<CheckFunctionManager.compile_check_fn.<locals>.add_code_partTrN   zcheck_no_aliasing(r9  r:  rn  c                      g | ]}  |qS r   r  r   r>  r  r   r   r3        z9CheckFunctionManager.compile_check_fn.<locals>.<listcomp>c                   r   r   r  r  r  r   r   r3    r  zcheck_overlapping(overlapping=[c                 s      | ]}|  V  qd S r   r  r  r   r   r   r     r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>z], non_overlapping=[c                 s  r  r   r  r  r   r   r   r     r  z])zUnknown GuardEnvExpr: dynamo_guardsc                     s   dd  D S )Nc                 S  s   g | ]}| qS r   r   )r   fr   r   r   r3    r  zKCheckFunctionManager.compile_check_fn.<locals>.<lambda>.<locals>.<listcomp>r   r   )r  r   r   r    r  z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>r  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr%  r   r   )rX  r   r,  r  r  r   r   r   )Br4  r  r  r  $make_torch_function_mode_stack_guardr6  r   attach_compile_idr   r7   r1  r9  global_state_guardadd_global_state_guard#add_torch_function_mode_stack_guardr   r  r  r,  r   r6  r  r   r7  r  rO   rq  r?  r  r  r  r  aotautograd_guardsr   r9   input_source_ainput_source_br  r    r  r?   overlapping_sourcesnon_overlapping_sourcesr!   r  r5  r  r  r  rP   initial_global_stateGlobalStateGuardrN  rH   r  r   r-  r   r   r\  r   r   r   r   r   r   )r   r  r  r   largs"torch_function_mode_stack_check_fnglobal_stater  seengclr  r6  check_tensors_fncheck_tensors_verbose_fnaliasing_code_partsaliasing_verbose_code_partsr  r,  source_arm  rX  overlapping_guard_managersnon_overlapping_guard_managersr   r  r   )r  r   r  r   r   r  ]  s   


+









	
z%CheckFunctionManager.compile_check_fnobj_strr   c                 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 )Nr6  zCache line invalidated because z got deallocated)	rI  r   r6  r2  r   r   r}   r   
invalidate)r   r$  r   r   r3  deleted_guard_managerr   r   r   r%  1  s   

zCheckFunctionManager.invalidater  r  r  c                 C  sh   z't || jvr#t|| jt |< t|tj| j|d W t |S W t |S  ty3   Y t |S w )zadd a weakref, return the id)r$  )	r;  r  r  r  r   r  r  r%  r  )r   r  r$  r   r   r   r  B  s   
zCheckFunctionManager.id_refOptional[weakref.ref[object]]c                 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   r  Q  s   z$CheckFunctionManager.lookup_weakrefs)NNNNNFF)r  r  r9  r   r   r  r   r  r  r  r  r6  r"  r  r!  r   r  r   )r  r  r  r  r9  r   r   ra  )r  r  r  r   r  r  r9  r   r!  r   r   r  )r  r  r  r  r   r  r   r   )r$  r   r   r   )r  r  r$  r   r   r  )r  r  r   r'  )r   r   r   r   r  r   r  r  r  r%  r  r  r   r   r   r   r     s$   
  R
	
{
@ 
U
r   closure_argstuple[str, str]c           	   	     sf  ddl m} t  z |  d fdd}W n ty%   dd	d}Y nw | }| D ]/}||\}}|| |d
| d |  |d W d    n1 sUw   Y  q+| }|d |  || |d W d    n1 s|w   Y  | }|d| d |  || |d W d    n1 sw   Y  |	 |	 fS )Nr   r@   r  r   r   r$  c                   s
     | S r   )r  r  csepassr   r   r  _  r~  z%build_guard_function.<locals>.replacec                 S  s   g | fS r   r   r*  r   r   r   r  e  r  zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr'  )
torch._inductor.utilsrA   r  r#  RecursionErrorrE  r   rA  splicerJ  )	r   r(  rA   r  
guard_bodyr  r  r,  make_guard_fnr   r+  r   r  X  s<   







r  c                   C     t jjjdS )Nr   r  r  	_internal	log_stateis_artifact_enabledr   r   r   r   is_recompiles_enabled  r   r7  c                   C  r2  )Nr   r3  r   r   r   r   is_recompiles_verbose_enabled  r   r8  initial_stack'list[torch.overrides.TorchFunctionMode]Callable[[], bool]c                   s    dd | D  d fdd}|S )Nc                 S  r  r   )r"  r  r   r   r   r3    r  z8make_torch_function_mode_stack_guard.<locals>.<listcomp>r   r   c                    sD   t  } t| t krdS t | D ]\}}|t|kr dS qdS r  )r   r  r  r"  )	cur_stacktymoder  r   r   check_torch_function_mode_stack  s   zMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stackr   r   r   )r9  r@  r   r?  r   r    s   r  Scoper6  r-  c                   s|   | j d usJ 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 )rN   )r  )r   r  ids_to_sourcer   r   r3    s     zErecompilation_reason_for_no_tensor_aliasing_guard.<locals>.<listcomp>r9  zDuplicate tensors found: )
r   r
  r  r  r  r   r;  r  rV  r  )r6  r-  r   r  	tensor_idduplicate_tensorsr3  r   rD  r   1recompilation_reason_for_no_tensor_aliasing_guard  s   




rH  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>  rI  patternr   r   r   r    s   r  f_locals
compile_idOptional[CompileId]c              
   C  sV  | j dusJ | jdusJ || j d d}|| j g }d}g }| |}|js@|j}t|dkr@d|d v r<d}n|}g }|rHt| |}nU|D ]R}t| j }	||	d	< t	 $ zt
||	|}
W n tyt   t rsY W d   qJ w W d   n1 sw   Y  t|
tr|
s|}
t|
tr||
 t s nqJ| 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.
    Nr%  r#  FrN   zDuplicate tensor foundr   TrC  r.  z; )r   r   re  rQ  resultr   r  rH  r
  rL   r  	Exceptionr8  r   r   r   rV  r  r  )r6  rL  rM  r-  r  no_tensor_aliasing_check_failedr   guard_debug_infor0  r   fail_reason
reason_strr   r   r   r    sT   




r  Fr8   skip_loggingc                 C  s   t | tr| d| j S t| ||}|r|S tt|  | z| jd ur5| t|p,dt|  W |S W |S  t	yF   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   r2  r4  r  r   r   rV  r   r   rP  r  r  )r6  r  rL  rM  rU  rT  r   r   r   get_guard_fail_reason	  s(   

	rV  r   r  framer~   c           	        s  g  | dur t | j| j|j| j|}|r | | j} | dus|j}|r' S t p,t	 }|s2t
jr}t	 rBddd t D }n	td d}d| }d|j d	|j d
|j dt|d }|rut	 rpt| nt| t
jr}t|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  rA  )r   r  r3  r   r   r   r   D  s
    
z:get_and_maybe_log_recompilation_reasons.<locals>.<genexpr>r  rX  z-triggered by the following guard failure(s):
zRecompiling function z in :z    artifactc                   S  s
   dddS )Nrecompile_reasonsr`  )r  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  )metadata_fnr  )rV  r6  r  rL  rM  rV  r  r  r7  r8  rO   error_on_recompiler  rK  r  rA  r  co_filenameco_firstlinenorecompiles_verbose_logr  recompiles_logrQ   RecompileErrorr  r  r  )	r   rW  rU  r3  r  do_recompiles_logfailuresguard_failure_detailsmessager   r]  r   'get_and_maybe_log_recompilation_reasons$  sR   








	ri  r   c                 C  s`   | }t  }| d ur|| j  | j} | d us	|} | d ur.|| j_| j  | j} | d us|S r   )rJ   re  r6  r   r  r   r   )r   first_cache_entryacc_diff_guard_sourcesr   r   r   r  e  s   
r  r   lastr   c                 C  s   t d|j d|j d|j  t dd| j d  t dd| j t |  d|i| j}| jD ]}z	t|| j	| W q3   t d|  Y q3d S )	NzERROR RUNNING GUARDS  rY  zlambda r9  z and
  r$  zMalformed guard:
)
printr  r`  ra  r  r   r   r   r  r   )r6  r  rL  r  rl  r  r,  r   r   r   guard_error_hook  s   
ro  seqSequence[T]Generator[T, None, None]c                 c  s.    t  }| D ]}||vr|V  || qd S r   )r   r   )rp  r  rL  r   r   r   unique  s   
rs  
obj_sourcer>   dupe_source Optional[functools.partial[Any]]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.)rm  )	r/   r.   rQ   UnsafeScriptObjectErrorr  r  r  r  rt  )rt  ru  ser_source_is_localsource_is_localr   r   r   make_dupe_guard  s   	rz  )skipr{  c                 G  sl   ddl m} ttjpttj}| jj	j
}|D ]}t|ts$J t|jr*q|||| 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   )TracingContextrN   )collect_debug_stackr{  N)torch._guardsr|  r  r  r  r  r  r<  guards_contextr  r   r   r:   r1   r  )r{  r   r|  r}  r   r,  r   r   r   install_guard  s   

r  )r`  r   r   ra  )r   ri  )r   ry  )r   r  r   r   )rX  r   r,  r  r   r   r   )r   r  r,  r  r  r8  r   r-  )r  r   r   r  )r  r  r   r  )r  ra  r  r   r  r  r  r  r  r"  r  r   r   r   )r  r  r  r   r   r  )r<  r   r  r   r   r   )r  r   r   r   )r  r   r   r   )r<  r  r  r   r  r   r  r   r  r  r   r   )r,  r:   r   r   )r  r  r   r-  )r?  r5  r   ra  )r   r-  r(  r   r   r)  rA  )r9  r:  r   r;  )r6  r   r-  rB  r   r-  )r>  r   r   r   )r6  r   rL  ry  rM  rN  r   r   r   )r6  r   r  r  rL  ry  rM  r8   rU  r   r   r   )r   r  rW  r~   rU  r   r   r-  )r   r  r   r   )r6  r   r  r  rL  ry  r  r  rl  r   r   r   )rp  rq  r   rr  )rt  r>   ru  r>   r   rv  )r   r:   r{  r  r   r   (  r_  
__future__r   r  r.  r  r+  r  r  r  rk  r  r  r  picklerT  r  r  r  rV  r  
contextlibr   r0  r   r   typingr   r   r   r	   r
   r   r   ImportErrortyping_extensionsr   r   r   r  torch.overridestorch.utils._devicetorch._C._dynamo.eval_framer   torch._C._dynamo.guardsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   torch._dynamo.sourcer+   r,   r-   r.   r/   r0   r1   r2   r3   r4   torch._dynamo.utilsr5   r6   r~  r7   r8   r9   r:   r;   r<   r=   r>   r?   r-  rA   torch._loggingrB   torch._utils_internalrC   %torch.fx.experimental.symbolic_shapesrD   rE   rF   rG   rH   torch.utilsrI   rR  torch.utils._ordered_setrJ   torch.utils._tracebackrK   rL   torch.utils.weakrM   rG  rO   rP   rQ   
eval_framerR   r<  rS   rT   rU   rV   rW   rX   rY   rZ   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   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   numpyrd  ModuleNotFoundErrorcollections.abcr   r   r   rr  r   torch._Cr   r  r   r   r   	getLoggerr   r  r  getArtifactLoggerr  rc  rb  r  r  r   r   rh  cacherv  rx  r  r  r  rq  r  r  r  r  r  r  r  r  r  r  r,  r  r  r  r  r  r  r  r  r  r1  r2  r  r5  r7  Picklerr8  r  r   r  r7  r8  r  r
  r   r  rB  rH  r  r  rV  ri  r  ro  rs  rz  r  r   r   r   r   <module>   s4    p0,$,P	
   
F	















-               V
U	 2     ,JA
$