
    i                   
   U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddl
mZ ddlmZmZmZmZmZm Z  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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE ddlFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP ddlQmRZRmSZS ddlTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z] ddl^m_Z_ ddl`maZambZb ddlcmdZd ddlemfZf ddlgmhZhmiZimjZjmkZkmlZl ddlmmnZo ddlpmqZq ddlrmsZsmtZt ddlumvZv ddlwmxZxmyZymzZz ddl{m|Z| ddl}m~Z~mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ erddlmZ dZded <   	 ddlZer$dd!lmZmZmZ dd"lmZ dd#lmZ dd$lmZmZ 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+Zdqd,Z G d- d.e_      Z G d/ d0      Zdrd1Zej                  dsd2       Zdad3ed4<   dtd5Zdud6Ze&j                  j                  j                  Zdvd7Z	 dw	 	 	 	 	 	 	 dxd8Zdyd9Zdzd:Zd{d;Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 d|d<Zd}d=Zd~d>Zdd?Zdd@Z ej                  dAB       G dC dD             Z	 	 	 	 	 	 	 	 	 	 	 	 ddFZddGZej                   G dH dI             Z G dJ dEej                        Z ej                  ddK       Z G dL dMeY      Z G dN dO      ZddPZ G dQ dRe      Zej                   G dS dT             Zej                   G dU dV             Z G dW dX      Zej                  ddY       Z	 G dZ d[ej                        Zdd\Z	 	 	 	 	 	 dd]Z G d^ d_      Zdd`ZddaZddbZ	 	 	 	 ddcZ e#ddeeef         Z	 	 	 	 	 	 ddeZddfZ	 	 	 	 ddgZ	 	 	 	 	 	 	 	 	 	 ddhZ	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddiZ	 d	 	 	 	 	 	 	 	 	 ddjZ	 	 	 	 ddkZ	 	 	 	 	 	 	 	 	 	 	 	 ddlZ e|e       ddmZ	 	 	 	 	 	 ddnZ ddoddpZ!y# e$ r dZY Dw xY w)a  
Core guard system for Dynamo that detects when compiled code needs to be recompiled due to
changes in program state. Guards are conditions that must remain true for previously-compiled
code to be valid for reuse.

This module provides the infrastructure for creating, managing and checking guards, including:
- Guard creation and composition
- Guard state management and invalidation
- Guard checking and failure handling
- Utilities for guard optimization and debugging
- Integration with Dynamo's compilation caching

The guard system is critical for Dynamo's ability to efficiently reuse compiled code while
maintaining correctness by detecting when recompilation is necessary due to changes in
program state, tensor properties, or control flow.
    )annotationsN)contextmanager)deepcopy)currentframe)Any
NamedTupleNoReturnOptionalTYPE_CHECKINGUnion)LiteralStringTypeAliasTypeTypeVar)ReferenceType)code_framelocals_names)check_obj_idcheck_type_idClosureGuardAccessorCodeGuardAccessordict_versionDictGetItemGuardAccessorDictGuardManagerFuncDefaultsGuardAccessorFuncKwDefaultsGuardAccessorGetAttrGuardAccessorGetGenericDictGuardAccessorGuardAccessorGuardDebugInfoGuardManager install_no_tensor_aliasing_guardinstall_object_aliasing_guard!install_storage_overlapping_guardinstall_symbolic_shape_guard	LeafGuardprofile_guard_managerRelationalGuardRootGuardManagerTupleGetItemGuardAccessorTypeDictGuardAccessorTypeGuardAccessorTypeMROGuardAccessor)
get_global_source_nameget_local_source_nameIndexedSource$is_from_flatten_script_object_sourceis_from_local_sourceis_from_optimizer_sourceis_from_skip_guard_source.is_from_unspecialized_builtin_nn_module_sourceTensorPropertyTensorPropertySource)CompileEventLoggerget_metrics_context)	CompileContext	CompileIdDuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSourceStorageOverlapIndentedBuffer)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_custom_getattrget_torch_function_mode_stack get_torch_function_mode_stack_atguard_failuresistype	key_is_id	key_to_idnormalize_range_iterorig_code_maptensor_always_has_static_shapetuple_iterator_getitemtuple_iterator_lenunpatched_nn_module_getattrverify_guard_fn_signature)Callablez(Optional[Callable[[Any, Any, Any], Any]]guard_manager_testing_hook_fn)	GeneratorKeysViewSequence)Symbol)DispatchKeySet)OutputGraphCommonOutputGraphGuardsState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       e/var/www/vps2.regionflexible.com/Desarrollo/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DI;?6:)-	%'7;6:DH1515AC57'?Bu&3=<r   c              #  z   K   t               | _        	 d  t               | _        y # t               | _        w xY wwr   )r   r   r   s    r   #_preserve_printed_relational_guardsz7GuardManagerWrapper._preserve_printed_relational_guards'  s,     ),&	3-0UD*SUD*s   ;' ;8;c                p     d fdd fddfd  j                           j                  S )Nc                L   | j                         j                  v xs | j                         dkD  }t        | j	                         j                               D ]  \  }\  }}| |       |      z  z  } |r)j                  j                  | j                                |S Nr   )
get_sourcer   
fail_countsortedget_key_value_managersitemsadd)nodeis_diff_guard_node_idxkey_mgrval_mgrr   visits        r   visit_dict_managerzJGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_dict_manager:  s    !T%<%<<U@QTU@U  -3++-335- F((w #eGnuW~&EE"F
 "''++DOO,=>%%r   c                $   t        | t              rJ | j                         j                  v xs | j	                         dkD  }| j                         D ]  }| |      z  } |r)j                  j                  | j                                |S r   )
isinstancer   r   r   r   get_child_managersr   )r   r   	child_mgrr   r   s      r   visit_managerzEGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_managerH  s    !$(8999 !T%<%<<U@QTU@U  "446 7	"eI&66"7 "''++DOO,=>%%r   c                J    | yt        | t              r |       S  |       S )NFr   r   r   r   r  s    r   r   z=GuardManagerWrapper.collect_diff_guard_sources.<locals>.visitV  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_sources0  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.finalizea  s/    44A:
 $$&'')r   c                D    | j                          | j                          y r   )r  populate_diff_guard_managerr   s    r   r  z.GuardManagerWrapper.prepare_diff_guard_managerh  s    '')((*r   c                    	 	 	 	 	 	 dddfddfddfd | j                         }|D ]E  }t        |j                         t        j                  j
                        s6|j                          G y)	uB  
        Identify ``tag safe nodes`` and ``tag safe roots`` within a guard tree.

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

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

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

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

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

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

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

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

        1. Visit leaves and classify them as tag safe or not.
        2. Propagate tag-safety upward: a parent dictionary becomes tag safe only if
        all of its children are already tag-safe.
        3. Propagate tag-safe-rootness upward: if the whole subtree is tag safe,
        the current node becomes the new tag safe root, otherwise propagate the
        subtree tag safe roots.
        4. Collect every tag safe node and, by inspecting parent tags, label the
        subset that are tag safe roots.
        c                    | j                         }| j                         }t        fdt        ||      D              S )Nc              3  `   K   | ]%  \  }}t        |      xr |j                          ' y wr   )r   is_tag_safe).0accessormgraccepted_accessorss      r   	<genexpr>zTGuardManagerWrapper.find_tag_safe_roots.<locals>.check_tag_safety.<locals>.<genexpr>  s4      !Hc 8%78NS__=NNs   +.)get_accessorsr  allzip)r   r  	accessors
child_mgrss    `  r   check_tag_safetyzAGuardManagerWrapper.find_tag_safe_roots.<locals>.check_tag_safety  sB     **,I002J %(J%?  r   c                   t        | j                         t              sJ g }d}t        | j	                         j                               D ],  \  }\  }}| |       ||j                   |             . | j	                         j                         D ]0  \  }}|r||j                         z  }|s||j                         z  }2 |r| j                          |S NT)

issubclassget_type_of_guarded_valuedictr   r   r   extendvaluesr  mark_tag_safe)r   tag_safe_rootsis_subtree_tag_safer   r   r   r   s         r   r   zCGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_dict_manager  s     d<<>EEEN"& -3++-335- :((w &'N&"))%.9: %)$?$?$A$H$H$J A '7+>+>+@@''7+>+>+@@'A #""$!!r   c                   t        | t              rJ g }| j                         D ]  }|j                   |              | j	                         rlt        | j                         t        j                        r2| j                         r2| j                         s"| j                          |S | j                          |S t        | j                         t              rP| j                         }| j                         }t        d t        ||      D              }|r| j                          |S t        | j                         t        j                   j"                        r* | t$        t&        f      }|r| j                          | gS |S | j                         t(        j*                  t(        j,                  t.        t0        fv rt2        j4                  ru | t6        t8        t:        t<        t>        f      }| j                         D ],  }t        |t>              s||jA                         tB        v z  }. |r| j                          |S t        | j                         t(        jD                        rE | t>        f      }|t        d | j                         D              z  }|r| j                          |S t        | j                         tF              rU| jI                         jK                  tB              r2t2        j4                  r" | tL        f      }|r| j                          |S t        | j                         tN              r% | tP        tR        f      }|r| j                          |S )Nc              3  f   K   | ])  \  }}t        |t              xr |j                          + y wr   )r   r   r  )r  r  r  s      r   r  zQGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager.<locals>.<genexpr>  s3      *%# x)ABXsGXX*   /1c              3  f   K   | ])  }t        |t              xr |j                         d k(   + yw)cell_contentsN)r   r   get_attr_name)r  r  s     r   r  zQGuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager.<locals>.<genexpr>  s?      + ! x)=> D ..0OCD+r*  )*r   r   r  r#  is_guarded_value_immutabler   r!  torchTensorhas_no_accessorshas_object_aliasing_guardr%  r"  r  r  r  nnModuler   r*   typesFunctionType
MethodTypestaticmethodclassmethodrR   )assume_dunder_attributes_remain_unchangedr   r   r   r   r   r-  dunder_attrs_assumed_constantsCellTypetupler   endswithr(   typer)   r+   )	r   r&  r  r  r  r'  r  r  r   s	          r   r  z>GuardManagerWrapper.find_tag_safe_roots.<locals>.visit_manager  sJ   !$(8999  N!446 8	%%eI&678 ..0 d<<>M,,.t7U7U7W**,| "!y &&(x "!w D::<dC ..0	!446
&) *),Y
)C* '# '&&(f "!e D::<ehhooN&668IJ'# '&&(  T "!M ..0&&$$ 	 DD '7),13,	'# !% 2 2 4 H!(,@A+$2248VV+ '&&(J "!I D::<ennM&6t>R=T&U##s + %)$6$6$8+ ( #
 '&&(6 "!3 499;UCOO%../MNDD '746'# '&&( "! D::<dC&602FG'# '&&(!!r   c                L    | g S t        | t              r |       S  |       S r   r  r  s    r   r   z6GuardManagerWrapper.find_tag_safe_roots.<locals>.visit:  s.    |	$ 01)$// &&r   N)r   r   r  ztuple[type[GuardAccessor], ...]r   r   )r   r   r   list[GuardManager])r   r   r   rA  )r   r   r!  r/  r3  r4  mark_tag_safe_root)r   r&  r   r  r   r   r  s      @@@@r   r
  z'GuardManagerWrapper.find_tag_safe_rootsl  sx    t		4S			"8l	"\	' tyy)" 	*D$88:EHHOOL'')	*r   c                    | j                  | j                        | _        | j                  r| j                  j	                          y y r   )clone_with_chosen_sourcesr   r   r   update_diff_guard_root_managerr   s    r   r  z/GuardManagerWrapper.populate_diff_guard_managerF  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_fnV  s    &&(N::r   )rH  r   r   r   )r   clone_manager)r   rI  rJ  s    ` r   rD  z-GuardManagerWrapper.clone_with_chosen_sourcesS  s    	; yy&&y11r   c                    |j                   j                  }|j                         }|D cg c]
  }|dz   |z    }}|S c c}w )N: )r   r   r   )r   guard
guard_namepartsparts        r   get_guard_linesz#GuardManagerWrapper.get_guard_lines[  sF    __--
((*6;<dd"T)<< =s   >c                    |j                         }|j                  j                  }|dz   |z   }|r|d|z   z  }|d|j                          z  }|d|j	                          d|j                          dz  }|S )Nz	: source=, z, type=z, tag_safe=())r   r   r   r!  r  is_tag_safe_root)r   guard_manageraccessor_strsourcetss         r   get_manager_linez$GuardManagerWrapper.get_manager_linea  s     ))+##,,Of$$$A	w}>>@ABB	|M5578=;Y;Y;[:\\]^^r   c                   t        |j                         j                               D ]  \  }\  }}|j                  d|        |j	                         5  |r5|j                  d| j                  |              | j                  ||       |r5|j                  d| j                  |              | j                  ||       d d d         y # 1 sw Y   xY w)NzKeyValueManager pair at index=zKeyManager: zValueManager: )r   r   r   r   indentr\  construct_manager_string)r   r  bodyidxr   r   s         r   construct_dict_manager_stringz1GuardManagerWrapper.construct_dict_manager_stringm  s     (.c.H.H.J.P.P.R'S 		A#C#'7NN;C5AB ANN\$2G2G2P1Q#RS11'4@NN^D4I4I'4R3S#TU11'4@A A		AA As   A/CC	c           
        |j                         5  |j                         D ]  }t        |t              rq|| j                  vr<| j                  j                  |       |j                  | j                  |             ]|j                  |j                  j                  g       |j                  | j                  |              t        |t              r| j                  ||       t        |j                         |j                               D ]I  \  }}|j                  | j!                  |d|j#                                       | j%                  ||       K 	 d d d        y # 1 sw Y   y xY w)Nzaccessed_by=)r^  get_leaf_guardsr   r&   r   r   
