
    a,j                       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Zddl	m
Z
mZ ddlmZ ddlmZmZ ddlZddlZddlmZ ddlmZ ddlmZ d	d
lmZmZmZmZ 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-m.Z. d	dlm/Z/m0Z0m1Z1m2Z2 d	dl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d	dl;m<Z< erddl=m>Z> ddl?m@Z@ ddlAmBZB ejC        D                    eEd          ZFdeGeef         deGeef         deHddfdZIdeJe         deJe         ddfdZK G d d          ZLejM        d d!de
d"         fd#            ZNejM        d d!de
d"         fd$            ZOejM        d d!de
d"         fd%            ZPd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TYPE_CHECKINGAutogradFunctionContextVariable)
OrderedSet)is_structseq_class   )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)
AttrSourceGlobalSourceLocalCellSourceSourceTempLocalSource)is_frozen_dataclassis_namedtuple_cls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/   r0   
dict_classkvs         Z/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/torch/_dynamo/side_effects.py_manual_dict_setitemr=   J   sm     g&y1JW!! . .1w1----. .    	list_fromlist_toc                 p    t                               |           t                               ||            d S r3   )listr6   extend)r?   r@   s     r<   _manual_list_updaterD   W   s.    JJwKK#####r>   c                   |    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<   	 	 	 	 	 	 dedddeeef         dz  deeeeef         f         dz  deee	ej                 f         dz  de	e
         dz  d	e	eee	e         f                  dz  d
