
    9j                       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j                  j                  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j                  d d!de
d"   fd#       ZNej                  d d!de
d"   fd$       ZOej                  d d!de
d"   fd%       ZPy)&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                  |   }|j                  |       | j                         D ]  \  }}|j	                  |||        y N)type__mro__clearitems__setitem__)r.   r/   r0   
dict_classkvs         Z/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/side_effects.py_manual_dict_setitemr=   J   sR     g&&y1JW! .1w1-.    	list_fromlist_toc                 Z    t         j                  |       t         j                  ||        y 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<   	 	 	 	 	 	 dad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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d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Z5dBe0dz  dCe6dDedefdEZ7dBe0de
defdFZ8dGedHe	e   ddfdIZ9	 	 	 	 dddJZ:dedKZ;deddfdLZ<defdMZ=de	e   fdNZ>dOe?ddfdPZ@dQddRedSdd eddf
dTZAdUeddfdVZBdOe?ddfdWZCdfdXZDdedefdYZEdZe	e   ddfd[ZF	 dgdOe?d\eddfd]ZGdhd^ZHdefd_ZIdhd`ZJ xZKS )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.RemovableHandleVariabler1   c                 2   t         |           t        j                  |      | _        |xs i | _        |xs i | _        |xs i | _        |xs g | _        |xs g | _	        |xs i | _
        d| _        d | _        t               | _        t               | _        y )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 	$+KK$=!,2$8$>B!$8$>B!"b!2!8b(.B ,1( <@# IL/ 4><r>   varc                 :    | j                   j                  |       y)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8r>   c                 X    || j                   v r| j                   j                  |       yy)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   s)    $99933::3? :r>   keyc                     t         j                  dk(  ry|| j                  vrg | j                  |<   | j                  |   j                  t        j
                  j                  j                                y)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   s`    ++x7d///-/D%%c*!!#&--MM((668	
r>   otherc                     t        |t              sJ | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r3   )
isinstancerF   rG   rH   rL   rM   )rY   rm   s     r<   __eq__zSideEffects.__eq__   sz    %--- 5#7#77 8))U-G-GG8&&%*A*AA8 !!U%7%77		
r>   c                    | j                   |j                   k7  rB| j                   j                         }|j                   j                         }||k7  rd| d| S y| j                  |j                  k7  rB| j                  j                         }|j                  j                         }||k7  rd| d| S y| j                  |j                  k7  ry| j                  |j                  k7  ryy )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))..0F.vhd6(CC 2&&%*D*DD..335F//446F4VHDII7##u'>'>>&%"4"44!r>   c                 X   | j                         }|J | j                  |t        | j                        | j                  j                         D ci c]  \  }}|t        |       c}}| j                  t        | j                        | j                  | j                        S c c}}w )zCreate a shallow copy)rK   rG   rH   rJ   rI   rL   rM   )rS   rZ   dictrG   rH   r7   rJ   rB   rI   rL   rM   )rY   rR   r:   r;   s       r<   clonezSideEffects.clone   s    '')~~ 3 34'+'@'@'F'F'H"#q!47
" "&!:!:4>>*"44**  

 
	
"s   B&itemc                 0    t        |      | j                  v S r3   )idrG   rY   r{   s     r<   __contains__zSideEffects.__contains__   s    $x4....r>   c                 2    | j                   t        |         S r3   )rG   r}   r~   s     r<   __getitem__zSideEffects.__getitem__   s    ""2d8,,r>   c                     | j                         }t        |xr* |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   sA    002 k''..==jj
 	
r>   c                     | j                         }t        |xr* |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   sA    002 X''..==WW
 	
r>   c                     | j                         }t        |xr* |j                  j                  j                  j
                        S r3   )rS   r   r   r   r   is_reconstructing_generatorr   s     r<   r   z'SideEffects.is_reconstructing_generator  sA    002 Z''..==YY
 	
