
    Vh                   $   U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddl
mZ ddlmZmZmZmZmZ ddlmZ ddlZddlZddl Zdd	l!m"Z" dd
l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZFmGZGmHZH ddlImJZJ ddlKmLZLmMZM ddlNmOZO ddlPmQZQmRZRmSZSmTZT ddlUmVZV ddlWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZx ddlmyZymzZzm{Z{m|Z|m}Z}m~Z~ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dZded<   	 ddlZerddlmZ  ej0                  e      Zej6                  j9                  ed      Zej6                  j9                  ed      Zej6                  j9                  ed      Zej6                  j9                  ed       Z G d! d"      Zd# Z ejF                  d      d$        Zdad%ed&<   d' ZdRd(ZejP                  jR                  jT                  ZdSd)Z	 	 	 	 	 	 dTd*Zd+ Zd, Zd- Zd. Z ejb                  d/0       G d1 d2             Zd3 Zd4 Zejb                   G d5 d6             Z G d7 d8ejl                        Z ejF                  d      dUd9       Z G d: d;e<      Z G d< d=      Zd> Z G d? d@e      Z G dA dB      ZdVdCZdD ZdE ZdF ZdG ZdWdHZ	 	 	 	 	 	 	 	 dXdIZ	 	 	 	 	 	 	 	 	 	 dYdJZ	 	 	 	 dZdKZdL Z	 	 	 	 	 	 	 	 	 	 d[dMZ eVeȫ       dN ZdO ZddPdQZy# e$ r dZY w xY w)\a  
Core guard system for Dynamo that detects when compiled code needs to be recompiled due to
changes in program state. Guards are conditions that must remain true for previously-compiled
code to be valid for reuse.

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

The guard system is critical for Dynamo's ability to efficiently reuse compiled code while
maintaining correctness by detecting when recompilation is necessary due to changes in
program state, tensor properties, or control flow.
    )annotationsN)contextmanager)deepcopy)currentframe)Any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GenericAttrSource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    e Zd ZdZddZed        Zd Zd Zd Z	d Z
d	 Zdd
Zd Zd Zd Zd Zd Zd Zy)GuardManagerWrappera  
    A helper class that contains the root guard manager. An instance of this
    class is stored in the Dynamo cache entry, so that the cache entry can
    access the RootGuardManager stored in the "root" attribute and directly call
    the check_nopybind from C++.
    Nc                    |t               | _        n|| _        d | _        d | _        d | _        g | _        d | _        d | _        d | _        d | _	        d | _
        i | _        g | _        d| _        t               | _        y 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     D/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/guards.py__init__zGuardManagerWrapper.__init__   s    <(*DIDI# 	"& !!*,'.2+3=<    c              #  J   K   d| _         	 d  d| _         y # d| _         w xY wwrx   )r   r   s    r   '_preserve_print_no_tensor_aliasing_flagz;GuardManagerWrapper._preserve_print_no_tensor_aliasing_flag   s&     .2+	726D/$D/s   # #	 #c                j      fd fdfd  j                           j                  S )Nc                L   | j                         j                  v xs | j                         dkD  }t        | j	                         j                               D ]  \  }\  }}| |       |      z  z  } |r)j                  j                  | j                                |S Nr   )
get_sourcer   
fail_countsortedget_key_value_managersitemsadd)nodeis_diff_guard_nodeidxkey_mgrval_mgrr   visits        r   visit_dict_managerzJGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_dict_manager   s    !T%<%<<U@QTU@U  ,2++-335, F''gw #eGnuW~&EE"F
 "''++DOO,=>%%r   c                $   t        | t              rJ | j                         j                  v xs | j	                         dkD  }| j                         D ]  }| |      z  } |r)j                  j                  | j                                |S r   )
isinstancer   r   r   r   get_child_managersr   )r   r   	child_mgrr   r   s      r   visit_managerzEGuardManagerWrapper.collect_diff_guard_sources.<locals>.visit_manager   s    !$(8999 !T%<%<<U@QTU@U  "446 7	"eI&66"7 "''++DOO,=>%%r   c                J    | yt        | t              r |       S  |       S )NF)r   r   )r   r   r   s    r   r   z=GuardManagerWrapper.collect_diff_guard_sources.<locals>.visit   s,    |$ 01)$// &&r   )ry   r   )r   r   r   r   s   `@@@r   collect_diff_guard_sourcesz.GuardManagerWrapper.collect_diff_guard_sources   s,    	&	&	' 	dii&&&r   c                D    | j                          | j                          y N)r   populate_diff_guard_managerr   s    r   finalizezGuardManagerWrapper.finalize  s    '')((*r   c                    | j                  | j                        | _        | j                  r| j                  j	                          y y r   )clone_with_chosen_sourcesr   rz   r   update_diff_guard_root_managerr   s    r   r   z/GuardManagerWrapper.populate_diff_guard_manager  s=    #==d>U>UV ;;= r   c                D    fd}| j                   j                  |      S )Nc                (    | j                         v S r   )r   )node_mgrchosen_sourcess    r   	filter_fnz@GuardManagerWrapper.clone_with_chosen_sources.<locals>.filter_fn  s    &&(N::r   )ry   clone_manager)r   r   r   s    ` r   r   z-GuardManagerWrapper.clone_with_chosen_sources  s    	; yy&&y11r   c                    |j                   j                  }|j                         }|D cg c]
  }|dz   |z    }}|S c c}w )N: )	__class____name__r~   )r   guard
guard_namepartsparts        r   get_guard_linesz#GuardManagerWrapper.get_guard_lines  sF    __--
((*6;<dd"T)<< =s   >c                v    |j                         }|j                  j                  }|dz   |z   }|r|d|z   z  }|S )Nz	: source=, )r   r   r   )r   guard_manageraccessor_strsourcetss         r   get_manager_linez$GuardManagerWrapper.get_manager_line%  sF    ))+##,,Of$$$Ar   c                   t        |j                         j                               D ]  \  }\  }}|j                  d|        |j	                         5  |r5|j                  d| j                  |              | j                  ||       |r5|j                  d| j                  |              | j                  ||       d d d         y # 1 sw Y   xY w)NzKeyValueManager pair at index=zKeyManager: zValueManager: )r   r   r   	writelineindentr   construct_manager_string)r   mgrbodyr   r   r   s         r   construct_dict_manager_stringz1GuardManagerWrapper.construct_dict_manager_string-  s    '-c.H.H.J.P.P.R'S 		A#C#'7NN;C5AB ANN\$2G2G2P1Q#RS11'4@NN^D4I4I'4R3S#TU11'4@A A		AA As   A/CC	c           
        |j                         5  |j                         D ]  }t        |t        j                  j
                  j                  j                        r[| j                  r(d| _        |j                  | j                  |             o|j                  |j                  j                  g       |j                  | j                  |              t        |t              r| j                  ||       t        |j!                         |j#                               D ]I  \  }}|j%                  | j'                  |d|j)                                       | j+                  ||       K 	 d d d        y # 1 sw Y   y xY w)NFzaccessed_by=)r   get_leaf_guardsr   torch_C_dynamorq   NO_TENSOR_ALIASINGr   
writelinesr   r   r   r   r   zipget_accessorsr   r   r   reprr   )r   r   r   r   accessorr   s         r   r   z,GuardManagerWrapper.construct_manager_string9  sF   [[] 	?,,. AeUXX%5%5%<%<%O%OP::>C;(<(<U(CD % 8 8 OOD$8$8$?@A #/0223= (+!!#S%;%;%=( ?#) )))|HMMOCT5UV --i>?)	? 	? 	?s   EE::Fc                   ddl m}  G d d|      }| j                         5   |       }d|_        |j	                  dd       |j	                  d	d       |j	                  d
       | j                  | j                  |       t        | j                  d      r?| j                  j                         D ]"  }|j                  | j                  |             $ |j                         cd d d        S # 1 sw Y   y xY w)Nr   IndentedBufferc                  &     e Zd Zd Zd fd	Z xZS )=GuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefixc                :    d| j                   | j                  z  z  S )Nz| )_indenttabwidthr   s    r   prefixzDGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.prefixZ  s    t||dmm;<<r   c                N    |rt         |   |       y t         |   d|z          y )Nz+- )superr   )r   lineskip_prefixr   s      r   r   zGGuardManagerWrapper.__str__.<locals>.IndentedBufferWithPrefix.writeline]  s$    G%d+G%edl3r   F)r   
__module____qualname__r   r   __classcell__r   s   @r   IndentedBufferWithPrefixr   Y  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__zGuardManagerWrapper.__str__V  s    8	4~ 	4 99; 
	#+-DDMNN24N0NN0dNCNN-.))$))T:tyy">?!YYAAC AEOOD$8$8$?@A==?
	# 
	# 
	#s   CC22C;c                8    | j                   j                  |      S r   )ry   checkr   xs     r   r   zGuardManagerWrapper.checko  s    yyq!!r   c                8    | j                   j                  |      S r   )ry   check_verboser   s     r   r   z!GuardManagerWrapper.check_verboses  s    yy&&q))r   c                J     dd  fd  j                          y )NFc                    g }| j                         D ]5  }|j                  d      d   j                         }|j                  |       7 |S )N#r   )r~   splitrstripappend)
leaf_guardr}   verbose_code_part	code_parts       r   get_code_partszMGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.get_code_parts{  sT    J%/%B%B%D -!-33C8;BBD	!!),- r   c                j   | j                         D ]  }t        |t        j                  j                  j
                  j                        r'r>j                  j                   |             dbj                  j                   |              | j                         D ]
  } |        y rx   )
