
    9jrI                      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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 ddl m!Z!m"Z"m#Z# dd	lm$Z$ ddl%Z%ddl&Z%ddl'Z%dd
l(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO ddlPmQZQmRZR ddlSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ ddl]m^Z^ ddl_m`Z`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lmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ erddlmZ dZded <    e ej                               Z	 ddlZer$dd!lmZmZmZ dd"lmZ dd#lmZ dd$lmZmZ dd%lmZ  e#d&      Z ej                  eܫ      Ze%j                  j                  ed'      Ze%j                  j                  ed(      Ze%j                  j                  ed)      Ze%j                  j                  ed*      Zd+Zdd,Z G d- d.e^      Z G d/ d0      Zdd1Zej                  dd2       Zdad3ed4<   dd5Zdd6Ze%j                  j                  j                  Zdd8Z	 d	 	 	 	 	 	 	 dd9Zdd:Zdd;Zdd<Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd=Zdd>Zdd?Zdd@ZddAZ ej                  dBC       G dD dE             Z	 	 	 	 	 	 	 	 	 	 	 	 ddGZddHZej                   G dI dJ             Z G dK dFej                         Zej                  ddL       Z G dM dNe      Z e       ZddOZddPZddQZddRZ	ddSZ
ddTZddUZddVZddWZddXZdY ZdZ Z G d[ d\      Zd] Z G d^ d_eX      Z G d` da      ZddbZ G dc dde      Zej                   G de df             Zej                   G dg dh             Z G di dj      Zej                  ddk       Z G dl dmej8                        ZddnZ	 	 	 	 	 	 ddoZ G dp dq      Z ddrZ!ddsZ"ddtZ#	 	 	 	 dduZ$ e"dve%e&ef         Z'	 	 	 	 	 	 ddwZ(ddxZ)	 	 	 	 ddyZ*	 	 	 	 	 	 	 	 	 	 ddzZ+	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd{Z,	 d	 	 	 	 	 	 	 	 	 dd|Z-	 	 	 	 dd}Z.	 	 	 	 	 	 	 	 	 	 	 	 dd~Z/ e{e/       ddZ0	 	 	 	 	 	 ddZ1ddddZ2 e3e      D  ci c]"  }  e4 e4e|       dd      xa5	 | tj        $ c}} Z6ded<    e3e      D cg c]  }|d   jo                         r}|jq                  d      sk e9 e4e|d      xa:      rU e; e< e
jz                  tt              j|                        xa?      dk\  rt~        d   d7k(  r e@tt        d      s| c}}}ZAeAr eBddj                  eA       d      y# e$ r dZY w xY wc c}} w c c}}}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
NamedTupleNoReturnTYPE_CHECKING)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)get_opaque_obj_info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CellContentsSourceChainedSourceClosureSource
CodeSourceConstantSourceConstDictKeySourceCurrentStreamSourceDataclassFieldsSourceDefaultsSourceDictGetItemSourceDictSubclassGetItemSourceDynamicScalarSourceFlattenScriptObjectSourceFloatTensorSourceFSDPNNModuleSourceGenericAttrSourceGetItemSourceGlobalSourceGlobalStateSourceGlobalWeakRefSource
GradSourceImportSourceListGetItemSourceLocalSourceNamedTupleFieldsSourceNNModuleSourceNonSerializableSetGetItemSourceNumpyTensorSourceOptimizerSourceScriptObjectQualifiedNameSourceShapeEnvSourceSubclassAttrListSourceTorchFunctionModeStackSource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_torch_function_mode_stack get_torch_function_mode_stack_atguard_failuresistype	key_is_id	key_to_idnormalize_count_iternormalize_range_iterorig_code_maptensor_always_has_static_shapetuple_iterator_getitemtuple_iterator_lenverify_guard_fn_signature)Callablez%Callable[[Any, Any, Any], Any] | Noneguard_manager_testing_hook_fn)	GeneratorKeysViewSequence)Symbol)DispatchKeySet)OutputGraphCommonOutputGraphGuardsStateSerializedCodeTguards
recompilesrecompiles_verboseverbose_guards)__defaults____kwdefaults____code____closure____annotations____func____mro__c                \    t        |       }t        |      |j                  |      z
  dz
  }|S NrP   )&code_framelocals_names_reversed_cachedlenindex)codevar_nameframelocals_names_reversedframelocals_idxs       T/media/conek/DATA/Code/OCR/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_guardsrL   diff_guard_sources)r   r   s     r   __init__zGuardManagerWrapper.__init__  s    <(*DIDI8<37&*	%'4837AE.2.2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_managerI  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>.visitW  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_sources1  s,    	&	&	' 	dii&&&r   c                z    t         j                  rt        d      r| j                          | j	                          y )Nz3pytorch/compiler:use_recursive_dict_tags_for_guards)rQ   "use_recursive_dict_tags_for_guardsrE   find_tag_safe_rootsprepare_diff_guard_managerr   s    r   finalizezGuardManagerWrapper.finalizeb  s/    44A:
 $$&'')r   c                D    | j                          | j                          y r   )r  populate_diff_guard_managerr   s    r   r
  z.GuardManagerWrapper.prepare_diff_guard_manageri  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classmethodrQ   )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.  r2  r3  mark_tag_safe_root)r   r%  r   r  r   r   r  s      @@@@r   r	  z'GuardManagerWrapper.find_tag_safe_rootsm  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_managerG  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_fnW  s    &&(N::r   )rG  r   r   r   )r   clone_manager)r   rH  rI  s    ` r   rC  z-GuardManagerWrapper.clone_with_chosen_sourcesT  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_lines\  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_lineb  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   indentr[  construct_manager_string)r   r  bodyidxr   r   s         r   construct_dict_manager_stringz1GuardManagerWrapper.construct_dict_manager_stringn  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=)r]  get_leaf_guardsr   r%   r   r   
writelinesrQ  r   r   r   ra  r  r  r   r   r[  reprr^  )r   r  r_  rM  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)NrP    T)r   zTREE_GUARD_MANAGER:r&   get_epilogue_lambda_guards)r   r   r   r   r^  r   hasattrrh  rd  rQ  getvalue)r   r_  rM  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   rm  zGuardManagerWrapper.check  s    yyq!!r   c                8    | j                   j                  |      S r   )r   check_verbosern  s     r   rq  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   )rc  r   r%   r   r"  r   r   )r  rM  r   r{  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   )rx  r#   r   	list[str])r  r   r   r   )r   r   )r   r{  r}  r   s   `@@@r   !populate_code_parts_for_debuggingz5GuardManagerWrapper.populate_code_parts_for_debugging  s(    !$		! 	! 	diir   r   )r   zRootGuardManager | Noner   r   )r   zGenerator[None, None, None])r   OrderedSet[str]r   r   )rH  r  r   r&   )rM  r#   r   r~  )rV  r   rW  
str | Noner   r   )r  r   r_  r   r   r   )r  r   r_  r   r   r   r   ro  r   r   r   )ro  r   r   r   )r   r   r   __doc__r   r   r   r  r  r
  r	  r  rC  rQ  r[  ra  r^  rk  rm  rq  r   r   r   r   r   
  s    @, 3 3/'b*+X*t>2-2	2 GK
)
9C
	
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/dict[str, object] | None_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t        dd dt        dt        dt        j                   dt"        d nt"        j                   dt%        d      t&        j(                  t*        j,                  j.                  t*        j0                  t2        t*        j4                  t*        t6        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_count_iter___normalize_range_iter___tuple_iterator_getitem___dataclass_fields___namedtuple_fieldsc                    | j                   S r   _fieldsro  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   r   mathisnanr  float	importlibimport_moduler.  utils_devicer  r  _as_tensor_fullprecr  r  r   r   _get_closure_varsr    s<   

|
  7 7 C C
 I	

 |
  D
 $%7
 &';
 &';
 ()?
 "#3
 #$7
 23S
 $%7
 DJJ
  RZTRXX!
" 5<#
$ '44!KK//ll'!551
4 r   c                L    t        j                  |       j                  dd      S )N
rg  )astunparsereplace)r   s    r   _ast_unparser    s    ;;t$$T2..r   rM  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 )
Nrg  z  # T)r   i   r   z  # <unknown>z<60)
user_stackreversedfilenamer  rM   r   stacksummary)rz  rM  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        ||       }}|"t        |j                        }|r|r| d| n|}|r|D cg c]
  }| d| d }}|S c c}w c c}w )NrS   (HINT: rT  )r   listr  _get_closure_var_hintoriginating_source)r   rM  recompile_hintrz  r   closure_hintrP  s          r   get_verbose_code_partsr  '  s    
 j$' \
 BL4=i/  ,U-E-EF7E<.>"23<  ;M
37tfH^,A.
 
 '
s   A*A/c                    | y| j                   }| }|gt        |t              r6|j                  r*|t	        |j                         d }d|j                   d| S t        |t
              r|j                  nd}|gy)z
    Walk up the source chain to find a CellContentsSource ancestor.
    Returns a hint like 'guard on "varname".attr' or None if not found.
    Nz
guard on "")namer   rY   freevar_namer   rZ   base)rX  	full_namecurrentpath_suffixs       r   r  r  E  s    
 ~I#G

g12w7K7K
 $C$5$78K 4 45Q{mDD",Wm"D',,$ 
 r   c                    | y t        |       s| S t        | t        j                        sJ | j                  j                         S r   )rI   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  e  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(rS  z	, device=z, requires_grad=z, size=z	, stride=rT  )	r.  _C_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper  r   requires_gradr   )valuer  sizesstridespytypedispatch_keysdispatch_keyr  device_indexr  	guard_strs              r   get_tensor_guard_code_partr  i  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  ~  s     
 !#&'--c22r   c                    d|  d| dS )Nlist(dict.keys())[]r  )rX  r   s     r   get_key_index_sourcer    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    s8    

S	{,se+<=
L	M
L	M r   c                J    t        | t        j                  j                        S r   )r   r.  r2  r3  )r  s    r   $should_optimize_getattr_on_nn_moduler    s    eUXX__--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) FJ FJr   r  GuardManagerTypec                n   | 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              sN|j                  ||| j                  t        j                        j                  | j                  | d|gd        |j!                  ||	||      S )N[r  r   rX  example_valueguard_manager_enum == )r  r  r   r   r^   r!  r  r  r  r   intr   get_key_managerr  GUARD_MANAGERadd_equals_match_guardget_value_manager)
rX  base_guard_managerbase_example_valuer  r  base_source_namer   
key_sourcekey_example_valuevalue_sources
             r   getitem_on_dict_managerr,    s9    {{''&,, 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Dd
 //#-	 0  r   c                    | j                   }t        |t              ry| j                         ry|j	                         xr t        |t
               S NFT)r  r   rt   is_specialized_nn_moduleis_dict_keyrm   )rM  rX  s     r   match_on_id_for_tensorr1    sJ    %%F &+,%%'F
6:(F$FFr   c                  "    e Zd ZU ded<   ded<   y)GuardCodeListr~  	code_listr:   rM  Nr   r   r   r   r  r   r   r3  r3    s    Lr   r3  c                      e Zd ZdZdZy)r  rP      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U dZded<   ded<   y)GuardCheckSpecu^  Lightweight guard evaluation for subgraph reuse during tracing.

    WHY IS THIS NEEDED?
    Normal guards are collected during tracing, installed via GuardBuilder, and
    evaluated in C++ at runtime. GuardCheckSpec serves a different purpose: we
    want to evaluate a guard *during tracing* to check whether a previously
    traced partial subgraph can be reused. The guard is collected during the
    first trace of subgraph and then evaluated with a new source value before we
    begin tracing the second subgraph.

    Existing C++ guards don't satisfy this need because they're designed for
    runtime evaluation, not mid-trace comparisons with different source values.

    NB - This separate spec table *increases maintenance burden*, but each
    handler is small and the number of guard types is finite, so it's tractable.

    get_metadata_fn: (guard, value) -> metadata  — captures the minimum
        information from the guarded value at build time.
    eval_fn: (value, metadata) -> bool  — re-evaluates the guard at lookup
        time using a fresh value and the previously saved metadata.
    r   get_metadata_fneval_fnN)r   r   r   r  r   r  r   r   r;  r;    s    , Lr   r;  c                |    | j                   | j                         | j                  | j                  | j                  fS r   )shapestrider  r  r  )rY  s    r   extract_tensor_metadatarA    s)    GGQXXZ!((AOODDr   c                r    t        |j                         d         }t        |      }t        |d      }|||fS )NrP   __metadata_guard__)r   __tensor_flatten__r>  ri  )rM  r  metadataclshas_custom_guards        r   extract_subclass_metadatarH    s?    002156H