eeededef         f         dz  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dz  fdZdfd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dfdZdedefdZded ed!eddfd"Z	 	 dgd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d0Z)ded edefd1Z*dedefd2Z+e,fde
d3ed4e&defd5Z-e-Z.de
d3edefd6Z/d7e0dz  d8e
d9e
d:eee
f         def
d;Z1d8e&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dAZ4defdBZ5dCe0dz  dDe6dEedefdFZ7dCe0de
defdGZ8dHedIe	e         ddfdJZ9	 	 	 	 dhdKZ:didNZ;deddfdOZ<defdPZ=de	e         fdQZ>dRe?ddfdSZ@dTddUedVdd eddf
dWZAdXeddfdYZBdRe?ddfdZZCdjd\ZDdedefd]ZEd^e	e         ddfd_ZF	 dkdRe?d`eddfdaZGdldbZHdefdcZIdlddZJ xZKS )m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.RemovableHandleVariabler1   c                 N   t                                                       t          j        |          | _        |pi | _        |pi | _        |pi | _        |pg | _        |pg | _	        |pi | _
        d| _        d | _        t                      | _        t                      | _        d S )NF)super__init__weakrefrefoutput_graph_weakrefrG   rH   rJ   rI   rL   rM   _has_existing_dict_mutationca_final_callbacks_varset"ignore_mutation_on_these_variablesr
   mutated_sources)	selfrK   rG   rH   rJ   rI   rL   rM   	__class__s	           r<   rP   zSideEffects.__init__v   s    0 	$+K$=$=!,2$8$>B!$8$>B!"b!2!8b(.B ,1( <@# IL/ 4><<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)rW   addrY   r[   s     r<   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)rW   remover^   s     r<   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_policyrJ   appendtorch_guardsTracingContextextract_stack)rY   rc   s     r<   _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 r3   )
isinstancerF   rG   rH   rL   rM   )rY   rm   s     r<   __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 diffrL   rM   )rG   keysrH   rL   rM   )rY   rm   sk_itvok_itvsk_samok_sams         r<   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).0r:   r;   s      r<   
<dictcomp>z%SideEffects.clone.<locals>.<dictcomp>   s1     " " "#q!477" " "r>   )rK   rG   rH   rJ   rI   rL   rM   )rS   rZ   r{   rG   rH   r7   rJ   rB   rI   rL   rM   )rY   rR   s     r<   clonezSideEffects.clone   s    ''))~~ 344" "'+'@'F'F'H'H" " " "&!:4>**"4*  

 

 
	
r>   itemc                 .    t          |          | j        v S r3   )idrG   rY   r   s     r<   __contains__zSideEffects.__contains__   s    $xx4...r>   c                 6    | j         t          |                   S r3   )rG   r   r   s     r<   __getitem__zSideEffects.__getitem__   s    "2d88,,r>   c                 t    |                                  }t          |o|j        j        j        j                  S r3   )rS   bool
current_txoutputcurrent_tracer,unsafe_allow_externally_visible_side_effectsrY   rK   s     r<   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 r3   )rS   r   r   r   r   allow_side_effects_in_hopr   s     r<    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 r3   )rS   r   r   r   r   is_reconstructing_generatorr   s     r<   r   z'SideEffects.is_reconstructing_generator  s=    0022 Z'.=Y
 
 	
r>   c                     |j         lt          |j                   sZ|                                 }|rF|j        j        j        }|j        0t          j        j	        
                                |_        dS dS dS dS dS )zFRecord the first externally-visible side effect on the current tracer.N)mutation_typer%   rS   r   r   r   side_effect_stackrh   ri   rj   rk   )rY   r   rK   tracers       r<   _maybe_record_side_effectz%SideEffects._maybe_record_side_effect	  s    )2E3
 3
)  4466L %07F+34BBDD ,,, *))) 33r>   c                    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	   ro   r   r   r   r   r   r   FUNDAMENTALr   r%   )rY   r   r	   s      r<   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040022 	**40004++-- 	 A2D225 ;&2
 
 
 
 !---"4#566 	15t55fx	
 
 
 
 ur>   namevaluec                 H   |                      |          sJ |                     |           || j        vr
i | j        |<   || j        |         |<   |                     |           t	          |dd           }|*| j                            t          ||                     d S d S )Nsource)is_attribute_mutationr   rH   rl   getattrrX   r]   r   )rY   r   r   r   item_sources        r<   
store_attrzSideEffects.store_attr@  s     ))$/////&&t,,,t000.0D%d+05!$'-  &&&dHd33" $$ZT%B%BCCCCC #"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   rH   ro   r   DeletedVariabler   r   
USER_ERROR)rY   r   r   r   r   results         r<   	load_attrzSideEffects.load_attrN  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   	DIFFICULTro   r   CellVariabler(   r   )rY   r   r   s      r<   
store_cellzSideEffects.store_cella  s    !! 	1=G==e==d4)34	    '9#9:::::%!:;;;;;%88888r>   c                    t          |t          j                  sJ |                                 }|rJt	          |dd           }|7|j        j        j        j        	                    t          |d                     |                     |d          r|                     |dd          S |j        r|j        S t          dt          |          dg t           j                   d S )Nr   r   F)r   zRead uninitialized cellzBAttempted to read a cell variable that has not been populated yet.r   )ro   r   r   rS   r   r   r   r   traced_sourcesr]   r   has_pending_mutation_of_attrr   pre_existing_contentsr   strr   r   )rY   r   rK   cell_sources       r<   	load_cellzSideEffects.load_cellm  s   '9#9::::: 0022 	!'8T::K&'.=LPP{O<<   ,,WoFF 	I>>'?%>HHH( 	100-LL\1%01		
 	
 	
 	
 	
 	
r>   gvarc                 f    t          |t          j                  sJ |                     ||          S r3   )ro   r   r(   r   )rY   r   r   s      r<   load_globalzSideEffects.load_global  s/    $	 9:::::~~dD)))r>   c                     t          |t          j                  sJ t          |t          j                  sJ |                     |||           d S r3   )ro   r   r(   r   )rY   r   r   r   s       r<   store_globalzSideEffects.store_global  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   r{   rV   	frozensetintr   rB   tupleBaseException)r   s    r<   "cls_supports_mutation_side_effectsz.SideEffects.cls_supports_mutation_side_effects  s[    %c+=tDD#! &  !"*
I
 

 
	
r>   c                 6    t          |j        t                    S r3   )ro   r   r"   r   s     r<   r   z!SideEffects.is_attribute_mutation  s    $,.?@@@r>   c                 z    |                      |          o&t          | j                            |                    S r3   )r   r   rH   getr   s     r<   has_pending_mutationz SideEffects.has_pending_mutation  s=    ))$// 
D%))$//5
 5
 	
r>   c                 f    |                      |          o|| j                            |d          v S )Nrz   )r   rH   r   )rY   r   r   s      r<   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   ro   r   r$   r'   r   UserDefinedObjectVariablerH   is_base_vt_modifiedr   is_modifiedr   s     r<   r   zSideEffects.is_modified  s     	5d(+?AQ*RSS 	4dI?@@ 	W444V8P8PQU8V8VV%%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   rG   AssertionErrorr   r   rI   rg   )rY   r   r   r   s       r<   
_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#   )rY   r   r   s      r<   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   )rh   autogradfunctionFunctionCtxwarningscatch_warningsFunctionr!   r$   rG   r   rI   rg   )rY   r   r   r   r   objr   s          r<   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|}nt          |d          rt          |d          r ||          s|}nt          |t          j        j                  rt          j        }n~t          |t"          t$          j        f          rt          j        }nOt          |t*          t,          f          rt          j        }n%t          |t0                    r<t3          |          r t          j                            |          }nt          j        }nt          |t8                    rt          j        }nt          |t<                    rt          j        }ntA          |          rtB          }nyt          |tD                    rt          j#        }nWt          |t          j$        j%                  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hasattrrh   nnModuleUnspecializedNNModuleVariabler{   collectionsOrderedDictUserDefinedDictVariablerV   r   UserDefinedSetVariabler   r   UserDefinedTupleVariable
get_vt_clsrB   UserDefinedListVariabler   MutableMappingVariabler   r)   r   "UserDefinedExceptionObjectVariableuser_defined_CONSTANT_BASE_TYPESUserDefinedConstantVariableInspectVariableis_matching_class)rY   r   r   r   r   r   r   s          r<   get_variable_clszSideEffects.get_variable_cls  sQ   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 ** B(ALLXVV(A$'' 	5$<LL.11 	5$;LL ** 
	52LL-00 	5$GLL"7
 
 	5 %@LL&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          |          }n[t          |t          j                  r|j	        }nxt          |t          j
                  rt          }nVt          |t          j                  rt          }n4t          |t          j                  r|j         }nt          d|           t          j                            |j                  sJ t%          |          r |d g|j        z            }nw|r`t          |t          j        j                  rAd |D             }	  |j        |g|R  }n:# t,          $ r |                    |          }Y nw xY w|                    |          }|S )NzUnexpected base_cls_vt c                 6    g | ]}|                                 S rz   )as_python_constant)r|   args     r<   