r   r   r   r   r   rq   r   r}   extendr   )r   r   r   r   r   tensor_aliasing_guard_seenr   s      r   r   zDGuardManagerWrapper.populate_code_parts_for_debugging.<locals>.visit  s    ,,. BeUXX%5%5%<%<%O%OP5..~e/DE592OO**>%+@AB !335 !	i !r   )ry   )r   r   r   r   s   `@@@r   !populate_code_parts_for_debuggingz5GuardManagerWrapper.populate_code_parts_for_debuggingw  s!    %*"		! 	diir   r   )r   r   r   __doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rv   rv      s_    @, 7 7/'b+>2
A?:#2"*r   rv   c                    t         j                  j                         5  t        | t        j
                  t        j                  f      rt        j                  |       n| cd d d        S # 1 sw Y   y xY wr   )r   	overrides_enable_torch_functionr   npgenericndarray	as_tensor)as    r   
from_numpyr    sR     
	/	/	1 T%/BJJ

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

 |
  D
 $%7
 &';
 ()?
 23S
 DJJ
 RZTRXX
 5<
 Y44
 EKK//
  ell!
" Z#
$ "55)
, r   c                L    t        j                  |       j                  dd      S )N
r   )astunparsereplace)r   s    r   _ast_unparserC    s    ;;t$$T2..r   c                    d}||j                   rCt        |j                         D ]*  }|j                  t               vsdt	        |d       } n7 n5|j
                  r)dt	        |j
                  j                         d          }| d| S )Nr   z  # T)r   z<60)
user_stackreversedfilenamer  r.   stacksummary)r   r   extrafss       r   get_verbose_code_partrM    s    Eu//0 ;;&9&;;"<#>"?@E [[<(;(;(=b(ABCDE_UG$$r   c                f    t        | t              s| g} | D cg c]  }t        ||       c}S c c}w r   )r   listrM  )r}   r   r   s      r   get_verbose_code_partsrP    s1     j$' \
EOP	!)U3PPPs   .c                    g }| D ]d  }t        |      s|j                  |        t        |t        j                        sJ |j                  |j
                  j                                f |S r   )r+   r   r   r   SymIntr   maybe_as_int)size_or_stride	converteddims      r   convert_to_concrete_valuesrW    sc    %'I 63S!c5<<000SXX22456 r   c                |   t        |       }t        j                  j                  |       t        j                  j	                         z  t        j                  j                         z
  }| j                  }| j                  j                  }| j                  }d| d|j                   d| d| d| d| d| d| d}	|	S )Nzcheck_tensor(r   z	, device=z, requires_grad=z, size=z	, stride=))typer   r   _dispatch_keys_dispatch_tls_local_include_set_dispatch_tls_local_exclude_setdtyper/  indexrequires_gradr   )
valuenamesizesstridespytypedispatch_keyr^  device_indexr`  	guard_strs
             r   get_tensor_guard_code_partri    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    t        t        |             j                  |      S r   )rO  r^   r_  )dctkeys     r   get_key_indexrm    s     
 !#&'--c22r   c                    d|  d| dS )Nlist(dict.keys())[]r  )r   r_  s     r   get_key_index_sourcerr    s    VHCwa00r   T)frozenc                  8    e Zd ZU dZded<   dZded<   dZded<   y)NNModuleAttrAccessorInfoFboolpresent_in_generic_dictNzOptional[str]l1_keyl2_key)r   r   r   rw  __annotations__rx  ry  r  r   r   ru  ru  
  s'     %*T) !FM  !FM r   ru  c                t   | j                   j                         }t        | j                  t              r| j                  j                  }n(t        |t
              sJ t        || j                        }t        ||      }t        t        |            |   }t        |t        t        f      r	| d|d}	n| d| d}	t        | j                  t              sM|j                  ||| j                  t        j                        j                  | j                  | d|g       |j!                  ||	||      S )N[rq  r_  r   example_valueguard_manager_enum == )baserb  r   r_  r=   r"  rm  rr  rO  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_namer_  
key_sourcekey_example_valuevalue_sources
             r   getitem_on_dict_managerr    s:    {{'')&,, 23"",d3330&,,?%&6>J ./ABCEJ#c3Z0*+1->,AC*+1ZL:fll$67 	** ,,/==	 	+ 	

 !
 LLj\.?-BCD
 //#-	 0  r   c                    | j                   }t        |t              ry| j                         ry|j	                         xr t        |t
               S NFT)originating_sourcer   rL   is_specialized_nn_moduleis_dict_keyrH   )r   r   s     r   match_on_id_for_tensorr  B  sJ    %%F &+,%%'F
6:(F$FFr   c                  "    e Zd ZU ded<   ded<   y)GuardCodeList	list[str]	code_listr"   r   Nr   r   r   rz  r  r   r   r  r  Q  s    Lr   r  c                      e Zd ZdZdZy)r  r1      N)r   r   r   r  DICT_GUARD_MANAGERr  r   r   r  r  W  s    Mr   r  c                <    t        t        t        |                   S r   )rO  rG  r   )codes    r   &code_framelocals_names_reversed_cachedr  \  s    /5677r   c                     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6dZd Zd Zed        Zd Zd Z	d Z
d Zd	 Zd
 Zd7dZ	 	 d8dZd9d:dZd;dZd<dZd7dZd9d=dZd=dZd7dZd>dZd7dZd9d7dZd7dZd7dZd7dZd7dZd7dZd7dZd7dZ d7dZ!d7d Z"d7d!Z#d7d"Z$d7d#Z%d7d$Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d7d-Z/d7d.Z0d7d/Z1d7d0Z2d7d1Z3d7d2Z4d7d3Z5d9d7d4Z6d9d5Z7y)?GuardBuilderc	                *   || _         || _        || _        || _        ||d| _        t
        j                  j                         | j                  d<   t        j                  j                  j                  j                         D ]X  \  }	}
|	j                  dd      j                  dd      j                  dd      }	|
| j                  d   |	<   |
| j                  |	<   Z || _        g | _        g | _        g | _        g | _        g | _        || _        t+               | _        | j(                  j.                  j0                  D ]5  }| j,                  j3                  t5        | j7                  |                   7 i | _        i | _        t+               | _        y )NLG__builtins__>_<._dot_)f_codeid_ref
source_reflookup_weakrefsscopebuiltins__dict__copyr   packagepackage_importer_package_imported_modulesr   rB  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  rb  package_modulesource_names               r   r   zGuardBuilder.__init__b  s|    $.9D<3X
%-%6%6%;%;%=

>" ]]++EEKKM	. 
<<S)11#s;CCCQD/=DJJ~&t,-DJJt	. +#%)+	
 46 46%LN.6F +.%'00==PP 	KK++//488K3H0IJ	K BD
  	# EHE+r   c                \   | j                  |      }t        |t              rt        d|j                         |j
                  j	                         }t        |      D ]K  }||   }t        |j
                  |      }| j                  ||      }|j                  || d|d||       M y )NzsNot expecting a DictGuardManager. Seems like Dynamo incorrectly added the dict to tx.output.guard_on_key_order for )r_  r|  rq  rl  r   r~  r  )
get_guard_managerr   r   NotImplementedErrorrb  r  r^   r?   get_guard_manager_typedict_getitem_manager)	r   r~  r   dict_mgrdict_sourcerl  ra  r  r  s	            r   #guard_on_dict_keys_and_ignore_orderz0GuardBuilder.guard_on_dict_keys_and_ignore_order  s    ))%0h 01%FFKjj\S  ..335 %]3 	C!#&E,U-E-ESQL!%!<!<m" ))%awa0##5	 * 	r   c                   | j                  |      }t        |t              st        d|j                         t        |t              sJ t        t        |            D ]  \  }}t        |j                  |      }|j                  |||t        j                        }t        |      r6| j                  ||      }|j                  |t        d| d| d|             |j                  |t        | d||              y )Nz_Expecting a DictGuardManager. Seems like Dynamo forgot to set the right guard manager enum for r}  z__check_obj_id(r   rY  r  )r  r   r   r  rb  	enumerater^   rr  r  r  r  rf   r  add_id_match_guardrP  r  )	r   ra  r   r  r   rl  r  key_managerid_vals	            r   guard_on_dict_keys_and_orderz)GuardBuilder.guard_on_dict_keys_and_order  s    ))%0($45%;;@::,H  ($4555 ""3E":; 	HC-ejj#>J"22!!#3#A#A	 3 K ~S*5..*)*RxqA5 22/:,d3'0JER'	r   c                    t         j                  rAt        j                  dk\  r.t        j                  dk  rt	        j
                  dt               y | S )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_valuez4GuardBuilder._get_generic_dict_manager_example_value  sF     ''  G+  :-MM_ r   c                   d }|j                   }	|j                  }
t               }t        j                  |j
                        D ]+  }|j                  |j                  j                                - t        ddd      }|	|
v rt        d|	d      }nNd|
v r|	|
d   v rt        dd|	      }n5d|
v r|	|
d   v rt        dd|	      }n|	|vrd|
v r|	|
d   v rt        dd|	      }|j                  s|j                  |j                   |||      S |j                  sJ |j                  }|j                  }| d	}dx}}dx}}dx}}|rTt        |j                  |      }|j                         }|
|   }| j!                  ||      }|}|}| j!                  ||      }n|}|}| j!                  ||      }|j#                  || j%                  |
      t&        j(                  
      } |||||
||      }|r |||||||      S |S )a(  
        This tries to avoid calling the expensive nn module custom getattr method by
        checking if the attribute is accessible via __dict__. For attributes that
        are not accessible via __dict__ (like descriptors), we fallback to
        PyObject_GetAttr.

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

        The most common and expensive case for nn module guards is of type
        mod.submod1.submod2.submod3.training. We avoid the python getattr of nn
        modules by going through the __dict__.
        c                   t        | t              rct        ||      }d| d|d}| j                  |||t        j
                        j                  || d|g       | j                  ||||      S | j                  ||||      S )Nro  rp  rq  r}  r  r  )	r   r   rm  r  r  r  r  r  r  )r   rl  r  r  r~  r  r_  r  s           r   getitem_on_dict_mgrz>GuardBuilder.getattr_on_nn_module.<locals>.getitem_on_dict_mgr  s     #/0 &&8#>  /{m3uiqI
