
    i                   z
   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 	 ddlm Z  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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE ddlFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP ddlQmRZRmSZS ddlTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z] ddl^m_Z_ ddl`maZa ddlbmcZc ddldmeZe ddlfmgZgmhZhmiZimjZjmkZk ddllmmZn ddlompZp ddlqmrZrmsZs ddltmuZu ddlvmwZwmxZxmyZy ddlzm{Z{ ddl|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ erddlmZ dZd ed!<   	 ddlZerdd"lmZmZmZ dd#lmZ dd$lmZ dd%lmZmZ  e$d&      Z ej                  eث      Ze&j                  j                  ed'      Ze&j                  j                  ed(      Ze&j                  j                  ed)      Ze&j                  j                  ed*      Zd+Zdnd,Z G d- d.e_      Z G d/ d0      Zdod1Zej                  dpd2       Zdad3ed4<   dqd5Zdrd6Ze&j                  j                  j                  Zdsd7Z	 dt	 	 	 	 	 	 	 dud8Zdvd9Zdwd:Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 dxd;Zdyd<Zdzd=Zd{d>Zd|d?Z ej                  d@A       G dB dC             Z	 	 	 	 	 	 	 	 	 	 	 	 d}dEZd~dFZej                   G dG dH             Z G dI dDej                        Zej                  ddJ       Z G dK dLeY      Z G dM dN      Zd~dOZ  G dP dQe      Zej                   G dR dS             Zej                   G dT dU             Z G dV dW      Zej                  ddX       Z G dY dZej                        Zdd[Z G d\ d]      Z	dd^Z
dd_Zdd`Z	 	 	 	 ddaZ e#dbeeef         Z	 	 	 	 	 	 ddcZdddZ	 	 	 	 	 	 	 	 	 	 ddeZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddfZ	 d	 	 	 	 	 	 	 	 	 ddgZ	 	 	 	 ddhZ	 	 	 	 	 	 	 	 	 	 	 	 ddiZ e{e       ddjZ	 	 	 	 	 	 ddkZddlddmZy# e!$ r
 ddl"m Z  Y w xY w# e$ r dZY 4w xY w)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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)is_opaque_value_type)
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CollectionsSourceConstantSourceConstDictKeySourceCurrentStreamSourceDataclassFieldsSourceDefaultsSourceDictGetItemSourceDictSubclassGetItemSourceDynamicScalarSource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_current_stream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_signature)Callablez(Optional[Callable[[Any, Any, Any], Any]]guard_manager_testing_hook_fn)	GeneratorKeysViewSequence)Symbol)DispatchKeySet)OutputGraphCommonOutputGraphGuardsStateTguards
recompilesrecompiles_verboseverbose_guards)__defaults____kwdefaults____code____closure____annotations____func____mro__c                \    t        |       }t        |      |j                  |      z
  dz
  }|S NrO   )&code_framelocals_names_reversed_cachedlenindex)codevar_nameframelocals_names_reversedframelocals_idxs       N/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/guards.pyget_framelocals_idxr      s=     "H!M&'*D*J*J8*TTWXX      c                  *     e Zd ZddZdd fdZ xZS )IndentedBufferWithPrefixc                :    d| j                   | j                  z  z  S )Nz| )_indenttabwidthselfs    r   prefixzIndentedBufferWithPrefix.prefix  s    t||dmm344r   c                N    |rt         |   |       y t         |   d|z          y )Nz+- )super	writeline)r   lineskip_prefix	__class__s      r   r   z"IndentedBufferWithPrefix.writeline  s$    Gd#Gedl+r   returnstrF)r   r   r   boolr   None)__name__
__module____qualname__r   r   __classcell__r   s   @r   r   r     s    5, ,r   r   c                      e Zd ZdZdddZedd       ZddZddZddZ	ddZ
dd	Z	 	 	 	 dd
ZddZ	 d	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZddZddZddZy) GuardManagerWrappera  
    A helper class that contains the root guard manager. An instance of this
    class is stored in the Dynamo cache entry, so that the cache entry can
    access the RootGuardManager stored in the "root" attribute and directly call
    the check_nopybind from C++.
    Nc                   |t               | _        n|| _        d | _        d | _        d | _        g | _        d | _        d | _        d | _        d | _	        d | _
        i | _        g | _        t               | _        t               | _        y N)r&   rootdiff_guard_rootclosure_varsargs
code_partsverbose_code_partsglobal_scopeguard_fail_fncache_entryextra_stateid_matched_objsno_tensor_aliasing_sourcessetprinted_relational_guardsrK   diff_guard_sources)r   r   s     r   __init__zGuardManagerWrapper.__init__  s    <(*DIDI;?6:)-	%'7;6:DH1515AC57'?Bu&3=<r   c              #  z   K   t               | _        	 d  t               | _        y # t               | _        w xY wwr   )r   r   r   s    r   #_preserve_printed_relational_guardsz7GuardManagerWrapper._preserve_printed_relational_guards-  s,     ),&	3-0UD*SUD*s   ;' ;8;c                p     d fdd fddfd  j                           j                  S )Nc                L   | j                         j                  v xs | j                         dkD  }t        | j	                         j                               D ]  \  }\  }}| |       |      z  z  } |r)j                  j                  | j                                |S Nr   )
get_sourcer   
fail_countsortedget_key_value_managersitemsadd)nodeis_diff_guard_node_idxkey_mgrval_mgrr   visits        r   visit_dict_managerzJGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_dict_manager@  s    !T%<%<<U@QTU@U  -3++-335- F((w #eGnuW~&EE"F
 "''++DOO,=>%%r   c                $   t        | t              rJ | j                         j                  v xs | j	                         dkD  }| j                         D ]  }| |      z  } |r)j                  j                  | j                                |S r   )
isinstancer   r   r   r   get_child_managersr   )r   r   	child_mgrr   r   s      r   visit_managerzEGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_managerN  s    !$(8999 !T%<%<<U@QTU@U  "446 7	"eI&66"7 "''++DOO,=>%%r   c                J    | yt        | t              r |       S  |       S )NFr   r   r   r   r   s    r   r   z=GuardManagerWrapper.collect_diff_guard_sources.<locals>.visit\  s,    |$ 01)$// &&r   )r   r   r   r   )r   r   r   r   )r   r   )r   r   r   r   s   `@@@r   collect_diff_guard_sourcesz.GuardManagerWrapper.collect_diff_guard_sources6  s,    	&	&	' 	dii&&&r   c                z    t         j                  rt        d      r| j                          | j	                          y )Nz3pytorch/compiler:use_recursive_dict_tags_for_guards)rP   "use_recursive_dict_tags_for_guardsrD   find_tag_safe_rootsprepare_diff_guard_managerr   s    r   finalizezGuardManagerWrapper.finalizeg  s/    44A:
 $$&'')r   c                D    | j                          | j                          y r   )r  populate_diff_guard_managerr   s    r   r  z.GuardManagerWrapper.prepare_diff_guard_managern  s    '')((*r   c                    	 	 	 	 	 	 dddfddfddfd | j                         }|D ]E  }t        |j                         t        j                  j
                        s6|j                          G y)	uB  
        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.
        c                    | j                         }| j                         }t        fdt        ||      D              S )Nc              3  `   K   | ]%  \  }}t        |      xr |j                          ' y wr   )r   is_tag_safe).0accessormgraccepted_accessorss      r   	<genexpr>zTGuardManagerWrapper.find_tag_safe_roots.<locals>.check_tag_safety.<locals>.<genexpr>  s4      !Hc 8%78NS__=NNs   +.)get_accessorsr   allzip)r   r  	accessors
child_mgrss    `  r   check_tag_safetyzAGuardManagerWrapper.find_tag_safe_roots.<locals>.check_tag_safety  sB     **,I002J %(J%?  r   c                   t        | j                         t              sJ g }d}t        | j	                         j                               D ],  \  }\  }}| |       ||j                   |             . | j	                         j                         D ]0  \  }}|r||j                         z  }|s||j                         z  }2 |r| j                          |S NT)

issubclassget_type_of_guarded_valuedictr   r   r   extendvaluesr  mark_tag_safe)r   tag_safe_rootsis_subtree_tag_safer   r   r   r   s         r   r   zCGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_dict_manager  s     d<<>EEEN"& -3++-335- :((w &'N&"))%.9: %)$?$?$A$H$H$J A '7+>+>+@@''7+>+>+@@'A #""$!!r   c                   t        | t              rJ g }| j                         D ]  }|j                   |              | j	                         rlt        | j                         t        j                        r2| j                         r2| j                         s"| j                          |S | j                          |S t        | j                         t              rP| j                         }| j                         }t        d t        ||      D              }|r| j                          |S t        | j                         t        j                   j"                        r* | t$        t&        f      }|r| j                          | gS |S | j                         t(        j*                  t(        j,                  t.        t0        fv rt2        j4                  ru | t6        t8        t:        t<        t>        f      }| j                         D ],  }t        |t>              s||jA                         tB        v z  }. |r| j                          |S t        | j                         t(        jD                        rE | t>        f      }|t        d | j                         D              z  }|r| j                          |S t        | j                         tF              rU| jI                         jK                  tB              r2t2        j4                  r" | tL        f      }|r| j                          |S t        | j                         tN              r% | tP        tR        f      }|r| j                          |S )Nc              3  f   K   | ])  \  }}t        |t              xr |j                          + y wr   )r   r   r  )r  r  r  s      r   r  zQGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager.<locals>.<genexpr>  s3      *%# x)ABXsGXX*   /1c              3  f   K   | ])  }t        |t              xr |j                         d k(   + yw)cell_contentsN)r   r   get_attr_name)r  r  s     r   r  zQGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager.<locals>.<genexpr>  s?      + ! x)=> D ..0OCD+r&  )*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classmethodrP   )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   s	          r   r   z>GuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager  sJ   !$(8999  N!446 8	%%eI&678 ..0 d<<>M,,.t7U7U7W**,| "!y &&(x "!w D::<dC ..0	!446
&) *),Y
)C* '# '&&(f "!e D::<ehhooN&668IJ'# '&&(  T "!M ..0&&$$ 	 DD '7),13,	'# !% 2 2 4 H!(,@A+$2248VV+ '&&(J "!I D::<ennM&6t>R=T&U##s + %)$6$6$8+ ( #
 '&&(6 "!3 499;UCOO%../MNDD '746'# '&&( "! D::<dC&602FG'# '&&(!!r   c                L    | g S t        | t              r |       S  |       S r   r  r  s    r   r   z6GuardManagerWrapper.find_tag_safe_roots.<locals>.visit@  s.    |	$ 01)$// &&r   N)r   r   r  ztuple[type[GuardAccessor], ...]r   r   )r   r   r   list[GuardManager])r   r   r   r=  )r   r  r  r+  r/  r0  mark_tag_safe_root)r   r"  r   r  r   r   r   s      @@@@r   r  z'GuardManagerWrapper.find_tag_safe_rootsr  sx    t		4S			"8l	"\	' tyy)" 	*D$88:EHHOOL'')	*r   c                    | j                  | j                        | _        | j                  r| j                  j	                          y y r   )clone_with_chosen_sourcesr   r   r   update_diff_guard_root_managerr   s    r   r
  z/GuardManagerWrapper.populate_diff_guard_managerL  s=    #==d>U>UV ;;= r   c                F    dfd}| j                   j                  |      S )Nc                (    | j                         v S r   )r   )node_mgrchosen_sourcess    r   	filter_fnz@GuardManagerWrapper.clone_with_chosen_sources.<locals>.filter_fn\  s    &&(N::r   )rD  r   r   r   )r   clone_manager)r   rE  rF  s    ` r   r@  z-GuardManagerWrapper.clone_with_chosen_sourcesY  s    	; yy&&y11r   c                    |j                   j                  }|j                         }|D cg c]
  }|dz   |z    }}|S c c}w )N: )r   r   r   )r   guard
guard_namepartsparts        r   get_guard_linesz#GuardManagerWrapper.get_guard_linesa  sF    __--
((*6;<dd"T)<< =s   >c                    |j                         }|j                  j                  }|dz   |z   }|r|d|z   z  }|d|j                          z  }|d|j	                          d|j                          dz  }|S )Nz	: source=, z, type=z, tag_safe=())r   r   r   r  r  is_tag_safe_root)r   guard_manageraccessor_strsourcetss         r   get_manager_linez$GuardManagerWrapper.get_manager_lineg  s     ))+##,,Of$$$A	w}>>@ABB	|M5578=;Y;Y;[:\\]^^r   c                   t        |j                         j                               D ]  \  }\  }}|j                  d|        |j	                         5  |r5|j                  d| j                  |              | j                  ||       |r5|j                  d| j                  |              | j                  ||       d d d         y # 1 sw Y   xY w)NzKeyValueManager pair at index=zKeyManager: zValueManager: )r   r   r   r   indentrX  construct_manager_string)r   r  bodyidxr   r   s         r   construct_dict_manager_stringz1GuardManagerWrapper.construct_dict_manager_strings  s     (.c.H.H.J.P.P.R'S 		A#C#'7NN;C5AB ANN\$2G2G2P1Q#RS11'4@NN^D4I4I'4R3S#TU11'4@A A		AA As   A/CC	c           
        |j                         5  |j                         D ]  }t        |t              rq|| j                  vr<| j                  j                  |       |j                  | j                  |             ]|j                  |j                  j                  g       |j                  | j                  |              t        |t              r| j                  ||       t        |j                         |j                               D ]I  \  }}|j                  | j!                  |d|j#                                       | j%                  ||       K 	 d d d        y # 1 sw Y   y xY w)Nzaccessed_by=)rZ  get_leaf_guardsr   r%   r   r   
writelinesrN  r   r   r   r^  r  r  r   r   rX  reprr[  )r   r  r\  rJ  r  r   s         r   r[  z,GuardManagerWrapper.construct_manager_string  sC    [[] 	?,,. Ae_5D$B$BB66::5A(<(<U(CD % 8 8 OOD$8$8$?@A  #/0223= (+!!#S%;%;%=( ?#) )))|HMMOCT5UV --i>?+	? 	? 	?s   EE((E1c                   | j                         5  t               }d|_        |j                  dd       |j                  dd       |j                  d       | j	                  | j
                  |       t        | j
                  d      r?| j
                  j                         D ]"  }|j                  | j                  |             $ |j                         cd d d        S # 1 sw Y   y xY w)NrO    T)r   zTREE_GUARD_MANAGER:r&   get_epilogue_lambda_guards)r   r   r   r   r[  r   hasattrre  ra  rN  getvalue)r   r\  rJ  s      r   __str__zGuardManagerWrapper.__str__  s    557 
	#+-DDMNN24N0NN0dNCNN-.))$))T:tyy">?!YYAAC AEOOD$8$8$?@A==?
	# 
	# 
	#s   C	C$$C-c                8    | j                   j                  |      S r   )r   checkr   xs     r   rj  zGuardManagerWrapper.check  s    yyq!!r   c                8    | j                   j                  |      S r   )r   check_verboserk  s     r   rn  z!GuardManagerWrapper.check_verbose  s    yy&&q))r   c                ^     t               ddd fd  j                         y )Nc                    g }| j                         D ]5  }|j                  d      d   j                         }|j                  |       7 |S )N#r   )r   splitrstripappend)
leaf_guardr   verbose_code_part	code_parts       r   get_code_partszMGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.get_code_parts  sT    J%/%B%B%D -!-33C8;BBD	!!),- r   c                <   | j                         D ]k  }t        |t              r8|vsj                  j	                   |             j                  |       Kj                  j	                   |             m | j                         D ]
  } |        y r   )r`  r   r%   r   r  r   r   )r  rJ  r   rx  relational_guards_seenr   r   s      r   r   zDGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.visit  s    ,,. Be_5$::..~e/DE.2259OO**>%+@AB !335 !	i !r   )ru  r#   r   	list[str])r  r   r   r   )r   r   )r   rx  rz  r   s   `@@@r   !populate_code_parts_for_debuggingz5GuardManagerWrapper.populate_code_parts_for_debugging  s(    !$		! 	! 	diir   r   )r   zOptional[RootGuardManager]r   r   )r   zGenerator[None, None, None])r   OrderedSet[str]r   r   )rE  r}  r   r&   )rJ  r#   r   r{  )rS  r   rT  Optional[str]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@  rN  rX  r^  r[  rh  rj  rn  r|   r   r   r   r     s    @, 3 3/'b*+X*t>2-2	2 JN
)
9F
	