<listcomp>z1SideEffects.get_example_value.<locals>.<listcomp>D  s$    NNNS 6 6 8 8NNNr>   )r   r   rh   r   r   r    ro   r   BuiltinVariablefnDictBuiltinVariabler{   ListBuiltinVariablerB   UserDefinedClassVariableRuntimeErroris_supported_new_method__new__r   n_fieldsr  r	  	Exception)rY   r  r  r  r   r   base_clsexample_argss           r<   get_example_valuezSideEffects.get_example_value#  s    <h00 '	1))CC+y'@AA 	L&>K)FGG LK)FGG LK)KLL L&,"#J[#J#JKKK5MM      "(++ 1 hv(99:: 1z&;    1  ONINNN
*(* #/  CC !    #**  CCC	 &&x00
s   
E E;:E;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$   rG   r   rI   rg   )	rY   r  r  r  r   r   r   r   r   s	            r<   track_new_user_defined_objectz)SideEffects.track_new_user_defined_objectT  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$   rG   r   rI   rg   )rY   r   r   s      r<   track_cell_newzSideEffects.track_cell_newr  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#   rG   r   rI   rg   )rY   r   r(  r)  r   s        r<   track_cell_existingzSideEffects.track_cell_existing}  se     ) #).$$6O6Q6Q"*
 
 
 )1BtHH%d###r>   c                     t          j        t                      |          }|| j        t	          |          <   | j                            |           |S )N)r   r   )r   NewGlobalVariabler#   rG   r   rI   rg   )rY   r   r   r   s       r<   track_global_existingz!SideEffects.track_global_existing  sU    .355
 
 
 )1BtHH%d###r>   ctxargsc                 v    t          |t          j                  sJ | j                            ||f           d S r3   )ro   r   r	   rL   rg   )rY   r/  r0  s      r<   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 r3   )rI   r   rG   ro   r   TensorVariableSymNodeVariabler   )rY   rm   