##%"%'7'E'E	 $ 
 )(*T#/I.JK ,,&"/'9	 -   //&"/'9	 0  r   FNT_parameters_buffers_modulesattrr   r~  r  	.__dict__r   r~  r  )r   rl  r  r  r~  r  )memberr  r  r  getmror   updatekeysru  rw  getattr_managerrx  ry  r8   r  rb  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_inforx  ry  mod_dict_sourcel1_source_namel2_source_namel1_valuel2_valuel1_guard_manager_enuml2_guard_manager_enum	l1_sourcemod_generic_dict_managerl1_mgrs                             r   getattr_on_nn_modulez!GuardBuilder.getattr_on_nn_module  s}   6	@ MM	%...1e! 2 < <= 	@A%,,QZZ__->?	@ 1dC 4T9dKMh&98O+O4T=)TM8#	Xj5I(I4T:yQM66h&Xj11 5T:yQM44 &55]]"+#5	 6   !''''"))F"))F "2 2)<O.22N^"&&Hx<@@!$9&v{{F;	!*!1#F+ )-(C(CIx(X%!,((,(C(CM)% "-((,(C(CM)% (:'R'R&"JJ8T#3#A#A (S ($ ),*#+&#8F * .'/"*'<  Mr   c                ~    |j                         }|dk(  ryt        | j                  |            }|| j                  v S )Nr   F)rb  r  r  r  )r   r   r  obj_ids       r   requires_key_order_guardingz(GuardBuilder.requires_key_order_guarding  s<    kkm"DHH[)*8888r   c                    t         j                  }| j                  |      rDt        |t              rt         j
                  }|S t        |t              sJ t         j
                  }|S r   )r  r  r  r   r`   r  r"  )r   r   r~  r  s       r   r  z#GuardBuilder.get_guard_manager_type  s^    -;;++F3-3%5%H%H" "! "-666%5%H%H"!!r   c                (    |t         j                  k(  S r   )r  r  )r   mgr_enums     r   manager_guards_on_keysz#GuardBuilder.manager_guards_on_keys  s    +>>>>r   c                    | j                   j                  j                  | j                  d   d| j                  d   t        j
                        S )Nr  )	f_globalsr   r~  r  )r   ry   globals_dict_managerr  r  r  r   s    r   get_global_guard_managerz%GuardBuilder.get_global_guard_manager  sH    !!&&;;jjo**S//==	 < 
 	
r   c           	     n   | j                   j                  }d }j                         }|dk7  r|| j                  v r| j                  |   S |dk7  r| j	                  |      }| j                  |      }d }d }d }t        j                  }	t        t              rbj                  j                         }| j	                  |      }| j                  j                        }| j                  j                  |      }	t        t              rt        j                  rbt!        | j"                        }
t%        |
      |
j'                  j(                        z
  dz
  }|j+                  j(                  |f|||      }n|j-                  j(                  |||      }nyt        t.              r/| j1                         j-                  j2                  |||      }n:t        t4              r/| j1                         j7                  j2                  |||      }nt        t8              r|S t        t:              r|S t        t<              r|sJ |j?                  |||      }nt        t@        tB        tD        tF        tH        f      r|sJ |}nt        tJ              r|jM                  fd|||      }nVt        tN              r|sJ |jQ                  |||      }n,t        tR              r%|sJ |jU                  jV                  |||      }nt        tX        tZ        f      rs|sJ t        |t\        j^                  j`                        r*tc        |      td        u r| jg                  ||||||      }n|ji                  jV                  |||      }nnt        tj              r|sJ t        |tl        tn        jp                  f      sJ t        |tr              r$| ju                  |	      sJ tw        ||||      }nt        j&                  tx              rt{        d	      |j-                  j&                  |||      }nt        t|              rH t        |d