u+Cu&:;c+,,r   c                    |\  }}}|r#|j                  || j                         d         S | j                         d   |k(  S r   rC  rD  )r  rE  saved_metadatarF  rG  s        r   check_subclass_metadatarL    sM    ,4)NC)%%ne6N6N6PQR6STT##%a(N::r   c                    t        |      S r   r   rM  r  s     r   extract_dtensor_specrO  %  s    E?r   c                (    | j                  |d      S )NT)skip_shapes)_check_equalsr  rE  s     r   check_dtensor_specrT  *  s    xT::r   c                |    t        t        |            }|r|j                  sy t        |j                  |            S r   )rB   r>  guard_fnr   )rM  r  opaque_infos      r   extract_opaque_objrX  /  s4    %d5k2Kk22K((/00r   c                |    |yt        t        |             }|r|j                  s|d u S |j                  |       |k(  S r  )rB   r>  rV  )r  rE  rW  s      r   check_opaque_objrZ  7  sE    %d5k2Kk224&(22r   c                ~    t        |      t        j                  u rt        |d      r|j                  S t        |      S Nr   r>  r4  r5  ri  r   idrN  s     r   extract_closurer_  A  s1    E{e(((WUJ-G~~e9r   c                    t        |       t        j                  u rt        | d      r| j                  |u S t        |       |k(  S r\  r]  rS  s     r   check_closurera  H  s;    E{e(((WUJ-G~~))e9  r   c                v    ddl m} |D ]  }t        | |      s ||       c S  t        dt	        |              )zBExtract the base constant value from a constant subclass instance.rP   _CONSTANT_BASE_TYPESzNot a constant subclass: )variables.user_definedrd  r   r  r>  )r  rd  rY  s      r   _constant_subclass_base_valuerf  N  s@    <! eQU8O /U}=
>>r   c                ,    t        | |      fd}|S )z<Attach a GuardCheckSpec to a guard method for auto-dispatch.r<  r=  c                    | _         | S r   )guard_check_spec)fnhandlers    r   	decoratorz,register_guard_check_spec.<locals>.decorator_  s    %	r   )r;  )r<  r=  rm  rl  s      @r   register_guard_check_specrn  X  s    
 _gNG r   c                    t         | _        | S )z:Mark a guard method as skipped during auto-cache dispatch.)
SKIP_GUARDrj  rk  s    r   skip_guard_check_specrr  f  s    $BIr   c                  8    e Zd ZdZddZed        Zed        Zy)UnsupportedGuardCheckSpeczSentinel for guards with no check spec yet.

    Raises NotImplementedError if get_metadata_fn/eval_fn are accidentally called.
    c                    || _         y r   )_name)r   r  s     r   r   z"UnsupportedGuardCheckSpec.__init__r  s	    
r   c                2    t        d| j                         Nz%Guard check spec not implemented for NotImplementedErrorrv  r   s    r   r<  z)UnsupportedGuardCheckSpec.get_metadata_fnu      !$I$**"VWWr   c                2    t        d| j                         rx  ry  r   s    r   r=  z!UnsupportedGuardCheckSpec.eval_fny  r{  r   N)r  r   r   r   )r   r   r   r  r   propertyr<  r=  r  r   r   rt  rt  l  s8    
 X X X Xr   rt  c                :    t        | j                        | _        | S )z;Mark a guard method as unsupported for auto-cache dispatch.)rt  r   rj  rq  s    r   unsupported_guard_check_specr  ~  s    3BKK@BIr   c                  .   e Zd Z	 	 	 d{	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d|dZ	 	 	 	 	 	 d}dZd~dZedd       Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ		 	 	 	 	 	 ddZ
dd	Zdd
ZddZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 ddZ ed d       ddd       Z ed d       	 d	 	 	 	 	 dd       Z ed d       dd       Zedd       Z ed d       dd       Z ed d        dd!       Z ed" d#       dd$       Z ed% d&       dd'       Z ed( d)       dd*       Z ed+ d,       dd-       Z ed. d/       ddd0       Z	 d	 	 	 	 	 dd1Z  ed2 d3       ddd4       Z! ed5 d6       dd7       Z"e#dd8       Z$e#dd9       Z%e#dd:       Z& ee'e(      dd;       Z) ee*e+      dd<       Z, ee-e.      dd=       Z/ ed> d?       ddd@       Z0 edA dB       ddC       Z1 edD dE       ddF       Z2 edG dH       ddI       Z3 edJ dK       ddL       Z4 edM dN       ddO       Z5 edP dQ       ddR       Z6 ee7e8      ddS       Z9 edT dU       ddV       Z: edW dX       ddY       Z; edZ d[       dd\       Z< ed] d^       dd_       Z= ed` da       ddb       Z>e#ddc       Z? edd de       ddf       Z@ edg dh       ddi       ZA edj dk       ddl       ZB edm dn       ddo       ZCe#ddp       ZDe#ddq       ZEe#ddr       ZFe#dds       ZGe#ddt       ZHe#ddu       ZIe#ddv       ZJ edw dx       dddy       ZK	 	 d	 	 	 	 	 	 	 	 	 ddzZLy)GuardBuilderNc                   || _         || _        || _        || _        ||d| _        i | _        |
xs || _        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 | _        |	| _        || _        t5               | _        | j,                  j8                  J | j,                  j8                  j:                  D ]7  }| j=                  |      }| j6                  j?                  tA        |             9 i | _!        i | _"        t5               | _#        g | _$        tJ        jL                  xr tO        d      | _&        tQ               | _)        y )	NLG__builtins__>_<._dot_!pytorch/compiler:guard_nn_modules)*f_codeid_ref
source_reflookup_weakrefsscopesrc_get_value_cacheruntime_global_scopebuiltins__dict__copyr.  packagepackage_importer_package_imported_modulesr   r  rV  argnamesr   shape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managerscheck_fn_managerguard_tree_valuessave_guardsguard_filter_fnr   key_order_guarded_dict_idsoutput_graphguard_on_key_ordergetr   r^  r   _cached_guard_managers_cached_duplicate_input_guardsobject_aliasing_guard_codesrQ   guard_nn_modulesrE   rL   already_added_code_parts)r   r  r  r  r  local_scoper   rV  r  r  r  r  r  package_modulerX  dict_objs                   r   r   zGuardBuilder.__init__  s    $.9D<3X
9; $8$HL!%-%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++//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  rX  r  r  )
get_guard_managerr   r   rz  r  r  r   rb   get_guard_manager_typedict_getitem_manager)	r   r  rM  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                4   | j                  |      }t        |t              st        d|j                         t        |t              sJ t        t        |            D ]  \  }}t        |j                  |      }|j                  |||t        j                        }t        |      rA| j                  ||      }|j                  |t        d| d| d|      |j                         |j!                  |t        | d||      |j                          y )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for r  z__check_obj_id(rS  rT  r   )r  r   r   rz  r  	enumerater   r  r"  r  r#  r   r  add_id_match_guardr  r  r$  )	r   r  rM  r  r`  r  r)  key_managerid_vals	            r   guard_on_dict_keys_and_orderz)GuardBuilder.guard_on_dict_keys_and_order  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*j\cW+EuM$$)	r   c                    t         j                  rAt        j                  dk\  r.t        j                  dk  rt	        j
                  dt               y | S )N)      )r  r  rP   zMGuards may run slower on Python 3.13.0. Consider upgrading to Python 3.13.1+.)rQ   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_value  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              rdt        ||      }d| d|d}| j                  |||t        j
                        j                  || d|gd        | j                  ||||      S | j                  ||||      S )Nr  r  r  r  r   r  )	r   r   r  r"  r  r#  r$  r%  r  )r  r  source_namer'  r  r  r   r)  s           r   getitem_on_dict_mgrz>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgrG  s     #/0 &&8#>  /{m3uiqI