A#A+CA	A??'??	?@#"*r   r   c                    t         j                  j                         5  t        | t        j
                  t        j                  f      rt        j                  |       n| cd d d        S # 1 sw Y   y xY wr   )r+  	overrides_enable_torch_functionr   npgenericndarray	as_tensor)as    r   
from_numpyr    sR     
	/	/	1 T%/BJJ

3K%Luq!RST T Ts   AA**A3c                     dd l } dd l} | j                  j                  | j                  j                  g}ddlm} |j                  |       |D ch c]  }t        j                  |       c}S c c}w )Nr   )POLYFILLED_MODULES)
torch._dynamo.external_utilstorch._dynamo.polyfills_dynamoexternal_utils	polyfillstorch._dynamo.polyfills.loaderr  r  inspectgetfile)r+  modsr  ms       r   uninteresting_filesr    sU    '"MM((%--*A*ABDA 	KK"#(,-1GOOA---s   A/Optional[dict[str, object]]_CLOSURE_VARSc                    t         i dt        dt        dt        j                  j
                  dt        dt        dd dt        d	t        d
t        dt        dd dt        dt        dt        j                  dt         d nt         j                  dt#        d      dt$        j&                  t(        j*                  j,                  t(        j.                  t0        t(        j2                  t(        t4        da t         S )N___check_type_id___check_obj_id___odict_getitem___key_to_id___dict_version___dict_containsc                .    t         j                  ||       S r   )r  __contains__)r  bs     r   <lambda>z#_get_closure_vars.<locals>.<lambda>  s    T->->q!-D r   ___tuple_iterator_len___normalize_range_iter___tuple_iterator_getitem___dataclass_fields___namedtuple_fieldsc                    | j                   S r   _fieldsrl  s    r   r  z#_get_closure_vars.<locals>.<lambda>  s
    aii r   #___get_torch_function_mode_stack_at___get_current_stream__math_isnan__numpy_isnaninf__load_module)utils_devicedevice___from_numpy___as_tensorr+  r  )r  r   r   collectionsOrderedDict__getitem__r   r   r   r   r   r   r   r   mathisnanr  float	importlibimport_moduler+  utils_devicer  r  _as_tensor_fullprecr  r  r   r   _get_closure_varsr    s8   

|
  7 7 C C
 I	

 |
  D
 $%7
 &';
 ()?
 "#3
 #$7
 23S
 $%7
 DJJ
 RZTRXX
  5<!
" Y44#
$ "KK//ll'!55/
2 r   c                L    t        j                  |       j                  dd      S )N
rd  )astunparsereplace)r   s    r   _ast_unparser    s    ;;t$$T2..r   c                ~   d}||j                   r_t        |j                         D ]F  }|j                  t               vsdt	        |d       }t        |      dkD  rdt	        |       } nJ nH|j                  r<|j                  j                         }t        |      dkD  rdt	        |d          }nd}| d	| S )
Nrd  z  # T)r   i   r   z  # <unknown>z<60)
user_stackreversedfilenamer  rL   r   stacksummary)rw  rJ  extrafsr  s        r   get_verbose_code_partr    s    Eu//0 
;;&9&;;"<#>"?@E5zD( #'|B'7&8 9
 [[kk))+G7|a|GBK89:'_UG$$r   c                    t        | t              s| g} | D cg c]  }t        ||       }}|r|D cg c]
  }| d| d }}|S c c}w c c}w )N (HINT: rQ  )r   listr  )r   rJ  recompile_hintrw  r   rM  s         r   get_verbose_code_partsr  ,  s|    
 j$' \
 BL4=i/  ;M
37tfH^,A.
 
 
s
   AAc                    | y t        |       s| S t        | t        j                        sJ | j                  j                         S r   )rH   r   r+  SymIntr   maybe_as_int)dims    r   convert_int_to_concrete_valuesr  ?  s>    
{s
#u||,,,xx$$&&r   c                >    | D cg c]  }t        |       c}S c c}w r   )r  )size_or_strider  s     r   convert_to_concrete_valuesr  I  s    ;IJC*3/JJJs   c                ,   |t         j                  j                         z  t         j                  j                         z
  }| j                  }| j
                  j                  }| j                  }	d| d|j                   d| d| d| d|	 d| d| d}
|
S )Nzcheck_tensor(rP  z	, device=z, requires_grad=z, size=z	, stride=rQ  )	r+  _C_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper  r   requires_gradr   )valuenamesizesstridespytypedispatch_keysdispatch_keyr  device_indexr  	guard_strs              r   get_tensor_guard_code_partr  M  s     	@@BB0023L KKE<<%%L''M
vR 3 34B|nBug N/geWIV]U^^_	a  r   c                H    t        t        |             j                  |      S r   )r  r   r   )dctkeys     r   get_key_indexr  b  s     
 !#&'--c22r   c                    d|  d| dS )Nlist(dict.keys())[]r  )rU  r   s     r   get_key_index_sourcer  j  s    VHCwa00r   c                D    t        dt        |        d|  ddz   dz         )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;  )objs    r   raise_local_type_errorr  n  s8    

S	{,se+<=
L	M
L	M r   c                    t        | t        j                  j                        xr# t        j
                  xs t        |       t        u S r   )r   r+  r/  r0  rP   inline_inbuilt_nn_modulesr   r   )r  s    r   $should_optimize_getattr_on_nn_moduler  v  s=     eUXX__- (( 	De$(CCr   T)frozenc                  8    e Zd ZU dZded<   dZded<   dZded<   y)NNModuleAttrAccessorInfoFr   present_in_generic_dictNr  l1_keyl2_key)r   r   r   r
  r   r  r  r  r   r   r	  r	    s'     %*T) !FM  !FM r   r	  GuardManagerTypec                l   | j                   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              sM|j                  ||| j                  t        j                        j                  | j                  | d|g       |j!                  ||	||      S )N[r  r   rU  example_valueguard_manager_enum == )baser  r   r   r]   r  r  r  r  r   intr   get_key_managerr  GUARD_MANAGERadd_equals_match_guardget_value_manager)
rU  base_guard_managerbase_example_valuer  r  base_source_namer   
key_sourcekey_example_valuevalue_sources
             r   getitem_on_dict_managerr     s7    {{''&,, 23"",d3330&,,?%&6>J ./ABCEJ#c3Z0*+1->,AC*+1ZL:fll$67 	** ,,/==	 	+ 	

 !
 LLj\.?-BCD
 //#-	 0  r   c                    | j                   }t        |t              ry| j                         ry|j	                         xr t        |t
               S NFT)originating_sourcer   rr   is_specialized_nn_moduleis_dict_keyrl   )rJ  rU  s     r   match_on_id_for_tensorr&    sJ    %%F &+,%%'F
6:(F$FFr   c                  "    e Zd ZU ded<   ded<   y)GuardCodeListr{  	code_listr:   rJ  Nr   r   r   r   r  r   r   r(  r(    s    Lr   r(  c                      e Zd ZdZdZy)r  rO      N)r   r   r   r  DICT_GUARD_MANAGERr  r   r   r  r    s    Mr   c                <    t        t        t        |                   S r   )r  r  r   )r   s    r   r   r     s    /5677r   c                     e Zd Z	 	 	 d;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d<dZ	 	 	 	 	 	 d=dZd>dZed?d       Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d@dZdAdZ		 	 	 	 	 	 dBdZ
dCd	ZdDd
ZdEdZdFdZ	 	 dG	 	 	 	 	 	 	 	 	 dHdZ	 dI	 	 	 	 	 dJdZdKdZ	 	 	 	 	 	 	 	 dLdZdMdZ	 dI	 	 	 	 	 dNdZdMdZdMdZdOdZdPdZdMdZdMdZdIdQdZ	 dI	 	 	 	 	 dQdZdIdRdZdMdZdMdZdMdZ dMdZ!dMd Z"dMd!Z#dIdQd"Z$dMd#Z%dMd$Z&dMd%Z'dMd&Z(dMd'Z)dMd(Z*dMd)Z+dMd*Z,dMd+Z-dMd,Z.dSd-Z/dMd.Z0dMd/Z1dMd0Z2dMd1Z3dMd2Z4dMd3Z5dMd4Z6dMd5Z7dMd6Z8dMd7Z9dMd8Z:dIdRd9Z;	 	 dT	 	 	 	 	 	 	 	 	 dUd:Z<y)VGuardBuilderNc                   || _         || _        || _        || _        ||d| _        t        j                         | _        |
xs || _        |xs i | _	        t        j                  j                         | j                  d<   t        j                  j                  j                   j#                         D ]X  \  }}|j%                  dd      j%                  dd      j%                  dd      }|| j                  d   |<   || j                  |<   Z || _        g | _        g | _        g | _        g | _        g | _        || _        i | _        |	| _        t9               | _        | j2                  j<                  J | j2                  j<                  j>                  D ]\  }| jA                  |      }| j6                  r|| j                  |jB                  <   | j:                  jE                  tG        |             ^ i | _$        i | _%        t9               | _&        g | _'        tP        jR                  xr tU        d      | _)        tW               | _,        y )	NLG__builtins__>_<._dot_!pytorch/compiler:guard_nn_modules)-f_codeid_ref
source_reflookup_weakrefsscopeweakrefWeakKeyDictionarysrc_get_value_cacheruntime_global_scopesource_get_cachebuiltins__dict__copyr+  packagepackage_importer_package_imported_modulesr   r  rS  argnamesr   shape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managerscheck_fn_managerguard_tree_valuessave_guardsr   key_order_guarded_dict_idsoutput_graphguard_on_key_ordergetr  r   idr   _cached_guard_managers_cached_duplicate_input_guardsobject_aliasing_guard_codesrP   guard_nn_modulesrD   rK   already_added_code_parts)r   r<  r=  r>  r?  local_scoper   rS  rP  rR  rD  rE  r  package_modulerU  dict_objs                   r   r   zGuardBuilder.__init__  s     $.9D<3X
%%' 	  %9$HL! 0 6B%-%6%6%;%;%=

>" ]]++EEKKM	. 
<<S)11#s;CCCQD/=DJJ~&t,-DJJt	. +#%)+	
 46 46%EG.6F13& +.%'$$11===++88KK 	>Fxx'H5=%%fkk2++//8=		> BD @B#DGE+BD( & 7 7 !
O/=
 :D%r   c                T   | j                  |      }t        |t              rt        d|j                         |j
                  j                  }t        |      D ]K  }||   }t        |j
                  |      }| j                  ||      }|j                  || d|d||       M y )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )r   r  r  r  rU  r  r  )
get_guard_managerr   r   NotImplementedErrorr  r#  r   ra   get_guard_manager_typedict_getitem_manager)	r   r  rJ  dict_mgrdict_sourcer  r  r  r  s	            r   #guard_on_dict_keys_and_ignore_orderz0GuardBuilder.guard_on_dict_keys_and_ignore_order-  s     ))%0h 01%FFKjj\S  ..33 %]3 	C!#&E,U-E-ESQL!%!<!<m" ))%awa0##5	 * 	r   c                   | j                  |      }t        |t              st        d|j                         t        |t              sJ t        t        |            D ]  \  }}t        |j                  |      }|j                  |||t        j                        }t        |      r6| j                  ||      }|j                  |t        d| d| d|             |j                  |t        | d||              y )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for r  z__check_obj_id(rP  rQ  r  )rb  r   r   rc  r  	enumerater   r  r  r  r  r   r=  add_id_match_guardr  r  )	r   r  rJ  rf  r]  r  r  key_managerid_vals	            r   guard_on_dict_keys_and_orderz)GuardBuilder.guard_on_dict_keys_and_orderK  s    ))%0($45%;;@::,H  ($4555 ""3E":; 	HC-ejj#>J"22!!#3#A#A	 3 K ~S*5..*)*RxqA5 22/:,d3'0JER'	r   c                    t         j                  rAt        j                  dk\  r.t        j                  dk  rt	        j
                  dt               y | S )N)      )rp  rq  rO   zMGuards may run slower on Python 3.13.0. Consider upgrading to Python 3.13.1+.)rP   issue_3_13_0_warningsysversion_infowarningswarnRuntimeWarning)r  s    r   '_get_generic_dict_manager_example_valuez4GuardBuilder._get_generic_dict_manager_example_valueq  sF     ''  G+  :-MM_ r   c                    	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd}|j                   }	|j                  }
t               }t        j                  |j
                        D ]+  }|j                  |j                  j                                - t        ddd      }|	|
v rt        d|	d      }nNd|
v r|	|
d   v rt        dd|	      }n5d|
v r|	|
d   v rt        dd|	      }n|	|vrd|
v r|	|
d   v rt        dd|	      }|j                  s|j                  |j                   |||      S |j                  sJ |j                  }|j                  }| d	}dx}}dx}}dx}}|rPt        |j                  |      }|j                  }|
|   }| j!                  ||      }|}|}| j!                  ||      }n|}|}| j!                  ||      }|j#                  || j%                  |
      t&        j(                  
      } |||||
||      }|r||J  |||||||      S |S )a(  
        This tries to avoid calling the expensive nn module custom getattr method by
        checking if the attribute is accessible via __dict__. For attributes that
        are not accessible via __dict__ (like descriptors), we fallback to
        PyObject_GetAttr.

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

        The most common and expensive case for nn module guards is of type
        mod.submod1.submod2.submod3.training. We avoid the python getattr of nn
        modules by going through the __dict__.
        c                   t        | t              rct        ||      }d| d|d}| j                  |||t        j
                        j                  || d|g       | j                  ||||      S | j                  ||||      S )Nr  r  r  r  r  ra  )	r   r   r  r  r  r  r  r  re  )r  r  source_namer  r  r  r   r  s           r   getitem_on_dict_mgrz>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgr  s     #/0 &&8#>  /{m3uiqI
##%"%'7'E'E	 $ 
 )(*T#/I.JK ,,&"/'9	 -   //&"/'9	 0  r   FNT_parameters_buffers_modulesattrrU  r  r  	.__dict__rU  r  r  )r  r  r{  r  r  r  )r  r   r  r   r{  r   r  r   r  r   r  r  r   r   )memberrG  r   r  getmror   updatekeysr	  r
  getattr_managerr  r  rU   r  r  rd  get_generic_dict_managerrx  r  r  )r   rU  r  r  r  r  r{  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_mgrs                             r   getattr_on_nn_modulez!GuardBuilder.getattr_on_nn_module  s   6#	#	#	 #	 !$	#	
 #	 !1#	 #	J MM	%...1e! 2 < <= 	@A%,,QZZ__->?	@ 1dC 4T9dKMh&98O+O4T=)TM8#	Xj5I(I4T:yQM66h&Xj11 5T:yQM44 &55]]"+#5	 6   !''''"))F"))F "2 2)<O.22N^"&&Hx<@@!$9&v{{F;	!*#F+ )-(C(CIx(X%!,((,(C(CM)% "-((,(C(CM)% (:'R'R&"JJ8T#3#A#A (S ($ ),*#+&#8F %16K6WWW* .'/"*'<  Mr   c                v    |j                   }|dk(  ryt        | j                  |            }|| j                  v S )Nrd  F)r  rW  rV  rS  )r   rU  r{  obj_ids       r   requires_key_order_guardingz(GuardBuilder.requires_key_order_guarding  s:    kk"DHHV$%8888r   c                    t         j                  }| j                  |      rlt        |t              rt         j
                  }|S t        |t        t        f      rt         j                  }|S t        |t              sJ t         j
                  }|S r   )	r  r  r  r   r   r-  r   	frozensetr  )r   rU  r  r  s       r   rd  z#GuardBuilder.get_guard_manager_type%  s     .;;++F3-3%5%H%H" "! MC+;< &6%C%C" "! "-666%5%H%H"!!r   c                (    |t         j                  k(  S r   )r  r-  )r   mgr_enums     r   manager_guards_on_keysz#GuardBuilder.manager_guards_on_keys;  s    +>>>>r   c                    | j                   j                  j                  | j                  d| j                  d   t
        j                        S )Nr4  )	f_globalsrU  r  r  )rS  r   globals_dict_managerrD  r@  r  r  r   s    r   get_global_guard_managerz%GuardBuilder.get_global_guard_manager>  sF    !!&&;;//**S//==	 < 
 	