j                  j                  j                          d      j                  |||      }nft        t              r%|sJ |j                  j                  |||      }n1t        t              r%|sJ |j                  j&                  |||      }nt        t              r|sJ t        |tl        tn        jp                  f      rJ d       t        |t              r-j                  s!|j                  j&                  |||      }nt        |t              r-j                  s!|j                  j&                  |||      }nGj&                  }j                  rj                         }|j                  ||||      }nt        t              r|sJ t        |      sJ j                  sK|j                  ||j                  t        j                        j                  j                  |||      }n|j                  }|J |dz   }|j                  ||t        j                        }t        |tr              rJ |j-                  j                  |||      }n&t        t              r|sJ |jM                  t        |||      }nt        t              r|sJ |jM                  d |||      }nt        t              r|sJ |jM                  d |||      }nt        t              r|sJ |jM                  d |||      }nst        t              r|sJ |jM                  d |||      }nGt        t              r|sJ |jM                  d |||      }nt        t              r|sJ |jM                  d |||      }nt        t              r$|sJ |j                  j&                  |||      }nt        tx              r;t        |tr              st        d      |j                  j&                  |||      }nqt        t              r|sJ |j                  |||      }nHt        t              r|sJ |j                  |||      }nt        d dj                                || j                  j                         <   |S )Nr   r1   r  )global_namer   r~  r  r  c                6    t        j                               S r   )rc   
_get_index)r  r   s    r   r%  z<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                (    | j                         d   S r   __tensor_flatten__r   s    r   r%  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (<(<(>q(A r   c                "    | j                         S r   )__obj_flatten__r  s    r   r%  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (9(9(; r   c                >    | j                         j                         S r   )_typequalified_namer  s    r   r%  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    	(@(@(B r   c                "    | j                         S r   )get_baser  s    r   r%  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    

 r   c                "    | j                         S r   )itemr  s    r   r%  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s     r   c                ,    t        j                  |       S r   )r   r<  r  s    r   r%  z<GuardBuilder.get_guard_manager_from_source.<locals>.<lambda>  s    (A(A!(D r   r}  z4ConstDictKeySource can only work on DictGuardManagerzmissing guard manager builder z - )fr   ry   rb  r  r  r  r  r  r   r;   r  get_guard_manager_from_sourcere   rJ   r2   !enable_cpp_framelocals_guard_evalr  r  lenr_  
local_nameframelocals_managerr  rE   r
  r  rG   global_weakref_managerrF   rO   rS   type_managerrM   rK   rU   rT   rB   rQ   lambda_managerrH   grad_managerrC   generic_getattr_managerr  r8   rV   r   nnModulera   rm   r  r  r?   r"  r2  r3  r   r  r  r=   RuntimeErrorr   getattrproplowerr   r   indexed_managerrI   list_getitem_managerrD   rO  index_is_slicetupletuple_getitem_managerunpack_slicegetitem_managerr>   callableis_kwfunc_defaults_manager__defaults__idx_key__kwdefaults__func_kwdefaults_managerrL   r  rP   r@   rN   r7   r:   rA   rR   tuple_iterator_getitem_managerAssertionErrorr  rW   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outr_  
kwdefaults	kw_sourcer  s    `               r   r   z*GuardBuilder.get_guard_manager_from_source  s	   !//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//1HH".."+#5	 I C F-. &%FN+%%FJ'%%%$11"+#5 2 C
 +2"	
 &%%$CF89$33 #+#5 4 C FJ'%%%$11"+#5 2 C
 F-.%%%$<<]]"+#5	 = C FZ)GHI%%% -uxx?&'9:./ //&&!$& )88&"/'9	 9  F-.%%%049P9P2QRRR,.>?223JKKK-&&!& fll,>?&8  )==&"/'9	 >  F01'""6;;#3#3#9#9#;"<HE JJ"+#5C FM*%%%$44JJ"+#5	 5 C F-.%%%$99LL"+#5	 : C FM*%%%!"T;+B+B$C '&'  ,d3F<Q<Q(==&"/'9	 >  .6v?T?T(>>&"/'9	 ?  (("//1E(88&"/'9	 9  FN+%%%.///<<(>>+"4"A"A'7'E'E ?  "/&"/'9	 " 	  0>>
'333,/@@	 .EE$",'7'E'E F 
 &h0@AAA33&"/'9	 4  F-.%%%$33("+#5	 4 C F23%%%$33A"+#5	 4 C F56%%%$33;"+#5	 4 C F;<%%%$33B"+#5	 4 C FO,%%%$334"+#5	 4 C F01%%%$330"+#5	 4 C F-.%%%$33D"+#5	 4 C F67%%%$CCll"+#5	 D C  2302BC$J  %44ll"+#5	 5 C F-.%%%$99"+#5 : C
 F45%%%$BB"+#5 C C !0FKKM?K  69##FKKM2
r   c                8    | j                  |j                        S r   )r   r  r   r   s     r   r  zGuardBuilder.get_guard_manager  s    11%2J2JKKr   Nc                   |
t               }dj                  |j                               }t        ||      \  }}i }d| j                  d   i}	t
        j                  d|       t        ||	|        |d   |j                          }
|r'| j                  j                  j                  |
|       y | j                  j                  j                  |
|       y )Nr   r  zPython shape guard function:
%s___make_guard_fn)r=  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pycoderF  globals_for_guard_fnguard_fns              r   $add_python_lambda_leaf_guard_to_rootz1GuardBuilder.add_python_lambda_leaf_guard_to_root  s     ,.L "YY|'8'8':;2:?QRV  #TZZ_5;VDV)3/*3)*L,?,?,AB ##==, ##44X?QRr   c                H    |
t               }t        || j                  |      S r   )r=  evalr  )r   rb  r{   s      r   r  zGuardBuilder.get3  s#    ,.LD$**l33r   c                8   t        |t              r|}n|j                  }t        |      }|| j                  vrat
        j                  j                  j                  |      }|r6|dk(  rt        j                  d|       | j                  j                  |       |S )Nr  zinvalid var name: %s)r   r  rb  strip_function_callr  r   r   r   is_valid_var_namelogwarningr   )r   r   rb  r  is_valids        r   arg_refzGuardBuilder.arg_ref=  sz    eS!D::D"4(t}}$xx''99$?Hq=KK 6>$$T*r   c                    t        |j                  |      }t        |||j                  |j                        }|j                  |        y )N)rI  rF  )r8   r  r"   rI  rF  create)r   r   r  rZ  attr_source	new_guards         r   _guard_on_attributez GuardBuilder._guard_on_attributeM  sA     !9!99EAQAQ
	 	r   c           	        |j                   }t        |t              r|j                  }t        |t              sJ d|j
                          |j                  }|j                         }|j                  }| j                  |      }t        | j                  |      |      }d }|r
d| d|d}n	d| d|d}| j                  ||g| j                  |             | j                  |      }	|r| j                  |j                               }
| j                  |      }| j                  ||
      }t        |t        j                  j                        r6t!        |      t"        u r%| j%                  ||	||
||j                         |      S |	j'                  ||j
                  |
|       y |	j)                  |t+        ||             y )Nzinvalid source hasattr(r   rY  znot hasattr()provided_guarded_objectr  )r  r   rK   r  r8   rb  r  rd  r   r  _set_guard_export_infor   r  r   r*  r+  ra   rm   r  r  add_no_hasattr_guardrP  )r   r   r   base_sourcer  r  refvalr  base_managerr~  r  r  s                r   HASATTRzGuardBuilder.HASATTRV  s   ))fn-[[F&*-M/MM-kk!}}ll4 dhhtnd+cU"THA.D!#b2D##D6488D> 	$ 	
 99+F !HHV[[]3M!%$!%!<!<V]!S
 -uxx?&'9:./ 00 &!KKM&  ,, ::"/'9	 -  --d4J4QV4WXr   c                   |J | j                  |      }| j                  |j                        }t        |t        j
                  j                        sJ | j                  |      }|j                   d}|j                  || j                  |j                        t        j                        }d|d| d}|j                  d|t        ||             y )Nr  r  znot ___dict_contains(r   z
.__dict__)F)rd  r  rb  r   r   r*  r+  r  r  r  r  r  r  add_dict_contains_guardrP  )	r   r   r  rp  rq  rr  r  r  r  s	            r   NOT_PRESENT_IN_GENERIC_DICTz(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/e<	
r   c                8   t        | j                  |j                              }| j                  |d|j                   d      }d| j	                  |       d| d}| j                  ||g       | j                  |      j                  |t        ||             y )Ntype(rY  z___check_type_id(r   )	rZ  r  rb  r  rd  rm  r  add_type_match_guardrP  )r   r   r   r  r  s        r   
TYPE_MATCHzGuardBuilder.TYPE_MATCH  s    %**%&Q%

|1 56"4<<#6"7r&C##ED62u%::*47	
r   c                0   | j                  |      }| j                  |j                        }t        | j                  |j                              }d| d| }| j	                  ||g       | j                  |      j                  |t        ||             y )Nz___dict_version() == )rd  r  rb  r   rm  r  add_dict_version_guardrP  )r   r   rp  rq  versionr  s         r   DICT_VERSIONzGuardBuilder.DICT_VERSION  s    ll5!hhuzz"txx

34!#eG95##ED62 	u%<<'e4	
r   c                    | j                  |      }|rdnd}| d|d| d}| j                  ||g       | j                  |      j                  | |t	        ||             y )Nnot r   z___dict_contains(r   rY  )rd  rm  r  ru  rP  )r   r   rl  invertdict_ref	maybe_notr  s          r   DICT_CONTAINSzGuardBuilder.DICT_CONTAINS  sn    <<&$F"	-cWBxjB##ED62u%==J3D%@	
r   c                   t        |j                  t              r=| j                  t	        |j                  j
                  t        j                              S | j                  |      }| j                  |j                        }| j                  ||j                        }d| d| d}| j                  ||g       | j                  |      j                  |t        ||             t        |j                  t              r_t        |t         j"                  j$                        r:|j                  j&                  }| j)                  |      }||| j*                  |<   y y y y )Nz___check_obj_id(r   rY  )r   r  rS   rz  r"   r  r  rd  r  rb  r  rm  r  r  rP  rJ   r   r*  r+  r#  r  r   )r   r   rp  rq  r  r  r#  weak_ids           r   ID_MATCHzGuardBuilder.ID_MATCH  s-   e..
;??e..33\5L5LM  ll5!hhuzz"S%**-!#b2##ED62u%88*47	
 e..< #uxx/"55@@
..s3&7>D((4 ' 0	 =r   c                   | j                  |      }| j                  |j                        }t        |t        j
                        sJ | d}| j                  ||g       | j                  |      j                  t        ||             y Nz is not None)
rd  r  rb  r   r   Tensorrm  r  add_not_none_guardrP  )r   r   ra  rp  rq  r  s         r   NOT_NONE_MATCHzGuardBuilder.NOT_NONE_MATCH  sw    ll5!hhuzz"#u||,,,l###ED62u%88"4/	
r   c                   | j                  |      }| j                  |j                        }t        |t        j
                  j                        sJ | d|d}| j                  |      j                  |t        ||             y )Nz.raw_repr() == z.raw_repr())
rd  r  rb  r   r   r   DispatchKeySetr  add_dispatch_key_set_guardrP  )r   r   rp  rq  r}   s        r   DISPATCH_KEY_SET_MATCHz#GuardBuilder.DISPATCH_KEY_SET_MATCH  st    ll5!hhuzz"#uxx66777uOC7+>
u%@@'
E:	
r   c                F    | j                  |dt        j                         y )Nr   )ri  r  EQUALS_MATCHrJ  s     r   
NAME_MATCHzGuardBuilder.NAME_MATCH  s      
L4M4MNr   c                    | j                  |j                        }| j                  |       d|j                          }| j	                  ||g       | j                  |      j                  |t        ||             y )Nz.data_ptr() == )r  rb  rd  data_ptrrm  r  add_data_ptr_guardrP  )r   r   objr  s       r   DATA_PTR_MATCHzGuardBuilder.DATA_PTR_MATCH  sm    hhuzz",,u%&oclln5EF##ED62u%88'e4	
r   c                "   t         j                  j                  j                  d g}| j	                  ||g       t         j                  j                  fd}| j
                  j                  j                  |t        ||             y )Nz,torch.autograd.forward_ad._current_level == c                "    j                   k(  S r   )_current_level)r   
dual_level
forward_ads    r   fnz#GuardBuilder.DUAL_LEVEL.<locals>.fn  s    ,,
::r   )	r   autogradr  r  rm  r   ry   rT  rP  )r   r   r  r  r  r  s       @@r   
DUAL_LEVELzGuardBuilder.DUAL_LEVEL  sx     ^^..==
>zlKL##ED62^^..
	; 	00&tU3	
r   c                   t         j                  j                  j                         }|D cg c]  }|j	                          c}d dg}| j                  ||       t         j                  j                  j                  fd}| j                  j                  j                  |t        ||             y c c}w )Nz5torch._functorch.pyfunctorch.compare_functorch_state(rY  c                           S r   r  )r   
compare_fnstatess    r   r  z.GuardBuilder.FUNCTORCH_STACK_MATCH.<locals>.fn  s    f%%r   )r   
_functorchpyfunctorch#retrieve_all_functorch_interpreters	get_staterm  compare_functorch_stater   ry   rT  rP  )r   r   ciscir  r  r  r  s         @@r   FUNCTORCH_STACK_MATCHz"GuardBuilder.FUNCTORCH_STACK_MATCH  s     **NNP+./R",,./GxqQR##E40 %%11II
	& 	00&tU3	
 0s   B=c                   | j                  |j                        t        | j                  |j                        j                         d         t	        d      rt               fd}nfd}dt        |       dt        j                          }| j                  |      j                  |t        ||             y )Nr1   __metadata_guard__c                J    j                  | j                         d         S Nr1   )r  r  )r   original_metadatara  s    r   metadata_checkerzEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker,  s)    //%q';';'=a'@ r   c                0    | j                         d   k(  S r  r  )r   r  s    r   r  zEGuardBuilder.TENSOR_SUBCLASS_METADATA_MATCH.<locals>.metadata_checker3  s    ++-a04EEEr   ___check_metadata__c)r  rb  r   r  r   rn   r  r   current_compile_idr  rT  rP  )r   r   r  r  r  ra  s       @@r   TENSOR_SUBCLASS_METADATA_MATCHz+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                \   | j                  |      }| j                  |j                        }t        rt        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  f}nd}t        t         f}t#        t$        t&        t"        t(        t*        t,        t.        t0        j2                  h||z        }t0        j4                  j7                         rddlm} ddlm}m }	m!}
 ||
|	||fz   }dd l"m#c m$} tK        ||      s-|jM                  t'        |            sJ dt'        |              tK        |tN              rtQ        jR                  |      rq| jU                  |       g }|jW                  d| d       | jY                  ||       | j[                  |      j]                  t_               d   ta        ||             y tK        |tb              rt        jR                  |      rq| jU                  |       g }|jW                  d	| d       | jY                  ||       | j[                  |      j]                  t_               d
   ta        ||             y | d|g}tK        ||      rte        |      }| j[                  |      jg                  |ta        ||             | jY                  ||       y )Nr  r   )
DeviceMesh)Partial	ReplicateShardzUnexpected type z__math_isnan(rY  r*  z__numpy_isnan(r+  r  )4rd  r  rb  r  int8int16int32int64uint8uint16uint32uint64float16float32float64rO  r  r3  r_   rZ  	frozensetsliceranger`   r   Sizedistributedis_availabletorch.distributed.device_meshr  (torch.distributed.tensor.placement_typesr  r  r  torch.utils._pytreer:  _pytreere   is_constant_classr7  r5  r6  rz  r   rm  r  rT  r=  rP  complexr   r  )r   r   rp  rq  np_typesok_mutable_typesok_typesr  r  r  r  pytreer  s                r   r  zGuardBuilder.EQUALS_MATCH;  s   ll5!hhuzz"						





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


 
 "

 ))+@   	# H 	-,c8$(@(@c(K 	
tCyk*	
K
 #u$**S/OOE"DKK-uA./''t4""5)::!#N3&tU3  #wBHHSMOOE"DKK.Q/0''t4""5)::!#O4&tU3  %tC7#$#'( 3-Cu%<<'e4	
 	##E40r   c                    | j                  |j                        }t        |t        t	        d       t
        j                  f      r| j                  |       y | j                  |       y r   )	r  rb  re   rv  rZ  typesCodeTyper  r  r   r   rq  s      r   CONSTANT_MATCHzGuardBuilder.CONSTANT_MATCH  sG    hhuzz"#d4j%..9:MM% e$r   c                >   | j                  |       | j                  |j                        }t        |d      r>t	        |j
                  t              sJ | j                  |dt        j                         y t        j                  dddt        |       ddg       y )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  rb  r   re   r  rv  ri  r  r  r4   unimplemented_v2rZ  r  s      r   	NN_MODULEzGuardBuilder.NN_MODULE  s    ehhuzz"3