##%"%'7'E'E	 $ 
 )(*T#/I.JDQ ,,&"/'9	 -   //&"/'9	 0  r   FNT_parameters_buffers_modulesattrrX  r  r  	.__dict__rX  r  r  )r  r  r  r'  r  r  )r  r   r  r   r  r   r'  r   r  r   r  r  r   r   )memberr  r   r  getmror   updatekeysr  r  getattr_managerr  r  rV   r  r  r  get_generic_dict_managerr  r  r#  )r   rX  r&  r'  r  r(  r  r  r  	attr_namemod_dictall_class_attribute_namesro  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 )Nrg  F)r  r^  r  r  )r   rX  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   r8  r   	frozensetr!  )r   rX  r  r  s       r   r  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  r8  )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 )Nr  )	f_globalsrX  r  r  )rV  r   globals_dict_managerr  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?                  |||      }net        t@              r|sJ |jC                  |||      }n;t        tD        tF        tH        tJ        tL        f      r|sJ |}nt        tN              r9tQ        jR                  jT                        }|jW                  |fd|||      }nt        tX              r|jW                  fd|||      }nt        tZ              r|jW                  fd|||      }nqt        t\              r|sJ |j_                  |||      }nGt        t`              r%|sJ |jc                  jd                  |||	      }nt        tf        th        tj        f      r_|sJ t        tf              sJ tm        |      r|sJ | jo                  ||||||      }n|jq                  jd                  |||	      }nt        tr        tt        f      r|sJ t        |tv        tx        jz                  f      sJ t        tr        tt        f      sJ t        |t|              r$| j                  |	      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        |tv        tx        jz                  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        |t|              rJ |j-                  j                  |||      }n.t        t              r|sJ |jW                  t        |||      }nt        t              r|sJ |jW                  d |||      }nt        t              r|sJ |jW                  d |||      }nt        t              r|sJ |jW                  d |||      }n{t        t              r|sJ |jW                  d |||      }nOt        t              r|sJ |jW                  d |||      }n#t        t              r|sJ |jW                  d |||      }nt        t              r%|sJ |j                  j                  |||      }nt        t              r<t        |t|              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 |jW                  d |||      }nt        t              r|sJ |jW                  d |||      }nt        t              r|sJ |j                  |||      }not        t              r|sJ |j                  |||      }nFt        t              r|sJ |jW                  d |||      }nt        d dj                         || j                  j                  <   |S )Nrg  r  )global_namerX  r  r  r  c                    |S r   r  )r  r  s     r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>Q  s    ! r   )python_lambdarX  r  r  c                6    t        j                               S r   )r   
_get_indexr  rX  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>X  s    (H%%') r   c                .    t        j                        S r   )r   r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>a  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`  rX  r  r  zUse DictGetItemSourcez.__kwdefaults__c                (    | j                         d   S r   rD  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (<(<(>q(A r   c                "    | j                         S r   )__obj_flatten__r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (9(9(; r   c                >    | j                         j                         S r   )_typequalified_namer  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  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>3  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>d  s    (8(; r   c                    | j                   S r   r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>l  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 - )urV  r   r  r  r  r  r^  r  r  r#  r   rZ   r  get_guard_manager_from_sourcer   rp   r   r  
local_nameframelocals_managerrj   r  r  r  rl   global_weakref_managerrk   rw   r}   type_managerr{   type_dict_managerr|   type_mro_managerru   rr   r   r~   rg   rn   r  r  module_namelambda_managerry   r_   rm   grad_managerrh   generic_getattr_managerr  rV   rY   r   r  r  r  rb   rc   r!  r  r  r   r  r,  r   r^   RuntimeErrorr4   getattrproplowerr`  r-   indexed_managerro   list_getitem_managerri   r  index_is_slicer<  tuple_getitem_managerunpack_slicegetitem_managerra   callableis_kwfunc_defaults_managerr   idx_keyr   func_kwdefaults_managerrt   r  rx   re   rv   rU   rX   rf   rz   tuple_iterator_getitem_managerAssertionErrorr"  rs   set_getitem_managerr   weakref_call_managerrW   call_function_no_args_managerr`   rq   r\   code_managerr[   closure_managerrd   )r   rX  root_guard_managerr  r  r  r(  r'  r&  base_guard_manager_enumr   outmoduler   
kwdefaults	kw_sourcer  s    `               r   r  z*GuardBuilder.get_guard_manager_from_source  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FL),,V-?-?@F$33*0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 Z!35ST
 &%%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   rM  s     r   r  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                  |
|d        y | j                  j                  j                  |
|d        y )NrS  r  zPython shape guard function:
%s___make_guard_fn)r  joinr  build_guard_functionr  
guards_logdebugexecr#  rV  r   add_epilogue_lambda_guardadd_lambda_guard)r   r   r   r   is_epiloguemake_guard_fn_args_guard_bodypycoder.  globals_for_guard_fnrV  s              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?QSWXr   c                    t        |t              r|}n|j                  }|
t               }|j	                  | j
                  || j                        }|S r   )r   r>   r  r  	get_valuer  r  )r   guard_or_sourcer   srcrets        r   r  zGuardBuilder.get  sM    
 ov.!C!44C,.LmmDJJd6N6NO
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 )Nr7  zinvalid var name: %s)r   r   r  strip_function_callr  r.  r  r  is_valid_var_namelogwarningrw  )r   rM  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  )r\   r  rV   r:   r  r  create)r   rM  r  rV  attr_source	new_guards         r   _guard_on_attributez GuardBuilder._guard_on_attribute  s[     
"$U%=%=>K$U%=%=yIKAQAQ
	 	r   c                z    | j                   j                  d   t        || j                   j                  d         fS Nr  )	create_fnkeywordsri  rN  s     r   r  zGuardBuilder.<lambda>  s4    OO$$V,E5??33F;<.
 r   c                ,    t        | |d         |d   k(  S Nr   rP   )ri  rS  s     r   r  zGuardBuilder.<lambda>  s    x{(CxPQ{(R r   rh  c           	         |J |j                   }t        |t              r|j                  }| j	                  |      }t        | j                  |      |      }d }|r
d| d|d}n	d| d|d}|| j                  v ry | j                  ||g| j                  |             | j                  |      }|rt        ||      }| j                  |      }	| j                  |      }
| j                  ||	      }t        |
      r,| j                  |||
|	|j                  |j                  |       nG|j                  ||j                  |	|       n'|j!                  |t#        ||      |j$                         | j                  j'                  |       y )Nhasattr(rS  rT  znot hasattr()provided_guarded_objectr  )r  r   rr   r  rN  ri  r  r  _set_guard_export_infor  rV   r  r  r  r  r  add_no_hasattr_guardr  r  r   )r   rM  r  rX  refvalr   base_managerrQ  r  r'  r  s               r   HASATTRzGuardBuilder.HASATTR  s    ))fn-[[Fll5!dhhuot,cU"THA.D!#b2D4000##D6488E? 	$ 	
 99&A %VT2K HH[1M!%%!%!<!<[-!X 44FG)) &!KK$$& ,, ::"/'9	 -  --,T595;K;K 	%%))$/r   c                4    | j                   j                  d   S rU  rV  rW  rN  s     r   r  zGuardBuilder.<lambda>+  s    U__-E-Ef-M r   c                    || j                   vS r   )r  rS  s     r   r  zGuardBuilder.<lambda>,  s    (F 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                  j                  |       y )Nnot ___dict_contains(rS  z
.__dict__)r  r  F)rN  r  r  r  r  r  r  r  r  r#  add_dict_contains_guardr  r  r   )	r   rM  r  r_  r`  ra  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/		
 	%%))$/r   c                    t        |      S r   r>  rN  s     r   r  zGuardBuilder.<lambda>K  s
    T%[ r   c                    t        |       |u S r   rk  rS  s     r   r  zGuardBuilder.<lambda>L  s    Ux(? r   c           	     0   | 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#        ||d|j                         |j$                         y )	NTtype(rT  z___check_type_id(rS  ), type=ztype )r  )r  r   r.  _subclasses
FakeTensorr  r>  r   r   _unserializabler  r  re  rN  r]  r  add_type_match_guardr  r  )r   rM  r  rY  r  	type_reprr   s          r   
TYPE_MATCHzGuardBuilder.TYPE_MATCHJ  s     eU..99:u||AUA>>QZZ' %)E!Q%

|1 56G	"4<<#6"7r&)U##ED62u%::"eeANN3C,D 	
r   c                   | j                  |      }| j                  |      }t        | j                  |            }d| d| }| j                  ||g       | j	                  |      j                  |t        ||      |j                         y )Nz___dict_version() == )rN  r  r   r]  r  add_dict_version_guardr  r  )r   rM  r_  r`  versionr   s         r   DICT_VERSIONzGuardBuilder.DICT_VERSIONj  s     ll5!hhuotxx/!#eG95##ED62 	u%<<'e4e6F6F	
r   c                4    | j                   j                  d   S Nr  rd  rN  s     r   r  zGuardBuilder.<lambda>z      U__-E-Ee-L r   c                
    || v S r   r  rS  s     r   r  zGuardBuilder.<lambda>{      E(9 r   c                    | j                  |      }d|d| d}|| j                  v ry | j                  ||g       | j                  |      j	                  d|t        ||      |j                         | j                  j                  |       y )Nz___dict_contains(rS  rT  TrN  r  r]  r  rh  r  r  r   r   rM  r  dict_refr   s        r   DICT_CONTAINSzGuardBuilder.DICT_CONTAINSy  s    
 <<&"3'H:Q74000##ED62u%=="4/		
 	%%))$/r   c                4    | j                   j                  d   S r|  rd  rN  s     r   r  zGuardBuilder.<lambda>  r}  r   c                
    || vS r   r  rS  s     r   r  zGuardBuilder.<lambda>      (= r   c                    | j                  |      }d|d| d}|| j                  v ry | j                  ||g       | j                  |      j	                  d|t        ||      |j                         | j                  j                  |       y )Nrg  rS  rT  Fr  r  s        r   DICT_NOT_CONTAINSzGuardBuilder.DICT_NOT_CONTAINS  s    
 <<&&sgRz;4000##ED62u%=="4/		
 	%%))$/r   c                4    | j                   j                  d   S r|  rd  rN  s     r   r  zGuardBuilder.<lambda>  r}  r   c                
    || v S r   r  rS  s     r   r  zGuardBuilder.<lambda>  r  r   c                $   | j                  |      }|}d| d|d}|| j                  v ry | j                  ||g       | j                  |      j	                  d|t        ||      |j                         | j                  j                  |       y )Nzset.__contains__(rS  rT  TrN  r  r]  r  add_set_contains_guardr  r  r   r   rM  r  set_refr  r   s         r   SET_CONTAINSzGuardBuilder.SET_CONTAINS  s    
 ,,u%"7)2dXQ74000##ED62u%<<"4/		
 	%%))$/r   c                4    | j                   j                  d   S r|  rd  rN  s     r   r  zGuardBuilder.<lambda>  r}  r   c                
    || vS r   r  rS  s     r   r  zGuardBuilder.<lambda>  r  r   c                $   | j                  |      }|}d| d|d}|| j                  v ry | j                  ||g       | j                  |      j	                  d|t        ||      |j                         | j                  j                  |       y )Nznot set.__contains__(rS  rT  Fr  r  s         r   SET_NOT_CONTAINSzGuardBuilder.SET_NOT_CONTAINS  s    
 ,,u%&wir$;4000##ED62u%<<"4/		
 	%%))$/r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>      U r   c                    | |k(  S r   r  rS  s     r   r  zGuardBuilder.<lambda>      (9 r   c                z   | j                  |      }| j                  |      }t        |t              sJ | d|g}| j	                  ||       |r6| j                  |      j                  t        ||      |j                         y | j                  |      j                  t        ||      |j                         y )Nr   )
rN  r  r   r   r]  r  add_true_match_guardr  r  add_false_match_guardr   rM  r_  r`  r   s        r   
BOOL_MATCHzGuardBuilder.BOOL_MATCH  s     ll5!hhuoc4   %tC7#$##E40""5)>>&tU3U5E5E ""5)??&tU3U5E5Er   c                     y r   r  rN  s     r   r  zGuardBuilder.<lambda>      r   c                
    | d u S r   r  rS  s     r   r  zGuardBuilder.<lambda>  s
     r   c                    | j                  |      }| j                  |      }|J | dg}| j                  ||       | j                  |      j	                  t        ||      |j                         y )Nz is None)rN  r  r]  r  add_none_match_guardr  r  r  s        r   
NONE_MATCHzGuardBuilder.NONE_MATCH  ss     ll5!hhuo{{%x !##E40u%::"4/1A1A	
r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>  r  r   c                
    | |u S r   r  rS  s     r   r  zGuardBuilder.<lambda>      (9 r   c                &    | j                  ||      S r   )id_match_unchecked)r   rM  r  s      r   ID_MATCHzGuardBuilder.ID_MATCH  s     &&un==r   c                6   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%        |||      |j&                         t        |j                  t(              r_t        |t*        j,                  j.                        r:|j                  j0                  }| j3                  |      }	|	|	| j4                  |<   y y y y # t        $ r dt        |      j                   d}Y w xY w)Nr  r  z___check_obj_id(rS  ro  r  )provided_func_name)r   r  r}   ru  r:   r  r  rN  r  r  r  re  	Exceptionr>  r   r]  r  r  r  r  rp   r.  r2  r3  r  r  r   )
r   rM  r  r_  r`  r  rt  r   r  weak_ids
             r   r  zGuardBuilder.id_match_unchecked  sz    e..
;??e..33\5L5LM  ll5!hhuoS%**-	2S	I
 "#bD##ED6j#Qu%88"4?	
 e..< #uxx/"55@@
..s3&7>D((4 ' 0	 =  	2 DI../q1I	2s   E3 3"FFc                     y r   r  rN  s     r   r  zGuardBuilder.<lambda>'	  r  r   c                
    | d uS r   r  rS  s     r   r  zGuardBuilder.<lambda>(	      T(9 r   c                   | j                  |      }| j                  |      }t        |t        j                        sJ | d}| j                  ||g       | j                  |      j                  t        ||      |j                         y Nz is not None)
rN  r  r   r.  r/  r]  r  add_not_none_guardr  r  )r   rM  r  r_  r`  r   s         r   NOT_NONE_MATCHzGuardBuilder.NOT_NONE_MATCH&	  s|    
 ll5!hhuo#u||,,,l###ED62u%88"4/1A1A	
r   c                "    |j                         S r   raw_reprrN  s     r   r  zGuardBuilder.<lambda>6	  s    U^^-= r   c                (    | j                         |k(  S r   r  rS  s     r   r  zGuardBuilder.<lambda>7	  s    (8H(D r   c                   | j                  |      }| j                  |      }t        |t        j                  j
                        sJ | d|d}| j                  |      j                  |t        ||      |j                         y )Nz.raw_repr() == z.raw_repr())