writelinesrR  r   r   r   rb  r  r  r  r   r\  reprr_  )r   r  r`  rN  r  r  s         r   r_  z,GuardManagerWrapper.construct_manager_string{  sC    [[] 	?,,. Ae_5D$B$BB66::5A(<(<U(CD % 8 8 OOD$8$8$?@A  #/0223= (+!!#S%;%;%=( ?#) )))|HMMOCT5UV --i>?+	? 	? 	?s   EE((E1c                   | j                         5  t               }d|_        |j                  dd       |j                  dd       |j                  d       | j	                  | j
                  |       t        | j
                  d      r?| j
                  j                         D ]"  }|j                  | j                  |             $ |j                         cd d d        S # 1 sw Y   y xY w)NrQ    T)r   zTREE_GUARD_MANAGER:r'   get_epilogue_lambda_guards)r   r   r   r   r_  r   hasattrri  re  rR  getvalue)r   r`  rN  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   rn  zGuardManagerWrapper.check  s    yyq!!r   c                8    | j                   j                  |      S r   )r   check_verbosero  s     r   rr  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   )rd  r   r&   r   r#  r   r  )r  rN  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   )ry  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Optional[RootGuardManager]r   r   )r   zGenerator[None, None, None])r   OrderedSet[str]r   r   )rI  r  r   r'   )rN  r$   r   r  )rW  r   rX  Optional[str]r   r   )r  r   r`  r   r   r   )r  r   r`  r   r   r   r   rp  r   r   r   )rp  r   r   r   )r   r   r   __doc__r   r   r   r  r  r  r
  r  rD  rR  r\  rb  r_  rl  rn  rr  r   r   r   r   r   	  s    @, 3 3/'b*+X*t>2-2	2 JN
)
9F
	
A#A+CA	A??'??	?@#"*r   r   c                    t         j                  j                         5  t        | t        j
                  t        j                  f      rt        j                  |       n| cd d d        S # 1 sw Y   y xY wr   )r/  	overrides_enable_torch_functionr   npgenericndarray	as_tensor)as    r   
from_numpyr    sR     
	/	/	1 T%/BJJ

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

 |
  D
 $%7
 &';
 ()?
 "#3
 #$7
 23S
 $%7
 DJJ
 RZTRXX
  5<!
" Y44#
$ "KK//ll'!55/
2 r   c                L    t        j                  |       j                  dd      S )N
rh  )astunparsereplace)r   s    r   _ast_unparser    s    ;;t$$T2..r   c                ~   d}||j                   r_t        |j                         D ]F  }|j                  t               vsdt	        |d       }t        |      dkD  rdt	        |       } nJ nH|j                  r<|j                  j                         }t        |      dkD  rdt	        |d          }nd}| d	| S )
Nrh  z  # T)r   i   r   z  # <unknown>z<60)
user_stackreversedfilenamer  rN   r   stacksummary)r{  rN  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 )NrT   (HINT: rU  )r   listr  _get_closure_var_hintoriginating_source)r   rN  recompile_hintr{  r   closure_hintrQ  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)rY  	full_namecurrentpath_suffixs       r   r  r  C  s    
 ~I &G

g12w7K7K
 $C$5$78K 4 45Q{mDD",Wm"D',,$ 
 r   c                    | y t        |       s| S t        | t        j                        sJ | j                  j                         S r   )rJ   r   r/  SymIntr   maybe_as_int)dims    r   convert_int_to_concrete_valuesr  Y  s>    
{s
#u||,,,xx$$&&r   c                >    | D cg c]  }t        |       c}S c c}w r   )r  )size_or_strider  s     r   convert_to_concrete_valuesr  c  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(rT  z	, device=z, requires_grad=z, size=z	, stride=rU  )	r/  _C_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper  r   requires_gradr   )valuer  sizesstridespytypedispatch_keysdispatch_keyr  device_indexr  	guard_strs              r   get_tensor_guard_code_partr  g  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  )rY  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                    t        | t        j                  j                        xr# t        j
                  xs t        |       t        u S r   )r   r/  r3  r4  rR   inline_inbuilt_nn_modulesr   r   )r  s    r   $should_optimize_getattr_on_nn_moduler    s=     eUXX__- (( 	De$(CCr   T)frozenc                  8    e Zd ZU dZded<   dZded<   dZded<   y)NNModuleAttrAccessorInfoFr   present_in_generic_dictNr  l1_keyl2_key)r   r   r   r  r   r  r  r  r   r   r  r    s'     %*T) !FM  !FM r   r  GuardManagerTypec                n   | j                   j                  }t        | j                  t              r| j                  j                  }n(t        |t
              sJ t        || j                        }t        ||      }t        t        |            |   }t        |t        t        f      r	| d|d}	n| d| d}	t        | j                  t              sN|j                  ||| j                  t        j                        j                  | j                  | d|gd        |j!                  ||	||      S )N[r  r   rY  example_valueguard_manager_enum == )r  r  r   r   r_   r"  r  r  r  r   intr   get_key_managerr  GUARD_MANAGERadd_equals_match_guardget_value_manager)
rY  base_guard_managerbase_example_valuer  r   base_source_namer   
key_sourcekey_example_valuevalue_sources
             r   getitem_on_dict_managerr-    s9    {{''&,, 23"",d3330&,,?%&6>J ./ABCEJ#c3Z0*+1->,AC*+1ZL:fll$67 	** ,,/==	 	+ 	

 !
 LLj\.?-BCDd
 //#-	 0  r   c                    | j                   }t        |t              ry| j                         ry|j	                         xr t        |t
               S NFT)r  r   ru   is_specialized_nn_moduleis_dict_keyrn   )rN  rY  s     r   match_on_id_for_tensorr2    sJ    %%F &+,%%'F
6:(F$FFr   c                  "    e Zd ZU ded<   ded<   y)GuardCodeListr  	code_listr;   rN  Nr   r   r   r   r  r   r   r4  r4    s    Lr   r4  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	 	 	 d<	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d=dZ	 	 	 	 	 	 d>dZd?dZed@d       Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dAdZdBdZ		 	 	 	 	 	 dCdZ
dDd	ZdEd
ZdFdZdGdZ	 	 dH	 	 	 	 	 	 	 	 	 dIdZ	 dJ	 	 	 	 	 dKdZdLdZ	 	 	 	 	 	 	 	 dMdZdNdZ	 dJ	 	 	 	 	 dOdZdNdZdNdZdPdZdQdZdNdZdNdZdJdRdZ	 dJ	 	 	 	 	 dRdZdJdSdZdNdZdNdZdNdZ dNdZ!dNd Z"dNd!Z#dNd"Z$dJdRd#Z%dNd$Z&dNd%Z'dNd&Z(dNd'Z)dNd(Z*dNd)Z+dNd*Z,dNd+Z-dNd,Z.dNd-Z/dTd.Z0dNd/Z1dNd0Z2dNd1Z3dNd2Z4dNd3Z5dNd4Z6dNd5Z7dNd6Z8dNd7Z9dNd8Z:dNd9Z;dJdSd:Z<	 	 dU	 	 	 	 	 	 	 	 	 dVd;Z=y)WGuardBuilderNc                @   || _         || _        || _        || _        ||d| _        t        j                         | _        |
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 | _        |	| _        || _        t9               | _        | j0                  j<                  J | j0                  j<                  j>                  D ]7  }| jA                  |      }| j:                  jC                  tE        |             9 i | _#        i | _$        t9               | _%        g | _&        tN        jP                  xr tS        d      | _(        tU               | _+        y )	NLG__builtins__>_<._dot_!pytorch/compiler:guard_nn_modules),f_codeid_ref
source_reflookup_weakrefsscopeweakrefWeakKeyDictionarysrc_get_value_cacheruntime_global_scopebuiltins__dict__copyr/  packagepackage_importer_package_imported_modulesr   r  rW  argnamesr   shape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managerscheck_fn_managerguard_tree_valuessave_guardsguard_filter_fnr   key_order_guarded_dict_idsoutput_graphguard_on_key_ordergetr   idr   _cached_guard_managers_cached_duplicate_input_guardsobject_aliasing_guard_codesrR   guard_nn_modulesrF   rM   already_added_code_parts)r   rH  rI  rJ  rK  local_scoper   rW  r[  r]  rP  r^  r  package_modulerY  dict_objs                   r   r   zGuardBuilder.__init__  s    $.9D<3X
%%' 	  %9$HL!%-%6%6%;%;%=

>" ]]++EEKKM	. 
<<S)11#s;CCCQD/=DJJ~&t,-DJJt	. +#%)+	
 46 46%EG.6F13&. +.%'$$11===++88KK 	>Fxx'H++//8=	> BD @B#DGE+BD( & 7 7 !
O/=
 :D%r   c                T   | j                  |      }t        |t              rt        d|j                         |j
                  j                  }t        |      D ]K  }||   }t        |j
                  |      }| j                  ||      }|j                  || d|d||       M y )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )r   r  r  r  rY  r  r   )
get_guard_managerr   r   NotImplementedErrorr  r  r   rc   get_guard_manager_typedict_getitem_manager)	r   r  rN  dict_mgrdict_sourcer  r  r,  r   s	            r   #guard_on_dict_keys_and_ignore_orderz0GuardBuilder.guard_on_dict_keys_and_ignore_orderF  s     ))%0h 01%FFKjj\S  ..33 %]3 	C!#&E,U-E-ESQL!%!<!<m" ))%awa0##5	 * 	r   c                4   | j                  |      }t        |t              st        d|j                         t        |t              sJ t        t        |            D ]  \  }}t        |j                  |      }|j                  |||t        j                        }t        |      rA| j                  ||      }|j                  |t        d| d| d|      |j                         |j!                  |t        | d||      |j                          y )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for r  z__check_obj_id(rT  rU  r!  )rn  r   r   ro  r  	enumerater   r  r#  r  r$  r   rI  add_id_match_guardr  r  r%  )	r   r  rN  rr  ra  r  r*  key_managerid_vals	            r   guard_on_dict_keys_and_orderz)GuardBuilder.guard_on_dict_keys_and_orderd  s,    ))%0($45%;;@::,H  ($4555 ""3E":; 	HC-ejj#>J"22!!#3#A#A	 3 K ~S*5..*)*RxqA5 $$ 22*j\cW+EuM$$)	r   c                    t         j                  rAt        j                  dk\  r.t        j                  dk  rt	        j
                  dt               y | S )N)      )r|  r}  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_value  sF     ''  G+  :-MM_ r   c                    	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd}|j                   }	|j                  }
t               }t        j                  |j
                        D ]+  }|j                  |j                  j                                - t        ddd      }|	|
v rt        d|	d      }nNd|
v r|	|
d   v rt        dd|	      }n5d|
v r|	|
d   v rt        dd|	      }n|	|vrd|
v r|	|
d   v rt        dd|	      }|j                  s|j                  |j                   |||      S |j                  sJ |j                  }|j                  }| d	}dx}}dx}}dx}}|rPt        |j                  |      }|j                  }|
|   }| j!                  ||      }|}|}| j!                  ||      }n|}|}| j!                  ||      }|j#                  || j%                  |
      t&        j(                  
      } |||||
||      }|r||J  |||||||      S |S )a(  
        This tries to avoid calling the expensive nn module custom getattr method by
        checking if the attribute is accessible via __dict__. For attributes that
        are not accessible via __dict__ (like descriptors), we fallback to
        PyObject_GetAttr.

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

        The most common and expensive case for nn module guards is of type
        mod.submod1.submod2.submod3.training. We avoid the python getattr of nn
        modules by going through the __dict__.
        c                   t        | t              rdt        ||      }d| d|d}| j                  |||t        j
                        j                  || d|gd        | j                  ||||      S | j                  ||||      S )Nr  r  r  r  r!  rm  )	r   r   r  r#  r  r$  r%  r&  rq  )r  r  source_namer(  r  r   r   r*  s           r   getitem_on_dict_mgrz>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgr  s     #/0 &&8#>  /{m3uiqI
##%"%'7'E'E	 $ 
 )(*T#/I.JDQ ,,&"/'9	 -   //&"/'9	 0  r   FNT_parameters_buffers_modulesattrrY  r  r   	.__dict__rY  r  r   )r  r  r  r(  r  r   )r  r   r  r   r  r   r(  r   r  r   r   r  r   r   )memberrR  r   r  getmror   updatekeysr  r  getattr_managerr  r  rW   r  r  rp  get_generic_dict_managerr  r  r$  )r   rY  r'  r(  r  r)  r  r   r  	attr_namemod_dictall_class_attribute_namesrp  accessor_infor  r  mod_dict_sourcel1_source_namel2_source_namel1_valuel2_valuel1_guard_manager_enuml2_guard_manager_enum	l1_sourcemod_generic_dict_managerl1_mgrs                             r   getattr_on_nn_modulez!GuardBuilder.getattr_on_nn_module  s   6#	#	#	 #	 !$	#	
 #	 !1#	 #	J MM	%...1e! 2 < <= 	@A%,,QZZ__->?	@ 1dC 4T9dKMh&98O+O4T=)TM8#	Xj5I(I4T:yQM66h&Xj11 5T:yQM44 &55]]"+#5	 6   !''''"))F"))F "2 2)<O.22N^"&&Hx<@@!$9&v{{F;	!*#F+ )-(C(CIx(X%!,((,(C(CM)% "-((,(C(CM)% (:'R'R&"JJ8T#3#A#A (S ($ ),*#+&#8F %16K6WWW* .'/"*'<  Mr   c                v    |j                   }|dk(  ryt        | j                  |            }|| j                  v S )Nrh  F)r  rc  rb  r_  )r   rY  r  obj_ids       r   requires_key_order_guardingz(GuardBuilder.requires_key_order_guarding:  s:    kk"DHHV$%8888r   c                    t         j                  }| j                  |      rlt        |t              rt         j
                  }|S t        |t        t        f      rt         j                  }|S t        |t              sJ t         j
                  }|S r   )	r  r$  r  r   r   r9  r   	frozensetr"  )r   rY  r  r   s       r   rp  z#GuardBuilder.get_guard_manager_typeA  s     .;;++F3-3%5%H%H" "! MC+;< &6%C%C" "! "-666%5%H%H"!!r   c                (    |t         j                  k(  S r   )r  r9  )r   mgr_enums     r   manager_guards_on_keysz#GuardBuilder.manager_guards_on_keysW  s    +>>>>r   c                    | j                   j                  j                  | j                  d| j                  d   t
        j                        S )Nr@  )	f_globalsrY  r  r   )rW  r   globals_dict_managerrP  rL  r  r$  r   s    r   get_global_guard_managerz%GuardBuilder.get_global_guard_managerZ  sF    !!&&;;//**S//==	 < 
 	