##,,---$$UJ8S8ST  G''+Cyk5 `r   c                $    | j                  |      S )z0things like torch.add and user defined functions)r  rJ  s     r   FUNCTION_MATCHzGuardBuilder.FUNCTION_MATCH  s    }}U##r   c                2   | j                  |j                        }t        |      t        j                  k(  rOt        |d      rC| j                  |dt        j                         | j                  |dt        j                         y| j                  |       y)z!matches a closure by __code__ id.__code__N)
r  rb  rZ  r  FunctionTyper   ri  r  rs  r  r  s      r   CLOSURE_MATCHzGuardBuilder.CLOSURE_MATCH  sm    hhuzz"9***wsJ/G$$UJ8L8LM$$UJ8S8ST&r   c                $    | j                  |      S r   r  rJ  s     r   BUILTIN_MATCHzGuardBuilder.BUILTIN_MATCH      ""5))r   c                $    | j                  |      S r   r  rJ  s     r   PYMODULE_MATCHzGuardBuilder.PYMODULE_MATCH  r  r   c                >   | j                  |      }| j                  |j                        }t        |t              s| j                  |       g }t        |      dk(  r|j                  d|        n |j                  d| dt        |              | j                  ||       t        |t              r5| j                  |      j                  t        |      t        ||             y | j                  |      j                  t        |      t        ||             y )Nr   r  zlen(r|  )rd  r  rb  r   r"  rz  r"  r   rm  r  add_dict_length_check_guardrP  add_length_check_guardr   r   rp  ra  r  s        r   SEQUENCE_LENGTHzGuardBuilder.SEQUENCE_LENGTH  s     ll5!$%&OOE"u:?KK$se%KK$se5U56##E40eT"""5)EEE
24? ""5)@@E
24?r   c                   | j                  |      }| j                  |j                        }t        |      }g }|j	                  d| dt        |              | j                  ||       t        |      }| j                  |d|j                   d      }| j                  |      j                  t        |      |t        ||             y )Nz___tuple_iterator_len(r|  rx  rY  )rd  r  rb  rZ  r   rl   rm  r  r  add_tuple_iterator_length_guardrP  )r   r   rp  ra  r   r  r  s          r   TUPLE_ITERATOR_LENzGuardBuilder.TUPLE_ITERATOR_LEN  s    ll5!$K,SE7I%7P6QRS##E40KQ%

|1 56u%EEu%v/EdE/R	
r   c           
        | j                  |      }| j                  |j                        }t        |      }g }t	        |      }|j                  d| d|        | j                  ||       t        |      }| j                  |d|j                   d      }|\  }}	}
| j                  |      j                  ||	|
|t        ||             y )Nz___normalize_range_iter(r|  rx  rY  )rd  r  rb  rZ  rh   r   rm  r  r  add_range_iterator_match_guardrP  )r   r   rp  ra  r   r  normalized_range_iterr  startstopsteps              r   RANGE_ITERATOR_MATCHz!GuardBuilder.RANGE_ITERATOR_MATCH  s    ll5!$K 4U ;.se59N8OPQ##E40KQ%

|1 561tTu%DD4v'=dE'J	
r   c                   | j                  |      }| j                  |j                               }t        |j                        st        |      ry ||f}|| j                  v ry | j                  j                  ||f       | j                  j                  ||f       | d| g}| j                  ||       t        | j                  |      | j                  |      t        ||             y )N is )rd  rb  r   r  r  r   rm  r   r  r   rP  )r   r   source_bref_aref_brl  r  s          r   DUPLICATE_INPUTzGuardBuilder.DUPLICATE_INPUT  s    U#X]]_-#$$
%h/ en$555++//?++//?'eW%&##E40%""5)..x8"4/	
r   c                    | j                  |       dg}| j                  ||       | j                  |      j                  t	        ||             y r  )rd  rm  r  r  rP  )r   r   r  s      r   WEAKREF_ALIVEzGuardBuilder.WEAKREF_ALIVE  sN    <<&'|45##E40u%88"4/	
r   c           	     "   | j                  |      }| j                  |j                        }g }|j                  d| dt	        |j                                       | j                  ||       | j                  |      j                  ||       y)z7Guard on the key order of types.MappingProxyType objectzlist(z.keys()) == N)	rd  r  rb  r   rO  r  rm  r  add_mapping_keys_guardr  s        r   MAPPING_KEYS_CHECKzGuardBuilder.MAPPING_KEYS_CHECK'  sw    ll5!$eC5T%**,-?,@AB##E40u%<<UDIr   c           
        | j                  |      }| j                  |j                        }|t        j                  j
                  j                  u r| j                  |       y| j                  |       g }|j                  d| dt        t        |                   | j                  ||       | j                  |j                        r| j                  ||       y| j!                  ||       y)z6Insert guard to check that the keys of a dict are sameNro  z)) == )rd  r  rb  r   r:  r  SUPPORTED_NODESr  r  r   rO  r^   rm  r  r  r  r  r  s        r   DICT_KEYS_MATCHzGuardBuilder.DICT_KEYS_MATCH1  s    ll5!$EKK''777e$U#
 	ocU&6G6N1O0RST##E40++E,D,DE--eU;44UEBr   c                H    t         j                  ry| j                  |       y)z\Special guard to skip guards on empty hooks. This is controlled by skip_nnmodule_hook_guardsN)r2   skip_nnmodule_hook_guardsr  rJ  s     r   EMPTY_NN_MODULE_HOOKS_DICTz'GuardBuilder.EMPTY_NN_MODULE_HOOKS_DICTJ  s    ++U#r   c                v    t        j                  | j                  |j                        | j                         y r   )r5   watchr  rb  r  rJ  s     r   OBJECT_MUTATIONzGuardBuilder.OBJECT_MUTATIONQ  s%    TXXejj143H3HIr   c                     y r   r  rJ  s     r   	GRAD_MODEzGuardBuilder.GRAD_MODET      r   c                     y r   r  rJ  s     r   DETERMINISTIC_ALGORITHMSz%GuardBuilder.DETERMINISTIC_ALGORITHMSW  r  r   c                     y r   r  rJ  s     r   TORCH_FUNCTION_STATEz!GuardBuilder.TORCH_FUNCTION_STATEZ  r  r   c                     y r   r  rJ  s     r   FSDP_TRAINING_STATEz GuardBuilder.FSDP_TRAINING_STATE]  r  r   c                    |j                   t        j                  u sJ ddlmc m} d|j                  g}| j                  ||       | j                  |      j                  t        ||             y)z/Guard on CURRENT_DEVICE per torch.utils._devicer   Nzutils_device.CURRENT_DEVICE == )r   r%   GLOBALtorch.utils._devicer:  r;  CURRENT_DEVICErm  r  add_default_device_guardrP  )r   r   r  r  s       r   DEFAULT_DEVICEzGuardBuilder.DEFAULT_DEVICE`  si    ||{11111''1!2B2B1EFG##E40u%>>"4/	
r   c                F	   !"#$ |j                   dk(  sJ  j                  j                  $$j                  ""D cg c]  }|j                   c}#$fd}$j
                  ri }g }g }i }t               }$j
                  D ]j  }	|	j                  $j                  v r;t        j                  j                  j                  |	|$j                  |||||       Vt        j                  d       l t!        ||t#        |j%                               |d      !nd !!"#$ fd}