r   c           	        | j                   j                  }d }j                  }|dk7  r|| j                  v r| j                  |   S |dk7  r)| j	                        }|| j
                  t        |      <   | j                  |      }d }d }d }t        j                  }	t        t              rhj                  j                  }| j	                  j                        }| j                  j                        }| j                  j                  |      }	t        t              rCt!        | j"                  j$                        }
|j'                  j$                  |
f|||      }	n]t        t(              r/| j+                         j-                  j.                  |||      }	nt        t0              r/| j+                         j3                  j.                  |||      }nt        t4              r|S t        t6              r|S t        t8              r|sJ |j;                  |||      }nt        t<              r|sJ |j?                  |||      }ngt        t@              r|sJ |jC                  |||      }n=t        tD        tF        tH        tJ        tL        f      r|sJ |}nt        tN              r|jQ                  d |||      }nt        tR              r|jQ                  d |||      }nt        tT              r|jQ                  fd|||      }nt        tV              r|jQ                  fd	|||      }nlt        tX              r|sJ |j[                  |||      }nBt        t\              r%|sJ |j_                  j`                  |||
      }nt        tb        td        f      r_|sJ t        tb              sJ tg        |      r|sJ | ji                  ||||||      }n|jk                  j`                  |||
      }nt        tl        tn        f      r|sJ t        |tp        tr        jt                  f      sJ t        tl        tn        f      sJ t        |tv              r$| jy                  |	      sJ t{        ||||      }nt        j|                  t~              rt        d      |j-                  j|                  |||      }nt        t              rH t        |dj                  j                  j                          d      j                  |||      }nrt        t              r%|sJ |j                  j                  |||      }n=t        t              r%|sJ |j                  j|                  |||      }nt        t              r|sJ t        |tp        tr        jt                  f      rJ d       t        |t              r-j                  s!|j                  j|                  |||      }nt        |t              r-j                  s!|j                  j|                  |||      }nSj|                  }j                  rj                         }|j                  ||||      }nt        t              r|sJ |sJ t        |      sJ j                  sK|j                  ||j                  t        j                        j                  j                  |||      }n|j                  }|J |dz   }|j                  ||t        j                        }t        |tv              rJ |j-                  j                  |||      }n.t        t              r|sJ |jQ                  t        |||      }nt        t              r|sJ |jQ                  d |||      }nt        t              r|sJ |jQ                  d |||      }nt        t              r|sJ |jQ                  d |||      }n{t        t              r|sJ |jQ                  d |||      }nOt        t              r|sJ |jQ                  d |||      }n#t        t              r|sJ |jQ                  d |||      }nt        t              r%|sJ |j                  j|                  |||      }nt        t~              r<t        |tv              st        d      |j                  j|                  |||      }nvt        t              r%|sJ |j                  j|                  |||      }nAt        t              r|sJ |j                  |||      }nt        t              r|sJ |j                  |||      }nt        t              r|sJ |jQ                  d |||      }nt        t              r|sJ |jQ                  d |||      }nt        t              r|sJ |j                  |||      }not        t              r|sJ |j                  |||      }nFt        t              r|sJ |jQ                  d |||      }nt        d dj                         || j                  j                  <   |S )Nrd  ra  )global_namerU  r  r  r  c                    t         S r   )r+  r7  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s     r   )python_lambdarU  r  r  c                    t         S r   )r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s     r   c                6    t        j                               S r   )r   
_get_indexr7  rU  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (H%%') r   c                .    t        j                        S r   )r   r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (:6==(I r   r  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_ordertensor_property__manager)r]  rU  r  r  zUse DictGetItemSourcez.__kwdefaults__c                (    | j                         d   S r   __tensor_flatten__r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>d  s    (<(<(>q(A r   c                "    | j                         S r   )__obj_flatten__r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>l  s    (9(9(; r   c                >    | j                         j                         S r   )_typequalified_namer  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>t  s    	(@(@(B r   c                "    | j                         S r   )get_baser  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>|  s    

 r   c                "    | j                         S r   )itemr  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s     r   c                ,    t        j                  |       S r   )r+  r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (A(A!(D r   r  z4ConstDictKeySource can only work on DictGuardManagerc                    t        |       S r   )r   r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (8(; r   c                    | j                   S r   r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s
    		 r   c                    t        |       S r   )r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s
    A r   zmissing guard manager builder z - )rrS  r   r  rX  rV  rQ  rW  rd  r  r  r   rX   r  get_guard_manager_from_sourcer   rn   r   r<  
local_nameframelocals_managerri   r  re  r  rk   global_weakref_managerrj   ru   r|   type_managerrz   type_dict_managerr{   type_mro_managerrs   rp   r~   r}   rf   rx   lambda_managerr[   rw   r^   rl   grad_managerrg   generic_getattr_managerr  rU   r   r  r  r  ra   rb   r  r  r  r   r  r   r   r]   RuntimeErrorr4   getattrproplowerr]  r-   indexed_managerrm   list_getitem_managerrh   r  index_is_slicer9  tuple_getitem_managerunpack_slicegetitem_managerr`   callableis_kwfunc_defaults_managerr   idx_keyr   func_kwdefaults_managerrr   r  rv   rd   rt   rT   rW   re   ry   tuple_iterator_getitem_managerAssertionErrorr  rq   set_getitem_managerr   weakref_call_managerrV   call_function_no_args_managerr_   ro   rZ   code_managerrY   closure_managerrc   )r   rU  root_guard_managerr  r{  r  r  r  r  base_guard_manager_enumr   outr   
kwdefaults	kw_sourcerf  s    `              r   r  z*GuardBuilder.get_guard_manager_from_sourceF  s   !//44kk"0K0K!K..{;;" HHV,M8ED""2m#45!88O  !!"2"@"@fm,%{{//!%&++!6!%!C!CFKK!P&*&A&A/'#
 &+&1$++v?P?PQO$88&&8"+#5	 9 C FL) //1FF&&"+#5	 G C F/0//1HH".."+#5	 I C F-. &%FN+%%FJ'%%%$11"+#5 2 C
 FN+%%%$66"+#5 7 C
 FM*%%%$55"+#5 6 C
 +2"	
 &%%$CFK($33-"+#5	 4 C F-.$333"+#5	 4 C F89$33 #+#5 4 C F/0$33I"+#5	 4 C FJ'%%%$11"+#5 2 C
 F-.%%%$<<]]"+#5	 = C FZ)GHI%%%fj11134FG'''//&&!$& )88&"/'9	 9  F.0IJK%%%049P9P2QRRRf'8:S&TUUU,.>?223JKKK-&&!& fll,>?&8  )==&"/'9	 >  F01'""6;;#3#3#9#9#;"<HE JJ"+#5C FM*%%%$44JJ"+#5	 5 C F-.%%%$99LL"+#5	 : C FM*%%%!"T;+B+B$C '&'  ,d3F<Q<Q(==&"/'9	 >  .6v?T?T(>>&"/'9	 ?  (("//1E(88&"/'9	 9  FN+%%%###.///<<(>>+"4"A"A'7'E'E ?  "/&"/'9	 " 	  0>>
'333,/@@	 .EE$",'7'E'E F 
 &h0@AAA33&"/'9	 4  F-.%%%$33("+#5	 4 C F23%%%$33A"+#5	 4 C F56%%%$33;"+#5	 4 C F;<%%%$33B"+#5	 4 C FO,%%%$334"+#5	 4 C F01%%%$330"+#5	 4 C F-.%%%$33D"+#5	 4 C F67%%%$CCll"+#5	 D C  2302BC$J  %44ll"+#5	 5 C F;<%%%$88ll"+#5	 9 C F-.%%%$99"+#5 : C
 F45%%%$BB"+#5 C C
 F12%%%$33;"+#5	 4 C F23%%%$331"+#5	 4 C FJ'%%%$11"+#5 2 C
 FM*%%%$44"+#5 5 C
 F/0%%%$33."+#5	 4 C !0FKK=I  47##FKK0
r   c                8    | j                  |j                        S r   )r  r#  r   rJ  s     r   rb  zGuardBuilder.get_guard_manager  s    11%2J2JKKr   c                   |
t               }dj                  |j                               }t        ||      \  }}i }d| j                  d   i}	t
        j                  d|       t        ||	|        |d   |j                          }
|r'| j                  j                  j                  |
|       y | j                  j                  j                  |
|       y )NrP  r4  zPython shape guard function:
%s___make_guard_fn)r  joinr  build_guard_functionr@  
guards_logdebugexecr   rS  r   add_epilogue_lambda_guardadd_lambda_guard)r   r   r   r   is_epiloguemake_guard_fn_args_guard_bodypycoder  globals_for_guard_fnguard_fns              r   $add_python_lambda_leaf_guard_to_rootz1GuardBuilder.add_python_lambda_leaf_guard_to_root  s     ,.L "YY|'8'8':;2:?QRV  #TZZ_5;VDV)3/*3)*L,?,?,AB ##==, ##44X?QRr   c                R   |j                   }t        |t              r|}n|j                  }| j                  r|| j                  v r| j                  |   S |
t               }|j                  | j                  || j                        }| j                  rd|v r|| j                  |<   |S )Nz.__closure__)
r  r   r>   r#  rE  r  	get_valuer@  rC  rR  )r   guard_or_sourcer   r  srcrets         r   rV  zGuardBuilder.get  s    
 ##ov.!C!44C  t,,,,,T22,.LmmDJJd6N6NO$ 6*-D!!$'
r   c                8   t        |t              r|}n|j                  }t        |      }|| j                  vrat
        j                  j                  j                  |      }|r6|dk(  rt        j                  d|       | j                  j                  |       |S )Nr,  zinvalid var name: %s)r   r   r  strip_function_callrL  r+  r  r  is_valid_var_namelogwarningrt  )r   rJ  r  r  is_valids        r   arg_refzGuardBuilder.arg_ref'  sz    eS!D::D"4(t}}$xx''99$?Hq=KK 6>$$T*r   c                    |dk(  rt        |j                        }nt        |j                  |      }t        |||j                  |j
                        }|j                  |        y )Nr   )r  r  )rZ   r#  rU   r:   r  r  create)r   rJ  r  r  attr_source	new_guards         r   _guard_on_attributez GuardBuilder._guard_on_attribute7  s[     
"$U%=%=>K$U%=%=yIKAQAQ
	 	r   c           	        |j                   }t        |t              r|j                  }t        |t              ry t        |t
              sJ d|j                          |j                  }|j                  }|j                  }| j                  |      }t        | j                  |      |      }d }|r
d| d|d}n	d| d|d}|| j                  v ry | j                  ||g| j                  |             | j                  |      }	|r| j                  |      }
| j                  |      }| j                  ||
      }t        |      r"| j!                  ||	||
||j                  |       n<|	j#                  ||j                  |
|       n|	j%                  |t'        ||             | j                  j)                  |       y )Nzinvalid source hasattr(rP  rQ  znot hasattr()provided_guarded_objectr  )r#  r   rp   r  rZ   rU   r  r  r  rf  rV  r\  _set_guard_export_infor  rd  r  r  r  add_no_hasattr_guardr  r   )r   rJ  rU  base_sourcer  r  refvalr   base_managerr  r  r  s                r   HASATTRzGuardBuilder.HASATTRH  s   ))fn-[[Ffj)&*-M/MM-kk}}ll4 dhh{+T2cU"THA.D!#b2D4000##D6488K3H 	$ 	
 99+F !HHV,M!%+!6!%!<!<V]!S 44FG)) &!KK& ,, ::"/'9	 -  --d4J4QV4WX%%))$/r   c                   |J | j                  |      }| j                  |      }| j                  |      }d|d| d}|| j                  v ry |j                   d}|j                  || j                  |j                        t        j                        }|j                  d|t        ||             | j                  j                  |       y )Nznot ___dict_contains(rP  z
.__dict__)r  r  F)r  rV  rb  r\  r  r  rx  rG  r  r  add_dict_contains_guardr  r   )	r   rJ  r  r  r  r  r   r  r  s	            r   NOT_PRESENT_IN_GENERIC_DICTz(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICT  s     ll5!hhuo--e4&thbZ@4000"ZZL	2#/#H#H"FFs||T/== $I $
  	!884/e<	
 	%%))$/r   c                   | j                  |      }t        |t        j                  j                        r|j
                  r|j
                  }nt        |      }|j                  |j                  k7  rd|_	        | j                  |d|j                   d      }t        |      }d| j                  |       d| d| }| j                  ||g       | j                  |      j!                  |t#        ||             y )NTtype(rQ  z___check_type_id(rP  ), type=)rV  r   r+  _subclasses
FakeTensorr  r;  r   r   _unserializabler=  r  rb  r  r  rb  add_type_match_guardr  )r   rJ  r  rV  r  	type_reprr   s          r   
TYPE_MATCHzGuardBuilder.TYPE_MATCH  s    eU..99:u||AUA>>QZZ' %)E!Q%

|1 56G	"4<<#6"7r&)U##ED62u%::*47	
r   c                   | j                  |      }| j                  |      }t        | j                  |            }d| d| }| j                  ||g       | j	                  |      j                  |t        ||             y )Nz___dict_version() == )r  rV  r   r  rb  add_dict_version_guardr  )r   rJ  r  r  versionr   s         r   DICT_VERSIONzGuardBuilder.DICT_VERSION  s{    ll5!hhuotxx/!#eG95##ED62 	u%<<'e4	
r   c                   | j                  |      }|rdnd}| d|d| d}|| j                  v ry | j                  ||g       | j                  |      j	                  | |t        ||             | j                  j                  |       y )Nnot rd  z___dict_contains(rP  rQ  )r  r\  r  rb  r  r  r   )r   rJ  r  invertdict_ref	maybe_notr   s          r   DICT_CONTAINSzGuardBuilder.DICT_CONTAINS  s    <<&$F"	-cWBxjB4000##ED62u%==J3D%@	
 	%%))$/r   c                   | j                  |      }|}| }d| d|d}|| j                  v ry | j                  ||g       | j                  |      j	                  ||t        ||             | j                  j                  |       y )Nzset.__contains__(rP  rQ  )r  r\  r  rb  add_set_contains_guardr  r   )r   rJ  r  r&  set_refr  containsr   s           r   SET_CONTAINSzGuardBuilder.SET_CONTAINS  s    ,,u%:"7)2dXQ74000##ED62u%<<d24?	
 	%%))$/r   c                N   | j                  |      }| j                  |      }t        |t              sJ | d|g}| j	                  ||       |r+| j                  |      j                  t        ||             y | j                  |      j                  t        ||             y )Nr  )	r  rV  r   r   r  rb  add_true_match_guardr  add_false_match_guardr   rJ  r  r  r   s        r   