r>   c                 $   |j                   t        |j                         sn| j                         }|r[|j                  j                  j
                  }|j                  .t        j                  j                  j                         |_        yyyyy)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
  446L%0077FF++344BBD , 4 	3
)r>   c                    ddl m} t        ||      ry| j                         r| j	                  |       y| j                         r| j	                  |       y| j                         r#t        dd| ddgt        j                         |j                  J t        |j                        st        d	d
| ddg       y)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 d;<IIK**40002**40++- A+D625 ;&22
 !!---"4#5#561.tf5fx	
 r>   namevaluec                 6   | j                  |      sJ | j                  |       || j                  vri | j                  |<   || j                  |   |<   | j                  |       t	        |dd       }|&| j
                  j                  t        ||             y y )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"  $$ZT%BC #r>   
deleted_okcheckc                     |r| j                  |      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  sv     --d333**406j1J1JK> htf55)445	 r>   cellvarc                    |j                         r%t        dd| d| dg t        j                         t	        |t
        j                        sJ t	        |t
        j                        sJ | j                  |d|       y )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  sy    !1#G9IeW=d4)334	 '9#9#9:::%!:!:;;;%8r>   c                    t        |t        j                        sJ | j                         }|rRt	        |dd       }|C|j
                  j                  j                  j                  j                  t        |d             | j                  |d      r| j                  |dd      S |j                  r|j                  S t        dt        |      dg t         j"                         y )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#9::: 002!'8T:K&''..==LLPP{O< ,,WoF>>'?%>HH((000-L\1%001		
r>   gvarc                 ^    t        |t        j                        sJ | j                  ||      S r3   )ro   r   r(   r   )rY   r   r   s      r<   load_globalzSideEffects.load_global  s)    $	 9 9:::~~dD))r>   c                     t        |t        j                        sJ t        |t        j                        sJ | j                  |||       y r3   )ro   r   r(   r   )rY   r   r   r   s       r<   store_globalzSideEffects.store_global  s@     $	 9 9:::%!:!:;;;dE*r>   clsc           
      B   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   ry   rV   	frozensetintr   rB   tupleBaseException)r   s    r<   "cls_supports_mutation_side_effectsz.SideEffects.cls_supports_mutation_side_effects  sv    %%c+=t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                 p    | j                  |      xr$ t        | j                  j                  |            S r3   )r   r   rH   getr~   s     r<   has_pending_mutationz SideEffects.has_pending_mutation  s5    ))$/ 
D%%))$/5
 	