t&        j(                  r |
d      \  }}}n |
d      \  }} j                  j                  j                  s$j                  j+                          |j,                  D ]  } j/                  ||g        t1        j2                         x}r%|j4                  j7                  |j,                         t&        j(                  r1d	d l}d	d
lm} sJ |j,                  |j>                  }}|sy g }g }d}|jA                         D ]  \  }}tC        |tD              rd} jG                  |j                         i tH        tK                     }tC        |tL              r|jO                  ||f       ntC        |tP              r|jO                  ||f       d} |sYtS        ||z         }	 tU        |      D cg c]   \  }} jW                  tY        ||            " }}}dj[                  d tU        |      D              }dj[                  d tU        |      D              }|rd| d}|rd| d}t]        j^                  d| d| ddj[                  |       d      }t`        jc                  d||j,                         |je                  |      }|jg                  |jh                  |jj                        jl                  } | sJ 	 to        |tq        |      tq        |      | ||j,                         y |j,                  r9 jy                  |j,                  |j,                  i tH        tK                      y y c c}w c c}}w # t        jr                  jt                  jv                  $ r Y zw xY w)Nr   c                z    j                   |    D cg c]  }t        |t        j                  |       c}S c c}w r   )tracked_fakes_id_to_sourcer   r   SIZE)t_idrV  r   r  s      r   get_sourcesz+GuardBuilder.SHAPE_ENV.<locals>.get_sourcesv  s?    
 +EEdK %V^-@-@#F  s   "8z+Untracked tensor used in export constraintsF)source_pairsderived_equalitiesphantom_symbolsrelaxed_sources	warn_onlyc           	        j                   j                  D cg c]  }|j                   c}D cg c]  }|j                   c}j                  j
                  j                  j                   |       S c c}w c c}w )N)input_contextsequalities_inputsr  ignore_staticlangs)	shape_envproduce_guards_verbosefaker   r  r  r  export)r3  r  r1  rL  r0  r  r   s     r   _get_code_partsz/GuardBuilder.SHAPE_ENV.<locals>._get_code_parts  st    ))@@!#$A$#%&a&-"3??#'#8#8#E#E#L#LL A 	 	$&s
   A=B
)pythonverbose_pythoncpp)r9  r:  r   )CppCodeCacheT)r{   r   c              3  8   K   | ]  \  }\  }}| d | d  yw)z = int_values[rq  Nr  .0ir  symbols       r   	<genexpr>z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>  s-      0*A{6 "(.150   c              3  8   K   | ]  \  }\  }}| d | d  yw)z = float_values[rq  Nr  r>  s       r   rB  z)GuardBuilder.SHAPE_ENV.<locals>.<genexpr>  s.      2*A{6 "("21#Q72rC  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)=rb  r  r  tracked_fakessymbolic_contextexport_constraintsr  r(  r&  r   r7  dynamic_shapes_process_equalitiesr4  ra  rb  r*   rO  rR  r2    enable_cpp_symbolic_shape_guardsfreezeexprsrm  r   try_getshape_env_guardsr   ctypestorch._inductor.codecacher<  source_to_symbolr   r   r<   r  r,   r=  r  r   r7  r"  r  r   r   rM  textwrapdedentrO  rP  loadcastr   c_void_pra  r   r"  	_inductorr4   InvalidCxxCompilerr[  )%r   r   r  r)  namesr*  r+  r,  r-  
constraintr8  python_code_partsr~   cpp_code_partsr  compile_contextrP  r<  r}   rR  int_source_to_symbolfloat_source_to_symbolpython_fallbackr   rA  r~  r@  guard_managersint_symbols_strfloat_symbols_strfunc_strclibcguardr1  rL  r0  r  s%   `                                @@@@r   	SHAPE_ENVzGuardBuilder.SHAPE_ENVl  s    zzR,,99''689!,,9	 **02E8:L   24O+.5O*== O
??l&M&MMLL//CC"#$..$*''	 KK MNO !3)#5 $_%;%;%= > /! !%
	 
	 22DS3EA1> 5D,511 $$1188""))+%++ 	7D''v6	7 -4466?6,,334F4L4LM22>!!>$$// )J
 #% %'"#O"2"8"8": /fn5&*O$(HH%L%L8I8K%L %- %M "-5,33VV4DE#M59.55vv6FG +//" ##'(<?U(U#V 5 *33C)D&%Av ::=QR;ST&N &
 '+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*   Q+Q6 )%Q0C)Q6 0Q6 6'R R c                t   t         j                  r|j                         ry t        |      r| j	                  |       y t        |t              r |       }||n| j                  |j                        }t        |t        j                        sJ | j                  |      }g }| j                  j                  j                  r| j                  |       g d}|D ]  }| j                  |dz   |z         }t!        |t        j"                  t        j$                  f      r$|j'                  d| d| dt)        |             h|j'                  | d| d|         nj| j+                  |      }t         j,                  r$t!        |t        j.                  j0                        sPt        |j2                  t4              s6| j6                  j'                  |       | j8                  j'                  |       | j                  j                  }	|	j:                  |j2                     }
t=        |
d         }t=        |
d         }t?        tA        ||||      |      }|jC                  |||||       t        |t        j.                  j0                        s9| j                  jD                  jF                  jI                  |j                         |jJ                  J tM        |d|j2                  	      \  }}|stO        |d
      rU|jP                  }d| d| d| d}|j'                  |       | j+                  |      jS                  |t?        ||             nBd| d}|j'                  |       | j+                  |      jU                  d
t?        ||             tW        |      dkD  r| jY                  ||       y y )N)r^  r/  r`  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)rk  z%, '_dynamo_dynamic_indices') == Falser   )-r2   _unsafe_skip_fsdp_module_guardsis_fsdp_moduler  r  r   r0   r  rb  r   r  rd  r  r  r7  rz  re   r/  r^  r   r  r  ,skip_no_tensor_aliasing_guards_on_parametersr*  	Parameterr  rL   r  r  input_source_to_sizes_stridesrW  rP  ri  add_tensor_match_guardr   r   r   r   rj   r   rn  add_dynamic_indices_guardrn  r"  rm  )r   r   ra  tensor_namer  termsterm
real_valuer   r  metadatarj  rk  r~   static_reasondynamic_indicesr   s                     r   TENSOR_MATCHzGuardBuilder.TENSOR_MATCH%  sh   11e6J6J6L "%(MM% %/".EDHHUZZ4HEeU\\222,,u-K, !D$$1188& " MD!%+*;d*B!CJj5<<*EFd;-qeC
OCV$WX{m1TF$zl$KLM !% 6 6u = GGuehh&8&89$U%=%=?PQ 1188E::AA-P#44AA'EE,, 2(62BC3HX4FG%;.uk4P&" 44& "%););<))77JJNN

@ <<+++<U5M5MOFG 5";<&+&C&CO"$[M1STcSddrs~r  @g  !hIKK	***51KK')?	5)Q #;-/TU  KK	***51FF1.y%@ 4y1}++E48 r   c                   t               }|J |j                  }~|J |j                  j                  }~|| j                  j
                  v s
J d|        |"|j                  }|sd n| j                  |      }n|}|t        j                  t        |            nd }	d }
t        |j                  dd      dk7  }|r5t        |t        j                  t        f      st        j                  |      }
|j!                  ||	||
       y )NzH_produce_guard_code must be called from inside GuardedCode. Called from __weakrefoffset__r   )r   f_backr  co_namer   r  rb  r  weakrefrp  rZ  r-  r   enumEnumr3  set_export_info)r   r   r  rl  	cur_framecaller	func_namerb  guarded_objectguarded_object_typeobj_refsupports_weakrefs               r   rm  z#GuardBuilder._set_guard_export_info  s    !N	$$$!!!!!MM))	DNN333 	
VW`Vab	
3
 #*::D)-T488D>N4N 2@1KGKK^,-QU 	  N,,.A1EJ 	 J~		5?Q$Rkk.1G		
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   rv   r  CheckFunctionManager)r   r"   rx   r   )rb  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"   rl  r  r  rv  )8r   r   r   r   r  r  staticmethodr  r  r  r  r  r
  r   r  r[  r  rd  ri  rs  rv  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r#  rh  r~  rm  r  r   r   r  r  a  s   =J=J *=J ,	=J
 C=J '=J (=J +=J /=J~8$L  "Sj9	"?
dLL SF4 4Yl
(	

	
?<	

O

 
$
*_B%"$'**4
 
&
4
JC2$J

wrZ9z)
r   r  c                      e Zd ZdZej
                  ej                  ej                  fZe	j                   G d d             Z G d dej                        Z G d dej                        ZddZddd	Zdd
ZddZy)PyExprCSEPassr1   c                  "    e Zd ZU ded<   ded<   y)PyExprCSEPass.Configzdict[str, int]
expr_countzdict[str, str]expr_to_nameNr  r  r   r   Configr  	  s    ""$$r   r  c                  (     e Zd ZddZd fdZ xZS )PyExprCSEPass.ExprCounterc                    || _         y r   )_config)r   r2   s     r   r   z"PyExprCSEPass.ExprCounter.__init__	  s	    !DLr   c                    t        |t        j                        r*| j                  j                  t        |      xx   dz  cc<   t        |   |       y r  )r   r  ALLOWED_NODE_TYPESr  r  rC  r   r   )r   r   r   s     r   r   zPyExprCSEPass.ExprCounter.visit	  s>    $ @ @A''T(:;q@;GM$r   )r2   r  r  r  r   ast.ASTr  r   r   r   r   r   r   r   r   s   @r   ExprCounterr  	  s    	"	  	 r   r  c                  8     e Zd Z	 	 	 	 	 	 d fdZd fdZ xZS )PyExprCSEPass.Replacerc                L    t         |           || _        || _        g | _        y r   )r   r   r  	_gen_namepreface)r   r2   gen_namer   s      r   r   zPyExprCSEPass.Replacer.__init__	  s%    
 G!DL%DN&(DLr   c                :   t        |t        j                        rt        |      }| j                  j
                  |   t        j                  kD  r|| j                  j                  vrdt        | %  |      }t        |      }| j                         }| j                  j                  | d|        || j                  j                  |<   n| j                  j                  |   }t        j                  |t        j                               S t        | %  |      S )Nz = )r   r  r  rC  r  r  USE_THRESHOLDr  r   r   r  r  r   r@  NameLoad)r   r   exprnode_expr_var_namer   s         r   r   zPyExprCSEPass.Replacer.visit 	  s    $ @ @A#D) <<**40=3N3NN4<<#<#<< !&d 3 ,U 3#'>>#3++xjE7,CD:B11$7#'<<#<#<T#B88Hchhj997=&&r   )r2   r  r  zCallable[[], str]r  r  r  r  r   s   @r   Replacerr  	  s.    	)(	) (	) 		)	' 	'r   r  c                j    d| _         | j                  t        j                  d       i       | _        y )Nr   c                      yr   r  r  r   r   r%  z(PyExprCSEPass.__init__.<locals>.<lambda>=	  s    r   )r  r  )_counterr  r2  defaultdictr  r   s    r   r   zPyExprCSEPass.__init__:	  s.    {{"..y9 # 
r   c                P    | | j                    }| xj                   dz  c_         |S r  )r  )r   r   rb  s      r   _new_varzPyExprCSEPass._new_var@	  s'    $--)r   c                    | j                  | j                        }|D ]'  }	 |j                  t        j                  |             ) y # t
        $ r'}t        j                  d|j                  |        d }~ww xY w)Nz#Failed to visit expr at line %s.
%s)	r  r  r   r@  parseSyntaxErrorra  	exceptionlineno)r   rM  countereexs        r   countzPyExprCSEPass.countE	  si    ""4<<0 	Aciil+	  DbiiQRSs   $A			A9"A44A9c                    | j                  | j                  | j                        }|j                  t	        j
                  |            }|j                  t        |      fS r   )r  r  r  r   r@  r  r  rC  )r   r  replacernew_nodes       r   rB  zPyExprCSEPass.replaceN	  sF    ==t}}=>>#))D/2h!777r   N)r  r  )_var)r   r  r  r  )rM  r  r  r  r  r  r  ztuple[list[str], str])r   r   r   r  r@  	AttributeCall	Subscriptr  dataclasses	dataclassr  NodeVisitorr  NodeTransformerr  r   r  r  rB  r  r   r   r  r    sx     M --3==A% % % coo  #'3&& #'J

8r   r  c                    t        | j                  t              xs. t        j                  xr | j
                  t        j                  u S r   )r   r  r>   r2    guard_nn_modules_using_dict_tags	create_fnr  r  )r   s    r   must_add_nn_module_guardsr  T	  s@    
 	5++^< 	
 33 :<#9#99r   c                  $     e Zd Z fdZd Z xZS )DeletedGuardManagerWrapperc                0    t         |           || _        y r   )r   r   invalidation_reason)r   reasonr   s     r   r   z#DeletedGuardManagerWrapper.__init__c	  s    #) r   c                    d | _         y r   )rz   r   s    r   r   z6DeletedGuardManagerWrapper.populate_diff_guard_managerg	  s
    #r   )r   r   r   r   r   r   r   s   @r   r  r  b	  s    *$r   r  c                  6    e Zd Z	 	 	 d	 ddZd Zd Zd Zd Zy)	r  Nc           
     b    |r|j                   nd }i  _        t        |      }t                _        | j                  _        | _        d |r|j                  nd  _        fd}t        | j                  | j                  |j                  |j                   j                         }d }	t        j                  ||	      t        j                   xr t#        d      }
t#        d      st$        j'                  d       t)        |xs dt*        j,                        D ]`  }|
sK|j/                         r;d|j0                  vr-d|j0                  vrt        j2                  sd	|j0                  vrP|j5                  |       b  j7                  |||       |j8                   j                  _        t:        j=                  d
 j                         |j8                   j                  _        d|j>                  s j                  jA                  |j                        sAtC         j                  |j                  tE        jF                               }tI        d|       tJ         tK         j                  |j                         tM         j                  jN                  |j                  d      t:        j=                  dd       tQ        jR                  dtU                     tV        jX                  j[                  d fd        j                  j]                          d  _        y )Nc                    | j                         }|t        j                  u r| j                         S sJ         }|J |j	                  | j                               S r   )guard_sourcer%   CONSTANTrb  rd  )r   r  	r_builder	w_builders      r   r  z1CheckFunctionManager.__init__.<locals>.source_ref	  s]    !..0L{333{{}$9!I((($$V[[]33r   c                &     |        }|rd |_         y y r   )r  )weak_br$  s     r   cleanup_builderz6CheckFunctionManager.__init__.<locals>.cleanup_builder	  s    A r   z!pytorch/compiler:guard_nn_modulesz9guard_nn_modules is turned off using justknobs killswitchr  )rl  r:  r<  hooks%sg        zGuard check failed: 2   zGuard eval latency = %s us.2fguard_latency_usdynamo_cpp_guards_strc                 *    j                    d ddS )Nz
Guard latency = r  z us)r   )latencyr   s   r   r%  z/CheckFunctionManager.__init__.<locals>.<lambda>	  s     $"4"4!55GPS}TWX r   
payload_fn)/rq   	_weakrefs5update_diff_guard_managers_for_existing_cache_entriesrv   r   r   r  torch_function_mode_stackr  r  r  r  r   r  rp  r2   guard_nn_modulesr)   ra  rb  r   r"   sort_keyr  rb  r  rf  compile_check_fnr   rO  rP  r7  r   get_guard_fail_reason_helperr   r  r?  ro   r   ry   r   increment_toplevelr  r   _loggingtrace_structuredclear)r   r  r  r   r   rq   existing_diff_guard_sourcesr  builderr  guard_on_nn_modulesr   reasonsr  r  s   `            @@r   r   zCheckFunctionManager.__init__q	  s    )5$$$;= B+N 	$ 120K-(	
 7CL22 	&	4 KK  $$%%	
	 KK9	$55 