rN  r  r   r.  r  r   r  add_dispatch_key_set_guardr  r  )r   rM  r_  r`  r   s        r   DISPATCH_KEY_SET_MATCHz#GuardBuilder.DISPATCH_KEY_SET_MATCH5	  sz    
 ll5!hhuo#uxx66777uOC7+>
u%@@":u5	
r   c                   | j                   j                  J | j                   j                  j                  }d| g}| j                  ||       | j                  j
                  j                  |t        ||      |j                         y )Nz,torch.autograd.forward_ad._current_level == )	r  r  
dual_levelr]  rV  r   add_dual_level_match_guardr  r  )r   rM  r  r   s       r   
DUAL_LEVELzGuardBuilder.DUAL_LEVELF	  s     $$11===**77BB
>zlKL##E40::"4/	
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        ||      |j                         y c c}w )Nz5torch._functorch.pyfunctorch.compare_functorch_state(rT  c                           S r   r  )ro  
compare_fnstatess    r   rk  z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fnb	  s    f%%r   r  )r  r  functorch_layers	get_stater]  r.  
_functorchpyfunctorchcompare_functorch_staterV  r   r<  r  r  )r   rM  ciscir   rk  r  r  s         @@r   FUNCTORCH_STACK_MATCHz"GuardBuilder.FUNCTORCH_STACK_MATCHU	  s     $$11===##00AA+./R",,./GxqQR##E40 %%11II
	& 	00&tU3U5E5E	
 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        ||      |j                         y )Nc                H     |       sy t        t        t        |             S r   )r<  mapr^  )hooksare_inline_hookss    r   hooks_ids_fnz?GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.hooks_ids_fnq	  s!     $E*R((r   zCtorch._functorch.aot_autograd.utils.top_saved_tensors_hooks ids == c                $                   k(  S r   r  )ro  	get_hooksguard_hooks_idsr  s    r   rk  z5GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.fn	  s    "l9;&???r   )r  zCtuple[Callable[[torch.Tensor], Any], Callable[[Any], torch.Tensor]]r   ztuple[int, ...] | Noner  )r.  r  _aot_autogradr  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineabler]  rV  r   r<  r  r  )r   rM  r   rk  r  r  r  r  s       @@@@r   AUTOGRAD_SAVED_TENSORS_HOOKSz)GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKSj	  s    $$2288PP	**00SS 		)V	)#	) 'y{3 RRaQbc
 	##E40	@ 	00&tU3U5E5E	
r   c                   | j                  |      } G d d      |j                         d   }t        t        j                  t
        j                  fd|            t        |d      rt        |       t        |      d
fd}nd
fd}dt        |       d	t        j                          }| j                  |      j                  |t        ||      |j                          y )Nc                      e Zd ZddZddZy)@GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>._AnyComparec                     yr  r  r   others     r   __eq__zGGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>._AnyCompare.__eq__	  s    r   c                     yr  r  r  s     r   __ne__zGGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>._AnyCompare.__ne__	  s    r   N)r  objectr   r   )r   r   r   r  r  r  r   r   _AnyComparer  	  s    r   r  rP   c                            S r   r  )r  r  s    r   r  z=GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.<lambda>	  s	     r   rC  c                J    j                  | j                         d         S r   rJ  )ro  rF  original_metadatas    r   metadata_checkerzEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker	  s)    --%q';';'=a'@ r   c                0    | j                         d   k(  S r   r  )ro  r  s    r   r  zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker	  s    ++-a04EEEr   ___check_metadata__cr  )r  rD  r   pytreetree_map_onlyr.  r  ri  r   r>  r^  r7   current_compile_idr  r<  r  r  )	r   rM  r  rE  r  r  r  rF  r  s	         @@@r   TENSOR_SUBCLASS_METADATA_MATCHz+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH	  s    
 	 	 ++-a0$  /FQ
 5./%e,u+CF +2.>+?*@>CdCdCfBghu%66";6	
r   c                    t        || j                  |            dfd}dt        |       }| j                  |      j	                  |t        ||      |j                         y )Nc                    t        |       S r   )rT  ro  expecteds    r   rV  z1GuardBuilder.DTENSOR_SPEC_MATCH.<locals>.guard_fn	  s    %a22r   __dtensor_spec_r  )rO  r  r^  r  r<  r  r  )r   rM  rV  r   r  s       @r   DTENSOR_SPEC_MATCHzGuardBuilder.DTENSOR_SPEC_MATCH	  s^     (txx?	3 !H/u%66,T595;K;K	
r   c                   | j                  |      }t        ||      ydfd}dt        |       dt        j                          }| j                  |      j                  |t        ||      |j                         y)z=Guard on the values returned by the opaque object's guard_fn.Nc                    t        |       S r   )rZ  )ro  original_valuess    r   opaque_guard_checkerzDGuardBuilder.OPAQUE_OBJ_GUARD_FN_MATCH.<locals>.opaque_guard_checker	  s    #A77r   ___check_opaque_guard_fn_r  r  )	r  rX  r^  r7   r  r  r<  r  r  )r   rM  r  r  r  r  s        @r   OPAQUE_OBJ_GUARD_FN_MATCHz&GuardBuilder.OPAQUE_OBJ_GUARD_FN_MATCH	  s     ,UE:"	8 2"5I2J1K2nNoNoNqMrsu%66 ";6	
r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>	  r  r   c                    | |k(  S r   r  rS  s     r   r  zGuardBuilder.<lambda>	  r  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}m }	 ddl!m"}
m#}m$}m%} |||||	|
|fz   }ddl&m'} ||fz   }dd l(m)c m*} tW        ||      sB |jX                  t%        |            s't[        t%        |            sJ dt%        |              t]        |t^              rgta        jb                  |      rRd| d| d	g}| je                  ||       | jg                  |      ji                  tk        ||      |jl                         y t]        |tn              rgt        jb                  |      rRd| d
| d	g}| je                  ||       | jg                  |      jq                  tk        ||      |jl                         y | d|g}t]        ||      rts        |      }tk        ||      }|r|D cg c]
  }| d| d }}| jg                  |      ju                  |||jl                         | je                  ||       y c c}w )Nr  r   )_MeshLayout
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  rT  );rN  r  r  int8int16int32int64uint8uint16uint32uint64float16float32float64r  r   r<  r   r>  r  sliceranger   r.  SizeStreamcudastreamsdistributedis_availabletorch.distributed.device_meshr  r   (torch.distributed.tensor.placement_typesr  r  r  r  torch.export.dynamic_shapesr  torch.utils._pytreer  rK   r   is_constant_classrC   r   r  r  r  r]  r  add_float_is_nan_guardr  r  complexadd_complex_is_nan_guardr   r$  )r   rM  r  r_  r`  np_typesok_mutable_typesok_typesr  r   r  r  r  r  r  r  r   r   rP  s                      r   EQUALS_MATCHzGuardBuilder.EQUALS_MATCH	  s   
 ll5!hhuo						





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



""))  "
" ))+M   # 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%<<#U%5%5	
 	##E40"s   M#c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>M
  r  r   c                    | |k(  S r   r  rS  s     r   r  zGuardBuilder.<lambda>N
  r  r   c                   | j                  |      }t        |t              r| j                  |       y || j	                  |       y t        |t
        j                        r| j                  |       y | j                  |       y r   )	r  r   r   r  r  r4  CodeTyper  r$  r   rM  r`  s      r   CONSTANT_MATCHzGuardBuilder.CONSTANT_MATCHL
  s`    
 hhuo#tOOE"[OOE"C(MM% e$r   c                    t        |      S r   rf  rN  s     r   r  zGuardBuilder.<lambda>\
  s    -J5-Q r   c                    t        |       |k(  S r   r,  rS  s     r   r  zGuardBuilder.<lambda>]
  s    (Ee(L) r   c                F  	 ddl m} | j                  |      }| j                  |      }d|D ]  }t	        ||      s| n J  |      	j
                   d| d	g}d	fd}| j                  |      j                  |t        ||      |j                         y)zGuard for subclasses of constant types (int, float, str, etc.).

        Extracts the base value using the base type's converter (e.g.,
        int.__int__) to avoid calling user-overridden __eq__.
        rP   rc  N(rw  c                     |       k(  S r   r  )ro  	base_type
base_values    r   check_fnz6GuardBuilder.CONSTANT_SUBCLASS_MATCH.<locals>.check_fnv
  s    Q<:--r   r  )
re  rd  r  rN  r   r   r  r<  r  r  )
r   rM  rd  r`  r_  rY  r   r3  r1  r2  s
           @@r   CONSTANT_SUBCLASS_MATCHz$GuardBuilder.CONSTANT_SUBCLASS_MATCH[
  s     	Ahhuoll5! 	% 	A#q!		 $$$s^
%%&auE*@A	. 	u%66"4/	
r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>
  r  r   c                
    | |u S r   r  rS  s     r   r  zGuardBuilder.<lambda>
  r  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.Modulerg  zKAttempted to setup an NN_MODULE guard on uninitialized nn.Module subclass `z`.zIEnsure the `nn.Module` subclass instance has called `super().__init__()`.)gb_typecontextexplanationhints)r  r  ri  r   r8  r   r  rS  r  r*  rS   unimplementedr>  r)  s      r   	NN_MODULEzGuardBuilder.NN_MODULE
  s     	eDEhhuo3
##,,---((((
L<W<WX ) G''+Cyk5 `r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>
  r  r   c                
    | |u S r   r  rS  s     r   r  zGuardBuilder.<lambda>
  r  r   c                $    | j                  |      S )z0things like torch.add and user defined functions)r  r3  s     r   FUNCTION_MATCHzGuardBuilder.FUNCTION_MATCH
  s     }}U##r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>
  r  r   c                
    | |u S r   r  rS  s     r   r  zGuardBuilder.<lambda>
  r  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)r  r  isclassr&  r  r  r)  s      r   CLASS_MATCHzGuardBuilder.CLASS_MATCH
  sI     hhuos# ::,FG  	&r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>
  r  r   c                
    | |u S r   r  rS  s     r   r  zGuardBuilder.<lambda>
  r  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)r  r  ismoduler&  r  r  r)  s      r   MODULE_MATCHzGuardBuilder.MODULE_MATCH
  sK     hhuo$ ::,HI  	&r   c                    | j                  |      }t        |      t        j                  u r.t	        |d      r"| j                  |dt        j                         y| j                  |       y)z!matches a closure by __code__ id.r   N)	r  r>  r4  r5  ri  rS  r  r*  rB  r)  s      r   CLOSURE_MATCHzGuardBuilder.CLOSURE_MATCH
  sT     hhuo9***wsJ/G $$UJ8S8ST&r   c                    |S r   r  rN  s     r   r  zGuardBuilder.<lambda>
  r  r   c                
    | |u S r   r  rS  s     r   r  zGuardBuilder.<lambda>
  r  r   c                    | j                   rSt        |j                  t              r9| j                  j
                  j                  |j                  j                         | j                  |      S r   )	r  r   r  rb   r  used_builtin_varsr   r   r  r3  s     r   BUILTIN_MATCHzGuardBuilder.BUILTIN_MATCH
  sZ    
 %224EF%%77;;,,22 &&u--r   c                    t        |      S r   r   rN  s     r   r  zGuardBuilder.<lambda>
  s
    SZ r   c                    t        |       |k(  S r   rU  rS  s     r   r  zGuardBuilder.<lambda>
  s    E
h(> r   c                V   | j                  |      }| j                  |      }t        |t              s| j	                  |       g }t        |      dk(  r|j                  d|        n |j                  d| dt        |              | j                  ||       t        |t              r@| j                  |      j                  t        |      t        ||      |j                         y | j                  |      j                  t        |      t        ||      |j                         y )Nr   znot zlen(rw  )rN  r  r   r!  ru  r   rw  r]  r  add_dict_length_check_guardr  r  add_length_check_guardr   rM  r_  r  r   s        r   SEQUENCE_LENGTHzGuardBuilder.SEQUENCE_LENGTH
  s     ll5!%&OOE"u:?KK$se%KK$se5U56##E40eT"""5)EEE
&tU3   ""5)@@E
&tU3  r   c                    t        |      S r   r   rN  s     r   r  zGuardBuilder.<lambda>
  s    -?-F r   c                    t        |       |k(  S r   r]  rS  s     r   r  zGuardBuilder.<lambda>
  s    (:5(AX(M r   c                   | j                  |      }| j                  |      }t        |      }g }|j                  d| dt	        |              | j                  ||       t        |      }| j                  |d|j                   d      }| j                  |      j                  t	        |      |t        ||      |j                         y )Nz___tuple_iterator_len(rw  rn  rT  )rN  r  r>  rw  r   r]  r  r  r  add_tuple_iterator_length_guardr  r  )r   rM  r_  r  rY  r   r  s          r   TUPLE_ITERATOR_LENzGuardBuilder.TUPLE_ITERATOR_LEN
  s    
 ll5!K,SE7I%7P6QRS##E40KQ%

|1 56u%EEu%"4/		
r   c                    t        |      S r   r   rN  s     r   r  zGuardBuilder.<lambda>  s    -A%-H r   c                    t        |       |k(  S r   rc  rS  s     r   r  zGuardBuilder.<lambda>  s    (<U(Cx(O r   c           
        | j                  |      }| j                  |      }t        |      }g }t        |      }|j	                  d| d|        | j                  ||       t        |      }| j                  |d|j                   d      }|\  }}	}
