
    ȅi                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	J
r
  SSKJr  SSKJrJrJr  SSKrSSKrSSKJr  SSKJrJrJrJr  SS	KJrJrJrJr  SS
KJ r   SSK!J"r"J#r#J$r$  SSK%J&r&J'r'J(r(J)r)  SSKJ*r*J+r+J,r,  SSK-J.r.J/r/J0r0J1r1J2r2J3r3J4r4  SSK5J6r6  \(       a  SSK7J8r8  SSK9J:r:  SSK;J<r<  \Rz                  R}                  \?S5      r@S\A\\4   S\A\\4   S\BSS4S jrCS\D\   S\D\   SS4S jrE " S S5      rF\R                  SSS\	S    4S! j5       rH\R                  SSS\	S    4S" j5       rI\R                  SSS\	S    4S# j5       rJg)$a  
Side effect tracking and management for TorchDynamo's compilation system.

This module provides infrastructure for tracking and managing side effects that occur
during symbolic execution, including:

- Tracking mutations to objects, attributes, and variables
- Managing context changes (cell variables, global namespace modifications)
- Handling aliasing and object identity preservation
- Managing stack frame state and local variable changes
- Tracking function calls with side effects

Key classes:
- SideEffects: Main container for tracking all side effects during execution
- MutableSideEffects: Specialization for mutable object tracking
- AttributeMutation/ValueMutation: Track specific types of mutations
- Various specialized side effect classes for different scenarios

The side effect system ensures that mutations performed during symbolic execution
are properly replayed during runtime, maintaining the correctness of compiled code
while enabling optimizations where safe.
    N)	GeneratorMutableMapping)CellType)AnyOptionalTYPE_CHECKINGAutogradFunctionContextVariable   )configgraph_break_hintsutils	variables)bytecode_from_templatecreate_call_functioncreate_call_methodcreate_instruction)	PyCodegen)collapse_resume_framesget_stack_above_dynamounimplemented)GlobalSourceLocalCellSourceSourceTempLocalSource)is_frozen_dataclassnn_module_new