//;
 BCKKSTFLbenn= 	"E'224 #%**4$EJJ655

9RLL!	" 	gv}= .5-D-D*t112-4-D-D* ""%%++L,D,DE6&& ,,"557
 %';G9%EFF,8-&&(@(@ ,""'')A)A2G 9gc]L 112Dc'lS 	''#X 	( 	
 	 r   c                   |j                   }|dgz  }t        j                  d       g g g t        | j                        }| j
                  j                  j                  dg       | j
                  j                  j                  | j                  dg       d | _        dfd	}t               }|j                  D ]=  }|j                  D ],  }	|	|vs ||	|j                  d       |j                  |	       . ? |j                  }
d }d }t        |
      dkD  r-t!        |j"                  |
dd	j%                  |
      z   d
z   g       | j&                  r*| j&                  j(                  j*                  j,                  ng }|D ]T  }t/        |t0              rr|j2                  }|j4                  }|j7                          d|j7                          }t9        |j;                  |      |j;                  |      |g        ||d d       t/        |t<              r|j>                  D cg c]  }|j;                  |       }}|j@                  D cg c]  }|j;                  |       }}dd	j%                  d |j>                  D               dd	j%                  d |j@                  D               d}tC        |||g        ||d d       ItE        d|        |jF                  D ]'  }|j                  D ]  }	 ||	|j                  d        ) r$tH        jJ                  jM                  dfd       tN        jP                  }|tO        jR                         }|||jT                  |dtV        tY               }| j
                  j[                          d|j\                  d   i}t              dk(  sJ || j
                  _/        || j
                  _0        | j
                  jc                          | j
                  _2        || j
                  _3        || j
                  _4        d | j
                  _5        d | j
                  _6        |
| j
                  _7        y c c}w c c}w )Nz**___kwargs_ignoredzGUARDS:z___check_global_state()z$___check_torch_function_mode_stack()c                $    t               }t        j                  d|       j                   fd       t        j                  t        j                        rd}d}pj                  r,ddj                  j                  j                                }j                  r,ddj                  j                  j                                }t        j                  d ||       |s#j                          j                  |       y y )Nr  c                      r9j                   r-t        j                  j                   j                               nd r-j                  r!t        j                  j                        dS d dS )N)r  rI  rF  )rI  r(   from_tracebackrJ  rF  )r   r   s   r   r%  zNCheckFunctionManager.compile_check_fn.<locals>.add_code_part.<locals>.<lambda>
  sg    % !U[[ #11%++2E2E2GH! !U%5%5 #11%2B2BC  " r   r   z
Stack:
z
User stack:
zGuard: %s%s%s)rM  rO  rP  r   verbose_guards_logisEnabledForloggingDEBUGrI  rM  formatrF  )	r   r   log_onlyr   maybe_stackmaybe_user_stackr}   structured_guard_fnsr~   s	   ``    r   add_code_partz<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   rY  r  zcheck_overlapping(overlapping=[c              3  <   K   | ]  }|j                           y wr   rb  r?  r   s     r   rB  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>x
  s     /\Q/\   z], non_overlapping=[c              3  <   K   | ]  }|j                           y wr   r  r  s     r   rB  z8CheckFunctionManager.compile_check_fn.<locals>.<genexpr>y
  s     3dAFFH3dr  z])zUnknown GuardEnvExpr: dynamo_guardsc                 8    D  cg c]	  }  |         c} S c c} w r   r  )fr  s    r   r%  z7CheckFunctionManager.compile_check_fn.<locals>.<lambda>
  s    BV4WQQS4W 4Ws   r  )___check_tensors___check_tensors_verbose___check_global_state"___check_torch_function_mode_stackr  r   r   )8r  rO  rP  $make_torch_function_mode_stack_guardr  r   ry   add_global_state_guard#add_torch_function_mode_stack_guardr  r  r  r   r   r  r"  r   r  rM  r  tracing_contextguards_contextaotautograd_guardsr   r!   input_source_ainput_source_brb  r   r   r'   overlapping_sourcesnon_overlapping_sourcesr   r,  r  r   r  r  r3   initial_global_stateGlobalStateGuardr   r,   r=  r   r  r{   r|   r  r~   r   r   r   r   r   )r   r  
guards_outr   largs"torch_function_mode_stack_check_fnr	  seengclr  r  check_tensors_fncheck_tensors_verbose_fnr  r   source_ar  r   r   overlapping_guard_managersnon_overlapping_guard_managersglobal_stater{   rY  r}   r  r~   s                           @@@r   r  z%CheckFunctionManager.compile_check_fn
  sy     '((#
CE-Q**.
*
 	668Q7RSCC**34	

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

 
  !
 	##% #W]]3%78 :!###*6'"'<<>0B-*>'+8( *.&)-&8P5G.2s   +Q Q%c                T   t        | d      rt        | j                  t              s| j                  j                  x}h| j                  j
                  x}Ot        |t              sJ t        |t              sJ d| d}t        |      }|j                  ||       || _        y y y y y )Nr   zCache line invalidated because z got deallocated)	r   r   r   r  r   r   rX   rZ   