| j                  |      j                  ||	|
|t        ||      |j                         y )Nz___normalize_range_iter(rw  rn  rT  )rN  r  r>  r   rw  r]  r  r  r  add_range_iterator_match_guardr  r  )r   rM  r_  r  rY  r   normalized_range_iterr  startstopsteps              r   RANGE_ITERATOR_MATCHz!GuardBuilder.RANGE_ITERATOR_MATCH  s    
 ll5!K 4U ;.se59N8OPQ##E40KQ%

|1 561tTu%DD"4/	
r   c                .    t        |      t        |      fS r   r>  r   rN  s     r   r  zGuardBuilder.<lambda>,  s    d5k;OPU;V-W r   c                H    t        |       |d   u xr t        |       |d   k(  S rY  rm  rS  s     r   r  zGuardBuilder.<lambda>-  s,    K8A;&U+?+F(ST++U r   c                (   | j                  |      }| j                  |      }t        |      t        |      dfd}d| d g}| j	                  ||       | j                  |      j                  |t        ||      |j                         y )Nc                >    t        |       u xr t        |       k(  S r   rm  )ro  
count_typenormalized_count_iters    r   rV  z3GuardBuilder.COUNT_ITERATOR_MATCH.<locals>.guard_fn7  s(    Q:% E(+/DDr   z___normalize_count_iter(rw  r  )	rN  r  r>  r   r]  r  r<  r  r  )r   rM  r_  r  rV  r   rq  rr  s         @@r   COUNT_ITERATOR_MATCHz!GuardBuilder.COUNT_ITERATOR_MATCH+  s     ll5!%[
 4U ;	 +3%u5J4KLM##E40u%66,T595;K;K	
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!        ||      |j,                         y )N is r   )r1   r  r  r,   r  additional_used_local_varsr   r+   additional_used_global_varsrN  r  r0   r  r]  rQ   #use_lamba_guard_for_object_aliasingr  r  rw  r    r  r  r  )
r   rM  source_br  ref_aref_br  r   rz  ry  s
             r   DUPLICATE_INPUTzGuardBuilder.DUPLICATE_INPUTF  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                     y r   r  rN  s     r   r  zGuardBuilder.<lambda>v  r  r   c                
    | d uS r   r  rS  s     r   r  zGuardBuilder.<lambda>w  r  r   c                    | j                  |       dg}| j                  ||       | j                  |      j                  t	        ||      |j
                         y r  )rN  r]  r  r  r  r  r   rM  r   s      r   WEAKREF_ALIVEzGuardBuilder.WEAKREF_ALIVEu  sX    
 <<&'|45##E40u%88"4/1A1A	