object_new)AttributeMutationAttributeMutationExistingAttributeMutationNewis_side_effect_safeValueMutationExistingValueMutationNewVariableTracker)FrozenDataClassVariable)OutputGraph)InstructionTranslatorBase)ListVariableside_effects	dict_fromdict_to	mro_indexreturnc                     [        U5      R                  U   nUR                  U5        U R                  5        H  u  pEUR	                  XU5        M     g N)type__mro__clearitems__setitem__)r+   r,   r-   
dict_classkvs         T/home/james-whalen/.local/lib/python3.13/site-packages/torch/_dynamo/side_effects.py_manual_dict_setitemr:   G   sI     g&&y1JW!w1- "    	list_fromlist_toc                 X    [         R                  U5        [         R                  X5        g r0   )listr3   extend)r<   r=   s     r9   _manual_list_updaterA   T   s    JJwKK#r;   c                   D  ^  \ rS rSr% Sr\\\4   \S'   \\\\	\4   4   \S'   \
\   \S'   \\\
\R                     4   \S'         S_SS	S\\\\4      S\\\\\	\4   4      S\\\
\R                     4   S-  S\\
\      S
\\
\\\
\   4         S\\\\S\S\	4   4      SS4U 4S jjjrS\SS4S jrS\SS4S jrS\SS4S jrS\S\4S jrSS S\\	   4S jrS`S jrS\S\4S jrS\S\4S jrS\4S jrS\4S jrS\4S jrS\S\4S jrS\S \	S!\SS4S" jr   SaS\S \	S#\S$\S\4
S% jjr!S&\S!\SS4S' jr"S&\S\4S( jr#S)\S \	S\4S* jr$S)\S \	S!\SS4S+ jr%\&S,\'S\4S- j5       r(S\S\4S. jr)S\S\4S/ jr*S\S \	S\4S0 jr+S\S\4S1 jr,\-4S\S2\S3\'S\4S4 jjr.\.r/S\S2\S\4S5 jr0S6\1S-  S7\S8\S9\\	\4   S\4
S: jr2S7\'S\'4S; jr3S<\S=\S>\
\   S\4S? jr4S<\S=\S>\
\   S\4S@ jr5S\4SA jr6SB\\1   SC\7SD\S\4SE jr8SB\1S\S\4SF jr9SG\SH\
\   SS4SI jr:    SbSJ jr;ScSK jr<S\SS4SL jr=S\4SM jr>S\
\   4SN jr?SO\@SS4SP jrASQSSR\SSSS \	SS4
ST jrBSU\SS4SV jrCSO\@SS4SW jrDSdSX jrES\S\	4SY jrF SeSO\@SZ\SS4S[ jjrGS\4S\ jrHSfS] jrIS^rJU =rK$ )gSideEffectsY   a0  
Maintain records of mutations and provide methods to apply them during code generation.

Handles tracking and applying side effects during PyTorch Dynamo compilation,
maintaining Python semantics by managing mutations, attribute modifications,
and other side effects that occur during program execution.

Key responsibilities:
- Tracks mutations to Python objects, lists, and dictionaries that need to be
applied after an FX graph is run.
- Manages attribute modifications and deletions
- Handles tensor hooks and backward pass state
- Tracks cell variable mutations and global variable changes
- Ensures correct ordering and application of side effects after graph execution

This ensures that optimized code behaves identically to the original Python code with
respect to object mutations and other side effects.
id_to_variablestore_attr_mutations	keepalivemutation_user_stacksNoutput_graphr'   save_for_backwardtensor_hookszvariables.TensorVariablez!variables.RemovableHandleVariabler.   c                 R  > [         TU ]  5         [        R                  " U5      U l        U=(       d    0 U l        U=(       d    0 U l        U=(       d    0 U l        U=(       d    / U l        U=(       d    / U l	        U=(       d    0 U l
        SU l        S U l        [        5       U l        g )NF)super__init__weakrefrefoutput_graph_weakrefrE   rF   rH   rG   rJ   rK   _has_existing_dict_mutationca_final_callbacks_varset"ignore_mutation_on_these_variables)	selfrI   rE   rF   rH   rG   rJ   rK   	__class__s	           r9   rN   SideEffects.__init__s   s    2 	$+KK$=!,2$8$>B!$8$>B!"b!2!8b(.B ,1( ?C# IL/r;   varc                 :    U R                   R                  U5        g)zMutations to this variable will be executed but not not tracked,
typically used for temporary mutations that are later restored.N)rU   addrV   rY   s     r9   ignore_mutations_onSideEffects.ignore_mutations_on   s     	//33C8r;   c                 Z    XR                   ;   a  U R                   R                  U5        gg)zQRemove a variable from the skip mutation set, restoring normal mutation tracking.N)rU   remover\   s     r9   stop_ignoring_mutations_on&SideEffects.stop_ignoring_mutations_on   s'    99933::3? :r;   keyc                     [         R                  S:X  a  gXR                  ;  a  / U R                  U'   U R                  U   R                  [        R
                  R                  R                  5       5        g)z?Capture the current user stack from the instruction translator.silentN)r   side_effect_replay_policyrH   appendtorch_guardsTracingContextextract_stack)rV   rc   s     r9   _capture_user_stackSideEffects._capture_user_stack   s^    ++x7///-/D%%c*!!#&--MM((668	
r;   otherc                 "   [        U[        5      (       d   eU R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r0   )
isinstancerC   rE   rF   rJ   rK   )rV   rn   s     r9   __eq__SideEffects.__eq__   s}    %---- 5#7#77 8))U-G-GG8&&%*A*AA8 !!U%7%77		
r;   c                    U R                   UR                   :w  aB  U R                   R                  5       nUR                   R                  5       nX#:w  a  SU SU 3$ gU R                  UR                  :w  aB  U R                  R                  5       nUR                  R                  5       nXE:w  a  SU SU 3$ gU R                  UR                  :w  a  gU R                  UR                  :w  a  gg )Nzid_to_variable keys: z != zid_to_variable: unknown diffzstore_attr_mutations keys: z"store_attr_mutations: unknown diffrJ   rK   )rE   keysrF   rJ   rK   )rV   rn   sk_itvok_itvsk_samok_sams         r9   diffSideEffects.diff   s    %"6"66((--/F))..0F.vhd6(CC 2&&%*D*DD..335F//446F4VHDII7##u'>'>>&%"4"44!r;   c                 X   U R                  5       nUc   eU R                  U[        U R                  5      U R                  R                  5        VVs0 s H  u  p#U[        U5      _M     snnU R                  [        U R                  5      U R                  U R                  S9$ s  snnf )zCreate a shallow copy)rI   rE   rF   rH   rG   rJ   rK   )rQ   rW   dictrE   rF   r4   rH   r?   rG   rJ   rK   )rV   rP   r7   r8   s       r9   cloneSideEffects.clone   s    '')~~ 3 34'+'@'@'F'F'H"'Htq47
'H" "&!:!:4>>*"44**  

 
	
"s   B&itemc                 2    [        U5      U R                  ;   $ r0   )idrE   rV   r   s     r9   __contains__SideEffects.__contains__   s    $x4....r;   c                 2    U R                   [        U5         $ r0   )rE   r   r   s     r9   __getitem__SideEffects.__getitem__   s    ""2d8,,r;   c                     U R                  5       n[        U=(       a*    UR                  R                  R                  R
                  5      $ r0   )rQ   bool
current_txoutputcurrent_tracer,unsafe_allow_externally_visible_side_effectsrV   rI   s     r9   9should_allow_externally_visible_side_effects_in_subtracerESideEffects.should_allow_externally_visible_side_effects_in_subtracer   sA    002 k''..==jj
 	
r;   c                     U R                  5       n[        U=(       a*    UR                  R                  R                  R
                  5      $ r0   )rQ   r   r   r   r   allow_side_effects_in_hopr   s     r9    should_allow_side_effects_in_hop,SideEffects.should_allow_side_effects_in_hop   sA    002 X''..==WW
 	
r;   c                     U R                  5       n[        U=(       a*    UR                  R                  R                  R
                  5      $ r0   )rQ   r   r   r   r   is_reconstructing_generatorr   s     r9   r   'SideEffects.is_reconstructing_generator   sA    002 Z''..==YY
 	
r;   c                 f   SSK Jn  [        X5      (       a  gU R                  5       (       a  gU R	                  5       (       a  gU R                  5       (       a   [        SSU 3SS/[        R                  QS9  UR                  c   e[        UR                  5      (       d  [        S	S
U 3SS/S9  g)Nr   r	   Tz'Generator reconstruction with mutationszmutating object: zCannot reconstruct a generator with variable mutations. Dynamo needs to fully exhaust the generator, which may cause unintended variable modifications.z$Remove mutations from the generator.gb_typecontextexplanationhintszHOP: Unsafe side effectzAttempted to mutate zHMutating a variable from outside the scope of this HOP is not supported.aw  If the HOP is activation checkpointing (torch.utils.checkpoint.checkpoint), this points to a side effect in forward method. Eager activation checkpointing replays that side-effect while recomputing the forward in the backward. If you are ok with side-effect not replayed in the backward, try setting `torch._dynamo.config.skip_fwd_side_effects_in_bwd_under_checkpoint = True`F)torch._dynamo.variables.miscr
   rp   r   r   r   r   r   FUNDAMENTALmutation_typer"   )rV   r   r
   s      r9   check_allowed_side_effect%SideEffects.check_allowed_side_effect  s    P d<<IIKK0022++-- A+D625 ;&22
 !!---"4#5#5661.tf5fx	
 r;   namevaluec                     U R                  U5      (       d   eU R                  U5        XR                  ;  a  0 U R                  U'   X0R                  U   U'   U R                  U5        g r0   )is_attribute_mutationr   rF   rl   )rV   r   r   r   s       r9   
store_attrSideEffects.store_attr,  sf     ))$////&&t,000.0D%%d+05!!$'-  &r;   
deleted_okcheckc                     U(       a  U R                  U5      (       d   eU R                  U   U   nU(       dA  [        U[        R                  5      (       a"  [        SSU SU 3S/ [        R                  QS9  U$ )Nz$Attempted to read a deleted variablezitem: z, name:  r   )r   rF   rp   r   DeletedVariabler   r   
USER_ERROR)rV   r   r   r   r   results         r9   	load_attrSideEffects.load_attr7  s|     --d3333**406j1J1JKK> htf55)445	 r;   cellvarc                    UR                  5       (       a"  [        SSU SU 3S/ [        R                  QS9  [	        U[
        R                  5      (       d   e[	        U[
        R                  5      (       d   eU R                  USU5        g )NzWrite to immutable cellz	cellvar: z	, value: zFDynamo doesn't support writing to immutable/sourceless cell variables.r   cell_contents)	is_immutabler   r   	DIFFICULTrp   r   CellVariabler%   r   )rV   r   r   s      r9   
store_cellSideEffects.store_cellJ  s    !!1#G9IeW=d4)334	 '9#9#9::::%!:!:;;;;%8r;   c                    [        U[        R                  5      (       d   eU R                  US5      (       a  U R	                  USSS9$ UR
                  (       a  UR
                  $ [        S[        U5      S/ [        R                  QS9  g )Nr   F)r   zRead uninitialized cellzBAttempted to read a cell variable that has not been populated yet.r   )
rp   r   r   has_pending_mutation_of_attrr   pre_existing_contentsr   strr   r   )rV   r   s     r9   	load_cellSideEffects.load_cellV  s|    '9#9#9::::,,WoFF>>'?%>HH((000-L\1%001		
r;   gvarc                 f    [        U[        R                  5      (       d   eU R                  X5      $ r0   )rp   r   r%   r   )rV   r   r   s      r9   load_globalSideEffects.load_globalc  s*    $	 9 9::::~~d))r;   c                     [        U[        R                  5      (       d   e[        U[        R                  5      (       d   eU R                  XU5        g r0   )rp   r   r%   r   )rV   r   r   r   s       r9   store_globalSideEffects.store_globalg  sD     $	 9 9::::%!:!:;;;;E*r;   clsc           
      F   [         R                  " U SS 5      [        R                  [        R                  [
        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  4	;   $ )N__getattribute__)inspectgetattr_staticobjectr   r|   rT   	frozensetintr   r?   tupleBaseException)r   s    r9   "cls_supports_mutation_side_effects.SideEffects.cls_supports_mutation_side_effectsn  sv    %%c+=tD##!!  &&    !!""**
I
 

 
	
r;   c                 6    [        UR                  [        5      $ r0   )rp   r   r   r   s     r9   r   !SideEffects.is_attribute_mutation|  s    $,,.?@@r;   c                 z    U R                  U5      =(       a$    [        U R                  R                  U5      5      $ r0   )r   r   rF   getr   s     r9   has_pending_mutation SideEffects.has_pending_mutation  s5    ))$/ 
D%%))$/5
 	
r;   c                 n    U R                  U5      =(       a    X R                  R                  US5      ;   $ )N )r   rF   r   )rV   r   r   s      r9   r   (SideEffects.has_pending_mutation_of_attr  s6    ))
 >//33D"==	>r;   c                    UR                  5       (       a  g[        UR                  [        [        45      (       a  g[        U[
        R                  5      (       a&  XR                  ;   =(       d    UR                  U 5      $ U R                  U5      (       a  XR                  ;   $ UR                  c   eUR                  R                  $ )NFT)r   rp   r   r!   r$   r   UserDefinedObjectVariablerF   is_underlying_vt_modifiedr   is_modifiedr   s     r9   r   SideEffects.is_modified  s    d((+?AQ*RSSdI??@@444 8V8V9  %%d++4444!!---!!---r;   variablemutation_type_clsc           
      0   [        U5      U R                  ;   a>  [        U SUR                   SU R                  [        U5         R                   S35      eU" 5       Ul        X R                  [        U5      '   U R
                  R                  U5        U$ )z7Start tracking an existing or new variable for mutationz is already tracked for mutation. This could be because you are not using VariableBuilder to construct the variable tracker. Source of new object: z'. Source of previously tracked object: .)r   rE   AssertionErrorsourcer   rG   rg   )rV   r   r   r   s       r9   
_track_objSideEffects._track_obj  s     d8t*** * ) *2(9 :88<8K8KBtH8U8\8\7]]^	`  "3!4(0BtH%d#r;   c                 ,    U R                  UU[        S9$ )N)r   )r   r    )rV   r   r   s      r9   track_object_existing!SideEffects.track_object_existing  s#     7  
 	