BOOL_MATCHzGuardBuilder.BOOL_MATCH  s    ll5!hhuoc4   %tC7#$##E40""5)>>&tU3 ""5)??&tU3r   c                    | j                  |      }| j                  |      }|J | dg}| j                  ||       | j                  |      j	                  t        ||             y )Nz is None)r  rV  r  rb  add_none_match_guardr  r2  s        r   
NONE_MATCHzGuardBuilder.NONE_MATCH  si    ll5!hhuo{{%x !##E40u%::"4/	
r   c                &    | j                  ||      S r   )id_match_unchecked)r   rJ  r  s      r   ID_MATCHzGuardBuilder.ID_MATCH  s     &&un==r   c                    t        |j                  t              r=| j                  t	        |j                  j
                  t        j                              S | j                  |      }| j                  |      }| j                  ||j                        }	 t        |      }d| d| d| }| j                  ||gd       | j!                  |      j#                  |t%        |||             t        |j                  t&              r_t        |t(        j*                  j,                        r:|j                  j.                  }| j1                  |      }	|	|	| j2                  |<   y y y y # t        $ r dt        |      j                   d}Y w xY w)Nr8  r6  z___check_obj_id(rP  r  r9  )provided_func_name)r   r#  r|   r  r:   r  r0  r  rV  r=  r  rb  	Exceptionr;  r   r  rb  rk  r  rn   r+  r/  r0  r  r?  r   )
r   rJ  r  r  r  rm  r  r   r  weak_ids
             r   r8  zGuardBuilder.id_match_unchecked  sq    e..
;??e..33\5L5LM  ll5!hhuoS%**-	2S	I
 "#bD##ED6j#Qu%88*4G	
 e..< #uxx/"55@@
..s3&7>D((4 ' 0	 =  	2 DI../q1I	2s   E( ("FFc                   | j                  |      }| j                  |      }t        |t        j                        sJ | d}| j                  ||g       | j                  |      j                  t        ||             y Nz is not None)	r  rV  r   r+  r,  r  rb  add_not_none_guardr  )r   rJ  r  r  r  r   s         r   NOT_NONE_MATCHzGuardBuilder.NOT_NONE_MATCH(  sr    ll5!hhuo#u||,,,l###ED62u%88"4/	
r   c                    | j                  |      }| j                  |      }t        |t        j                  j
                        sJ | d|d}| j                  |      j                  |t        ||             y )Nz.raw_repr() == z.raw_repr())	r  rV  r   r+  r  r   rb  add_dispatch_key_set_guardr  )r   rJ  r  r  r   s        r   DISPATCH_KEY_SET_MATCHz#GuardBuilder.DISPATCH_KEY_SET_MATCH3  so    ll5!hhuo#uxx66777uOC7+>
u%@@'
E:	
r   c                   | j                   j                  J | j                   j                  j                  }d| g}| j                  ||       | j                  j
                  j                  |t        ||             y )Nz,torch.autograd.forward_ad._current_level == )rP  rT  
dual_levelr  rS  r   add_dual_level_match_guardr  )r   rJ  rF  r   s       r   
DUAL_LEVELzGuardBuilder.DUAL_LEVEL=  sy     $$11===**77BB
>zlKL##E40::.tU;	
r   c                   | j                   j                  J | j                   j                  j                  }|D cg c]  }|j                          c}d dg}| j	                  ||       t
        j                  j                  j                  dfd}| j                  j                  j                  |t        ||             y c c}w )Nz5torch._functorch.pyfunctorch.compare_functorch_state(rQ  c                           S r   r  )rl  
compare_fnstatess    r   fnz.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fnT  s    f%%r   r  )rP  rT  functorch_layers	get_stater  r+  
_functorchpyfunctorchcompare_functorch_staterS  r   r  r  )r   rJ  ciscir   rM  rK  rL  s         @@r   FUNCTORCH_STACK_MATCHz"GuardBuilder.FUNCTORCH_STACK_MATCHH  s     $$11===##00AA+./R",,./GxqQR##E40 %%11II
	& 	00&tU3	
 0s   Cc                   t         j                  j                  j                  j                  t         j                  j                  j                  j
                  	 	 	 	 dfd               d g}| j                  ||       dfd}| j                  j                  j                  |t        ||             y )Nc                H     |       sy t        t        t        |             S r   )r9  maprW  )hooksare_inline_hookss    r   hooks_ids_fnz?GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.hooks_ids_fna  s!     $E*R((r   zCtorch._functorch.aot_autograd.utils.top_saved_tensors_hooks ids == c                $                   k(  S r   r  )rl  	get_hooksguard_hooks_idsr[  s    r   rM  z5GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.fnp  s    "l9;&???r   )rY  zCtuple[Callable[[torch.Tensor], Any], Callable[[Any], torch.Tensor]]r   zOptional[tuple[int, ...]]r  )r+  rP  _aot_autogradr  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineabler  rS  r   r  r  )r   rJ  r   rM  rZ  r]  r^  r[  s       @@@@r   AUTOGRAD_SAVED_TENSORS_HOOKSz)GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS[  s    $$2288PP	**00SS 		)V	)&	) 'y{3 RRaQbc
 	##E40	@ 	00&tU3	
r   c                |   | j                  |      }t        | j                  |      j                         d         t        |d      rt	        |       t        |      dfd}ndfd}dt        |       dt        j                          }| j                  |      j                  |t        ||             y )NrO   __metadata_guard__c                J    j                  | j                         d         S r   )rd  r  )rl  clsoriginal_metadatas    r   metadata_checkerzEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker~  s)    --%q';';'=a'@ r   c                0    | j                         d   k(  S r   r  )rl  rg  s    r   rh  zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker  s    ++-a04EEEr   ___check_metadata__cr  )rV  r   r  rf  r   r;  rW  r7   current_compile_idrb  r  r  )r   rJ  r  rh  r  rf  rg  s        @@r   TENSOR_SUBCLASS_METADATA_MATCHz+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCHw  s    $TXXe_%G%G%I!%LM5./%e,u+CF +2.>+?*@>CdCdCfBghu%664[%H	
r   c                    t        | j                  |            dfd}dt        |       }| j                  |      j	                  |t        ||             y )Nc                *    | j                  d      S )NT)skip_shapes)_check_equals)rl  r  s    r   r  z1GuardBuilder.DTENSOR_SPEC_MATCH.<locals>.guard_fn  s    ??5d?;;r   __dtensor_spec_r  )r   rV  rW  rb  r  r  )r   rJ  r  r   r  s       @r   DTENSOR_SPEC_MATCHzGuardBuilder.DTENSOR_SPEC_MATCH  sT     %)	< !H/u%66,T59	
r   c                   | j                  |      }| j                  |      }t        rt        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.        j0                  t.        j2                  t.        j4                  j6                  j2                  h	||z        }t.        j8                  j;                         rddlm} ddl m!}	m"}
m#}m$} ||||
||	fz   }ddl%m&} ||fz   }dd l'm(c m)} tU        ||      sB |jV                  t%        |            s'tY        t%        |            sJ dt%        |              t[        |t\              r\t_        j`                  |      rGd| d| d	g}| jc                  ||       | je                  |      jg                  ti        ||             y t[        |tj              r\t        j`                  |      rGd| d
| d	g}| jc                  ||       | je                  |      jm                  ti        ||             y | d|g}t[        ||      rto        |      }ti        ||      }|r|D cg c]
  }| d| d }}| je                  |      jq                  ||       | jc                  ||       y c c}w )Nr  r   )
DeviceMesh)_StridedShardPartial	ReplicateShard)_IntWrapperzUnexpected type z(type(z) is float and __math_isnan(z))z) is complex and __numpy_isnan(r  r  rQ  )9r  rV  r  int8int16int32int64uint8uint16uint32uint64float16float32float64r  r   r9  r   r;  r  sliceranger   r+  SizeStreamcudastreamsdistributedis_availabletorch.distributed.device_meshru  (torch.distributed.tensor.placement_typesrv  rw  rx  ry  torch.export.dynamic_shapesrz  torch.utils._pytreer  rJ   r   is_constant_classrB   r   r  r  r  r  rb  add_float_is_nan_guardr  complexadd_complex_is_nan_guardr   r  )r   rJ  r  r  r  np_typesok_mutable_typesok_typesru  rv  rw  rx  ry  rz  pytreer   r   rM  s                     r   EQUALS_MATCHzGuardBuilder.EQUALS_MATCH  s   ll5!hhuo						





/H H #;!



""))  "
" ))+@   # H 	<{n,,, sH%'v''S	2#DI.	* d3i[)		*/ #u$**S/SE!=cU"EFD''t4""5)@@&tU3  #wBHHSMSE!@RHID''t4""5)BB&tU3  %tC7#$#'( 3-C3D%@?Q"7;4& 02" " 	u%<<SBTU##E40"s   :L?c                   | j                  |      }t        |t              r| j                  |       y || j	                  |       y t        |t
        j                        r| j                  |       y | j                  |       y r   )	rV  r   r   r3  r6  r1  CodeTyper9  r  r   rJ  r  s      r   CONSTANT_MATCHzGuardBuilder.CONSTANT_MATCH	  s^    hhuo#tOOE"[OOE"C(MM% e$r   c                F   | j                  |d       | j                  |      }t        |d      rKt        |j                  t
              sJ | j                  s"| j                  |dt        j                         y y t        j                  dddt        |       ddg       y )	Nz%[inline-inbuilt-nn-modules-candidate]trainingz-Attempted to guard on uninitialized nn.Modulerd  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)r9  rV  rf  r   r  r   r[  r  r0  r  rR   unimplementedr;  r  s      r   	NN_MODULEzGuardBuilder.NN_MODULE	  s    eDEhhuo3