invalidate)r   obj_strr   r   r  deleted_guard_managers         r   r.  zCheckFunctionManager.invalidate
  s    
 D/*t113MN $ 2 2 > >>K $ 2 2 > >>Kk:666k:6666wi?OPF$>v$F!"";0EF!6D L L O +r   c                :   	 t        |      | j                  vr`t        j                  |      | j                  t        |      <   t        j                  |t        j                  | j                  |             t        |      S # t        $ r Y t        |      S w xY w)zadd a weakref, return the id)r/  )	r  r  r  rp  r   	functoolspartialr.  	TypeError)r   r  r/  s      r   r  zCheckFunctionManager.id_ref
  s    
	#wdnn, +2++c*:r#w'  **4??GL
 #w  	#w	s   A7B 	BBc                b    t        |      | j                  v r| j                  t        |         S y)zFLookup the _weakrefs created in id_ref function for ID_MATCH'd objectsN)r  r  )r   r  s     r   r  z$CheckFunctionManager.lookup_weakrefs
  s(    c7dnn$>>"S'**r   )NNN)r   z%Optional[Callable[[GuardFail], None]])r   r   r   r   r  r.  r  r  r  r   r   r  r  p	  s6     ?CN!
 =N!`pQd7"r   r  c                  	 ddl m} t               		j                  |        d	fd} |       }| D ]]  } ||      \  }}|j	                  |       |j                  d| d       |j                         5  |j                  d       d d d        _  |       }|j                  d       |j                         5  |j                  |       |j                  d       d d d         |       }|j                  d	| d       |j                         5  |j                  |       |j                  d
       d d d        |j                         |j                         fS # 1 sw Y   4xY w# 1 sw Y   xY w# 1 sw Y   BxY w)Nr   r   c                &    j                  |       S r   )rB  )r  csepasss    r   rB  z%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   rB  
guard_bodyr  r  r   make_guard_fnr8  s
            @r   rN  rN  
  sg   4oGMM*%
  !J 1g&xvR01  	1  0	1 	1	1 E	OOO$	 'Z &' #$M3L>DE				 0U#/0  -"8"8":::%	1 	1' '0 0s$   6E:#E)#E5E&	)E25E>c                 h    t         j                  j                  j                  j	                  d      S )Nrr   r   r  	_internal	log_stateis_artifact_enabledr  r   r   is_recompiles_enabledrB  
  s#    >>##--AA,OOr   c                 h    t         j                  j                  j                  j	                  d      S )Nrs   r>  r  r   r   is_recompiles_verbose_enabledrD    s$    >>##--AABVWWr   c                N    | D cg c]  }t        |       c}fd}|S c c}w )Nc                     t               } t        |       t              k7  ryt        |       D ]  \  }}|t        |      k7  s y yr  )rb   r"  r   rZ  )	cur_stacktymoder  s      r   check_torch_function_mode_stackzMmake_torch_function_mode_stack_guard.<locals>.check_torch_function_mode_stack  sL    13	y>SZ'E9- 	HBT$Z	 r   )rZ  )intial_stackr   rJ  r  s      @r   r  r    s)    *+T!W+E
 +* ,s   "c                `   t        | j                        }t        j                  t              }| j
                  D ]1  }||d<   t        t        |||            }||   j                  |       3 |D cg c]  }t        ||         dkD  s||     }}dj                  |      }d| gS c c}w )N__compile_source__r1   r   zDuplicate tensors found: )r"  r   r2  r  rO  r   r  r]  r   r"  rM  )	r   r  r   ids_to_sourcerm  	tensor_idrl  duplicate_tensorsr  s	            r   1recompilation_reason_for_no_tensor_aliasing_guardrQ    s    223L++D1M&AA 7-:)*tM<?@	i ''67 ,9$'Cc@R<SVW<W=
  YY()F'x011s   3B+
B+c                4    ddl }d}|j                  |d|       S )z
    Replace occurrences of L[...] with just the inner content.
    Handles both single and double quotes.

    This is to generate user friendly recompilation messages.
    r   NzL\[\s*['\"](.*?)['\"]\s*\]z\1)resub)r   rS  patterns      r   strip_local_scoperV  *  s     +G66'5!$$r   c                   || j                   d   d}|j                  | j                         g }d}g }| j                  |      }|j                  s(|j
                  }t        |      dk(  rd|d   v rd}n|}g }|rt        | |      }n|D ]  }t        | j                         }	||	d<   t               5  	 t        ||	|      }
	 d	d	d	       t        
t              r|
s|}
t        |
t              sd|j!                  |
       t               r n | d
dj#                  |      z   }t%        |      S # t        $ r t               r
Y d	d	d	        w xY w# 1 sw Y   xY w)z
    Return the reason why `guard_manager` failed.
    Updates `guard_failures` with the generated reason.
    Only the first failed check of guard_manager is reported.
    r  r  Fr1   zDuplicate tensor foundr   TrM  Nr   z; )r   r  r{   r   resultr~   r"  rQ  r"  r/   r]  	ExceptionrD  r   rv  r  r   rM  rV  )r   f_locals
compile_idr  r  no_tensor_aliasing_check_failedr~   guard_debug_infor   r   fail_reason
reason_strs               r   r  r  7  s    !;!;C!@AE	LL++,G&+#$&$228< ""-@@ !"a''+=a+@@26/,%'"&C5
 ' 	D : :;L15L-./1 "&t\5"AK +t,["+s+{+46'	* <r"TYYw%77JZ((! ! 46   	 s*   1E3D//EEEEE	c                P   t        | t              r| d| j                   S t        | ||      }t        t
        |      j                  |       	 | j                  &| j                  t        |xs dt
        |                |S # t        $ r t        j                  d       Y |S w xY w)Nr   zunknown reasonzVFailure in guard_fail_fn callback - raising here will cause a NULL Error on guard eval)r   r  r  r  rd   ri   r   r   r\   rY  ra  r  )r   r  rZ  r[  r_  s        r   get_guard_fail_reasonra  z  s     -!;<R A ABCC-mXzRJ=&'..z:
&&2''*8(8-:MN   
d	
 
s   2B B%$B%c                X   g | Xt        | j                  | j                  |j                  | j                        }|rj                  |       | j                  } | X|j                  }t               xs
 t               }|st        j                  rt               r"dj                  d t              D              }n%t        j                  dj                        d      }d| }d|j                    d|j"                   d|j$                   dt        j                  |d	       }|r5t               rt&        j)                  |       nt*        j)                  |       t        j                  rt-        j.                  |      t0        j2                  j5                  d
d fd       S )z
    Return the list of guard failure reasons using cache_entry.
    Logs the recompilation reason if `recompiles` logging is enabled.
    Raises a RecompileError if `config.error_on_recompile` is enabled.
    z

c              3  \   K   | ]$  \  }}d | dt        j                  |d      z    & yw)zguard z failures:
- N)rS  r   )r?  r@  r  s      r   rB  z:get_and_maybe_log_recompilation_reasons.<locals>.<genexpr>  s5      #Av <(8??64+HH#s   *,r?  rd  z-triggered by the following guard failure(s):
zRecompiling function z in :z    artifactc                     dddS )Nrecompile_reasonsjson)rb  encodingr  r  r   r   r%  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    '
 r   c                      S r   r  )r  s   r   r%  z9get_and_maybe_log_recompilation_reasons.<locals>.<lambda>  s    7 r   )metadata_fnr  )ra  r   r  rZ  r[  r   nextr  rB  rD  r2   error_on_recompilerM  r  rS  r   r  co_filenameco_firstlinenorecompiles_verbose_logrP  recompiles_logr4   RecompileErrorr   r  r  )	r   framer  r  do_recompiles_logfailuresguard_failure_detailsmessager  s	           @r   'get_and_maybe_log_recompilation_reasonsry    s    G

!&%%NN""	
 NN6"!&& 
! <<D ./R3P3RF55(*{{ #!*7!3# H
  tyy'94@H<XJG 	 $DLL>d6F6F5GqI\I\H]]_4f=>@ 	 ,.&,,W5$$W-$$$$W--	NN##
 # $  Nr   c                   | }t               }| 8|j                  | j                  j                                | j                  } | 8|} | :|| j                  _        | j                  j                          | j                  } | :|S r   )r  r  r   r   rm  r   r   )r   first_cache_entryacc_diff_guard_sourcess      r   r  r    s    #
 !U

!%%%%@@B	
 "&&	 
! $K

!7M!!4!!==?!&& 
! "!r   c                   t        d|j                   d|j                   d|j                          t        ddj	                  | j
                        z   dz          t        ddj	                  | j                               t        |        d|i| j                  }| j                  D ]  }	 t        || j                  |        y #  t        d|        Y 0xY w)	NzERROR RUNNING GUARDS  re  zlambda r   z and
  r  zMalformed guard:
)
printr  ro  rp  rM  r|   r}   r{   r]  r   )r   r  rZ  r_  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	022K@0	0&ug./s   -CCc              #  b   K   t               }| D ]  }||vs| |j                  |        y wr   )r  r   )seqr%  r   s      r   uniquer    s3     5D D=GHHQKs   //c                ,   |r|| k7  rt        |      }t        |       }t        |      st        |       r7t        j                  | j	                          d|j	                          d      ||k(  r%t        j                  t        j                  |      S y )Nz is alising zC. This is not supported. Please do a clone for corresponding input.)r  )	r   r   r4   UnsafeScriptObjectErrorrb  r2  r3  r  r  )
obj_sourcedupe_sourceser_source_is_localsource_is_locals       r   make_dupe_guardr  	  s     {j02;?.z:/
1*=--??$%\+2B2B2D1E F> ?  /1 $$\%A%AKXXr   )skipc                J   ddl m} t        j                  t        j
                        xs# t        j                  t        j
                        }|j                         j                  j                  j                  }|D ]"  }t        |t              sJ  |||| dz          $ y)z
    Add dynamo guards to the current tracing context.

    Args:
        guards: guard(s) to add
        skip: number of stack frames to ignore for debug stack trace
    r   )TracingContextr1   )collect_debug_stackr  N)torch._guardsr  rO  r  r  r  r   r  r  r  r   r   r"   )r  rq   r  r  r   r   s         r   install_guardr  +  s     -$11 8		(	(	7  



-
-
;
;
?
?C K%'''E':JK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]   rZ  r  r[  r    r  r  )
r   r]   r  r  rZ  r  r[  r    r  r  )rt  rY   r  r  )
r   r]   r  r  rZ  r  r_  r  r  rv  )r  
__future__r   r@  r  r2  r  r  r2  r8  r  r  r5  r  rS  r  r  r  
contextlibr   r  r   r   typingr   r   r	   r
   r   r   r   torch.overridesr   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\   r]   r:  r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rz  numpyr  ModuleNotFoundErrorsympyrp   	getLoggerr   ra  r  getArtifactLoggerrO  rr  rq  r   rv   r  	lru_cacher  r  r=  rC  r   r   r_  rM  rP  rW  ri  rm  rr  r  ru  r  r  r  r  r  r  r  r  r  r  r  rN  rB  rD  r  rQ  rV  r  ra  ry  r  r  r  r  r  r  r   r   <module>r     s  " # 
          
     %    @ @ !    >    3
 
 
 & 1 
 0 O * 8 8 ," " " " " " " " "F     * FJ B I
  g!^^--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J
# J
|4R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W\  	Bs   N NN