r   c                4    t        |j                               S r   r  r  rN  s     r   r  zGuardBuilder.<lambda>  s    T%**,-? r   c                :    t        | j                               |k(  S r   r  rS  s     r   r  zGuardBuilder.<lambda>  s    UZZ\(:h(F r   c           	     $   | j                  |      }| j                  |      }g }|j                  d| dt        |j	                                       | j                  ||       | j                  |      j                  |||j                         y)z7Guard on the key order of types.MappingProxyType objectzlist(z.keys()) == N)	rN  r  rw  r  r  r]  r  add_mapping_keys_guardr  rZ  s        r   MAPPING_KEYS_CHECKzGuardBuilder.MAPPING_KEYS_CHECK  s     ll5!eC5T%**,-?,@AB##E40u%<<4))	
r   c                >    t        t        j                  |            S r   r  r!  r  rN  s     r   r  zGuardBuilder.<lambda>  s    T$))E2B-C r   c                D    t        t        j                  |             |k(  S r   r  rS  s     r   r  zGuardBuilder.<lambda>  s    TYYu-=(>((J r   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)) == )rN  r  r.  r  rK   SUPPORTED_NODESrz  r[  rw  r  r   r]  r  r  r  r  rZ  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                     y r   r  rN  s     r   r  zGuardBuilder.<lambda>  r  r   c                    t        |       dk(  S r   rU  rS  s     r   r  zGuardBuilder.<lambda>  s    E
a r   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)rQ   skip_nnmodule_hook_guardsr[  r3  s     r   EMPTY_NN_MODULE_HOOKS_DICTz'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICT  s     ++U#r   c                     y r   r  r3  s     r   	GRAD_MODEzGuardBuilder.GRAD_MODE      r   c                     y r   r  r3  s     r   DETERMINISTIC_ALGORITHMSz%GuardBuilder.DETERMINISTIC_ALGORITHMS  r  r   c                     y r   r  r3  s     r   FSDP_TRAINING_STATEz GuardBuilder.FSDP_TRAINING_STATE  r  r   c                $   | j                   j                  }|J |j                  }|| j                   _        d| j                   j                  j	                          g}| j
                  j                  j                  |||j                         y )Nz ___check_global_state() against )	r  r  global_state_guardglobal_state__getstate__rV  r   add_global_state_guardr  )r   rM  r  r  r   s        r   GLOBAL_STATEzGuardBuilder.GLOBAL_STATE  s    ,,99'''#66-9* /t/D/D/Q/Q/^/^/`.ab
 	66$ 0 0	
r   c                   | j                   j                  J t        | j                   j                        | j                   _        | j                  j
                  j                  | j                   j                  dg|j                         y )Nz$___check_torch_function_mode_stack())r  torch_function_mode_stack$make_torch_function_mode_stack_guard"torch_function_mode_stack_check_fnrV  r   #add_torch_function_mode_stack_guardr  r3  s     r   TORCH_FUNCTION_STATEz!GuardBuilder.TORCH_FUNCTION_STATE  sy    $$>>JJJ0%%?? 	@
 	CC!!;;34	
r   c                F   |j                   t        j                  u sJ | j                  j                  J d| j                  j                  j
                  g}| j                  ||       | j                  |      j                  t        ||      |j                         y)z/Guard on CURRENT_DEVICE per torch.utils._deviceNzutils_device.CURRENT_DEVICE == )rX  r=   GLOBALr  r  current_devicer]  r  add_default_device_guardr  r  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/1A1A	
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
} |sd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                  |j                         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   rg  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  rX  r  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fakerX  r  export)r  r  r  r  r  r  r   s     r   _get_code_partsz/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts9  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   )CppCodeCacherS  c              3  8   K   | ]  \  }\  }}| d | d  yw)z = int_values[r  Nr  r  ir  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  tuple[str, ...]r   zlist[_ShapeGuardsHelper])Ktorch._dynamo.output_graphr   r  r  r  shape_code_partsr  r   r  r  r   r  tracked_fakessymbolic_contextexport_constraintsr   r  r  r.  r  dynamic_shapes_process_equalitiesrK  rL  rH   r  r#  rQ    enable_cpp_symbolic_shape_guardsOverflowErrorfreezer  localsr  rF   source_to_symbolr  ShapeCodePartsexprsr]  r7   try_getshape_env_guardsr"  r   r]   rJ   r  r!  rw  r  ctypestorch._inductor.codecacher  r!  r  r  r-   r6  textwrapdedentr8  r9  loadcastrM  c_void_pr  r"   r   r  	_inductorrS   InvalidCxxCompilerrB  ))r   rM  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  rX  r  r  r  r  r  guard_managersint_symbols_strfloat_symbols_strfunc_strclibcguardr  r  r  r  s)   `                                    @@@@r   	SHAPE_ENVzGuardBuilder.SHAPE_ENV  sB   @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  #{ >B % &*O<K4=9%'9v"^ ??&&99 s=   VV (V+ 6%V%C)V+ V"!V"%V+ +'WWc                    t        |      S r   )rA  rN  s     r   r  zGuardBuilder.<lambda>  s    -DU-K r   c                V    t        | t        j                        xr t        |       |k(  S r   )r   r.  r/  rA  rS  s     r   r  zGuardBuilder.<lambda>  s'    uell+ ;'.(: r   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|         n| 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_        ||||||      |      }|j`                  }|jc                  ||||||||       t        |t        j$                  j&                        s/| jd                  jf                  ji                  |jj                         |jl                  J to        |d|j>                        \  }}|stq        |d      r`|jr                  }d| d| d| d}|jI                  |       | jM                  |      ju                  |t]        ||      |j`                         nMd| d}|jI                  |       | jM                  |      jw                  dt]        ||      |j`                         tq        |d      rcty        |dd       }d| d|d| d}|jI                  |       | jM                  |      j{                  |fdt]        ||      |j`                         tq        |d      rcty        |dd       }d| d|d| d}|jI                  |       | jM                  |      j{                  |fd t]        ||      |j`                         t}        |      d!kD  r| j                  ||       y y )"Nparam_numelparam_bytesparam_countrP   )r  r  r  
ndimensionr  zndimension()zstr(r  rw  r   sizer@  T)	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') == False_dynamo_unbacked_indices_dynamo_shape_idsz
((getattr(z , '_dynamo_shape_ids', None) == z) if hasattr(z(, '_dynamo_unbacked_indices') else True)c                >    t        | d      rt        | dd       |k(  S dS )Nr  r  Tri  r  r  s     r   r  z+GuardBuilder.TENSOR_MATCH.<locals>.<lambda>  s0    &q*DE $A':DAXM  "& r   _dynamo_unbacked_boundsz&, '_dynamo_unbacked_bounds', None) == c                >    t        | d      rt        | dd       |k(  S dS )Nr  r  Tr  r  s     r   r  z+GuardBuilder.TENSOR_MATCH.<locals>.<lambda>  s0    &q*DE $A'@$G8S  "& r   r   )@rQ   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler1  r  r   rO   r  r>  r.  r  _dispatch_keysrp  rq  r  r  r/  log_compilation_metricsr2  	Parameterr6   in_progress	incrementnumelnbytesrN  r  r  r  ru  rV   r  rW   r   r  r  rw  r   r  ,skip_no_tensor_aliasing_guards_on_parametersr2   rt   r  r  input_source_to_sizes_stridesr  r  r  r  add_tensor_match_guardrV  r   r   r  rX  r   ri  r  add_dynamic_indices_guardr^  r  r<  r   r]  )r   rM  r  r  r  metrics_contexttensor_namer   termstermterm_src
real_valuerV  r  rE  r   r@  r   r  static_reasondynamic_indicesrz  	shape_idsunbacked_boundss                            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'.y%@(( #;-/TU  KK	***51FF1.y%@(( 5"<= '/BD II",[M9YZcYffst  tA  Ai  !jIKK	***51BB+4 
 /y%@(( 5"<=&-e5NPT&UO",[M9_`o_rr  AL  @M  Mu  !vIKK	***51BB+: 
 /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   r  r  r  weakrefr_  r>  r  r   enumEnumr<  
ProxyTypesset_export_info)r   rM  r4  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  z.Callable[[object], weakref.ref[object] | None]r  dict[str, object]r   r4  rV  r   r  CheckFunctionManagerr  r   r  r  r  =Callable[[Sequence[GuardFilterEntry]], Sequence[bool]] | Noner   r   )r  dict[Any, Any]rM  r:   r   r   )r  r7  rM  r:   r   r   )r  r   r   
Any | None)rX  rV   r&  r   r'  r   r  r   r(  r   r  r   r  r  r   r   )rX  r>   r   r   )rX  r>   r  zAKeysView[Any] | set[Any] | frozenset[Any] | dict[Any, Any] | Noner   r  )r  r  r   r   )r   r   )rX  r>   r   r   )rM  r:   r   r   r  )
r   r~  r   r~  r   r  r=  r   r   r   r   )rE  zGuard | Sourcer   dict[str, Any] | Noner   r   )rM  zstr | Guardr   r   )rM  r:   r  r   rV  z(Callable[[GuardBuilderBase, Guard], Any]r   r   )rM  r:   r  r  r   r   )rM  r:   r  r8  r   r   )rM  r:   r   r   )rM  r:   r  r   r   r   )rM  r:   r  r   r   r   )rM  r:   r  r  r   r   )rM  r:   r  r8  r   r   )rM  r:   ry  r>   r   r   )NN)
rM  r:   r4  r~  r\  r8  r  r  r   r   )Mr   r   r   r   r  r  r7  r  r  r  r  r  r  r  r  rB  r  rN  rS  rn  rb  ri  ru  r  rz  r  r  r  r  r  r  r  r  r  r  rr  r  r  r  rH  rL  r  rO  rT  r  rX  rZ  r  r$  r*  r4  r>  rB  rG  rL  r_  ra  rN  rS  r[  ra  rk  rs  r|  r  r  r  r  r  r  r  r  r  r  r  r"  r]  r  r   r   r  r    s    "9=LFLF -LF ,	LF
 HLF 'LF (LF +LF /LF LF 7LFLF 
LF\+49	<'R  "YY )Y  	Y
 Y Y Y -Y 
Yv9""" 
"0?
\|L 26 YY &Y /	Y
 Y 
YP /3' , 
	&   ;	
 
$ 
 S5050n MF
 0400",0	0	08 8?
	
8 "
 "
 L90	0  L=0	0  L90	0$ L=0	0$ 29	" 15

	

 29>	> :>%?%?,6%?	%?N 19	
		
 =D

	

 
 
 
 
( 
 
8 1'#
	#
J ,"
	
 * 
	
& 29n	n` 29	%		% Q



> 29	( 29$	$
 29'	' 29'	' '
'	
' 29.	. 7>	< FM
	
& HO
	
. W


* , ,\ 19
	
 ?F

	

 CJC	C2 17$	$       
 
 
 
 
 
 w wr K
h9h9^ /3)-1
1
 1
 ",	1

 '1
 
1
r   r  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)PyExprCSEPassrP   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_nameNr5  r  r   r   Configr=  0  s    ""$$r   r@  c                  (     e Zd ZddZd fdZ xZS )PyExprCSEPass.ExprCounterc                    || _         y r   )_config)r   rQ   s     r   r   z"PyExprCSEPass.ExprCounter.__init__6  s	    !DLr   c                    t        |t        j                        r*| j                  j                  t        |      xx   dz  cc<   t        |   |       y r   )r   r;  ALLOWED_NODE_TYPESrD  r>  r  r   r   )r   r   r   s     r   r   zPyExprCSEPass.ExprCounter.visit9  s>    $ @ @A''T(:;q@;GM$r   )rQ   r=  r   r   )r   ast.ASTr   r   r   r   r   r   r   r   r   s   @r   ExprCounterrB  5  s    	"	  	 r   rI  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   rD  	_gen_namepreface)r   rQ   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   r;  rF  r  rD  r>  USE_THRESHOLDr?  r   r   rM  rN  rw  r  NameLoad)r   r   exprnode_expr_r   r   s         r   r   zPyExprCSEPass.Replacer.visitI  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   )rQ   r=  rO  zCallable[[], str]r   r   )r   rG  r   r   rH  r   s   @r   ReplacerrK  >  s.    	)(	) (	) 		)	' 	'r   rW  c                j    d| _         | j                  t        j                  d       i       | _        y )Nr   c                      yr   r  r  r   r   r  z(PyExprCSEPass.__init__.<locals>.<lambda>f  r  r   )r>  r?  )_counterr@  r  defaultdictrD  r   s    r   r   zPyExprCSEPass.__init__c  s.    {{"..y9 # 
r   c                P    | | j                    }| xj                   dz  c_         |S r   )rZ  )r   r   r  s      r   _new_varzPyExprCSEPass._new_vari  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)	rI  rD  r   r  parseSyntaxErrorrK  	exceptionlineno)r   r  countereexs        r   countzPyExprCSEPass.countn  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   )rW  rD  r]  r   r  r_  rN  r  )r   rT  replacernew_nodes       r   r  zPyExprCSEPass.replacew  sF    ==t}}=>>#))D/2h!777r   Nr  )_var)r   r   r   r   )r  r~  r   r   rT  r   r   ztuple[list[str], str])r   r   r   rQ  r  	AttributeCall	SubscriptrF  dataclasses	dataclassr@  NodeVisitorrI  NodeTransformerrW  r   r]  rf  r  r  r   r   r;  r;  (  sx     M --3==A% % % coo  #'3&& #'J

8r   r;  c                    t        | j                  t              xs. t        j                  xr | j
                  t        j                  u S r   )r   r  ra   rQ    guard_nn_modules_using_dict_tagsrV  r  r>  )rM  s    r   must_add_nn_module_guardsru  }  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__  s    #) r   c                    d | _         y r   )r   r   s    r   r  z6DeletedGuardManagerWrapper.populate_diff_guard_manager  s
    #r   )rz  r   r   r   r  )r   r   r   r   r  r   r   s   @r   rw  rw    s    *$r   rw  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded	<   y
)r  rG   r  r   z_CppShapeGuardsHelper | Noner  r   r  r  r  Nr5  r  r   r   r  r    s     ))**00##r   r  c                  "    e Zd ZU ded<   ded<   y)GuardsStater   r  ShapeCodeParts | Noner  Nr5  r  r   r   r~  r~    s    ((++r   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   rz  s     r   r   z_Missing.__init__  s	    r   c                "    d| j                    dS Nz	_Missing(rT  r  r   s    r   __repr__z_Missing.__repr__      4<<.**r   c                "    d| j                    dS r  r  r   s    r   rk  z_Missing.__str__  r  r   c                    t               S r   )r  )r   r   kwargss      r   __call__z_Missing.__call__  s
    zr   r   )rz  r  r   r   r   )r   r   r  r   r   r   )r   r   r   r   r  rk  r  r  r   r   r  r    s    ++
r   r  c                     t         j                  j                  t        j                  f} 	 | t         j                  j
                  j                  fz  } | S # t        $ r Y | S w xY wr   )r.  r  r  r'  r   _distributed_c10dProcessGroupAttributeError)rG  s    r   _get_unsupported_typesr    sa     	C**7799 J  Js   (A 	A#"A#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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.  rp  FakeTensorMode	fake_modefake_tensorFakeTensorConvertertensor_converterr  empty_valuesmissing_values)r   r  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.  r2  r3  __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.  rp  r  r  r  from_meta_and_devicer  r   from_raw_reprgrad)	rF  meta_tensorr  r  dispatch_keys_rawr  r  r  rG  s	            r   _unpickle_tensorz#GuardsStatePickler._unpickle_tensor  sv     %%446	 ,,88LLN33HH##112CD
 
r   c                    t        |      }|j                  |j                         }	}t        |      j	                  ||||	      }
||
_        t        j                  j                  j                  |      |
_
        |
S r   )r!  r?  r@  r>  __tensor_unflatten__r  r.  r  r   r  r  )rF  r  r  r  r  ctx
inner_datainner_tensors
outer_sizeouter_strider.  s              r   $_unpickle_traceable_wrapper_subclassz7GuardsStatePickler._unpickle_traceable_wrapper_subclass  sp     Z(#.#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  r  s     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  r  CInterpreterdeserialize)rF  jsons     r   _unpickle_functorch_interpreterz2GuardsStatePickler._unpickle_functorch_interpreter  s%     xx""//;;DAAr   c                ,    t        j                  |      S r   )r4  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                  ||      S r   )	itertoolsrf  )rF  r  rj  s      r   _unpickle_count_iterz'GuardsStatePickler._unpickle_count_iter  s    tT**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.  r2  parallelDistributedDataParallel__new__r3  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        t        t        t        j                  |      |      |      S r   )r  r.  r  )rF  	namespaceopnameoverloadnames       r   _unpickle_opzGuardsStatePickler._unpickle_op1  s!    wwuyy)<fE|TTr   c                .    t        j                  ||      S r   )r4  r6  )rF  funcr  s      r   _unpickle_bound_methodz)GuardsStatePickler._unpickle_bound_method5  s    d++r   c                ^    t        t        j                  j                  j                  |       S r   )r  r.  r2  	attention
SDPBackendr  s    r   _unpickle_sdp_backendz(GuardsStatePickler._unpickle_sdp_backend9  s!     uxx))44d;;r   c                J    dfd}|j                   J |j                   d   S )Nc                      S r   r  )r`  s   r   r  z,GuardsStatePickler._unpickle_cell.<locals>._@  s    Jr   r   )r   r   )r   )rF  r`  r  s    ` r   _unpickle_cellz!GuardsStatePickler._unpickle_cell>  s)    	 }}(((}}Qr   c                .    t        j                  ||      S r   )r  
namedtuple)rF  r  fieldss      r   _unpickle_named_tuple_typez-GuardsStatePickler._unpickle_named_tuple_typeF  s    
 %%dF33r   c                2    ddl m}  |j                  |      S )Nr   r   )torch._dynamo.packager   to_code_object)rF  serialized_coder   s      r   _unpickle_codez!GuardsStatePickler._unpickle_codeM  s    8,~,,_==r   c                r    t        j                  |      j                  }t        j                  |||||      S r   )r  r  r  r4  r5  )rF  r   r/  qualnameargdefsclosurer  s          r   _unpickle_nested_functionz,GuardsStatePickler._unpickle_nested_functionS  s3     ++F3<<	!!$	8WgNNr   c                   dd l }t        |      | j                  v r!t        |      j                  t        |      ffS t        j                  |      r.ddlm} t        |       j                   |j                  |      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 ]S  }t+        ||      }	t        |	t        j                        r|	| j&                  t        |	      <   |j-                  ||	f       U t        |       j.                  t        j0                  |d      |j                   t        |      t        j2                  j5                  |      j7                         ||ffS t        |      }
t        |t        j8                  j:                        r(|j<                  |j<                  nt        j                  }
t        |       j>                  t        j0                  |d|j@                        |j                   |
t        j2                  j5                  |      j7                         |jB                  ffS t        |t        jD                  jF                        rt        |      | j&                  vrt        d	fS |jH                  jK                         D ]s  }t        |t        j                  t        jD                  jF                  f      r8t        |      | j&                  v rPtM        |      r\|| j                  t        |      <   u t        |t        jD                  jN                  jP                        r&t        |       jR                  |jU                         ffS t        |      jV                  t        |      jX                  k(  rtZ        S |j\                  jT                  t        jD                  jF                  jT                  k(  rt        |       j^                  |jU                         ffS t        j`                  |      r"t        |       jb                  |jX                  ffS t        |t        j2                  jd                        r&t        |       jf                  |j7                         ffS t        |t        j2                  jh                  jj                        r&t        |       jl                  |jo                         ffS t        jp                  |      rIts        ||jt                        r3tw        |d
      r'tw        |d      sJ |jx                  |jz                  ffS t        jp                  |      rbts        |t|              rRtw        |d      rF|jV                  |jX                  k7  r-t        |       j~                  |jX                  |j                  ffS t        |t        j                        rt        d| d|j                   d      t        |t        j                        r&t        |       j                  |j                         ffS t        |      t        u r9t        |      \  }}|tZ        ur4|tZ        ur+t        |       j                  ||ffS t        |t        j                  j                  j                        r!t        |       j                  t        |      ffS t        |t        j                  j                        r=|j                  j                  d      r"t        |       j                  |jX                  ffS t        |t        j                  j                        r8t        |       j                  |j                  |j                  |j                  ffS |j\                  j                  dk(  r!|j\                  jX                  dk(  rt        dfS t        |t                     rt        dfS t        j                  |      rd|jV                  v rNt        |       j                  |j                  |j                  |jV                  |j                  |j                  ffS |j                  t        j                  v r"t        j                  |j                     }|jV                  j                  d      D ]  }t+        ||d       } ||urt        dfS t        j                  |      rl|j                  }|j                  }t+        ||jX                        }t        j                  |      r|j                  }||urdt        |       j                  ||ffS t        |t         d d      j                  d               r"t        |       j                  |j                  ffS tw        t        j                  d      rMt        |t        j                  j                  j                        rt        |      | j&                  vrt        dfS t        |t        jD                  j                  j                        r"t        |       j                  |j                  ffS t        |      jV                  t        |      jX                  k7  rOt        |t|              s?t        j                  j                  j                  dt        |       d| ddz   dz         t        jp                  |      rtw        t        j                  d       rts        |t        j                  j                  j                  j                        r|t        j                  j                  j                  j                  ur|j                  d!   }ts        |t        jD                  jF                        sJ |t        j                  j                  j                  j                  j                         v sJ t        |       j                  |ffS tZ        S )"Nr   r   )zmissing valuesmeta)is_traceable_wrapper_subclass)ztensor guard tree)r  )r  r  )zmodule guard tree_torch_handler_name_torch_unpicklerr  zCannot serialize SymInt z (node: rT  z_C::r  	PyCapsule)capsule)unsupportedz<locals>r  )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  r7  )ysympyr^  r  r>  r  r  iscoder  r   r  from_code_objectr  r  r   r.  r/  r  torch.utils._python_dispatchr  r  rD  r  rw  r  
empty_liker  r  r  rp  rq  r  r  r  r  r2  r3  r  r#  r   r  r  r  r  r   r   NotImplementedr   r  rK  r  r   r  r  r  r  	serializerF  r  Functionri  r  r  r<  r  r  r  r  r   r4  r  r  r  _COUNT_ITERATOR_TYPEr   r  r  r  r   r  r  _opsOpOverloadPacket_qualified_op_name
startswithr  
OpOverloadr  r  _opname_overloadnamer   r  
isfunctionr  r   r   r   r  modulesru  ismethodr   __self__r  r  r+  r  r  Workr  r  r  r  rS   PackageErrorr  r  
FSDPModuler   r  r  )r   r  r  r   r  r  attrsr  r  innerr  r  rj  fr  r  method_self
inner_funcr  s                      r   reducer_overridez#GuardsStatePickler.reducer_override`  s	    	c7d'''9$$tCyl22>>#<:,,/N~/N/Ns/S.UUUc7d)))000c5<<(SZZ__-FR#wd444!777,S1  
 335