other_itemother_idother_variables        r<   -track_runahead_tensor_and_symvar_side_effectsz9SideEffects.track_runahead_tensor_and_symvar_side_effects  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 )Nr[   r1   c                     | v rd S                      |            t          | j        t                    r                     |            | j        v r"t          j        j        |                     d S d S r3   )r]   ro   r   r$   rH   r(   visit)r[   live_new_objectsrY   r=  visiteds    r<   r=  z0SideEffects.prune_dead_object_new.<locals>.visit  s    g~~KK#+-ABB * $$S))) d///%-c2     0/r>   c                 D    t          | j        t                    r| v S dS NTro   r   r$   )r[   r>  s    r<   is_livez2SideEffects.prune_dead_object_new.<locals>.is_live  s*    #+-ABB /...4r>   c                 F    g | ]}t          |j        t                    |S rz   rB  )r|   r[   s     r<   r  z5SideEffects.prune_dead_object_new.<locals>.<listcomp>  s<     
 
 
c/1EFF

 
 
r>   c                 2    i | ]\  }} |          ||S rz   rz   r|   r:   r;   rC  s      r<   r}   z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>  s<     
 
 
QGGAJJ
q
 
 
r>   c                 2    i | ]\  }} |          ||S rz   rz   rF  s      r<   r}   z5SideEffects.prune_dead_object_new.<locals>.<dictcomp>  s<     %
 %
 %
Q''!**%
q%
 %
 %
r>   )rV   r(   r   rG   valuesrC   stacksymbolic_localsparentpost_prune_cell_and_freevarsrg   r=  r   backward_staterM   r7   rH   )	rY   r:  pre_existing_varsinit_live_varscur_txrC  r>  r=  r?  s	   `    @@@@r<   prune_dead_object_newz!SideEffects.prune_dead_object_new  s   (+14	 	4 	 	 	 	 	 	 	 	 	 	 	T 	 	 	 	 	 	

 
*1133
 
 
 35 !!6<1G"HIII}( :FFF%%f&IJJJ]F   	!	(!		
 		
 		
 
 
 
 
!06688
 
 
%
 %
 %
 %
!6<<>>%
 %
 %
!!!r>   c                 `   || j         v rd S |                     |           |                     |           t          |j        t
                    rd|j        _        |j        | j        	                    |j                   |j        r#t          |t          j                  rd| _        d S d S d S rA  )rW   r   rl   ro   r   r&   r   r   rX   r]   r   ConstDictVariablerT   r^   s     r<   mutationzSideEffects.mutation  s    $999F&&s+++  %%%c')>?? 	1,0C):! $$SZ000: 	4*S)*EFF 	4/3D,,,	4 	4 	4 	4r>   c                     | j         S r3   )rT   rY   s    r<   has_existing_dict_mutationz&SideEffects.has_existing_dict_mutation  s    //r>   c                 N      fd j                                         D             S )Nc                 >    g | ]}                     |          |S rz   )r   )r|   r[   rY   s     r<   r  z2SideEffects._get_modified_vars.<locals>.<listcomp>  s-    UUUt?O?OPS?T?TUUUUr>   )rG   rH  rV  s   `r<   _get_modified_varszSideEffects._get_modified_vars  s,    UUUUt299;;UUUUr>   cgc           	      z   |                                  D ]t          j        t                    s
j        J 't          t
          j        t
          j        f          r|                               sct          t
          j	                  rj
        p                    fd                               t          dd                                                    t          j                           _        j        t#          j
                  _                                        rvt          t
          j        j                  rU d                                                                           t          j                           _        t          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t7          j                  z   d                                                    t          j                           _        t          t
          j                  rĉ| j        v r| j                                                 D ]\  }}                    dd                                d            j                    t          j!        |                      |                               g tE          d          tG          d                     | j$        D ]z\  }} |j                                        d           |D ]} |                               g tE          t7          |                    tG          d                     {d S )Nc                  D                          t          j        d          S )N	make_cellload_import_fromr   __name__r[  s   r<   <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   r1   c                      j         J   j                                                              d          g           d S )Nr  )r  extend_outputcreate_load_attrr[  r[   s   r<   load_new_methodz:SideEffects.codegen_save_tempvars.<locals>.load_new_methodQ  sN    ":::3?+++(("*=*=i*H*H)IJJJJJr>   c                  D                          t          j        d          S )Nr!   r_  rb  s   r<   rc  z3SideEffects.codegen_save_tempvars.<locals>.<lambda>Z  s     3 3ENL Q Q r>   r   builtinsr   __setattr__   POP_TOPrL   r1   N)%rZ  ro   r   r$   r   r   NamedTupleVariableStructSequenceVariabler   r   