r   c           	        | j                   j                  }d }j                  }|dk7  r|| j                  v r| j                  |   S |dk7  r)| j	                        }|| j
                  t        |      <   | j                  |      }d }d }d }t        j                  }	t        t              rhj                  j                  }| j	                  j                        }| j                  j                        }| j                  j                  |      }	t        t              rCt!        | j"                  j$                        }
|j'                  j$                  |
f|||      }	n[t        t(              r/| j+                         j-                  j.                  |||      }	nt        t0              r/| j+                         j3                  j.                  |||      }nt        t4              r|S t        t6              r|S t        t8              r|sJ |j;                  |||      }nt        t<              r|sJ |j?                  |||      }net        t@              r|sJ |jC                  |||      }n;t        tD        tF        tH        tJ        tL        f      r|sJ |}nt        tN              r9tQ        jR                  jT                        }|jW                  |fd|||      }nt        tX              r|jW                  fd|||      }nt        tZ              r|jW                  fd|||      }nqt        t\              r|sJ |j_                  |||      }nGt        t`              r%|sJ |jc                  jd                  |||	      }nt        tf        th        tj        f      r_|sJ t        tf              sJ tm        |      r|sJ | jo                  ||||||      }n|jq                  jd                  |||	      }nt        tr        tt        f      r|sJ t        |tv        tx        jz                  f      sJ t        tr        tt        f      sJ t        |t|              r$| j                  |	      sJ t        ||||      }nt        j                  t              rt        d
      |j-                  j                  |||      }nt        t              rH t        |dj                  j                  j                          d      j                  |||      }nrt        t              r%|sJ |j                  j                  |||      }n=t        t              r%|sJ |j                  j                  |||      }nt        t              r|sJ t        |tv        tx        jz                  f      rJ d       t        |t              r-j                  s!|j                  j                  |||      }nt        |t              r-j                  s!|j                  j                  |||      }nSj                  }j                  rj                         }|j                  ||||      }nt        t              r|sJ |sJ t        |      sJ j                  sK|j                  ||j                  t        j                        j                  j                  |||      }n|j                  }|J |dz   }|j                  ||t        j                        }t        |t|              rJ |j-                  j                  |||      }n.t        t              r|sJ |jW                  t        |||      }nt        t              r|sJ |jW                  d |||      }nt        t              r|sJ |jW                  d |||      }nt        t              r|sJ |jW                  d |||      }n{t        t              r|sJ |jW                  d |||      }nOt        t              r|sJ |jW                  d |||      }n#t        t              r|sJ |jW                  d |||      }nt        t              r%|sJ |j                  j                  |||      }nt        t              r<t        |t|              st        d      |j                  j                  |||      }nvt        t              r%|sJ |j                  j                  |||      }nAt        t              r|sJ |j                  |||      }nt        t              r|sJ |j                  |||      }nt        t              r|sJ |jW                  d |||      }nt        t              r|sJ |jW                  d |||      }nt        t              r|sJ |j                  |||      }not        t              r|sJ |j                  |||      }nFt        t              r|sJ |jW                  d |||      }nt        d dj                         || j                  j                  <   |S )Nrh  rm  )global_namerY  r  r   r  c                    |S r   r  )rC  r  s     r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    ! r   )python_lambdarY  r  r   c                6    t        j                               S r   )r   
_get_indexrC  rY  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (H%%') r   c                .    t        j                        S r   )r   r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (:6==(I r   r  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_ordertensor_property__manager)ra  rY  r  r   zUse DictGetItemSourcez.__kwdefaults__c                (    | j                         d   S r   __tensor_flatten__r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>|  s    (<(<(>q(A r   c                "    | j                         S r   )__obj_flatten__r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (9(9(; r   c                >    | j                         j                         S r   )_typequalified_namer  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    	(@(@(B r   c                "    | j                         S r   )get_baser  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    

 r   c                "    | j                         S r   )itemr  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s     r   c                ,    t        j                  |       S r   )r/  r  r  s    r   r  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  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 - )urW  r   r  rd  rb  r\  rc  rp  r  r$  r   r[   r  get_guard_manager_from_sourcer   rq   r   rH  
local_nameframelocals_managerrk   r  rq  r  rm   global_weakref_managerrl   rx   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  rc   rd   r"  r  r  r   r  r-  r   r_   RuntimeErrorr5   getattrproplowerra  r.   indexed_managerrp   list_getitem_managerrj   r  index_is_slicer=  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_managerAssertionErrorr#  rt   set_getitem_managerr   weakref_call_managerrX   call_function_no_args_managerra   rr   r]   code_managerr\   closure_managerre   )r   rY  root_guard_managerr  r  r   r)  r(  r'  base_guard_manager_enumr   outmoduler   
kwdefaults	kw_sourcerr  s    `               r   r  z*GuardBuilder.get_guard_manager_from_sourceb  s   !//44kk"0K0K!K..{;;" HHV,M8ED""2m#45!88O  !!"2"@"@fm,%{{//!%&++!6!%!C!CFKK!P&*&A&A/'#
 &+&1$++v?P?PQO$88&&8"+#5	 9 C FL) //1FF&&"+#5	 G C F/0//1HH".."+#5	 I C F-. &%FN+%%FJ'%%%$11"+#5 2 C
 FN+%%%$66"+#5 7 C
 FM*%%%$55"+#5 6 C
 +2"	
 &%%$CFL),,V-?-?@F$33*03"+#5	 4 C F89$33 #+#5 4 C F/0$33I"+#5	 4 C FJ'%%%$11"+#5 2 C
 F-.%%%$<<]]"+#5	 = C Z!35ST
 &%%fj11134FG'''//&&!$& )88&"/'9	 9  F.0IJK%%%049P9P2QRRRf'8:S&TUUU,.>?223JKKK-&&!& fll,>?&8  )==&"/'9	 >  F01'""6;;#3#3#9#9#;"<HE JJ"+#5C FM*%%%$44JJ"+#5	 5 C F-.%%%$99LL"+#5	 : C FM*%%%!"T;+B+B$C '&'  ,d3F<Q<Q(==&"/'9	 >  .6v?T?T(>>&"/'9	 ?  (("//1E(88&"/'9	 9  FN+%%%###.///<<(>>+"4"A"A'7'E'E ?  "/&"/'9	 " 	  0>>
'333,/@@	 .EE$",'7'E'E F 
 &h0@AAA33&"/'9	 4  F-.%%%$33("+#5	 4 C F23%%%$33A"+#5	 4 C F56%%%$33;"+#5	 4 C F;<%%%$33B"+#5	 4 C FO,%%%$334"+#5	 4 C F01%%%$330"+#5	 4 C F-.%%%$33D"+#5	 4 C F67%%%$CCll"+#5	 D C  2302BC$J  %44ll"+#5	 5 C F;<%%%$88ll"+#5	 9 C F-.%%%$99"+#5 : C
 F45%%%$BB"+#5 C C
 F12%%%$33;"+#5	 4 C F23%%%$331"+#5	 4 C FJ'%%%$11"+#5 2 C
 FM*%%%$44"+#5 5 C
 F/0%%%$33."+#5	 4 C !0FKK=I  47##FKK0
r   c                8    | j                  |j                        S r   )r  r  r   rN  s     r   rn  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 )NrT  r@  zPython shape guard function:
%s___make_guard_fn)r  joinr  build_guard_functionrL  
guards_logdebugexecr$  rW  r   add_epilogue_lambda_guardadd_lambda_guard)r   r   r   r   is_epiloguemake_guard_fn_args_guard_bodypycoder  globals_for_guard_fnguard_fns              r   $add_python_lambda_leaf_guard_to_rootz1GuardBuilder.add_python_lambda_leaf_guard_to_root  s     ,.L "YY|'8'8':;2:?QRV  #TZZ_5;VDV)3/*3)*L,?,?,AB ##==" ##44X?QSWXr   c                    t        |t              r|}n|j                  }|
t               }|j	                  | j
                  || j                        }|S r   )r   r?   r  r  	get_valuerL  rO  )r   guard_or_sourcer   srcrets        r   rb  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 )Nr8  zinvalid var name: %s)r   r   r  strip_function_callrW  r/  r  r  is_valid_var_namelogwarningrx  )r   rN  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   rN  r  r  attr_source	new_guards         r   _guard_on_attributez GuardBuilder._guard_on_attributeK  s[     
"$U%=%=>K$U%=%=yIKAQAQ
	 	r   c           	        |j                   }t        |t              r|j                  }t        |t              ry t        |t
              sJ d|j                          |j                  }|j                  }|j                  }| j                  |      }t        | j                  |      |      }d }|r
d| d|d}n	d| d|d}|| j                  v ry | j                  ||g| j                  |             | j                  |      }	|r| j                  |      }
| j                  |      }| j                  ||
      }t        |      r"| j!                  ||	||
||j                  |       nG|	j#                  ||j                  |
|       n'|	j%                  |t'        ||      |j(                         | j                  j+                  |       y )Nzinvalid source hasattr(rT  rU  znot hasattr()provided_guarded_objectr  )r  r   rs   r  r]   rW   r  r  r  rj  rb  rh  _set_guard_export_infor  rp  r  r  r  add_no_hasattr_guardr  r  r   )r   rN  rY  base_sourcer  r  refvalr   base_managerr  r(  r   s                r   HASATTRzGuardBuilder.HASATTR\  s   ))fn-[[Ffj)&*-M/MM-kk}}ll4 dhh{+T2cU"THA.D!#b2D4000##D6488K3H 	$ 	
 99+F !HHV,M!%+!6!%!<!<V]!S 44FG)) &!KK& ,, ::"/'9	 -  --,T595;K;K 	%%))$/r   c                   |J | j                  |      }| j                  |      }| j                  |      }d|d| d}|| j                  v ry |j                   d}|j                  || j                  |j                        t        j                        }|j                  d|t        ||      |j                         | j                  j                  |       y )Nznot ___dict_contains(rT  z
.__dict__)r  r  F)r  rb  rn  rh  r  r  r  rR  r  r$  add_dict_contains_guardr  r  r   )	r   rN  r  r  r  r  r   r  r  s	            r   NOT_PRESENT_IN_GENERIC_DICTz(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICT  s     ll5!hhuo--e4&thbZ@4000"ZZL	2#/#H#H"FFs||T/== $I $
  	!88"4/		
 	%%))$/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(rU  z___check_type_id(rT  ), type=ztype )r  )rb  r   r/  _subclasses
FakeTensorr  r?  r   r   _unserializablerI  r  rf  r  r  rn  add_type_match_guardr  r  )r   rN  r  rZ  r  	type_reprr   s          r   
TYPE_MATCHzGuardBuilder.TYPE_MATCH  s    eU..99:u||AUA>>QZZ' %)E!Q%

|1 56G	"4<<#6"7r&)U##ED62u%::"eeANN3C,D 	
r   c                   | j                  |      }| j                  |      }t        | j                  |            }d| d| }| j                  ||g       | j	                  |      j                  |t        ||      |j                         y )Nz___dict_version() == )r  rb  r   r  rn  add_dict_version_guardr  r  )r   rN  r  r  versionr   s         r   DICT_VERSIONzGuardBuilder.DICT_VERSION  s    ll5!hhuotxx/!#eG95##ED62 	u%<<'e4e6F6F	
r   c                2   | j                  |      }|rdnd}| d|d| d}|| j                  v ry | j                  ||g       | j                  |      j	                  | |t        ||      |j                         | j                  j                  |       y )Nnot rh  z___dict_contains(rT  rU  )r  rh  r  rn  r   r  r  r   )r   rN  r  invertdict_ref	maybe_notr   s          r   DICT_CONTAINSzGuardBuilder.DICT_CONTAINS  s    <<&$F"	-cWBxjB4000##ED62u%==J"4/		
 	%%))$/r   c                *   | j                  |      }|}| }d| d|d}|| j                  v ry | j                  ||g       | j                  |      j	                  ||t        ||      |j                         | j                  j                  |       y )Nzset.__contains__(rT  rU  )r  rh  r  rn  add_set_contains_guardr  r  r   )r   rN  r  r2  set_refr  containsr   s           r   SET_CONTAINSzGuardBuilder.SET_CONTAINS  s    ,,u%:"7)2dXQ74000##ED62u%<<"4/		
 	%%))$/r   c                z   | j                  |      }| j                  |      }t        |t              sJ | d|g}| j	                  ||       |r6| j                  |      j                  t        ||      |j                         y | j                  |      j                  t        ||      |j                         y )Nr!  )
r  rb  r   r   r  rn  add_true_match_guardr  r  add_false_match_guardr   rN  r  r  r   s        r   
BOOL_MATCHzGuardBuilder.BOOL_MATCH   s    ll5!hhuoc4   %tC7#$##E40""5)>>&tU3U5E5E ""5)??&tU3U5E5Er   c                    | j                  |      }| j                  |      }|J | dg}| j                  ||       | j                  |      j	                  t        ||      |j                         y )Nz is None)r  rb  r  rn  add_none_match_guardr  r  r>  s        r   
NONE_MATCHzGuardBuilder.NONE_MATCH  sq    ll5!hhuo{{%x !##E40u%::"4/1A1A	
r   c                &    | j                  ||      S r   )id_match_unchecked)r   rN  r  s      r   ID_MATCHzGuardBuilder.ID_MATCH  s     &&un==r   c                6   t        |j                  t              r=| j                  t	        |j                  j
                  t        j                              S | j                  |      }| j                  |      }| j                  ||j                        }	 t        |      }d| d| d| }| j                  ||gd       | j!                  |      j#                  |t%        |||      |j&                         t        |j                  t(              r_t        |t*        j,                  j.                        r:|j                  j0                  }| j3                  |      }	|	|	| j4                  |<   y y y y # t        $ r dt        |      j                   d}Y w xY w)NrD  rB  z___check_obj_id(rT  r$  rE  )provided_func_name)r   r  r~   r*  r;   r  r<  r  rb  rI  r  rf  	Exceptionr?  r   r  rn  rw  r  r  rq   r/  r3  r4  r  rK  r   )
r   rN  r  r  r  ry  r)  r   r  weak_ids
             r   rD  zGuardBuilder.id_match_unchecked&  sz    e..
;??e..33\5L5LM  ll5!hhuoS%**-	2S	I
 "#bD##ED6j#Qu%88"4?	
 e..< #uxx/"55@@
..s3&7>D((4 ' 0	 =  	2 DI../q1I	2s   E3 3"FFc                   | j                  |      }| j                  |      }t        |t        j                        sJ | d}| j                  ||g       | j                  |      j                  t        ||      |j                         y Nz is not None)
r  rb  r   r/  r0  r  rn  add_not_none_guardr  r  )r   rN  r  r  r  r   s         r   NOT_NONE_MATCHzGuardBuilder.NOT_NONE_MATCHM  sz    ll5!hhuo#u||,,,l###ED62u%88"4/1A1A	
r   c                   | j                  |      }| j                  |      }t        |t        j                  j
                        sJ | d|d}| j                  |      j                  |t        ||      |j                         y )Nz.raw_repr() == z.raw_repr())
r  rb  r   r/  r  r   rn  add_dispatch_key_set_guardr  r  )r   rN  r  r  r   s        r   DISPATCH_KEY_SET_MATCHz#GuardBuilder.DISPATCH_KEY_SET_MATCHX  sx    ll5!hhuo#uxx66777uOC7+>
u%@@":u5	
r   c                   | j                   j                  J | j                   j                  j                  }d| g}| j                  ||       | j                  j
                  j                  |t        ||      |j                         y )Nz,torch.autograd.forward_ad._current_level == )	r[  r`  
dual_levelr  rW  r   add_dual_level_match_guardr  r  )r   rN  rR  r   s       r   
DUAL_LEVELzGuardBuilder.DUAL_LEVELd  s     $$11===**77BB
>zlKL##E40::"4/	
r   c                   | j                   j                  J | j                   j                  j                  }|D cg c]  }|j                          c}d dg}| j	                  ||       t
        j                  j                  j                  dfd}| j                  j                  j                  |t        ||      |j                         y c c}w )Nz5torch._functorch.pyfunctorch.compare_functorch_state(rU  c                           S r   r  )rp  
compare_fnstatess    r   fnz.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn}  s    f%%r   r  )r[  r`  functorch_layers	get_stater  r/  
_functorchpyfunctorchcompare_functorch_staterW  r   r  r  r  )r   rN  ciscir   rY  rW  rX  s         @@r   FUNCTORCH_STACK_MATCHz"GuardBuilder.FUNCTORCH_STACK_MATCHq  s     $$11===##00AA+./R",,./GxqQR##E40 %%11II
	& 	00&tU3U5E5E	
 0s   Cc                   t         j                  j                  j                  j                  t         j                  j                  j                  j
                  	 	 	 	 dfd               d g}| j                  ||       dfd}| j                  j                  j                  |t        ||      |j                         y )Nc                H     |       sy t        t        t        |             S r   )r=  maprc  )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  )rp  	get_hooksguard_hooks_idsrg  s    r   rY  z5GuardBuilder.AUTOGRAD_SAVED_TENSORS_HOOKS.<locals>.fn  s    "l9;&???r   )re  zCtuple[Callable[[torch.Tensor], Any], Callable[[Any], torch.Tensor]]r   zOptional[tuple[int, ...]]r  )r/  r\  _aot_autogradr  top_saved_tensors_hooks"saved_tensors_hooks_are_inlineabler  rW  r   r  r  r  )r   rN  r   rY  rf  ri  rj  rg  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                  |      }t        | j                  |      j                         d         t        |d      rt	        |       t        |      dfd}ndfd}dt        |       dt        j                          }| j                  |      j                  |t        ||      |j                         y )NrQ   __metadata_guard__c                J    j                  | j                         d         S r   )rp  r  )rp  clsoriginal_metadatas    r   metadata_checkerzEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker  s)    --%q';';'=a'@ r   c                0    | j                         d   k(  S r   r  )rp  rs  s    r   rt  zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker  s    ++-a04EEEr   ___check_metadata__cr  )rb  r   r  rj  r   r?  rc  r8   current_compile_idrn  r  r  r  )r   rN  r  rt  r  rr  rs  s        @@r   TENSOR_SUBCLASS_METADATA_MATCHz+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH  s    $TXXe_%G%G%I!%LM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                *    | j                  d      S )NT)skip_shapes)_check_equals)rp  r  s    r   r  z1GuardBuilder.DTENSOR_SPEC_MATCH.<locals>.guard_fn  s    ??5d?;;r   __dtensor_spec_r  )r   rb  rc  rn  r  r  r  )r   rN  r  r   r  s       @r   DTENSOR_SPEC_MATCHzGuardBuilder.DTENSOR_SPEC_MATCH  s\     %)	< !H/u%66,T595;K;K	
r   c                d   | j                  |      }t        t        |            rj                  syt	        j                  |            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                0    j                  |       }|k(  S r   )r  )rp  current_valuesopaque_infooriginal_valuess     r   opaque_guard_checkerzDGuardBuilder.OPAQUE_OBJ_GUARD_FN_MATCH.<locals>.opaque_guard_checker  s#    (11N "_44r   ___check_opaque_guard_fn_rw  r  )rb  rC   r?  r  r   rc  r8   rx  rn  r  r  r  )r   rN  r  r  r  r  r  s        @@r   OPAQUE_OBJ_GUARD_FN_MATCHz&GuardBuilder.OPAQUE_OBJ_GUARD_FN_MATCH  s     )$u+6+"6"6";#7#7#>?	5 2"5I2J1K2nNoNoNqMrsu%66 ";6	
r   c                   | j                  |      }| j                  |      }t        rt        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  f}nd}t        t        f}t!        t"        t$        t         t&        t(        t*        t,        t.        j0                  t.        j2                  t.        j4                  j6                  j2                  h	||z        }t.        j8                  j;                         rddlm} ddl m!}	m"}
m#}m$} ||||
||	fz   }ddl%m&} ||fz   }dd l'm(c m)} tU        ||      sB |jV                  t%        |            s'tY        t%        |            sJ dt%        |              t[        |t\              rgt_        j`                  |      rRd| d| d	g}| jc                  ||       | je                  |      jg                  ti        ||      |jj                         y t[        |tl              rgt        j`                  |      rRd| d
| d	g}| jc                  ||       | je                  |      jo                  ti        ||      |jj                         y | d|g}t[        ||      rtq        |      }ti        ||      }|r|D cg c]
  }| d| d }}| je                  |      js                  |||jj                         | jc                  ||       y c c}w )Nr  r   )
DeviceMesh)_StridedShardPartial	ReplicateShard)_IntWrapperzUnexpected type z(type(z) is float and __math_isnan(z))z) is complex and __numpy_isnan(r!  r  rU  ):r  rb  r  int8int16int32int64uint8uint16uint32uint64float16float32float64r  r   r=  r   r?  r  sliceranger   r/  SizeStreamcudastreamsdistributedis_availabletorch.distributed.device_meshr  (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  rn  add_float_is_nan_guardr  r  complexadd_complex_is_nan_guardr   r%  )r   rN  r  r  r  np_typesok_mutable_typesok_typesr  r  r  r  r  r  pytreer   r   rQ  s                     r   EQUALS_MATCHzGuardBuilder.EQUALS_MATCH  s   ll5!hhuo						





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



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

|1 56u%EEu%"4/		
r   c           
        | j                  |      }| j                  |      }t        |      }g }t        |      }|j	                  d| d|        | j                  ||       t        |      }| j                  |d|j                   d      }|\  }}	}
| j                  |      j                  ||	|
|t        ||      |j                         y )Nz___normalize_range_iter(r,  r#  rU  )r  rb  r?  r   rx  r  rI  r  rn  add_range_iterator_match_guardr  r  )r   rN  r  r  rZ  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        |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   )r2   r  r]  r-   r[  additional_used_local_varsr   r,   additional_used_global_varsr  r  r1   re  r  rR   #use_lamba_guard_for_object_aliasingr  rf  rx  r!   rn  r  r  )
r   rN  source_br  ref_aref_br  r   r{  rz  s
             r   DUPLICATE_INPUTzGuardBuilder.DUPLICATE_INPUT	  s   $$$
&x0,X66t6%%@@DDTJ-h77t7%%AAEEdKU#X]]+#$$
%h/ en$555++//?++//?'eW%&##E4055 QI 6y% H K,,33Y@Q4RS)&&u-228<&tU3  	r   c                    | j                  |       dg}| j                  ||       | j                  |      j                  t	        ||      |j
                         y rK  )r  r  rn  rL  r  r  r   rN  r   s      r   WEAKREF_ALIVEzGuardBuilder.WEAKREF_ALIVE
  sV    <<&'|45##E40u%88"4/1A1A	
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)	r  rb  rx  r  r  r  rn  add_mapping_keys_guardr  r  s        r   MAPPING_KEYS_CHECKzGuardBuilder.MAPPING_KEYS_CHECK
  s}    ll5!eC5T%**,-?,@AB##E40u%<<4))	
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)) == )r  rb  r/  r  rL   SUPPORTED_NODESr/  r  rx  r  r   r  r  r  rz  rt  r  s        r   DICT_KEYS_MATCHzGuardBuilder.DICT_KEYS_MATCH!
  s    ll5!EKK''777e$U#
 	ocU&6G6N1O0RST##E40++E,D,DE--eU;44UEBr   c                H    t         j                  ry| j                  |       y)z\Special guard to skip guards on empty hooks. This is controlled by skip_nnmodule_hook_guardsN)rR   skip_nnmodule_hook_guardsr  r  s     r   EMPTY_NN_MODULE_HOOKS_DICTz'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICT:
  s    ++U#r   c                     y r   r  r  s     r   	GRAD_MODEzGuardBuilder.GRAD_MODEA
      r   c                     y r   r  r  s     r   DETERMINISTIC_ALGORITHMSz%GuardBuilder.DETERMINISTIC_ALGORITHMSD
  r  r   c                     y r   r  r  s     r   FSDP_TRAINING_STATEz GuardBuilder.FSDP_TRAINING_STATEG
  r  r   c                $   | j                   j                  }|J |j                  }|| j                   _        d| j                   j                  j	                          g}| j
                  j                  j                  |||j                         y )Nz ___check_global_state() against )	r[  r`  global_state_guardglobal_state__getstate__rW  r   add_global_state_guardr  )r   rN  r`  r  r   s        r   GLOBAL_STATEzGuardBuilder.GLOBAL_STATEJ
  s    ,,99'''#66-9* /t/D/D/Q/Q/^/^/`.ab
 	66$ 0 0	