r>   c                 d    | j                  |      xr || j                  j                  |d      v S )N )r   rH   r   )rY   r{   r   s      r<   r   z(SideEffects.has_pending_mutation_of_attr  s8    ))
 >d//33D"==	>r>   c                 b   |j                         ryt        |j                  t        t        f      ryt        |t
        j                        r!|| j                  v xs |j                  |       S | j                  |      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    d((+?AQ*RSdI??@4444V8P8PQU8VV%%d+44444!!---!!---r>   variablemutation_type_clsc           
      .   t        |      | j                  v r>t        | d|j                   d| j                  t        |         j                   d       |       |_        || j                  t        |      <   | j
                  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     d8t*** * ) *2(9 :88<8K8KBtH8U8\8\7]]^	`  "3!4(0BtH%d#r>   c                 2    | j                  ||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 r>t	        j
                  d      5  t         j                  j                         }d d d        nt        |      } |fdt        |      i|}|| j                  t        |      <   | j                  j                  |       |S # 1 sw Y   RxY w)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 0nn--/0 0 X&C
.z:
 

 (0BsG$c"0 0s   B99Cc                    ddl m} ddlm} ddlm} ddlm} t        j                  }t        ||      r|j                  |      r|}nt        |d      rt        |d      r ||      s|}nt        |t        j                  j                        rt        j                   }nt        |t"        t$        j&                  f      rt        j(                  }nMt        |t*        t,        f      rt        j.                  }n%t        |t0              r<t3        |      r t        j4                  j7                  |      }nt        j4                  }nt        |t8              rt        j:                  }nt        |t<              rt        j>                  }ntA        |      rtB        }nt        |tD              rt        jF                  }ndt        |t        jH                  jJ                        rt        jL                  }n/t        jN                  jQ                  |      rt        jN                  }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UnspecializedNNModuleVariablery   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  s   5IGH // 	 '
'HHR4LHk**-0:9L%((//2$BBL4)@)@"AB$<<L3	"23$;;L%( *(AALLXV(AA$'$<<L.1$;;L *2L-0$GGL""77
 %@@L&&88B$44L,	(K(KLLLr>   base_cls_vtcls_vt	init_argsc                 x   |j                   }t        |t        j                  j                        rt        |      }|S t        |t        j                        r|j                  }nwt        |t        j                        rt        }nVt        |t        j                        rt        }n5t        |t        j                        r|j                   }nt        d|       t        j                  j!                  |j"                        sJ t%        |      r |d g|j&                  z        }|S |rWt        |t        j(                  j*                        r3|D cg c]  }|j-                          }}	  |j"                  |g| }|S |j#                  |      }|S c c}w # t.        $ r |j#                  |      }Y |S w xY w)NzUnexpected base_cls_vt )r   r   rh   r   r   r    ro   r   BuiltinVariablefnDictBuiltinVariablery   ListBuiltinVariablerB   UserDefinedClassVariableRuntimeErroris_supported_new_method__new__r   n_fieldsr  r  as_python_constant	Exception)	rY   r  r  r  r   r   base_clsargexample_argss	            r<   get_example_valuezSideEffects.get_example_value#  s    <<h0)CL 
I +y'@'@A&>>K)F)FGK)F)FGK)K)KL&,,"%<[M#JKK55MM     "(+ v(9(99:& 
% z&&;;  ENNS 6 6 8NN
*(** #/C 
 &&x0
  O
 !  #** C
 
s   F.F F98F9c           	      $   |j                   }|j                  }| j                  |      }| j                  |||      } |||j                   ||t	        |            }|| j
                  t        |      <   | j                  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$$[&)D}}#.z:
 (0BsG$c"r>   c                     t               }t        j                  t                     }|| j                  t        |      <   | j                  j                  |       |S )Nr   )r   r   r   r$   rG   r}   rI   rg   )rY   r   r   s      r<   track_cell_newzSideEffects.track_cell_newr  sN     h)).0
 (0BsG$c"r>   r   cellcontentsc                     t        j                  |d n	t               ||      }|| j                  t	        |      <   | j
                  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}  sV     )) #).$6O6Q"*
 )1BtH%d#r>   c                     t        j                  t               |      }|| j                  t	        |      <   | j
                  j                  |       |S )N)r   r   )r   NewGlobalVariabler#   rG   r}   rI   rg   )rY   r   r{   r   s       r<   track_global_existingz!SideEffects.track_global_existing  sH    ..35
 )1BtH%d#r>   ctxargsc                 v    t        |t        j                        sJ | j                  j	                  ||f       y r3   )ro   r   r	   rL   rg   )rY   r*  r+  s      r<   track_save_for_backwardz#SideEffects.track_save_for_backward  s2     #yHHIII%%sDk2r>   c                     |j                   D ]h  }t        |      }|j                  |   }|| j                  vs,t        |t        j
                  t        j                  f      sW| j                  ||       j y 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  so      // 	GJ*~H"11(;Nt222z!9!99;T;T U8 **:~F	Gr>   c                 f   	
 t               t               	dt        dd f	 
fd
dt        dt        f	fd} j                  j	                         D cg c]  }t        |j                  t              s|  }}g }|}|k|j                  |j                  |j                  g       |j                  )|j                  J |j                  |j                         |j                  }|kt        j                  
|||j                  j                    j"                  gz          
 j                  j%                         D ci c]  \  }} ||      s|| c}} _         j&                  j%                         D ci c]  \  }} ||      s|| c}} _        y c c}w c c}}w c c}}w )Nr[   r1   c                     | v ry j                  |        t        | j                  t              rj                  |        | j                  v r$t        j                  j                  |           y y r3   )r]   ro   r   r$   rH   r(   visit)r[   live_new_objectsrY   r7  visiteds    r<   r7  z0SideEffects.prune_dead_object_new.<locals>.visit  sl    g~KK#++-AB $$S) d///%%--c2 0r>   c                 B    t        | j                  t              r| v S yNT)ro   r   r$   )r[   r8  s    r<   is_livez2SideEffects.prune_dead_object_new.<locals>.is_live  s#    #++-AB...r>   )rV   r(   r   rG   valuesro   r   r$   rC   stacksymbolic_localsparentpost_prune_cell_and_freevarsrg   r7  r   backward_staterM   r7   rH   )rY   txr<  r[   pre_existing_varsinit_live_varscur_txr:   r;   r8  r7  r9  s   `        @@@r<   prune_dead_object_newz!SideEffects.prune_dead_object_new  s   (+14	 	4 	 	 	 	T 	 **113
c//1EF 
 
 35 !!6<<1G1G"HI}}( ::FFF%%f&I&IJ]]F   	!		((!!		
  "00668
QGAJAqD
 "66<<>%
Q'!*AqD%
![
T
%
s   #F"F'F'F-F-c                 |   || j                   v ry | j                  |       | j                  |       t        |j                  t
              rd|j                  _        |j                  %| j                  j                  |j                         |j                  r#t        |t        j                        rd| _        y y y r;  )rW   r   rl   ro   r   r&   r   r   rX   r]   r   ConstDictVariablerT   r^   s     r<   mutationzSideEffects.mutation  s    $999&&s+  %c'')>?,0C)::!  $$SZZ0::*S)*E*EF/3D, G:r>   c                     | j                   S r3   )rT   rY   s    r<   has_existing_dict_mutationz&SideEffects.has_existing_dict_mutation  s    ///r>   c                     | j                   j                         D cg c]  }| j                  |      s| c}S c c}w r3   )rG   r=  r   r^   s     r<   _get_modified_varszSideEffects._get_modified_vars  s3    #2299;Ut?O?OPS?TUUUs   ;;cgc           	      "   | j                         D ]  t        j                  t              sj                  J -t        t
        j                  t
        j                  f      r| j                        sit        t
        j                        rj                  ^j                  fd       j                  t        dd             j                         t        j                            _        j                  t#        j                        _        j%                         rpt        t
        j&                  j(                        sL d       j                         j+                          t        j                            _        t        t
        j,                        rt/        dddg        t        t
        j0                        rdfd	}j                  |       nj                  fd
       j                  j2                  J  j                  j2                         j4                  D ]
  } |        j                  t        dt7        j4                        z   d             j                         t        j                            _        t        t
        j8                        sЉ| j:                  v s| j:                     j=                         D ]  \  }}j?                  dd       jA                  d        j                          t        jB                  |              |       j                  g tE        d      tG        d               | jH                  D ]g  \  }} |j                         jA                  d       |D ]
  } |        j                  g tE        t7        |            tG        d             i y )Nc                  D     j                  t        j                  d      S )N	make_cellload_import_fromr   __name__rP  s   r<   <lambda>z3SideEffects.codegen_save_tempvars.<locals>.<lambda>(       3 3ENNK P r>   r   Fallow_cachez<AutogradFunctionContextVariable escaped Dynamo-traced regionr   zAWe cannot reconstruct a torch.autograd.Function's context object.r   c                      j                   J   j                           j                   j                  d      g       y )Nr  )r  extend_outputcreate_load_attrrP  r[   s   r<   load_new_methodz:SideEffects.codegen_save_tempvars.<locals>.load_new_methodQ  s;    ":::3??+(("*=*=i*H)IJr>   c                  D     j                  t        j                  d      S )Nr!   rT  rW  s   r<   rX  z3SideEffects.codegen_save_tempvars.<locals>.<lambda>Z  s     3 3ENNL Q r>   r   builtinsr   __setattr__   POP_TOPrL   r1   N)%rO  ro   r   r$   r   r   NamedTupleVariableStructSequenceVariabler   r   
local_nameadd_push_nullr]  r   	add_cacher   tempvarsr   	is_tensortorch_functionTensorWithTFOverrideVariable	clear_tosr	   r   r   r   r  lenr)   rH   r7   rU  load_methodConstantVariabler   r   rL   )	rY   rP  r`  r  r   r   r*  r+  r[   s	    `      @r<   codegen_save_tempvarsz!SideEffects.codegen_save_tempvars  sl    **, l	Cc//1EFzz--- --y/O/OP //4#y556
 >>)$$P $$%9!U%CDLL%!0S1A!BCJZZ'!0!@CJ 11NN s.LL% LLN!0S1A!BCJC!J!JKZ c	 c9#F#FGK $$_5$$Q ((33???3$$//0 == CsG   !5a#cmm:L6Le!TUS!,R[[-=>
 sI$E$EFt888'+'@'@'E'K'K'M e++JA}53::955d;<5	((S03S5G	5RSIl	\ // 
	ICszzNNN./ 3'D	2&y1
	r>   tensorhookhandlec                    |j                         sJ t        |t        j                        sJ t        |t        j                        r|j                         sJ t        t        j                  |      sJ t        | j                  j                               }|| j                  v r|dz  }|| j                  v r||||f| j                  |<   |j                  rJ ||_        y )Nr   )rm  ro   r   r(   RemovableHandleVariable
is_mutabler   rh   Tensorrq  rM   rr   idx)rY   ru  rv  rw  r   r|  s         r<   register_hookzSideEffects.register_hook  s     !!!$	 9 9:::vy@@A!!#	
$ u||T***$##((*+T&&&1HC T&&&"($!=#::~
r>   r|  c                     | j                   |= y r3   )rM   )rY   r|  s     r<   remove_hookzSideEffects.remove_hook  s    c"r>   c                    | j                   j                         D ]g  \  }}j                  sJ d       dfd}j                  |        |       j	                  t        dd             j                  |       i y )Nz4Hooks on non input tensors NYI - should not get herec                  X              j                   j                        g       y r3   )r]  r^  )rP  r   ru  s   r<   gen_fnz)SideEffects.codegen_hooks.<locals>.gen_fn  s&    6
  ""5"5d";!<=r>   r   Frf  )rM   r=  r   rj  r]  r   rk  )rY   rP  rv  rw  r  r   ru  s    `   @@r<   codegen_hookszSideEffects.codegen_hooks  s     %%'3	! 
F ==X"XX=> V$tH1!U;< LL g3	!r>   c                     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  s;    4&&.*3*@*@"2"4+D' ***r>   c                 d   t         j                  dk7  sJ | j                  j                  |g       }d|j	                          }d}|j
                  t        |j
                  t              rd}nxt        |t        j                        r|j                  d|j                   d}nAt        |t        j                  j                        rd}nd|j
                  j                   d}|rt               }g }t        t!                     }|D ]k  }t#        d	 |D              }	|	|vs|j%                  |	       t        ||z         }
|j'                  d
j)                  t+        j,                  |
                   m dj)                  |      }| | dt/        j0                  |d       }|S | | d}|S )z1Format a side effect log message with user stack.re   zMutating object of type z (no source)z* (source: created in torch.compile region)z
 (source: )z- (source: torch function mode stack mutation)z (source name: c              3      K   | ]V  }|j                   |j                  |j                  |j                  t	        |d d      t	        |dd      t	        |dd      f X yw)colnoN
end_lineno	end_colno)filenamelinenor   liner   ).0fs     r<   	<genexpr>z:SideEffects._format_side_effect_message.<locals>.<genexpr>  s\      $  

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

z

z    z+ (unable to find user stacks for mutations))r   rf   rJ   r   python_type_namer   ro   r   r   r   ri  rn  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_dynamor>  stack_tuplestack_augmentedformatted_lineslog_strs                r<   _format_side_effect_messagez'SideEffects._format_side_effect_message  s   //8;;;--11#r:	01E1E1G0HI$::!#**o6JC!7!78S^^=W *3>>*:!<Y--LL N !0

/@B5D13#!78N8P!Q"  $ $ #$  d*HH[)&<=ORW=W&XO+22	 5 5o FG', $4#8#89P#QO$k]$xX^7_6`aG  -},WX  r>   side_effect_messagesc                     sy D ]  }t         j                  |        t        j                  j	                  dd fd       y )Nartifactc                      dddS )Ndynamo_side_effectsstring)r   encodingr   r   r>   r<   rX  z8SideEffects._emit_side_effect_messages.<locals>.<lambda>"  s    -$! r>   c                  &    dj                         S )Nz,

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

)r  )r  s   r<   rX  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  sL    #' 	(C""3'	( 	'' 	( 		
r>   log_side_effectsc           	          g dt         dd f fd}g } j                         D ]1  t        j                  st	        j
                  t              s/t	        t        j                        r} d        j
                         j                  j                  d       j                  d       t        dd      g       |j                  t        d	      g        |       t	        t        j                  j                        r҉j                  j!                         st#        d
