
    [ThY                   <   % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK
Jr  SSKJrJrJrJrJr  SSKJr  SSKrSSKrSSK rSS	K!J"r"  SS
K#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  SSK.J/r/J0r0J1r1J2r2J3r3J4r4  SSK5J6r6  SSK7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@  SSKAJBrB  SSKCJDrD  SSKEJFrFJGrGJHrH  SSKIJJrJ  SSKKJLrLJMrM  SSKNJOrO  SSKPJQrQJRrRJSrSJTrT  SSKUJVrV  SSKWJXrXJYrYJZrZJ[r[J\r\J]r]J^r^J_r_J`r`JaraJbrbJcrcJdrdJereJfrfJgrgJhrhJiriJjrjJkrkJlrlJmrmJnrnJoroJprpJqrqJrrrJsrsJtrtJuruJvrvJwrw  SSKJxrxJyryJzrzJ{r{J|r|J}r}  SSK~JrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr  SrS\S'    SSKr\(       a  SSKJr  \GR.                  " \5      r\GR4                  GR7                  \S5      r\GR4                  GR7                  \S5      r\GR4                  GR7                  \S5      r\GR4                  GR7                  \S 5      r " S! S"5      rS# r\GRD                  " S5      S$ 5       rSqS%\S&'   S' rSRS( jr\GRN                  GRP                  GRR                  rSSS) jr      STS* jrS+ rS, rS- rS. r\GR`                  " S/S09 " S1 S25      5       rS3 rS4 r\GR`                   " S5 S65      5       r " S7 S8\GRj                  5      r\GRD                  " S5      SUS9 j5       r " S: S;\<5      r " S< S=5      rS> r " S? S@\5      r " SA SB5      rSVSC jrSD rSE rSF rSG rSWSH jr        SXSI jr          SYSJ jr    SZSK jrSL r          S[SM jr\V" \5        SN rSO rSSP.SQ jrg! \ a    Sr GNf = f)\a  
Core guard system for Dynamo that detects when compiled code needs to be recompiled due to
changes in program state. Guards are conditions that must remain true for previously-compiled
code to be valid for reuse.

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

The guard system is critical for Dynamo's ability to efficiently reuse compiled code while
maintaining correctness by detecting when recompilation is necessary due to changes in
program state, tensor properties, or control flow.
    )annotationsN)contextmanager)deepcopy)currentframe)AnyCallableOptionalTYPE_CHECKINGUnion)ReferenceType)code_framelocals_names)
check_obj_idcheck_type_iddict_versionDictGuardManager install_no_tensor_aliasing_guardinstall_object_aliasing_guard!install_storage_overlapping_guardinstall_symbolic_shape_guardprofile_guard_managerRootGuardManager)IndexedSource$is_from_flatten_script_object_sourceis_from_local_sourceis_from_optimizer_sourceTensorPropertyTensorPropertySource)CompileEventLogger)	CompileContext	CompileIdDuplicateInputsGuardGuardBuilderBaseGuardEnvExprGuardSourceSourceStorageOverlap)
structured)justknobs_check)EqualityConstraintis_symbolicSYMPY_INTERP)
OrderedSet)format_framereport_compile_source_on_error)TensorWeakRef   )configconvert_frameexcmutation_guard)set_guard_error_hook) AttrProxySource
AttrSourceCallFunctionNoArgsSourceCallMethodItemSourceChainedSourceConstantSourceConstDictKeySourceDefaultsSourceDictGetItemSourceFlattenScriptObjectSourceFloatTensorSourceFSDPNNModuleSourceGetItemSourceGlobalSourceGlobalStateSourceGlobalWeakRefSource
GradSourceListGetItemSourceLocalSourceNNModuleSourceNumpyTensorSourceOptimizerSourceScriptObjectQualifiedNameSourceShapeEnvSourceSubclassAttrListSourceTorchFunctionModeStackSourceTupleIteratorGetItemSource
TypeSource"UnspecializedBuiltinNNModuleSourceUnspecializedNNModuleSourceUnspecializedParamBufferSourceWeakRefCallSource)
CacheEntryDynamoFrameType
ExtraStateGuardedCode	GuardFailGuardFn)builtin_dict_keyscommon_constant_types	dict_keysget_custom_getattrget_torch_function_mode_stack get_torch_function_mode_stack_atguard_failuresistype	key_is_id	key_to_idnormalize_range_iterorig_code_maptensor_always_has_static_shapetuple_iterator_getitemtuple_iterator_lenunpatched_nn_module_getattrverify_guard_fn_signaturez#Optional[Callable[[Any, Any], Any]]guard_manager_testing_hook_fn)Symbolguards
recompilesrecompiles_verboseverbose_guardsc                  ~    \ rS rSrSrSS jr\S 5       rS rS r	S r
S	 rS
 rSS jrS rS rS rS rS rS rSrg)GuardManagerWrapper   z
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                    Uc  [        5       U l        OXl        S U l        S U l        S U l        / U l        S U l        S U l        S U l        S U l	        S U l
        0 U l        / U l        SU l        [        5       U l        g NT)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print_no_tensor_aliasing_guardr-   diff_guard_sources)selfry   s     L/var/www/auris/envauris/lib/python3.13/site-packages/torch/_dynamo/guards.py__init__GuardManagerWrapper.__init__   s~    <(*DII# 	"& !!*,'.2+3=<    c              #  J   #    SU l          S v   SU l         g ! SU l         f = f7frx   )r   r   s    r   '_preserve_print_no_tensor_aliasing_flag;GuardManagerWrapper._preserve_print_no_tensor_aliasing_flag   s%     .2+	726D/$D/s   # #	 #c                p   ^ ^^^ U U4S jmU U4S jmUU4S jmT" T R                   5        T R                  $ )Nc                d  > U R                  5       TR                  ;   =(       d    U R                  5       S:  n[        U R	                  5       R                  5       5       H  u  nu  p4UT" U5      T" U5      -  -  nM     U(       a)  TR                  R                  U R                  5       5        U$ 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_managerJGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_dict_manager   s    !T%<%<<U@QTU@U  ,2++-335,''g #eGnuW~&EE",
 "''++DOO,=>%%r   c                H  > [        U [        5      (       a   eU R                  5       TR                  ;   =(       d    U R	                  5       S:  nU R                  5        H  nUT" U5      -  nM     U(       a)  TR                  R                  U R                  5       5        U$ r   )
isinstancer   r   r   r   get_child_managersr   )r   r   	child_mgrr   r   s      r   visit_managerEGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_manager   s    !$(89999 !T%<%<<U@QTU@U  "446	"eI&66" 7 "''++DOO,=>%%r   c                V   > U c  g[        U [        5      (       a  T" U 5      $ T" U 5      $ )NF)r   r   )r   r   r   s    r   r   =GuardManagerWrapper.collect_diff_guard_sources.<locals>.visit   s/    |$ 011)$// &&r   )ry   r   )r   r   r   r   s   `@@@r   collect_diff_guard_sources.GuardManagerWrapper.collect_diff_guard_sources   s,    	&	&	' 	dii&&&r   c                D    U R                  5         U R                  5         g N)r   populate_diff_guard_managerr   s    r   finalizeGuardManagerWrapper.finalize  s    '')((*r   c                    U R                  U R                  5      U l        U R                  (       a  U R                  R	                  5         g g r   )clone_with_chosen_sourcesr   rz   r   update_diff_guard_root_managerr   s    r   r   /GuardManagerWrapper.populate_diff_guard_manager  s=    #==d>U>UV ;;= r   c                F   ^ U4S jnU R                   R                  U5      $ )Nc                *   > U R                  5       T;   $ r   )r   )node_mgrchosen_sourcess    r   	filter_fn@GuardManagerWrapper.clone_with_chosen_sources.<locals>.filter_fn  s    &&(N::r   )ry   clone_manager)r   r   r   s    ` r   r   -GuardManagerWrapper.clone_with_chosen_sources  s    	; yy&&y11r   c                    UR                   R                  nUR                  5       nU Vs/ s H
  oBS-   U-   PM     nnU$ s  snf )N: )	__class____name__r~   )r   guard