r   c                   | j                   j                  J t        | j                   j                        | j                   _        | j                  j
                  j                  | j                   j                  dg|j                         y )Nz$___check_torch_function_mode_stack())r[  torch_function_mode_stack$make_torch_function_mode_stack_guard"torch_function_mode_stack_check_fnrW  r   #add_torch_function_mode_stack_guardr  r  s     r   TORCH_FUNCTION_STATEz!GuardBuilder.TORCH_FUNCTION_STATEX
  sy    $$>>JJJ0%%?? 	@
 	CC!!;;34	
r   c                F   |j                   t        j                  u sJ | j                  j                  J d| j                  j                  j
                  g}| j                  ||       | j                  |      j                  t        ||      |j                         y)z/Guard on CURRENT_DEVICE per torch.utils._deviceNzutils_device.CURRENT_DEVICE == )rY  r>   GLOBALr[  r`  current_devicer  rn  add_default_device_guardr  r  r  s      r   DEFAULT_DEVICEzGuardBuilder.DEFAULT_DEVICEe
  s    ||{11111$$11===-d.C.C.P.P._._-bc
 	##E40u%>>"4/1A1A	
r   c                   %&'( ddl m} |j                  dk(  sJ  j                  j                  ((J  j                  j
                  T j                  j
                  }|j                  }|j                  }|j                  |j                  }|j                  }ntt        (|      sJ (j                  J (j                  j                  xs g &&D cg c]  }|j                   c}'d(fd}	(j                  ri }
g }g }i }t               }(j                  D ]j  }|j                   (j"                  v r;t$        j&                  j(                  j+                  ||	(j                  |
||||       Vt,        j/                  d       l t1        ||t3        |j5                               |d      %nd %d%&'( fd}t6        j8                  r	  |d	      \  }}}d}nd
} |d      \  }}(j&                  s(j                  j=                           j>                  rstA               jC                  d      }|t        |tD              sJ |g n"t3        |jF                  jI                               }tK        |||||       j                  _        |jL                  D ]  } jO                  ||g        tQ        jR                         x}r%|jT                  jW                  |jL                         g }g }|ssJ |jL                  |jF                  }}|sy |jY                         D ]  \  }}t        |tZ              rd
} jC                  |i t\        t_                     }t        |t`              r|jc                  ||f       `t        |td              r|jc                  ||f       d
} |sdd l3}ddl4m5} sJ |jL                  |jF                  }}tm        ||z         }	 to        |      D cg c]   \  }} jq                  ts        ||            " }}}dju                  d to        |      D              } dju                  d to        |      D              }!| rd|  d} |!rd|! d}!tw        jx                  d|  d|! ddju                  |       d      }"tz        j}                  d|"|jL                         |j                  |"      }#|j                  |#j                  |j                        j                  }$|$sJ 	 t        |t        |      t        |      |$|#|jL                  |j                         y |jL                  r9 j                  |jL                  |jL                  i t\        t_                      y y c c}w # t:        $ r d
} |d      \  }}Y w xY wc c}}w # t$        j                  j                  j                  $ r Y w xY w)Nr   r   rh  c                z    j                   |    D cg c]  }t        |t        j                  |       c}S c c}w r   )tracked_fakes_id_to_sourcer5   r4   SIZE)t_idr  rY  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_inputsrJ  ignore_staticlangs)	shape_envproduce_guards_verbosefakerY  rJ  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_parts)python_code_partsr   r  python_fallbackshape_env_sources)r   )CppCodeCacherT  c              3  8   K   | ]  \  }\  }}| d | d  yw)z = int_values[r  Nr  r  irC  symbols       r   r  z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>)  s-      ,&;Av hnQCq1,   c              3  8   K   | ]  \  }\  }}| d | d  yw)z = float_values[r  Nr  r#  s       r   r  z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>-  s.      .&;Av h.qc3.r&  zint64_t ;zdouble a  
                #include <algorithm>
                #include <cstdint>
                #include <cmath>
                #include <c10/util/generic_math.h>

                #if defined(_MSC_VER)
                #  define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
                #else
                #  define EXTERN_DLL_EXPORT extern "C"
                #endif

                EXTERN_DLL_EXPORT int8_t guard(int64_t *int_values, double *float_values) {
                  z
                  z
                  return (z) && (z%);
                }
                zC++ shape guard function: %s %s)r	  r"  r  r"  r   list[Source])r  tuple[str, ...]r   zlist[_ShapeGuardsHelper])Ktorch._dynamo.output_graphr   r  r[  r`  shape_code_partsr  r   r  r  r   r  tracked_fakessymbolic_contextexport_constraintsr   r	  r  r/  r  dynamic_shapes_process_equalitiesr  r  rI   r  r$  rR    enable_cpp_symbolic_shape_guardsOverflowErrorfreezer]  localsrb  rG   source_to_symbolr  ShapeCodePartsexprsr  r8   try_getshape_env_guardsr#  r   r^   rK   r  r"  rx  r  ctypestorch._inductor.codecacher!  r"  rv  r  r.   r  textwrapdedentr  r  loadcastrN  c_void_pr  r#   r   r  	_inductorrT   InvalidCxxCompilerr  ))r   rN  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   r6  rY  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_ENVs
  sB   @zzR,,99'''  11=#44EE 0 B B!1!D!D..:!1!@!@.>>O l,=>>>))555''55;B:<=Qa00=N ..46<>  # 68/2u"."A"A SJ!,*Q*QQ33GG&'(22!(.++	 $QRS %7!-'9$()?)?)A$B$3#%! %)!  66 ((KL J%'9> ',O #'8G095!#5  &&&&--/ $*8<<0@#A '/:$&;4  
 (/ .??DDFG $
 6D"3#53 /"96D!!2 &++ 	7D''v6	7 -4466?6,,334F4L4LM!!#!!> $$//	 )J "2"8"8": /fn5&*O$(HH%L%L8I8K%L %- %M "-5,33VV4DE#M59.55vv6FG +//" >!!> $$//	 )J  $$8;Q$QR= &//?%@"!6 66}VQ7OP" "
 #')) ,*34H*I, # %)II .*34J*K. %!
 #(00A&CO$*12C1DA(F%#?? ## $$% &#==45 6(   5&,,
 $((2TZZAGGv
 -",-./&,,$$ 
 ""55!''"((DD0A0CD 6  #{ >B % &*O<K4=9%'9v"^ ??&&99 s=   VV (V+ 6%V%C)V+ V"!V"%V+ +'WWc                8   t         j                  r|j                         ry t        |      r| j	                  |       y t        |t              r |       }||n| j                  |      }t        |      }t        j                  j                  |      }t        |t        j                  j                        r0|j                  |j                  }|j                  |j                  }t        |t        j                         sJ t         j"                  rt        |t        j$                  j&                        rht)               }|j+                         rN|j-                  d|j/                                |j-                  d|j0                         |j-                  dd       | j3                  |      }g }| j4                  j6                  J | j4                  j6                  j8                  r| j;                  |       g d}|D ]  }	t=        |j>                  |	      }
|	dk(  rd}	tA        |
      }
| j                  |
      }tC        |t        jD                  t        jF                  f      r$|jI                  d| d	|	 d
tK        |             |jI                  | d	|	 d|         n| jM                  |      }t         jN                  r9tC        |t        j$                  j&                        setQ        |j>                        sPt        |j>                  tR              s6| jT                  jI                  |       | jV                  jI                  |       | j4                  j6                  }|jX                  |j>                     }t[        |d         }t[        |d         }t]        t_        ||||||      |      }|j`                  }|jc                  ||||||||       t        |t        j$                  j&                        s/| jd                  jf                  ji                  |jj                         |jl                  J to        |d|j>                        \  }}|stq        |d      r`|jr                  }d| d| d| d}|jI                  |       | jM                  |      ju                  |t]        ||      |j`                         nMd| d}|jI                  |       | jM                  |      jw                  dt]        ||      |j`                         ty        |dd       x}rVd| d|d| d}|jI                  |       | jM                  |      j{                  |fdt]        ||      |j`                         t}        |      dkD  r| j                  ||       y y )Nparam_numelparam_bytesparam_countrQ   )r  r  r  
ndimensionrV  zndimension()zstr(rE  r,  r!  sizestrideT)	is_tensortensor_source_dynamo_dynamic_indicesz((z"._dynamo_dynamic_indices.issubset(z)) if hasattr(z', '_dynamo_dynamic_indices') else True)r  z%, '_dynamo_dynamic_indices') == False_dynamo_shape_idsz
((getattr(z , '_dynamo_shape_ids', None) == z) if hasattr(z(, '_dynamo_unbacked_indices') else True)c                >    t        | d      rt        | dd       |k(  S dS )N_dynamo_unbacked_indicesr\  T)rj  r  )rp  expecteds     r   r  z+GuardBuilder.TENSOR_MATCH.<locals>.<lambda>3  s0    &q*DE $A':DAXM  "& r   r   )@rR   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler2  rE  r   rP   rb  r?  r/  r  _dispatch_keysr%  r&  r  r  r0  log_compilation_metricsr3  	Parameterr7   in_progress	incrementnumelnbytesr  r[  r`  r  r*  rW   r  rX   r   r  r  rx  r   rn  ,skip_no_tensor_aliasing_guards_on_parametersr3   ru   rY  rZ  input_source_to_sizes_stridesr  r  r  r  add_tensor_match_guardrW  r   r   r  rY  r   rj  r[  add_dynamic_indices_guardr  r  r  r   r  )r   rN  r  r  r  metrics_contexttensor_namer   termstermterm_src
real_valuerW  r`  metadatarW  rX  r   r  static_reasondynamic_indicesr{  	shape_idss                           r   TENSOR_MATCHzGuardBuilder.TENSOR_MATCHl  s#   11e6J6J6L "%(MM% %/".EDHHUOE%[F!HH33E:M%!2!2!=!=><<+"\\F&&2$)$7$7MeU\\222--*UEHHDVDV2W"5"7"..0#--mU[[]K#--mU\\J#--mQ?,,u-K, !D((55AAA$$1188& " 
MD)%*B*BDIH|+-#;H#E!%(!3Jj5<<*EFd;-qeC
OCV$WX{m1TF$zl$KL
M !% 6 6u = GGuehh&8&89I!44 %U%=%=?PQ 1188E::AA-P#44AA'EE,, 2(62BC3HX4FG%;.#% 
&" #--
44&!	 "%););<&&99==ejjI< <<+++<U5M5MOFG 5";<&+&C&CO"$[M1STcSddrs~r  @g  !hIKK	***51KK'.y%@(( #;-/TU  KK	***51FF1.y%@(( !(/BD II9I",[M9YZcYffst  tA  Ai  !jIKK	***51BB+4 
 /y%@(( 4y1}++E48 r   c                8   t               }|J |j                  }~|J |xs |j                  j                  }~|| j                  j
                  v s
J d|        |"|j                  }|sd n| j                  |      }	n|}	|	t        j                  t        |	            nd }
d }t        |	j                  dd      dk7  }|rDt        |	t        j                  t        t        j                   f      st        j                  |	      }|j#                  ||
||       y )NzH_produce_guard_code must be called from inside GuardedCode. Called from __weakrefoffset__r   )r   f_backrH  co_namer   rR  r  rb  rM  r  r?  r  r   enumEnumr=  
ProxyTypesset_export_info)r   rN  r5  r  rG  	cur_framecaller	func_namer  guarded_objectguarded_object_typeobj_refsupports_weakrefs                r   r  z#GuardBuilder._set_guard_export_infoA  s-    !N	$$$!!!!!&?&--*?*?	DNN333 	
VW`Vab	
3
 #*::D)-T488E?N4N 2@1KGKK^,-QU 	  N,,.A1EJ 	 JTYYw/A/AB%
 kk.1G		
r   )FNN)rH  types.CodeTyperI  zCallable[[object, str], int]rJ  zCallable[[Source], str]rK  z1Callable[[object], Optional[weakref.ref[object]]]ri  dict[str, object]r   r  rW  r   r[  CheckFunctionManagerr]  r   rP  r  r^  =Callable[[Sequence[GuardFilterEntry]], Sequence[bool]] | Noner   r   )r  dict[Any, Any]rN  r;   r   r   )r  r  rN  r;   r   r   )r  r   r   Optional[Any])rY  rW   r'  r   r(  r   r  r   r)  r   r  r   r   r  r   r   )rY  r?   r   r   )rY  r?   r  zHOptional[Union[KeysView[Any], set[Any], frozenset[Any], dict[Any, Any]]]r   r  )r  r  r   r   )r   r   )rY  r?   r   r   )rN  r;   r   r   r  )
r   r  r   r  r   r  r  r   r   r   r   )r  zGuard | Sourcer   Optional[dict[str, Any]]r   r   )rN  zUnion[str, Guard]r   r   )rN  r;   r  r   r  z(Callable[[GuardBuilderBase, Guard], Any]r   r   )rN  r;   r   r   )rN  r;   r  r  r   r   )rN  r;   r  r   r2  r   r   r   )rN  r;   r  r   r2  r   r   r   )rN  r;   r  r  r   r   )rN  r;   r  r  r   r   )rN  r;   r  r?   r   r   )NN)
rN  r;   r5  r  r  r  rG  r  r   r   )>r   r   r   r   rt  rz  r8  r  r  r  rp  r  r  r  rn  r  rb  r  r  r  r!  r*  r/  r5  r:  r?  rB  rE  rD  rM  rP  rT  ra  rn  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rQ  rx  r  r  r   r   r<  r<    sc    "<@NFNF -NF ,	NF
 KNF 'NF (NF +NF /NF NF :NFNF 
NF`+49	<'R  "YY )Y  	Y
 Y Y Y -Y 
Yv9""
" 
",?
\|L 59 YY &Y 2	Y
 Y 
YP 26' / 
	&   ;	
 
":0z 3700"/0	08
4
0"0&"

> =A%?%?,9%?	%?N	




&
8
0

0m^	%($
''	'.<
&
0,\


C2$


wrR9r 26,01
1
 1
 "/	1

 *1
 
1
r   r<  c                      e Zd ZdZej
                  ej                  ej                  fZe	j                   G d d             Z G d dej                        Z G d dej                        ZddZddd	Zdd
ZddZy)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_nameNr6  r  r   r   Configr    s    ""$$r   r  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   r  ALLOWED_NODE_TYPESr  r  r  r   r   )r   r   r   s     r   r   zPyExprCSEPass.ExprCounter.visit  s>    $ @ @A''T(:;q@;GM$r   )rR   r  r   r   )r   ast.ASTr   r   r   r   r   r   r   r   r   s   @r   ExprCounterr    s    	"	  	 r   r  c                  8     e Zd Z	 	 	 	 	 	 d fdZd fdZ xZS )PyExprCSEPass.Replacerc                L    t         |           || _        || _        g | _        y r   )r   r   r  	_gen_namepreface)r   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   r  r  r  r  r  USE_THRESHOLDr  r   r   r  r  rx  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   r  r  zCallable[[], str]r   r   )r   r  r   r   r  r   s   @r   Replacerr    s.    	)(	) (	) 		)	' 	'r   r  c                j    d| _         | j                  t        j                  d       i       | _        y )Nr   c                      yr   r  r  r   r   r  z(PyExprCSEPass.__init__.<locals>.<lambda>  s    r   )r  r  )_counterr  r  defaultdictr  r   s    r   r   zPyExprCSEPass.__init__  s.    {{"..y9 # 
r   c                P    | | j                    }| xj                   dz  c_         |S r   )r  )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  r  r   r  parseSyntaxErrorr  	exceptionlineno)r   r8  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   )r  r  r  r   r  r  r  r  )r   r  replacernew_nodes       r   r  zPyExprCSEPass.replace  sF    ==t}}=>>#))D/2h!777r   Nr  )_var)r   r   r   r   )r8  r  r   r   r  r   r   ztuple[list[str], str])r   r   r   r  r  	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr  NodeTransformerr  r   r  r  r  r  r   r   r  r    sx     M --3==A% % % coo  #'3&& #'J

8r   r  c                    t        | j                  t              xs. t        j                  xr | j
                  t        j                  u S r   )r   r  rb   rR    guard_nn_modules_using_dict_tags	create_fnr<  r  )rN  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
)r7  rH   r  r   zOptional[_CppShapeGuardsHelper]r  r   r  r)  r   Nr6  r  r   r   r7  r7    s     ))**33##r   r7  c                  "    e Zd ZU ded<   ded<   y)GuardsStater   r`  Optional[ShapeCodeParts]r,  Nr6  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   ru  )r   r  s     r   r   z_Missing.__init__  s	    r   c                "    d| j                    dS Nz	_Missing(rU  r  r   s    r   __repr__z_Missing.__repr__      4<<.**r   c                "    d| j                    dS r  r  r   s    r   rl  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  rl  r  r  r   r   r  r    s    ++
r   r  c                     t         j                  j                  t        j                  f} 	 | t         j                  j
                  j                  fz  } | S # t        $ r Y | S w xY wr   )r/  r  r  rM  r   _distributed_c10dProcessGroupAttributeError)r  s    r   _get_unsupported_typesr    sa     	C**7799 J  Js   (A 	A#"A#c                      e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 d fdZedd       Ze	 	 	 	 	 	 	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zedd       Zedd       Z	e	 	 	 	 dd       Z
e	 	 	 	 dd       Zedd	       Ze	 	 	 	 dd
       Ze	 	 	 	 dd       Zed d       Zed!d       Zed"d       Zed#d       Zed$d       Ze	 	 	 	 	 	 d%d       Zed&d       Ze	 	 	 	 	 	 	 	 	 	 	 	 d'd       Z	 	 	 	 d(dZ xZS ))GuardsStatePicklerc                    t        |   |i | t        j                  j	                         | _        t        j                  j                  j                         | _        || _	        || _
        || _        y r   )r   r   r/  r%  FakeTensorMode	fake_modefake_tensorFakeTensorConvertertensor_converterr\  empty_valuesmissing_values)r   r\  r  r  r   r  r   s         r   r   zGuardsStatePickler.__init__   sb     	$)&)**99; % 1 1 = = Q Q S!2(,r   c                d    t         j                  j                         }|j                  |       |S r   )r/  r3  r4  __setstate__)rr  statemods      r   _unpickle_modulez#GuardsStatePickler._unpickle_module/  s%    hhoo
r   c           	        t         j                  j                         }t         j                  j                  j	                         }|j                  ||||t         j                  j                  j                  |            }||_	        |S r   )
r/  r%  r  r  r  from_meta_and_devicer  r   from_raw_reprgrad)	rr  meta_tensorr  r  dispatch_keys_rawr  r  r  r  s	            r   _unpickle_tensorz#GuardsStatePickler._unpickle_tensor5  sv     %%446	 ,,88LLN33HH##112CD
 
r   c                   i }|D ]  \  }}	}
 |	|
 ||<    |j                   |j                         }}t        |      j                  ||||      }||_        t
        j                  j                  j                  |      |_	        |S r   )
shaperX  r?  __tensor_unflatten__r  r/  r  r   r  r  )rr  r  r  r  r  ctx
inner_datainner_tensorsr  unpickle_funcunpickle_func_args
outer_sizeouter_strider  s                 r   $_unpickle_traceable_wrapper_subclassz7GuardsStatePickler._unpickle_traceable_wrapper_subclassJ  s     7A 	E3D-!3"/1C"DM$	E $/#4#4k6H6H6JL
;443
L
 
!HH33AABST
r   c                ,    t        j                  |      S r   )r  r  )rr  aliass     r   _unpickle_python_modulez*GuardsStatePickler._unpickle_python_modulea  s    &&u--r   c                T    t         j                  j                  j                  |      S r   )r/  r  r   r  )rr  raw_reprs     r   _unpickle_dispatch_key_setz-GuardsStatePickler._unpickle_dispatch_key_sete  s    xx&&44X>>r   c                h    t         j                  j                  j                  j	                  |      S r   )r/  r  r\  CInterpreterdeserialize)rr  jsons     r   _unpickle_functorch_interpreterz2GuardsStatePickler._unpickle_functorch_interpreteri  s%     xx""//;;DAAr   c                ,    t        j                  |      S r   )r5  MappingProxyType)rr  ds     r   _unpickle_mapping_proxyz*GuardsStatePickler._unpickle_mapping_proxyo  s     %%a((r   c                H    t         j                  |      j                         S r   )r"  fromkeysr  )rr  elemss     r   _unpickle_dict_keysz&GuardsStatePickler._unpickle_dict_keysu  s    }}U#((**r   c                    t         j                  j                  j                  j                  j	                         |   S r   )r/  r  fsdp_fully_shardget_cls_to_fsdp_cls)rr  original_types     r   _unpickle_fsdp_module_typez-GuardsStatePickler._unpickle_fsdp_module_typey  s5       %%22??SSU
 	
r   c                    t         j                  j                  j                  }|j	                  |      }t         j                  j
                  j                  ||       |S r   )r/  r3  parallelDistributedDataParallel__new__r4  r  )rr  r  tyddps       r   _unpickle_ddp_modulez'GuardsStatePickler._unpickle_ddp_module  sC     XX66jjn$$S%0
r   c                J    t        t        j                  j                  |      S r   )r  r/  opsr  )rr  r  s     r   _unpickle_c_opz!GuardsStatePickler._unpickle_c_op  s    uyy||T**r   c                ^    t        t        t        t        j                  |      |      |      S r   )r  r/  r)  )rr  	namespaceopnameoverloadnames       r   _unpickle_opzGuardsStatePickler._unpickle_op  s!    wwuyy)<fE|TTr   c                .    t        j                  ||      S r   )r5  r7  )rr  funcr  s      r   _unpickle_bound_methodz)GuardsStatePickler._unpickle_bound_method  s    d++r   c                ^    t        t        j                  j                  j                  |       S r   )r  r/  r3  	attention
SDPBackendr  s    r   _unpickle_sdp_backendz(GuardsStatePickler._unpickle_sdp_backend  s!     uxx))44d;;r   c                J    dfd}|j                   J |j                   d   S )Nc                      S r   r  )r  s   r   rC  z,GuardsStatePickler._unpickle_cell.<locals>._  s    Jr   r   )r   r   )r   )rr  r  rC  s    ` r   _unpickle_cellz!GuardsStatePickler._unpickle_cell  s)    	 }}(((}}Qr   c                .    t        j                  ||      S r   )r  
namedtuple)rr  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)rr  serialized_coder   s      r   _unpickle_codez!GuardsStatePickler._unpickle_code  s    8,~,,_==r   c                r    t        j                  |      j                  }t        j                  |||||      S r   )r  r  rR  r5  r6  )rr  r   r  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 ]h  }t+        ||      }	t        |	t        j                        r|	| j&                  t        |	      <   | j-                  |	      \  }
}|j/                  ||
|f       j t        |       j0                  t        j2                  |d      |j                   t        |      t        j4                  j7                  |      j9                         ||ffS t        |      }t        |t        j:                  j<                        r(|j>                  |j>                  nt        j                  }t        |       j@                  t        j2                  |d|jB                        |j                   |t        j4                  j7                  |      j9                         |jD                  ffS t        |t        jF                  jH                        rt        |      | j&                  vrt        d	fS |jJ                  jM                         D ]s  }t        |t        j                  t        jF                  jH                  f      r8t        |      | j&                  v rPtO        |      r\|| j                  t        |      <   u t        |t        jF                  jP                  jR                        r&t        |       jT                  |jW                         ffS t        |      jX                  t        |      jZ                  k(  rt\        S |j^                  jV                  t        jF                  jH                  jV                  k(  rXt        |       j`                  |jW                         ffS t        jb                  |      r"t        |       jd                  |jZ                  ffS t        |t        j4                  jf                        r&t        |       jh                  |j9                         ffS t        |t        j4                  jj                  jl                        r&t        |       jn                  |jq                         ffS t        jr                  |      rItu        ||jv                        r3ty        |d
      r'ty        |d      sJ |jz                  |j|                  ffS t        jr                  |      rbtu        |t~              rRty        |d      rF|jX                  |jZ                  k7  r-t        |       j                  |jZ                  |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        j                  j                  j                        r!t        |       j                  t        |      ffS t        |t        j                  j                        r=|j                  j                  d      r"t        |       j                  |jZ                  ffS t        |t        j                  j                        r8t        |       j                  |j                  |j                  |j                  ffS |j^                  j                  dk(  r!|j^                  jZ                  dk(  rt        dfS t        |t                     rt        dfS t        j                  |      rd|jX                  v rNt        |       j                  |j                  |j                  |jX                  |j                  |j                  ffS |j                  t        j                  v r"t        j                  |j                     }|jX                  j                  d      D ]  }t+        ||d       } ||urt        dfS t        j                  |      rl|j                  }
|j                  }t+        ||
jZ                        }t        j                  |      r|j                  }|
|urdt        |       j                  |
|ffS t        |t         d d      j                  d               r"t        |       j                  |j                  ffS ty        t        j                  d      rMt        |t        j                  j                  j                        rt        |      | j&                  vrt        dfS t        |t        jF                  j                  j                        r"t        |       j                  |j                  ffS t        |      jX                  t        |      jZ                  k7  rOt        |t~              s?t        j                  j                  j                  dt        |       d| ddz   dz         t        jr                  |      rty        t        j                  d       rtu        |t        j                  j                  j                  j                        r|t        j                  j                  j                  j                  ur|j                  d!   }tu        |t        jF                  jH                        sJ |t        j                  j                  j                  j                  j                         v sJ t        |       j                  |ffS t\        S )"Nr   r   )zmissing valuesmeta)is_traceable_wrapper_subclass)ztensor guard tree)r  )r  r  )zmodule guard tree_torch_handler_name_torch_unpicklerr  zCannot serialize SymInt z (node: rU  z_C::rQ  	PyCapsule)capsule)unsupportedz<locals>rE  )zfqn mismatchc                      fdS )Nc                      S r   r  r  s   r   r  zGGuardsStatePickler.reducer_override.<locals>.<lambda>.<locals>.<lambda>a  s    Q r   r  r  s   `r   r  z5GuardsStatePickler.reducer_override.<locals>.<lambda>a  s    Y r   distributed_c10d)zdistributed_c10d.Workr
  r  r  r  r  r  r8  )wsympyrc  r  r?  r$  r  iscoder@  r   rC  from_code_objectr  r  r   r/  r0  r  torch.utils._python_dispatchrK  r\  r  r  reducer_overriderx  r  
empty_liker  rb  r  r%  r&  r  r  r  r  r3  r4  rR  r$  r  r"  r#  r'  r  r   r   NotImplementedr   r  r  r
  r   r  r\  r  r  	serializer  r   Functionrj  rM  rL  r=  r>  r  r  r  r   r5  r  r  rS  r  r  r   r  r  _opsOpOverloadPacket_qualified_op_name
startswithr*  
OpOverloadr/  r,  _opname_overloadnamer   r  
isfunctionrH  r   r   r   r  modulesrv  ismethodr   __self__r2  r:  r,  r  rS  Workr4  r5  r7  r  rT   PackageErrorr  r  
FSDPModuler   r  r   )r   r  rT  r   rK  r  attrsr   r  innerr1  
args_tupler  fr  method_self
inner_funcr  s                     r   rX  z#GuardsStatePickler.reducer_override  sd	    	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! @D#C.E!%6<A..r%y9'+'<'<U'C$D*%%tT:&>?@ DzFF$$S8JJIHH++C099;I   #YF#u00;;<'*zz'=5<<:..  V3CTCTU

'',5571   UXX__-#wd444!777++- 5dU\\588??$CDd8t555D>04##BtH-5 #uxx00HHIDz669I9I9K8MMMCy%%c););;%%}}))UXX__-I-IIDz22S5E5E5G4IIIc":55FFUXX445:883<<>:KKKUXX00==>:==?QQQ OOC 3/233 2333''#*A*A)CCC OOC 3&Y'  CLL0:883<<:UUUU\\*!9#hsxxjPQRSSU334:55
}DDU]]00::;:11DI<??,,
$$//7:,,s||o==UZZ223:**!!-   MM$$
2&&+5 \))356---$S---Dz;;LLNN$$$$OO>   ~~,KK/,,2237 /D4.A/C<#%666c"<<D,,K dmm<J
+'00
:%Dz884:MMMT#6":"F"Fq"IJK:,,s/@/@.BBB5$$&89j""3388?
 #wd444!;;;c588--889:33chh[@@9!!T#Y%7%77
3PU@V--##00S	{,se3DETUTU  OOC ))623 1 1 6 6 C C N NO%++00==HHH #A!-AAA!((--::GG[[]^^ Dz<<}>NNNr   )r\  dict[int, Any]r  rq  r  rq  r   r   r  r   r   r   )r  r   r   ztorch.nn.Module)r  torch.Tensorr  torch.devicer  r?  r  r"  r  rr  r   rr  )r  rr  r  rs  r  r?  r  r"  r   r   r  z5list[tuple[str, Callable[..., Any], tuple[Any, ...]]]r   rr  )r	  r   r   ztypes.ModuleType)r  r"  r   ztorch._C.DispatchKeySet)r  bytesr   z torch._C._functorch.CInterpreter)r  r  r   z types.MappingProxyType[Any, Any])r  	list[Any]r   r   )r  type[torch.nn.Module]r   rv  )r  zdict[str, Any]r   z)torch.nn.parallel.DistributedDataParallel)r  r   r   r   )r,  r   r-  r   r.  r   r   r   )r1  r   r  r   r   r   )r  r   r   ztorch.nn.attention.SDPBackend)r  r   r   r   )r  r   r=  r*  r   ztype[NamedTuple])rB  r   r   r  )r   r  r  r   rE  r   rF  ztuple[object, ...] | NonerG  z!tuple[types.CellType, ...] | Noner   ztypes.FunctionType)r  r   r   z6Union[tuple[Callable[..., Any], tuple[Any, ...]], Any])r   r   r   r   r9  r  r  r  r
  r  r  r  r  r   r'  r*  r/  r2  r8  r7  r:  r>  rC  rH  rX  r   r   s   @r   r  r    s   -)- %- '	-
 - - 
-  
 !  	
   
 ( !  	
   J 
 , . . ? ? BB	)B B
 ))	)) )
 + + 
1
	
 
 "	2  + + U U , , < <     44 /4	4 4 > >
 	O	O 	O 		O
 +	O 3	O 
	O 	OEE	?E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)Nrh  FTr  )r  	has_valuer  
guard_typederived_guard_types	is_global
orig_guard)
objectstrip_local_scoper  rb  r,   r  r   create_fn_nameguard_typesr=  )rN  builderMISSINGr  rx  r  r{  s          r   make_guard_filter_entryr    s    hGUZZ(Drz			
 KK&EI 'u'?'?@LI'')9>9J9JU5#4#45PR 		EIs   B Bc                   t        j                         }i }i }|j                  }t        j                  | j
                  j                        }|D ]  }t        j                  |      rYt        |d      rM|j                  }t        |      |vs>	 t        |      j                  t        |             ||t        |      <   qt        |      |vs||t        |      <    t        ||||      }	t        t         j"                  j%                  | j
                  j&                  D 
cg c]  }
t)        |
|       c}
            r*t+               | j
                  _        i | j
                  _        	 |	j1                  |        |j=                         S #  Y BxY wc c}
w # t2        $ r8}t         j4                  j6                  j9                  t;        |            |d }~ww xY w)Nrg  )ioBytesIOr\  r  tree_leavesr`  ri  r  rf  rj  rg  rc  r?  r$  r  r  r/  compilerkeep_portable_guards_unsafer   r  r   ra  r   dumpr  r  rT   ri  r   rk  )r  r  bufr  r  r\  leavesleafr  picklerrN  r  s               r   pickle_guards_stater    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)r  Nc
           	         |r|j                   nd }
i  _        t        |      }| _         j                  J | _        |r|j
                  nd  _        t                _        t                _        t                _	        | _
        d  _        d  _        t        d      st        j                  d       t         j"                  j$                  j&                  r|xs d dfd}t)        |
xs dt*        j,                        }|r j/                  ||||d      \  }} ||D cg c]  }t1        ||       c}      }t3        |      t3        |      k(  sJ t5        d |D              sJ t7        |      D cg c]  \  }}||   s| }}} j/                  ||||||	      \  }}| _         j;                  |||       |j<                   j8                  _        t>        jA                  d
 j8                         |j<                   j8                  _        d|jB                  s|jD                  s j8                  jG                  |jH                        sCtK         j8                  |jH                  tM        jN                         d       }tQ        d|       tR        !tS         j8                  |jH                  |       tU         j8                  jV                  |jH                  d      t>        jA                  dd       tY        jZ                  dt]                     d  _/        |rAddl0m1} te         j                  |      sJ 	  jg                  || j                         _/        t         jx                  j{                  d fd        j                  j}                          d  _        y c c}w c c}}w # th        jj                  $ r|}t         j"                  j$                  jl                  s|	r| j                  jo                  dtq        |       ts        jt                         jw                  d             Y d }~d }~ww xY w)NrG  z9guard_nn_modules is turned off using justknobs killswitchc                ,    | D cg c]  }d c}S c c}w r  r  )gsgs     r   r  z/CheckFunctionManager.__init__.<locals>.<lambda>  s    R>Pt>P >Ps   	c                l   g }t         |       |       D ]  \  }}|s|j                  d       |j                  dv sd|j                  v sd|j                  v rGt        j                  d|j                  |j                  j                         |j                  d       |j                  d        |S )NF)rE  r  r  r/  rE  r/  z7%s guard on %s is dropped with caching_precompile=True.T)r  rx  ry  rz  r  r  r|  r  )r   r  keepr  _guard_filter_fns       r   r^  z6CheckFunctionManager.__init__.<locals>.guard_filter_fn   s    "#3F#;VD )GD!

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

5)

4(+), 
r   r  )r  Fc              3  >   K   | ]  }t        |      t        u   y wr   )r?  r   )r  rp  s     r   r  z0CheckFunctionManager.__init__.<locals>.<genexpr>+  s     ?1tAw$?s   )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  zGuard evaluation failed: r  )	tracebackdynamo_cpp_guards_strc                 *    j                    d ddS )Nz
Guard latency = r  z us)rW  )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])?r   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesr`  r,  r  rM   r  r  r  rP  r  r  rF   r  r  r/  r  rR   caching_precompiler   r;   sort_keybuild_guardsr  r   r  rv  rW  compile_check_fnr   r  r  skip_guards_checkr  rn  ri  get_guard_fail_reason_helperr8   rx  r  r   r%   r   r6   increment_toplevelr"  guards_stater+  r   r   serialize_guardsrT   ri  strict_precompilebypass_packager   r  
format_excrv  _loggingtrace_structuredclear)r   rH  r`  r   r   r^  r,  rP  r]  strict_errorr   existing_diff_guard_sourcessorted_guardsr  rW  rN  filter_resultsr$  reasonsr   r  r  r  s   `                    @@r   r   zCheckFunctionManager.__init__  s    )5$$$;= B+N 	$ :F  ,,, !1
 7CL22 	& 3=,;E<'<FL($8!PTPT/BCKKST ==22.Q3P4 v|@ &*%6%6+&"G] -FSTU(8TN ~&#m*<<<<?????&/&>"!U.QRBSM 
 "&!2!2'+ "3 "
 +g}mD .5-D-D*t112-4-D-D* --l6I6I%%++L,D,DE6&& ,,"557 	 %**14 
 -8-&&(@(@' ,""'')A)A1G 9gc]L 112Dc'lS-1Dd//1BCCC
$($9$9]D,=,=%! 	''#X 	( 	
 	 ] Uh ## ==''99\G!!00/Ax8'224::4@ 1  s+   )N9>N>N>"O QA2QQ)r/  r  rE  r  r  r  r  r  ztuple[LiteralString, ...]%UNSUPPORTED_SERIALIZATION_GUARD_TYPESc                   |D ]  }|j                         }|j                  rt        |j                        nd}|dv r*|j                  sG|j	                  |      }t        |       d|t        j                  v r,t        j                  j                  j                  | d      t        d |D        d       x}st        j                  j                  j                  | d       |j                  xs dt               t               dfd}	|j                         }
|D ]`  }t!        |j"                  t$              r2| j&                  sJ | j&                  j(                  D ]
  } |	|        O |	|j"                         b |j*                  D ]
  } |	|        dd|
j,                  j/                         D ci c]  \  }}|v s|| j0                  v r|| }}}|
j,                     j/                         D ci c]  \  }}|| j2                  v r|| c}}|<   t5        j6                  |
|
j8                  j/                         D ci c]  \  }}|v s|| j:                  v r|| c}}|t        j<                  j?                  tA        fd|D                    tC        jD                  tF        |
jH                        d	
      }
tK        |
| j&                        }tM        ||      S c c}}w c c}}w c c}}w )Nr  )r*  r  z guard cannot be serialized.c              3  D   K   | ]  }|t         j                  v r|  y wr   )r  r  )r  r$  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>  s'      0VVV s    rh  c                    t        |       x}r*t        |t              sJ |k7  rj                  |       y y t	        |       x}r$t        |t              sJ j                  |       y y r   )r,   r   r   r   r-   )rY  r  builtins_dict_nameused_global_varsused_local_varss     r   prune_variablez=CheckFunctionManager.serialize_guards.<locals>.prune_variable  st    -f55t5!$,,, --$((. ..v666!$,,,##D) 7r   c                8   t        | t        j                        rxddt        fd| j                  D              }| j
                  j                         D ci c]  \  }}| |       }}}t        j                  | j                  g|i |S | S c c}}w )Nc                T    t        | t        t        j                  f      r |        S | S r   )r   rP   rM  r  r  s    r   _refzPCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>._ref  s!    !!mW[[%AB s
Hr   c              3  .   K   | ]  } |        y wr   r  )r  r  r  s     r   r  zUCheckFunctionManager.serialize_guards.<locals>.normalize_create_fn.<locals>.<genexpr>  s      9Qa 9s   )rp  r   r   r   )r   	functoolspartialr=  r   keywordsr   r1  )rp  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  rN  r  s     r   r  z8CheckFunctionManager.serialize_guards.<locals>.<genexpr>  s@         ''$(.2"5eoo"F	 s   36T)ri  r   _guardsrj  r  )r`  r,  )rY  r?   r   r   )rp  Callable[..., None]r   r  )'r  r  r=  r'  rb  r  r  r  r/  r  rT   ri  next%name_of_builtins_dict_key_in_fglobalsr   dump_guards_stater   r  rx   r,  r   ra  r   r   r  r  r  r  ri  r  r  	GuardsSetrM   r  tree_mapr  rj  r  r  )r   r  r  r`  rN  ry  rz  r  failedr  output_graph_guards_staterY  r  r  global_scope_stater  r  r  r  r  s                   @@@@r   r  z%CheckFunctionManager.serialize_guards  s*    # 	E--/J>C>O>O%(9(9":UW <<((!++e,C*3/2XXXmm''44!l">?   0
    mm''44h:; 3	: *OOUSU5%
	* %1$B$B$D!" 	9E%22NC,,,,"33EE +F"6*+ u778	9 #55 	#F6"	#	  2>>DDF
1$$T-M-M(M qD
 
 2>>"eg2
 1 D*** qD2
-. %0$7$7% 6AAGGIAq'10O0O+O 1
 ,MM++  "/ 
 +1//.)GG+ #/%
!2 #2!22

 #<99W

2
s   K8	K>Lc                   t               }||_        d dfd}t        || j                  || j                  |j
                  |j                  || || j                  |      }	d	d}
t        j                  |	|
      t        j                  xr t        d      }|D ]`  }|sK|j                         r;d|j                  vr-d|j                  vrt        j                  sd|j                  vrP|j!                  |	       b |	|fS )
Nc                    | j                   }|t        j                  u r| j                  S sJ         }|J |j	                  | j                        S r   )guard_sourcer>   CONSTANTr  r  )rY  r  	r_builder	w_builders      r   rJ  z5CheckFunctionManager.build_guards.<locals>.source_ref.  sV    !..L{333{{"9!I((($$V[[11r   )rP  r^  c                &     |        }|rd |_         y y r   )rL  )weak_br  s     r   cleanup_builderz:CheckFunctionManager.build_guards.<locals>.cleanup_builderG  s    A r   rG  r   r   re  )rY  r?   r   r   )r  zweakref.ref[GuardBuilder]r   r   )r   r   r<  rI  rK  ri  r   rP  rM  r  rR   rg  rF   r0  r  r  r  )r   r  r  rH  r`  r]  r^  rW  rJ  r  r  guard_on_nn_modulesrN  r  s                @r   r  z!CheckFunctionManager.build_guards  s    ,-+F(		2 KK  $$%%!%!:!:+
	 KK9	$55 
//;
 # 	"E'224 #%**4$EJJ655

9RLL!	" %%r   c                >	   |j                   }|dgz  }t        j                  d       g g g | j                  j                  j                  t        t        j                                      d | _	        	 d	 	 	 	 	 	 	 dfd}t               }|j                  D ]=  }|j                  D ],  }||vs |||j                  d       |j                  |       . ? |j                  }	d }
d }t!        |	      dkD  r.t#        |j$                  |	ddj'                  |	      z   dz   gd        t(        j*                  rA|j,                  r5t/        t0        t3        |j,                         \  }}|j5                  ||       | j6                  r| j6                  j8                  ng }|D ]N  }t;        |t<              rk|j>                  }|j@                  }|jB                   d	|jB                   }tE        |jG                  |      |jG                  |      |gd         ||d d       t;        |tH              r|jJ                  D cg c]  }|jG                  |       }}|jL                  D cg c]  }|jG                  |       }}d
dj'                  d |jJ                  D               ddj'                  d |jL                  D               d}tO        |||gd         ||d d       CtQ        d|        |jR                  D ]'  }|j                  D ]  } |||j                  d        ) r$tT        jV                  jY                  dfd       tZ        j\                  t[        j^                         j`                  }ntc        | jd                  dd       }|
||| jf                  dth        tk               }| j                  jm                          d|jn                  d   i}t!              dk(  sJ || j                  _8        || j                  _9        | j                  ju                          | j                  _;        || j                  _<        || j                  _=        d | j                  _>        d | j                  _?        |	| j                  _@        y c c}w c c}w )Nz**___kwargs_ignoredzGUARDS:c                $    t               }t        j                  d|       j                   fd       t        j                  t        j                        rd}d}pj                  r,ddj                  j                  j                                }j                  r,ddj                  j                  j                                }t        j                  d ||       |s#j                          j                  |       y y )Nr  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{  rN  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   rh  z
Stack:
z
User stack:
zGuard: %s%s%s)r  r  r  rx  verbose_guards_logisEnabledForloggingDEBUGr  r  formatr  )	r{  rN  log_onlyrz  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(rT  rU  r  zcheck_overlapping(overlapping=[c              3  4   K   | ]  }|j                     y wr   r6  r  r[  s     r   r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>  s     /Z1/Z   z], non_overlapping=[c              3  4   K   | ]  }|j                     y wr   r6  r  s     r   r  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>  s     3bqAFF3br  z])zUnknown GuardEnvExpr: dynamo_guardsc                 8    D  cg c]	  }  |         c} S c c} w r   r  )rn  r  s    r   r  z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>  s    BV4WQQS4W 4Ws   r  rn  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr@  r   r   )r{  r   rN  Optional[Guard]r  r   r   r   )ArW  r  r  rW  r   attach_compile_idr   r8   rx  r  r   r   r5  rN  r   rY  r   r    rZ  r  rR   r  rf  rd  r  r  r  r`  aotautograd_guardsr   r:   input_source_ainput_source_br  r!   r  r@   overlapping_sourcesnon_overlapping_sourcesr"   r  rX  r/  r  r  rS   initial_global_stateGlobalStateGuardrn  r  r  r  rK   r  r  rL  r   r   r  r   r   r   r   r   r   )r   r  
guards_outr   largsr  seengclr   rY  check_tensors_fncheck_tensors_verbose_fnaliasing_code_partsaliasing_verbose_code_partsr  rN  source_ar  r{  r[  overlapping_guard_managersnon_overlapping_guard_managerscheck_global_stater   r  r   r  r   s                            @@@r   r  z%CheckFunctionManager.compile_check_fnb  s      '((# 
CE 	111134	

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

 
  !
 	##% #W]]3%78 :!###*6'"'<<>0B-*>'+8( *.&)-&8P5K.2s   ?R'Rc                T   t        | d      rt        | j                  t              s| j                  j                  x}h| j                  j
                  x}Ot        |t              sJ t        |t              sJ d| d}t        |      }|j                  ||       || _        y y y y y )NrW  zCache line invalidated because z got deallocated)	rj  r   rW  r  r   r   r   r   
invalidate)r   obj_strr   r   r  deleted_guard_managers         r   r  zCheckFunctionManager.invalidate,  s    
 D/*t113MN $ 2 2 > >>K $ 2 2 > >>Kk:666k:6666wi?OPF$>v$F!"";0EF!6D L L O +r   c                :   	 t        |      | j                  vr`t        j                  |      | j                  t        |      <   t        j                  |t        j                  | j                  |             t        |      S # t        $ r Y t        |      S w xY w)zadd a weakref, return the id)r  )	rc  r  rM  r  r  r  r  r  r  )r   r  r  s      r   rI  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)rc  r  )r   r  s     r   rK  z$CheckFunctionManager.lookup_weakrefsN  s(    c7dnn$>>"S'**r   )NNNNNFF)rH  r  r`  r   r   Optional[CacheEntry]r   %Optional[Callable[[GuardFail], None]]r^  r  r,  r  rP  r  r]  r   r  r   r   r   )r  r<  r  list[Guard]r`  r   r   rt  r   )r  r  r  r  rH  r  r`  r   r]  r   r^  r  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Optional[weakref.ref[object]])r   r   r   r   r  r   r  r  r  r  rI  rK  r  r   r   r  r    sj   
 -1?C599=!"B!B! (B! *	B!
 =B!B! 3B! 7B! B! B! 
B!H	H)+D 	z:z: #z: (	z:
 
z:H A&"A& &5A& 	A&
 -A& A&A& 
2A&FHQHQ  HQ =	HQ
 
HQT7&r   r  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   rA   c                &    j                  |       S r   )r  )r  csepasss    r   r  z%build_guard_function.<locals>.replace\  s    ??4((r   c                
    g | fS r   r  )r  s    r   r  z%build_guard_function.<locals>.replaceb  s    t8Or   zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr  )
torch._inductor.utilsrB   r  r  RecursionErrorre  r   r^  splicerk  )
r   closure_argsrB   r  
guard_bodyr  r  rN  make_guard_fnr  s
            @r   r  r  U  s   4oG
j!	)  !J 1g&xvR01  	1  0	1 	1	1 E	OOO$	 'Z &' #$M3L>DE				 0U#/0  -"8"8":::?  		1 	1' '0 0s5   E 7E1;#E>#F
E.-E.1E;	>F
Fc                 h    t         j                  j                  j                  j	                  d      S )Nr   r/  r  	_internal	log_stateis_artifact_enabledr  r   r   is_recompiles_enabledr)    s#    >>##--AA,OOr   c                 h    t         j                  j                  j                  j	                  d      S )Nr   r%  r  r   r   is_recompiles_verbose_enabledr+    s$    >>##--AABVWWr   c                P    | D cg c]  }t        |       c}dfd}|S c c}w )Nc                     t               } t        |       t              k7  ryt        |       D ]  \  }}|t        |      us y yr/  )r   r   r  r?  )	cur_stackr%  moder5  s      r   check_torch_function_mode_stackzMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stack  sL    13	y>SZ'E9- 	HBd#	 r   r   r   )r?  )initial_stackrp  r0  r5  s      @r   r  r    s+     ,,T!W,E
 +* -s   #Scopec                |   | j                   J t        | j                         }t        j                  t              }| j
                  D ]1  }||d<   t        t        |||            }||   j                  |       3 |D cg c]  }t        ||         dkD  s||     }}dj                  |      }d| gS c c}w )N__compile_source__rQ   rT  zDuplicate tensors found: )r   r"  r  r  r  r   rc  evalrx  r   r  )	rW  rL  r   ids_to_sourcerZ  	tensor_idr  duplicate_tensorsr  s	            r   1recompilation_reason_for_no_tensor_aliasing_guardr:    s     %%111223L++D1M&AA 7-:)*tM<?@	i ''67 ,9$'Cc@R<SVW<W=
  YY()F'x011s   B9B9c                4    ddl }d}|j                  |d|       S )z
    Replace occurrences of L[...] with just the inner content.
    Handles both single and double quotes.

    This is to generate user friendly recompilation messages.
    r   NzL\[\s*['\"](.*?)['\"]\s*\]z\1)resub)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   rh  z  File "z", line z, in     r  )r   r  r  r  r   striprx  r  )r  linesframer  r  r  source_lines          r   format_user_stack_tracerE    s     S_1E />>zz,1JJejj&&(Bxz&tfEFLL4}-./ 99Ur   c                    | j                   J | j                  J || j                   d   d}|j                  | j                         g }d}| j                  r| j                  j                  }d}g }| j                  |      }	d}
|	j                  sJ|	j                  }t        |      dk(  rd|d   v rd	}n|}g }|	j                  rBt        |	j                        }
n,||k7  rd
}|j                  |       nd}|j                  |       |rt        | |      }n|D ]  }t        | j                         }||d<   t               5  	 t        |||      }	 ddd       t%        t&              r|s|}t%        |t(              sd|j                  |       t#               r n t        |      dk(  r| d|d    }n| ddj+                  |      z   }|
r|d|
 z  }t-        |      S # t         $ r t#               r
Y ddd        w xY w# 1 sw Y   xY w)z
    Return the reason why `guard_manager` failed.
    Updates `guard_failures` with the generated reason.
    Only the first failed check of guard_manager is reported.
    Nr@  r>  Frh  rQ   zDuplicate tensor foundr   Ta  BACKEND_MATCH failure: torch.compile detected different backend callables. If this is unexpected, wrap your backend in functools.partial (or reuse the same cached backend) to avoid creating a new backend function each time. More details: https://github.com/pytorch/pytorch/issues/168373zUnexpected recompilation: runtime guards failed even though they passed during recompilation-reason analysis. Please open an issue with a minimal repro: https://github.com/pytorch/pytorchr5  rM  z; z
User stack trace:
)r   r   r  r   r  rr  resultr   r   r  rE  rx  r:  r"  rO   r6  rH  r+  r   r   r   r  r~  )rW  f_locals
compile_idr  rL  r  cache_entry_backendno_tensor_aliasing_check_failedr   guard_debug_infouser_stack_strr  rQ  r   fail_reason
reason_strs                   r   r  r    sV    %%111%%111!;!;C!@AE	LL++,G  +77??&+#$&$228<N
 ""-@@ !"a''+=a+@@26/,%'" &&45E5P5PQN		'N 	 	v2 	 	v&C5
 ' 	D : :;L15L-./1 "&t\5"AK +t,["+s+{+46'	. 7|q"|2gaj\2
"|2&7);;
-n-=>>
Z((/ ! 46   	 s*   HG""H5H?HHH	c                Z   t        | t              r| d| j                   S t        | |||      }|r|S t        t
        |      j                  |       	 | j                  &| j                  t        |xs dt
        |                |S # t        $ r t        j                  d       Y |S w xY w)NrM  zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   r  r  r  r   r   rx  r   r   rH  r  r  )rW  r   rH  rI  r  skip_loggingrO  s          r   get_guard_fail_reasonrR  D  s     -!;<R A ABCC-xWJ =&'..z:
&&2''*8(8-:MN   
d	
 
s   2B B*)B*c                d  
 g 
| Zt        | j                  | j                  |j                  | j                  ||      }|r
j                  |       | j                  } | Z|j                  }|r
S t               xs
 t               }|st        j                  rt               r"dj                  d t        
      D              }n%t        j                  dj                  
      d      }d| }d|j                    d|j"                   d|j$                   dt        j                  |d	       }	|r5t               rt&        j)                  |	       nt*        j)                  |	       t        j                  rt-        j.                  |	      t0        j2                  j5                  d
d 
fd       
S )z
    Return the list of guard failure reasons using cache_entry.
    Logs the recompilation reason if `recompiles` logging is enabled.
    Raises a RecompileError if `config.error_on_recompile` is enabled.
    z

c              3  \   K   | ]$  \  }}d | dt        j                  |d      z    & yw)zguard z failures:
- N)r=  r^  )r  r$  r  s      r   r  z:get_and_maybe_log_recompilation_reasons.<locals>.<genexpr>  s5      #Av <(8??64+HH#s   *,r  rU  z-triggered by the following guard failure(s):
zRecompiling function z in :r@  artifactc                     dddS )Nrecompile_reasonsr  )r  encodingr  r  r   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    '
 r   c                 .    t               dk(  r d   S  S )NrQ   r   )r   )r  s   r   r  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    W):71:  r   )metadata_fnr  )rR  rW  r   rH  rI  rx  r  rH  r)  r+  rR   error_on_recompiler  rv  r=  r^  r|  co_filenameco_firstlinenorecompiles_verbose_logr  recompiles_logrT   RecompileErrorr/  r  r  )r   rC  r  rQ  r  r   do_recompiles_logfailuresguard_failure_detailsmessager  s             @r   'get_and_maybe_log_recompilation_reasonsrg  c  s    G

!&%%NN""
 NN6"!&& 
! <<D-/R3P3RF55(*{{ #!*7!3# H
  tyy'94@H<XJG 	 $DLL>d6F6F5GqI\I\H]]_4f=>@ 	 ,.&,,W5$$W-$$$$W--	NN##
 H $  Nr   c                   | }t               }| 8|j                  | j                  j                                | j                  } | 8|} | :|| j                  _        | j                  j                          | j                  } | :|S r   )rM   r  rW  r  r  r   r  )r   first_cache_entryacc_diff_guard_sourcess      r   r  r    s     $
 /9l

!%%%%@@B	
 "&&	 
! $K

!7M!!4!!==?!&& 
! "!r   c                   t        d|j                   d|j                   d|j                          t        ddj	                  | j
                        z   dz          t        ddj	                  | j                               t        |        d|i| j                  }| j                  D ]  }	 t        || j                  |        y #  t        d|        Y 0xY w)	NzERROR RUNNING GUARDS  rV  zlambda rT  z and
  r?  zMalformed guard:
)
printr|  r^  r_  r  r   r   r   r6  r   )rW  r   rH  r   lastri  rN  s          r   guard_error_hookro    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  rp  s      r   uniquerr    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  )	r0   r/   rT   UnsafeScriptObjectErrorr  r  r  r<  r  )
obj_sourcedupe_sourceser_source_is_localsource_is_locals       r   make_dupe_guardry    s     {j02;?.z:/
1*=--??#=1A1A0B C> ?  /1 $$\%A%AKXXr   )skipc                v   ddl m} t        j                  t        j
                        xs# t        j                  t        j
                        }|j                         j                  j                  j                  }|D ]8  }t        |t              sJ t        |j                        r+ |||| dz          : y)z
    Add dynamo guards to the current tracing context.

    Args:
        guards: guard(s) to add
        skip: number of stack frames to ignore for debug stack trace
    r   )TracingContextrQ   )collect_debug_stackrz  N)torch._guardsr|  r  r  r  r  r  rb  guards_contextr  r   r   r;   r2   r  )rz  r   r|  r}  r   rN  s         r   install_guardr  	  s     -$11 8		(	(	7  



-
-
;
;
?
?C K%'''$U%=%=>E':J	Kr   )r   r  r   r   r   r"  )r  r   r   rr  )r   zset[str])r   r  )r   r  r   r   )r{  r   rN  r  r   r   r   )r   zUnion[str, list[str]]rN  r  r  r  r   r  )rY  zOptional[Source]r   r  )r  r   r   zOptional[int])r  ru  r   list[Optional[int]])r  rr  r  r   r  r  r  r  r  r?  r  r   r   r   )r  r  r  r   r   r"  )rY  r   r   r   r   r   )r  r   r   r	   )r  r   r   r   )rY  z3Union[DictGetItemSource, DictSubclassGetItemSource]r'  r   r(  r   r  r   r   r  r   r   )rN  r;   r   r   )r   r  r   r  )r   ztuple[type, ...])rN  r;   r  r<  r   r   )r  r  r  r<  r   rt  )r   r  r!  r   r   ztuple[str, str]r1  )r2  z'list[torch.overrides.TorchFunctionMode]r   zCallable[[], bool])rW  r   rL  r3  r   r  )r[  r   r   r   )r  ztraceback.StackSummary | Noner   r   )
rW  r   rH  r  rI  zOptional[CompileId]r  zOptional[Callable]r   r   r   )rW  r   r   r  rH  r  rI  r9   r  r   rQ  r   r   r   )
r   r  rC  r   r  r   rQ  r   r   r  )r   r  r   r  )rW  r   r   r  rH  r  r   r"  rn  r   r   r   )rq  zSequence[T]r   zGenerator[T, None, None])ru  r?   rv  zSource | Noner   z Optional[functools.partial[Any]])r   r;   rz  r"  r   r   ("  r  
__future__r   r  rQ  r  r  r}  r  r  r  r  r  r  pickler  r=  r  r5  r  rM  
contextlibr   rS  r   r   typingr   r   r	   r
   r   r   typing_extensionsr   r   r   r   r/  torch.overridestorch.utils._devicetorch._C._dynamo.eval_framer   torch._C._dynamo.guardsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   torch._dynamo.sourcer,   r-   r.   r/   r0   r1   r2   r3   r4   r5   torch._dynamo.utilsr6   r7   r~  r8   r9   r:   r;   r<   r=   r>   r?   r@   r  rB   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   rh  rR   rS   rT   