dddg        j
                         j%                  d        d       |j                  g t'        d      t        d              j
                         j%                  d       |j                  g t'        d      t        d              |       t	        t        j(                  t        j*                  f      r҉j-                         s j
                         j%                  d        d       j.                  r# j
                         j%                  d       |j                  g t'        d      t        d             j.                  r'|j                  g t'        d      t        d              |       t	        t        j0                  j2                        rj5                  fd       j7                  dd       t        j0                  j9                         }j:                  dxx   |fz  cc<   j=                  t        d|             j5                  fd       j?                  j@                         j=                  t        dtC        j@                                     j7                  dd       j=                  t        d              |       t	        t        jD                        rjjF                  ^ jH                  v s jK                        } |       |j                  jM                  jF                        g        |       m jO                        rt	        jP                  tR              rt	        t        jT                        rt	        t        jV                        rv jY                  jZ                        rZi }t\        j^                  j`                  D ])  }jb                  jd                  jg                         ||<   + 	 ti        jj                        jl                  jo                  tp        jr                        }j                  t        d|      t        d|d         g        j
                         j                  t        d|d         g        jZ                  d       j                  t        d|d         g       ty        t\        |      }	|j                  g |	t        d              |jZ                         n%t	        t        jz                        r
 jY                  jZ                        ri }t|        j^                  j`                  D ])  }jb                  jd                  jg                         ||<   +  j
                         j                  t        d|d          g        jZ                  d       j                  t        d|d!         g       ty        t|        |      }
|j                  g |
t        d              |jZ                         d}t         jH                  j                  i       j                               D ]  \  }}t	        t        j                        rijb                  jd                  j                  |        |       t	        j
                  t              sJ |j                  t        d"|      g       d#}t	        |t        j                        rt	        jP                  t              st        t        d$d       |      s׉jb                  jd                  j                  |        j
                         |j                  t        d%|      g       d#}/t	        t        j                        rj                  |      ruj5                  fd&        j
                          t        j                  |              |       |j                  g t        d'd      t        d             d#}t	        t        j                        rj                         rj                  d(d)       j%                  d*        j
                          t        j                  |              |       |j                  g t'        d'      t        d             d#}|jb                  jd                  j                  |        |               |j                  t        d+|      g       d#} |s
w |       
t	        t        j                        rlt        jn                        D ]J  }j5                  fd,        j
                         j7                  dd       j                          L  |       t	        t        j                        rlt        j                        D ]J  }j5                  fd-        j
                         j7                  dd       j                          L  |       t	        t        j                        ryd/fd.}j5                  |        j                  j                  j                                      |j                  g t        dd      t        d              |        t        ti                     t        |      D ]  }j                  |        rr j                         y y y # tt        $ r6 ti        jj                        jl                  jo                  tv              }Y ;w xY w)0Nr[   r1   c                 x    t         j                  dk7  r&r#j                  |       }j                  |       y y y Nre   )r   rf   r  rg   )r[   r  r  rY   r  s     r<   _maybe_log_side_effectzBSideEffects.codegen_update_mutated.<locals>._maybe_log_side_effect1  s<    //8;@P66s;$++C0 AQ;r>   FrZ  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   re  r6   r   updatec                  D     j                  t        j                  d      S )Nget_torch_function_mode_stackrT  rW  s   r<   rX  z4SideEffects.codegen_update_mutated.<locals>.<lambda>      B//(G r>   co_varnames
STORE_FAST)argvalc                  D     j                  t        j                  d      S )Nset_torch_function_mode_stackrT  rW  s   r<   rX  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  r  r>   
BUILD_LIST
LOAD_CONSTr0   r/   r.   )varname_mapr@   r?   STORE_GLOBALTr   DELETE_ATTRc                  D     j                  t        j                  d      S )N object_setattr_ignore_descriptorrT  rW  s   r<   rX  z4SideEffects.codegen_update_mutated.<locals>.<lambda>O  s    B$7$7 %0R% r>   rd  rb  r   rc  
STORE_ATTRc                  D     j                  t        j                  d      S N	iter_nextrT  rW  s   r<   rX  z4SideEffects.codegen_update_mutated.<locals>.<lambda>w  rY  r>   c                  D     j                  t        j                  d      S r  rT  rW  s   r<   rX  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  rY  r>   c                  L      j                           j                  d       y )Nsetstate)r   r   r_  s   r<   r  z2SideEffects.codegen_update_mutated.<locals>.gen_fn  s    szzNLL,r>   rf  )Zr(   rO  r   replay_side_effectsro   r   r   r   r,   r]  create_load_constr   rg   listsDequeVariablemaxlenis_constant_noner   rr  r   rI  SetVariablehas_new_itemsshould_reconstruct_allrn  r  rj  call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackrq  r   ri  rH   r   create_store_derefr   r   r$   r)   r   r   _base_vtr=   __code__r  rC  r   new_varr4   r   r5   indexr   r   
ValueErrorry   r   r  rD   reversedr   r7   r(  update_co_namesr   r   r#   r   r   r   should_skip_descriptor_setterrs  r   needs_slow_setattrrU  ListIteratorVariablerangepop_topCountIteratorVariableadvance_countRandomVariable
wrap_staterandomgetstater   r  )rY   rP  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
 **, `	0C--j

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