r;   
cls_sourceuser_clsvariable_clsoptionsc                    U[         R                  R                  R                  L a<  [        R
                  " SS9   [         R                  R                  5       nS S S 5        O[        U5      nU" W4S[        U5      0UD6nX`R                  [        U5      '   U R                  R                  U5        U$ ! , (       d  f       NV= f)NT)recordr   )rh   autogradfunctionFunctionCtxwarningscatch_warningsFunctionr   r!   rE   r   rG   rg   )rV   r   r   r   r   objr   s          r9   track_object_newSideEffects.track_object_new  s     u~~..:::((5nn--/ 65 X&C
.z:
 

 (0BsG$c" 65s   B77
Cc                    SSK Jn  SSKJn  SSKJn  SSKJn  [        R                  n[        X5      (       a  UR                  U5      (       a  UnGO~[        US5      (       a"  [        US5      (       a  U" U5      (       d  UnGOK[        U[        R                  R                  5      (       a  [        R                   nGO[        U["        [$        R&                  45      (       a  [        R(                  nO[        U[*        [,        45      (       a  [        R.                  nO[        U[0        5      (       a  [        R2                  nO[        U[4        5      (       a  [        R6                  nOb[        U[8        5      (       a  [        R:                  nO<[=        U5      (       a  [>        nO%[        U[@        5      (       a  [        RB                  n[        U[        R                  5      (       d   eU$ )	Nr   )TorchFunctionModer   )GenericContextWrappingVariable)TorchFunctionModeVariable)is_forbidden_context_manager	__enter____exit__)"torch.overridesr   variables.ctx_managerr   variables.torch_functionr   variables.user_definedr   r   r   
issubclass is_supported_torch_function_modehasattrrh   nnModuleUnspecializedNNModuleVariabler|   collectionsOrderedDictUserDefinedDictVariablerT   r   UserDefinedSetVariabler   UserDefinedTupleVariabler?   UserDefinedListVariabler   MutableMappingVariabler   r&   r   "UserDefinedExceptionObjectVariable)rV   r   r   r   r   r   r   s          r9   get_variable_clsSideEffects.get_variable_cls  s_   5IGH // 	 
 
'HHRR4LHk***--0::9L%((//22$BBL4)@)@"ABB$<<L3	"233$;;L%(($==L$''$<<L.11$;;L **2L-00$GGL,	(K(KLLLLr;   base_cls_vtcls_vt	init_argsc                    UR                   n[        U[        R                  R                  5      (       a  [        U5      nU$ [        U[        R                  5      (       a  UR                  nO:[        U[        R                  5      (       a  UR                   nO[        SU 35      e[        R                  R                  UR                  5      (       d   eUR                  U5      nU$ )NzUnexpected base_cls_vt )r   r  rh   r	  r
  r   rp   r   BuiltinVariablefnUserDefinedClassVariableRuntimeErroris_supported_new_method__new__)rV   r  r  r  r   r   base_clss          r9   get_example_valueSideEffects.get_example_value  s     <<h00)C( 
% +y'@'@AA&>>K)K)KLL&,,"%<[M#JKK55MM      ""8,C
r;   c           	         UR                   nUR                  nU R                  U5      nU R                  XU5      nU" UUR                   UU[	        U5      S9nXR
                  [        U5      '   U R                  R                  U5        U$ )a  
Creates a UserDefinedObjectVariable (or its subclass) variable tracker
and mark it for attribute mutation tracking.

Also records the variable trackers to call __new__ method on
reconstruction. Roughly, the reconstruction looks like this
    base_cls_vt.__new__(user_cls, *init_args)
)r   r  r  r   )	r   r   r  r!  r!   rE   r   rG   rg   )	rV   r  r  r  r   r   r   r   r   s	            r9   track_new_user_defined_object)SideEffects.track_new_user_defined_object  s     ]]
<<,,X6$$[)D}}#.z:
 (0BsG$c"r;   c                     [        5       n[        R                  " [        5       S9nX R                  [        U5      '   U R                  R                  U5        U$ )Nr   )r   r   r   r!   rE   r   rG   rg   )rV   r   r   s      r9   track_cell_newSideEffects.track_cell_new7  sL     h)).0
 (0BsG$c"r;   r   cellcontentsc                     [         R                  " Uc  S O	[        5       UUS9nX@R                  [	        U5      '   U R
                  R                  U5        U$ )N)r   r   r   )r   r   r    rE   r   rG   rg   )rV   r   r*  r+  r   s        r9   track_cell_existingSideEffects.track_cell_existingB  sT     )) #).$6O6Q"*
 )1BtH%d#r;   c                     [         R                  " [        5       US9nX0R                  [	        U5      '   U R
                  R                  U5        U$ )N)r   r   )r   NewGlobalVariabler    rE   r   rG   rg   )rV   r   r   r   s       r9   track_global_existing!SideEffects.track_global_existingP  sF    ..35
 )1BtH%d#r;   ctxargsc                 ~    [        U[        R                  5      (       d   eU R                  R	                  X45        g r0   )rp   r   r
   rJ   rg   )rV   r3  r4  s      r9   track_save_for_backward#SideEffects.track_save_for_backwardY  s3     #yHHIIII%%sk2r;   c                    UR                    Hp  n[        U5      nUR                  U   nX0R                  ;  d  M.  [        U[        R
                  [        R                  45      (       d  M_  U R                  X$5        Mr     g r0   )rG   r   rE   rp   r   TensorVariableSymNodeVariabler   )rV   rn   
other_itemother_idother_variables        r9   -track_runahead_tensor_and_symvar_side_effects9SideEffects.track_runahead_tensor_and_symvar_side_effects_  si      //J*~H"11(;N222z!9!99;T;T U8 8 **:F *r;   c                   ^ ^	^
^ [        5       m[        5       m	S[        SS 4U	U U
U4S jjm
S[        S[        4U	4S jjnT R                  R	                  5        Vs/ s H&  n[        UR                  [        5      (       a  M$  UPM(     nn/ nUnUbo  UR                  UR                  UR                  /5        UR                  b*  UR                  c   eUR                  UR                  5        UR                  nUb  Mo  [        R                  " T
UUUR                  R                   T R"                  /-   5        @
T R                  R%                  5        VVs0 s H  u  pxU" U5      (       d  M  Xx_M     snnT l        T R&                  R%                  5        VVs0 s H  u  pxU" U5      (       d  M  Xx_M     snnT l        g s  snf s  snnf s  snnf )NrY   r.   c                    > U T;   a  g TR                  U 5        [        U R                  [        5      (       a  TR                  U 5        U TR                  ;   a%  [
        R                  " TTR                  U    5        g g r0   )r[   rp   r   r!   rF   r%   visit)rY   live_new_objectsrV   rB  visiteds    r9   rB  0SideEffects.prune_dead_object_new.<locals>.visitr  so    g~KK#++-ABB $$S) d///%%--c2 0r;   c                 N   > [        U R                  [        5      (       a  U T;   $ gNT)rp   r   r!   )rY   rC  s    r9   is_live2SideEffects.prune_dead_object_new.<locals>.is_live  s&    #++-ABB...r;   )rT   r%   r   rE   valuesrp   r   r!   r@   stacksymbolic_localsparentpost_prune_cell_and_freevarsrg   rB  r   backward_staterK   r4   rF   )rV   txrH  rY   pre_existing_varsinit_live_varscur_txr7   r8   rC  rB  rD  s   `        @@@r9   prune_dead_object_new!SideEffects.prune_dead_object_newm  s   (+14	 	4 	 	 	 	T 	 **113
3c//1EF 3 	 
 68 !!6<<1G1G"HI}}( ::FFF%%f&I&IJ]]F   	!		((!!		
  "00668
8TQGAJDAD8
 "66<<>%
>TQ'!*DAD>%
![
T
%
s$   #GGG	1G	G4Gc                 z   XR                   ;   a  g U R                  U5        U R                  U5        [        UR                  [
        5      (       a  SUR                  l        UR                  (       aH  [        U[        R                  5      (       a(  [        U[        R                  5      (       d  SU l        g g g g rG  )rU   r   rl   rp   r   r#   r   r   r   ConstDictVariableSetVariablerR   r\   s     r9   mutationSideEffects.mutation  s    999&&s+  %c'')>??,0C)JJ3	 ; ;<<sI$9$9::/3D, ; = r;   c                     U R                   $ r0   )rR   rV   s    r9   has_existing_dict_mutation&SideEffects.has_existing_dict_mutation  s    ///r;   c                     U R                   R                  5        Vs/ s H  oR                  U5      (       d  M  UPM     sn$ s  snf r0   )rE   rJ  r   r\   s     r9   _get_modified_varsSideEffects._get_modified_vars  s7    #2299;U;?O?OPS?T;UUUs
   AAcgc           	      d  ^^ U R                  5        GH  m[        TR                  [        5      (       d  TR                  c   eM4  [        T[
        R                  5      (       a  TR                  c`  TR                  U4S j5        TR                  [        SS5      5        TR                  T5        [        TR                  T   5      Tl        M  TR                  c  [        TR                  5      Tl        M  M  TR                  5       (       at  [        T[
        R                   R"                  5      (       aH  T" TSS9  TR                  T5        TR%                  5         [        TR                  T   5      Tl        GMq  GMt  [        T[
        R&                  5      (       a  [)        SSS/ S9  GM  [        T[
        R*                  5      (       a  SUU4S	 jjnTR                  U5        OTR                  U4S
 j5        TR                  R,                  c   eT" TR                  R,                  5        TR.                   H  nT" U5        M     TR                  [        S[1        TR.                  5      -   S5      5        TR                  T5        [        TR                  T   5      Tl        GM     U R2                   Hi  u  pET" UR                  5        TR5                  S5        U H  nT" U5        M     TR                  / [7        [1        U5      5      Q[9        S5      P5        Mk     g )Nc                  D   > T R                  [        R                  S5      $ )N	make_cellload_import_fromr   __name__rb  s   r9   <lambda>3SideEffects.codegen_save_tempvars.<locals>.<lambda>       3 3ENNK Pr;   r   Fallow_cachez<AutogradFunctionContextVariable escaped Dynamo-traced regionr   zAWe cannot reconstruct a torch.autograd.Function's context object.r   c                     > TR                   c   eT " TR                   5        T R                  T R                  S5      /5        g )Nr  )r  extend_outputcreate_load_attrrb  rY   s   r9   load_new_method:SideEffects.codegen_save_tempvars.<locals>.load_new_method  s;    ":::3??+(("*=*=i*H)IJr;   c                  D   > T R                  [        R                  S5      $ )Nr   rf  ri  s   r9   rj  rk    s     3 3ENNL Qr;   r   rJ   POP_TOPr.   N)r`  rp   r   r!   r   r   r   
local_nameadd_push_nullrp  r   	add_cacher   tempvarsr   	is_tensortorch_functionTensorWithTFOverrideVariable	clear_tosr
   r   r   r   r  lenrJ   load_methodr   r   )rV   rb  rs  argr3  r4  rY   s    `    @r9   codegen_save_tempvars!SideEffects.codegen_save_tempvars  s    **,Cc//1EFFzz---#y5566
 >>)$$P $$%9!U%CDLL%!0S1A!BCJZZ'!0!@CJ ( 11NN  s.LL% LLN!0S1A!BCJ C!J!JKKZ c	 c9#F#FGGK K $$_5$$Q ((33???3$$//0 ==CsG )   !5a#cmm:L6Le!TUS!,R[[-=>
W -Z //ICszzNNN./3 'D	2&y1 0r;   tensorhookhandlec                    UR                  5       (       d   e[        U[        R                  5      (       d   e[        U[        R                  5      (       a  UR                  5       (       d   e[        [        R                  U5      (       d   e[        U R                  R                  5       5      nXPR                  ;   a  US-  nXPR                  ;   a  M  XX44U R                  U'   UR                  (       a   eXSl        g )Nr   )r|  rp   r   r%   RemovableHandleVariable
is_mutabler  rh   Tensorr  rK   rt   idx)rV   r  r  r  r   r  s         r9   register_hookSideEffects.register_hook/  s     !!!!$	 9 9::::vy@@AA!!##	
$ u||T****$##((*+&&&1HC &&&"(!=#::~
r;   r  c                     U R                   U	 g r0   )rK   )rV   r  s     r9   remove_hookSideEffects.remove_hookE  s    c"r;   c                 $  ^^^ U R                   R                  5        Ho  u  mnnmTR                  (       d   S5       eSUUU4S jjnTR                  U5        T" U5        TR	                  [        SS5      5        TR                  U5        Mq     g )Nz4Hooks on non input tensors NYI - should not get herec                  X   > T " T5        T R                  T R                  T5      /5        g r0   )rp  rq  )rb  r   r  s   r9   gen_fn)SideEffects.codegen_hooks.<locals>.gen_fnr  s&    6
  ""5"5d";!<=r;   r   Frw  )rK   rJ  r   ry  rp  r   rz  )rV   rb  r  r  r  r   r  s    `   @@r9   codegen_hooksSideEffects.codegen_hooksH  s     %%'
F ==X"XX=> > V$tH1!U;< LL ] (r;   c                 ~    SSK Jn  U R                  c  [        R                  " / U" 5       S9U l        U R                  $ )Nr   )r$   r'  )variables.baser$   rS   r   r)   )rV   r$   s     r9   get_ca_final_callbacks_var&SideEffects.get_ca_final_callbacks_var~  s;    4&&.*3*@*@"2"4+D' ***r;   c                    [         R                  S:w  d   eU R                  R                  U/ 5      nSUR	                  5        3nSnUR
                  b  [        UR
                  [        5      (       a  SnO[        U[        R                  5      (       a  UR                  b  SUR                   S3nOF[        U[        R                  R                  5      (       a  SnOSUR
                  R                   S3nU(       a  [        5       n/ n[        [!        5       5      nU Hn  n[#        S	 U 5       5      n	X;  d  M  UR%                  U	5        [        Xx-   5      n
UR'                  S
R)                  [*        R,                  " U
5      5      5        Mp     SR)                  U5      nU U S[.        R0                  " US5       3nU$ U U S3nU$ )z1Format a side effect log message with user stack.re   zMutating object of type z (no source)z* (source: created in torch.compile region)z
 (source: )z- (source: torch function mode stack mutation)z (source name: c              3      #    U  HW  nUR                   UR                  UR                  UR                  [	        US S5      [	        USS5      [	        USS5      4v   MY     g7f)colnoN
end_lineno	end_colno)filenamelinenor   linegetattr).0fs     r9   	<genexpr>:SideEffects._format_side_effect_message.<locals>.<genexpr>  s]      $ # 

7D1<6;5 #s   AA!r   z
********

z

z    z+ (unable to find user stacks for mutations))r   rf   rH   r   python_type_namer   rp   r   r   r   rx  r}  TorchFunctionModeStackVariabler   rT   r   r   r   r[   rg   join	tracebackformat_listtextwrapindent)rV   rY   	locationsdescriptionsource_infoseenunique_formatted_stacksstack_above_dynamorK  stack_tuplestack_augmentedformatted_lineslog_strs                r9   _format_side_effect_message'SideEffects._format_side_effect_message  s   //8;;;--11#r:	01E1E1G0HI$::!#**o66JC!7!788S^^=W *3>>*:!<Y--LL  N !0

/@B5D13#!78N8P!Q" $ $ #$  *HH[)&<=O=W&XO+22	 5 5o FG' #, $4#8#89P#QO$k]$xX^7_6`aG  -},WX  r;   log_side_effectsc           
      n  ^ ^^^^^ / mS[         SS 4UU U4S jjn/ nT R                  5        GH  m[        R                  (       d!  [	        TR
                  [        5      (       d  M:  [	        T[        R                  5      (       ax  T" TSS9  T" TR
                  5        TR                  TR                  S 5      TR                  S 5      [        SSS9/5        UR                  [        S	5      /5        U" T5        M  [	        T[        R                  R                  5      (       a  TR                  R!                  5       (       d  [#        S
SSS/S9  T" TR
                  5        TR%                  S5        T" TSS9  UR                  / ['        S5      Q[        S5      P5        T" TR
                  5        TR%                  S5        UR                  / ['        S5      Q[        S5      P5        U" T5        GM  [	        T[        R(                  5      (       a  TR+                  5       (       a  T" TR
                  5        TR%                  S5        T" TSS9  TR,                  (       a#  T" TR
                  5        TR%                  S5        UR                  / ['        S5      Q[        S5      P5        TR,                  (       a'  UR                  / ['        S5      Q[        S5      P5        U" T5        GM  GM  [	        T[        R.                  R0                  5      (       Ga	  TR3                  U4S j5        TR5                  SS5        [        R.                  R7                  5       nTR8                  S==   U4-  ss'   TR;                  [        SUS95        TR3                  U4S j5        TR=                  TR>                  5        TR;                  [        S[A        TR>                  5      S95        TR5                  SS5        TR;                  [        S5      5        U" T5        GM  [	        T[        RB                  5      (       ao  TRD                  bb  TT RF                  ;   aO  T RI                  T5      nT" U5        UR                  TRK                  TRD                  5      /5        U" T5        GM  GM  T RM                  T5      (       Ga  [	        T[        RN                  5      (       Gaj  T RQ                  TRR                  5      (       GaI  0 n[T        RV                  RX                   H)  nTRZ                  R\                  R_                  5       Xu'   M+      [a        TRb                  5      Rd                  Rg                  [h        Rj                  5      nTR                  [        SUS9[        SUS   S9/5        T" TR
                  5        TR                  [        SUS   S9/5        T" TRR                  SS9  TR                  [        SUS   S9/5        [q        [T        US9n	UR                  / U	Q[        S5      P5        U" TRR                  5        GO$[	        T[        Rr                  5      (       Ga  T RQ                  TRt                  5      (       a  0 n[v        RV                  RX                   H)  nTRZ                  R\                  R_                  5       Xu'   M+     T" TR
                  5        TR                  [        SUS    S9/5        T" TRt                  SS9  TR                  [        SUS!   S9/5        [q        [v        US9n
UR                  / U
Q[        S5      P5        U" TRt                  5        Sn[y        T RF                  R{                  T0 5      R}                  5       5       GH  u  p\[	        T[        R~                  5      (       al  TRZ                  R\                  R                  U5        T" U5        [	        TR
                  [        5      (       d   eUR                  [        S"US9/5        S#nM  [	        U[        R                  5      (       a  [	        TR                  [        5      (       au  [        [        TS$S 5      U5      (       aV  TRZ                  R\                  R                  U5        T" TR
                  5        UR                  [        S%US9/5        S#nGMA  GMD  GMG  [	        T[        R                  5      (       a  TR                  U5      (       ax  TR3                  U4S& j5        T" TR
                  5        T" [        R                  " U5      5        T" U5        UR                  / [        S'S5      Q[        S5      P5        S#nGM  [	        T[        R                  5      (       a  TR                  5       (       a  TR                  S(S)5        TR%                  S*5        T" TR
                  5        T" [        R                  " U5      5        T" U5        UR                  / ['        S'5      Q[        S5      P5        S#nGM  TRZ                  R\                  R                  U5        T" U5        T" T5        UR                  [        S+US9/5        S#nGM     U(       a  U" T5        G
M  G
M  [	        T[        R                  5      (       ap  [        TRf                  5       HL  nTR3                  U4S, j5        T" TR
                  5        TR5                  SS5        TR                  5         MN     U" T5        GM-  [	        T[        R                  5      (       a|  S3UU4S- jjnTR3                  U5        T" TR                  TR                  R                  5       5      5        UR                  / [        SS5      Q[        S5      P5        U" T5        GM  [        [a        T5      5      e   [y        U5       H  nTR                  U5        M     T(       a>  T(       a6  S.R                  T5      m[        R                  R                  S/S0 U4S1 jS29  g g g ! [l         a6    [a        TRb                  5      Rd                  Rg                  [n        5      n GNf = f)4NrY   r.   c                    > [         R                  S:w  a@  T(       a8  TR                  U 5      nTR                  U5        [        R                  U5        g g g )Nre   )r   rf   r  rg   side_effects_logdebug)rY   msgr  rV   side_effect_messagess     r9   _maybe_log_side_effectBSideEffects.codegen_update_mutated.<locals>._maybe_log_side_effect  sJ    //8;@P66s;$++C0 &&s+	 AQ;r;   Frm  BUILD_SLICE   )r  STORE_SUBSCRz1Side effect on existing deque with limited maxlenr   zThis is not supported.z*Don't use a deque with `maxlen` specified.r   r@   r   rv  r3   r   updatec                  D   > T R                  [        R                  S5      $ )Nget_torch_function_mode_stackrf  ri  s   r9   rj  4SideEffects.codegen_update_mutated.<locals>.<lambda>,      B//(Gr;   co_varnames
STORE_FAST)argvalc                  D   > T R                  [        R                  S5      $ )Nset_torch_function_mode_stackrf  ri  s   r9   rj  r  5  r  r;   
BUILD_LIST
LOAD_CONSTr-   r,   r+   )varname_mapr=   r<   STORE_GLOBALTr   DELETE_ATTRc                  D   > T R                  [        R                  S5      $ )N object_setattr_ignore_descriptorrf  ri  s   r9   rj  r    s    B$7$7 %0R%r;      builtinsr   __setattr__
STORE_ATTRc                  D   > T R                  [        R                  S5      $ )N	iter_nextrf  ri  s   r9   rj  r    rl  r;   c                  L   > T " TR                   5        T R                  S5        g )Nsetstate)r   r   rr  s   r9   r  2SideEffects.codegen_update_mutated.<locals>.gen_fn  s    szzNLL,r;   z,

========================================

artifactc                      SSS.$ )Ndynamo_side_effectsstring)r   encodingr   r   r;   r9   rj  r  !  s    1 (%r;   c                     > T $ r0   r   )combined_msgs   r9   rj  r  %  s    <r;   )metadata_fn
payload_fnrw  )Yr%   r`  r   replay_side_effectsrp   r   r   r   r)   rp  create_load_constr   rg   listsDequeVariablemaxlenis_constant_noner   r  r   rW  has_new_itemsshould_reconstruct_allr}  r  ry  call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackr  r   rx  rF   r   create_store_derefr   r  r   _dict_vtr:   __code__r  rP  r   new_varr1   r   r2   indexr  r  
ValueErrorr|   r   r  _list_vtrA   reversedr   r4   r0  update_co_namesr   r   r   r    r  r  r   should_skip_descriptor_setterConstantVariabler   needs_slow_setattrrg  ListIteratorVariablerangepop_topRandomVariable
wrap_staterandomgetstater   r  rh   _loggingtrace_structured)rV   rb  r  r  suffixesr   contents_varr  r-   dict_update_instslist_update_instsside_effect_occurredr   _r  suffixr  r  rY   s   ```             @@@r9   codegen_update_mutated"SideEffects.codegen_update_mutated  s
    +-	, 	,D 	, 	, **,C--j

O7 7 #y55663E*3::  ,,T2,,T2*=a@ !3N!C DE&s+C!>!>?? zz2244! S "$<H	 3::x(3E*+A.*95 3::w'+A.*95 's+C!<!<== $$&&szzNNN8,s.113::w/OO/2.y9 11 !!3A!6 29 = +3/3 '6 Y--LL    
   E* //GGI.4'9.  !3L!NO   

3--.  &|S=O=O9PQ   E*  !3I!>?&s+C!7!788S^^=W $333#'>>##6L|$OOR%:%:3>>%J$KL*3/	 4 ++C0055  &&s||44 #%K 4 = = I I,.EELL,@,@,B) !JH$(O$;$;$A$A'33%	 $$.|IN. ,[5M szzN$$. ,[5K s||7$$. ,[5M )?,+)% OO..y9 +3<<855  &&s||44 #%K 3 < < H H,.EELL,@,@,B) !I szzN$$. ,[5K s||7$$. ,[5M )?+)% OO..y9 +3<<8$ (-$#+--11#r:@@B$KD "#y'B'BCC44T:5	)#**lCCCC /tLM 04,#E9+D+DEE%--/H %gc7D&A4HHEELL88>szzN$OO!3M$!O P 480 I $Y@@ ;;DAA((
 3::955d;<5	 !5a!? 29 = 04,"3	(K(KLL2244 ++JA}53::955d;<5	 S03S5G	5RS 04,44T:5	3 );LQU)V(WX/3,u$x (*3/ (C!?!?@@syy)A$$P szzN$$Q.JJL * 's+C!9!9::- -   (3>>#**"5"5"789-a7*95 's+$T#Y//O
 -T
 x(FV$ )  4MRR$L NN++ 0 , 	 !5C & H$(O$;$;$A$A$$G	Hs   <q44<r43r4c                     [        [        U R                  U R                  R	                  5       5      5      =(       d2    U R
                  =(       d    U R                  =(       d    U R
                  (       + $ r0   )anymapr   rE   rJ  rK   rJ   r\  s    r9   is_emptySideEffects.is_empty(  s\    D$$d&9&9&@&@&BCD !  !%%!   	
 	
r;   c                 l    U R                   R                  5         U R                  R                  5         g r0   )rG   r3   rE   r\  s    r9   r3   SideEffects.clear0  s$    !!#r;   )
rR   rS   rE   rU   rG   rH   rQ   rJ   rF   rK   )NNNNNN)r.   rC   )FF)rn   rC   r.   N)rP  r(   r.   N)r.   zvariables.ListVariable)Frw  )Lrh  
__module____qualname____firstlineno____doc__r|   r   r%   __annotations__r   r?   r   r  StackSummaryr   r   r
   rN   r]   ra   rl   r   r   rq   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr1   r   r   r   r   r   r#   r   track_mutabler   r   r   r  r!  r$  r(  r   r-  r1  r6  r>  rT  rY  r]  r`  r   r  r  r  r  r  r  r  r  r3   __static_attributes____classcell__)rW   s   @r9   rC   rC   Y   s   & o-..S/5I0JJKKCyY5K5K0LLMM
 @D )-  //N#/N !c?&:!;</N '$sO';"<<=
	/N #?D9O9O4P#PQ
/N DI&/N $6_8MMNO
/N .#7

/N0 
1/N /Nb9 94 9
@o @$ @

 
4 

F 
t 
- HSM ,
 / / /- - -
4 

$ 

T 
&o &$ &P	'#	'+.	'7F	'		' !  	
  
&
9/ 
9/ 
9d 
9
 
_ 
* *s * *+#++.+7F+	+ 
 
 
 
A/ Ad A
 
T 

> > >PT >
. .D .* #8	 "  	
 
* M

 "
 
	
TM  	
 c3h 
*% %$ %N$   (	
 
>$   (	
 
<			v&.6BQ	F # / 3"3*.*?3	3G"G	GI
V4O 4 4"0D 0VD$9 V^	 ^d ^@*  4	
  
,#s #t #4!	 4!d 4!l+5 53 5p 7<gg/3g	gR
$ 
$ $r;   rC   rP  r(   )NNNc              #      #    U R                   R                  R                  n SU R                   R                  l        Sv   XR                   R                  l        g! XR                   R                  l        f = f7f)zContext manager to temporarily allow side effects with extra outputs.

This is used for special cases (like FSDP functions) that need to perform
side effects even when the general policy is to disallow them.
TN)r   r   r   rP  orig_vals     r9   r   r   5  sW      yy''AAHF=A		  :=E		  :X		  :   !A=A A=A::A=c              #   4  #    U R                   R                  R                  n SU R                   R                  l        SU R                   R                  l        S v   XR                   R                  l        g ! XR                   R                  l        f = f7frG  )r   r   r   +traced_with_externally_visible_side_effectsr*  s     r9   2allow_externally_visible_side_effects_in_subtracerr/  F  sj      yy''TTHYPT		  MOS		  LPX		  MPX		  Ms   !B:A9 B9BBc              #      #    U R                   R                  R                  n SU R                   R                  l        S v   XR                   R                  l        g ! XR                   R                  l        f = f7frG  )r   r   r   r*  s     r9   "disallow_side_effects_in_generatorr1  S  sW      yy''CCHH?C		  <?G		  <x		  <r,  )Kr"  r  
contextlibr   r  r  r   rO   collections.abcr   r   typesr   typingr   r   r   rh   torch.nnr   r
   r   r   r   r   r   bytecode_transformationr   r   r   r   codegenr   excr   r   r   r   r   r   r   r   r   r   r   r  r   r    r!   r"   r#   r$   r%   r  r&   torch._dynamo.output_graphr'   torch._dynamo.symbolic_convertr(   torch._dynamo.variables.listsr)   r  getArtifactLoggerrh  r  r|   r   r:   r?   rA   rC   contextmanagerr   r/  r1  r   r;   r9   <module>r?     s  .        5  / /   H 9 9   N N J J A A   < 6H: >>33HnM 
.CH~
.(,S#X
.CF
.	
.$49 $tCy $T $
Y$ Y$x& F#F F F  	Y#	Y 	Y 	Y H#H H Hr;   