##,,---((((
L<W<WX ) G''+Cyk5 `r   c                $    | j                  |      S )z0things like torch.add and user defined functions)r9  r  s     r   FUNCTION_MATCHzGuardBuilder.FUNCTION_MATCH$	  s     }}U##r   c                    | j                  |      }t        j                  |      st        |j                   d      | j                  |       y)zNEquals ID_MATCH on classes - better readability than directly calling ID_MATCHz( is not a class, but CLASS_MATCH is usedN)rV  r  isclassr  r  r8  r  s      r   CLASS_MATCHzGuardBuilder.CLASS_MATCH)	  sG    hhuos# ::,FG  	&r   c                    | j                  |      }t        j                  |      st        |j                   d      | j                  |       y)zNEquals ID_MATCH on modules - better readability than directly calling ID_MATCHz* is not a module, but MODULE_MATCH is usedN)rV  r  ismoduler  r  r8  r  s      r   MODULE_MATCHzGuardBuilder.MODULE_MATCH2	  sI    hhuo$ ::,HI  	&r   c                   | j                  |      }t        |      t        j                  u rOt	        |d      rC| j                  |dt        j                         | j                  |dt        j                         y| j                  |       y)z!matches a closure by __code__ id.r   N)
rV  r;  r1  r2  rf  r  r0  r  r  r  r  s      r   CLOSURE_MATCHzGuardBuilder.CLOSURE_MATCH;	  sj     hhuo9***wsJ/G$$UJ8L8LM$$UJ8S8ST&r   c                    | j                   rSt        |j                  t              r9| j                  j
                  j                  |j                  j                         | j                  |      S r   )	rR  r   r#  ra   rP  used_builtin_varsr   r   r8  r  s     r   BUILTIN_MATCHzGuardBuilder.BUILTIN_MATCHF	  sX    %224EF%%77;;,,22 &&u--r   c                *   | j                  |      }| j                  |      }t        |t              s| j	                  |       g }t        |      dk(  r|j                  d|        n |j                  d| dt        |              | j                  ||       t        |t              r5| j                  |      j                  t        |      t        ||             y | j                  |      j                  t        |      t        ||             y )Nr   r%  zlen(r   )r  rV  r   r  r  r   rt  r  rb  add_dict_length_check_guardr  add_length_check_guardr   rJ  r  r  r   s        r   SEQUENCE_LENGTHzGuardBuilder.SEQUENCE_LENGTHO	  s     ll5!%&OOE"u:?KK$se%KK$se5U56##E40eT"""5)EEE
24? ""5)@@E
24?r   c                   | j                  |      }| j                  |      }t        |      }g }|j                  d| dt	        |              | j                  ||       t        |      }| j                  |d|j                   d      }| j                  |      j                  t	        |      |t        ||             y )Nz___tuple_iterator_len(r   r  rQ  )r  rV  r;  rt  r   r  r=  r  rb  add_tuple_iterator_length_guardr  )r   rJ  r  r  rV  r   r  s          r   TUPLE_ITERATOR_LENzGuardBuilder.TUPLE_ITERATOR_LENi	  s    ll5!K,SE7I%7P6QRS##E40KQ%

|1 56u%EEu%v/EdE/R	
r   c           
        | j                  |      }| j                  |      }t        |      }g }t        |      }|j	                  d| d|        | j                  ||       t        |      }| j                  |d|j                   d      }|\  }}	}
| j                  |      j                  ||	|
|t        ||             y )Nz___normalize_range_iter(r   r  rQ  )r  rV  r;  r   rt  r  r=  r  rb  add_range_iterator_match_guardr  )r   rJ  r  r  rV  r   normalized_range_iterr  startstopsteps              r   RANGE_ITERATOR_MATCHz!GuardBuilder.RANGE_ITERATOR_MATCHy	  s    ll5!K 4U ;.se59N8OPQ##E40KQ%

|1 561tTu%DD4v'=dE'J	
r   c                |   t        |j                        st        |      ry | j                  rdt        |      x}r%| j                  j
                  j                  |       t        |      x}r%| j                  j                  j                  |       | j                  |      }| j                  |j                        }t        |j                        st        |      ry ||f}|| j                  v ry | j                  j                  ||f       | j                  j                  ||f       | d| g}| j                  ||       t        j                  r2|d   }t!        ||      d   }	| j"                  j%                  ||	f       y t'        | j)                  |      | j+                  |      t!        ||             y )N is r   )r1   r#  rR  r,   rP  additional_used_local_varsr   r+   additional_used_global_varsr  r  r0   rY  r  rP   #use_lamba_guard_for_object_aliasingr  rZ  rt  r    rb  r  )
r   rJ  source_br  ref_aref_br  r   rw  rv  s
             r   DUPLICATE_INPUTzGuardBuilder.DUPLICATE_INPUT	  s   $$$
&x0,X66t6%%@@DDTJ-h77t7%%AAEEdKU#X]]+#$$
%h/ en$555++//?++//?'eW%&##E4055 QI 6y% H K,,33Y@Q4RS)&&u-228<&tU3r   c                    | j                  |       dg}| j                  ||       | j                  |      j                  t	        ||             y r?  )r  r  rb  r@  r  r   rJ  r   s      r   WEAKREF_ALIVEzGuardBuilder.WEAKREF_ALIVE	  sN    <<&'|45##E40u%88"4/	
r   c           	        | j                  |      }| j                  |      }g }|j                  d| dt        |j	                                       | j                  ||       | j                  |      j                  ||       y)z7Guard on the key order of types.MappingProxyType objectzlist(z.keys()) == N)r  rV  rt  r  r  r  rb  add_mapping_keys_guardr  s        r   MAPPING_KEYS_CHECKzGuardBuilder.MAPPING_KEYS_CHECK	  sr    ll5!eC5T%**,-?,@AB##E40u%<<UDIr   c           
        | j                  |      }| j                  |      }|t        j                  j                  j
                  u r| j                  |       y| j                  |       g }|j                  d| dt        t        |                   | j                  ||       | j                  |j                        r| j                  ||       y| j                  ||       y)z6Insert guard to check that the keys of a dict are sameNr  z)) == )r  rV  r+  r  rJ   SUPPORTED_NODESr#  r  rt  r  r   r  r  r#  rn  rh  r  s        r   DICT_KEYS_MATCHzGuardBuilder.DICT_KEYS_MATCH	  s    ll5!EKK''777e$U#
 	ocU&6G6N1O0RST##E40++E,D,DE--eU;44UEBr   c                H    t         j                  ry| j                  |       y)z\Special guard to skip guards on empty hooks. This is controlled by skip_nnmodule_hook_guardsN)rP   skip_nnmodule_hook_guardsr  r  s     r   EMPTY_NN_MODULE_HOOKS_DICTz'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICT	  s    ++U#r   c                     y r   r  r  s     r   	GRAD_MODEzGuardBuilder.GRAD_MODE	      r   c                     y r   r  r  s     r   DETERMINISTIC_ALGORITHMSz%GuardBuilder.DETERMINISTIC_ALGORITHMS	  r  r   c                     y r   r  r  s     r   FSDP_TRAINING_STATEz GuardBuilder.FSDP_TRAINING_STATE	  r  r   c                    | j                   j                  }|J |j                  }|| j                   _        | j                  j
                  j                  |dg       y )Nz___check_global_state())rP  rT  global_state_guardglobal_staterS  r   add_global_state_guard)r   rJ  rT  r  s       r   GLOBAL_STATEzGuardBuilder.GLOBAL_STATE	  s[    ,,99'''#66-9*6645	
r   c                   | j                   j                  J t        | j                   j                        | j                   _        | j                  j
                  j                  | j                   j                  dg       y )Nz$___check_torch_function_mode_stack())rP  torch_function_mode_stack$make_torch_function_mode_stack_guard"torch_function_mode_stack_check_fnrS  r   #add_torch_function_mode_stack_guardr  s     r   TORCH_FUNCTION_STATEz!GuardBuilder.TORCH_FUNCTION_STATE	  sp    $$>>JJJ0%%?? 	@
 	CC!!;;34	
r   c                0   |j                   t        j                  u sJ | j                  j                  J d| j                  j                  j
                  g}| j                  ||       | j                  |      j                  t        ||             y)z/Guard on CURRENT_DEVICE per torch.utils._deviceNzutils_device.CURRENT_DEVICE == )
rU  r=   GLOBALrP  rT  current_devicer  rb  add_default_device_guardr  r  s      r   DEFAULT_DEVICEzGuardBuilder.DEFAULT_DEVICE	
  s    ||{11111$$11===-d.C.C.P.P._._-bc
 	##E40u%>>"4/	
r   c                   %&'( ddl m} |j                  dk(  sJ  j                  j                  ((J  j                  j
                  T j                  j
                  }|j                  }|j                  }|j                  |j                  }|j                  }ntt        (|      sJ (j                  J (j                  j                  xs g &&D cg c]  }|j                   c}'d(fd}	(j                  ri }
g }g }i }t               }(j                  D ]j  }|j                   (j"                  v r;t$        j&                  j(                  j+                  ||	(j                  |
||||       Vt,        j/                  d       l t1        ||t3        |j5                               |d      %nd %d%&'( fd}t6        j8                  r	  |d	      \  }}}d}nd
} |d      \  }}(j&                  s(j                  j=                           j>                  rstA               jC                  d      }|t        |tD              sJ |g n"t3        |jF                  jI                               }tK        |||||       j                  _        |jL                  D ]  } jO                  ||g        tQ        jR                         x}r%|jT                  jW                  |jL                         g }g }|ssJ |jL                  |jF                  }}|sy |jY                         D ]  \  }}t        |tZ              rd
} jC                  |i t\        t_                     }t        |t`              r|jc                  ||f       `t        |td              r|jc                  ||f       d
} |sdd l3}ddl4m5} sJ |jL                  |jF                  }}tm        ||z         }	 to        |      D cg c]   \  }} jq                  ts        ||            " }}}dju                  d to        |      D              } dju                  d to        |      D              }!| rd|  d} |!rd|! d}!tw        jx                  d|  d|! ddju                  |       d      }"tz        j}                  d|"|jL                         |j                  |"      }#|j                  |#j                  |j                        j                  }$|$sJ 	 t        |t        |      t        |      |$|#|jL                         y |jL                  r9 j                  |jL                  |jL                  i t\        t_                      y y c c}w # t:        $ r d
} |d      \  }}Y w xY wc c}}w # t$        j                  j                  j                  $ r Y w xY w)Nr   r   rd  c                z    j                   |    D cg c]  }t        |t        j                  |       c}S c c}w r   )tracked_fakes_id_to_sourcer4   r3   SIZE)t_idr  rU  rT  s      r   get_sourcesz+GuardBuilder.SHAPE_ENV.<locals>.get_sources.
  sA     #/"I"I$"O  )1D1DcJ  s   "8z+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsrelaxed_sources	warn_onlyc           	         j                   j                  D cg c]  }|j                   c}D cg c]  }|j                   c}j                  j
                   |       S c c}w c c}w )N)input_contextsequalities_inputsr>  ignore_staticlangs)	shape_envproduce_guards_verbosefakerU  r>  export)r  r  r  r  r  rT  r   s     r   _get_code_partsz/GuardBuilder.SHAPE_ENV.<locals>._get_code_partsW
  sj    #--DD%'(QVV(')*!QXX*#1&7# (4':':#: E 
 
(*s
   A)A.
)pythonverbose_pythoncppT)r  r  cpp_code_parts)python_code_partsr   r  python_fallbackshape_env_sources)r   )CppCodeCacherP  c              3  8   K   | ]  \  }\  }}| d | d  yw)z = int_values[r  Nr  r  ir7  symbols       r   r  z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>
  s-      ,&;Av hnQCq1,   c              3  8   K   | ]  \  }\  }}| d | d  yw)z = float_values[r  Nr  r  s       r   r  z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>
  s.      .&;Av h.qc3.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   list[Source])r  ztuple[str, ...]r   zlist[_ShapeGuardsHelper])Jtorch._dynamo.output_graphr   r  rP  rT  shape_code_partsr	  r   r  r
  r   r   tracked_fakessymbolic_contextexport_constraintsr   r  r  r+  r  dynamic_shapes_process_equalitiesr   r  rG   r  r   rP    enable_cpp_symbolic_shape_guardsOverflowErrorfreezerR  localsrV  rE   source_to_symbolr  ShapeCodePartsexprsr  r7   try_getshape_env_guardsr  r   r\   rI   r  r  rt  r  ctypestorch._inductor.codecacher  r  rj  r  r-   r  textwrapdedentr  r  loadcastrJ  c_void_pr  r"   r   	_inductorrR   InvalidCxxCompilerr  ))r   rJ  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   rU  r  r  r%  r  r  guard_managersint_symbols_strfloat_symbols_strfunc_strclibcguardr  r  r  rT  s)   `                                    @@@@r   	SHAPE_ENVzGuardBuilder.SHAPE_ENV
  s9   @zzR,,99'''  11=#44EE 0 B B!1!D!D..:!1!@!@.>>O l,=>>>))555''55;B:<=Qa00=N ..46<>  # 68/2u"."A"A SJ!,*Q*QQ33GG&'(22!(.++	 $QRS %7!-'9$()?)?)A$B$3#%! %)!  66 ((KL J%'9> ',O #'8G095!#5  &&&&--/ $*8<<0@#A '/:$&;4  
 (/ .??DDFG $
 6D"3#53 /"96D!!2 &++ 	7D''v6	7 -4466?6,,334F4L4LM!!#!!> $$//	 )J "2"8"8": /fn5&*O$(HH%L%L8I8K%L %- %M "-5,33VV4DE#M59.55vv6FG +//" >!!> $$//	 )J  $$8;Q$QR< &//?%@"!6 66}VQ7OP" "
 #')) ,*34H*I, # %)II .*34J*K. %!
 #(00A&CO$*12C1DA(F%#?? ## $$% &#==45 6(   5&,,
 $((2TZZAGGv
 -",-./&,, 
 ""55!''"((DD0A0CD 6  #w >@ % &*O<K4=9%'9v"^ ??&&99 s=   U8U= (V  6%VC)V  =VVV   'W
	W
c                &
   t         j                  r|j                         ry t        |      r| j	                  |       y t        |t              r |       }||n| j                  |      }t        |      }t        j                  j                  |      }t        |t        j                  j                        r0|j                  |j                  }|j                  |j                  }t        |t        j                         sJ t         j"                  rt        |t        j$                  j&                        rht)               }|j+                         rN|j-                  d|j/                                |j-                  d|j0                         |j-                  dd       | j3                  |      }g }| j4                  j6                  J | j4                  j6                  j8                  r| j;                  |       g d}|D ]  }	t=        |j>                  |	      }
|	dk(  rd}	tA        |
      }
| j                  |
      }tC        |t        jD                  t        jF                  f      r$|jI                  d| d	|	 d
tK        |             |jI                  | d	|	 d|         ny| jM                  |      }t         jN                  r9tC        |t        j$                  j&                        setQ        |j>                        sPt        |j>                  tR              s6| jT                  jI                  |       | jV                  jI                  |       | j4                  j6                  }|jX                  |j>                     }t[        |d         }t[        |d         }t]        t_        ||||||      |      }|ja                  |||||||       t        |t        j$                  j&                        s/| jb                  jd                  jg                  |jh                         |jj                  J tm        |d|j>                        \  }}|sto        |d      rU|jp                  }d| d| d| d}|jI                  |       | jM                  |      js                  |t]        ||             nBd| d}|jI                  |       | jM                  |      ju                  dt]        ||             tw        |      dkD  r| jy                  ||       y y )Nparam_numelparam_bytesparam_countrO   )r  r  r  
ndimensionr@  zndimension()zstr(r9  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   )=rP   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler&  r9  r   rN   rV  r;  r+  r  _dispatch_keysr  r  r  r  r,  log_compilation_metricsr/  	Parameterr6   in_progress	incrementnumelnbytesr  rP  rT  r  r  rU   r#  rV   r   r  r  rt  r   rb  ,skip_no_tensor_aliasing_guards_on_parametersr2   rr   rN  rO  input_source_to_sizes_stridesr  r  r  add_tensor_match_guardrS  r   r   r  rU  r   rf  rE  add_dynamic_indices_guardr  r   r  )r   rJ  r  r  r  metrics_contexttensor_namer   termstermterm_src
real_valuerS  rT  metadatarA  rB  r   static_reasondynamic_indicesrw  s                         r   TENSOR_MATCHzGuardBuilder.TENSOR_MATCH  s~   11e6J6J6L "%(MM% %/".EDHHUOE%[F!HH33E:M%!2!2!=!=><<+"\\F&&2$)$7$7MeU\\222--*UEHHDVDV2W"5"7"..0#--mU[[]K#--mU\\J#--mQ?,,u-K, !D((55AAA$$1188& " 
MD)%*B*BDIH|+-#;H#E!%(!3Jj5<<*EFd;-qeC
OCV$WX{m1TF$zl$KL
M !% 6 6u = GGuehh&8&89I!44 %U%=%=?PQ 1188E::AA-P#44AA'EE,, 2(62BC3HX4FG%;.#% 
&" 44&! "%););<&&99==ejjI< <<+++<U5M5MOFG 5";<&+&C&CO"$[M1STcSddrs~r  @g  !hIKK	***51KK')?	5)Q #;-/TU  KK	***51FF1.y%@ 4y1}++E48 r   c                8   t               }|J |j                  }~|J |xs |j                  j                  }~|| j                  j
                  v s
J d|        |"|j                  }|sd n| j                  |      }	n|}	|	t        j                  t        |	            nd }
d }t        |	j                  dd      dk7  }|rDt        |	t        j                  t        t        j                   f      st        j                  |	      }|j#                  ||
||       y )NzH_produce_guard_code must be called from inside GuardedCode. Called from __weakrefoffset__r   )r   f_backr<  co_namer   rG  r  rV  rA  r  r;  r  r   enumEnumr9  
ProxyTypesset_export_info)r   rJ  r)  r  r;  	cur_framecaller	func_namer  guarded_objectguarded_object_typeobj_refsupports_weakrefs                r   r  z#GuardBuilder._set_guard_export_info  s-    !N	$$$!!!!!&?&--*?*?	DNN333 	
VW`Vab	
3
 #*::D)-T488E?N4N 2@1KGKK^,-QU 	  N,,.A1EJ 	 JTYYw/A/AB%
 kk.1G		
r   )FNN)r<  types.CodeTyper=  zCallable[[object, str], int]r>  zCallable[[Source], str]r?  z1Callable[[object], Optional[weakref.ref[object]]]r]  dict[str, object]r   rn  rS  r   rP  CheckFunctionManagerrR  r   rD  r  rE  Optional[dict[str, Any]]r   r   )r  dict[Any, Any]rJ  r:   r   r   )r  rq  rJ  r:   r   r   )r  r   r   Optional[Any])rU  rU   r  r   r  r   r  r   r  r   r{  r   r  r  r   r   )rU  r>   r   r   )rU  r>   r  zHOptional[Union[KeysView[Any], set[Any], frozenset[Any], dict[Any, Any]]]r   r  )r  r  r   r   )r   r   )rU  r>   r   r   )rJ  r:   r   r   r  )
r   r{  r   r{  r   r  r  r   r   r   r   )r  zGuard | Sourcer   rp  r   r   )rJ  zUnion[str, Guard]r   r   )rJ  r:   r  r   r  z(Callable[[GuardBuilderBase, Guard], Any]r   r   )rJ  r:   r   r   )rJ  r:   r  rr  r   r   )rJ  r:   r  r   r&  r   r   r   )rJ  r:   r  r   r&  r   r   r   )rJ  r:   r  r  r   r   )rJ  r:   r  rr  r   r   )rJ  r:   r  r>   r   r   )NN)
rJ  r:   r)  r{  r  rr  r;  r  r   r   )=r   r   r   r   rh  rn  r4  rx  r  r  rd  r  r  r  rb  r  rV  r  r  r  r  r  r#  r)  r.  r3  r6  r9  r8  rA  rD  rH  rU  rb  rm  rs  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   r0  r0    s_    "<@59OFOF -OF ,	OF
 KOF 'OF (OF +OF /OF OF :OF 3OF 
OFb+49	<$L  "YY )Y  	Y
 Y Y Y -Y 
Yv9""
" 
",?
`DL 59 SS &S 2	S
 S 
SL 26' / 
	2   ;	
 
"80v 3700"/0	02
,
00 "

> =A#?#?,9#?	#?J	

	

&
8
,
iV	%($
''	'.4
 
&+Z
JC2$



un{9D 26,01
1
 1
 "/	1

 *1
 
1
r   r0  c                      e Zd ZdZej
                  ej                  ej                  fZe	j                   G d d             Z G d dej                        Z G d dej                        ZddZddd	Zdd
ZddZy)PyExprCSEPassrO   c                  "    e Zd ZU ded<   ded<   y)PyExprCSEPass.Configzdict[str, int]
expr_countzdict[str, str]expr_to_nameNr*  r  r   r   Configrv    s    ""$$r   ry  c                  (     e Zd ZddZd fdZ xZS )PyExprCSEPass.ExprCounterc                    || _         y r   )_config)r   rP   s     r   r   z"PyExprCSEPass.ExprCounter.__init__  s	    !DLr   c                    t        |t        j                        r*| j                  j                  t        |      xx   dz  cc<   t        |   |       y r   )r   rt  ALLOWED_NODE_TYPESr}  rw  r  r   r   )r   r   r   s     r   r   zPyExprCSEPass.ExprCounter.visit"  s>    $ @ @A''T(:;q@;GM$r   )rP   rv  r   r   )r   ast.ASTr   r   r   r   r   r   r   r   r   s   @r   ExprCounterr{    s    	"	  	 r   r  c                  8     e Zd Z	 	 	 	 	 	 d fdZd fdZ xZS )PyExprCSEPass.Replacerc                L    t         |           || _        || _        g | _        y r   )r   r   r}  	_gen_namepreface)r   rP   gen_namer   s      r   r   zPyExprCSEPass.Replacer.__init__(  s%    
 G!DL%DN&(DLr   c                :   t        |t        j                        rt        |      }| j                  j
                  |   t        j                  kD  r|| j                  j                  vrdt        | %  |      }t        |      }| j                         }| j                  j                  | d|        || j                  j                  |<   n| j                  j                  |   }t        j                  |t        j                               S t        | %  |      S )Nz = )r   rt  r  r  r}  rw  USE_THRESHOLDrx  r   r   r  r  rt  r  NameLoad)r   r   exprnode_expr_r   r   s         r   r   zPyExprCSEPass.Replacer.visit2  s    $ @ @A#D) <<**40=3N3NN4<<#<#<< !&d 3 ,U 3#'>>#3++xjE7,CD:B11$7#'<<#<#<T#B88Hchhj997=&&r   )rP   rv  r  zCallable[[], str]r   r   )r   r  r   r   r  r   s   @r   Replacerr  '  s.    	)(	) (	) 		)	' 	'r   r  c                j    d| _         | j                  t        j                  d       i       | _        y )Nr   c                      yr   r  r  r   r   r  z(PyExprCSEPass.__init__.<locals>.<lambda>O  s    r   )rw  rx  )_counterry  r  defaultdictr}  r   s    r   r   zPyExprCSEPass.__init__L  s.    {{"..y9 # 
r   c                P    | | j                    }| xj                   dz  c_         |S r   )r  )r   r   r  s      r   _new_varzPyExprCSEPass._new_varR  s'    $--)r   c                    | j                  | j                        }|D ]'  }	 |j                  t        j                  |             ) y # t
        $ r'}t        j                  d|j                  |        d }~ww xY w)Nz#Failed to visit expr at line %s.
%s)	r  r}  r   r  parseSyntaxErrorr   	exceptionlineno)r   r"  countereexs        r   countzPyExprCSEPass.countW  si    ""4<<0 	Aciil+	  DbiiQRSs   $A			A9"A44A9c                    | j                  | j                  | j                        }|j                  t	        j
                  |            }|j                  t        |      fS r   )r  r}  r  r   r  r  r  r  )r   r  replacernew_nodes       r   r  zPyExprCSEPass.replace`  sF    ==t}}=>>#))D/2h!777r   Nr~  )_var)r   r   r   r   )r"  r{  r   r   r  r   r   ztuple[list[str], str])r   r   r   r  r  	AttributeCall	Subscriptr  dataclasses	dataclassry  NodeVisitorr  NodeTransformerr  r   r  r  r  r  r   r   rt  rt    sx     M --3==A% % % coo  #'3&& #'J

8r   rt  c                    t        | j                  t              xs. t        j                  xr | j
                  t        j                  u S r   )r   r#  r`   rP    guard_nn_modules_using_dict_tags	create_fnr0  r  )rJ  s    r   must_add_nn_module_guardsr  f  s@    
 	5++^< 	
 33 :<#9#99r   c                  (     e Zd Zd fdZddZ xZS )DeletedGuardManagerWrapperc                0    t         |           || _        y r   )r   r   invalidation_reason)r   reasonr   s     r   r   z#DeletedGuardManagerWrapper.__init__u  s    #) r   c                    d | _         y r   )r   r   s    r   r
  z6DeletedGuardManagerWrapper.populate_diff_guard_managery  s
    #r   )r  r   r   r   r~  )r   r   r   r   r
  r   r   s   @r   r  r  t  s    *$r   r  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded	<   y
)r!  rF   r	  r   zOptional[_CppShapeGuardsHelper]r  r   r
  r  r  Nr*  r  r   r   r!  r!  }  s     ))**33##r   r!  c                  0    e Zd ZU ded<   ded<   dZded<   y)GuardsStater   rT  Optional[ShapeCodeParts]r  Nrp  rE  )r   r   r   r   rE  r  r   r   r  r    s    ((..15.5r   r  c                  .    e Zd ZdddZddZddZd	dZy)
_MissingNc                    || _         y r   r[  )r   r  s     r   r   z_Missing.__init__  s	    r   c                "    d| j                    dS Nz	_Missing(rQ  r  r   s    r   __repr__z_Missing.__repr__      4<<.**r   c                "    d| j                    dS r  r  r   s    r   rh  z_Missing.__str__  r  r   c                    t               S r   )r  )r   r   kwargss      r   __call__z_Missing.__call__  s
    zr   r   )r  r  r   r   r   )r   r   r  r   r   r   )r   r   r   r   r  rh  r  r  r   r   r  r    s    ++
r   r  c                     t         j                  t        j                  j                  t
        j                  f} 	 | t        j                  j                  j                  fz  } | S # t        $ r Y | S w xY wr   )
r1  r  r+  r  r  rA  r   _distributed_c10dProcessGroupAttributeError)r  s    r   _get_unsupported_typesr    sh     	C
**7799 J  Js   (A% %	A21A2c                      e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 d fdZedd       Ze	 	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zedd       Zedd       Z	e	 	 	 	 dd       Z
e	 	 	 	 dd       Zedd	       Ze	 	 	 	 dd
       Ze	 	 	 	 dd       Zedd       Zedd       Zedd       Zedd       Z	 	 	 	 d dZ xZS )!GuardsStatePicklerc                    t        |   |i | t        j                  j	                         | _        t        j                  j                  j                         | _        || _	        || _
        || _        y r   )r   r   r+  r  FakeTensorMode	fake_modefake_tensorFakeTensorConvertertensor_converterrQ  empty_valuesmissing_values)r   rQ  r  r  r   r  r   s         r   r   zGuardsStatePickler.__init__  sb     	$)&)**99; % 1 1 = = Q Q S!2(,r   c                d    t         j                  j                         }|j                  |       |S r   )r+  r/  r0  __setstate__)rf  statemods      r   _unpickle_modulez#GuardsStatePickler._unpickle_module  s%    hhoo
r   c           	        t         j                  j                         }t         j                  j                  j	                         }|j                  ||||t         j                  j                  j                  |            }||_	        |S r   )
r+  r  r  r  r  from_meta_and_devicer  r   from_raw_reprgrad)	rf  meta_tensorr  r  dispatch_keys_rawr  r  r  r  s	            r   _unpickle_tensorz#GuardsStatePickler._unpickle_tensor  sv     %%446	 ,,88LLN33HH##112CD
 
r   c                   i }|D ]  \  }}	}
 |	|
 ||<    |j                   |j                         }}t        |      j                  ||||      }||_        t
        j                  j                  j                  |      |_	        |S r   )
shaperB  r;  __tensor_unflatten__r  r+  r  r   r  r  )rf  r  r  r  r  ctx
inner_datainner_tensorsr  unpickle_funcunpickle_func_args
outer_sizeouter_strider  s                 r   $_unpickle_traceable_wrapper_subclassz7GuardsStatePickler._unpickle_traceable_wrapper_subclass  s     7A 	E3D-!3"/1C"DM$	E $/#4#4k6H6H6JL
;443
L
 
!HH33AABST
r   c                ,    t        j                  |      S r   )r  r  )rf  aliass     r   _unpickle_python_modulez*GuardsStatePickler._unpickle_python_module  s    &&u--r   c                T    t         j                  j                  j                  |      S r   )r+  r  r   r  )rf  raw_reprs     r   _unpickle_dispatch_key_setz-GuardsStatePickler._unpickle_dispatch_key_set  s    xx&&44X>>r   c                h    t         j                  j                  j                  j	                  |      S r   )r+  r  rP  CInterpreterdeserialize)rf  jsons     r   _unpickle_functorch_interpreterz2GuardsStatePickler._unpickle_functorch_interpreter  s%     xx""//;;DAAr   c                ,    t        j                  |      S r   )r1  MappingProxyType)rf  ds     r   _unpickle_mapping_proxyz*GuardsStatePickler._unpickle_mapping_proxy  s     %%a((r   c                H    t         j                  |      j                         S r   )r  fromkeysr  )rf  elemss     r   _unpickle_dict_keysz&GuardsStatePickler._unpickle_dict_keys  s    }}U#((**r   c                    t         j                  j                  j                  j                  j	                         |   S r   )r+  r  fsdp_fully_shardget_cls_to_fsdp_cls)rf  original_types     r   _unpickle_fsdp_module_typez-GuardsStatePickler._unpickle_fsdp_module_type  s5       %%22??SSU
 	
r   c                    t         j                  j                  j                  }|j	                  |      }t         j                  j
                  j                  ||       |S r   )r+  r/  parallelDistributedDataParallel__new__r0  r  )rf  r  tyddps       r   _unpickle_ddp_modulez'GuardsStatePickler._unpickle_ddp_module  sC     XX66jjn$$S%0
r   c                J    t        t        j                  j                  |      S r   )r  r+  opsr  )rf  r  s     r   _unpickle_c_opz!GuardsStatePickler._unpickle_c_op  s    uyy||T**r   c                .    t        j                  ||      S r   )r1  r3  )rf  funcr  s      r   _unpickle_bound_methodz)GuardsStatePickler._unpickle_bound_method  s    d++r   c                ^    t        t        j                  j                  j                  |       S r   )r  r+  r/  	attention
SDPBackendr  s    r   _unpickle_sdp_backendz(GuardsStatePickler._unpickle_sdp_backend  s!     uxx))44d;;r   c                J    dfd}|j                   J |j                   d   S )Nc                      S r   r  )r  s   r   r7  z,GuardsStatePickler._unpickle_cell.<locals>._&  s    Jr   r   )r   r   )r   )rf  r  r7  s    ` r   _unpickle_cellz!GuardsStatePickler._unpickle_cell$  s)    	 }}(((}}Qr   c                   dd l }t        |      | j                  v r!t        |      j                  t        |      ffS t        |      | j
                  v rt        dfS t        |t        j                        r|j                  j                  dk7  rddlm} t        |      | j                  vrt        dfS  ||      rg }|j                         \  }}|D ]h  }t        ||      }t        |t        j                        r|| j                  t        |      <   | j!                  |      \  }	}
|j#                  ||	|
f       j t        |       j$                  t        j&                  |d      |j                  t        |      t        j(                  j+                  |      j-                         ||ffS t        |       j.                  t        j&                  |d|j0                        |j                  t        |      t        j(                  j+                  |      j-                         |j2                  ffS t        |t        j4                  j6                        rt        |      | j                  vrt        dfS t        |t        j4                  j8                  j:                        r&t        |       j<                  |j?                         ffS t        |      j@                  t        |      jB                  k(  rtD        S |jF                  j>                  t        j4                  j6                  j>                  k(  rXt        |       jH                  |j?                         ffS tK        jL                  |      r"t        |       jN                  |jB                  ffS t        |t        j(                  jP                        r&t        |       jR                  |j-                         ffS t        |t        j(                  jT                  jV                        r&t        |       jX                  |j[                         ffS tK        j\                  |      rIt_        ||j`                        r3tc        |d	      r'tc        |d
      sJ |jd                  |jf                  ffS t        |t        jh                        rtk        d| d|jl                   d      t        |tn        jp                        r&t        |       jr                  |ju                         ffS t        |t        jv                  jx                  jz                        r!t        |       j|                  t        |      ffS t        |t        j                  j                        r=|j                  j                  d      r"t        |       j                  |jB                  ffS |jF                  j                  dk(  r!|jF                  jB                  dk(  rt        dfS t        |t                     rt        dfS tK        j                  |      r|j                  j                  tJ        j                  z  rt        dfS |j                  t        j                  v r"t        j                  |j                     }|j@                  j                  d      D ]  }t        ||d       } ||urt        dfS tK        j                  |      rl|j                  }	|j                  }t        ||	jB                        }tK        j                  |      r|j                  }|	|urdt        |       j                  |	|ffS t        |t         d d      j                  d               r"t        |       j                  |j                  ffS tc        t        j                  d      rMt        |t        j                  j                  j                        rt        |      | j                  vrt        dfS t        |t        j4                  j                  j                        r"t        |       j                  |j                  ffS t        |      j@                  t        |      jB                  k7  r?t        jv                  j                  j                  dt        |       d| ddz   dz         tK        j\                  |      rtc        t        j                  d      rt_        |t        j                  j                  j                  j                        r|t        j                  j                  j                  j                  ur|j                  d   }t_        |t        j4                  j6                        sJ |t        j                  j                  j                  j                  j                         v sJ t        |       j                  |ffS tD        S ) Nr   )zmissing valuesmeta)is_traceable_wrapper_subclass)ztensor guard tree)r  )r  r  )zmodule guard tree_torch_handler_name_torch_unpicklerzCannot serialize SymInt z (node: rQ  z_C::rF  	PyCapsule)capsule)unsupported)znested functionr9  )zfqn mismatchc                      fdS )Nc                      S r   r  r  s   r   r  zGGuardsStatePickler.reducer_override.<locals>.<lambda>.<locals>.<lambda>  s    Q r   r  r  s   `r   r  z5GuardsStatePickler.reducer_override.<locals>.<lambda>  s    Y r   distributed_c10d)zdistributed_c10d.Workr  r  r  r  r   r   r,  )dsympyrW  r  r;  r  r  r  r   r+  r,  r  torch.utils._python_dispatchr  rQ  r  r  reducer_overridert  r  
empty_liker  rH  r  r  r  r  r/  r0  r  r  r  __getstate__r   r   NotImplementedr   r  r  r  r  r   r  rP  r  r  	serializer  r  Functionrf  r  r  r  r  r   r1  r  r  rH  r  r  r   r  r  _opsOpOverloadPacket_qualified_op_name
startswithr  r   r  
isfunctionr   co_flags	CO_NESTEDrs  modulesrr  ismethodr   __self__r  r   r  r(  r  r$  Workr  r  r  r  rR   PackageErrorr   r  
FSDPModuler   r  r  )r   r  r%  r  r  attrsr  r  innerr  
args_tuplefr  method_self
inner_funcr  s                   r   r'  z#GuardsStatePickler.reducer_override-  s    	c7d'''9$$tCyl22c7d)))000c5<<(SZZ__-FR#wd444!777,S1  
 335
s! @D#C.E!%6<A..r%y9'+'<'<U'C$D*%%tT:&>?@ DzFF$$S8JJIHH++C099;I   :..  V3CTCTU

S	'',5571   UXX__-#wd444!777
 #uxx00HHIDz669I9I9K8MMMCy%%c););;%%}}))UXX__-I-IIDz22S5E5E5G4IIIc":55FFUXX445:883<<>:KKKUXX00==>:==?QQQ OOC 3/233 2333''#*A*A)CCCU\\*!9#hsxxjPQRSSU334:55
}DDU]]00::;:11DI<??,,
$$//7:,,s||o== MM$$
2&&+5 \))356---$||$$w'8'88!555~~,KK/,,2237 /D4.A/C<#%666c"<<D,,K dmm<J
+'00
:%Dz884:MMMT#6":"F"Fq"IJK:,,s/@/@.BBB5$$&89j""3388?
 #wd444!;;;c588--889:33chh[@@9!!T#Y%7%77--##00S	{,se3DETUTU  OOC ))623 1 1 6 6 C C N NO%++00==HHH #A!-AAA!((--::GG[[]^^ Dz<<}>NNNr   )rQ  dict[int, Any]r  r@  r  r@  r   r   r  r   r   r   )r  r   r   ztorch.nn.Module)r  torch.Tensorr  torch.devicer  r;  r  r  r  rA  r   rA  )r  rA  r  rB  r  r;  r  r  r  r   r  z5list[tuple[str, Callable[..., Any], tuple[Any, ...]]]r   rA  )r  r   r   ztypes.ModuleType)r  r  r   ztorch._C.DispatchKeySet)r  bytesr   z torch._C._functorch.CInterpreter)r  rq  r   z types.MappingProxyType[Any, Any])r  	list[Any]r   r   )r  type[torch.nn.Module]r   rE  )r  zdict[str, Any]r   z)torch.nn.parallel.DistributedDataParallel)r  r   r   r   )r  r   r  r   r   r   )r  r   r   ztorch.nn.attention.SDPBackend)r  r   r   r   )r  r   r   z6Union[tuple[Callable[..., Any], tuple[Any, ...]], Any])r   r   r   r   r5  r  r  r  r  r  r  r  r  r  r  r  r  r4  r  r  r'  r   r   s   @r   r  r    s5   -)- %- '	-
 - - 