s! 5D#C.E!%6<A..r%y9%%tUm4	5 DzFF$$S8JJIHH++C099;I   #YF#u00;;<'*zz'=5<<:..  V3CTCTU

'',5571   UXX__-#wd444!777++- 5dU\\588??$CDd8t555D>04##BtH-5 #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 OOC 3&Y'  CLL0:883<<:UUUU\\*!9#hsxxjPQRSSU334:55
}DD#Y..-c2JD$>)d..HDz66tDDU]]00::;:11DI<??,,
$$//7:,,s||o==UZZ223:**!!-   MM$$
2&&+5 \))356---$S---Dz;;LLNN$$$$OO>   ~~,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
3PU@V--##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   )r  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  r  r   r  )r  r  r  r  r  r>  r  r!  r  r   r  zlist[tuple[str, Any]]r   r  )r  r   r   ztypes.ModuleType)r  r!  r   ztorch._C.DispatchKeySet)r  bytesr   z torch._C._functorch.CInterpreter)r  r7  r   z types.MappingProxyType[Any, Any])r  	list[Any]r   r   )r  r!  rj  r!  r   zitertools.count[int])r  type[torch.nn.Module]r   r  )r  zdict[str, Any]r   z)torch.nn.parallel.DistributedDataParallel)r  r   r   r   )r  r   r  r   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  r  r   ztype[NamedTuple])r  r   r   r3  )r   r3  r/  r   r  r   r  ztuple[object, ...] | Noner  z!tuple[types.CellType, ...] | Noner   ztypes.FunctionType)r  r   r   z0tuple[Callable[..., Any], tuple[Any, ...]] | Any)r   r   r   r   r8  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7  r  r  r  r  r  r  r   r   s   @r   r  r    s   -)- %- '	-
 - - 
-  
 !  	
   
 ( !  	
   * 
 & . . ? ? BB	)B B
 ))	)) )
 + + + + 
1
	
 
 "	2  + + U U , , < <     44 /4	4 4 > >
 	O	O 	O 		O
 +	O 3	O 
	O 	OII	9Ir   r  c           	     B   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)Nrg  FTr  )r  	has_valuer  
guard_typederived_guard_types	is_global
orig_guard)
r  strip_local_scoper  r  r+   r  r   create_fn_nameguard_typesr<  )rM  builderMISSINGr  r!  r  r$  s          r   make_guard_filter_entryr+  ,  s    hGUZZ(Drz			
 KK&EI 'u'?'?@LI'')9>9J9JU5#4#45PR 		EIs   B Bc                   t        j                         }i }i }|j                  }t        j                  | j
                  j                        }|D ]  }t        j                  |      rYt        |d      rM|j                  }t        |      |vs>	 t        |      j                  t        |             ||t        |      <   qt        |      |vs||t        |      <    t        ||||      }	t        t         j"                  j%                  | j
                  j&                  D 
cg c]  }
t)        |
|       c}
            r*t+               | j
                  _        i | j
                  _        	 |	j1                  |        |j=                         S #  Y BxY wc c}
w # t2        $ r8}t         j4                  j6                  j9                  t;        |            |d }~ww xY w)Nr  )ioBytesIOr  r  tree_leavesr  r  r  r  ri  r  r^  r>  r  r  r  r.  compilerkeep_portable_guards_unsafer   r+  r   r  r   dumpr  r  rS   r  r   rj  )r  r)  bufr  r  r  leavesleafr  picklerrM  rd  s               r   pickle_guards_stater7  I  s    **,CLN11 2 2 > >?F ,D!gdJ&?==D$x00J&&tDz2-1LD* X.. (,N2d8$, !!2L.RUVG
22 #//66 (w7	
 14-*,'<U <<>1  <mm,,SV4!;<s*   1F#F,F F	G#3GG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)r5  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,                        }t         j.                  j1                         5  |r j3                  ||||d      \  }} ||D cg c]  }t5        ||       c}      }t7        |      t7        |      k(  sJ t9        d |D              sJ t;        |      D cg c]  \  }}||   s| }}} j3                  ||||||	      \  }}| _         j?                  |||       d d d        j@                   j<                  _         tB        jE                  d
 j<                         |j@                   j<                  _         d|jF                  s|jH                  s j<                  jK                  |jL                        sCtO         j<                  |jL                  tQ        jR                         d       }tU        d|       tV        !tW         j<                  |jL                  |       tY         j<                  jZ                  |jL                  d      tB        jE                  dd       t]        j^                  dta                     d  _1        |rAddl2m3} ti         j                  |      sJ 	  jk                  || j                         _1        t         j|                  j                  d fd        j                  j                          d  _        y c c}w c c}}w # 1 sw Y   xY w# tl        jn                  $ r|}t         j"                  j$                  jp                  s|	r| j                  js                  dtu        |       tw        jx                         j{                  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)r  rN  r  rz  r  rz  z7%s guard on %s is dropped with caching_precompile=True.T)r  rw  r"  r#  rK  rL  r%  r  )r   rG  keepr<  _guard_filter_fns       r   r  z6CheckFunctionManager.__init__.<locals>.guard_filter_fn  s    "#3F#;VD )GD!

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

5)

4(+), 
r   r  )r  Fc              3  >   K   | ]  }t        |      t        u   y wr   )r>  r   )r  ro  s     r   r  z0CheckFunctionManager.__init__.<locals>.<genexpr>  s     Cq47d?Cs   )r  %sg        )backendziGuard failed on the same frame it was created. This is a bug - please create an issue.Guard fail reason: rP   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 = rC  z us)rV  )latencyr   s   r   r  z/CheckFunctionManager.__init__.<locals>.<lambda>7  s     $"4"4!55GPS}TWX r   
payload_fn)r   zSequence[GuardFilterEntry]r   zSequence[bool])Ar   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesr  r  r  rL   rR  rv  rw  r  r  r  rE   rK  rL  r.  r  rQ   caching_precompiler   r:   sort_keyr  DisableTorchFunctionbuild_guardsr+  r   r  r  rV  compile_check_fnr   r8  r9  skip_guards_checkr  rm  r  get_guard_fail_reason_helperr7   r  r&  r   r$   r   r5   increment_toplevelr!  guards_stater  r   r   serialize_guardsrS   r  strict_precompilebypass_packager   rE  
format_excru  _loggingtrace_structuredclear)r   r  r  r   r   r  r  r  r  strict_errorr   existing_diff_guard_sourcessorted_guardsr)  rV  rM  filter_resultsr  reasonsr   rd  r?  rH  s   `                    @@r   r   zCheckFunctionManager.__init__{  sD    )5$$$;= B+N 	$ 7C  ,,, !1
 7CL22 	& 3=,;E<'<FL($8!MQMQ/BCKKST ==22.Q3P4 v|@ XX**,  	I *.):):!/ *& "1JWX,UG<X" >*c-.@@@@CNCCCC*3M*B!&anUVFWE! !
 &*%6%6+ / &7 &"G] "/D!!'=-HA 	IT .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*.Dd//1BCCC
$($9$9]D,=,=%! 	''#X 	( 	
 	 ] Y!# 	I  	IJ ## ==''99\G!!00/Ax8'224::4@ 1  sJ   '!O+O 
AO+O%+O%/7O+7"O8  O++O58RA2RR)rz  r>  r  rB  rG  rL  rN  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&                        }tM        ||      S c c}}w c c}}w c c}}w )Nr  )ru  rS  z guard cannot be serialized.c              3  D   K   | ]  }|t         j                  v r|  y wr   )r5  rb  )r  r  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>g  s'      0VVV s    rg  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,   )rX  r  builtins_dict_nameused_global_varsused_local_varss     r   prune_variablez=CheckFunctionManager.serialize_guards.<locals>.prune_variablew  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   rO   r'  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  rl  s     r   r  zUCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>.<genexpr>  s      9Qa 9s   )ro  r   r   r   )r   	functoolspartialr<  r   rW  r   r  )ro  new_argskvnew_keywordsrl  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_weakrefrV  )ro  r  rV  )r  rM  rt  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>  s@         ''$(.2"5eoo"F	 s   36T)r  r   _guardsr  rR  )r  r  )rX  r>   r   r   )ro  Callable[..., None]r   ry  )'r'  r(  r<  rr  r  r  r5  rb  r.  r  rS   r  next%name_of_builtins_dict_key_in_fglobalsr   dump_guards_stater   r  rw   r  r  r  r   r   rw  rR  ro  r  r  rv  rx  	GuardsSetrL   r  tree_mapr  r  r~  r7  )r   r)  r_  r  rM  r"  r#  r  failedri  output_graph_guards_staterX  rq  rr  global_scope_staterU  rf  rt  rg  rh  s                   @@@@r   rV  z%CheckFunctionManager.serialize_guardsO  s*    # 	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

 #<99W

2
s   K8	K>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  rN  )rX  r  	r_builder	w_builders      r   r  z5CheckFunctionManager.build_guards.<locals>.source_ref  sV    !..L{333{{"9!I((($$V[[11r   )r  r  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   r  )rX  r>   r   r   )r  zweakref.ref[GuardBuilder]r   r   )r   r   r  r  r  r  r   r  r'  r_  rQ   r  rE   r/  r  r  rP  )r   r_  r^  r  r  r  r  rV  r  r)  r  guard_on_nn_modulesrM  r  s                @r   rP  z!CheckFunctionManager.build_guards  s    ,-+F(		2 KK  $$%%!%!:!:+
	 KK9	$55 
//;
 # 	"E'224 #%**4$EJJ655

9RLL!	" %%r   c                >	   |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d        t(        j*                  rA|j,                  r5t/        t0        t3        |j,                         \  }}|j5                  ||       | j6                  r| j6                  j8                  ng }|D ]N  }t;        |t<              rk|j>                  }|j@                  }|jB                   d	|jB                   }tE        |jG                  |      |jG                  |      |gd         ||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 d       CtQ        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 )NrA  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  rD   from_tracebackr  r  )rz  rM  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   rg  z
Stack:
z
User stack:
zGuard: %s%s%s)r  r8  r9  rw  verbose_guards_logisEnabledForloggingDEBUGr  r6  formatr  )	rz  rM  log_onlyry  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   TrP   zcheck_no_aliasing(rS  rT  ru  zcheck_overlapping(overlapping=[c              3  4   K   | ]  }|j                     y wr   r  r  rZ  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   rI  rm  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr  r   r   )rz  r   rM  Guard | Noner  r   r   r   )Ar  r8  r9  rV  r   attach_compile_idr   r7   r  r  r   r   r4  rM  r   r  r   r   r  r6  rQ   rx  r  r  r  r  rB  r  aotautograd_guardsr   r9   input_source_ainput_source_br  r    r  r?   overlapping_sourcesnon_overlapping_sourcesr!   r  r  r.  rZ  r[  rR   initial_global_stateGlobalStateGuardrm  r  r  r  rJ   r  r  r  r   r   r  r   r   r   r   r   r   )r   r)  
guards_outr   largsr  seengclr   r  check_tensors_fncheck_tensors_verbose_fnaliasing_code_partsaliasing_verbose_code_partsr  rM  source_ary  rz  rZ  overlapping_guard_managersnon_overlapping_guard_managerscheck_global_stater   rA  r   r  r   s                            @@@r   rQ  z%CheckFunctionManager.compile_check_fn  s      '((# 
CE 	111134	

 *.& CH)	=)	=#/)	=;?)	=)	=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DE"	EL )) 	5C 5 dCIIt45	5  NN++,W ,  --5!.!?!?!A!G!G!():):GT!J 0(@%7262Y2Y	

 
  !
 	##% #W]]3%78 :!###*6'"'<<>0B-*>'+8( *.&)-&8P5K.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 )NrV  zCache line invalidated because z got deallocated)	ri  r   rV  rw  r   r   r   r   
invalidate)r   obj_strr   r   rz  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  )	r^  rK  r'  r_  r  rn  ro  r  r  )r   r  r  s      r   r  zCheckFunctionManager.id_ref  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)r^  rK  )r   r  s     r   r  z$CheckFunctionManager.lookup_weakrefs  s(    c7dnn$>>"S'**r   )NNNNNFF)r  r3  r  r   r   CacheEntry | Noner   "Callable[[GuardFail], None] | Noner  r6  r  r  r  r9  r  r   r]  r   r   r   )r)  r  r_  list[Guard]r  r   r   r  r   )r_  r  r^  r  r  r3  r  r   r  r   r  r6  r   z(tuple[GuardBuilder, GuardManagerWrapper])r)  r  r  r  r   r  r   r   )r  r   r   r   )r  r  r  r   r   r!  )r  r  r   zweakref.ref[object] | None)r   r   r   r   rb  r   rV  rP  rQ  r  r  r  r  r   r   r5  r5  z  sj   
 *.<@266:!"G!G! (G! '	G!
 :G!G! 0G! 4G! G! G! 
G!R	H)+D 	z:z: #z: (	z:
 
z:H A&"A& &5A& 	A&
 -A& A&A& 
2A&FHQHQ  HQ :	HQ
 
HQT7&r   r5  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  )rT  csepasss    r   r  z%build_guard_function.<locals>.replace  s    ??4((r   c                
    g | fS r   r  )rT  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 guardrk  )
torch._inductor.utilsrA   r;  rf  RecursionErrorrd  r   r]  splicerj  )
r   closure_argsrA   r  
guard_bodyrT  rN  rM  make_guard_fnr  s
            @r   r7  r7    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.  rZ  	_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  1  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  moder4  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   rk  )initial_stackro  r  r4  s      @r   r  r  6  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__rP   rS  zDuplicate tensors found: )r   r!  r  r[  r  r   r^  evalrw  r   r6  )	rV  r  r   ids_to_sourcer  	tensor_idr  duplicate_tensorsrz  s	            r   1recompilation_reason_for_no_tensor_aliasing_guardr  M  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)rZ  r  patterns      r   r&  r&  `  s     +G66'5!$$r   c           	     R   | t        |       dk(  ryg }| D ]  }|j                  }|j                  }|j                  }|j                  r|j                  j                         nd}|j                  d| d| d|        |sl|j                  d|         dj                  |      S )z
    Format the user stack trace for display in guard failure messages.

    Returns a formatted string representation of the stack trace,
    or an empty string if no user stack is available.
    r   rg  z  File "z", line z, in     r  )r   r  rb  r  r   striprw  r6  )r  linesframer  rb  r  source_lines          r   format_user_stack_tracer  m  s     S_1E />>zz,1JJejj&&(Bxz&tfEFLL4}-./ 99Ur   c                    | j                   J | j                  J || j                   d   d}|j                  | j                         g }d}| j                  r| j                  j                  }d}g }| j                  |      }	d}
