
    ^j@s                      U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl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` ddlambZbmcZc ddldmeZe ddlfmgZg ddlhmiZimjZjmkZkmlZlmmZm ddlnmoZp ddlqmrZr ddlsmtZtmuZu ddlvmwZw ddlxmyZymzZzm{Z{ ddl|m}Z} ddl~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ 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 d0 d1      Zdd2Zej                  dd3       Zdad4ed5<   dd6Zdd7Ze%j                  j                  j                  Zdd8Zdd:Z	 d	 	 	 	 	 	 	 dd;Zdd<Zdd=Zdd>Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd?Zdd@ZddAZddBZddCZ ej                  dDE       G dF dG             Z	 	 	 	 	 	 	 	 	 	 	 	 ddIZddJZ ej                   G dK dL             Z G dM dHej                        Zej                  ddN       Z G dO dPe      Z e       ZddQZddRZ	ddSZ
ddTZddUZddVZddWZddXZddYZddZZd[ Zd\ Z G d] d^      Zd_ Z G d` daeX      Z G db dc      ZdddZ G de dfe      Zej                   G dg dh             Zej                   G di dj             Z G dk dl      Zej                  ddm       Z G dn doej<                        ZddpZ 	 	 	 	 	 	 ddqZ! G dr ds      Z"ddtZ#dduZ$ddvZ%	 	 	 	 ddwZ& e"dxe'e(ef         Z)	 	 	 	 	 	 ddyZ*ddzZ+	 	 	 	 dd{Z,dd|Z-	 	 	 	 	 	 	 	 	 	 dd}Z.	 d	 	 	 	 	 	 	 	 	 	 	 	 	 dd~Z/	 d	 	 	 	 	 	 	 	 	 ddZ0	 	 	 	 ddZ1	 	 	 	 	 	 	 	 	 	 	 	 ddZ2 e}e2       ddZ3	 	 	 	 	 	 ddZ4ddddZ5 e6e      D  ci c]"  }  e7 e7e|       dd      xa8	 | tp        $ c}} Z9ded<    e6e      D cg c]  }|d   ju                         r}|jw                  d      sk e< e7e|d      xa=      rU e> e? e
j                  tz              j                        xaB      dk\  rt        d   d9k(  r eCtz        d      s| c}}}ZDeDr eEddj                  eD       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)FakeScriptObject)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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 NrQ   )&code_framelocals_names_reversed_cachedlenindex)codevar_nameframelocals_names_reversedframelocals_idxs       _/var/www/ramen.bs-engineer-server.com/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_guardsrM   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                N   t        | t              rt        dt        |              | j	                         j
                  v xs | j                         dkD  }| j                         D ]  }| |      z  } |r)j
                  j                  | j	                                |S )N(Expected non-DictGuardManager node, got r   )	
isinstancer   AssertionErrortyper   r   r   get_child_managersr   )r   r   	child_mgrr   r   s      r   visit_managerzEGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_managerI  s    $ 01$>tDzlK 
 !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>.visitZ  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)rR   "use_recursive_dict_tags_for_guardsrF   find_tag_safe_rootsprepare_diff_guard_managerr   s    r   finalizezGuardManagerWrapper.finalizee  s/    44A:
 $$&'')r   c                D    | j                          | j                          y r   )r	  populate_diff_guard_managerr   s    r   r  z.GuardManagerWrapper.prepare_diff_guard_managerl  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t        d| j                                g }d}t	        | j                         j                               D ],  \  }\  }}| |       ||j                   |             . | j                         j                         D ]0  \  }}|r||j                         z  }|s||j                         z  }2 |r| j                          |S )NzExpected dict subclass, got T)
issubclassget_type_of_guarded_valuedictr   r   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$243Q3Q3S2TU   N"& -3++-335- :((w &'N&"))%.9: %)$?$?$A$H$H$J A '7+>+>+@@''7+>+>+@@'A #""$!!r   c                H   t        | t              rt        dt        |              g }| j	                         D ]  }|j                   |              | j                         rt        | j                         t        j                        r2| j                         rU| j                         sE| j                          |S t        d | j                         D              r	 |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.        j0                  t.        j2                  t4        t6        fv rt8        j:                  ru | t<        t>        t@        tB        tD        f      }| j                         D ],  }t        |tD              s||jG                         tH        v z  }. |r| j                          |S t        | j                         t.        jJ                        rE | tD        f      }|t#        d | j                         D              z  }|r| j                          |S t        | j                         tL              rU| jO                         jQ                  tH              r2t8        j:                  r" | tR        f      }|r| j                          |S t        | j                         t              r% | tT        tV        f      }|r| j                          |S )Nr   c              3  B   K   | ]  }|j                         d k(    yw)PythonLambdaGuardAccessorN)repr)r  as     r   r  zQGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager.<locals>.<genexpr>  s$       FFH ;;s   c              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  r  r$  is_guarded_value_immutabler!  r"  torchTensorhas_no_accessorshas_object_aliasing_guardr&  anyr  r#  r  r  nnModuler   r)   typesFunctionType
MethodTypestaticmethodclassmethodrR   )assume_dunder_attributes_remain_unchangedr   r   r   r   r   r2  dunder_attrs_assumed_constantsCellTypetupler   endswithr'   r(   r*   )	r   r'  r  r  r  r(  r  r  r   s	          r   r  z>GuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager  s   $ 01$>tDzlK 
  N!446 8	%%eI&678 ..0 d<<>M,,.t7U7U7W**,N "!M  !//1  | "!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>.visitM  s.    |	$ 01)$// &&r   N)r   r   r  ztuple[type[GuardAccessor], ...]r   r   )r   r   r   list[GuardManager])r   r   r   rF  )r   r!  r"  r4  r9  r:  mark_tag_safe_root)r   r'  r   r  r   r   r  s      @@@@r   r  z'GuardManagerWrapper.find_tag_safe_rootsp  sx    t		4S			">x	"t	' 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_managerY  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_fni  s    &&(N::r   )rM  r   r   r   )r   clone_manager)r   rN  rO  s    ` r   rI  z-GuardManagerWrapper.clone_with_chosen_sourcesf  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_linesn  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_linet  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   indentra  construct_manager_string)r   r  bodyidxr   r   s         r   construct_dict_manager_stringz1GuardManagerWrapper.construct_dict_manager_string  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=)rc  get_leaf_guardsr   r%   r   r   
writelinesrW  r   r   r   rg  r  r  r  r   ra  r,  rd  )r   r  re  rS  r  r  s         r   rd  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)NrQ    T)r   zTREE_GUARD_MANAGER:r&   get_epilogue_lambda_guards)r   r   r   r   rd  r   hasattrrm  rj  rW  getvalue)r   re  rS  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   rr  zGuardManagerWrapper.check  s    yyq!!r   c                8    | j                   j                  |      S r   )r   check_verbosers  s     r   rv  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   )ri  r   r%   r   r$  r   r  )r  rS  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   )r}  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   )rN  r  r   r&   )rS  r#   r   r  )r\  r   r]  
str | Noner   r   )r  r   re  r   r   r   )r  r   re  r   r   r   r   rt  r   r   r   )rt  r   r   r   )r   r   r   __doc__r   r   r   r	  r  r  r  r  rI  rW  ra  rg  rd  rp  rr  rv  r   r   r   r   r   
  s    @, 3 32'h*+g*R>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   )r4  	overrides_enable_torch_functionr   npgenericndarray	as_tensor)r-  s    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)r4  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rt  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_tensorr4  r  )r  r   r   collectionsOrderedDict__getitem__r   r   r   r   r   r   r   r   r   mathisnanr  float	importlibimport_moduler4  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
rl  )astunparsereplace)r   s    r   _ast_unparser    s    ;;t$$T2..r   c                ,    t         j                  |       S r   )r  __repr__r_  s    r   _safe_type_reprr  !  s    ==r   rS  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 )
Nrl  z  # T)r   i   r   z  # <unknown>z<60)
user_stackreversedfilenamer  rN   r   stacksummary)r  rS  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 )NrY   (HINT: rZ  )r   listr  _get_closure_var_hintoriginating_source)r   rS  recompile_hintr  r   closure_hintrV  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   rZ   freevar_namer   r[   base)r^  	full_namecurrentpath_suffixs       r   r  r  [  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t	        dt        |              | j                  j                         S )NzExpected torch.SymInt, got )rJ   r   r4  SymIntr   r  r   maybe_as_int)dims    r   convert_int_to_concrete_valuesr  q  sO    
{s
#u||, #>tCyk!JKKxx$$&&r   c                >    | D cg c]  }t        |       c}S c c}w r   )r  )size_or_strider  s     r   convert_to_concrete_valuesr  |  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(rY  z	, device=z, requires_grad=z, size=z	, stride=rZ  )	r4  _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    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  )r^  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   r4  r9  r:  )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                   | j                   j                  }t        | j                  t              r| j                  j                  }n=t        |t
              st        dt        |             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Expected dict, got [r  r   r^  example_valueguard_manager_enum == )r  r  r   r   r_   r#  r   r  r  r  r  r   intr   get_key_managerr"  GUARD_MANAGERadd_equals_match_guardget_value_manager)
r^  base_guard_managerbase_example_valuer'  r(  base_source_namer   
key_sourcekey_example_valuevalue_sources
             r   getitem_on_dict_managerr5    sM    {{''&,, 23"",d3 #6t<N7O6P!QRR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   ru   is_specialized_nn_moduleis_dict_keyrn   )rS  r^  s     r   match_on_id_for_tensorr:    sJ    %%F &+,%%'F
6:(F$FFr   c                  "    e Zd ZU ded<   ded<   y)GuardCodeListr  	code_listr:   rS  Nr   r   r   r   r  r   r   r<  r<    s    Lr   r<  c                      e Zd ZdZdZy)r"  rQ      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   rD  rD  	  s    , Lr   rD  c                |    | j                   | j                         | j                  | j                  | j                  fS r   )shapestrider  r  r  r  s    r   extract_tensor_metadatarJ  (  s)    GGQXXZ!((AOODDr   c                r    t        |j                         d         }t        |      }t        |d      }|||fS )NrQ   __metadata_guard__)r   __tensor_flatten__r  rn  )rS  r  metadataclshas_custom_guards        r   extract_subclass_metadatarQ  -  s?    002156H
u+Cu&:;c+,,r   c                    |\  }}}|r#|j                  || j                         d         S | j                         d   |k(  S r   rL  rM  )r  rN  saved_metadatarO  rP  s        r   check_subclass_metadatarU  5  sM    ,4)NC)%%ne6N6N6PQR6STT##%a(N::r   c                    t        |      S r   r   rS  r  s     r   extract_dtensor_specrX  =  s    E?r   c                (    | j                  |d      S )NT)skip_shapes)_check_equalsr  rN  s     r   check_dtensor_specr]  B  s    xT::r   c                |    t        t        |            }|r|j                  sy t        |j                  |            S r   )rC   r  guard_fnr   )rS  r  opaque_infos      r   extract_opaque_objra  G  s4    %d5k2Kk22K((/00r   c                |    |yt        t        |             }|r|j                  s|d u S |j                  |       |k(  S NT)rC   r  r_  )r  rN  r`  s      r   check_opaque_objrd  O  sE    %d5k2Kk224&(22r   c                ~    t        |      t        j                  u rt        |d      r|j                  S t        |      S Nr   r  r;  r<  rn  r   idrW  s     r   extract_closureri  Y  s1    E{e(((WUJ-G~~e9r   c                    t        |       t        j                  u rt        | d      r| j                  |u S t        |       |k(  S rf  rg  r\  s     r   check_closurerk  `  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.rQ   _CONSTANT_BASE_TYPESzNot a constant subclass: )variables.user_definedrn  r   r  r  )r  rn  r_  s      r   _constant_subclass_base_valuerp  f  s@    <! eQU8O /U}=
>>r   c                ,    t        | |      fd}|S )z<Attach a GuardCheckSpec to a guard method for auto-dispatch.rE  rF  c                    | _         | S r   )guard_check_spec)fnhandlers    r   	decoratorz,register_guard_check_spec.<locals>.decoratorw  s    %	r   )rD  )rE  rF  rw  rv  s      @r   register_guard_check_specrx  p  s    
 _gNG r   c                    t         | _        | S )z:Mark a guard method as skipped during auto-cache dispatch.)