-  
 !  	
   
 ( !  	
   J 
 , . . ? ? BB	)B B
 ))	)) )
 + + 
1
	
 
 "	2  + + , , < <    [[	?[r   r  c                   t        j                         }i }i }t        j                  | j                  j
                        }|D ]  }t        j                  |      rYt        |d      rM|j                  }t        |      |vs>	 t        |      j                  t        |             ||t        |      <   qt        |      |vs||t        |      <    t        ||||      }	 |j                  |        |j+                         S #  Y xY w# t        $ r8}	t         j"                  j$                  j'                  t)        |	            |	d }	~	ww xY w)Nr6  )ioBytesIOr  tree_leavesrT  r]  r  r5  rf  r6  rW  r;  r  r  dumpr  r+  r  rR   r8  r   rg  )
r  rQ  bufr  r  leavesleafr  picklerr  s
             r   pickle_guards_staterO    s&   
**,CLN 2 2 > >?F ,D!gdJ&?==D$x00J&&tDz2-1LD* X.. (,N2d8$, !!2L.RUVG<U <<>  <mm,,SV4!;<s$   1D"D
 D
	E3EEc                      e Zd ZU 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdZded<   	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZdd	Z	dd
Z
ddZy)ro  Nc                    |r|j                   nd }i  _        t        |      }| _         j                  J | _        |r|j
                  nd  _        t                _        t                _        t                _	        | _
        d  _        d  _        t        d      st        j                  d       t         j"                  j$                  j&                  r|xs d dfd}t)        |xs dt*        j,                        }|r j/                  ||||d|
      \  }dfd	} ||D cg c]
  } ||       c}      }t1        |      t1        |      k(  sJ t3        d
 |D              sJ t5        |      D cg c]  \  }}||   s| }}} j/                  ||||||
      \  }| _         j9                  ||       j:                   j6                  _        t<        j?                  d j6                         j:                   j6                  _        d|j@                  s|jB                  s j6                  jE                  |jF                        sCtI         j6                  |jF                  tK        jL                         d       }tO        d|       tP        !tQ         j6                  |jF                         tS         j6                  jT                  |jF                  d      t<        j?                  dd       tW        jX                  dt[                     d  _.        |rAddl/m0} tc         j                  |      sJ 	  je                  | j                         _.        t         jv                  jy                  d fd        j                  j{                          d  _        y c c}w c c}}w # tf        jh                  $ r|}t         j"                  j$                  jj                  s|	r| j                  jm                  dto        |       tq        jr                         ju                  d             Y d }~d }~ww xY w)Nr;  z9guard_nn_modules is turned off using justknobs killswitchc                ,    | D cg c]  }d c}S c c}w r  r  )gsgs     r   r  z/CheckFunctionManager.__init__.<locals>.<lambda>  s    R>Pt>P >Ps   	c                l   g }t         |       |       D ]  \  }}|s|j                  d       |j                  dv sd|j                  v sd|j                  v rGt        j                  d|j                  |j                  j                         |j                  d       |j                  d        |S )NF)r9  r  r  r#  r9  r#  z7%s guard on %s is dropped with caching_precompile=True.T)r  rt  