|	j                  sJ|	j                  }t        |      dk(  rd|d   v rd	}n|}g }|	j                  rBt        |	j                        }
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 t        |      dk(  r| d|d    }n| ddj+                  |      z   }|
r|d|
 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.
    Nr  r  Frg  rP   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  rL  z; z
User stack trace:
)r   r   r  r   rB  rq  resultr   r   r  r  rw  r  r!  rN   r  r  r  r   r   r   r6  r&  )rV  f_locals
compile_idrB  r  ra  cache_entry_backendno_tensor_aliasing_check_failedr   guard_debug_infouser_stack_strrz  rP  r   fail_reason
reason_strs                   r   rS  rS    sV    %%111%%111!;!;C!@AE	LL++,G  +77??&+#$&$228<N
 ""-@@ !"a''+=a+@@26/,%'" &&45E5P5PQN		'N 	 	v2 	 	v&C5
 ' 	D : :;L15L-./1 "&t\5"AK +t,["+s+{+46'	. 7|q"|2gaj\2
"|2&7);;
-n-=>>
Z((/ ! 46   	 s*   HG""H5H?HHH	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)NrL  zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   rw  ry  rS  r   r   rw  r   r   r  rK  ra  )rV  r   r  r  rB  skip_loggingr  s          r   get_guard_fail_reasonr    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  r]  )r  r  rz  s      r   r  z:get_and_maybe_log_recompilation_reasons.<locals>.<genexpr>3  s5      #Av <(8??64+HH#s   *,r  r  z-triggered by the following guard failure(s):
zRecompiling function z in :r  artifactc                     dddS )Nrecompile_reasonsr  )r  encodingr  r  r   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>J  s    '
 r   c                 .    t               dk(  r d   S  S )NrP   r   rU  )ra  s   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>N  s    W):71:  r   )metadata_fnrJ  )r  rV  r   r  r  rw  rz  r  r  r  rQ   error_on_recompiler6  r  r  r]  r&  co_filenameco_firstlinenorecompiles_verbose_logr9  recompiles_logrS   RecompileErrorr.  rZ  r[  )r   r  rB  r  rz  r   do_recompiles_logfailuresguard_failure_detailsmessagera  s             @r   'get_and_maybe_log_recompilation_reasonsr    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##
 H $  Nr   c                   | }t               }| 8|j                  | j                  j                                | j                  } | 8|} | :|| j                  _        | j                  j                          | j                  } | :|S r   )rL   r  rV  r  rz  r   r  )r   first_cache_entryacc_diff_guard_sourcess      r   rL  rL  T  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 rS  z and
  r  zMalformed guard:
)
printr&  r  r  r6  r   r   r   r  r   )rV  r   r  r   lastr  rM  s          r   guard_error_hookr  o  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  ro  s      r   uniquer    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.)ry  )	r/   r.   rS   UnsafeScriptObjectErrorr  rn  ro  r  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                   ddl m} |j                         j                  }|j                  ryt
        j                  t        j                        xs# t        j                  t        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   )TracingContextNrP   )collect_debug_stackr"  )torch._guardsr$  r  guards_contextskip_installr8  r  r  r  r  r  r   r   r:   r1   r  )r"  r   r$  r'  r%  r   rM  s          r   install_guardr)    s     -#'')88N""$11 8		(	(	7  
&
&
*
*C K%'''$U%=%=>E':J	Kr   rj  z"dict[str, GuardCheckSpec | object]GUARD_VALUE_DISPATCHr  r7  z9GuardBuilder methods missing guard_check_spec decorator: rS  z[. Use @register_guard_check_spec, @skip_guard_check_spec, or @unsupported_guard_check_spec.)r   r3  r   r   r   r!  )r  r   r   r  )r   zset[str])r   r4  )r   rG  r   r   )rz  r   rM  r  r   r   r   )r   zstr | list[str]rM  r  r  r  r   r~  )rX  Source | Noner   r  )r  r   r   z
int | None)r  r  r   list[int | None])r  r  r  r   r  r,  r  r,  r  r>  r  r   r   r   )r  r7  r  r   r   r!  )rX  r   r   r   r   r   )r  r   r   r
   )r  r   r   r   )rX  z-DictGetItemSource | DictSubclassGetItemSourcer&  r   r'  r   r  r   r  r  r   r   )rM  r:   r   r   )r   r3  r   r~  )rY  r  r   tuple[Any, ...])rM  r   r  r   r   r-  )r  r   rE  r-  r   r   )rM  r   r  r   r   r   )r  r   rE  r   r   r   )r  r   r   r   )r   ztuple[type, ...])rM  r:   r)  r  r   r   )r  r~  r)  r  r   r  )r   r~  r  r   r   ztuple[str, str]r  )r  z'list[torch.overrides.TorchFunctionMode]r   zCallable[[], bool])rV  r   r  r  r   r~  )rZ  r   r   r   )r  ztraceback.StackSummary | Noner   r   )
rV  r   r  r4  r  zCompileId | NonerB  zCallable | Noner   r   r   )rV  r   r   r3  r  r4  r  r8   rB  r   r  r   r   r   )
r   r  r  r   rB  r   r  r   r   r~  )r   r  r   r  )rV  r   r   r3  r  r4  r   r!  r  r   r   r   )r  zSequence[T]r   zGenerator[T, None, None])r  r>   r  r+  r   zfunctools.partial[Any] | None)r   r:   r"  r!  r   r   (D  r  
__future__r   r  r  r  ro  r(  rn  r  r  r-  r  r  r  pickler  r  rE  r4  r  r'  
contextlibr   r  r   r   typingr   r	   r
   r   typing_extensionsr   r   r   r   r.  torch.overridestorch.utils._devicetorch._C._dynamo.eval_framer   torch._C._dynamo.guardsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   torch._dynamo.sourcer+   r,   r-   r.   r/   r0   r1   r2   r3   r4   torch._dynamo.utilsr5   r6   r&  r7   r8   r9   r:   r;   r<   r=   r>   r?   r  rA   torch._library.opaque_objectrB   rC   torch._loggingrD   torch._utils_internalrE   %torch.fx.experimental.symbolic_shapesrF   rG   rH   rI   rJ   torch.utilsrK   r  torch.utils._ordered_setrL   torch.utils._tracebackrM   rN   torch.utils.weakrO   rg  rQ   rR   rS   
eval_framerT   rX  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   r>  rf  r  numpyr  ModuleNotFoundErrorr   r   r   r  r   torch._Cr   r  r   r   r  r   r   	getLoggerr   rK  rZ  getArtifactLoggerr8  r	  r  r  r:  r   r   r   r  cacher  r  r  r  r  r  rI  r  r  r  r  r  r  r  r  r  r  rp  r  r,  r1  r3  r)  r  r   r;  r  rp  rA  rH  rL  rO  rT  rX  rZ  r_  ra  rf  rn  rr  rt  r  r  r;  ru  rw  r  r~  r  r  Picklerr  r+  r7  r5  r7  r  r  r  r!  r   r  r  r&  r  rS  r  r  rL  r  r  r!  r)  dirr  rl  r*  isupperr	  r   _methodr   r  	signature
parameters_paramsri  MISSING_GUARD_SPECSr  r6  )r  rl  rv  rL  rO  s   00000r   <module>rQ     s  " # 
        	     
      %    ; ; C C !    >      8   H
 
 
 1 R % 1  * / O * ( ( ,. . . . . . . . . . . .^      , ( HL D KOIOO-. 
 =='T4CLg!^^--hA
11(LI99"  ^^55h@PQ " ,~ , DT . . +/' .@/ hh&&:: %6 "&  	<,'K
  	
  " 	*31. d#  $*9*(* * 	*
 )* *Z
G   
tyy 
 8 8Z 6 X
E
-;
;
13!?X X$P&
# P&
HMR8 R8j$!4 $ $ $ $ , , ,
   
 
h hV:))) )bD
 D
N);XPX
+:++( 	gtCK012&2/422&
%-0h)&h)h) !h)
 h) 	h)d &
   	   	H B"BB 	B
 B BJ""""600
0  0 	0
 0 
0. % &!!%2!"!H /0 K< L!<7<68JDQQ 	'M< 8  \"	 	QxS!GL%>>?t-G--g6AABBGCqH
gG/0 
	  

C99()
* +D	E  m`  	BD`<	s   Z= >'[=B[=[[