local_nameadd_push_nullrh  r   	add_cacher   tempvarsr   	is_tensortorch_functionTensorWithTFOverrideVariable	clear_tosr	   r   r   r   r  lenr)   rH   r7   r`  load_methodConstantVariabler   r   rL   )	rY   r[  rk  r  r   r   r/  r0  r[   s	    `      @r<   codegen_save_tempvarsz!SideEffects.codegen_save_tempvars  s    **,, l	 l	Cc/1EFF z--- -y/OP   //44 #y566 Z
 >)$$PPPP   $$%9!U%C%CDDDLL%%%!0S1A!B!BCJJZ'!0!@!@CJ L 1N  	C Bs....LL%%% LLNNN!0S1A!B!BCJC!JKK 6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[-=>>
 sI$EFFt888'+'@'E'K'K'M'M  e++JAAA}5553:95d;;<<<5			((S033S5G	5R5RS    / 
	 
	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   )rx  ro   r   r(   RemovableHandleVariable
is_mutabler   rh   Tensorr|  rM   rr   idx)rY   r  r  r  r   r  s         r<   register_hookzSideEffects.register_hook  s     !!!!!$	 9:::::vy@AA	
!!##	
 	
$ u|T*****$#((**++T&&&1HC T&&&"($!=#:~


r>   r  c                     | j         |= d S r3   )rM   )rY   r  s     r<   remove_hookzSideEffects.remove_hook  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 herer1   c                  p                                                                      g           d S r3   )rh  ri  )r[  r   r  s   r<   gen_fnz)SideEffects.codegen_hooks.<locals>.gen_fn  s;    6


  ""5"5d";";!<=====r>   r   Frq  )rM   rH  r   ru  rh  r   rv  )rY   r[  r  r  r  r   r  s    `   @@r<   codegen_hookszSideEffects.codegen_hooks  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'   rU   r   r,   )rY   r'   s     r<   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.re   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   liner   )r|   fs     r<   	<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   rf   rJ   r   python_type_namer   ro   r   r   r   rt  ry  TorchFunctionModeStackVariabler   rV   r   r   r   r]   rg   join	tracebackformat_listtextwrapindent)rY   r[   	locationsdescriptionsource_infoseenunique_formatted_stacksstack_above_dynamorI  stack_tuplestack_augmentedformatted_lineslog_strs                r<   _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>   side_effect_messagesc                     sd S D ]}t                               |           t          j                            dd fd           d S )Nartifactc                      dddS )Ndynamo_side_effectsstring)r   encodingrz   rz   r>   r<   rc  z8SideEffects._emit_side_effect_messages.<locals>.<lambda>"  s    -$! ! r>   c                  .    d                                S )Nz,

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

)r  )r  s   r<   rc  z8SideEffects._emit_side_effect_messages.<locals>.<lambda>&  s    QVV$    r>   )metadata_fn
payload_fn)side_effects_logdebugrh   _loggingtrace_structured)rY   r  msgs    ` r<   _emit_side_effect_messagesz&SideEffects._emit_side_effect_messages  s    # 	F' 	( 	(C""3''''''     	( 		
 		
 		
 		
 		
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        t          j        f          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tC          j                                                            dd                               t          d                      |           Xt	          t          j"                  rkj#        d j$        v rY %                              } |           |                    &                    j#                  g            |           ݉ '                              rt	          j(        tR                    rt	          t          j*                  r)t	          t          j+                  r̉ ,                    j-                  ri }t\          j/        j0        D ]#}j1        j2        3                                ||<   $	 ti          j5                  j6        7                    tp          j9                  }nA# tt          $ r4 ti          j5                  j6        7                    tv                    }Y nw xY w	                    t          d|          t          d|d                   g            j                   	                    t          d|d                   g            j-        d           	                    t          d|d                   g           ty          t\          |          }	|                    g |	t          d                      |j-                   n0t	          t          j=                  r ,                    j-                  ri }t|          j/        j0        D ]#}j1        j2        3                                ||<   $ j                   	                    t          d|d                    g            j-        d           	                    t          d|d!                   g           ty          t|          |          }
|                    g |
t          d                      |j-                   d}t           j$        @                    i           A                                          D ]\  }}t	          t          jB                  rnj1        j2        C                    |            |           t	          j        t                    sJ |                    t          d"|          g           d#}t	          |t          jE                  rt	          j(        t                    rut          t          d$d           |          rVj1        j2        C                    |            j                   |                    t          d%|          g           d#}9t	          t          jI                  rJ                    |          r                    fd&            j                    t          jK        |                      |           |                    g t          d'd          t          d                     d#}t	          t          jI                  rM                                rN                    d(d)                               d*            j                    t          jK        |                      |           |                    g t'          d'          t          d                     d#}j1        j2        C                    |            |                       |                    t          d+|          g           d#}|r |           t	          t          jO                  rvt          j7                  D ]T}                    fd,            j                                       dd           Q                                 U |           1t	          t          jR                  rvt          jS                  D ]T}                    fd-            j                                       dd           Q                                 U |           t	          t          jT                  rd/fd.}                    |            U                    jV        W                                                     |                    g t          dd          t          d                      |           mt          ti                              t          |          D ]}	                    |           rr Y                               d S d S d S )0Nr[   r1   c                     t           j        dk    r.r.                    |           }                    |           d S d S d S Nre   )r   rf   r  rg   )r[   r  r  rY   r  s     r<   _maybe_log_side_effectzBSideEffects.codegen_update_mutated.<locals>._maybe_log_side_effect1  sR    /8;;@P;66s;;$++C00000 <;;;r>   Fre  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   rC   r   rp  r6   r   updatec                  D                          t          j        d          S )Nget_torch_function_mode_stackr_  rb  s   r<   rc  z4SideEffects.codegen_update_mutated.<locals>.<lambda>      B//(G  r>   co_varnames
STORE_FAST)argvalc                  D                          t          j        d          S )Nset_torch_function_mode_stackr_  rb  s   r<   rc  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  r  r>   
BUILD_LIST
LOAD_CONSTr0   r/   r.   )varname_mapr@   r?   STORE_GLOBALTr   DELETE_ATTRc                  D                          t          j        d          S )N object_setattr_ignore_descriptorr_  rb  s   r<   rc  z4SideEffects.codegen_update_mutated.<locals>.<lambda>O  s    B$7$7 %0R% % r>   ro  rm  r   rn  
STORE_ATTRc                  D                          t          j        d          S N	iter_nextr_  rb  s   r<   rc  z4SideEffects.codegen_update_mutated.<locals>.<lambda>w  rd  r>   c                  D                          t          j        d          S r  r_  rb  s   r<   rc  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  rd  r>   c                  R      j                                         d           d S )Nsetstate)r   r   rj  s   r<   r  z2SideEffects.codegen_update_mutated.<locals>.gen_fn  s*    BszNNNLL,,,,,r>   rq  )Zr(   rZ  r   replay_side_effectsro   r   r   r   r,   rh  create_load_constr   rg   listsDequeVariablemaxlenis_constant_noner   r}  r   rS  SetVariablehas_new_itemsshould_reconstruct_allry  r  ru  call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackr|  r   rt  rH   r   create_store_derefr   r   r$   r)   r  r   _base_vtr=   __code__r  r:  r   new_varr4   r   r5   indexr   r   
ValueErrorr{   r   r  rD   reversedr   r7   r-  update_co_namesr   r   r#   r   r   r   should_skip_descriptor_setterr~  r   needs_slow_setattrr`  ListIteratorVariablerangepop_topCountIteratorVariableadvance_countRandomVariable
wrap_staterandomgetstater   r  )rY   r[  r  r  suffixesr   contents_varr  r0   dict_update_instslist_update_instsside_effect_occurredr   _r  suffixr  r[   s   ```             @@r<   codegen_update_mutatedz"SideEffects.codegen_update_mutated+  s    +-	1 	1D 	1 	1 	1 	1 	1 	1 	1 	1
 **,, `	0 `	0C- j
O7 7  #y566 Z03E****3:  ,,T22,,T22*=a@@@   !3N!C!C DEEE&&s++++C!>?? M0 z2244 ! S "$<H	    3:x(((3E****+A..*955   3:w'''+A..*955   '&s++++C)"=y?T!UVV j0 $$&& 0BszNNNNN8,,,Bs....1 03:w///OO/22.y99   1  !!3A!6!6 29 = =   +*3///Y-L  F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 k0S^=W $333#'>>##6#6LB|$$$OOR%:%:3>%J%J$KLLL**3///++C00 b0 c/1EFF ::L L  5  e &&L e #%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   +*     5  * &&L * #%K 3 < H C C,.EL,@,@,B,BD))BszNNN$$. ,[5K     Bs|7777$$. ,[5M     )?+) ) )% OO..y99   +*  ( (-$#+-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!@AA 0s011 ! !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$$$$  	B 4 	B++,@AAAAA	B 	B 	B 	Bs   6W==;X;:X;c                    t           j        dk    rd S t                              t          j                  sd S |                                 D ]1}|                     |          }t                              |           2d S r  )	r   rf   r  isEnabledForloggingDEBUGrZ  r  r  )rY   r[   r  s      r<   log_side_effects_summaryz$SideEffects.log_side_effects_summary  s    +x77F,,W];; 	F**,, 	( 	(C22377C""3''''	( 	(r>   c                     t          t          | j        | j                                                            p| j        p| j        p| j         S r3   )anymapr   rG   rH  rM   rL   rV  s    r<   is_emptyzSideEffects.is_empty  sV    D$d&9&@&@&B&BCCDD ! !%!  	
 	
r>   c                 j    | j                                          | j                                         d S r3   )rI   r6   rG   rV  s    r<   r6   zSideEffects.clear  s1    !!#####r>   )NNNNNN)r1   rF   )FF)rm   rF   r1   N)r:  r+   r1   N)r1   r  )Frq  )Lra  
__module____qualname____doc__r{   r   r(   __annotations__r   rB   r   r  StackSummaryr   r	   rP   r_   rb   rl   r   r   rp   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr4   r   r   r   r   r   r&   r   track_mutabler   r   r   r  r"  r$  r'  r   r+  r.  r2  r9  rQ  rT  rW  rZ  r   r  r  r  r  r  r  r  r  r  r  r6   __classcell__)rZ   s   @r<   rF   rF   \   s	         & o-....S/5I0JJKKKKCyY5K0LLMMMM
 =A&*  -1@ 1@#1@ S/12T91@ #?Do9M4N#NO
	1@ #?D9O4P#PQ
1@ 9t#1@  143HHI
 1@ *3
 	1@. 
/1@ 1@ 1@ 1@ 1@ 1@f9 94 9 9 9 9
@o @$ @ @ @ @

 
4 
 
 
 

F 
t 
 
 
 
- C$J    ,
 
 
 
 / / / / / /- - - - - -
4 
 
 
 

$ 
 
 
 

T 
 
 
 
o $    (o ($ ( ( ( (TD#D+.D7FD	D D D D$ !   	
  
   &
9/ 
9/ 
9d 
9 
9 
9 
9
 
_ 
 
 
 
.* *s * * * * *+#++.+7F+	+ + + + 
 
 
 
 
 \
A/ Ad A A A A
 
T 
 
 
 

> > >PT > > > >
. .D . . . .& #8	  "  	
 
   * M

 "
 
	
 
 
 
TM  	
 c3h 
   */ /$ / / / /b/$/  / (	/
 
/ / / /b$   (	
 
   <			 	 	 	tm+3?N	   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    B*  4	
  
   ,#s #t # # # #4!	 4!d 4! 4! 4! 4!l+ + + +5 53 5 5 5 5n
tCy 
T 
 
 
 
& 7<tB tBtB/3tB	tB tB tB tBl( ( ( (
$ 
 
 
 
$ $ $ $ $ $ $ $r>   rF   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     r<   r   r     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rA  )r   r   r   +traced_with_externally_visible_side_effectsr  s     r<   2allow_externally_visible_side_effects_in_subtracerr!    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rA  )r   r   r   r  s     r<   "disallow_side_effects_in_generatorr#    s]       y'CHH?C	 <?G	 <<<x	 <GGGGr  )Qr  r   
contextlibr   r  r  r  r   rQ   collections.abcr   r   typesr   typingr   r   rh   torch.nnr   r	   torch.utils._ordered_setr
   torch.utils._pytreer   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(   r   r)   torch._dynamo.output_graphr*   torch._dynamo.symbolic_convertr+   torch._dynamo.variables.listsr,   r  getArtifactLoggerra  r  r{   r   r=   rB   rD   rF   contextmanagerr   r!  r#  rz   r>   r<   <module>r3     s   .                  5 5 5 5 5 5 5 5       % % % % % % % %   H H H H H H / / / / / / 2 2 2 2 2 2 9 9 9 9 9 9 9 9 9 9 9 9                  N N N N N N N N N N V V V V V V V V V V V V V V T T T T T T T T T T T T                  < ; ; ; ; ;  ;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 $ $ $ $
X$ X$ X$ X$ X$ X$ X$ X$v* F#F F F F F  	Y#	Y 	Y 	Y 	Y 	Y H#H H H H H H Hr>   