guard_typederived_guard_typesr   r  
orig_guardr  )r   r  keeprT  _guard_filter_fns       r   guard_filter_fnz6CheckFunctionManager.__init__.<locals>.guard_filter_fn  s    "#3F#;VD )GD!

5) &)>)>>)Q-B-BBULLLL--
 

5)

4(+), 
r   r  )r  F)rE  c           	     D   t               }t        | j                        }|dk(  rd}|}n	 j                  |       }d}t	        | j
                        d u}t        |||| j                         | j                  rt        | j                        nd||       S #  |}d}Y `xY w)Nrd  FTr  )r  	has_valuer  rV  rW  	is_globalrX  )
objectstrip_local_scoper  rV  r+   r#  r   create_fn_nameguard_typesr9  )rJ  MISSINGr  r]  r  r^  builders         r   make_guard_filter_entryz>CheckFunctionManager.__init__.<locals>.make_guard_filter_entryB  s     ((42: %I#E	*
 !(E 2$(	 353K3KLTXX	''$335494E4Ee//02'$
 
	* '$)	s   B Bc              3  >   K   | ]  }t        |      t        u   y wr   )r;  r   )r  rl  s     r   r  z0CheckFunctionManager.__init__.<locals>.<genexpr>d  s     ?1tAw$?s   %sg        )backendziGuard failed on the same frame it was created. This is a bug - please create an issue.Guard fail reason: rO   zGuard eval latency = %s us.2fguard_latency_usr   r  zGuard evaluation failed: r  )	tracebackdynamo_cpp_guards_strc                 *    j                    d ddS )Nz
Guard latency = ri  z us)rS  )latencyr   s   r   r  z/CheckFunctionManager.__init__.<locals>.<lambda>  s     $"4"4!55GPS}TWX r   
payload_fn)r   zlist[GuardFilterEntry]r   z
list[bool])rJ  r:   r   r   )>r   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesrT  r  r  rK   r  r  r  rD  r  r  rD   r   r  r+  r  rP   caching_precompiler   r:   sort_keybuild_guardsr   r  rj  rS  compile_check_fnr   r  r  skip_guards_checkr  rj  r]  get_guard_fail_reason_helperr7   rl  r  r   r$   r   r5   increment_toplevelr  guards_stater  r   r   serialize_guardsrR   r8  strict_precompilebypass_packager   rk  
format_excrr  _loggingtrace_structuredclear)r   r<  rT  r   r   r[  r  rD  rR  strict_errorrE  r   existing_diff_guard_sourcessorted_guardsrS  re  rJ  filter_resultsr  reasonsr   r  rZ  rd  rn  s   `                     @@@r   r   zCheckFunctionManager.__init__  s#    )5$$$;= B+N 	$ :F  ,,, !1
 7CL22 	& 3=,;E<'<FL($8!PTPT/BCKKST ==22.Q3P4 v|@ &*%6%6+!1 &7 &"G]< -=JKE(/KN ~&#m*<<<<?????&/&>"!U.QRBSM 
 "&!2!2'- "3 "
 +g}mD .5-D-D*t112-4-D-D* --l6I6I%%++L,D,DE6&& ,,"557 	 %**14 
 -8-&&(@(@' ,""'')A)A1G 9gc]L 112Dc'lS-1Dd//1BCCC
$($9$9]D,=,=%! 	''#X 	( 	
 	 ] Lh ## ==''99\G!!00/Ax8'224::4@ 1  s+   2N>OO"O	 	QA2QQ)r#  r  r9  r  r  r  r  r  ztuple[LiteralString, ...]%UNSUPPORTED_SERIALIZATION_GUARD_TYPESc                >   |D ]  }|j                         }|j                  rt        |j                        nd}|dv r*|j                  sG|j	                  |      }t        |       d|t        j                  v r,t        j                  j                  j                  | d      t        d |D        d       x}st        j                  j                  j                  | d       |j                  xs dt               t               dfd}	|j                         }
|D ]`  }t!        |j"                  t$              r2| j&                  sJ | j&                  j(                  D ]
  } |	|        O |	|j"                         b |j*                  D ]
  } |	|        dd|
j,                  j/                         D ci c]  \  }}|v s|| j0                  v r|| }}}|
j,                     j/                         D ci c]  \  }}|| j2                  v r|| c}}|<   t5        j6                  |
|
j8                  j/                         D ci c]  \  }}|v s|| j:                  v r|| c}}|t        j<                  j?                  tA        fd|D                    tC        jD                  tF        |
jH                        d	
      }
tK        |
| j&                  |jL                        }tO        ||jP                        S c c}}w c c}}w c c}}w )Nr  )r  r  z guard cannot be serialized.c              3  D   K   | ]  }|t         j                  v r|  y wr   )ro  r  )r  r  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>  s'      0VVV s    rd  c                    t        |       x}r*t        |t              sJ |k7  rj                  |       y y t	        |       x}r$t        |t              sJ j                  |       y y r   )r+   r   r   r   r,   )rU  r  builtins_dict_nameused_global_varsused_local_varss     r   prune_variablez=CheckFunctionManager.serialize_guards.<locals>.prune_variable  st    -f55t5!$,,, --$((. ..v666!$,,,##D) 7r   c                8   t        | t        j                        rxddt        fd| j                  D              }| j
                  j                         D ci c]  \  }}| |       }}}t        j                  | j                  g|i |S | S c c}}w )Nc                T    t        | t        t        j                  f      r |        S | S r   )r   rN   rA  r  r  s    r   _refzPCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>._ref   s!    !!mW[[%AB s
Hr   c              3  .   K   | ]  } |        y wr   r  )r  r  r  s     r   r  zUCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>.<genexpr>%  s      9Qa 9s   )rl  r   r   r   )r   	functoolspartialr9  r   keywordsr   r  )rl  new_argskvnew_keywordsr  s        @r   normalize_create_fnzBCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn  s    !Y../
 ! 9!&& 9978zz7G7G7IJtq!47
JJ ((K(KlKKH  Ks   Bc           	   3  p   K   | ]-  }t        j                  |d d  |j                               / y w)N)obj_weakrefguarded_class_weakrefr  )r  r  r  )r  rJ  r  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>@  s@         ''$(.2"5eoo"F	 s   36T)r]  r   _guardsrP  rw  )rT  r  rE  )rU  r>   r   r   )rl  Callable[..., None]r   r  ))ra  rb  r9  r  rV  r  ro  r  r+  r  rR   r8  next%name_of_builtins_dict_key_in_fglobalsr   dump_guards_stater   r#  ru   r  r  rU  r   r   r  r  r  r  r]  r  r  	GuardsSetrK   r  tree_mapr  rP  r  rE  rO  rQ  )r   rd  r  rT  rJ  rV  rW  r  failedr  output_graph_guards_staterU  r  r  global_scope_staterz  r  r  r  r  s                   @@@@r   r{  z%CheckFunctionManager.serialize_guards  s7    # 	E--/J>C>O>O%(9(9":UW <<((!++e,C*3/2XXXmm''44!l">?   0
    mm''44h:; 3	: *OOUSU5%
	* %1$B$B$D!" 	9E%22NC,,,,"33EE +F"6*+ u778	9 #55 	#F6"	#	  2>>DDF
1$$T-M-M(M qD
 
 2>>"eg	2
1 D***	 qD2
-. %0$7$7% 6AAGGIAq'10O0O+O 1
 ,MM++  "/ 
 +1//.)GG+ #/%
!2 #2!22$55
 #<1J1JKKW

2
s   L	LLc                   t               }||_        d dfd}t        || j                  || j                  |j
                  |j                  || || j                  |      }	d	d}
t        j                  |	|
      t        j                  xr t        d      }|D ]`  }|sK|j                         r;d|j                  vr-d|j                  vrt        j                  sd|j                  vrP|j!                  |	       b |	|fS )
Nc                    | j                   }|t        j                  u r| j                  S sJ         }|J |j	                  | j                        S r   )guard_sourcer=   CONSTANTr  r  )rU  r  	r_builder	w_builders      r   r>  z5CheckFunctionManager.build_guards.<locals>.source_reff  sV    !..L{333{{"9!I((($$V[[11r   )rD  rE  c                &     |        }|rd |_         y y r   )r@  )weak_br  s     r   cleanup_builderz:CheckFunctionManager.build_guards.<locals>.cleanup_builder  s    A r   r;  r   r   rY  )rU  r>   r   r   )r  zweakref.ref[GuardBuilder]r   r   )r   r   r0  r=  r?  r]  r   rD  rA  r  rP   r[  rD   r$  r  r  r  )r   r  r  r<  rT  rR  rE  rS  r>  rd  r  guard_on_nn_modulesrJ  r  s                @r   ru  z!CheckFunctionManager.build_guardsX  s    ,-+F(		2 KK  $$%%!%!:!:-
	 KK9	$55 
//;
 # 	"E'224 #%**4$EJJ655

9RLL!	" %%r   c                8	   |j                   }|dgz  }t        j                  d       g g g | j                  j                  j                  t        t        j                                      d | _	        	 d	 	 	 	 	 	 	 dfd}t               }|j                  D ]=  }|j                  D ],  }||vs |||j                  d       |j                  |       . ? |j                  }	d }
d }t!        |	      dkD  r-t#        |j$                  |	ddj'                  |	      z   dz   g       t(        j*                  rA|j,                  r5t/        t0        t3        |j,                         \  }}|j5                  ||       | j6                  r| j6                  j8                  ng }|D ]L  }t;        |t<              rj|j>                  }|j@                  }|jB                   d	|jB                   }tE        |jG                  |      |jG                  |      |g        ||d d       ~t;        |tH              r|jJ                  D cg c]  }|jG                  |       }}|jL                  D cg c]  }|jG                  |       }}d
dj'                  d |jJ                  D               ddj'                  d |jL                  D               d}tO        |||g        ||d d       AtQ        d|        |jR                  D ]'  }|j                  D ]  } |||j                  d        ) r$tT        jV                  jY                  dfd       tZ        j\                  t[        j^                         j`                  }ntc        | jd                  dd       }|
||| jf                  dth        tk               }| j                  jm                          d|jn                  d   i}t!              dk(  sJ || j                  _8        || j                  _9        | j                  ju                          | j                  _;        || j                  _<        || j                  _=        d | j                  _>        d | j                  _?        |	| j                  _@        y c c}w c c}w )Nz**___kwargs_ignoredzGUARDS:c                $    t               }t        j                  d|       j                   fd       t        j                  t        j                        rd}d}pj                  r,ddj                  j                  j                                }j                  r,ddj                  j                  j                                }t        j                  d ||       |s#j                          j                  |       y y )Nrg  c                      r9j                   r-t        j                  j                   j                               nd r-j                  r!t        j                  j                        dS d dS )N)r   r  r  )r  rC   from_tracebackr  r  )rw  rJ  s   r   r  zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>  sg    % !U[[ #11%++2E2E2GH! !U%5%5 #11%2B2BC  " r   rd  z
Stack:
z
User stack:
zGuard: %s%s%s)r  r  r  rt  verbose_guards_logisEnabledForloggingDEBUGr  r  formatr  )	rw  rJ  log_onlyrv  maybe_stackmaybe_user_stackr   structured_guard_fnsr   s	   ``    r   add_code_partz<CheckFunctionManager.compile_check_fn.<locals>.add_code_part  s     !6i GT#45 ''  "..w}}= #% ${{(22775;;;M;M;O3P2Q&R''-bgge6F6F6M6M6O.P-QR ) #((#$	 !!),"))*;< r   TrO   zcheck_no_aliasing(rP  rQ  r  zcheck_overlapping(overlapping=[c              3  4   K   | ]  }|j                     y wr   r  r  rW  s     r   r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>$  s     /Z1/Z   z], non_overlapping=[c              3  4   K   | ]  }|j                     y wr   r  r  s     r   r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>%  s     3bqAFF3br  z])zUnknown GuardEnvExpr: dynamo_guardsc                 8    D  cg c]	  }  |         c} S c c} w r   r  )r=  r  s    r   r  z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>;  s    BV4WQQS4W 4Ws   ro  rj  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr4  r   r   )rw  r   rJ  Optional[Guard]r  r   r   r   )ArL  r  r  rS  r   attach_compile_idr   r7   rl  r  r   r   r)  rJ  r   rN  r   r   rO  r  rP   r  rZ  rX  r  r  r  rT  aotautograd_guardsr   r9   input_source_ainput_source_br  r    r  r?   overlapping_sourcesnon_overlapping_sourcesr!   r  rM  r+  r  r  rQ   initial_global_stateGlobalStateGuardrj  r  r  r  rI   r  r  r@  r   r   r|  r   r   r   r   r   r   )r   rd  
guards_outr   largsr  seengclr   rN  check_tensors_fncheck_tensors_verbose_fnaliasing_code_partsaliasing_verbose_code_partsr  rJ  source_ar  rw  rW  overlapping_guard_managersnon_overlapping_guard_managerscheck_global_stater   r  r   r  r   s                            @@@r   rv  z%CheckFunctionManager.compile_check_fn  s      '((#
CE 	111134	

 *.& FK)	=)	=#2)	=>B)	=)	=V u<< 	#C #t# "$		48HHTN#	# $+#C#C #' '(1, -99(%		2J(KKcQR  6633?Bc7>>?@<!< 88#%@
 594E4ED002 	 (  	EE%1 // //'}}oT(--A	-99(C99(CK
 it4E>2 #66. 99!<.* . #::2 99!<2. 2
&&*ii/Z@Y@Y/Z&Z%[ \**.))3bEDaDa3b*b)ccei 
 2.2K
 it4"%;E7#CDDA 	EH )) 	5C 5 dCIIt45	5  NN++,W ,  --5!.!?!?!A!G!G!():):GT!J 0(@%7262Y2Y	

 
  !
 	##% #W]]3%78 :!###*6'"'<<>0B-*>'+8( *.&)-&8P5I.2s   =R%Rc                T   t        | d      rt        | j                  t              s| j                  j                  x}h| j                  j
                  x}Ot        |t              sJ t        |t              sJ d| d}t        |      }|j                  ||       || _        y y y y y )NrS  zCache line invalidated because z got deallocated)	rf  r   rS  r  r   r   r   r   