SKIP_GUARDrt  ru  s    r   skip_guard_check_specr|  ~  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__  s	    
r   c                2    t        d| j                         Nz%Guard check spec not implemented for NotImplementedErrorr  r   s    r   rE  z)UnsupportedGuardCheckSpec.get_metadata_fn      !$I$**"VWWr   c                2    t        d| j                         r  r  r   s    r   rF  z!UnsupportedGuardCheckSpec.eval_fn  r  r   N)r  r   r   r   )r   r   r   r  r   propertyrE  rF  r  r   r   r~  r~    s8    
 X X X Xr   r~  c                :    t        | j                        | _        | S )z;Mark a guard method as unsupported for auto-cache dispatch.)r~  r   rt  r{  s    r   unsupported_guard_check_specr    s    3BKK@BIr   c                  T   e Zd Z	 	 	 d~	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZedd       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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/       dd0       Z ed1 d2       ddd3       Z 	 d	 	 	 	 	 dd4Z! ed5 d6       ddd7       Z" ed8 d9       dd:       Z#e$dd;       Z%e$dd<       Z&e$dd=       Z' ee(e)      dd>       Z* ee+e,      dd?       Z- ee.e/      dd@       Z0 edA dB       dddC       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dS dT       ddU       Z7 ee8e9      ddV       Z: edW dX       ddY       Z; edZ d[       dd\       Z< ed] d^       dd_       Z= ed` da       ddb       Z> edc dd       dde       Z?e$ddf       Z@ edg dh       ddi       ZA edj dk       ddl       ZB edm dn       ddo       ZC edp dq       ddr       ZDe$dds       ZEe$ddt       ZFe$ddu       ZGe$ddv       ZHe$ddw       ZIe$ddx       ZJe$ddy       ZK edz d{       ddd|       ZL	 	 d	 	 	 	 	 	 	 	 	 dd}ZMy)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                  t;        d      | j,                  j8                  j<                  D ]7  }| j?                  |      }| j6                  jA                  tC        |             9 i | _"        i | _#        t5               | _$        g | _%        tL        jN                  xr tQ        d	      | _'        tS               | _*        y )
NLG__builtins__>_<._dot_.check_fn_manager.output_graph must not be None!pytorch/compiler:guard_nn_modules)+f_codeid_ref
source_reflookup_weakrefsscopesrc_get_value_cacheruntime_global_scopebuiltins__dict__copyr4  packagepackage_importer_package_imported_modulesr   r  r\  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_graphr   guard_on_key_ordergetr   rh  r   _cached_guard_managers_cached_duplicate_input_guardsobject_aliasing_guard_codesrR   guard_nn_modulesrF   rM   already_added_code_parts)r   r  r  r  r  local_scoper   r\  r  r  r  r  r  package_moduler^  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&. +.%'  --5 !QRR++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
  r^  r'  r(  )
get_guard_managerr   r   r  r  r  r   rc   get_guard_manager_typedict_getitem_manager)	r   r'  rS  dict_mgrdict_sourcer
  r  r4  r(  s	            r   #guard_on_dict_keys_and_ignore_orderz0GuardBuilder.guard_on_dict_keys_and_ignore_order  s     ))%0h 01%FFKjj\S  ..33 %]3 	C!#&E,U-E-ESQL!%!<!<m" ))%awa0##5	 * 	r   c                ^   | j                  |      }t        |t              st        d|j                         t        |t              st        dt        |             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 zExpected DictGuardManager, got r&  z__check_obj_id(rY  rZ  r)  )r  r   r   r  r  r   r  	enumerater   r  r+  r"  r,  r   r  add_id_match_guardr  r  r-  )	r   r  rS  r  rf  r
  r2  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 #B4>BR!STT ""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  rQ   zMGuards may run slower on Python 3.13.0. Consider upgrading to Python 3.13.1+.)rR   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_value4  sF     ''  G+  :-MM_ r   c                D   	 	 	 	 	 	 	 	 	 	 	 	 	 	 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t        d	      |j                  }|j                  }| d
}dx}}dx}}dx}}|rPt        |j                  |      }|j                   }|
|   }| j#                  ||      }|}|}| j#                  ||      }n|}|}| j#                  ||      }|j%                  || j'                  |
      t(        j*                        } |||||
||      }|r||t        d       |||||||      S |S )a(  
        This tries to avoid calling the expensive nn module custom getattr method by
        checking if the attribute is accessible via __dict__. For attributes that
        are not accessible via __dict__ (like descriptors), we fallback to
        PyObject_GetAttr.

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

        The most common and expensive case for nn module guards is of type
        mod.submod1.submod2.submod3.training. We avoid the python getattr of nn
        modules by going through the __dict__.
        c                   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_namer0  r'  r(  r   r2  s           r   getitem_on_dict_mgrz>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgra  s     #/0 &&8#>  /{m3uiqI
##%"%'7'E'E	 $ 
 )(*T#/I.JDQ ,,&"/'9	 -   //&"/'9	 0  r   FNT_parameters_buffers_modulesattrr^  r'  r(  z&accessor_info.l1_key must not be empty	.__dict__r^  r'  r(  )r  r
  r  r0  r'  r(  z9l2_source_name and l2_guard_manager_enum must not be None)r  r   r
  r   r  r   r0  r   r'  r   r(  r"  r   r   )memberr  r   r  getmror   updatekeysr  r  getattr_managerr   r   r!  rW   r  r  r  get_generic_dict_managerr  r"  r,  )r   r^  r/  r0  r'  r1  r  r(  r  	attr_namemod_dictall_class_attribute_namesrt  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_moduleF  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   !''$%MNN"))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 !)-B-J(S  + .'/"*'<  Mr   c                v    |j                   }|dk(  ryt        | j                  |            }|| j                  v S )Nrl  F)r  rh  r  r  )r   r^  r  obj_ids       r   requires_key_order_guardingz(GuardBuilder.requires_key_order_guarding  s:    kk"DHHV$%8888r   c                J   t         j                  }| j                  |      rt        |t              rt         j
                  }|S t        |t        t        f      rt         j                  }|S t        |t              st        dt        |             t         j
                  }|S )Nr$  )r"  r,  r  r   r   rA  r   	frozensetr#  r   r  )r   r^  r'  r(  s       r   r  z#GuardBuilder.get_guard_manager_type  s     .;;++F3-3%5%H%H" "! MC+;< &6%C%C"
 "! "-6(+>tM?R>S)TUU%5%H%H"!!r   c                (    |t         j                  k(  S r   )r"  rA  )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_globalsr^  r'  r(  )r\  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|||      }
nt        t(              r/| j+                         j-                  j.                  |||      }
nt        t0              r/| j+                         j3                  j.                  |||      }
nTt        t4              r|S t        t6              r|S t        t8              r#|st;        d      |j=                  |||      }	nt        t>              r#|st;        d      |jA                  |||      }	nt        tB              r#|st;        d      |jE                  |||      }	nt        tF        tH        tJ        tL        tN        f      r|st;        d      |}	nat        tP              r9tS        jT                  jV                        }|jY                  |fd|||      }	nt        tZ              r|jY                  fd|||      }nt        t\              r|jY                  fd	|||      }nt        t^              r#|st;        d      |ja                  |||      }nt        tb              r.|st;        d      |je                  jf                  |||
      }nSt        th        tj        tl        f      r|st;        d      t        th              st;        dto                     tq        |      r&|st;        d      | js                  ||||||      }n|ju                  jf                  |||
      }nt        tv        tx        f      r|st;        d      t        |tz        t|        j~                  f      st;        dto        |             t        tv        tx        f      st;        dto                     t        |t              r-| j                  |	      st;        d      t        ||||      }nt        j                  t              rt        d      |j-                  j                  |||      }nt        t              rH t        |dj                  j                  j                          d      j                  |||      }nPt        t              r.|st;        d      |j                  j                  |||      }nt        t              r.|st;        d      |j                  j                  |||      }nt        t              r|st;        d      t        |tz        t|        j~                  f      rt;        d      t        |t              r-j                  s!|j                  j                  |||      }nOt        |t              r-j                  s!|j                  j                  |||      }nj                  }j                  rj                         }|j                  ||||      }nt        t              r|st;        d      |st;        d      t        |      st;        d      j                  sK|j                  ||j                  t        j                        j                  j                  |||      }n;|j                  }|t;        d      |dz   }|j                  ||t        j                        }t        |t              rt;        d      |j-                  j                  |||      }nt        t              r(|st;        d      |jY                  t        |||      }nt        t              r%|st;        d      |jY                  d |||      }nRt        t              r%|st;        d      |jY                  d |||      }nt        t              r%|st;        d      |jY                  d |||      }nt        t              r%|st;        d      |jY                  d |||      }nt        t              r%|st;        d      |jY                  d |||      }n~t        t              r%|st;        d      |jY                  d |||      }nIt        t              r.|st;        d      |j                  j                  |||      }nt        t              r<t        |t              st;        d       |j                  j                  |||      }nt        t              r.|st;        d      |j                  j                  |||      }nt        t              r#|st;        d      |j                  |||      }nNt        t              r#|st;        d      |j                  |||      }nt        t              r$|st;        d      |jY                  d! |||      }nt        t              r$|st;        d      |jY                  d" |||      }nt        t              r"|st;        d      |j                  |||      }nt        t              r"|st;        d      |j                  |||      }nOt        t              r$|st;        d      |jY                  d# |||      }nt;        d$ d%j                         || j                  j                  <   |S )&Nrl  r  )global_namer^  r'  r(  z#base_guard_manager must not be Noner  c                    |S r   r  )r  r  s     r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>t  s    ! r   )python_lambdar^  r'  r(  c                6    t        j                               S r   )r   
_get_indexr  r^  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>{  s    (H%%') r   c                .    t        j                        S r   )r   r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (:6==(I r   r  zExpected AttrSource, got z"base_source_name must not be emptyz"Expected dict or OrderedDict, got z=Expected DictGetItemSource or DictSubclassGetItemSource, got z#DictGuardManager must guard on keyszUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_ordertensor_property__manager)rf  r^  r'  r(  zUse DictGetItemSourcez#base_example_value must be callablez!base_source_name must not be Nonez.__kwdefaults__z,Expected non-DictGuardManager for kwdefaultsc                (    | j                         d   S r   rM  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>D  s    (<(<(>q(A r   c                "    | j                         S r   )__obj_flatten__r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>M  s    (9(9(; r   c                >    | j                         j                         S r   )_typequalified_namer  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>V  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>h  s     r   c                ,    t        j                  |       S r   )r4  r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>q  s    (A(A!(D r   r&  z4ConstDictKeySource can only work on DictGuardManagerc                    t        |       S r   )r   r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (8(; r   c                    | j                   S r   r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s
    		 r   c                    t        |       S r   )r*  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s
    A r   zmissing guard manager builder z - )vr\  r   r  r  r  r  rh  r  r"  r,  r   r[   r  get_guard_manager_from_sourcer   rq   r   r  
local_nameframelocals_managerrk   r  r  r  rm   global_weakref_managerrl   rx   r~   r   type_managerr|   type_dict_managerr}   type_mro_managerrv   rs   r   r   rh   ro   r  r  module_namelambda_managerrz   r`   rn   grad_managerri   generic_getattr_managerr  rW   rZ   r   r  r  r  r  rc   rd   r#  r  r  r   r  r5  r   r_   RuntimeErrorr4   getattrproplowerrf  r-   indexed_managerrp   list_getitem_managerrj   r  index_is_slicerC  tuple_getitem_managerunpack_slicegetitem_managerrb   callableis_kwfunc_defaults_managerr   idx_keyr   func_kwdefaults_managerru   r  ry   rf   rw   rV   rY   rg   r{   tuple_iterator_getitem_managerr+  rt   set_getitem_managerr   weakref_call_managerrX   call_function_no_args_managerra   rr   r]   code_managerr\   closure_managerre   )r   r^  root_guard_managerr'  r  r(  r1  r0  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'%$%JKK$11"+#5 2 C
 FN+%$%JKK$66"+#5 7 C
 FM*%$%JKK$55"+#5 6 C
 +2"	
 &$%JKK$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'%$%JKK$11"+#5 2 C
 F-.%$%JKK$<<]]"+#5	 = C Z!35ST
 &$%JKKfj1$'@f%OPP34FG'()MNN//&&!$& )88&"/'9	 9  F.0IJK%$%JKK049P9P2QR$8>P9Q8RS  f'8:S&TU$STXY_T`Sab  ,.>?223JK()NOO-&&!& fll,>?&8  )==&"/'9	 >  F01'""6;;#3#3#9#9#;"<HE JJ"+#5C FM*%$%JKK$44JJ"+#5	 5 C F-.%$%JKK$99LL"+#5	 : C FM*%$%JKK,t[5L5L.MN$%<==,d3F<Q<Q(==&"/'9	 >  .6v?T?T(>>&"/'9	 ?  (("//1E(88&"/'9	 9  FN+%$%JKK#$%IJJ./$%JKK<<(>>+"4"A"A'7'E'E ?  "/&"/'9	 " 	  0>>