guard_namepartsparts        r   get_guard_lines#GuardManagerWrapper.get_guard_lines  sE    __--
((*6;<edd"T)e< =s   A c                    UR                  5       nUR                  R                  nUS-   U-   nU(       a  USU-   -  nU$ )Nz	: source=, )r   r   r   )r   guard_manageraccessor_strsourcetss         r   get_manager_line$GuardManagerWrapper.get_manager_line$  sF    ))+##,,Of$$$Ar   c                   [        UR                  5       R                  5       5       H  u  nu  pEUR                  SU 35        UR	                  5          U(       a4  UR                  SU R                  U5       35        U R                  XB5        U(       a4  UR                  SU R                  U5       35        U R                  XR5        S S S 5        M     g ! , (       d  f       M  = f)NzKeyValueManager pair at index=zKeyManager: zValueManager: )r   r   r   	writelineindentr   construct_manager_string)r   mgrbodyr   r   r   s         r   construct_dict_manager_string1GuardManagerWrapper.construct_dict_manager_string,  s    '-c.H.H.J.P.P.R'S#C#'NN;C5ABNN\$2G2G2P1Q#RS11'@NN^D4I4I'4R3S#TU11'@  (Ts   A7C
C'	c           
     8   UR                  5          UR                  5        H  n[        U[        R                  R
                  R                  R                  5      (       ab  U R                  (       a)  SU l        UR                  U R                  U5      5        Mz  UR                  UR                  R                  /5        M  UR                  U R                  U5      5        M     [        U[        5      (       a  U R                  X5        [        UR!                  5       UR#                  5       5       HH  u  pEUR%                  U R'                  USUR)                  5        35      5        U R+                  XR5        MJ     S S S 5        g ! , (       d  f       g = f)NFzaccessed_by=)r   get_leaf_guardsr   torch_C_dynamorp   NO_TENSOR_ALIASINGr   
writelinesr   r   r   r   r   zipget_accessorsr   r   r   reprr   )r   r   r   r   accessorr   s         r   r   ,GuardManagerWrapper.construct_manager_string8  s/   [[],,.eUXX%5%5%<%<%O%OPP::>C;(<(<U(CD % 8 8 OOD$8$8$?@ / #/00223= (+!!#S%;%;%=(# )))|HMMOCT5UV --i>() ]]s   E1F
Fc                   SSK Jn   " S SU5      nU R                  5          U" 5       nSUl        UR	                  SSS9  UR	                  S	SS9  UR	                  S
5        U R                  U R                  U5        [        U R                  S5      (       aA  U R                  R                  5        H#  nUR                  U R                  U5      5        M%     UR                  5       sS S S 5        $ ! , (       d  f       g = f)Nr   IndentedBufferc                  2   ^  \ rS rSrS rSU 4S jjrSrU =r$ )=GuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefixiX  c                :    SU R                   U R                  -  -  $ )Nz| )_indenttabwidthr   s    r   prefixDGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.prefixY  s    t||dmm;<<r   c                X   > U(       a  [         TU ]  U5        g [         TU ]  SU-   5        g )Nz+- )superr   )r   lineskip_prefixr   s      r   r   GGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.writeline\  s$    G%d+G%edl3r    F)r   
__module____qualname____firstlineno__r   r   __static_attributes____classcell__r   s   @r   IndentedBufferWithPrefixr   X  s    =4 4r   r   r1    T)r   zTREE_GUARD_MANAGER:r   get_epilogue_lambda_guards)torch._inductor.utilsr   r   r   r   r   ry   hasattrr   r   r   getvalue)r   r   r   r   r   s        r   __str__GuardManagerWrapper.__str__U  s    8	4~ 	4 99;+-DDMNN24N0NN0dNCNN-.))$))T:tyy">??!YYAACEOOD$8$8$?@ D==? <;;s   CC33
Dc                8    U R                   R                  U5      $ r   )ry   checkr   xs     r   r  GuardManagerWrapper.checkn  s    yyq!!r   c                8    U R                   R                  U5      $ r   )ry   check_verboser  s     r   r  !GuardManagerWrapper.check_verboser  s    yy&&q))r   c                L   ^ ^^^ SmS mUU UU4S jmT" T R                   5        g )NFc                    / nU R                  5        H6  nUR                  S5      S   R                  5       nUR                  U5        M8     U$ )N#r   )r~   splitrstripappend)
leaf_guardr}   verbose_code_part	code_parts       r   get_code_partsMGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.get_code_partsz  sP    J%/%B%B%D!-33C8;BBD	!!), &E r   c                  > U R                  5        H  n[        U[        R                  R                  R
                  R                  5      (       a.  T(       d%  TR                  R                  T" U5      5        SmMl  Mn  TR                  R                  T" U5      5        M     U R                  5        H  nT" U5        M     g rx   )
r   r   r   r   r   rp   r   r}   extendr   )r   r   r   r  r   tensor_aliasing_guard_seenr   s      r   r   DGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.visit  s    ,,.eUXX%5%5%<%<%O%OPP5..~e/DE592 6 OO**>%+@A / !335	i  6r   )ry   )r   r  r  r   s   `@@@r   !populate_code_parts_for_debugging5GuardManagerWrapper.populate_code_parts_for_debuggingv  s&    %*"		! 	! 	diir   )r|   r   r{   r}   rz   r   r   r   r   r   r   r   ry   r~   r   )r   r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r   ru   ru      s_    @, 7 7/'b+>2
A?:#2"*r   ru   c                   [         R                  R                  5          [        U [        R
                  [        R                  45      (       a  [         R                  " U 5      OU sS S S 5        $ ! , (       d  f       g = fr   )r   	overrides_enable_torch_functionr   npgenericndarray	as_tensor)as    r   
from_numpyr$    sH     
	/	/	1%/BJJ

3K%L%Luq!RS 
2	1	1s   AA00
A>c                     SS K n SS Kn U R                  R                  U R                  R                  /nSSKJn  UR                  U5        U Vs1 s H  n[        R                  " U5      iM     sn$ s  snf )Nr   )POLYFILLED_MODULES)
torch._dynamo.external_utilstorch._dynamo.polyfillsr   external_utils	polyfillstorch._dynamo.polyfills.loaderr&  r  inspectgetfile)r   modsr&  ms       r   uninteresting_filesr0    sW    '"MM((%--*A*ABDAKK"#(,-1GOOA---s    A3zOptional[dict[str, object]]_CLOSURE_VARSc                    [         c  0 S[        _S[        _S[        R                  R
                  _S[        _S[        _SS _S[        _S	[        _S
[        _S[        _S[        R                  _S[        c  S O[        R                  _S[        S5      _S[         R"                  _S[$        R&                  R(                  _S[$        R*                  _S[,        _[$        R.                  [$        [0        S.Eq [         $ )N___check_type_id___check_obj_id___odict_getitem___key_to_id___dict_version___dict_containsc                ,    [         R                  X5      $ r   )dict__contains__)r#  bs     r   <lambda>#_get_closure_vars.<locals>.<lambda>  s    T->->q-Dr   ___tuple_iterator_len___normalize_range_iter___tuple_iterator_getitem#___get_torch_function_mode_stack_at__math_isnan__numpy_isnaninf__load_moduleutils_devicedevice___from_numpy)___as_tensorr   r,  )r1  r   r   collectionsOrderedDict__getitem__rf   r   rk   rg   rj   rb   mathisnanr  float	importlibimport_moduler   utils_devicerH  r$  _as_tensor_fullprecr,  r   r   r   _get_closure_varsrV    s,   

|
  7 7 C C
 I	

 |
  D
 $%7
 &';
 ()?
 23S
 DJJ
 RZTRXX
 5<
 Y44
 EKK//
  ell!
" Z#
$ "55)
, r   c                N    [         R                  " U 5      R                  SS5      $ )N
r   )astunparsereplace)r   s    r   _ast_unparser\    s    ;;t$$T2..r   c                8   SnUb  UR                   (       aD  [        UR                   5       H*  nUR                  [        5       ;  d  M  S[	        USS9 3n  O=   O:UR
                  (       a)  S[	        UR
                  R                  5       S   5       3nU S U 3$ )Nr   z  # T)r   z<60)
user_stackreversedfilenamer0  r.   stacksummary)r  r   extrafss       r   get_verbose_code_partrf    s    Eu//0;;&9&;;"<#>"?@E 1 [[<(;(;(=b(ABCDE_UG$$r   c                t    [        U [        5      (       d  U /n U  Vs/ s H  n[        X!5      PM     sn$ s  snf r   )r   listrf  )r}   r   r  s      r   get_verbose_code_partsri    s6     j$'' \
EOPZ	!)3ZPPPs   5c                    / nU  Hp  n[        U5      (       d  UR                  U5        M&  [        U[        R                  5      (       d   eUR                  UR
                  R                  5       5        Mr     U$ r   )r+   r  r   r   SymIntr   maybe_as_int)size_or_stride	converteddims      r   convert_to_concrete_valuesrp    sd    %'I3S!c5<<0000SXX2245  r   c                |   [        U 5      n[        R                  R                  U 5      [        R                  R	                  5       -  [        R                  R                  5       -
  nU R                  nU R                  R                  nU R                  nSU SUR                   SU SU SU SU SU SU S3n	U	$ )Nzcheck_tensor(r   z	, device=z, requires_grad=z, size=z	, stride=))typer   r   _dispatch_keys_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyperH  indexrequires_gradr   )
valuenamesizesstridespytypedispatch_keyrw  device_indexry  	guard_strs
             r   get_tensor_guard_code_partr    s    %[F&)Q)Q)SS0023L KKE<<%%L''M
vR 3 34B|nBug N/geWIV]U^^_	a  r   c                H    [        [        U 5      5      R                  U5      $ r   )rh  r]   rx  )dctkeys     r   get_key_indexr    s     
 !#&'--c22r   c                    SU  SU S3$ )Nlist(dict.keys())[]r   )r   rx  s     r   get_key_index_sourcer    s    VHCwa00r   T)frozenc                  @    \ rS rSr% SrS\S'   SrS\S'   SrS\S'   S	rg)
NNModuleAttrAccessorInfoi	  Fboolpresent_in_generic_dictNzOptional[str]l1_keyl2_keyr   )	r   r   r   r   r  __annotations__r  r  r   r   r   r   r  r  	  s'     %*T) !FM  !FM r   r  c                   U R                   R                  5       n[        U R                  [        5      (       a  U R                  R                  nO,[        U[
        5      (       d   e[        X R                  5      n[        XV5      n[        [        U5      5      U   n[        U[        [        45      (       a
  U SU< S3n	OU SU S3n	[        U R                  [        5      (       dK  UR                  UUU R                  [        R                  S9R                  U R                  U SU< 3/5        UR!                  UU	UUS9$ )N[r  rx  r   example_valueguard_manager_enum == )baser{  r   rx  r=   r:  r  r  rh  r]   intstrget_key_managerGuardManagerTypeGUARD_MANAGERadd_equals_match_guardget_value_manager)
r   base_guard_managerbase_example_valuer  r  base_source_namerx  
key_sourcekey_example_valuevalue_sources
             r   getitem_on_dict_managerr    sB    {{'')&,, 233"",d33330,,?%&6>J ./ABCEJ#c3Z00*+1->,AC*+1ZL:fll$677 	** ,,/==	 	+ 	

 !
 LLj\.?-BCD
 //#-	 0  r   c                    U R                   n[        U[        5      (       a  gU R                  5       (       a  gUR	                  5       =(       a    [        U[
        5      (       + $ NFT)originating_sourcer   rK   is_specialized_nn_moduleis_dict_keyrG   )r   r   s     r   match_on_id_for_tensorr  A  sP    %%F &+,,%%''F
6:(F$FFr   c                  *    \ rS rSr% S\S'   S\S'   Srg)GuardCodeListiP  	list[str]	code_listr"   r   r   Nr   r   r   r   r  r   r   r   r   r  r  P  s    Lr   r  c                      \ rS rSrSrSrSrg)r  iV  r1      r   N)r   r   r   r   r  DICT_GUARD_MANAGERr   r   r   r   r  r  V  s    Mr   r  c                <    [        [        [        U 5      5      5      $ r   )rh  r`  r   )codes    r   &code_framelocals_names_reversed_cachedr  [  s    /5677r   c                     \ rS rSr                S8S jrS rS r\S 5       rS r	S r
S rS	 rS
 rS rS9S jr  S:S jrS;S<S jjrS=S jrS>S jrS9S jrS;S?S jjrS?S jrS9S jrS@S jrS9S jrS;S9S jjrS9S jrS9S jrS9S jrS9S jrS9S jrS9S jr S9S jr!S9S  jr"S9S! jr#S9S" jr$S9S# jr%S9S$ jr&S9S% jr'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S9S. jr0S9S/ jr1S9S0 jr2S9S1 jr3S9S2 jr4S9S3 jr5S9S4 jr6S;S9S5 jjr7S;S6 jr8S7r9g)AGuardBuilderi`  c	                    Xl         X l        X0l        X@l        XVS.U l        [
        R                  R                  5       U R                  S'   [        R                  R                  R                  R                  5        HW  u  n	n
U	R                  SS5      R                  SS5      R                  SS5      n	XR                  S   U	'   XR                  U	'   MY     Xpl        / U l        / U l        / U l        / U l        / U l        Xl        [+        5       U l        U R(                  R.                  R0                   H6  nU R,                  R3                  [5        U R7                  U5      5      5        M8     0 U l        0 U l        [+        5       U l        g )NLG__builtins__>_<._dot_)f_codeid_ref
source_reflookup_weakrefsscopebuiltins__dict__copyr   packagepackage_importer_package_imported_modulesr   r[  r   argnamesr  shape_env_codeno_tensor_aliasing_names!no_tensor_aliasing_guard_managerscheck_fn_managersetkey_order_guarded_dict_idsoutput_graphguard_on_key_orderr   idgetr   _cached_guard_managers_cached_duplicate_input_guards)r   r  r  r  r  local_scoper   r   r  r{  package_modulesource_names               r   r   GuardBuilder.__init__a  s`    $.9D3X
%-%6%6%;%;%=

>" ]]++EEKKM
<<S)11#s;CCCQD/=JJ~&t,-JJt N +#%)+	
 46 46%LN.6F +.%'00==PPK++//488K3H0IJ Q BD
  	# EHE+r   c                \   U R                  U5      n[        U[        5      (       a  [        SUR                   35      eUR
                  R	                  5       n[        U5       HE  nX   n[        UR
                  US9nU R                  Xq5      nUR                  UU SU< S3UUS9  MG     g )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )rx  r  r  r  r   r  r  )
get_guard_managerr   r   NotImplementedErrorr{  r  r]   r?   get_guard_manager_typedict_getitem_manager)	r   r  r   dict_mgrdict_sourcer  rz  r  r  s	            r   #guard_on_dict_keys_and_ignore_order0GuardBuilder.guard_on_dict_keys_and_ignore_order  s    ))%0h 011%FFKjj\S  ..335 %]3C!&E,U-E-ESQL!%!<!<" ))%awa0##5	 *  4r   c                $   U R                  U5      n[        U[        5      (       d  [        SUR                   35      e[        U[        5      (       d   e[        [        U5      5       H  u  pE[        UR                  U5      nUR                  UUU[        R                  S9n[        U5      (       a6  U R                  XV5      nUR                  U[        SU SU S3U5      5        M  UR                  U[        U SU< 3U5      5        M     g )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for r  z__check_obj_id(r   rr  r  )r  r   r   r  r{  	enumerater]   r  r  r  r  re   r  add_id_match_guardri  r  )	r   rz  r   r  r   r  r  key_managerid_vals	            r   guard_on_dict_keys_and_order)GuardBuilder.guard_on_dict_keys_and_order  s    ))%0($455%;;@::,H  ($45555 ""3E":;HC-ejj#>J"22!!#3#A#A	 3 K ~~S5..*)*RxqA5 22/:,d3'0JER' <r   c                    [         R                  (       aD  [        R                  S:  a0  [        R                  S:  a  [        R
                  " S[        5        g U $ )N)      )r  r  r1   zMGuards may run slower on Python 3.13.0. Consider upgrading to Python 3.13.1+.)r2   issue_3_13_0_warningsysversion_infowarningswarnRuntimeWarning)r  s    r   '_get_generic_dict_manager_example_value4GuardBuilder._get_generic_dict_manager_example_value  sF     ''  G+  :-MM_ r   c           	     $   S nUR                   n	UR                  n
[        5       n[        R                  " UR
                  5       H,  nUR                  UR                  R                  5       5        M.     [        SSS5      nX;   a  [        SU	S5      nOXSU
;   a  XS   ;   a  [        SSU	5      nO<SU
;   a  XS   ;   a  [        SSU	5      nO X;  a  SU
;   a  XS   ;   a  [        SSU	5      nUR                  (       d  UR                  UR                   UUUS9$ UR                  (       d   eUR                  nUR                  nU S	3nS=nnS=nnS=nnU(       aR  [        UR                  U5      nUR                  5       nX   nU R!                  UU5      nUnUnU R!                  X5      nOUnUnU R!                  X5      nUR#                  UU R%                  U
5      [&        R(                  S
9nU" UUUU
UUS9nU(       a  U" UUUUUUS9$ U$ )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                
   [        U [        5      (       a]  [        X15      nSU SU< S3nU R                  UUU[        R
                  S9R                  X SU< 3/5        U R                  UUUUS9$ U R                  UUUUS9$ )Nr  r  r  r  r  r  )	r   r   r  r  r  r  r  r  r  )r   r  r  r  r  r  rx  r  s           r   getitem_on_dict_mgr>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgr  s     #/00 &&8>  /{m3uiqI
##%"%'7'E'E	 $ 
 )(T#/I.JK ,,&"/'9	 -   //&"/'9	 0  r   FNT_parameters_buffers_modulesattrr   r  r  	.__dict__r   r  r  )r   r  r  r  r  r  )memberr  r  r,  getmror   updatekeysr  r  getattr_managerr  r  r8   r  r{  r  get_generic_dict_managerr  r  r  )r   r   r  r  r  r  r  r  r   	attr_namemod_dictall_class_attribute_namesr  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_module!GuardBuilder.getattr_on_nn_module  se   6	@ MM	%...1e! 2 < <=A%,,QZZ__->? > 1dC 4T9dKMh&98O+O4T=)TM8#	j5I(I4T:yQM6h&j11 5T:yQM44 &55]]"+#5	 6   !''''"))F"))F "2 2)<O.22N^"&&Hx<@@!$9&v{{F;	!*!1#+ )-(C(CIx(X%!,((,(C(C)% "-((,(C(C)% (:'R'R&"JJ8T#3#A#A (S ($ ),*#+&#8F * .'/"*'<  Mr   c                    UR                  5       nUS:X  a  g[        U R                  U5      5      nX0R                  ;   $ )Nr   F)r{  r  r  r  )r   r   r  obj_ids       r   requires_key_order_guarding(GuardBuilder.requires_key_order_guarding  s:    kkm"DHH[)*8888r   c                    [         R                  nU R                  U5      (       aN  [        U[        5      (       a  [         R
                  nU$ [        U[        5      (       d   e[         R
                  nU$ r   )r  r  r!  r   r_   r  r:  )r   r   r  r  s       r   r  #GuardBuilder.get_guard_manager_type  sg    -;;++F33-33%5%H%H" "! "-6666%5%H%H"!!r   c                (    U[         R                  :H  $ r   )r  r  )r   mgr_enums     r   manager_guards_on_keys#GuardBuilder.manager_guards_on_keys  s    +>>>>r   c                    U R                   R                  R                  U R                  S   SU R                  S   [        R
                  S9$ )Nr  )	f_globalsr   r  r  )r   ry   globals_dict_managerr  r  r  r   s    r   get_global_guard_manager%GuardBuilder.get_global_guard_manager  sH    !!&&;;jjo**S//==	 < 
 	
r   c           	       ^ U R                   R                  nS nTR                  5       nUS:w  a  X@R                  ;   a  U R                  U   $ US:w  a  U R	                  U5      nU R                  TU5      nS nS nS n[        R                  n	[        T[        5      (       ab  TR                  R                  5       nU R	                  U5      nU R                  TR                  5      nU R                  TR                  U5      n	[        T[        5      (       a  [        R                  (       a_  [!        U R"                  5      n
[%        U
5      U
R'                  TR(                  5      -
  S-
  nUR+                  TR(                  U4UUUS9nGO>UR-                  TR(                  UUUS9nGO [        T[.        5      (       a,  U R1                  5       R-                  TR2                  UUUS9nGO[        T[4        5      (       a,  U R1                  5       R7                  TR2                  UUUS9nGO[        T[8        5      (       a  U$ [        T[:        5      (       a  U$ [        T[<        5      (       a  U(       d   eUR?                  UUUS9nGO?[        T[@        [B        [D        [F        [H        45      (       a  U(       d   eUnGO[        T[J        5      (       a  URM                  U4S jUUUS9nGO[        T[N        5      (       a  U(       d   eURQ                  UUUS9nGO[        T[R        [T        45      (       a{  U(       d   e[        U[V        RX                  RZ                  5      (       a+  []        U5      [^        L a  U Ra                  TUUUUUU5      nGO2URc                  TRd                  UUUS9nGO[        T[f        5      (       a  U(       d   e[        U[h        [j        Rl                  45      (       d   e[        U[n        5      (       a)  U Rq                  U	5      (       d   e[s        TUUUU5      nGO[        TR&                  [t        5      (       a  [w        S	5      eUR-                  TR&                  UUUS9nGOI[        T[x        5      (       aE  [{        US
TR|                  R                  R                  5        S35      " TR                  UUUS9nGO[        T[        5      (       a'  U(       d   eUR                  TR                  UUUS9nGO[        T[        5      (       a'  U(       d   eUR                  TR&                  UUUS9nGOw[        T[        5      (       a  U(       d   e[        U[h        [j        Rl                  45      (       a   S5       e[        U[        5      (       a/  TR                  (       d  UR                  TR&                  UUUS9nGO[        U[        5      (       a/  TR                  (       d  UR                  TR&                  UUUS9nGOTR&                  nTR                  (       a  TR                  5       nUR                  UUUUS9nGOd[        T[        5      (       a  U(       d   e[        U5      (       d   eTR                  (       dE  UR                  UUR                  [        R                  S9R                  TR                  UUUS9nGOUR                  nUc   eUS-   nUR                  UU[        R                  S9n[        U[n        5      (       a   eUR-                  TR                  UUUS9nGOt[        T[        5      (       a!  U(       d   eURM                  [        UUUS9nGO>[        T[        5      (       a  U(       d   eURM                  S UUUS9nGO[        T[        5      (       a  U(       d   eURM                  S UUUS9nGO[        T[        5      (       a  U(       d   eURM                  S UUUS9nGO[        T[        5      (       a  U(       d   eURM                  S UUUS9nGOr[        T[        5      (       a  U(       d   eURM                  S UUUS9nGO?[        T[        5      (       a  U(       d   eURM                  S UUUS9nGO[        T[        5      (       a&  U(       d   eUR                  TR&                  UUUS9nO[        T[t        5      (       a=  [        U[n        5      (       d  [        S5      eUR                  TR&                  UUUS9nO[        T[        5      (       a  U(       d   eUR                  UUUS9nOO[        T[        5      (       a  U(       d   eUR                  UUUS9nO[        ST STR                  5        35      eXR                  TR                  5       '   U$ )Nr   r1   r  )global_namer   r  r  r  c                6   > [        TR                  5       5      $ r   )rb   
_get_index)r  r   s    r   r=  <GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (H%%')r   )python_lambdar   r  r  r  zUExpecting clean index here. Likely Dynamo forgot to mark a dict as guard_on_key_ordertensor_property__manager)r   r   r  r  zUse DictGetItemSourcez.__kwdefaults__c                (    U R                  5       S   $ r   __tensor_flatten__r  s    r   r=  r2    s    (<(<(>q(Ar   c                "    U R                  5       $ r   )__obj_flatten__r9  s    r   r=  r2    s    (9(9(;r   c                >    U R                  5       R                  5       $ r   )_typequalified_namer9  s    r   r=  r2    s    	(@(@(Br   c                "    U R                  5       $ r   )get_baser9  s    r   r=  r2    s
    

r   c                "    U R                  5       $ r   )itemr9  s    r   r=  r2    s
    r   c                .    [         R                  " U 5      $ r   )r   rU  r9  s    r   r=  r2    s    (A(A!(Dr   r  z4ConstDictKeySource can only work on DictGuardManagerzmissing guard manager builder z - )dr   ry   r{  r  r  r  r  r  r   r;   r  get_guard_manager_from_sourcerd   rI   r2   !enable_cpp_framelocals_guard_evalr  r  lenrx  
local_nameframelocals_managerr  rD   r,  r/  rF   global_weakref_managerrE   rN   rR   type_managerrL   rJ   rT   rS   rB   rP   lambda_managerrG   grad_managerr8   rU   r   nnModuler`   rl   r  r  r	  r?   r:  rK  rL  r   r'  r  r=   RuntimeErrorr   getattrproplowerr   r   indexed_managerrH   list_getitem_managerrC   rh  index_is_slicetupletuple_getitem_managerunpack_slicegetitem_managerr>   callableis_kwfunc_defaults_manager__defaults__idx_key__kwdefaults__func_kwdefaults_managerrK   r$  rO   r@   rM   r7   r:   rA   rQ   tuple_iterator_getitem_managerAssertionErrorr  rV   weakref_call_managerr9   call_function_no_args_manager)r   r   root_guard_managerr  r  r  r  r  r  base_guard_manager_enumframelocals_names_reversedframelocals_idxoutrx  
kwdefaults	kw_sourcer  s    `               r   rD  *GuardBuilder.get_guard_manager_from_source  s3
   !//44kkm"0K0K!K..{;;" HH[1M!88O  !!"2"@"@fm,,%{{//1!%*:!;!%!C!CFKK!P&*&A&A/'#
 &+&& 77-SKK.* 23066v7H7HIJ  
 )<<**O<&"/'9	 =  )==))&"/'9	 >  FL)) //1FF&&"+#5	 G C F/00//1HH".."+#5	 I C F-.. &%FN++%%FJ''%%%$11"+#5 2 C
 +2"	
 	
 &%%$CF899$33 #+#5 4 C FJ''%%%$11"+#5 2 C
 FZ)GHII%%% -uxx??&'9:./ //&&!$& )88&"/'9	 9  F-..%%%049P9P2QRRRR,.>??223JKKKK-&&!& fll,>??&8  )==&"/'9	 >  F01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33F<Q<Q(==&"/'9	 >  .6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A33&"/'9	 4  F-..%%%$33("+#5	 4 C F233%%%$33A"+#5	 4 C F566%%%$33;"+#5	 4 C F;<<%%%$33B"+#5	 4 C FO,,%%%$334"+#5	 4 C F011%%%$330"+#5	 4 C F-..%%%$33D"+#5	 4 C F677%%%$CCll"+#5	 D C  23302BCC$J  %44ll"+#5	 5 C F-..%%%$99"+#5 : C
 F455%%%$BB"+#5 C C !0FKKM?K  69##FKKM2
r   c                8    U R                  UR                  5      $ r   )rD  r  r   r   s     r   r  GuardBuilder.get_guard_manager  s    11%2J2JKKr   Nc                   Uc
  [        5       nSR                  UR                  5       5      n[        X5      u  pg0 nSU R                  S   0n	[
        R                  SU5        [        XyU5        US   " UR                  5       6 n
U(       a&  U R                  R                  R                  X5        g U R                  R                  R                  X5        g )Nr   r  zPython shape guard function:
%s___make_guard_fn)rV  joinr  build_guard_functionr  
guards_logdebugexecvaluesr   ry   add_epilogue_lambda_guardadd_lambda_guard)r   r}   r~   r{   is_epiloguemake_guard_fn_args_guard_bodypycoderi  globals_for_guard_fnguard_fns              r   $add_python_lambda_leaf_guard_to_root1GuardBuilder.add_python_lambda_leaf_guard_to_root  s     ,.L "YY|'8'8':;2:R  #TZZ_5;VDV3/)*L,?,?,AB ##== ##44XRr   c                H    Uc
  [        5       n[        XR                  U5      $ r   )rV  evalr  )r   r{  r{   s      r   r  GuardBuilder.get*  s!    ,.LD**l33r   c                P   [        U[        5      (       a  UnOUR                  n[        U5      nX0R                  ;  ag  [
        R                  R                  R                  U5      nU(       a7  US:X  a  [        R                  SU5        U R                  R                  U5        U$ )Nr  zinvalid var name: %s)r   r  r{  strip_function_callr  r   r   r   is_valid_var_namelogwarningr  )r   r   r{  r  is_valids        r   arg_refGuardBuilder.arg_ref4  s{    eS!!D::D"4(}}$xx''99$?Hq=KK 6>$$T*r   c                    [        UR                  U5      n[        XCUR                  UR                  S9nUR                  U 5        g )N)rb  r_  )r8   r  r"   rb  r_  create)r   r   r  r  attr_source	new_guards         r   _guard_on_attribute GuardBuilder._guard_on_attributeD  s?     !9!99EAQAQ
	 	r   c           	        UR                   n[        U[        5      (       a  UR                  n[        U[        5      (       d   SUR
                   35       eUR                  nUR                  5       nUR                  nU R                  U5      n[        U R                  U5      U5      nS nU(       a  SU SU< S3nO
SU SU< S3nU R                  X/U R                  U5      S9  U R                  U5      n	U(       a  U R                  UR                  5       5      n
U R                  U5      nU R                  X*5      n[        U[        R                  R                  5      (       a7  [!        U5      ["        L a%  U R%                  UU	UU
UUR                  5       U5      $ U	R'                  UUR
                  U
US9  g U	R)                  U[+        X5      5        g )Nzinvalid source hasattr(r   rr  znot hasattr()provided_guarded_objectr  )r  r   rJ   r  r8   r{  r	  r  r   r  _set_guard_export_inforD  r  r   rM  rN  r`   rl   r  r  add_no_hasattr_guardri  )r   r   r   base_sourcer  r  refvalr  base_managerr  r  r  s                r   HASATTRGuardBuilder.HASATTRM  s   ))fn--[[F&*--M/MM-kk!}}ll4 dhhtnd+cU"THA.D!#b2D##6488D> 	$ 	
 99+F !HHV[[]3M!%$!%!<!<V!S
 -uxx??&'9:./ 00 &!KKM&  ,, ::"/'9	 -  --d4J44WXr   c                   Uc   eU R                  U5      nU R                  UR                  5      n[        U[        R
                  R                  5      (       d   eU R                  U5      nUR                   S3nUR                  UU R                  UR                  5      [        R                  S9nSU< SU S3nUR                  SU[        X5      5        g )Nr  r  znot ___dict_contains(r   z
.__dict__)F)r  r  r{  r   r   rM  rN  r  r  r  r  r  r  add_dict_contains_guardri  )	r   r   r  r  r  r  r  r  r  s	            r   NOT_PRESENT_IN_GENERIC_DICT(GuardBuilder.NOT_PRESENT_IN_GENERIC_DICT  s    ll5!hhuzz"#uxx////--e4"ZZL	2#/#H#H"FFs||T/== $I $
  'thbZ@ 884/<	
r   c                4   [        U R                  UR                  5      5      nU R                  USUR                   S35      nSU R	                  U5       SU S3nU R                  X/5        U R                  U5      R                  U[        XA5      5        g )Ntype(rr  z___check_type_id(r   )	rs  r  r{  r  r  r  r  add_type_match_guardri  )r   r   r   r   r  s        r   
TYPE_MATCHGuardBuilder.TYPE_MATCH  s    %**%&Q%

|1 56"4<<#6"7r&C##E62u%::*47	
r   c                ,   U R                  U5      nU R                  UR                  5      n[        U R                  UR                  5      5      nSU SU 3nU R	                  X/5        U R                  U5      R                  U[        XQ5      5        g )Nz___dict_version() == )r  r  r{  r   r  r  add_dict_version_guardri  )r   r   r  r  versionr  s         r   DICT_VERSIONGuardBuilder.DICT_VERSION  s    ll5!hhuzz"txx

34!#eG95##E62 	u%<<'4	
r   c                    U R                  U5      nU(       a  SOSnU SU< SU S3nU R                  X/5        U R                  U5      R                  U(       + U[	        Xa5      5        g )Nnot r   z___dict_contains(r   rr  )r  r  r  r  ri  )r   r   r  invertdict_ref	maybe_notr  s          r   DICT_CONTAINSGuardBuilder.DICT_CONTAINS  sj    <<&$F"	-cWBxjB##E62u%==J3D@	
r   c                   [        UR                  [        5      (       a=  U R                  [	        UR                  R
                  [        R                  5      5      $ U R                  U5      nU R                  UR                  5      nU R                  X1R                  5      nSU SU S3nU R                  X/5        U R                  U5      R                  U[        XQ5      5        [        UR                  [        5      (       ad  [        U[         R"                  R$                  5      (       a:  UR                  R&                  nU R)                  U5      nUb  XpR*                  U'   g g g g )Nz___check_obj_id(r   rr  )r   r  rR   r  r"   r  r  r  r  r{  r  r  r  r  ri  rI   r   rM  rN  rG  r  r   )r   r   r  r  r  r  rG  weak_ids           r   ID_MATCHGuardBuilder.ID_MATCH  s.   e..
;;??e..33\5L5LM  ll5!hhuzz"S**-!#b2##E62u%88*47	
 e..<< #uxx//"55@@
..s3&7>((4 ' 0	 =r   c                   U R                  U5      nU R                  UR                  5      n[        U[        R
                  5      (       d   eU S3nU R                  X/5        U R                  U5      R                  [        XQ5      5        g Nz is not None)
r  r  r{  r   r   Tensorr  r  add_not_none_guardri  )r   r   rz  r  r  r  s         r   NOT_NONE_MATCHGuardBuilder.NOT_NONE_MATCH  sv    ll5!hhuzz"#u||,,,,l###E62u%88"4/	
r   c                   U R                  U5      nU R                  UR                  5      n[        U[        R
                  R                  5      (       d   eU SU< S3nU R                  U5      R                  U[        XA5      5        g )Nz.raw_repr() == z.raw_repr())
r  r  r{  r   r   r   DispatchKeySetr  add_dispatch_key_set_guardri  )r   r   r  r  r}   s        r   DISPATCH_KEY_SET_MATCH#GuardBuilder.DISPATCH_KEY_SET_MATCH  su    ll5!hhuzz"#uxx667777uOC7+>
u%@@'
:	
r   c                F    U R                  US[        R                  5        g )Nr   )r  r  EQUALS_MATCHrn  s     r   
NAME_MATCHGuardBuilder.NAME_MATCH  s      
L4M4MNr   c                    U R                  UR                  5      nU R                  U5       SUR                  5        3nU R	                  X/5        U R                  U5      R                  U[        X15      5        g )Nz.data_ptr() == )r  r{  r  data_ptrr  r  add_data_ptr_guardri  )r   r   objr  s       r   DATA_PTR_MATCHGuardBuilder.DATA_PTR_MATCH  si    hhuzz",,u%&oclln5EF##E62u%88'4	
r   c                   ^^ [         R                  R                  R                  mST 3/nU R	                  X/5        [         R                  R                  mUU4S jnU R
                  R                  R                  U[        X!5      5        g )Nz,torch.autograd.forward_ad._current_level == c                "   > TR                   T:H  $ r   )_current_level)r  
dual_level
forward_ads    r   fn#GuardBuilder.DUAL_LEVEL.<locals>.fn  s    ,,
::r   )	r   autogradr  r  r  r   ry   ry  ri  )r   r   r  r  r  r  s       @@r   
DUAL_LEVELGuardBuilder.DUAL_LEVEL  st     ^^..==
>zlKL##E62^^..
	; 	00&t3	
r   c                  ^^ [         R                  R                  R                  5       nU Vs/ s H  o3R	                  5       PM     snmST S3/nU R                  X5        [         R                  R                  R                  mUU4S jnU R                  R                  R                  U[        XA5      5        g s  snf )Nz5torch._functorch.pyfunctorch.compare_functorch_state(rr  c                   > T" T5      $ r   r   )r  
compare_fnstatess    r   r  .GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn  s    f%%r   )r   
_functorchpyfunctorch#retrieve_all_functorch_interpreters	get_stater  compare_functorch_stater   ry   ry  ri  )r   r   ciscir  r  r  r  s         @@r   FUNCTORCH_STACK_MATCH"GuardBuilder.FUNCTORCH_STACK_MATCH  s     **NNP+./3R,,.3/GxqQR##E0 %%11II
	& 	00&t3	
 0s   B>c                  ^^ U R                  UR                  5      m[        U R                  UR                  5      R                  5       S   5      m[	        TS5      (       a  [        T5        UU4S jnOU4S jnS[        U5       S[        R                  " 5        3nU R                  U5      R                  U[        X15      5        g )Nr1   __metadata_guard__c                J   > TR                  TU R                  5       S   5      $ Nr1   )r  r8  )r  original_metadatarz  s    r   metadata_checkerEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker#  s)    //%q';';'=a'@ r   c                0   > U R                  5       S   T:H  $ r  r7  )r  r  s    r   r  r  *  s    ++-a04EEEr   ___check_metadata__c)r  r{  r   r8  r   rm   r  r   current_compile_idr  ry  ri  )r   r   r  r/  r  rz  s       @@r   TENSOR_SUBCLASS_METADATA_MATCH+GuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH  s    $$TXXejj%9%L%L%Nq%QR5.//%e,F +2.>+?*@>CdCdCfBghu%664[H	
r   c                   U R                  U5      nU R                  UR                  5      n[        (       a  [        R                  [        R
                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  4nOSn[        [         4n[#        [$        [&        ["        [(        [*        [,        [.        [0        R2                  1UkUk-  5      n[0        R4                  R7                  5       (       a  SSKJn  SSKJnJ n	J!n
  UU
U	UU4-   nSS K"J#s  J$n  [K        X65      (       d2  URM                  ['        U5      5      (       d   S['        U5       35       e[K        U[N        5      (       a  [P        RR                  " U5      (       ao  U RU                  U5        / nURW                  SU S35        U RY                  X5        U R[                  U5      R]                  [_        5       S   [a        X5      5        g [K        U[b        5      (       a  [        RR                  " U5      (       ao  U RU                  U5        / nURW                  S	U S35        U RY                  X5        U R[                  U5      R]                  [_        5       S
   [a        X5      5        g U SU< 3/n[K        X55      (       a  [e        U5      nU R[                  U5      Rg                  U[a        X5      5        U RY                  X5        g )Nr   r   )
DeviceMesh)Partial	ReplicateShardzUnexpected type z__math_isnan(rr  rC  z__numpy_isnan(rD  r  )4r  r  r{  r  int8int16int32int64uint8uint16uint32uint64float16float32float64rh  r  rV  r^   rs  	frozensetsliceranger_   r   Sizedistributedis_availabletorch.distributed.device_meshr  (torch.distributed.tensor.placement_typesr  r  r  torch.utils._pytreerS  _pytreerd   is_constant_classrP  rN  rO  r  r  r  r  ry  rV  ri  complexr   r  )r   r   r  r  np_typesok_mutable_typesok_typesr  r  r  r  pytreer  s                r   r  GuardBuilder.EQUALS_MATCH2  s   ll5!hhuzz"2						





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


 
 "

 ))++@   	# H 	-,c$$(@(@c(K(K 	
tCyk*	
K
 #u$**S//OOE"DKK-uA./''4""5)::!#N3&t3  #wBHHSMMOOE"DKK.Q/0''4""5)::!#O4&t3  %tC7#$#(( 3-Cu%<<'4	
 	##E0r   c                    U R                  UR                  5      n[        U[        [	        S 5      [
        R                  45      (       a  U R                  U5        g U R                  U5        g r   )	r  r{  rd   r  rs  typesCodeTyper  r  r   r   r  s      r   CONSTANT_MATCHGuardBuilder.CONSTANT_MATCH  sJ    hhuzz"#d4j%..9::MM% e$r   c                N   U R                  U5        U R                  UR                  5      n[        US5      (       aC  [	        UR
                  [        5      (       d   eU R                  US[        R                  5        g [        R                  " SSS[        U5       S3S/S9  g )Ntrainingz-Attempted to guard on uninitialized nn.Moduler   zKAttempted to setup an NN_MODULE guard on uninitialized nn.Module subclass `z`.zIEnsure the `nn.Module` subclass instance has called `super().__init__()`.)gb_typecontextexplanationhints)r  r  r{  r   rd   r  r  r  r  r  r4   unimplemented_v2rs  r  s      r   	NN_MODULEGuardBuilder.NN_MODULE  s    ehhuzz"3
###,,----$$UJ8S8ST  G''+Cyk5 `r   c                $    U R                  U5      $ )z0things like torch.add and user defined functions)r  rn  s     r   FUNCTION_MATCHGuardBuilder.FUNCTION_MATCH  s    }}U##r   c                >   U R                  UR                  5      n[        U5      [        R                  :X  aT  [        US5      (       aC  U R                  US[        R                  5        U R                  US[        R                  5        gU R                  U5        g)z!matches a closure by __code__ id.__code__N)
r  r{  rs  r  FunctionTyper   r  r  r  r#  r  s      r   CLOSURE_MATCHGuardBuilder.CLOSURE_MATCH  sp    hhuzz"9***wsJ/G/G$$UJ8L8LM$$UJ8S8ST&r   c                $    U R                  U5      $ r   r#  rn  s     r   BUILTIN_MATCHGuardBuilder.BUILTIN_MATCH      ""5))r   c                $    U R                  U5      $ r   r+  rn  s     r   PYMODULE_MATCHGuardBuilder.PYMODULE_MATCH  r.  r   c                N   U R                  U5      nU R                  UR                  5      n[        U[        5      (       d  U R                  U5        / n[        U5      S:X  a  UR                  SU 35        O UR                  SU S[        U5       35        U R                  X5        [        U[        5      (       a4  U R                  U5      R                  [        U5      [        XA5      5        g U R                  U5      R                  [        U5      [        XA5      5        g )Nr   r  zlen(r  )r  r  r{  r   r:  r  rF  r  r  r  add_dict_length_check_guardri  add_length_check_guardr   r   r  rz  r  s        r   SEQUENCE_LENGTHGuardBuilder.SEQUENCE_LENGTH  s     ll5!$%&&OOE"u:?KK$se%KK$se5U56##E0eT""""5)EEE
24? ""5)@@E
24?r   c                   U R                  U5      nU R                  UR                  5      n[        U5      n/ nUR	                  SU S[        U5       35        U R                  X5        [        U5      nU R                  USUR                   S35      nU R                  U5      R                  [        U5      U[        XQ5      5        g )Nz___tuple_iterator_len(r  r  rr  )r  r  r{  rs  r  rk   r  r  r  add_tuple_iterator_length_guardri  )r   r   r  rz  r   r  r   s          r   TUPLE_ITERATOR_LENGuardBuilder.TUPLE_ITERATOR_LEN  s    ll5!$K,SE7I%7P6QRS##E0KQ%

|1 56u%EEu%v/Ed/R	
r   c           
        U R                  U5      nU R                  UR                  5      n[        U5      n/ n[	        U5      nUR                  SU SU 35        U R                  X5        [        U5      nU R                  USUR                   S35      nUu  pn
U R                  U5      R                  XX[        XQ5      5        g )Nz___normalize_range_iter(r  r  rr  )r  r  r{  rs  rg   r  r  r  r  add_range_iterator_match_guardri  )r   r   r  rz  r   r  normalized_range_iterr   startstopsteps              r   RANGE_ITERATOR_MATCH!GuardBuilder.RANGE_ITERATOR_MATCH  s    ll5!$K 4U ;.se59N8OPQ##E0KQ%

|1 561Tu%DD'=d'J	
r   c                   U R                  U5      nU R                  UR                  5       5      n[        UR                  5      (       d  [        U5      (       a  g X44nXPR                  ;   a  g U R                  R                  X445        U R                  R                  XC45        U SU 3/nU R                  X5        [        U R                  U5      U R                  U5      [        Xa5      5        g )N is )r  r{  r   r  r  r   r  r   r  rD  ri  )r   r   source_bref_aref_br  r  s          r   DUPLICATE_INPUTGuardBuilder.DUPLICATE_INPUT  s    U#X]]_-#$$
 
%h// n555++//?++//?'eW%&##E0%""5)..x8"4/	
r   c                    U R                  U5       S3/nU R                  X5        U R                  U5      R                  [	        X!5      5        g r  )r  r  r  r  ri  )r   r   r  s      r   WEAKREF_ALIVEGuardBuilder.WEAKREF_ALIVE  sJ    <<&'|45##E0u%88"4/	
r   c           	        U R                  U5      nU R                  UR                  5      n/ nUR                  SU S[	        UR                  5       5       35        U R                  X5        U R                  U5      R                  X45        g)z7Guard on the key order of types.MappingProxyType objectzlist(z.keys()) == N)	r  r  r{  r  rh  r  r  r  add_mapping_keys_guardr5  s        r   MAPPING_KEYS_CHECKGuardBuilder.MAPPING_KEYS_CHECK  ss    ll5!$eC5T%**,-?,@AB##E0u%<<UIr   c           
        U R                  U5      nU R                  UR                  5      nU[        R                  R
                  R                  L a  U R                  U5        gU R                  U5        / nUR                  SU S[        [        U5      5      < 35        U R                  X5        U R                  UR                  5      (       a  U R                  X15        gU R!                  X15        g)z6Insert guard to check that the keys of a dict are sameNr  z)) == )r  r  r{  r   rS  r  SUPPORTED_NODESr  r6  r  rh  r]   r  r!  r  r  r  r5  s        r   DICT_KEYS_MATCHGuardBuilder.DICT_KEYS_MATCH(  s    ll5!$EKK''777e$U#
 	ocU&6G6N1O0RST##E0++E,D,DEE--e;44UBr   c                R    [         R                  (       a  gU R                  U5        g)z\Special guard to skip guards on empty hooks. This is controlled by skip_nnmodule_hook_guardsN)r2   skip_nnmodule_hook_guardsr6  rn  s     r   EMPTY_NN_MODULE_HOOKS_DICT'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICTA  s    ++U#r   c                x    [         R                  " U R                  UR                  5      U R                  5        g r   )r5   watchr  r{  r  rn  s     r   OBJECT_MUTATIONGuardBuilder.OBJECT_MUTATIONH  s%    TXXejj143H3HIr   c                    g r   r   rn  s     r   	GRAD_MODEGuardBuilder.GRAD_MODEK      r   c                    g r   r   rn  s     r   DETERMINISTIC_ALGORITHMS%GuardBuilder.DETERMINISTIC_ALGORITHMSN  ra  r   c                    g r   r   rn  s     r   TORCH_FUNCTION_STATE!GuardBuilder.TORCH_FUNCTION_STATEQ  ra  r   c                    g r   r   rn  s     r   FSDP_TRAINING_STATE GuardBuilder.FSDP_TRAINING_STATET  ra  r   c                    UR                   [        R                  L d   eSSKJs  Jn  SUR                  < 3/nU R                  X5        U R                  U5      R                  [        X15      5        g)z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )r   r%   GLOBALtorch.utils._devicerS  rT  CURRENT_DEVICEr  r  add_default_device_guardri  )r   r   r/  r  s       r   DEFAULT_DEVICEGuardBuilder.DEFAULT_DEVICEW  se    ||{11111''1!2B2B1EFG##E0u%>>"4/	
r   c                	  ^ ^!^"^#^$ UR                   S:X  d   eT R                  R                  m$T$R                  m"T" Vs/ s H  o"R                  PM     snm#U$4S jnT$R
                  (       a  0 n/ n/ n0 n[        5       nT$R
                   Hn  n	U	R                  T$R                  ;   a<  [        R                  R                  R                  U	UT$R                  UUUUU5        MY  [        R                  S5        Mp     [!        UU[#        UR%                  5       5      USS9m!OS m!U!U"U#U$U 4S jn
[&        R(                  (       a  U
" S5      u  pnO
U
" S5      u  pT R                  R                  R                  (       d  T$R                  R+                  5         UR,                   H  nT R/                  X/5        M     [0        R2                  " 5       =n(       a%  UR4                  R7                  UR,                  5        [&        R(                  (       Gad  S	S KnS	S
KJn  W(       d   eUR,                  UR>                  nnU(       d  g / n/ nSnURA                  5        H  u  nn[C        U[D        5      (       a  SnM  T RG                  UR                  5       0 [H        E[K        5       ES9n[C        U[L        5      (       a  URO                  UU45        Mw  [C        U[P        5      (       a  URO                  UU45        M  SnM     U(       Gdl  [S        UU-   5      n [U        U5       VVs/ s H!  u  nnT RW                  [Y        UU5      5      PM#     nnnSR[                  S [U        U5       5       5      nSR[                  S [U        U5       5       5      nU(       a  SU S3nU(       a  SU S3n[\        R^                  " SU SU SSR[                  U5       S35      n[`        Rc                  SUUR,                  5        URe                  U5      nURg                  URh                  URj                  5      Rl                  n U (       d   e [o        U[q        U5      [q        U5      U UUR,                  5        g UR,                  (       a6  T Ry                  UR,                  UR,                  0 [H        E[K        5       ES9  g g s  snf s  snnf ! [        Rr                  Rt                  Rv                   a     N}f = f)Nr   c                   > TR                   U     Vs/ s H  n[        U[        R                  U5      PM      sn$ s  snf r   )tracked_fakes_id_to_sourcer   r   SIZE)t_idro  r   r  s      r   get_sources+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesm  sD    
 +EEdKKF %V^-@-@#FK  s   %;z+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsrelaxed_sources	warn_onlyc           
       > TR                   R                  T Vs/ s H  oR                  PM     snT Vs/ s H  oR                  PM     snTTTR                  TR
                  R                  R                  (       + U S9$ s  snf s  snf )N)input_contextsequalities_inputsr  ignore_staticlangs)	shape_envproduce_guards_verbosefaker   r  r  r  export)r  r#  r  re  r  r  r   s     r   _get_code_parts/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts  sx    ))@@!#$A$#%&2a2&-"3??#'#8#8#E#E#L#LL A 	 	$&s
   BB
)pythonverbose_pythoncpp)r  r  r   )CppCodeCacheT)r{   r   c              3  <   #    U  H  u  nu  p#U S U S3v   M     g7f)z = int_values[r  Nr   .0ir  symbols       r   	<genexpr>)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>  s*      0.MNA{ "(.15.M   c              3  <   #    U  H  u  nu  p#U S U S3v   M     g7f)z = float_values[r  Nr   r  s       r   r  r    s+      2.ONA{ "("21#Q7.Or  zint64_t ;zdouble z
                    #include <cstdint>
                    #include <cmath>
                    #include <c10/util/generic_math.h>

                    extern "C" 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  tracked_fakessymbolic_contextexport_constraintsr  rv  rt  r   r  dynamic_shapes_process_equalitiesr  r  r  r*   rh  rw  r2    enable_cpp_symbolic_shape_guardsfreezeexprsr  r   try_getshape_env_guardsr  ctypestorch._inductor.codecacher  source_to_symbolr   r   r<   r  r,   rV  r  r  rP  r:  r  rD  r   rr  textwrapdedentrt  ru  loadcastr   c_void_prz  r   rF  	_inductorr4   InvalidCxxCompilerr  )%r   r   r#  rw  namesry  rz  r{  r|  
constraintr  python_code_partsr~   cpp_code_partsr  compile_contextr  r  r}   r  int_source_to_symbolfloat_source_to_symbolpython_fallbackr   r  r  r  guard_managersint_symbols_strfloat_symbols_strfunc_strclibcguardr  re  r  r  s%   `                                @@@@r   	SHAPE_ENVGuardBuilder.SHAPE_ENVc  s    zzR,,99''689b,,b9	 **02E8:L   24O+.5O*==
??l&M&MMLL//CC"#$..$*''	 KK MN > !3)#5 $_%;%;%= > /! !%
	 
	 22DS3EA> 5D,51 $$1188""))+%++D''v6 , -4466?6,,334F4L4LM222>!!>$$// )J
 #% %'"#O"2"8"8":fn55&*O$(HH%L%L8I8K%L %- %M "-55,33VV4DE#M599.55vv6FG +/ #;" ##'(<?U(U#V 5 *33C)D&)DIAv ::=QR;ST)D # &
 '+ii 0.78L.M0 'O )-		 2.78N.O2 )%
 ',4_4EQ*G(.56G5H,J)' '' (() *'}}Z89 :
 H $$9 *00
 (,,X6D#[[V__EKKF!M6
 1&0123*00 
 ""55!''"((DD0A0CD 6  #U :b&P **== s*   S S )(SC9S S (S65S6c                   [         R                  (       a  UR                  5       (       a  g [        U5      (       a  U R	                  U5        g [        U[        5      (       a  U" 5       nUb  UOU R                  UR                  5      n[        U[        R                  5      (       d   eU R                  U5      n/ nU R                  R                  R                  (       a  U R                  U5        / SQnU H  nU R                  US-   U-   5      n[!        U[        R"                  [        R$                  45      (       a&  UR'                  SU SU S[)        U5      < 35        Mo  UR'                  U SU SU 35        M     GO|U R+                  U5      n[         R,                  (       a)  [!        U[        R.                  R0                  5      (       dU  [        UR2                  [4        5      (       d6  U R6                  R'                  U5        U R8                  R'                  U5        U R                  R                  n	U	R:                  UR2                     n
[=        U
S   5      n[=        U
S   5      n[?        [A        X#X5      U5      nURC                  UUUUU5        [        U[        R.                  R0                  5      (       d9  U R                  RD                  RF                  RI                  UR                  5        URJ                  c   e[M        USUR2                  S	9u  pU(       d  [O        US
5      (       aU  URP                  nSU SU SU S3nUR'                  U5        U R+                  U5      RS                  U[?        UU5      5        OBSU S3nUR'                  U5        U R+                  U5      RU                  S
[?        UU5      5        [W        U5      S:  a  U RY                  X5        g g )N)rw  rH  ry  zndimension()r  zstr(r  r  sizestrideT)	is_tensortensor_source_dynamo_dynamic_indicesz((z"._dynamo_dynamic_indices.issubset(z)) if hasattr(z', '_dynamo_dynamic_indices') else True)r  z%, '_dynamo_dynamic_indices') == Falser   )-r2   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler  r  r   r0   r  r{  r   r  r  r  r  r  r  rd   rH  rw  r  r  r  ,skip_no_tensor_aliasing_guards_on_parametersrM  	Parameterr  rK   r  r  input_source_to_sizes_stridesrp  ri  r  add_tensor_match_guardr   r   r   r   ri   r   r  add_dynamic_indices_guardr  rF  r  )r   r   rz  tensor_namer  termsterm
real_valuer   r  metadatar  r  r~   static_reasondynamic_indicesr  s                     r   TENSOR_MATCHGuardBuilder.TENSOR_MATCH  st   11e6J6J6L6L "%((MM% %//".EDHHUZZ4HEeU\\2222,,u-K, !D$$1188& "D!%+*;d*B!CJj5<<*EFFd;-qeC
OCV$WX{m1TF$zl$KL " !% 6 6u = GGuehh&8&899$U%=%=?PQQ 1188E::AA-P#44AA'EE,, 2(62BC3HX4FG%;.u4P&" 44& "%););<<))77JJNN

@ <<+++<U5M5MOF 5";<<&+&C&CO"$[M1STcSddrs~r  @g  !hIKK	***51KK')?	5)Q #;-/TU  KK	***51FF1.y%@ 4y1}++E8 r   c                >   [        5       nUc   eUR                  nAUc   eUR                  R                  nAX`R                  R
                  ;   d
   SU 35       eUc'  UR                  nU(       d  S OU R                  U5      nOUnUb  [        R                  " [        U5      5      OS n	S n
[        UR                  SS5      S:g  nU(       a;  [        U[        R                  [        45      (       d  [        R                  " U5      n
UR!                  UU	UU
5        g )NzH_produce_guard_code must be called from inside GuardedCode. Called from __weakrefoffset__r   )r   f_backr  co_namer   r  r{  r  weakrefr  rs  rP  r   enumEnumrV  set_export_info)r   r   r  r  	cur_framecaller	func_namer{  guarded_objectguarded_object_typeobj_refsupports_weakrefs               r   r  #GuardBuilder._set_guard_export_info  s    !N	$$$!!!!!MM))	NN333 	
VW`Vab	
3
 #*::D)-T488D>N4N 2@1KGKK^,-QU 	  N,,.A1EJ 	 J~		5?Q$R$Rkk.1G		
r   )r  r  r  r  r  r  r   r   r  r  r  r  r  r  r  r  )r  types.CodeTyper  zCallable[[Any, str], str]r  zCallable[[Source], str]r  z)Callable[[object], ReferenceType[object]]r  dict[str, object]r   r  r   ru   r  CheckFunctionManager)r   r"   rx   r   )r{  r  r{   zOptional[dict[str, Any]]returnr   )r   zUnion[str, Guard]r  r  )r   r"   r  r  )r   r"   r  None)r   r"   r  r  r  r  ):r   r   r   r   r   r  r  staticmethodr  r  r!  r  r'  r,  rD  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r#  r(  r,  r0  r6  r:  rB  rI  rL  rP  rT  rX  r\  r_  rc  rf  ri  rp  r  r  r  r   r   r   r   r  r  `  s   =J=J *=J ,	=J
 C=J '=J (=J +=J /=J~8$L  "Sj9	"?
\|
L SF4 4Yl
(	

	
?<	

O

 
$
*_B%"$'**4
 
&
4
JC2$J

wrZ9z)
r   r  c                     \ rS rSrSr\R                  \R                  \R                  4r	\
R                   " S S5      5       r " S S\R                  5      r " S S\R                  5      rSS	 jrSSS
 jjrSS jrSS jrSrg)PyExprCSEPassi  r1   c                  *    \ rS rSr% S\S'   S\S'   Srg)PyExprCSEPass.Configi  zdict[str, int]
expr_countzdict[str, str]expr_to_namer   Nr  r   r   r   Configr    s    ""$$r   r  c                  6   ^  \ rS rSrSS jrSU 4S jjrSrU =r$ )PyExprCSEPass.ExprCounteri	  c                    Xl         g r   _config)r   r2   s     r   r   "PyExprCSEPass.ExprCounter.__init__	  s    !Lr   c                   > [        U[        R                  5      (       a*  U R                  R                  [        U5      ==   S-  ss'   [        TU ]  U5        g r  )r   r  ALLOWED_NODE_TYPESr  r  r\  r   r   )r   r   r   s     r   r   PyExprCSEPass.ExprCounter.visit	  sA    $ @ @AA''T(:;q@;GM$r   r  )r2   r  r  r  r   ast.ASTr  r   r   r   r   r   r   r   r   r   r   s   @r   ExprCounterr  	  s    	"	  	 r   r  c                  H   ^  \ rS rSr      SU 4S jjrSU 4S jjrSrU =r$ )PyExprCSEPass.Replaceri	  c                H   > [         TU ]  5         Xl        X l        / U l        g r   )r   r   r  	_gen_namepreface)r   r2   gen_namer   s      r   r   PyExprCSEPass.Replacer.__init__	  s!    
 G!L%N&(DLr   c                J  > [        U[        R                  5      (       a  [        U5      nU R                  R
                  U   [        R                  :  a  X R                  R                  ;  ac  [        TU ]%  U5      n[        U5      nU R                  5       nU R                  R                  U SU 35        XPR                  R                  U'   OU R                  R                  U   n[        R                  " U[        R                  " 5       5      $ [        TU ]%  U5      $ )Nz = )r   r  r  r\  r  r  USE_THRESHOLDr  r   r   r  r   r  rY  NameLoad)r   r   exprnode_expr_var_namer   s         r   r   PyExprCSEPass.Replacer.visit	  s    $ @ @AA#D) <<**40=3N3NN<<#<#<< !&d 3 ,U 3#'>>#3++xjE7,CD:B11$7#'<<#<#<T#B88Hchhj997=&&r   )r  r  r   )r2   r  r  zCallable[[], str]r  r  r  r  r   s   @r   Replacerr  	  s.    	)(	) (	) 		)	' 	'r   r  c                f    SU l         U R                  [        R                  " S 5      0 S9U l        g )Nr   c                     gr   r   r   r   r   r=  (PyExprCSEPass.__init__.<locals>.<lambda>4	  s    qr   )r  r  )_counterr  rK  defaultdictr  r   s    r   r   PyExprCSEPass.__init__1	  s.    {{"..y9 # 
r   c                P    U U R                    3nU =R                   S-  sl         U$ r  )r  )r   r   r{  s      r   _new_varPyExprCSEPass._new_var7	  s'    $--)r   c                    U R                  U R                  5      nU H)  n UR                  [        R                  " U5      5        M+     g ! [
         a'  n[        R                  SUR                  U5        e S nAff = f)Nz#Failed to visit expr at line %s.
%s)	r  r  r   rY  parseSyntaxErrorr  	exceptionlineno)r   r  countereexs        r   countPyExprCSEPass.count<	  sd    ""4<<0Aciil+   DbiiQRSs   %A
A="A88A=c                    U R                  U R                  U R                  5      nUR                  [        R
                  " U5      5      nUR                  [        U5      4$ r   )r  r  r  r   rY  r  r   r\  )r   r  replacernew_nodes       r   r[  PyExprCSEPass.replaceE	  sF    ==t}}=>>#))D/2h!777r   )r  r  N)r  r  )_var)r   r  r  r  )r  r  r  r  r  r  r  ztuple[list[str], str])r   r   r   r   r  rY  	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr  NodeTransformerr  r   r  r  r[  r   r   r   r   r  r    sx     M --3==A% % % coo  #'3&& #'J

8r   r  c                    [        U R                  [        5      =(       d3    [        R                  =(       a    U R
                  [        R                  L $ r   )r   r  r>   r2    guard_nn_modules_using_dict_tags	create_fnr  r   )r   s    r   must_add_nn_module_guardsr0  K	  s@    
 	5++^< 	
 33 :<#9#99r   c                  .   ^  \ rS rSrU 4S jrS rSrU =r$ )DeletedGuardManagerWrapperiY	  c                .   > [         TU ]  5         Xl        g r   )r   r   invalidation_reason)r   reasonr   s     r   r   #DeletedGuardManagerWrapper.__init__Z	  s    #) r   c                    S U l         g r   )rz   r   s    r   r   6DeletedGuardManagerWrapper.populate_diff_guard_manager^	  s
    #r   )rz   r4  )r   r   r   r   r   r   r   r   r   s   @r   r2  r2  Y	  s    *$ $r   r2  c                  B    \ rS rSr   S	 S
S jjrS rS rS rS rSr	g)r  ig	  Nc           
       ^ ^^ U(       a  UR                   OS n0 T l        [        U5      n[        5       T l        UT R                  l        UT l        S mU(       a  UR                  OS T l        U4S jn[        UT R                  UT R                  UR                  UR                  T R                  T 5      nS n	[        R                  " X5      m[        R                   =(       a    [#        S5      n
[#        S5      (       d  [$        R'                  S5        [)        U=(       d    S[*        R,                  S9 Hw  nU
(       d\  UR/                  5       (       aG  SUR0                  ;  a7  SUR0                  ;  a'  [        R2                  (       d  S	UR0                  ;  a  Mf  UR5                  U5        My     T R7                  XU5        UR8                  T R                  l        [:        R=                  S
T R                  5        UR8                  T R                  l        SmUR>                  (       d  T R                  RA                  UR                  5      (       dB  [C        T R                  UR                  [D        RF                  " 5       5      n[I        SU 35      e[J        b   [K        T R                  UR                  5        [M        T R                  RN                  UR                  S5      m[:        R=                  STS 5        [P        RR                  " S[U        T5      5        [V        RX                  R[                  SUU 4S jS9  T R                  R]                  5         S T l        g )Nc                   > U R                  5       nU[        R                  L a  U R                  5       $ T(       d   eT" 5       nUc   eUR	                  U R                  5       5      $ r   )guard_sourcer%   CONSTANTr{  r  )r   r<  	r_builder	w_builders      r   r  1CheckFunctionManager.__init__.<locals>.source_ref	  s]    !..0L{333{{}$9!I((($$V[[]33r   c                0    U " 5       nU(       a  S Ul         g g r   )r  )weak_br<  s     r   cleanup_builder6CheckFunctionManager.__init__.<locals>.cleanup_builder	  s    A r   z!pytorch/compiler:guard_nn_modulesz9guard_nn_modules is turned off using justknobs killswitchr   )r  r]  r_  hooks%sg        zGuard check failed: 2   zGuard eval latency = %s us.2fguard_latency_usdynamo_cpp_guards_strc                 *   > TR                    ST S S3$ )Nz
Guard latency = rH  z us)r   )latencyr   s   r   r=  /CheckFunctionManager.__init__.<locals>.<lambda>	  s    $"4"4!55GPS}TWXr   
payload_fn)/rp   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesru   r   r   r  torch_function_mode_stackr  r  r  r  r   r  r  r2   guard_nn_modulesr)   r  r  r   r"   sort_keyr  r{  rW  r  compile_check_fnr   rt  ru  r  r  get_guard_fail_reason_helperr   r  rb  rn   r   ry   r   increment_toplevelr  r   _loggingtrace_structuredclear)r   r  r  r   r   rp   existing_diff_guard_sourcesr  builderrC  guard_on_nn_modulesr   reasonsrL  r?  s   `            @@r   r   CheckFunctionManager.__init__h	  s    )5$$$;= B+N 	$ 120K-(	
 7CL22 	&	4 KK  $$%%	
	 KK9	$55 
//;
 BCCKKSTFLbenn=E'2244 #%**4$EJJ655

9RLL! > 	g}= .5-D-D*t112-4-D-D* ""%%++L,D,DEE6&& ,,"557
 %';G9%EFF,8-&&(@(@ ,""'')A)A2G 9gc]L 112Dc'lS 	''#X 	( 	
 	 r   c                 	  ^^^ UR                   nUS/-  n[        R                  S5        / m/ m/ m[        U R                  5      nU R
                  R                  R                  S/5        U R
                  R                  R                  U R                  S/5        S U l        SUUU4S jjn[        5       nUR                   HA  nUR                   H.  n	X;  d  M
  U" XR                  S5        UR                  U	5        M0     MC     UR                  n
S nS n[        U
5      S:  a-  [!        UR"                  U
SS	R%                  U
5      -   S
-   /5        U R&                  (       a*  U R&                  R(                  R*                  R,                  O/ nU GHf  n[/        U[0        5      (       as  UR2                  nUR4                  nUR7                  5        SUR7                  5        3n[9        UR;                  U5      UR;                  U5      U/5        U" US S5        M  [/        U[<        5      (       a  UR>                   Vs/ s H  nUR;                  U5      PM     nnUR@                   Vs/ s H  nUR;                  U5      PM     nnSS	R%                  S UR>                   5       5       SS	R%                  S UR@                   5       5       S3n[C        UUU/5        U" US S5        GM[  [E        SU 35      e   URF                   H)  nUR                   H  n	U" XR                  S5        M     M+     T(       a"  [H        RJ                  RM                  SU4S jS9  [N        RP                  nUc  [N        RR                  " 5       nUUURT                  US.[V        E[Y        5       EnU R
                  R[                  5         SUR\                  S   0n[        T5      S:X  d   eUU R
                  l/        X@R
                  l0        U R
                  Rc                  5         TU R
                  l2        UU R
                  l3        X0R
                  l4        S U R
                  l5        S U R
                  l6        XR
                  l7        g s  snf s  snf )Nz**___kwargs_ignoredzGUARDS:z___check_global_state()z$___check_torch_function_mode_stack()c                P  >^ ^ [        T T5      n[        R                  SU5        TR                  U U4S j5        [        R                  [        R                  5      (       a  SnSnTbz  TR                  (       a,  SSR                  TR                  R                  5       5       3nTR                  (       a,  SSR                  TR                  R                  5       5       3n[        R                  ST UU5        U(       d#  TR                  T 5        TR                  U5        g g )NrF  c                   > T T(       a?  TR                   (       a.  [        R                  " TR                   R                  5       5      OS T(       a3  TR                  (       a"  [        R                  " TR                  5      S.$ S S.$ )N)r  rb  r_  )rb  r(   from_tracebackrc  r_  )r  r   s   r   r=  NCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>
  sc    % !U[[ #11%++2E2E2GH! !U%5%5 #11%2B2BC "r   r   z
Stack:
z
User stack:
zGuard: %s%s%s)rf  rt  ru  r  verbose_guards_logisEnabledForloggingDEBUGrb  rr  formatr_  )	r  r   log_onlyr  maybe_stackmaybe_user_stackr}   structured_guard_fnsr~   s	   ``    r   add_code_part<CheckFunctionManager.compile_check_fn.<locals>.add_code_part
  s     5i GT#45 ''  "..w}}== #% ${{(22775;;;M;M;O3P2Q&R''-bgge6F6F6M6M6O.P-QR ) #((#$	 !!),"))*;< r   Tr1   zcheck_no_aliasing(r   rr  rE  zcheck_overlapping(overlapping=[c              3  @   #    U  H  oR                  5       v   M     g 7fr   r{  r  r   s     r   r  8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>o
  s     /\B[QB[   z], non_overlapping=[c              3  @   #    U  H  oR                  5       v   M     g 7fr   rq  rr  s     r   r  rs  p
  s     3dFcFFHHFcrt  z])zUnknown GuardEnvExpr: dynamo_guardsc                 <   > T V s/ s H	  o " 5       PM     sn $ s  sn f r   r   )frm  s    r   r=  7CheckFunctionManager.compile_check_fn.<locals>.<lambda>
  s    BV4WBVQQSBV4W4Ws   rN  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr  r   r   )8r  rt  ru  $make_torch_function_mode_stack_guardrR  r   ry   add_global_state_guard#add_torch_function_mode_stack_guardr  r  r  r   r   r  rF  r   r  rr  r  tracing_contextguards_contextaotautograd_guardsr   r!   input_source_ainput_source_br{  r   rD  r'   overlapping_sourcesnon_overlapping_sourcesr   rO  r  r   rX  rY  r3   initial_global_stateGlobalStateGuardr  r,   rV  r   r  r{   r|   r  r~   r   r   r   r   r   )r   r\  
guards_outr   largs"torch_function_mode_stack_check_fnrn  seengclr  r  check_tensors_fncheck_tensors_verbose_fnr  r   source_arF  r  r   overlapping_guard_managersnon_overlapping_guard_managersglobal_stater{   r~  r}   rm  r~   s                           @@@r   rU  %CheckFunctionManager.compile_check_fn	  sa     '((#
CE-Q**.
*
 	668Q7RSCC**34	

 *.&'	= '	=R u<<C# "$		48HHTN &   $+#C#C #' '(1, -99(%		2J(KKcQR    --<<OO 	 (E%11 // //'}}/tHMMO3DE	-99(C99(CK
 it4E>22 #66.6 99!<6 + . #::2: 99!<: / 2
&&*ii/\%B[B[/\&\%] ^**.))3deFcFc3d*d)eegk 
 2.2K
 it4"%;E7#CDDA (H ))C dIIt4 & *  NN++,W ,  %99(99;L 0(@%1%7%72T	

 
  !
 	##% #W]]3%78 :!###*6'"'<<>0B-*>'+8( *.&)-&8P5G.2s   R.Rc                |   [        U S5      (       a  [        U R                  [        5      (       d  U R                  R                  =nbq  U R                  R
                  =nbW  [        U[        5      (       d   e[        U[        5      (       d   eSU S3n[        U5      nUR                  X%5        XPl        g g g g g )Nr   zCache line invalidated because z got deallocated)	r   r   r   r2  r   r   rW   rY   
invalidate)r   obj_strr   r   r5  deleted_guard_managers         r   r  CheckFunctionManager.invalidate
  s    
 D/**t113MNN $ 2 2 > >>K $ 2 2 > >>Kk:6666k:66666wi?OPF$>v$F!"";F!6 L L O +r   c                ,    [        U5      U R                  ;  a`  [        R                  " U5      U R                  [        U5      '   [        R                  " U[
        R                  " U R                  US95        [        U5      $ ! [         a     Nf = f)zadd a weakref, return the id)r  )	r  rP  r  r  r   	functoolspartialr  	TypeError)r   r  r  s      r   r  CheckFunctionManager.id_ref
  sw    
	#wdnn, +2++c*:r#w'  **4??GL
 #w  		s   A9B 
BBc                f    [        U5      U R                  ;   a  U R                  [        U5         $ g)zFLookup the _weakrefs created in id_ref function for ID_MATCH'd objectsN)r  rP  )r   r  s     r   r  $CheckFunctionManager.lookup_weakrefs
  s(    c7dnn$>>"S'**r   )rP  r   r  rR  )NNN)r   z%Optional[Callable[[GuardFail], None]])
r   r   r   r   r   rU  r  r  r  r   r   r   r   r  r  g	  s6     ?CN!
 =N!`pQd7"r   r  c                (  ^	 SSK Jn  [        5       m	T	R                  U 5        SU	4S jjnU" 5       nU  H]  nU" U5      u  peUR	                  U5        UR                  SU S35        UR                  5          UR                  S5        S S S 5        M_     U" 5       nUR                  S5        UR                  5          UR                  U5        UR                  S5        S S S 5        U" 5       nUR                  S	U S35        UR                  5          UR                  U5        UR                  S
5        S S S 5        UR                  5       UR                  5       4$ ! , (       d  f       GM;  = f! , (       d  f       N= f! , (       d  f       NR= f)Nr   r   c                &   > TR                  U 5      $ r   )r[  )r  csepasss    r   r[  %build_guard_function.<locals>.replace
  s    t$$r   zif not (z):zreturn Falsezdef guard(L):zreturn Truezdef ___make_guard_fn(zreturn guardr%  )	r   r   r  r  r   r   r   splicer   )
r}   closure_argsr   r[  
guard_bodyr  r   r   make_guard_fnr  s
            @r   rs  rs  
  sH   4oGMM*%
  !Jg&xvR01   0 ! 	  E	OOO$	Z & 
 #$M3L>DE				U#/ 
   -"8"8":::% !  
 
 	s$   7E=#E2#F
E/	2
F 
Fc                 h    [         R                  R                  R                  R	                  S5      $ )Nrq   r   rX  	_internal	log_stateis_artifact_enabledr   r   r   is_recompiles_enabledr  
  s#    >>##--AA,OOr   c                 h    [         R                  R                  R                  R	                  S5      $ )Nrr   r  r   r   r   is_recompiles_verbose_enabledr  
  s$    >>##--AABVWWr   c                V   ^ U  Vs/ s H  n[        U5      PM     snmU4S jnU$ s  snf )Nc                    > [        5       n [        U 5      [        T5      :w  a  g[        TU 5       H  u  pU[        U5      :w  d  M    g   gr  )ra   rF  r   rs  )	cur_stacktymoder  s      r   check_torch_function_mode_stackMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stack  sE    13	y>SZ'E9-HBT$Z . r   )rs  )intial_stackr  r  r  s      @r   r~  r~  
  s-    *+lT!Wl+E
 +* ,s   &c                f   [        U R                  5      n[        R                  " [        5      nU R
                   H/  nXBS'   [        [        XBU5      5      nX5   R                  U5        M1     U Vs/ s H  n[        X6   5      S:  d  M  X6    PM     nnSR                  U5      nSU 3/$ s  snf )N__compile_source__r1   r   zDuplicate tensors found: )r:  r   rK  r  rh  r   r  r  r  rF  rr  )	r   r  r   ids_to_sourcer  	tensor_idr  duplicate_tensorsr5  s	            r   1recompilation_reason_for_no_tensor_aliasing_guardr    s    223L++D1M&AA-:)*tM?@	 ''6 B ,9+8CC@R<SVW<W=
=   YY()F'x011s   3B.	B.c                4    SSK nSnUR                  USU 5      $ )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   strip_local_scoper  !  s     +G66'5!$$r   c                   XR                   S   S.nUR                  U R                  5        / nSn/ nU R                  U5      nUR                  (       d+  UR
                  n[        U5      S:X  a  SUS   ;   a  SnOUn/ nU(       a  [        X5      nOU H  n[        U R                   5      n	XS'   [        5           [        XU5      n
 S	S	S	5        [        W
[        5      (       a	  U
(       d  Un
[        U
[        5      (       d  Mr  UR!                  U
5        [        5       (       a  M    O   U S
3SR#                  U5      -   n[%        U5      $ ! [         a    [        5       (       a   S	S	S	5        M  e f = f! , (       d  f       N= f)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.
r  r  Fr1   zDuplicate tensor foundr   Tr  Nr   z; )r   r  r{   r  resultr~   rF  r  r:  r/   r  	Exceptionr  r   r  r  r  rr  r  )r   f_locals
compile_idr  r^  no_tensor_aliasing_check_failedr~   guard_debug_infor   r   fail_reason
reason_strs               r   rV  rV  .  sw    !;!;C!@AE	LL++,G&+#$&$228< ""-@@ !"a''+=a+@@26/,%'"&C
 'D : :;L15-./1"&t5"AK 2 +t,,["+s++{+466' '* <r"TYYw%77JZ((! ! 466  21 	 21s*   ;E8=EE5(E83E55E88
F	c                f   [        U [        5      (       a  U SU R                   3$ [        XU5      n[        [
        U      R                  U5         U R                  b+  U R                  [        U=(       d    S[
        U   5      5        U$ ! [         a    [        R                  S5         U$ f = f)Nr   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   r2  r4  rV  rc   rh   r  r   r[   r  r  r  )r   r  r  r  r  s        r   get_guard_fail_reasonr  q  s     -!;<<R A ABCC-mzRJ=&'..z:
&&2''*8(8-:MN   
d	
 
s   8B B0/B0c                  ^ / mU b_  [        U R                  U R                  UR                  U R                  5      nU(       a  TR                  U5        U R                  n U b  M_  UR                  n[        5       =(       d
    [        5       nU(       d  [        R                  (       Ga	  [        5       (       a"  SR                  S [        T5       5       5      nO&[        R                  " SR                  T5      S5      nSU 3nSUR                    SUR"                   SUR$                   S[        R                  " US	5       3nU(       a:  [        5       (       a  [&        R)                  U5        O[*        R)                  U5        [        R                  (       a  [,        R.                  " U5      e[0        R2                  R5                  S
S U4S jS9  T$ )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  b   #    U  H%  u  pS U S3[         R                  " US5      -   v   M'     g7f)zguard z failures:
- N)r  r   )r  r  r5  s      r   r  :get_and_maybe_log_recompilation_reasons.<locals>.<genexpr>  s2      #!3IA <(8??64+HH!3s   -/rX  r  z-triggered by the following guard failure(s):
zRecompiling function z in :z    artifactc                     SSS.$ )Nrecompile_reasonsjson)r{  encodingr   r   r   r   r=  9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    '
r   c                    > T $ r   r   )r^  s   r   r=  r    s    7r   )metadata_fnrO  )r  r   r  r  r  r  nextr  r  r  r2   error_on_recompilerr  r  r  r   r  co_filenameco_firstlinenorecompiles_verbose_logru  recompiles_logr4   RecompileErrorr   rX  rY  )	r   framer5  r  do_recompiles_logfailuresguard_failure_detailsmessager^  s	           @r   'get_and_maybe_log_recompilation_reasonsr    s    G

!&%%NN""	
 NN6"!&& 
! <<D ./R3P3RF555(**{{ #!*7!3# H
  tyy'94@H<XJG 	 $DLL>d6F6F5GqI\I\H]]_4f=>@ 	 ,..&,,W5$$W-$$$$W--	NN##
 # $  Nr   c                   U n[        5       nU b:  UR                  U R                  R                  5       5        U R                  n U b  M:  Un U b;  X R                  l        U R                  R                  5         U R                  n U b  M;  U$ r   )r  r  r   r   r  r   r   )r   first_cache_entryacc_diff_guard_sourcess      r   rQ  rQ    s    #
 !U

!%%%%@@B	
 "&&	 
! $K

!7M!!4!!==?!&& 
! "!r   c                   [        SUR                   SUR                   SUR                   35        [        SSR	                  U R
                  5      -   S-   5        [        SSR	                  U R                  5      5        [        U 5        SU0U R                  EnU R                   H  n [        X`R                  U5        M     g !   [        SU 35         M2  = f)	NzERROR RUNNING GUARDS  r  zlambda r   z and
  r  zMalformed guard:
)
printr  r  r  rr  r|   r}   r{   r  r   )r   r  r  rx  lastr  r   s          r   guard_error_hookr    s     

~Qt/?/?.@$BUBUAVW 
)dii 2 23
3c
9:	#z}7789	-?M$>$>?K))	022K@ *	0&ug./s   -CCc              #  j   #    [        5       nU  H  nX!;  d  M
  Uv   UR                  U5        M!     g 7fr   )r  r   )seqr  r  s      r   uniquer    s+     5D=GHHQK s   33c                H   U(       a  X:w  a  [        U5      n[        U 5      n[        U5      (       d  [        U 5      (       a8  [        R                  " U R	                  5        SUR	                  5        S35      eX#:X  a#  [
        R                  " [        R                  US9$ g )Nz is alising zC. This is not supported. Please do a clone for corresponding input.)rF  )	r   r   r4   UnsafeScriptObjectErrorr{  r  r  r  rI  )
obj_sourcedupe_sourceser_source_is_localsource_is_locals       r   make_dupe_guardr     s     {02;?.z:/
 
1*==--??$%\+2B2B2D1E F> ?  1 $$\%A%AKXXr   )skipc                Z   SSK Jn  [        R                  [        R
                  5      =(       d#    [        R                  [        R
                  5      nUR                  5       R                  R                  R                  nU H$  n[        U[        5      (       d   eU" XSU S-   S9  M&     g)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   )TracingContextr1   )collect_debug_stackr  N)torch._guardsr  rt  rf  rg  rh  re  r  r  rv  r   r   r"   )r  rp   r  r  r   r   s         r   install_guardr  "  s     -$11 8		(	(	7  



-
-
;
;
?
?C%''''EJ r   )r   r  r  r  )r  r  r   r"   r  r  )r}   zUnion[str | list[str]]r   r"   r  r  )r  r  )r  ztuple[str, str])r   r  r  r  )r   r\   r  r  r  r    r  r  )
r   r\   r  r  r  r  r  r    r  r  )r  rX   r  r  )
r   r\   r  r  r  r  rx  r  r  r  )r  
__future__r   rY  r  rK  r)  r  r  rQ  r,  rg  rN  r  r  r  r  r  
contextlibr   r  r   r   typingr   r   r	   r
   r   r   r   torch.overridesrm  torch._C._dynamo.eval_framer   torch._C._dynamo.guardsr   r   r   r   r   r   r   r   r   r   torch._dynamo.sourcer   r   r   r   r   r   torch._dynamo.utilsr   r   r   r    r!   r"   r#   r$   r%   r&   r'   torch._loggingr(   torch._utils_internalr)   %torch.fx.experimental.symbolic_shapesr*   r+   r,   torch.utils._ordered_setr-   torch.utils._tracebackr.   r/   torch.utils.weakr0   r   r2   r3   r4   r5   
eval_framer6   r   r7   r8   r9   r:   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\   rS  r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   r  numpyr  ModuleNotFoundErrorsympyro   	getLoggerr   r  rX  getArtifactLoggerrt  r  r  re  ru   r$  	lru_cacher0  r1  rV  r\  r   r   r  rf  ri  rp  r  r  r  r*  r  r  r  r  r  r  r  r  r  r0  r2  r  rs  r  r  r~  r  r  rV  r  r  rQ  r  r  r  r  r   r   r   <module>r     s  " # 
          
     %    @ @ !    >    3
 
 
 & 1 
 0 O * 8 8 ,! ! ! ! ! ! ! ! !D     * FJ B I
  !^^--hA
11(LI99"  ^^55h@PQ ^ ^BT T
. 
. .2* 18/ hh&&:: 
%Q&Q/4QQ31 d#! ! $!&R
G   
tyy 
 T8 8B
# B
l4R8 R8j$!4 $g gT";JPX
+$2 
%@)@)@) @) 		@)F
   	
 	09'99x"200
0  0 	0
 0. % &D !" KG\  	Bs    N NN