3--.  &|S=O=O9PQ   E*  !3I!>?&s+C!7!78S^^=W $333#'>>##6L|$OOR%:%:3>>%J$KL*3/++C0 c//1EF:::L 55 &&LL
 #%K 4 = = I I C,.EELL,@,@,BD)CH$(O$;$;$A$A'33%	 $$.|IN. ,[5M szzN$$. ,[5K s||7$$. ,[5M )?,+)% OO..y9 +  55 &&LL
 #%K 3 < < H H C,.EELL,@,@,BD)C szzN$$. ,[5K s||7$$. ,[5M )?+)% OO..y9 +( (-$#+--11#r:@@B$ :4KD% "#y'B'BC44T:5	)#**lCCC /tLM 04,#E9+D+DE%--/H%gc7D&A4HEELL88>szzN$OO!3M$!O P 480#Y@@;;DA((
 3::955d;<5	 !5a!? 29 = 04,"3	(K(KL224 ++JA}53::955d;<5	 S03S5G	5RS 04,44T:5	3 );LQU)V(WX/3,u:4x (*3/C!?!?@syy) !A$$P szzN$$Q.JJL! 's+C!@!@As001 !A$$P szzN$$Q.JJL! 's+C!9!9:-   (3>>#**"5"5"789-a7*95 's+$T#Y//A`	0F x( 	%FV$	%  4++,@A !5a & H$(O$;$;$A$A$$G	Hs   <r;ssc                     t         j                  dk(  ry t        j                  t        j
                        sy | j                         D ](  }| j                  |      }t        j                  |       * y r  )	r   rf   r  isEnabledForloggingDEBUGrO  r  r  )rY   r[   r  s      r<   log_side_effects_summaryz$SideEffects.log_side_effects_summary  s^    ++x7,,W]];**, 	(C2237C""3'	(r>   c                     t        t        | j                  | j                  j	                                     xs( | j
                  xs | j                  xs | j
                   S r3   )anymapr   rG   r=  rM   rL   rL  s    r<   is_emptyzSideEffects.is_empty  s\    D$$d&9&9&@&@&BCD !  !%%!   	
 	