#+()LMM,/@@	 .EE$",'7'E'E F 
 h(89()WXX33&"/'9	 4  F-.%$%JKK$33("+#5	 4 C F23%$%JKK$33A"+#5	 4 C F56%$%JKK$33;"+#5	 4 C F;<%$%JKK$33B"+#5	 4 C FO,%$%JKK$334"+#5	 4 C F01%$%JKK$330"+#5	 4 C F-.%$%JKK$33D"+#5	 4 C F67%$%JKK$CCll"+#5	 D C  2302BC$J  %44ll"+#5	 5 C F;<%$%JKK$88ll"+#5	 9 C F-.%$%JKK$99"+#5 : C
 F45%$%JKK$BB"+#5 C C
 F12%$%JKK$33;"+#5	 4 C F23%$%JKK$331"+#5	 4 C FJ'%$%JKK$11"+#5 2 C
 FM*%$%JKK$44"+#5 5 C
 F/0%$%JKK$33."+#5	 4 C !0FKK=I  47##FKK0
r   c                8    | j                  |j                        S r   )r  r  r   rS  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 )NrY  r  zPython shape guard function:
%s___make_guard_fn)r  joinr  build_guard_functionr  
guards_logdebugexecr%  r\  r   add_epilogue_lambda_guardadd_lambda_guard)r   r   r   r   is_epiloguemake_guard_fn_args_guard_bodypycoder8  globals_for_guard_fnr_  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 )Nr@  zinvalid var name: %s)r   r   r  strip_function_callr  r4  r  r  is_valid_var_namelogwarningr|  )r   rS  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  rW   r:   r  r  create)r   rS  r  r_  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keywordsrn  rW  s     r   r  zGuardBuilder.<lambda>4  s4    OO$$V,E5??33F;<.
 r   c                ,    t        | |d         |d   k(  S Nr   rQ   )rn  r\  s     r   r  zGuardBuilder.<lambda>8  s    x{(CxPQ{(R r   rr  c           	     2   |t        d      |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 )Nz'attr must not be None for HASATTR guardhasattr(rY  rZ  znot hasattr()provided_guarded_objectr  )r   r  r   rs   r  rX  rn  r  r  _set_guard_export_infor  rW   r  r  r  r  r  add_no_hasattr_guardr  r  r   )r   rS  r  r^  refvalr   base_managerr[  r'  r0  r(  s               r   HASATTRzGuardBuilder.HASATTR3  s    < !JKK))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 r_  r`  ra  rW  s     r   r  zGuardBuilder.<lambda>s  s    U__-E-Ef-M r   c                    || j                   vS r   )r  r\  s     r   r  zGuardBuilder.<lambda>t  s    (F r   c                   |t        d      | j                  |      }| j                  |      }| j                  |      }d|d| d}|| j                  v ry |j
                   d}|j                  || j                  |j                        t        j                        }|j                  d|t        ||      |j                         | j                  j                  |       y )Nz;attr must not be None for NOT_PRESENT_IN_GENERIC_DICT guardnot ___dict_contains(rY  z
.__dict__)r  r  F)r   rX  r  r  r  r  r  r  r  r"  r,  add_dict_contains_guardr  r  r   )	r   rS  r  ri  rj  rk  r   r  r  s	            r   NOT_PRESENT_IN_GENERIC_DICTz(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICTr  s     < M  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  rW  s     r   r  zGuardBuilder.<lambda>  s
    T%[ r   c                    t        |       |u S r   ru  r\  s     r   r  zGuardBuilder.<lambda>  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(rZ  z___check_type_id(rY  ), type=type r  )r  r   r4  _subclasses
FakeTensorr  r  r   r   _unserializabler  r  r  rX  rg  r  add_type_match_guardr  r  r   rS  r  r_  r  	type_reprr   s          r   
TYPE_MATCHzGuardBuilder.TYPE_MATCH  s     eU..99:u||AUA>>QZZ' %)E!Q%

|1 56#A&	"4<<#6"7r&)U##ED62u%::"eeANN3C,D 	
r   c                X    t        t        |t              r|j                        S |      S r   r  r   rB   real_objrW  s     r   r  zGuardBuilder.<lambda>  s&    T(0@AENN.
 GL.
 r   c                `    t        t        | t              r| j                        |u S |       |u S r   r  r\  s     r   r  zGuardBuilder.<lambda>  s:    (0@AENN)
 ) GL)
 ) r   c           
        | j                  |      }t        |t              rt        |j                        }nt        |      }|j
                  |j                  k7  rd|_        | j                  |d|j                   d      }t        |      }d| j                  |       d| d| }| j                  ||g       | j                  |      j                  t        |t        ||d|j
                         |j                          y )	NTrx  rZ  z___check_fake_script_type(rY  ry  rz  r{  )r  r   rB   r  r  r   r   r~  r  r  r  rX  rg  r   add_fake_script_type_match_guardr  r  r  s          r   FAKE_SCRIPT_TYPE_MATCHz#GuardBuilder.FAKE_SCRIPT_TYPE_MATCH  s     e-.U^^$AUA>>QZZ'$(E!Q%

|1 56#A&	+DLL,?+@6((S\R]^##ED62u%FF"eeANN3C,D 	
r   c                   | j                  |      }| j                  |      }t        | j                  |            }d| d| }| j                  ||g       | j	                  |      j                  |t        ||      |j                         y )Nz___dict_version() == )rX  r  r   rg  r  add_dict_version_guardr  r  )r   rS  ri  rj  versionr   s         r   DICT_VERSIONzGuardBuilder.DICT_VERSION  s     ll5!hhuotxx/!#eG95##ED62 	u%<<'e4e6F6F	
r   c                4    | j                   j                  d   S Nr
  rn  rW  s     r   r  zGuardBuilder.<lambda>      U__-E-Ee-L r   c                
    || v S r   r  r\  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(rY  rZ  TrX  r  rg  r  rr  r  r  r   r   rS  r
  dict_refr   s        r   DICT_CONTAINSzGuardBuilder.DICT_CONTAINS  s    
 <<&"3'H:Q74000##ED62u%=="4/		
 	%%))$/r   c                4    | j                   j                  d   S r  rn  rW  s     r   r  zGuardBuilder.<lambda>  r  r   c                
    || vS r   r  r\  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 )Nrq  rY  rZ  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  rn  rW  s     r   r  zGuardBuilder.<lambda>	  r  r   c                
    || v S r   r  r\  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__(rY  rZ  TrX  r  rg  r  add_set_contains_guardr  r  r   r   rS  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  rn  rW  s     r   r  zGuardBuilder.<lambda>(	  r  r   c                
    || vS r   r  r\  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__(rY  rZ  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  rW  s     r   r  zGuardBuilder.<lambda>>	      U r   c                    | |k(  S r   r  r\  s     r   r  zGuardBuilder.<lambda>?	      (9 r   c                   | j                  |      }| j                  |      }t        |t              st	        dt        |             | d|g}| j                  ||       |r6| j                  |      j                  t        ||      |j                         y | j                  |      j                  t        ||      |j                         y )NzExpected bool, got r)  )rX  r  r   r   r   r  rg  r  add_true_match_guardr  r  add_false_match_guardr   rS  ri  rj  r   s        r   
BOOL_MATCHzGuardBuilder.BOOL_MATCH=	  s     ll5!hhuoc4  #6tCyk!BCC%tC7#$##E40""5)>>&tU3U5E5E ""5)??&tU3U5E5Er   c                     y r   r  rW  s     r   r  zGuardBuilder.<lambda>T	      r   c                
    | d u S r   r  r\  s     r   r  zGuardBuilder.<lambda>U	  s
     r   c                   | j                  |      }| j                  |      }|t        dt        |             | dg}| j	                  ||       | j                  |      j                  t        ||      |j                         y )NzExpected None, got z is None)	rX  r  r   r  rg  r  add_none_match_guardr  r  r  s        r   
NONE_MATCHzGuardBuilder.NONE_MATCHS	  s     ll5!hhuo? #6tCyk!BCC%x !##E40u%::"4/1A1A	
r   c                    |S r   r  rW  s     r   r  zGuardBuilder.<lambda>e	  r  r   c                
    | |u S r   r  r\  s     r   r  zGuardBuilder.<lambda>f	      (9 r   c                &    | j                  ||      S r   )id_match_unchecked)r   rS  r  s      r   ID_MATCHzGuardBuilder.ID_MATCHd	  s     &&un==r   c                $   t        |j                  t              r=| j                  t	        |j                  j
                  t        j                              S | j                  |      }| j                  |      }| j                  ||j                        }t        t        j                  |      r|n
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 )Nz___check_obj_id(rY  ry  r  )provided_func_name)r   r  r~   r  r:   r  r  rX  r  r  r  r  r  isclassr  rg  r  r  r  r  rq   r4  r9  r:  r  r  r   )
r   rS  r  ri  rj  r  r  r   r  weak_ids
             r   r  zGuardBuilder.id_match_uncheckedq	  sY    e..
;??e..33\5L5LM  ll5!hhuoS%**-#7??3+?CT#YO	!#bD##ED6j#Qu%88"4?	
 e..< #uxx/"55@@
..s3&7>D((4 ' 0	 =r   c                     y r   r  rW  s     r   r  zGuardBuilder.<lambda>	  r  r   c                
    | d uS r   r  r\  s     r   r  zGuardBuilder.<lambda>	      T(9 r   c                D   | j                  |      }| j                  |      }t        |t        j                        st        dt        |             | d}| j                  ||g       | j                  |      j                  t        ||      |j                         y )NExpected torch.Tensor, got  is not None)rX  r  r   r4  r5  r   r  rg  r  add_not_none_guardr  r  )r   rS  r  ri  rj  r   s         r   NOT_NONE_MATCHzGuardBuilder.NOT_NONE_MATCH	  s    
 ll5!hhuo#u||, #>tCyk!JKKl###ED62u%88"4/1A1A	
r   c                "    |j                         S r   raw_reprrW  s     r   r  zGuardBuilder.<lambda>	  s    U^^-= r   c                (    | j                         |k(  S r   r  r\  s     r   r  zGuardBuilder.<lambda>	  s    (8H(D r   c                :   | j                  |      }| j                  |      }t        |t        j                  j
                        st        dt        |             | d|d}| j                  |      j                  |t        ||      |j                         y )NzExpected DispatchKeySet, got z.raw_repr() == z.raw_repr())rX  r  r   r4  r  r   r   r  r  add_dispatch_key_set_guardr  r  )r   rS  ri  rj  r   s        r   DISPATCH_KEY_SET_MATCHz#GuardBuilder.DISPATCH_KEY_SET_MATCH	  s    
 ll5!hhuo#uxx667 #@c!LMMuOC7+>