invalidate)r   obj_strr   r   r  deleted_guard_managers         r   r  zCheckFunctionManager.invalidate`  s    
 D/*t113MN $ 2 2 > >>K $ 2 2 > >>Kk:666k:6666wi?OPF$>v$F!"";0EF!6D L L O +r   c                :   	 t        |      | j                  vr`t        j                  |      | j                  t        |      <   t        j                  |t        j                  | j                  |             t        |      S # t        $ r Y t        |      S w xY w)zadd a weakref, return the id)r  )	rW  rq  rA  r  r  r  r  r  r  )r   r  r  s      r   r=  zCheckFunctionManager.id_refs  s    
	#wdnn, +2++c*:r#w'  **4??GL
 #w  	#w	s   A7B 	BBc                b    t        |      | j                  v r| j                  t        |         S y)zFLookup the _weakrefs created in id_ref function for ID_MATCH'd objectsN)rW  rq  )r   r  s     r   r?  z$CheckFunctionManager.lookup_weakrefs  s(    c7dnn$>>"S'**r   )NNNNNFFN)r<  rm  rT  r   r   Optional[CacheEntry]r   %Optional[Callable[[GuardFail], None]]r[  z8Optional[Callable[[list[GuardFilterEntry]], list[bool]]]r  r  rD  rp  rR  r   r  r   rE  rp  )rd  r0  r  list[Guard]rT  r   r   rC  r   )r  r  r  r}  r<  rm  rT  r   rR  r   rE  rp  r   z(tuple[GuardBuilder, GuardManagerWrapper])rd  r0  r  r  r   r  r   r   )r  r   r   r   )r  r_  r  r   r   r  )r  r_  r   zOptional[weakref.ref[object]])r   r   r   r   r  r   r{  ru  rv  r  r=  r?  r  r   r   ro  ro    st   
 -1?C 599=!"59c!c! (c! *	c!
 =c!
c! 3c! 7c! c! c! 3c!J	H)+D 	zLzL #zL (	zL
 
zLF 6:@&"@& &5@& 	@&
 -@& @& 3@& 
2@&DDQDQ  DQ =	DQ
 
DQL7&r   ro  c                ,  	 ddl m} t               		 	j                  |        d	fd} |       }| D ]]  } ||      \  }}|j                  |       |j                  d| d       |j                         5  |j                  d       d d d        _  |       }|j                  d       |j                         5  |j                  |       |j                  d	       d d d         |       }|j                  d
| d       |j                         5  |j                  |       |j                  d       d d d        |j                         |j                         fS # t        $ r dd}Y Cw xY w# 1 sw Y   HxY w# 1 sw Y   xY w# 1 sw Y   VxY w)Nr   r@   c                &    j                  |       S r   )r  )r  csepasss    r   r  z%build_guard_function.<locals>.replace  s    ??4((r   c                
    g | fS r   r  )r  s    r   r  z%build_guard_function.<locals>.replace  s    t8Or   zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr  )
torch._inductor.utilsrA   rt  r  RecursionErrorra  r   rZ  splicerg  )
r   closure_argsrA   r  
guard_bodyr  r  rJ  make_guard_fnr  s
            @r   r  r    s   4oG
j!	)  !J 1g&xvR01  	1  0	1 	1	1 E	OOO$	 'Z &' #$M3L>DE				 0U#/0  -"8"8":::?  		1 	1' '0 0s5   E 7E1;#E>#F
E.-E.1E;	>F
Fc                 h    t         j                  j                  j                  j	                  d      S )Nr   r+  r  	_internal	log_stateis_artifact_enabledr  r   r   is_recompiles_enabledr    s#    >>##--AA,OOr   c                 h    t         j                  j                  j                  j	                  d      S )Nr   r  r  r   r   is_recompiles_verbose_enabledr    s$    >>##--AABVWWr   c                P    | D cg c]  }t        |       c}dfd}|S c c}w )Nc                     t               } t        |       t              k7  ryt        |       D ]  \  }}|t        |      us y yr"  )r   r   r  r;  )	cur_stackr	  moder1  s      r   check_torch_function_mode_stackzMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stack  sL    13	y>SZ'E9- 	HBd#	 r   r   r   )r;  )initial_stackrl  r  r1  s      @r   r  r    s+     ,,T!W,E
 +* -s   #Scopec                |   | j                   J t        | j                         }t        j                  t              }| j
                  D ]1  }||d<   t        t        |||            }||   j                  |       3 |D cg c]  }t        ||         dkD  s||     }}dj                  |      }d| gS c c}w )N__compile_source__rO   rP  zDuplicate tensors found: )r   r  r  r  r  r   rW  evalrt  r   r  )	rS  r@  r   ids_to_sourcerD  	tensor_idr  duplicate_tensorsr  s	            r   1recompilation_reason_for_no_tensor_aliasing_guardr    s     %%111223L++D1M&AA 7-:)*tM<?@	i ''67 ,9$'Cc@R<SVW<W=
  YY()F'x011s   B9B9c                4    ddl }d}|j                  |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)rW  r
  patterns      r   r`  r`    s     +G66'5!$$r   c                   | j                   J | j                  J || j                   d   d}|j                  | j                         g }d}| j                  r| j                  j                  }d}g }| j                  |      }	|	j                  s)|	j                  }t        |      dk(  r;d|d   v rd}n1|}g }n,||k7  rd	}
|j                  |
       nd
}
|j                  |
       |rt        | |      }n|D ]  }t        | j                         }||d<   t               5  	 t        |||      }	 ddd       t!        t"              r|s|}t!        |t$              sd|j                  |       t               r n | ddj'                  |      z   }t)        |      S # t        $ r t               r
Y ddd        w xY w# 1 sw Y   xY w)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.
    Nr4  r2  FrO   zDuplicate tensor foundr   Ta  BACKEND_MATCH failure: torch.compile detected different backend callables. If this is unexpected, wrap your backend in functools.partial (or reuse the same cached backend) to avoid creating a new backend function each time. More details: https://github.com/pytorch/pytorch/issues/168373zUnexpected recompilation: runtime guards failed even though they passed during recompilation-reason analysis. Please open an issue with a minimal repro: https://github.com/pytorch/pytorchr  rI  z; )r   r   r  r   rh  rn  resultr   r   rt  r  r  rM   r  r<  r  r   r   r   r  r`  )rS  f_locals
compile_idrh  r@  r  cache_entry_backendno_tensor_aliasing_check_failedr   guard_debug_infor  rM  r   fail_reason
reason_strs                  r   rx  rx    s    %%111%%111!;!;C!@AE	LL++,G  +77??&+#$&$228< ""-@@ !"a''+=a+@@26/,%'"		'N 	 	v2 	 	v&C5
 ' 	D : :;L15L-./1 "&t\5"AK +t,["+s+{+46'	* <r"TYYw%77JZ((! ! 46   	 s*   F> FF;/F>9F;;F>>G	c                Z   t        | t              r| d| j                   S t        | |||      }|r|S t        t
        |      j                  |       	 | j                  &| j                  t        |xs dt
        |                |S # t        $ r t        j                  d       Y |S w xY w)NrI  zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   r  r  rx  r   r   rt  r   r   r<  r   r  )rS  r   r  r  rh  skip_loggingr  s          r   get_guard_fail_reasonr  Q  s     -!;<R A ABCC-xWJ =&'..z:
&&2''*8(8-:MN   
d	
 
s   2B B*)B*c                d  
 g 
| Zt        | j                  | j                  |j                  | j                  ||      }|r
j                  |       | j                  } | Z|j                  }|r
S t               xs
 t               }|st        j                  rt               r"dj                  d t        
      D              }n%t        j                  dj                  
      d      }d| }d|j                    d|j"                   d|j$                   dt        j                  |d	       }	|r5t               rt&        j)                  |	       nt*        j)                  |	       t        j                  rt-        j.                  |	      t0        j2                  j5                  d
d 
f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.
    z

c              3  \   K   | ]$  \  }}d | dt        j                  |d      z    & yw)zguard z failures:
- N)r'  rZ  )r  r  r  s      r   r  z:get_and_maybe_log_recompilation_reasons.<locals>.<genexpr>  s5      #Av <(8??64+HH#s   *,r  r  z-triggered by the following guard failure(s):
zRecompiling function z in :z    artifactc                     dddS )Nrecompile_reasonsr  )r  encodingr  r  r   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    '
 r   c                      S r   r  )r  s   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    7 r   )metadata_fnrp  )r  rS  r   r  r  rt  r  r<  r  r  rP   error_on_recompiler  rj  r'  rZ  ra  co_filenameco_firstlinenorecompiles_verbose_logr  recompiles_logrR   RecompileErrorr+  r  r  )r   framerh  r  r  r   do_recompiles_logfailuresguard_failure_detailsmessager  s             @r   'get_and_maybe_log_recompilation_reasonsr.  o  s    G

!&%%NN""
 NN6"!&& 
! <<D-/R3P3RF55(*{{ #!*7!3# H
  tyy'94@H<XJG 	 $DLL>d6F6F5GqI\I\H]]_4f=>@ 	 ,.&,,W5$$W-$$$$W--	NN##
 # $  Nr   c                   | }t               }| 8|j                  | j                  j                                | j                  } | 8|} | :|| j                  _        | j                  j                          | j                  } | :|S r   )rK   r  rS  r  r  r   r
  )r   first_cache_entryacc_diff_guard_sourcess      r   rr  rr    s     $
 /9l

!%%%%@@B	
 "&&	 
! $K

!7M!!4!!==?!&& 
! "!r   c                   t        d|j                   d|j                   d|j                          t        ddj	                  | j
                        z   dz          t        ddj	                  | j                               t        |        d|i| j                  }| j                  D ]  }	 t        || j                  |        y #  t        d|        Y 0xY w)	NzERROR RUNNING GUARDS  r  zlambda rP  z and
  r3  zMalformed guard:
)
printra  r$  r%  r  r   r   r   r  r   )rS  r   r  r   lastr]  rJ  s          r   guard_error_hookr6    s     

~Qt/?/?.@$BUBUAVW 
)dii 2 23
3c
9:	#z}7789	-?M$>$>?K)) 0	022K@0	0&ug./s   -CCc              #  b   K   t               }| D ]  }||vs| |j                  |        y wr   )r   r   )seqr  rl  s      r   uniquer9    s3     5D D=GHHQKs   //c                   |r|| k7  rt        |      }t        |       }t        |      st        |       r/t        j                  | j                   d|j                   d      ||k(  r%t        j                  t        j                  |      S y )Nz is aliasing zC. This is not supported. Please do a clone for corresponding input.)r  )	r/   r.   rR   UnsafeScriptObjectErrorr  r  r  r0  r  )
obj_sourcedupe_sourceser_source_is_localsource_is_locals       r   make_dupe_guardr@    s     {j02;?.z:/
1*=--??#=1A1A0B C> ?  /1 $$\%A%AKXXr   )skipc                v   ddl m} t        j                  t        j
                        xs# t        j                  t        j
                        }|j                         j                  j                  j                  }|D ]8  }t        |t              sJ t        |j                        r+ |||| dz          : y)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   )TracingContextrO   )collect_debug_stackrA  N)torch._guardsrC  r  r  r  r  r  rV  guards_contextr  r   r   r:   r1   r#  )rA  r   rC  rD  r   rJ  s         r   install_guardrG    s     -$11 8		(	(	7  



-
-
;
;
?
?C K%'''$U%=%=>E':J	Kr   )r   rm  r   r   r   r  )r  r   r   rA  )r   zset[str])r   rn  )r   r  r   r   )rw  r   rJ  r  r   r   r   )r   zUnion[str, list[str]]rJ  r  r  r  r   r{  )r  r   r   zOptional[int])r  rD  r   list[Optional[int]])r  rA  r  r   r  rH  r  rH  r  r;  r  r   r   r   )r  rq  r  r   r   r  )rU  r   r   r   r   r   )r  r   r   r   )r  r   r   r   )rU  z3Union[DictGetItemSource, DictSubclassGetItemSource]r  r   r  r   r  r   r  r  r   r   )rJ  r:   r   r   )r   rm  r   r{  )r   ztuple[type, ...])r  r  rQ  r@  r   rC  )r   r{  r  r   r   ztuple[str, str]r  )r   z'list[torch.overrides.TorchFunctionMode]r   zCallable[[], bool])rS  r   r@  r  r   r{  )rW  r   r   r   )
rS  r   r  rn  r  zOptional[CompileId]rh  zOptional[Callable]r   r   r   )rS  r   r   rm  r  rn  r  r8   rh  r   r  r   r   r   )
r   r  r)  r   rh  r   r  r   r   r{  )r   r  r   r}  )rS  r   r   rm  r  rn  r   r  r5  r   r   r   )r8  zSequence[T]r   zGenerator[T, None, None])r<  r>   r=  r>   r   z Optional[functools.partial[Any]])r   r:   rA  r  r   r   (  r  
__future__r   r  rF  r  r  rb  r  r  r  rG  r  r  picklers  r'  rk  r1  ru  rA  
contextlibr   rH  r   r   typingr   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   rE  r7   r8   r9   r:   r;   r<   r=   r>   r?   r  rA   torch._library.opaque_objectrB   torch._loggingrC   torch._utils_internalrD   %torch.fx.experimental.symbolic_shapesrE   rF   rG   rH   rI   torch.utilsrJ   r  torch.utils._ordered_setrK   torch.utils._tracebackrL   rM   torch.utils.weakrN   rd  rP   rQ   rR   
eval_framerS   rU  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   r   r   r   collections.abcr   r   r   numpyr  ModuleNotFoundErrorr   r   r   r%  r   torch._Cr   r  r   r   r   	getLoggerr   r   r  getArtifactLoggerr  r'  r&  r  r7  r   r   r   r  cacher  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r   r&  r(  rc  r  r   r0  rt  r  r  r!  r  r  r  Picklerr  rO  ro  r  r  r  r  r  r   r_  r  r  r`  rx  r  r.  rr  r6  r9  r@  rG  r  r   r   <module>rf     sS  " # 
        	    
      %    @ @0$ 5 !    >      8   H
 
 
 1 = % 1  * / O * ( ( ,. . . . . . . . . . . .^       . ( KO G N
 =='TCLg!^^--hA
11(LI99"  ^^55h@PQ " ,~ ,@ @FT . . .2* 1>/ hh&&:: %6 %)% " 	&'K
  !	
  " 	*31 d#! ! $!*?*(* * 	*
 )* *Z
G   
tyy 
 8 8b 
# b 
lAR8 R8j$!4 $ $ $ $ 6 6 6    \ \~@[
 [
|);XPX
+:++( 	gtCK012&2/422&
%Y)&Y)Y) $Y)  	Y)
 	Y)D &
   	
   	D 	@%@@ @ 	@
 @F"%""600
0  0 	0
 0 
0. % &!!%+!%!H /0 KKO  0//0N  	Bs$   3T T/ T,+T,/T:9T: