
    /jw                        d 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	m
Z
 ddlmZ ddlmZmZm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 dd	lmZmZmZmZ dd
lm Z  ddl!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z) ddlm*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 erddl7m8Z8 ddl9m:Z: ddl;m<Z< ej=        >                    e?d          Z@deAeef         deAeef         deBddfdZCdeDe         deDe         ddfdZE G d d          ZFejG        ddde	d          fd!            ZHejG        ddde	d          fd"            ZIejG        ddde	d          fd#            ZJdS )$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                     t          |          j        |         }|                    |           |                                 D ]\  }}|                    |||           d S N)type__mro__clearitems__setitem__)r+   r,   r-   
dict_classkvs         _/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/_dynamo/side_effects.py_manual_dict_setitemr:   G   sm     g&y1JW!! . .1w1----. .    	list_fromlist_toc                 p    t                               |           t                               ||            d S r0   )listr3   extend)r<   r=   s     r9   _manual_list_updaterA   T   s.    JJwKK#####r;   c                   r    e Zd ZU dZeeef         ed<   eeeeef         f         ed<   e	e
         ed<   eee	ej                 f         ed<   	 	 	 	 	 	 dadddeeeef                  deeeeeef         f                  deee	ej                 f         dz  dee	e
                  d	ee	eee	e         f                           d
eeeededef         f                  ddf fdZdeddfdZdeddfdZdeddfdZdedefdZdd dee         fdZdbdZde
defdZde
defdZdefdZdefdZdefdZdedefdZdeded eddfd!Z	 	 dcdeded#ed$edef
d%Z d&ed eddfd'Z!d&edefd(Z"d)ededefd*Z#d)eded eddfd+Z$e%d,e&defd-            Z'dedefd.Z(dedefd/Z)dededefd0Z*dedefd1Z+e,fde
d2ed3e&defd4Z-e-Z.de
d2edefd5Z/d6e0dz  d7e
d8e
d9eee
f         def
d:Z1d7e&de&fd;Z2d<ed=ed>e	e         de
fd?Z3d<ed=ed>e	e         defd@Z4defdAZ5dBee0         dCe6dDedefdEZ7dBe0de
defdFZ8dGedHe	e         ddfdIZ9	 	 	 	 dddJZ:dedMZ;deddfdNZ<defdOZ=de	e         fdPZ>dQe?ddfdRZ@dSddTedUddeddf
dVZAdWeddfdXZBdQe?ddfdYZCdfd[ZDdedefd\ZE	 dgdQe?d]eddfd^ZFdefd_ZGdhd`ZH xZIS )iSideEffectsah  
    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                 (   t                                                       t          j        |          | _        |pi | _        |pi | _        |pi | _        |pg | _        |pg | _	        |pi | _
        d| _        d | _        t                      | _        d S )NF)super__init__weakrefrefoutput_graph_weakrefrD   rE   rG   rF   rI   rJ   _has_existing_dict_mutationca_final_callbacks_varset"ignore_mutation_on_these_variables)	selfrH   rD   rE   rG   rF   rI   rJ   	__class__s	           r9   rM   zSideEffects.__init__s   s    2 	$+K$=$=!,2$8$>B!$8$>B!"b!2!8b(.B ,1( ?C# IL///r;   varc                 :    | j                             |           dS )zMutations to this variable will be executed but not not tracked,
        typically used for temporary mutations that are later restored.N)rT   addrU   rW   s     r9   ignore_mutations_onzSideEffects.ignore_mutations_on   s!     	/33C88888r;   c                 P    || j         v r| j                             |           dS dS )zQRemove a variable from the skip mutation set, restoring normal mutation tracking.N)rT   removerZ   s     r9   stop_ignoring_mutations_onz&SideEffects.stop_ignoring_mutations_on   s5    $9993::3????? :9r;   keyc                     t           j        dk    rdS || j        vr
g | j        |<   | j        |                             t          j        j                                                   dS )z?Capture the current user stack from the instruction translator.silentN)r   side_effect_replay_policyrG   appendtorch_guardsTracingContextextract_stack)rU   r_   s     r9   _capture_user_stackzSideEffects._capture_user_stack   sn    +x77Fd///-/D%c*!#&--M(6688	
 	
 	
 	
 	
r;   otherc                     t          |t                    sJ | j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r0   )
isinstancerC   rD   rE   rI   rJ   )rU   ri   s     r9   __eq__zSideEffects.__eq__   sh    %----- 5#77 8)U-GG8&%*AA8 !U%77		
r;   c                    | j         |j         k    rB| j                                         }|j                                         }||k    rd| d| S dS | j        |j        k    rB| j                                        }|j                                        }||k    rd| d| S dS | j        |j        k    rdS | j        |j        k    rdS d S )Nzid_to_variable keys: z != zid_to_variable: unknown diffzstore_attr_mutations keys: z"store_attr_mutations: unknown diffrI   rJ   )rD   keysrE   rI   rJ   )rU   ri   sk_itvok_itvsk_samok_sams         r9   diffzSideEffects.diff   s    %"666(--//F)..00FCvCC6CCC 21&%*DDD.3355F/4466FIVIIIII77#u'>>>&&%"444!>4r;   c           	         |                                  }|J |                     |t          | j                  d | j                                        D             | j        t          | j                  | j	        | j
                  S )zCreate a shallow copyNc                 4    i | ]\  }}|t          |          S  )dict).0r7   r8   s      r9   
<dictcomp>z%SideEffects.clone.<locals>.<dictcomp>   s1     " " "#q!477" " "r;   )rH   rD   rE   rG   rF   rI   rJ   )rP   rV   rw   rD   rE   r4   rG   r?   rF   rI   rJ   )rU   rO   s     r9   clonezSideEffects.clone   s    ''))~~ 344" "'+'@'F'F'H'H" " " "&!:4>**"4*  

 

 
	
r;   itemc                 .    t          |          | j        v S r0   )idrD   rU   r{   s     r9   __contains__zSideEffects.__contains__   s    $xx4...r;   c                 6    | j         t          |                   S r0   )rD   r}   r~   s     r9   __getitem__zSideEffects.__getitem__   s    "2d88,,r;   c                 t    |                                  }t          |o|j        j        j        j                  S r0   )rP   bool
current_txoutputcurrent_tracer,unsafe_allow_externally_visible_side_effectsrU   rH   s     r9   9should_allow_externally_visible_side_effects_in_subtracerzESideEffects.should_allow_externally_visible_side_effects_in_subtracer   s=    0022 k'.=j
 
 	
r;   c                 t    |                                  }t          |o|j        j        j        j                  S r0   )rP   r   r   r   r   allow_side_effects_in_hopr   s     r9    should_allow_side_effects_in_hopz,SideEffects.should_allow_side_effects_in_hop   s=    0022 X'.=W
 
 	
r;   c                 t    |                                  }t          |o|j        j        j        j                  S r0   )rP   r   r   r   r   is_reconstructing_generatorr   s     r9   r   z'SideEffects.is_reconstructing_generator   s=    0022 Z'.=Y
 
 	
r;   c                 d   ddl m} t          ||          rdS |                                 rdS |                                 rdS |                                 r#t          dd| ddgt          j                   |j	        J t          |j	                  st          d	d
| ddg           dS )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
   rk   r   r   r   r   r   FUNDAMENTALmutation_typer"   )rU   r{   r
   s      r9   check_allowed_side_effectz%SideEffects.check_allowed_side_effect  s   PPPPPP d;<< 	4IIKK 	40022 	4++-- 	 A2D225 ;&2
 
 
 
 !---"4#566 	15t55fx	
 
 
 
 ur;   namevaluec                     |                      |          sJ |                     |           || j        vr
i | j        |<   || j        |         |<   |                     |           d S r0   )is_attribute_mutationr   rE   rh   )rU   r{   r   r   s       r9   
store_attrzSideEffects.store_attr,  sy     ))$/////&&t,,,t000.0D%d+05!$'-  &&&&&r;   F
deleted_okcheckc                     |r|                      |          sJ | j        |         |         }|s?t          |t          j                  r%t          dd| d| dg t          j                   |S )Nz$Attempted to read a deleted variablezitem: z, name:  r   )r   rE   rk   r   DeletedVariabler   r   
USER_ERROR)rU   r{   r   r   r   results         r9   	load_attrzSideEffects.load_attr7  s      	4--d33333*406 	j1JKK 	>555t555)45	    r;   cellvarc                    |                                 r%t          dd| d| dg t          j                   t	          |t
          j                  sJ t	          |t
          j                  sJ |                     |d|           d S )NzWrite to immutable cellz	cellvar: z	, value: zFDynamo doesn't support writing to immutable/sourceless cell variables.r   cell_contents)	is_immutabler   r   	DIFFICULTrk   r   CellVariabler%   r   )rU   r   r   s      r9   
store_cellzSideEffects.store_cellJ  s    !! 	1=G==e==d4)34	    '9#9:::::%!:;;;;;%88888r;   c                    t          |t          j                  sJ |                     |d          r|                     |dd          S |j        r|j        S t          dt          |          dg t          j	                   d S )Nr   F)r   zRead uninitialized cellzBAttempted to read a cell variable that has not been populated yet.r   )
rk   r   r   has_pending_mutation_of_attrr   pre_existing_contentsr   strr   r   )rU   r   s     r9   	load_cellzSideEffects.load_cellV  s    '9#9:::::,,WoFF 	I>>'?%>HHH( 	100-LL\1%01		
 	
 	
 	
 	
 	
r;   gvarc                 f    t          |t          j                  sJ |                     ||          S r0   )rk   r   r%   r   )rU   r   r   s      r9   load_globalzSideEffects.load_globalc  s/    $	 9:::::~~dD)))r;   c                     t          |t          j                  sJ t          |t          j                  sJ |                     |||           d S r0   )rk   r   r%   r   )rU   r   r   r   s       r9   store_globalzSideEffects.store_globalg  sR     $	 9:::::%!:;;;;;dE*****r;   clsc           
          t          j        | dd           t          j        t          j        t
          j        t          j        t          j        t          j        t          j        t          j        t          j        f	v S )N__getattribute__)inspectgetattr_staticobjectr   rw   rS   	frozensetintr   r?   tupleBaseException)r   s    r9   "cls_supports_mutation_side_effectsz.SideEffects.cls_supports_mutation_side_effectsn  s[    %c+=tDD#! &  !"*
I
 

 
	
r;   c                 6    t          |j        t                    S r0   )rk   r   r   r~   s     r9   r   z!SideEffects.is_attribute_mutation|  s    $,.?@@@r;   c                 z    |                      |          o&t          | j                            |                    S r0   )r   r   rE   getr~   s     r9   has_pending_mutationz SideEffects.has_pending_mutation  s=    ))$// 
D%))$//5
 5
 	
r;   c                 f    |                      |          o|| j                            |d          v S )Nrv   )r   rE   r   )rU   r{   r   s      r9   r   z(SideEffects.has_pending_mutation_of_attr  s=    ))
 
 >d/33D"===	>r;   c                 J   |                                 rdS t          |j        t          t          f          rdS t          |t
          j                  r|| j        v p|                    |           S | 	                    |          r	|| j        v S |j        J |j        j
        S )NFT)r   rk   r   r!   r$   r   UserDefinedObjectVariablerE   is_underlying_vt_modifiedr   is_modifiedr~   s     r9   r   zSideEffects.is_modified  s     	5d(+?AQ*RSS 	4dI?@@ 	444 8V8V9 9  %%d++ 	54444!---!--r;   variablemutation_type_clsc           
      &   t          |          | j        v r:t          | d|j         d| j        t          |                   j         d           |            |_        || j        t          |          <   | j                            |           |S )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}   rD   AssertionErrorsourcer   rF   rc   )rU   r{   r   r   s       r9   
_track_objzSideEffects._track_obj  s     d88t***  ` ` *2` ` 9=8KBtHH8U8\	` ` `   "3!2!4!4(0BtHH%d###r;   c                 <    |                      ||t                    S )N)r   )r   r    )rU   r{   r   s      r9   track_object_existingz!SideEffects.track_object_existing  s(     7  
 
 	
r;   
cls_sourceuser_clsvariable_clsoptionsc                 ~   |t           j        j        j        u rLt	          j        d          5  t           j                                        }d d d            n# 1 swxY w Y   nt          |          } ||fdt          |          i|}|| j	        t          |          <   | j                            |           |S )NT)recordr   )rd   autogradfunctionFunctionCtxwarningscatch_warningsFunctionr   r!   rD   r}   rF   rc   )rU   r   r   r   r   objr   s          r9   track_object_newzSideEffects.track_object_new  s    u~.:::(555 0 0n--//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X&&C<
 
.z::
 
 

 (0BsGG$c"""s   AA Ac                    ddl m} ddlm} ddlm} ddlm} t          j	        }t          ||          r|                    |          r|}n}t          |d          rt          |d          r ||          s|}nNt          |t          j        j                  rt          j        }n!t          |t"          t$          j        f          rt          j        }nt          |t*          t,          f          rt          j        }nt          |t0                    rt          j        }nt          |t4                    rt          j        }nt          |t8                    rt          j        }ndt=          |          rt>          }nMt          |t@                    rt          j!        }n+t          j"        #                    |          rt          j"        }t          |t          j	                  sJ |S )	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hasattrrd   nnModuleUnspecializedNNModuleVariablerw   collectionsOrderedDictUserDefinedDictVariablerS   r   UserDefinedSetVariabler   UserDefinedTupleVariabler?   UserDefinedListVariabler   MutableMappingVariabler   r&   r   "UserDefinedExceptionObjectVariableInspectVariableis_matching_class)rU   r   r   r   r   r   r   s          r9   get_variable_clszSideEffects.get_variable_cls  s   555555IIIIIIGGGGGGHHHHHH / 	 '
 
 	5'HHRR	5 5LLHk**	5*--	5 10::	5
 :LL%(/22 	5$BLL4)@"ABB 	5$<LL3	"233 	5$;LL%(( 	5$=LL$'' 		5$<LL.11 	5$;LL ** 	52LL-00 	5$GLL&88BB 	5$4L,	(KLLLLLr;   base_cls_vtcls_vt	init_argsc                    |j         }t          |t          j        j                  rt          |          }nt          |t          j                  r|j	        }n4t          |t          j
                  r|j         }nt          d|           t          j
                            |j                  sJ |                    |          }|S )NzUnexpected base_cls_vt )r   r   rd   r   r   r   rk   r   BuiltinVariablefnUserDefinedClassVariableRuntimeErroris_supported_new_method__new__)rU   r   r   r   r   r   base_clss          r9   get_example_valuezSideEffects.get_example_value  s     <h00 	-))CC+y'@AA L&>K)KLL L&,"#J[#J#JKKK5MM      ""8,,C
r;   c           	          |j         }|j        }|                     |          }|                     |||          } |||j         ||t	          |                    }|| j        t          |          <   | j                            |           |S )aM  
        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!   rD   r}   rF   rc   )	rU   r   r   r   r   r   r   r   r   s	            r9   track_new_user_defined_objectz)SideEffects.track_new_user_defined_object  s     ]
<,,X66$$[&)DD<}#.z::
 
 
 (0BsGG$c"""r;   c                     t                      }t          j        t                                }|| j        t          |          <   | j                            |           |S )Nr   )r   r   r   r!   rD   r}   rF   rc   )rU   r   r   s      r9   track_cell_newzSideEffects.track_cell_new9  s]     hh).00
 
 
 (0BsGG$c"""r;   r   cellcontentsc                     t          j        |d nt                      ||          }|| j        t	          |          <   | j                            |           |S )N)r   r   r   )r   r   r    rD   r}   rF   rc   )rU   r   r  r  r   s        r9   track_cell_existingzSideEffects.track_cell_existingD  se     ) #).$$6O6Q6Q"*
 
 
 )1BtHH%d###r;   c                     t          j        t                      |          }|| j        t	          |          <   | j                            |           |S )N)r   r   )r   NewGlobalVariabler    rD   r}   rF   rc   )rU   r   r{   r   s       r9   track_global_existingz!SideEffects.track_global_existingR  sU    .355
 
 
 )1BtHH%d###r;   ctxargsc                 v    t          |t          j                  sJ | j                            ||f           d S r0   )rk   r   r
   rI   rc   )rU   r  r  s      r9   track_save_for_backwardz#SideEffects.track_save_for_backward[  s>     #yHIIIII%%sDk22222r;   c                     |j         D ]c}t          |          }|j        |         }|| j        vr<t          |t          j        t          j        f          r|                     ||           dd S r0   )rF   r}   rD   rk   r   TensorVariableSymNodeVariabler   )rU   ri   
other_itemother_idother_variables        r9   -track_runahead_tensor_and_symvar_side_effectsz9SideEffects.track_runahead_tensor_and_symvar_side_effectsa  s      / 	G 	GJ*~~H"1(;Nt222z!99;T U8 82 **:~FFF	G 	Gr;   txr(   c                     t                      t                      dt          dd f fddt          dt          ffdd  j                                        D             }g }|}|T|                    |j        |j        g           |j        #|j	        J |
                    |j	                   |j        }|Tt          j        |||j        j         j        gz              fd j                                        D              _        fd j                                        D              _        d S )NrW   r.   c                     | v rd S                      |            t          | j        t                    r                     |            | j        v r"t          j        j        |                     d S d S r0   )rY   rk   r   r!   rE   r%   visit)rW   live_new_objectsrU   r$  visiteds    r9   r$  z0SideEffects.prune_dead_object_new.<locals>.visitt  s    g~~KK#+-ABB * $$S))) d///%-c2     0/r;   c                 D    t          | j        t                    r| v S dS NTrk   r   r!   )rW   r%  s    r9   is_livez2SideEffects.prune_dead_object_new.<locals>.is_live  s*    #+-ABB /...4r;   c                 F    g | ]}t          |j        t                    |S rv   r)  )rx   rW   s     r9   
<listcomp>z5SideEffects.prune_dead_object_new.<locals>.<listcomp>  s<     
 
 
c/1EFF

 
 
r;   c                 2    i | ]\  }} |          ||S rv   rv   rx   r7   r8   r*  s      r9   ry   z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>  s<     
 
 
QGGAJJ
q
 
 
r;   c                 2    i | ]\  }} |          ||S rv   rv   r.  s      r9   ry   z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>  s<     %
 %
 %
Q''!**%
q%
 %
 %
r;   )rS   r%   r   rD   valuesr@   stacksymbolic_localsparentpost_prune_cell_and_freevarsrc   r$  r   backward_staterJ   r4   rE   )	rU   r!  pre_existing_varsinit_live_varscur_txr*  r%  r$  r&  s	   `    @@@@r9   prune_dead_object_newz!SideEffects.prune_dead_object_newo  s   (+14	 	4 	 	 	 	 	 	 	 	 	 	 	T 	 	 	 	 	 	

 
*1133
 
 
 68 !!6<1G"HIII}( :FFF%%f&IJJJ]F   	!	(!		
 		
 		
 
 
 
 
!06688
 
 
%
 %
 %
 %
!6<<>>%
 %
 %
!!!r;   c                 L   || j         v rd S |                     |           |                     |           t          |j        t
                    rd|j        _        |j        r=t          |t          j	                  r%t          |t          j
                  sd| _        d S d S d S d S r(  )rT   r   rh   rk   r   r#   r   r   r   ConstDictVariableSetVariablerQ   rZ   s     r9   mutationzSideEffects.mutation  s    $999F&&s+++  %%%c')>?? 	1,0C)J	43	 ;<<	4 sI$9::	4
 04D,,,	4 	4 	4 	4 	4 	4r;   c                     | j         S r0   )rQ   rU   s    r9   has_existing_dict_mutationz&SideEffects.has_existing_dict_mutation  s    //r;   c                 N      fd j                                         D             S )Nc                 >    g | ]}                     |          |S rv   )r   )rx   rW   rU   s     r9   r,  z2SideEffects._get_modified_vars.<locals>.<listcomp>  s-    UUUt?O?OPS?T?TUUUUr;   )rD   r0  r?  s   `r9   _get_modified_varszSideEffects._get_modified_vars  s,    UUUUt299;;UUUUr;   cgc           	      D   |                                  D ]t          j        t                    s
j        J 't          t
          j                  rj        p                    fd           	                    t          dd                                                    t          j                           _        j        t          j                  _        ى                                rvt          t
          j        j                  rU d                                                                           t          j                           _        ct          t
          j                  rt)          dddg            t          t
          j                  rdfd
}                    |           n                    fd           j        j        J  j        j                   j        D ]} |           	                    t          dt1          j                  z   d                                                    t          j                           _        | j        D ]z\  }} |j                                       d           |D ]} |           	                    g t7          t1          |                    t9          d                     {d S )Nc                  D                          t          j        d          S )N	make_cellload_import_fromr   __name__rD  s   r9   <lambda>z3SideEffects.codegen_save_tempvars.<locals>.<lambda>       3 3ENK P P r;   r   Fallow_cachez<AutogradFunctionContextVariable escaped Dynamo-traced regionr   zAWe cannot reconstruct a torch.autograd.Function's context object.r   r.   c                      j         J   j                                                              d          g           d S )Nr  )r   extend_outputcreate_load_attrrD  rW   s   r9   load_new_methodz:SideEffects.codegen_save_tempvars.<locals>.load_new_method  sN    ":::3?+++(("*=*=i*H*H)IJJJJJr;   c                  D                          t          j        d          S )Nr   rH  rK  s   r9   rL  z3SideEffects.codegen_save_tempvars.<locals>.<lambda>  s     3 3ENL Q Q r;   r   rI   POP_TOPr.   N)rC  rk   r   r!   r   r   r   
local_nameadd_push_nullrQ  r   	add_cacher   tempvarsr   	is_tensortorch_functionTensorWithTFOverrideVariable	clear_tosr
   r   r   r   r   lenrI   load_methodr   r   )rU   rD  rT  argr  r  rW   s    `    @r9   codegen_save_tempvarsz!SideEffects.codegen_save_tempvars  s{    **,, K	? K	?Cc/1EFF z---#y566 F?
 >)$$PPPP   $$%9!U%C%CDDDLL%%%!0S1A!B!BCJJZ'!0!@!@CJ 8? 1N  	C Bs....LL%%% LLNNN!0S1A!B!BCJC!JKK "?Z c	     c9#FGG K K K K K K K $$_5555$$QQQQ   (3???3$/000 =  CBsGGGG   !5a#cm:L:L6Le!T!TUUUS!!!,R[-=>>

/ 
	 
	ICBszNNNNN.///  3'D		22&y11   
	 
	r;   tensorhookhandlec                    |                                 sJ t          |t          j                  sJ t          |t          j                  r|                                sJ t          t          j        |          sJ t          | j
                                                  }|| j
        v r|dz  }|| j
        v ||||f| j
        |<   |j        rJ ||_        d S )Nr   )r\  rk   r   r%   RemovableHandleVariable
is_mutabler   rd   Tensorr`  rJ   rn   idx)rU   rd  re  rf  r   rk  s         r9   register_hookzSideEffects.register_hook1  s     !!!!!$	 9:::::vy@AA	
!!##	
 	
$ u|T*****$#((**++T&&&1HC T&&&"($!=#:~


r;   rk  c                     | j         |= d S r0   )rJ   )rU   rk  s     r9   remove_hookzSideEffects.remove_hookG  s    c"""r;   c                 0   | j                                         D ]x\  }}j        s
J d            dfd}                    |            |                               t          dd                                         |           yd S )Nz4Hooks on non input tensors NYI - should not get herer.   c                  p                                                                      g           d S r0   )rQ  rR  )rD  r   rd  s   r9   gen_fnz)SideEffects.codegen_hooks.<locals>.gen_fnt  s;    6


  ""5"5d";";!<=====r;   r   FrW  )rJ   r0  r   rY  rQ  r   rZ  )rU   rD  re  rf  rq  r   rd  s    `   @@r9   codegen_hookszSideEffects.codegen_hooksJ  s     %%''3	! 3	! 
F =XX"XXX=> > > > > > > > V$$$BtHHH1!U;;<<< LL    g3	! 3	!r;   variables.ListVariablec                 p    ddl m} | j        #t          j        g  |                      | _        | j        S )Nr   )r$   r  )variables.baser$   rR   r   r)   )rU   r$   s     r9   get_ca_final_callbacks_varz&SideEffects.get_ca_final_callbacks_var  sQ    444444&.*3*@"2"2"4"4+ + +D' **r;   c                 j   t           j        dk    sJ | j                            |g           }d|                                 }d}|j        |t          |j        t                    rd}n_t          |t          j	                  r|j
        d|j
         d}n2t          |t          j        j                  rd}nd	|j        j         d}|rt                      }g }t          t!                                }|D ]}t#          d
 |D                       }	|	|vra|                    |	           t          ||z             }
|                    d                    t+          j        |
                               d                    |          }| | dt/          j        |d           }n| | d}|S )z1Format a side effect log message with user stack.ra   zMutating object of type z (no source)Nz* (source: created in torch.compile region)z
 (source: )z- (source: torch function mode stack mutation)z (source name: c              3      K   | ]N}|j         |j        |j        |j        t	          |d d          t	          |dd          t	          |dd          fV  OdS )colnoN
end_lineno	end_colno)filenamelinenor   linegetattr)rx   fs     r9   	<genexpr>z:SideEffects._format_side_effect_message.<locals>.<genexpr>  s{       $ $  
7D11<66;55$ $ $ $ $ $r;   r   z
********

z

z    z+ (unable to find user stacks for mutations))r   rb   rG   r   python_type_namer   rk   r   r   r   rX  r]  TorchFunctionModeStackVariabler   rS   r   r   r   rY   rc   join	tracebackformat_listtextwrapindent)rU   rW   	locationsdescriptionsource_infoseenunique_formatted_stacksstack_above_dynamor1  stack_tuplestack_augmentedformatted_lineslog_strs                r9   _format_side_effect_messagez'SideEffects._format_side_effect_message  s   /8;;;;-11#r::	I1E1E1G1GII$:!#*o66 
CJC!788 CS^=W<3><<<Y-L  C N C
BBB  	55D13#!78N8P8P!Q!Q"   $ $ $ #$ $ $   d**HH[)))&<=ORW=W&X&XO+22	 5o F FGG   $4#8#89P#Q#QO$akaaxX^7_7_aaGG XXXX  r;   log_side_effectsc           	          g dt           dd f fd}g }                                 D ]t          j        st	          j        t                    s*t	          t          j                  r d            j                   	                    
                    d           
                    d           t          dd          g           |                    t          d	          g            |           t	          t          j        j                  rj                                        st#          d
dddg            j                                       d            d           |                    g t'          d          t          d                      j                                       d           |                    g t'          d          t          d                      |           t	          t          j                  r                                r j                                       d            d           j        r% j                                       d           |                    g t'          d          t          d                     j        r3|                    g t'          d          t          d                      |           t	          t          j        j                  r3                    fd                               dd           t          j                                        }j        dxx         |fz  cc<                       t          d|                                         fd                               j                                       t          dtA          j                                                           dd                               t          d                      |           Lt	          t          j!                  rkj"        d j#        v rY $                              } |           |                    %                    j"                  g            |           щ &                              rxt	          t          j'                  r̉ (                    j)                  ri }tT          j+        j,        D ]#}j-        j.        /                                ||<   $	 ta          j1                  j2        3                    th          j5                  }nA# tl          $ r4 ta          j1                  j2        3                    tn                    }Y nw xY w	                    t          d|          t          d|d                   g            j                   	                    t          d|d                   g            j)        d           	                    t          d|d                   g           tq          tT          |          }	|                    g |	t          d                      |j)                   n0t	          t          j9                  r (                    j:                  ri }tv          j+        j,        D ]#}j-        j.        /                                ||<   $ j                   	                    t          d|d                    g            j:        d           	                    t          d|d!                   g           tq          tv          |          }
|                    g |
t          d                      |j:                   d}ty           j#        =                    i           >                                          D ]\  }}t	          t          j?                  rnj-        j.        @                    |            |           t	          j        t                    sJ |                    t          d"|          g           d#}t	          |t          jB                  rt	          jC        t                    rut          t          d$d           |          rVj-        j.        @                    |            j                   |                    t          d%|          g           d#}9t	          t          jG                  rH                    |          r                    fd&            j                    t          jI        |                      |           |                    g t          d'd          t          d                     d#}t	          t          jG                  rK                                rL                    d(d)                               d*            j                    t          jI        |                      |           |                    g t'          d'          t          d                     d#}j-        j.        @                    |            |                       |                    t          d+|          g           d#}|r |           _t	          t          jM                  rvt          j3                  D ]T}                    fd,            j                                       dd           O                                 U |           t	          t          jP                  rd3fd-}                    |            Q                    jR        S                                                     |                    g t          dd          t          d                      |           t          ta                              ty          |          D ]}	                    |           r?r?d.U                              t          jW        X                    d/d0 fd12           d S d S d S )4NrW   r.   c                     t           j        dk    rHrH                    |           }                    |           t                              |           d S d S d S )Nra   )r   rb   r  rc   side_effects_logdebug)rW   msgr  rU   side_effect_messagess     r9   _maybe_log_side_effectzBSideEffects.codegen_update_mutated.<locals>._maybe_log_side_effect  sf    /8;;@P;66s;;$++C000 &&s+++++	 <;;;r;   FrN  BUILD_SLICE   )rb  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          j        d          S )Nget_torch_function_mode_stackrH  rK  s   r9   rL  z4SideEffects.codegen_update_mutated.<locals>.<lambda>.      B//(G  r;   co_varnames
STORE_FAST)argvalc                  D                          t          j        d          S )Nset_torch_function_mode_stackrH  rK  s   r9   rL  z4SideEffects.codegen_update_mutated.<locals>.<lambda>7  r  r;   
BUILD_LIST
LOAD_CONSTr-   r,   r+   )varname_mapr=   r<   STORE_GLOBALTr   DELETE_ATTRc                  D                          t          j        d          S )N object_setattr_ignore_descriptorrH  rK  s   r9   rL  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  s    B$7$7 %0R% % r;      builtinsr   __setattr__
STORE_ATTRc                  D                          t          j        d          S )N	iter_nextrH  rK  s   r9   rL  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  rM  r;   c                  R      j                                         d           d S )Nsetstate)r   r   rS  s   r9   rq  z2SideEffects.codegen_update_mutated.<locals>.gen_fn  s*    BszNNNLL,,,,,r;   z,

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

artifactc                      dddS )Ndynamo_side_effectsstring)r   encodingrv   rv   r;   r9   rL  z4SideEffects.codegen_update_mutated.<locals>.<lambda>#  s    1 (% % r;   c                       S r0   rv   )combined_msgs   r9   rL  z4SideEffects.codegen_update_mutated.<locals>.<lambda>'  s    < r;   )metadata_fn
payload_fnrW  )Yr%   rC  r   replay_side_effectsrk   r   r   r   r)   rQ  create_load_constr   rc   listsDequeVariablemaxlenis_constant_noner   ra  r   r;  has_new_itemsshould_reconstruct_allr]  r  rY  call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackr`  r   rX  rE   r   create_store_derefr   r   r   _dict_vtr:   __code__r  r!  r   new_varr1   r   r2   indexr   r   
ValueErrorrw   r   r   _list_vtrA   reversedr   r4   r  update_co_namesr   r   r   r    r   r  r   should_skip_descriptor_setterConstantVariabler   needs_slow_setattrrI  ListIteratorVariablerangepop_topRandomVariable
wrap_staterandomgetstater   r  rd   _loggingtrace_structured)rU   rD  r  r  suffixesr   contents_varr  r-   dict_update_instslist_update_instsside_effect_occurredr   _rq  suffixr  r  rW   s   ```             @@@r9   codegen_update_mutatedz"SideEffects.codegen_update_mutated  s6    +-	, 	,D 	, 	, 	, 	, 	, 	, 	, 	, **,, G	0 G	0C- j
O7 7  #y566 A03E****3:  ,,T22,,T22*=a@@@   !3N!C!C DEEE&&s++++C!>?? t0 z2244 ! S "$<H	    3:x(((3E****+A..*955   3:w'''+A..*955   '&s++++C!<== Q0 $$&& 0BszNNNNN8,,,Bs....1 03:w///OO/22.y99   1  !!3A!6!6 29 = =   +*3///Y-L  m0        
   E*** /GGII...4'9...  !3L!N!N!NOOO        

3-...  &|S=O9P9PQQQ     E***  !3I!>!>???&&s++++C!788 R0S^=W $333#'>>##6#6LB|$$$OOR%:%:3>%J%J$KLLL**3///++C00 I05  ]9 &&s|44]9 #%K 4 = I C C,.EL,@,@,B,BD))H$(OO$;$A$A'3% %		 & H H H$(OO$;$A$A$$G$G			H $$.|INNN. ,[5M     BszNNN$$. ,[5K     Bs|7777$$. ,[5M     )?,+) ) )% OO..y99   +*3<88885  &9 &&s|44&9 #%K 3 < H C C,.EL,@,@,B,BD))BszNNN$$. ,[5K     Bs|7777$$. ,[5M     )?+) ) )% OO..y99   +*3<888$ (-$#+-11#r::@@BB$ $ :4 :4KD% "#y'BCC 7444T:::5			)#*lCCCCC /tLLLM   04,,#E9+DEE /4%-/H  8%gc7D&A&A4HH8 EL88>>>BszNNN$OO!3M$!O!O!O P   480#Y@  %4;;DAA%4 ((     
 3:95d;;<<<5			 !5a!?!? 29 = =   04,,"3	(KLL422444
 ++JAAA}5553:95d;;<<<5			 S033S5G	5R5RS   04,,44T:::5			3 );LQU)V)V)V(WXXX/3,,' 0**3///C!?@@ 0sy)) ! !A$$PPPP   BszNNN$$Q...JJLLLL&&s++++C!9:: 0- - - - - - -   (((3>>#*"5"5"7"788999-a77*955   '&s++++$T#YY/// x(( 	% 	%FV$$$$  	 4 	MRR$ L N++  0/// ,     		 	 	 	s   6V<<;W:9W:c                     t          t          | j        | j                                                            p| j        p| j        p| j         S r0   )anymapr   rD   r0  rJ   rI   r?  s    r9   is_emptyzSideEffects.is_empty*  sV    D$d&9&@&@&B&BCCDD ! !%!  	
 	
r;   c                 j    | j                                          | j                                         d S r0   )rF   r3   rD   r?  s    r9   r3   zSideEffects.clear2  s1    !!#####r;   )NNNNNN)r.   rC   )FF)ri   rC   r.   N)r!  r(   r.   N)r.   rs  )FrW  )JrJ  
__module____qualname____doc__rw   r   r%   __annotations__r   r?   r   r  StackSummaryr   r   r
   rM   r[   r^   rh   r   r   rl   rs   rz   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  r  r  r   r9  r=  r@  rC  r   rc  rl  rn  rr  rv  r  r  r  r3   __classcell__)rV   s   @r9   rC   rC   Y   sO	         & o-....S/5I0JJKKKKCyY5K0LLMMMM
 @D )-  //N /N#/N !c?&:!;</N '$sO';"<<=
	/N #?D9O4P#PQ
/N DI&/N $6_8MMNO
/N .#7

/N0 
1/N /N /N /N /N /Nb9 94 9 9 9 9
@o @$ @ @ @ @

 
4 
 
 
 

F 
t 
 
 
 
- HSM    ,
 
 
 
 / / / / / /- - - - - -
4 
 
 
 

$ 
 
 
 

T 
 
 
 
&o &$ & & & &P	'#	'+.	'7F	'		' 	' 	' 	' !   	
  
   &
9/ 
9/ 
9d 
9 
9 
9 
9
 
_ 
 
 
 
* *s * * * * *+#++.+7F+	+ + + + 
 
 
 
 
 \
A/ Ad A A A A
 
T 
 
 
 

> > >PT > > > >
. .D . . . .* #8	  "  	
 
   * M

 "
 
	
 
 
 
TM  	
 c3h 
   *' '$ ' ' ' 'R$   (	
 
   >$   (	
 
   <			 	 	 	v&.6BQ	   F # /    3"3*.*?3	3 3 3 3G"G	G G G GI
 I
 I
 I
V4O 4 4 4 4 4"0D 0 0 0 0VD$9 V V V V^	 ^d ^ ^ ^ ^@*  4	
  
   ,#s #t # # # #4!	 4!d 4! 4! 4! 4!l+ + + +5 53 5 5 5 5p 7<g gg/3g	g g g gR
$ 
 
 
 
$ $ $ $ $ $ $ $r;   rC   r!  r(   )NNNc              #      K   | j         j        j        }	 d| j         j        _        dV  || j         j        _        dS # || j         j        _        w xY w)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   r!  orig_vals     r9   r   r   7  s]       y'AHF=A	 :=E	 :::X	 :EEEE	   = Ac              #      K   | j         j        j        }	 d| j         j        _        d| j         j        _        d V  || j         j        _        d S # || j         j        _        w xY wr(  )r   r   r   +traced_with_externally_visible_side_effectsr  s     r9   2allow_externally_visible_side_effects_in_subtracerr  H  sk       y'THYPT	 MOS	 LPX	 MMMPX	 MXXXXs   &A A!c              #      K   | j         j        j        }	 d| j         j        _        d V  || j         j        _        d S # || j         j        _        w xY wr(  )r   r   r   r  s     r9   "disallow_side_effects_in_generatorr  U  s]       y'CHH?C	 <?G	 <<<x	 <GGGGr  )Kr  r   
contextlibr   r  r  r   rN   collections.abcr   r   typesr   typingr   r   r   rd   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   ru  r   r    r!   r"   r#   r$   r%   r   r&   torch._dynamo.output_graphr'   torch._dynamo.symbolic_convertr(   torch._dynamo.variables.listsr)   r  getArtifactLoggerrJ  r  rw   r   r:   r?   rA   rC   contextmanagerr   r  r  rv   r;   r9   <module>r     s   .                 5 5 5 5 5 5 5 5       / / / / / / / / / /   H H H H H H 9 9 9 9 9 9 9 9 9 9 9 9                  N N N N N N N N N N J J J J J J J J J J J J A A A A A A A A A A                  < ; ; ; ; ;  ;666666HHHHHH:::::: >33HnMM 
.CH~
.(,S#X
.CF
.	
. 
. 
. 
.$49 $tCy $T $ $ $ $
[$ [$ [$ [$ [$ [$ [$ [$|& F#F F F F F  	Y#	Y 	Y 	Y 	Y 	Y H#H H H H H H Hr;   