u%@@":u5	
r   c                ,   | j                   j                  t        d      | j                   j                  j                  }d| g}| j	                  ||       | j
                  j                  j                  |t        ||      |j                         y )Nr  z,torch.autograd.forward_ad._current_level == )
r  r  r   
dual_levelrg  r\  r   add_dual_level_match_guardr  r  )r   rS  r  r   s       r   
DUAL_LEVELzGuardBuilder.DUAL_LEVEL	  s       --5 !QRR**77BB
>zlKL##E40::"4/	
r   c                   | j                   j                  t        d      | 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 )Nr  z5torch._functorch.pyfunctorch.compare_functorch_state(rZ  c                           S r   r  )rt  
compare_fnstatess    r   ru  z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn	  s    f%%r   r  )r  r  r   functorch_layers	get_staterg  r4  
_functorchpyfunctorchcompare_functorch_stater\  r   rF  r  r  )r   rS  ciscir   ru  r  r  s         @@r   FUNCTORCH_STACK_MATCHz"GuardBuilder.FUNCTORCH_STACK_MATCH	  s       --5 !QRR##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   )rC  maprh  )hooksare_inline_hookss    r   hooks_ids_fnz?GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.hooks_ids_fn	  s!     $E*R((r   zCtorch._functorch.aot_autograd.utils.top_saved_tensors_hooks ids == c                $                   k(  S r   r  )rt  	get_hooksguard_hooks_idsr  s    r   ru  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  )r4  r  _aot_autogradr  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineablerg  r\  r   rF  r  r  )r   rS  r   ru  r  r  r  r  s       @@@@r   AUTOGRAD_SAVED_TENSORS_HOOKSz)GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS	  s    $$2288PP	**00SS 		)V	)#	) 'y{3 RRaQbc
 	##E40	@ 	00&tU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rc  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  rQ   c                            S r   r  )r  r  s    r   r  z=GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.<lambda>

  s	     r   rL  c                J    j                  | j                         d         S r   rS  )rt  rO  original_metadatas    r   metadata_checkerzEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker
  s)    --%q';';'=a'@ r   c                0    | j                         d   k(  S r   r  )rt  r  s    r   r  zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker
  s    ++-a04EEEr   ___check_metadata__cr  )r  rM  r   pytreetree_map_onlyr4  r  rn  r   r  rh  r7   current_compile_idr  rF  r  r  )	r   rS  r  rN  r  r  r  rO  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   )r]  )rt  expecteds    r   r_  z1GuardBuilder.DTENSOR_SPEC_MATCH.<locals>.guard_fn*
  s    %a22r   __dtensor_spec_r  )rX  r  rh  r  rF  r  r  )r   rS  r_  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   )rd  )rt  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  ra  rh  r7   r  r  rF  r  r  )r   rS  r  r  r  r  s        @r   OPAQUE_OBJ_GUARD_FN_MATCHz&GuardBuilder.OPAQUE_OBJ_GUARD_FN_MATCH2
  s     ,UE:"	8 2"5I2J1K2nNoNoNqMrsu%66 ";6	
r   c                    |S r   r  rW  s     r   r  zGuardBuilder.<lambda>J
  r  r   c                    | |k(  S r   r  r\  s     r   r  zGuardBuilder.<lambda>K
  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        ||      sF |jX                  t%        |            s+t[        t%        |            st]        dt%        |             t_        |t`              rgtc        jd                  |      rRd| d| d	g}| jg                  ||       | ji                  |      jk                  tm        ||      |jn                         y t_        |tp              rgt        jd                  |      rRd| d
| d	g}| jg                  ||       | ji                  |      js                  tm        ||      |jn                         y | d|g}t_        ||      rtu        |      }tm        ||      }|r|D cg c]
  }| d| d }}| ji                  |      jw                  |||jn                         | jg                  ||       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  rZ  )<rX  r  r  int8int16int32int64uint8uint16uint32uint64float16float32float64r  r   rC  r   r  r  sliceranger   r4  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  rL   r   is_constant_classrD   r   r   r  r  r  rg  r  add_float_is_nan_guardr  r  complexadd_complex_is_nan_guardr   r-  )r   rS  r  ri  rj  np_typesok_mutable_typesok_typesr  r  r  r  r  r  r  r  r   r   rV  s                      r   EQUALS_MATCHzGuardBuilder.EQUALS_MATCHI
  s   
 ll5!hhuo						





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



""))  "
" ))+M   # H 	<{n,,, sH%'v''S	2#DI. #3DI;!?@@ #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  rW  s     r   r  zGuardBuilder.<lambda>
  r  r   c                    | |k(  S r   r  r\  s     r   r  zGuardBuilder.<lambda>
  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  r;  CodeTyper  r8  r   rS  rj  s      r   CONSTANT_MATCHzGuardBuilder.CONSTANT_MATCH
  s`    
 hhuo#tOOE"[OOE"C(MM% e$r   c                    t        |      S r   rp  rW  s     r   r  zGuardBuilder.<lambda>
  s    -J5-Q r   c                    t        |       |k(  S r   r@  r\  s     r   r  zGuardBuilder.<lambda>
  s    (Ee(L) r   c                p  	 ddl m} | j                  |      }| j                  |      }d|D ]  }t	        ||      s| n t        dt        |              |      	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__.
        rQ   rm  Nz No constant base type found for (r  c                     |       k(  S r   r  )rt  	base_type
base_values    r   check_fnz6GuardBuilder.CONSTANT_SUBCLASS_MATCH.<locals>.check_fn
  s    Q<:--r   r  )ro  rn  r  rX  r   r   r  r   r  rF  r  r  )
r   rS  rn  rj  ri  r_  r   rG  rE  rF  s
           @@r   CONSTANT_SUBCLASS_MATCHz$GuardBuilder.CONSTANT_SUBCLASS_MATCH
  s     	Ahhuoll5! 	% 	A#q!		  #CDI;!OPPs^
%%&auE*@A	. 	u%66"4/	
r   c                    |S r   r  rW  s     r   r  zGuardBuilder.<lambda>
  r  r   c                
    | |u S r   r  r\  s     r   r  zGuardBuilder.<lambda>
  r  r   c                   | j                  |d       | j                  |      }t        |d      rjt        |j                  t
              s!t        dt        |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&Expected val.training to be bool, got z-Attempted to guard on uninitialized nn.Modulerl  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  rn  r   rL  r   r   r  r  r]  r  r>  rT   unimplementedr=  s      r   	NN_MODULEzGuardBuilder.NN_MODULE
  s     	eDEhhuo3
##,,-$<T#,,=O<PQ  ((((
L<W<WX ) G''+Cyk5 `r   c                    |S r   r  rW  s     r   r  zGuardBuilder.<lambda>  r  r   c                
    | |u S r   r  r\  s     r   r  zGuardBuilder.<lambda>  r  r   c                $    | j                  |      S )z0things like torch.add and user defined functions)r  r=  s     r   FUNCTION_MATCHzGuardBuilder.FUNCTION_MATCH  s     }}U##r   c                    |S r   r  rW  s     r   r  zGuardBuilder.<lambda>  r  r   c                
    | |u S r   r  r\  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  r  r   r  r  r=  s      r   CLASS_MATCHzGuardBuilder.CLASS_MATCH  sI     hhuos# ::,FG  	&r   c                    |S r   r  rW  s     r   r  zGuardBuilder.<lambda>$  r  r   c                
    | |u S r   r  r\  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  r;  r<  rn  r]  r  r>  rV  r=  s      r   CLOSURE_MATCHzGuardBuilder.CLOSURE_MATCH0  sT     hhuo9***wsJ/G $$UJ8S8ST&r   c                    |S r   r  rW  s     r   r  zGuardBuilder.<lambda>A  r  r   c                
    | |u S r   r  r\  s     r   r  zGuardBuilder.<lambda>B  r  r   c                    | j                   rSt        |j                  t              r9| j                  j
                  j                  |j                  j                         | j                  |      S r   )	r  r   r  rc   r  used_builtin_varsr   r   r  r=  s     r   BUILTIN_MATCHzGuardBuilder.BUILTIN_MATCH@  sZ    
 %224EF%%77;;,,22 &&u--r   c                    t        |      S r   r   rW  s     r   r  zGuardBuilder.<lambda>N  s
    SZ r   c                    t        |       |k(  S r   rh  r\  s     r   r  zGuardBuilder.<lambda>O  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(r  )rX  r  r   r#  r  r   r|  rg  r  add_dict_length_check_guardr  r  add_length_check_guardr   rS  ri  r  r   s        r   SEQUENCE_LENGTHzGuardBuilder.SEQUENCE_LENGTHM  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   rW  s     r   r  zGuardBuilder.<lambda>p  s    -?-F r   c                    t        |       |k(  S r   rp  r\  s     r   r  zGuardBuilder.<lambda>q  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(r  rx  rZ  )rX  r  r  r|  r   rg  r  r  r  add_tuple_iterator_length_guardr  r  )r   rS  ri  r  r_  r   r  s          r   TUPLE_ITERATOR_LENzGuardBuilder.TUPLE_ITERATOR_LENo  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   rW  s     r   r  zGuardBuilder.<lambda>  s    -A%-H r   c                    t        |       |k(  S r   rv  r\  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(r  rx  rZ  )rX  r  r  r   r|  rg  r  r  r  add_range_iterator_match_guardr  r  )r   rS  ri  r  r_  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   rW  s     r   r  zGuardBuilder.<lambda>  s    d5k;OPU;V-W r   c                H    t        |       |d   u xr t        |       |d   k(  S rc  r  r\  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   r  )rt  
count_typenormalized_count_iters    r   r_  z3GuardBuilder.COUNT_ITERATOR_MATCH.<locals>.guard_fn  s(    Q:% E(+/DDr   z___normalize_count_iter(r  r  )	rX  r  r  r   rg  r  rF  r  r  )r   rS  ri  r  r_  r   r  r  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_varsrX  r  r0   r  rg  rR   #use_lamba_guard_for_object_aliasingr  r  r|  r    r  r  r  )
r   rS  source_br  ref_aref_br
  r   r  r~  s
             r   DUPLICATE_INPUTzGuardBuilder.DUPLICATE_INPUT  s   $$$
&x0,X66t6%%@@DDTJ-h77t7%%AAEEdKU#X]]+#$$
%h/ en$555++//?++//?'eW%&##E4055 QI 6y% H K,,33Y@Q4RS)&&u-228<&tU3  	r   c                     y r   r  rW  s     r   r  zGuardBuilder.<lambda>  r  r   c                
    | d uS r   r  r\  s     r   r  zGuardBuilder.<lambda>  r  r   c                    | j                  |       dg}| j                  ||       | j                  |      j                  t	        ||      |j
                         y )Nr  )rX  rg  r  r  r  r  r   rS  r   s      r   WEAKREF_ALIVEzGuardBuilder.WEAKREF_ALIVE  sX    
 <<&'|45##E40u%88"4/1A1A	
r   c                4    t        |j                               S r   r  r  rW  s     r   r  zGuardBuilder.<lambda>  s    T%**,-? r   c                :    t        | j                               |k(  S r   r  r\  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)	rX  r  r|  r  r  rg  r  add_mapping_keys_guardr  rm  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  rW  s     r   r  zGuardBuilder.<lambda>  s    T$))E2B-C r   c                D    t        t        j                  |             |k(  S r   r  r\  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)) == )rX  r  r4  r  rL   SUPPORTED_NODESr  rn  r|  r  r   rg  r  r  r  r  rm  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  rW  s     r   r  zGuardBuilder.<lambda>%  r  r   c                    t        |       dk(  S r   rh  r\  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)rR   skip_nnmodule_hook_guardsrn  r=  s     r   EMPTY_NN_MODULE_HOOKS_DICTz'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICT$  s     ++U#r   c                     y r   r  r=  s     r   	GRAD_MODEzGuardBuilder.GRAD_MODE0      r   c                     y r   r  r=  s     r   DETERMINISTIC_ALGORITHMSz%GuardBuilder.DETERMINISTIC_ALGORITHMS5  r  r   c                     y r   r  r=  s     r   FSDP_TRAINING_STATEz GuardBuilder.FSDP_TRAINING_STATE:  r  r   c                6   | j                   j                  }|t        d      |j                  }|| j                   _        d| j                   j                  j                          g}| j                  j                  j                  |||j                         y )Noutput_graph must not be Nonez ___check_global_state() against )
r  r  r   global_state_guardglobal_state__getstate__r\  r   add_global_state_guardr  )r   rS  r  r  r   s        r   GLOBAL_STATEzGuardBuilder.GLOBAL_STATE?  s    ,,99 !@AA#66-9* /t/D/D/Q/Q/^/^/`.ab
 	66$ 0 0	
r   c                .   | j                   j                  t        d      t        | j                   j                        | j                   _        | j
                  j                  j                  | j                   j                  dg|j                         y )Nz*torch_function_mode_stack must not be Nonez$___check_torch_function_mode_stack())	r  torch_function_mode_stackr   $make_torch_function_mode_stack_guard"torch_function_mode_stack_check_fnr\  r   #add_torch_function_mode_stack_guardr  r=  s     r   TORCH_FUNCTION_STATEz!GuardBuilder.TORCH_FUNCTION_STATEP  s      ::B !MNN0%%?? 	@
 	CC!!;;34	
r   c                   |j                   t        j                  urt        d|j                          | j                  j
                  t        d      d| j                  j
                  j                  g}| j                  ||       | j                  |      j                  t        ||      |j                         y)z/Guard on CURRENT_DEVICE per torch.utils._devicez!Expected GuardSource.GLOBAL, got Nr  zutils_device.CURRENT_DEVICE == )r^  r=   GLOBALr   r  r  current_devicerg  r  add_default_device_guardr  r  r  s      r   DEFAULT_DEVICEzGuardBuilder.DEFAULT_DEVICE`  s     <<{111 #DU\\N!STT  --5 !QRR-d.C.C.P.P._._-bc
 	##E40u%>>"4/1A1A	
r   c                   %&'( ddl m} |j                  dk7  rt        d|j                         j                  j
                  ((t        d       j                  j                  T j                  j                  }|j                  }|j                  }|j                  |j                  }|j                  }nt        (|      st        dt        (             (j                  t        d      (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                  |
||||       Vt0        j3                  d	       l t5        ||t7        |j9                               |d
      %nd %d$%&'( fd}t:        j<                  r	  |d      \  }}}d
}nd} |d      \  }}(j*                  s(j                  jA                           jB                  rtE               jG                  d      }|'t        |tH              st        dt        |             |g n"t7        |jJ                  jM                               }tO        |||||       j                  _        |jP                  D ]  } jS                  ||g        tU        jV                         x}r%|jX                  j[                  |jP                         g }g }|sst        d      |jP                  |jJ                  }}|sy |j]                         D ]  \  }}t        |t^              rd} jG                  |i t`        tc                     }t        |td              r|jg                  ||f       `t        |th              r|jg                  ||f       d} |sdd l5}ddl6m7} st        d      |jP                  |jJ                  }}tq        ||z         }	 ts        |      D cg c]   \  }} ju                  tw        ||            " }}}djy                  d ts        |      D              } djy                  d ts        |      D              }!| rd|  d} |!rd|! d}!t{        j|                  d|  d|! ddjy                  |       d       }"t~        j                  d!|"|jP                         |j                  |"      }#|j                  |#j                  |j                        j                  }$|$st        d"      	 t        |t        |      t        |      |$|#|jP                  |j                         y |jP                  r9 j                  |jP                  |jP                  i t`        tc                      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   rl  zExpected empty guard name, got r   Expected OutputGraphCommon, got z'output_graph.shape_env must not be Nonec                z    j                   |    D cg c]  }t        |t        j                  |       c}S c c}w r   )tracked_fakes_id_to_sourcer4   r3   SIZE)t_idr  r^  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faker^  r  export)r  r-  r  r  r  r  r   s     r   _get_code_partsz/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts  sj    #--DD%'(QVV(')*!QXX*#1&7# (4':':#: E 
 
(*s
   A)A.
)pythonverbose_pythoncppT)r  r  cpp_code_partsz,Expected None or _CppShapeGuardsHelper, got )python_code_partsr   r  python_fallbackshape_env_sourcesz9cpp_code_parts must be set when not using python_fallback)r   )CppCodeCacherY  c              3  8   K   | ]  \  }\  }}| d | d  yw)z = int_values[r  Nr  r  ir  symbols       r   r  z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>7  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 %sz'Failed to load C++ shape guard function)r  r*  r  r*  r   list[Source])r  tuple[str, ...]r   zlist[_ShapeGuardsHelper])Mtorch._dynamo.output_graphr   r  r   r  r  shape_code_partsr  r   r  r  r   r  r  tracked_fakessymbolic_contextexport_constraintsr   r  r  r4  r  dynamic_shapes_process_equalitiesrU  rV  rI   r  r%  rR    enable_cpp_symbolic_shape_guardsOverflowErrorfreezer  localsr  rG   source_to_symbolr  ShapeCodePartsexprsrg  r7   try_getshape_env_guardsr$  r   r^   rK   r  r*  r|  r  ctypestorch._inductor.codecacher  r#  r  r  r-   r@  textwrapdedentrB  rC  loadcastrS  c_void_pr  r"   r   r  	_inductorrT   InvalidCxxCompilerrL  ))r   rS  r   r  r  r   r  r  r-  r  namesr  r  r  r  
constraintr  maybe_cpp_code_partsmaybe_shape_env_sourcesr   compile_contextint_source_to_symbolfloat_source_to_symbolr   r  r^  r  r'  r  r  r  guard_managersint_symbols_strfloat_symbols_strfunc_strclibcguardr  r  r  r  s)   `                                    @@@@r   	SHAPE_ENVzGuardBuilder.SHAPE_ENVq  s   @:: #B5::.!QRR,,99 !@AA  11=#44EE 0 B B!1!D!D..:!1!@!@.>>O l,=>$6tL7I6JK  %%-$%NOO''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 #/
$&;9 %B4H\C]B^_ 
 (/ .??DDFG $
 6D"3#53 /"96D!!2 &++ 	7D''v6	7 -4466?6,,334F4L4LM!!#!$O 
 $$//	 )J "2"8"8": /fn5&*O$(HH%L%L8I8K%L %- %M "-5,33VV4DE#M59.55vv6FG +//" >!$O 
 $$//	 )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()RSS  -",-./&,,$$ 
 ""55!''"((DD0A0CD 6  #O >B % &*O<K4=9%'9H"` ??&&99 s=   W0W5 X %X?C2X 5XXX 'YYc                    t        |      S r   )rJ  rW  s     r   r  zGuardBuilder.<lambda>|  s    -DU-K r   c                V    t        | t        j                        xr t        |       |k(  S r   )r   r4  r5  rJ  r\  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t#        dt        |             t         j$                  rt        |t        j&                  j(                        rht+               }|j-                         rN|j/                  d|j1                                |j/                  d|j2                         |j/                  dd       | j5                  |      }g }| j6                  j8                  t#        d      | j6                  j8                  j:                  r| j=                  |       g d}|D ]  }	t?        |j@                  |	      }
|	dk(  rd	}	tC        |
      }
| j                  |
      }tE        |t        jF                  t        jH                  f      r$|jK                  d
| d|	 dtM        |             |jK                  | d|	 d|         n| jO                  |      }t         jP                  r9tE        |t        j&                  j(                        setS        |j@                        sPt        |j@                  tT              s6| jV                  jK                  |       | jX                  jK                  |       | j6                  j8                  }|jZ                  |j@                     }t]        |d         }t]        |d         }t_        ta        ||||||      |      }|jb                  }|je                  ||||||||       t        |t        j&                  j(                        s/| jf                  jh                  jk                  |jl                         |jn                  t#        d      d}i }g }|D ]v  }tq        ||      r=ts        ||      ||<   d| d| dts        ||      d| d| d}|jK                  |       L|jK                  |       d| d| d}|jK                  |       x i }d}d}tq        ||      r>|D ]9  }ts        ||d       }||f||<   d| d| d|d| d| d}|jK                  |       ; |s|s|r8| jO                  |      ju                  |||t_        ||      |jb                         tw        |      dkD  r| jy                  ||       y y )Nr  param_numelparam_bytesparam_countrQ   r  )r  r  r  
ndimensionr  zndimension()zstr(r  r  r)  sizerI  zguard.source must not be None)_dynamo_dynamic_indices_dynamo_weak_dynamic_indices_dynamo_unbacked_indices_dynamo_strict_unbacked_indices_dynamo_static_indicesz
((getattr(z, 'z', set()).issubset(z)) if hasattr(z') else True)re  z') == False)_dynamo_shape_ids_dynamo_unbacked_boundsr  z', None) == z) if hasattr(r   )=rR   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler:  r  r   rP   r  r  r4  r  _dispatch_keysr|  r}  r  r  r5  r   log_compilation_metricsr9  	Parameterr6   in_progress	incrementnumelnbytesrX  r  r  r  r  rW   r  rX   r   r  r  r|  r   r  ,skip_no_tensor_aliasing_guards_on_parametersr2   ru   r  r  input_source_to_sizes_stridesr  r  r  r  add_tensor_match_guardr\  r   r   r  r^  rn  r"  add_dimension_marking_guardr   rg  )r   rS  r  r  r  metrics_contexttensor_namer   termstermterm_src
real_valuer\  r  rN  r  rI  r   r  dim_marking_attrsexpected_attrsabsent_attrsr  r  dependent_attrsdep_attr_names	gate_attr
attr_values                               r   TENSOR_MATCHzGuardBuilder.TENSOR_MATCH{  ss    11e6J6J6L "%(MM% %/".EDHHUOE%[F!HH33E:M%!2!2!=!=><<+"\\F&&2$)$7$7MeU\\2$'B4;-%PQQ--*UEHHDVDV2W"5"7"..0#--mU[[]K#--mU\\J#--mQ?,,u-K, !D$$119$%UVV$$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||#$%DEEN! 35N&(L. +	5),07y0IN9-",[MYKGZ[bchjs[tZw  xF  GR  FS  SV  W`  Va  an  !oIKK	* ''	2"*;-s9+[ QIKK	*+ MOOMN2Iui(!/ +I!(	4!@J2<i1HOI.",[MYK|T^Saanozn{{~  @I  J  JW  !XIKK	*	+ &&u-II" #*47$$ 4y1}++E48 r   c                d   t               }|t        d      |j                  }~|t        d      |xs |j                  j                  }~|| j
                  j                  vrt        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 )Nzcurrentframe() returned Nonezcaller frame must not be NonezH_produce_guard_code must be called from inside GuardedCode. Called from __weakrefoffset__r   )r   r   f_backr  co_namer   r  r  r  weakrefri  r  r"  r   enumEnumrC  
ProxyTypesset_export_info)r   rS  r=  rf  r  	cur_framecaller	func_namer  guarded_objectguarded_object_typeobj_refsupports_weakrefs                r   rg  z#GuardBuilder._set_guard_export_info`  s8    !N	 !?@@!!> !@AA&?&--*?*?	DNN333 Z[dZef 
 #*::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   rI  r\  r   r  CheckFunctionManagerr  r   r  r  r  =Callable[[Sequence[GuardFilterEntry]], Sequence[bool]] | Noner   r   )r'  dict[Any, Any]rS  r:   r   r   )r  rL  rS  r:   r   r   )r'  r   r   
Any | None)r^  rW   r/  r   r0  r   r'  r   r1  r   r  r   r(  r"  r   r   )r^  r>   r   r   )r^  r>   r'  zAKeysView[Any] | set[Any] | frozenset[Any] | dict[Any, Any] | Noner   r"  )r  r"  r   r   )r   r   )r^  r>   r   r   )rS  r:   r   r   rc  )
r   r  r   r  r   r  rG  r   r   r   r   )rO  zGuard | Sourcer   dict[str, Any] | Noner   r   )rS  zstr | Guardr   r   )rS  r:   r  r   r_  z(Callable[[GuardBuilderBase, Guard], Any]r   r   )rS  r:   r  r  r   r   )rS  r:   r  rM  r   r   )rS  r:   r   r   )rS  r:   r
  r   r   r   )rS  r:   r
  r   r   r   )rS  r:   r  r  r   r   )rS  r:   r  rM  r   r   )rS  r:   r  r>   r   r   )NN)