eval_framerU   rY  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   r   r   collections.abcr   r   r   numpyr  ModuleNotFoundErrorr   r   r   rT  r   torch._Cr   r+  r   r   r@  r   r   	getLoggerr   r  r  getArtifactLoggerr  ra  r`  r  r;  r   r   r   r  cacher  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r-  r2  r4  r~  r  r   r<  r  r  r  r7  r  r  r  Picklerr  r  r  r  r  r)  r+  r  r"  r   r}  r3  r:  r~  rE  r  rR  rg  r  ro  rr  ry  r  r  r   r   <module>r     sq  " # 
        	    
      %    L L C C !    >      8   H
 
 
 1 R % 1  * / O * ( ( ,. . . . . . . . . . . .^       . ( KO G N
 =='T4CLg!^^--hA
11(LI99"  ^^55h@PQ " ,~ , DT . . .2* 1>/ hh&&:: %6 %)% " 	<,'K
  !	
  " 	*31 d#! ! $!*?*(* * 	*
 )* *Z
G   
tyy 
 8 8}!
# }!
bDR8 R8j$!4 $ $ $ $ / / /
   
 
c cL:))) )b	 	D);XPX
+:++( 	gtCK012&2/422&
%-0h)&h)h) $h)
  h) 	h)d &
   	   	H B%BB 	B
 B BJ"%""600
0  0 	0
 0 
0. % &!!%2!%!H /0 KwQ  	Bs    T> >U	U	