r>   c                 l    | j                   j                          | j                  j                          y r3   )rI   r6   rG   rL  s    r<   r6   zSideEffects.clear  s$    !!#r>   )NNNNNN)r1   rF   )FF)rm   rF   r1   N)rC  r+   r1   N)r1   zvariables.ListVariable)Frf  )LrV  
__module____qualname____doc__ry   r   r(   __annotations__r   rB   r   r  StackSummaryr   r	   rP   r_   rb   rl   r   r   rp   rw   rz   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)  r-  r4  rG  rJ  rM  rO  r   rt  r}  r  r  r  r  r  r  r  r  r6   __classcell__)rZ   s   @r<   rF   rF   \   sO   & o-..S/5I0JJKKCyY5K5K0LLMM
 =A&*  -1@#1@ S/12T91@ #?Do9M4N#NO
	1@ #?D9O9O4P#PQ
1@ 9t#1@  143HHI
 1@ *3
 	1@. 
/1@f9 94 9
@o @$ @

 
4 

F 
t 
- C$J ,
 / / /- - -
4 

$ 

T 
o $ (o ($ (TD#D+.D7FD	D$ !  	
  
&
9/ 
9/ 
9d 
9
 
_ 
.* *s * *+#++.+7F+	+ 
 
 
 
A/ Ad A
 
T 

> > >PT >
. .D .& #8	 "  	
 
* M

 "
 
	
TM  	
 c3h 
*/ /$ /b/$/  / (	/
 
/b$   (	
 
<			tm+3?N	F # / 3"3*.*?3	3G"G	GI
V4O 4 40D 0VD$9 V	 d B*  4	
  
,#s #t #4!	 4!d 4!l+5 53 5n
tCy 
T 
& 7<tBtB/3tB	tBl(
$ 
$r>   rF   rC  r+   )NNNc              #     K   | j                   j                  j                  }	 d| j                   j                  _        d || j                   j                  _        y# || j                   j                  _        w xY w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   rC  orig_vals     r<   r   r     s\      yy''AAHF=A		  :=E		  :X		  :   !A?A A?A<<A?c              #   8  K   | j                   j                  j                  }	 d| j                   j                  _        d| j                   j                  _        d  || j                   j                  _        y # || j                   j                  _        w xY wwr;  )r   r   r   +traced_with_externally_visible_side_effectsr  s     r<   2allow_externally_visible_side_effects_in_subtracerr    so      yy''TTHYPT		  MOS		  LPX		  MPX		  Ms   !B:A: B:BBc              #     K   | j                   j                  j                  }	 d| j                   j                  _        d  || j                   j                  _        y # || j                   j                  _        w xY wwr;  )r   r   r   r  s     r<   "disallow_side_effects_in_generatorr    s\      yy''CCHH?C		  <?G		  <x		  <r  )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  getArtifactLoggerrV  r  ry   r   r=   rB   rD   rF   contextmanagerr   r  r  r   r>   r<   <module>r(     s  .         5  %   H / 2 9 9   N N V V T T   < 6H: >>33HnM 
.CH~
.(,S#X
.CF
.	
.$49 $tCy $T $
X$ X$v* F#F F F  	Y#	Y 	Y 	Y H#H H Hr>   