rS  r:   r=  r  rf  rM  r  r  r   r   )Nr   r   r   r   r  r  r>  r  r  r  r  r  r  r  r  rL  r  rX  r]  rx  rl  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r|  r  r  r  rQ  rU  r  rX  r]  r	  ra  rd  r  r8  r>  rH  rR  rV  rZ  r_  ri  rk  ra  rf  rn  rt  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r7  rg  r  r   r   r  r    s    "9=MFMF -MF ,	MF
 HMF 'MF (MF +MF /MF MF 7MFMF 
MF^+49	<(T  "]] )]  	]
 ] ] ] -] 
]~9""" 
"2?
DLL 26 YY &Y /	Y
 Y 
YP /3' , 
	&   ;	
 
$ 
 S6060p MF
 0400",0	0	0> 8?
	
4 
	

< "
 "
 L90	0  L=0	0  L90	0$ L=0	0$ 29	$ 15
	
 29>	> :> ? ?,6 ?	 ?D 19

	

 =D
	
 
 
 
 
* 
 
8 1'#
	#
J ,"
	
 * 
	
& 29o	ob 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$	$       
 
  
 
 
 
  G GR K
[9[9D /3)-4
4
 4
 ",	4

 '4
 
4
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)PyExprCSEPassrQ   c                  "    e Zd ZU ded<   ded<   y)PyExprCSEPass.Configzdict[str, int]
expr_countzdict[str, str]expr_to_nameNr>  r  r   r   ConfigrR    s    ""$$r   rU  c                  (     e Zd ZddZd fdZ xZS )PyExprCSEPass.ExprCounterc                    || _         y r   )_config)r   rR   s     r   r   z"PyExprCSEPass.ExprCounter.__init__  s	    !DLr   c                    t        |t        j                        r*| j                  j                  t        |      xx   dz  cc<   t        |   |       y r   )r   rP  ALLOWED_NODE_TYPESrY  rS  r  r   r   )r   r   r   s     r   r   zPyExprCSEPass.ExprCounter.visit  s>    $ @ @A''T(:;q@;GM$r   )rR   rR  r   r   )r   ast.ASTr   r   r   r   r   r   r   r   r   s   @r   ExprCounterrW    s    	"	  	 r   r^  c                  8     e Zd Z	 	 	 	 	 	 d fdZd fdZ xZS )PyExprCSEPass.Replacerc                L    t         |           || _        || _        g | _        y r   )r   r   rY  	_gen_namepreface)r   rR   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   rP  r[  r  rY  rS  USE_THRESHOLDrT  r   r   rb  rc  r|  r  NameLoad)r   r   exprnode_expr_r   r   s         r   r   zPyExprCSEPass.Replacer.visit  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   )rR   rR  rd  zCallable[[], str]r   r   )r   r\  r   r   r]  r   s   @r   Replacerr`    s.    	)(	) (	) 		)	' 	'r   rl  c                j    d| _         | j                  t        j                  d       i       | _        y )Nr   c                      yr   r  r  r   r   r  z(PyExprCSEPass.__init__.<locals>.<lambda>  r  r   )rS  rT  )_counterrU  r  defaultdictrY  r   s    r   r   zPyExprCSEPass.__init__  s.    {{"..y9 # 
r   c                P    | | j                    }| xj                   dz  c_         |S r   )ro  )r   r   r  s      r   _new_varzPyExprCSEPass._new_var  s'    $--)r   c                    | j                  | j                        }|D ]'  }	 |j                  t        j                  |             ) y # t
        $ r'}t        j                  d|j                  |        d }~ww xY w)Nz#Failed to visit expr at line %s.
%s)	r^  rY  r   r  parseSyntaxErrorrU  	exceptionlineno)r   r  countereexs        r   countzPyExprCSEPass.count  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   )rl  rY  rr  r   r  rt  rc  r  )r   ri  replacernew_nodes       r   r  zPyExprCSEPass.replace  sF    ==t}}=>>#))D/2h!777r   Nr  )_var)r   r   r   r   )r  r  r   r   ri  r   r   ztuple[list[str], str])r   r   r   rf  r  	AttributeCall	Subscriptr[  dataclasses	dataclassrU  NodeVisitorr^  NodeTransformerrl  r   rr  r{  r  r  r   r   rP  rP    sx     M --3==A% % % coo  #'3&& #'J

8r   rP  c                    t        | j                  t              xs. t        j                  xr | j
                  t        j                  u S r   )r   r  rb   rR    guard_nn_modules_using_dict_tagsr`  r  rR  )rS  s    r   must_add_nn_module_guardsr    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   )r  r   r   r   r  )r   r   r   r   r  r   r   s   @r   r  r    s    *$r   r  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded	<   y
)r  rH   r  r   z_CppShapeGuardsHelper | Noner  r   r  r  r  Nr>  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  Nr>  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   _reason)r   r  s     r   r   z_Missing.__init__$  s	    r   c                "    d| j                    dS Nz	_Missing(rZ  r  r   s    r   r  z_Missing.__repr__'      4<<.**r   c                "    d| j                    dS r  r  r   s    r   rp  z_Missing.__str__*  r  r   c                    t               S r   )r  )r   r   kwargss      r   __call__z_Missing.__call__/  s
    zr   r   )r  r  r   r   r   )r   r   r  r   r   r   )r   r   r   r   r  rp  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   )r4  r  r(  r<  r   _distributed_c10dProcessGroupAttributeError)rQ  s    r   _get_unsupported_typesr  3  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   r4  r|  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__B  sb     	$)&)**99; % 1 1 = = Q Q S!2(,r   c                d    t         j                  j                         }|j                  |       |S r   )r4  r9  r:  __setstate__)rO  statemods      r   _unpickle_modulez#GuardsStatePickler._unpickle_moduleQ  s%    hhoo
r   c           	        t         j                  j                         }t         j                  j                  j	                         }|j                  ||||t         j                  j                  j                  |            }||_	        |S r   )
r4  r|  r  r  r  from_meta_and_devicer  r   from_raw_reprgrad)	rO  meta_tensorr  r  dispatch_keys_rawr  r  r  rQ  s	            r   _unpickle_tensorz#GuardsStatePickler._unpickle_tensorW  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#  rH  rI  r  __tensor_unflatten__r  r4  r  r   r  r  )rO  r  r  r  r  ctx
inner_datainner_tensors
outer_sizeouter_strider8  s              r   $_unpickle_traceable_wrapper_subclassz7GuardsStatePickler._unpickle_traceable_wrapper_subclassl  sp     Z(#.#4#4k6H6H6JL
;443
L
 
!HH33AABST
r   c                ,    t        j                  |      S r   )r  r  )rO  aliass     r   _unpickle_python_modulez*GuardsStatePickler._unpickle_python_module  s    &&u--r   c                T    t         j                  j                  j                  |      S r   )r4  r  r   r  )rO  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   )r4  r  r  CInterpreterdeserialize)rO  jsons     r   _unpickle_functorch_interpreterz2GuardsStatePickler._unpickle_functorch_interpreter  s%     xx""//;;DAAr   c                ,    t        j                  |      S r   )r;  MappingProxyType)rO  ds     r   _unpickle_mapping_proxyz*GuardsStatePickler._unpickle_mapping_proxy  s     %%a((r   c                H    t         j                  |      j                         S r   )r#  fromkeysr  )rO  elemss     r   _unpickle_dict_keysz&GuardsStatePickler._unpickle_dict_keys  s    }}U#((**r   c                .    t        j                  ||      S r   )	itertoolsr{  )rO  r  r}  s      r   _unpickle_count_iterz'GuardsStatePickler._unpickle_count_iter  s    tT**r   c                    t         j                  j                  j                  j                  j	                         |   S r   )r4  r+  fsdp_fully_shardget_cls_to_fsdp_cls)rO  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   )r4  r9  parallelDistributedDataParallel__new__r:  r  )rO  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"  r4  opsr  )rO  r  s     r   _unpickle_c_opz!GuardsStatePickler._unpickle_c_op  s    uyy||T**r   c                ^    t        t        t        t        j                  |      |      |      S r   )r"  r4  r  )rO  	namespaceopnameoverloadnames       r   _unpickle_opzGuardsStatePickler._unpickle_op  s!    wwuyy)<fE|TTr   c                .    t        j                  ||      S r   )r;  r=  )rO  funcr  s      r   _unpickle_bound_methodz)GuardsStatePickler._unpickle_bound_method  s    d++r   c                ^    t        t        j                  j                  j                  |       S r   )r"  r4  r9  	attention
SDPBackendr  s    r   _unpickle_sdp_backendz(GuardsStatePickler._unpickle_sdp_backend  s!     uxx))44d;;r   c                \    dfd}|j                   t        d      |j                   d   S )Nc                      S r   r  )rj  s   r   r  z,GuardsStatePickler._unpickle_cell.<locals>._  s    Jr   z-Closure must not be None when unpickling cellr   )r   r   )r   r   )rO  rj  r  s    ` r   _unpickle_cellz!GuardsStatePickler._unpickle_cell  s/    	 ==  !PQQ}}Qr   c                .    t        j                  ||      S r   )r  
namedtuple)rO  r  fieldss      r   _unpickle_named_tuple_typez-GuardsStatePickler._unpickle_named_tuple_type  s    
 %%dF33r   c                2    ddl m}  |j                  |      S )Nr   r   )torch._dynamo.packager   to_code_object)rO  serialized_coder   s      r   _unpickle_codez!GuardsStatePickler._unpickle_code  s    8,~,,_==r   c                r    t        j                  |      j                  }t        j                  |||||      S r   )r  r  r  r;  r<  )rO  r   r9  qualnameargdefsclosurer  s          r   _unpickle_nested_functionz,GuardsStatePickler._unpickle_nested_function  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                  |      rVts        ||jt                        r@tw        |d
      r4tw        |d      sty        d| d      |jz                  |j|                  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"      rts        |t        j                  j                  j                  j                        r|t        j                  j                  j                  j                  ur|j                  d#   }ts        |t        jD                  jF                        sty        d$|       |t        j                  j                  j                  j                  j                         vrty        | d%      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_unpicklerzsympy Function subclass z% must have _torch_unpickler attributer  zCannot serialize SymInt z (node: rZ  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  r@  z!Expected nn.Module subclass, got z* not found in FSDP cls-to-fsdp-cls mapping)zsympyrh  r  r  r  r  iscoder  r   r  from_code_objectr  r  r   r4  r5  r  torch.utils._python_dispatchr	  r  rM  r"  r|  r  
empty_liker  r  r  r|  r}  r  r  r  r  r9  r:  r  r%  r+  r  r  r  r  r   r   NotImplementedr   r  r^  r  r   r  r  r  r  	serializer  r!  Functionrn  r   r  r
  rC  r  r  r  r!  r   r;  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  modulesrz  ismethodr   __self__r  r  r1  r+  r  Workr  r  r  r  rT   PackageErrorr  r  
FSDPModuler   r  r  )r   r  r  r   r	  r  attrsr  r  innerr  r  r}  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$.se3XY  ''#*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(;M?K  " ,,11>>KK__ab )(/)ST  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  r0  r   r0  )r  r0  r  r1  r  r  r  r*  r  r   r  zlist[tuple[str, Any]]r   r0  )r  r   r   ztypes.ModuleType)r  r*  r   ztorch._C.DispatchKeySet)r  bytesr   z torch._C._functorch.CInterpreter)r  rL  r   z types.MappingProxyType[Any, Any])r  z	list[Any]r   r   )r  r*  r}  r*  r   zitertools.count[int])r  type[torch.nn.Module]r   r3  )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)rj  r   r   r   )r  r   r  r  r   ztype[NamedTuple])r   r   r   rH  )r   rH  r9  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   r?  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>  r  r  r  r  r  r.  r   r   s   @r   r  r  A  s   -)- %- '	-
 - - 
-  
 !  	
   
 ( !  	
   * 
 & . . ? ? BB	)B B
 ))	)) )
 + + + + 
1
	
 
 "	2  + + U U , , < <     44 /4	4 4 > >
 	O	O 	O 		O
 +	O 3	O 
	O 	ORR	9R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)Nrl  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_typesrC  )rS  builderMISSINGr  r5  r  r8  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$  rn  r%  rh  r  r  r  r  r4  compilerkeep_portable_guards_unsafer   r?  r   r  r   dumpr  r  rT   r'  r   ro  )r  r=  bufr  r  r  leavesleafr  picklerrS  ry  s               r   pickle_guards_staterK    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)rJ  Nc
           
     	    |r|j                   nd }
i  _        t        |xs g       }| _         j                  t	        d      | _        |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"        j0                  j3                         5  |r j5                  ||||d      \  }} ||D cg c]  }t7        ||       c}      }t9        |      t9        |      k7  r$t	        d	t9        |       d
t9        |       d      t;        d |D              st	        d      t=        |      D cg c]  \  }}||   s| }}} j5                  ||||||      \  }}| _         jA                  |||       d d d        jB                   j>                  _!        tD        jG                  d j>                         |jB                   j>                  _!        d|jH                  s|jJ                  s j>                  jM                  |jN                        sCtQ         j>                  |jN                  tS        jT                         d       }t	        d|       tV        !tW         j>                  |jN                  |       tY         j>                  jZ                  |jN                  d      tD        jG                  dd       t]        j^                  dta                     d  _1        |r`ddl2m3} ti         j                  |      s!t	        dtk         j                               	  jm                  || 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# tn        jp                  $ r|}t"        j$                  j&                  jr                  s|	r| j                  ju                  dtw        |       ty        jz                         j}                  d             Y d }~d }~ww xY w)!Nr  r  z9guard_nn_modules is turned off using justknobs killswitchc                ,    | D cg c]  }d c}S c c}w rc  r  )gsgs     r   r  z/CheckFunctionManager.__init__.<locals>.<lambda>0  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  ra  r  r  r  r  z7%s guard on %s is dropped with caching_precompile=True.T)r  r|  r6  r7  rU  rV  r9  r  )r   rQ  keeprP  _guard_filter_fns       r   r  z6CheckFunctionManager.__init__.<locals>.guard_filter_fn2  s    "#3F#;VD )GD!

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

5)

4(+), 
r   r  )r
  Fzfilter_results length (z) != sorted_guards length (rZ  c              3  >   K   | ]  }t        |      t        u   y wr   )r  r   )r  rt  s     r   r  z0CheckFunctionManager.__init__.<locals>.<genexpr>f  s     Cq47d?Cs   z'All filter_results entries must be bool)r  %sg        )backendziGuard failed on the same frame it was created. This is a bug - please create an issue.Guard fail reason: rQ   zGuard eval latency = %s us.2fguard_latency_usr   r  r  zGuard evaluation failed: r  )	tracebackdynamo_cpp_guards_strc                 *    j                    d ddS )Nz
Guard latency = rW  z us)r\  )latencyr   s   r   r  z/CheckFunctionManager.__init__.<locals>.<lambda>  s     $"4"4!55GPS}TWX r   
payload_fn)r   zSequence[GuardFilterEntry]r   zSequence[bool])Br   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesr  r   r  r  rM   re  r  r  r  r  r  rF   rU  rV  r4  r  rR   caching_precompiler   r:   sort_keyr  DisableTorchFunctionbuild_guardsr?  r   r  r  r\  compile_check_fnr   rB  rC  skip_guards_checkr  rr  r  get_guard_fail_reason_helperr7   r  r   r$   r   r5   increment_toplevelr*  guards_stater  r   r   r  serialize_guardsrT   r'  strict_precompilebypass_packager   rY  
format_excrz  _loggingtrace_structuredclear)r   r  r  cache_entriesr   r  r  r  r  strict_errorr   existing_diff_guard_sourcessorted_guardsr=  r\  rS  filter_resultsr  reasonsr   ry  rS  r\  s   `                    @@r   r   zCheckFunctionManager.__init__  s    )5$$$;= B-BUSUV 	$ 7C$ !@AA !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" ~&#m*<<(1#n2E1F G114]1C0DAG  CNCC()RSS*3M*B!&anUVFWE! !
 &*%6%6+ / &7 &"G] "/D!!'=-HK%	I^ .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$6tD<M<M7N6OP 
$($9$9]D,=,=%! 	''#X 	( 	
 	 m Y!-%	I %	IZ ## ==''99\G!!00/Ax8'224::4@ 1  sJ   4!QP7
(A-QP<#P<'7Q"Q 7QQS"A2SS)r  rR  r  rV  rZ  r_  ra  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 ]i  }t!        |j"                  t$              r;| j&                  st)        d      | j&                  j*                  D ]
  } |	|        X |	|j"                         k |j,                  D ]
  } |	|        dd|
j.                  j1                         D ci c]  \  }}|v s|| j2                  v r|| }}}|
j.                     j1                         D ci c]  \  }}|| j4                  v r|| c}}|<   t7        j8                  |
|
j:                  j1                         D ci c]  \  }}|v s|| j<                  v r|| c}}|t        j>                  jA                  tC        fd	|D                    tE        jF                  tH        |
jJ                        d
      }
tM        |
| j&                        }tO        ||      S c c}}w c c}}w c c}}w )Nr  )r  rf  z guard cannot be serialized.c              3  D   K   | ]  }|t         j                  v r|  y wr   )rJ  rw  )r  r  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>  s'      0VVV s    rl  c                *   t        |       x}r?t        |t              st        dt	        |             |k7  rj                  |       y y t        |       x}r9t        |t              st        dt	        |             j                  |       y y )NzExpected str, got )r+   r   r   r   r  r   r,   )r^  r  builtins_dict_nameused_global_varsused_local_varss     r   prune_variablez=CheckFunctionManager.serialize_guards.<locals>.prune_variable
  s    -f55t5!$,(+=d4j\)JKK --$((. ..v666!$,(+=d4j\)JKK##D) 7r   z6shape_code_parts must be set for ShapeEnvSource guardsc                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   rP   r<  ri  r  s    r   _refzPCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>._ref+  s!    !!mW[[%AB s
Hr   c              3  .   K   | ]  } |        y wr   r  )r  r-  r  s     r   r  zUCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>.<genexpr>0  s      9Qa 9s   )rt  r   r   r   )r   	functoolspartialrC  r   ra  r   r  )rt  new_argskvnew_keywordsr  s        @r   normalize_create_fnzBCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn(  s    !Y../
 ! 9!&& 9978zz7G7G7IJtq!47
JJ ((K(KlKKH  Ks   Bc           	   3  p   K   | ]-  }t        j                  |d d  |j                               / y w)N)obj_weakrefguarded_class_weakrefr`  )r  r  r`  )r  rS  r  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>L  s@         ''$(.2"5eoo"F	 s   36T)r  r   _guardsr'  rf  )r  r  )r^  r>   r   r   )rt  Callable[..., None]r   r  )(r;  r<  rC  r~  r  r  rJ  rw  r4  r  rT   r'  next%name_of_builtins_dict_key_in_fglobalsr   dump_guards_stater   r  rx   r  r   r  r  r   r   r  re  r  r  r  r  r  	GuardsSetrM   r  tree_mapr  r'  r  rK  )r   r=  rt  r  rS  r6  r7  r  failedr~  output_graph_guards_stater^  r  r  global_scope_stateri  r{  r  r|  r}  s                   @@@@r   rj  z%CheckFunctionManager.serialize_guards  s6    # 	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,,(P  #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   LL!Lc                   t               }||_        d dfd}t        || j                  || j                  |j
                  |j                  || || j                  |      }	d	d}
t        j                  |	|
      t        j                  xr t        d      }|D ]`  }|sK|j                         r;d|j                  vr-d|j                  vrt        j                  sd|j                  vrP|j!                  |	       b |	|fS )
Nc                    | j                   }|t        j                  u r| j                  S st	        d              }|t	        d      |j                  | j                        S )Nz/w_builder must be set before calling source_refz'GuardBuilder has been garbage collected)guard_sourcer=   CONSTANTr  r   rX  )r^  r  	r_builder	w_builders      r   r  z5CheckFunctionManager.build_guards.<locals>.source_refr  sc    !..L{333{{"$%VWW!I $%NOO$$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  )r^  r>   r   r   )r  zweakref.ref[GuardBuilder]r   r   )r   r   r  r  r  r  r   r  r<  ri  rR   r  rF   r8  r  r  rZ  )r   rt  rs  r  r  r  r  r\  r  r=  r  guard_on_nn_modulesrS  r  s                @r   rd  z!CheckFunctionManager.build_guardsc  s    ,-+F(	
	2 KK  $$%%!%!:!:+
	 KK9	$55 
//;
 # 	"E'224 #%**4$EJJ655

9RLL!	" %%r   c                j	   |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k7  rtq        dt!               d      || j                  _9        || j                  _:        | j                  jw                          | j                  _<        || j                  _=        || j                  _>        d | j                  _?        d | j                  _@        |	| j                  _A        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 )NrU  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  rE   from_tracebackr  r  )r  rS  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   rl  z
Stack:
z
User stack:
zGuard: %s%s%s)r  rB  rC  r|  verbose_guards_logisEnabledForloggingDEBUGr  r@  formatr  )	r  rS  log_onlyr~  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   TrQ   zcheck_no_aliasing(rY  rZ  r  zcheck_overlapping(overlapping=[c              3  4   K   | ]  }|j                     y wr   r  r  r`  s     r   r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>5  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>6  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>M  s    BV4WQQS4W 4Ws   r]  rr  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr  r   z,Expected all code_parts to be consumed, but z remainr   )r  r   rS  Guard | Noner  r   r   r   )Br  rB  rC  r\  r   attach_compile_idr   r7   r  r  r   r   r=  rS  r   r  r   r   r  r@  rR   r  r  r  r  r  rL  r  aotautograd_guardsr   r9   input_source_ainput_source_br  r    r  r?   overlapping_sourcesnon_overlapping_sourcesr!   r!  r  r4  rn  ro  rS   initial_global_stateGlobalStateGuardrr  r"  r  r  rK   r  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  rS  source_ar  r  r`  overlapping_guard_managersnon_overlapping_guard_managerscheck_global_stater   rK  r   r  r   s                            @@@r   re  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 z?a >s:>OwW  +7'"'<<>0B-*>'+8( *.&)-&8P5Q.2s   ?R+'R0c                   t        | d      rt        | j                  t              s| j                  j                  x}| j                  j
                  x}yt        |t              st        dt        |             t        |t              st        dt        |             d| d}t        |      }|j                  ||       || _        y y y y y )Nr\  zExpected CacheEntry, got zExpected ExtraState, got zCache line invalidated because z got deallocated)rn  r   r\  r  r   r   r   r   r  r   
invalidate)r   obj_strr   r   r  deleted_guard_managers         r   r  zCheckFunctionManager.invalidateu  s    
 D/*t113MN $ 2 2 > >>K $ 2 2 > >>Kk:6$'@kAR@S%TUUk:6$'@kAR@S%TUU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  )	rh  r_  r<  ri  r  r  r  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)rh  r_  )r   r  s     r   r  z$CheckFunctionManager.lookup_weakrefs  s(    c7dnn$>>"S'**r   )NNNNNFF)r  rH  r  r   rq  zlist[CacheEntry] | Noner   "Callable[[GuardFail], None] | Noner  rK  r  r  r  rN  r  r   rr  r   r   r   )r=  r  rt  list[Guard]r  r   r   r2  r   )rt  r  rs  r  r  rH  r  r   r  r   r  rK  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   rw  r   rj  rd  re  r  r  r  r  r   r   rJ  rJ    sj   
 26<@266:!"P!P! (P! /	P!
 :P!P! 0P! 4P! P! P! 
P!d	H)+D 	:: #: (	:
 
:R C&"C& &5C& 	C&
 -C& C&C& 
2C&JKQKQ  KQ :	KQ
 
KQZ7*r   rJ  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  )ri  csepasss    r   r  z%build_guard_function.<locals>.replace  s    ??4((r   c                
    g | fS r   r  )ri  s    r   r  z%build_guard_function.<locals>.replace  s    t8Or   zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr  )
torch._inductor.utilsrA   rP  r{  RecursionErrorrj  r   rc  splicero  )
r   closure_argsrA   r  
guard_bodyri  rc  rS  make_guard_fnr  s
            @r   rA  rA    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   r4  rn  	_internal	log_stateis_artifact_enabledr  r   r   is_recompiles_enabledr    s#    >>##--AA,OOr   c                 h    t         j                  j                  j                  j	                  d      S )Nr   r  r  r   r   is_recompiles_verbose_enabledr    s$    >>##--AABVWWr   c                P    | D cg c]  }t        |       c}dfd}|S c c}w )Nc                     t               } t        |       t              k7  ryt        |       D ]  \  }}|t        |      us y yr7  )r   r   r  r  )	cur_stackr  moder;  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   ru  )initial_stackrt  r  r;  s      @r   r  r    s+     ,,T!W,E
 +* -s   #Scopec                   | j                   t        d      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+guard_manager.global_scope must not be None__compile_source__rQ   rY  zDuplicate tensors found: )r   r   r#  r  rp  r  r   rh  evalr|  r   r@  )	r\  r  r   ids_to_sourcetensor_source	tensor_idr
  duplicate_tensorsr  s	            r   1recompilation_reason_for_no_tensor_aliasing_guardr    s     !!)JKK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   
C!C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)r`  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   rl  z  File "z", line z, in     r  )r   r  rw  r  r   stripr|  r@  )r  linesframer  rw  r  source_lines          r   format_user_stack_tracer    s     S_1E />>zz,1JJejj&&(Bxz&tfEFLL4}-./ 99Ur   c                V   | yddl m} t        | |      rMd| j                  d| j                  }| j
                  r|d| j
                  z  }d| d	t        |       d
dS | }d}t        |t        j                        rd}|j                  }t        |dd      }t        |dd      }|r
|r| d| }n3|r|}n.t        |d      r|j                  }nt        |      j                  }t        |dd      }|d|j                   d|j                   nd}	| | |	 dt        |       d
dS )zKReturn a human-readable string describing a backend callable for debugging.Nr   r   )_TorchCompileWrapperz	compiler=z
, dynamic=z	, kwargs=z_TorchCompileWrapper(z) (id=z#xrZ  rl  zfunctools.partial wrapping r   r   r  r   r   z defined at :z (id=)r4  r  r   compiler_namedynamicr  rh  r  r  r  r"  rn  r   r  co_filenameco_firstlineno)
rV  r  detailsactualr   r  r9  r  r   locations
             r   describe_backendr  %  sV    +'/0g336j@ST>>7>>"455G&wivbk"5EQGGFF&)++,.v~t4HV\40FF8*%			$F|$$6:t,D  t''($*=*=)>?  XdVH:U2g;r*:!<<r   c                ~   | j                   t        d      | j                  t        d      || 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                  r_t        |	j                        }
nI||k7  r1t        |      }t        |      }d| d| 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  }t1        |      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  z+guard_manager.closure_vars must not be Noner  r  Frl  rQ   zDuplicate tensor foundr   Tz[BACKEND_MATCH failure: torch.compile detected different backend callables. Cached backend: z. New backend: z. 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  rR  z; z
User stack trace:
)r   r   r   r  r   rV  rv  resultr   r   r  r  r  r|  r  r#  rO   r  	Exceptionr  r   r   r   r@  r:  )r\  f_locals
compile_idrV  r  rv  cache_entry_backendno_tensor_aliasing_check_failedr   guard_debug_infouser_stack_strcached_descnew_descr  rV  r   fail_reason
reason_strs                     r   rg  rg  P  s    !!)JKK!!)JKK!;!;C!@AE	LL++,G  +77??&+#$&$228<N
 ""-@@ !"a''+=a+@@26/,%'" &&45E5P5PQN		'&':;#G,  +} -%J 'N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*   0H32HH0$H3.H00H33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)NrR  zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   r  r  rg  r   r   r|  r   r   r  rU  rv  )r\  r   r  r  rV  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                R   g | D ]N  }t        |j                  |j                  |j                  |j                  ||      }|s>j                  |       P |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,                  |
      t.        j0                  j3                  d
d fd       S )z
    Return the list of guard failure reasons using cache entries.
    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  rc  )r  r  r  s      r   r  z:get_and_maybe_log_recompilation_reasons.<locals>.<genexpr>  s5      #Av <(8??64+HH#s   *,r  r!  z-triggered by the following guard failure(s):
zRecompiling function z in r  r  artifactc                     dddS )Nrecompile_reasonsr  )r  encodingr  r  r   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    '
 r   c                 .    t               dk(  r d   S  S )NrQ   r   rh  )rv  s   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    W):71:  r   )metadata_fnr^  )r  r\  r   r  r  r|  r  r  r  rR   error_on_recompiler@  r  r  rc  r;  r	  r
  recompiles_verbose_logrC  recompiles_logrT   RecompileErrorr4  rn  ro  )rq  r  rV  r  r   r  r   do_recompiles_logfailuresguard_failure_detailsmessagerv  s              @r   'get_and_maybe_log_recompilation_reasonsr0    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               }| D ]+  }|j                  |j                  j                                - | D ]-  }||j                  _        |j                  j                          / |S r   )rM   r  r\  r	  r   r  )rq  acc_diff_guard_sourcesr   s      r   r`  r`  $  sv     /9l$ 
%%%%@@B	

 % @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 rY  z and
  r  zMalformed guard:
)
printr;  r	  r
  r@  r   r   r   r  r   )r\  r   r  r   lastr  rS  s          r   guard_error_hookr7  :  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  rt  s      r   uniquer:  T  s3     5D D=GHHQKs   //c                   |r|| k7  rt        |      }t        |       }t        |      st        |       r/t        j                  | j                   d|j                   d      ||k(  r%t        j                  t        j                  |      S y )Nz is aliasing zC. This is not supported. Please do a clone for corresponding input.)r  )	r/   r.   rT   UnsafeScriptObjectErrorr  r  r  r  r  )
obj_sourcedupe_sourceser_source_is_localsource_is_locals       r   make_dupe_guardrA  \  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 ]M  }t        |t              st        dt        |             t!        |j"                        r@ |||| dz          O 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   )TracingContextNzExpected Guard, got rQ   )collect_debug_stackrB  )torch._guardsrD  r  guards_contextskip_installrB  r  r  r  r  r  r   r   r:   r   r  r1   r  )rB  r   rD  rG  rE  r   rS  s          r   install_guardrI    s     -#'')88N""$11 8		(	(	7  
&
&
*
*C K%' #7U}!EFF$U%=%=>E':JKr   rt  z"dict[str, GuardCheckSpec | object]GUARD_VALUE_DISPATCHr  r@  z9GuardBuilder methods missing guard_check_spec decorator: rY  z[. Use @register_guard_check_spec, @skip_guard_check_spec, or @unsupported_guard_check_spec.)r   rH  r   r   r   r*  )r-  r   r   r0  )r   zset[str])r   rI  )r   r\  r   r   )r_  z	type[Any]r   r   )r  r   rS  r  r   r   r   )r   zstr | list[str]rS  r  r  r  r   r  )r^  Source | Noner   r  )r  r   r   z
int | None)r  zSequence[Any]r   list[int | None])r  r0  r  r   r   rL  r  rL  r  r  r  r   r   r   )r	  rL  r
  r   r   r*  )r^  r   r   r   r   r   )r  r   r   r
   )r  r   r   r   )r^  z-DictGetItemSource | DictSubclassGetItemSourcer/  r   r0  r   r'  r   r(  r"  r   r   )rS  r:   r   r   )r   rH  r   r  )r_  r0  r   tuple[Any, ...])rS  r   r  r   r   rM  )r  r   rN  rM  r   r   )rS  r   r  r   r   r   )r  r   rN  r   r   r   )r  r   r   r   )r   ztuple[type, ...])rS  r:   r=  r  r   r   )r  r  r=  r  r   r2  )r   r  r  r   r   ztuple[str, str]r  )r  z'list[torch.overrides.TorchFunctionMode]r   zCallable[[], bool])r\  r   r  r  r   r  )r`  r   r   r   )r  ztraceback.StackSummary | Noner   r   )rV  zCallable[..., object] | Noner   r   )
r\  r   r  rI  r  zCompileId | NonerV  zCallable | Noner   r   r   )r\  r   r   rH  r  rI  r  r8   rV  r   r  r   r   r   )
rq  list[CacheEntry]r  r   rV  r   r  r   r   r  )rq  rN  r   r  )r\  r   r   rH  r  rI  r   r*  r6  r   r   r   )r9  zSequence[T]r   zGenerator[T, None, None])r=  r>   r>  rK  r   zfunctools.partial[Any] | None)r   r:   rB  r*  r   r   (G  r  
__future__r   r  r  r  r  r=  r  r  r  rA  r  r  r  pickler  r  rY  r;  r  r<  
contextlibr   r  r   r   typingr   r	   r
   r   typing_extensionsr   r   r   r   r4  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   rF  r7   r8   r9   r:   r;   r<   r=   r>   r?   r  rA   "torch._library.fake_class_registryrB   torch._library.opaque_objectrC   rD   torch._loggingrE   torch._utils_internalrF   %torch.fx.experimental.symbolic_shapesrG   rH   rI   rJ   rK   torch.utilsrL   r  torch.utils._ordered_setrM   torch.utils._tracebackrN   rO   torch.utils.weakrP   rl  rR   rS   rT   
eval_framerU   r^  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  r{  r  numpyr  ModuleNotFoundErrorr   r   r   r  r   torch._Cr   r  r   r   r  r   r   	getLoggerr   rU  rn  getArtifactLoggerrB  r*  r)  r  rA  r   r   r   r  cacher  r  r  r  r  r  rS  r  r  r  r  r  r  r  r  r  r  r  r  r  r5  r:  r<  r>  r"  r   rD  r  rz  rJ  rQ  rU  rX  r]  ra  rd  ri  rk  rp  rx  r|  r~  r  r  rP  r  r  r  r  r  r  Picklerr  r?  rK  rJ  rA  r  r  r  r#  r   r  r  r:  r  r  rg  r  r0  r`  r7  r:  rA  rI  dirr"  rv  rJ  isupperr  r+  _methodr   r  	signature
parameters_paramsrn  MISSING_GUARD_SPECSr!  r@  )r  rv  r  rn  rq  s   00000r   <module>rs     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 " ,~ ,Q QhT . . +/' .@/ hh&&:: %6 "&  	<,'K
  	
  " 	*31. d#  $+9+(+ + 	+
 )+ +\
G   
tyy 
 8 8Z 6 X
E
-;
;
13!?X X$x'
# x'
XPR8 R8j$!4 $ $ $ $ , , ,
   
 
r rj:))) )bY
 Y
x);XPX
+:++( 	gtCK012&2/422(
%-0(=Vn)&n)n) !n)
 n) 	n)p &
   	   	H A#AA 	A
 A AH"#"",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  Eg  	B\f<	s   [ '[B[ [[