
    i                     <   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mZmZ ddl	m
Z
 ddlmZmZmZ ddlZddlmZ ddlmZmZmZ dd	lmZmZmZmZ dd
lmZ ddlmZm Z  ddl!m"Z"m#Z#m$Z$m%Z% ddlm&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 erddl3m4Z4 ddl5m6Z6 ddl7m8Z8 de9eef   de9eef   de:ddfdZ;de<e   de<e   ddfdZ= G d d      Z>ej~                  ddded   fd        Z@ej~                  ddded   fd!       ZAej~                  ddded   fd"       ZBy)#a  
Side effect tracking and management for TorchDynamo's compilation system.

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

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

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

The side effect system ensures that mutations performed during symbolic execution
are properly replayed during runtime, maintaining the correctness of compiled code
while enabling optimizations where safe.
    N)	GeneratorMutableMapping)CellType)AnyOptionalTYPE_CHECKINGAutogradFunctionContextVariable   )graph_break_hintsutils	variables)bytecode_from_templatecreate_call_functioncreate_call_methodcreate_instruction)	PyCodegen)SideEffectsErrorunimplemented_v2)GlobalSourceLocalCellSourceLocalSourceSource)is_frozen_dataclassnn_module_new
object_new)AttributeMutationAttributeMutationExistingAttributeMutationNewis_side_effect_safeValueMutationExistingValueMutationNewVariableTracker)FrozenDataClassVariable)OutputGraph)InstructionTranslatorBase)ListVariable	dict_fromdict_to	mro_indexreturnc                     t        |      j                  |   }|j                  |       | j                         D ]  \  }}|j	                  |||        y N)type__mro__clearitems__setitem__)r(   r)   r*   
dict_classkvs         T/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/side_effects.py_manual_dict_setitemr7   A   sR     g&&y1JW! .1w1-.    	list_fromlist_toc                 Z    t         j                  |       t         j                  ||        y r-   )listr0   extend)r9   r:   s     r6   _manual_list_updater>   N   s    JJwKK#r8   c                   F    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<   	 	 	 	 	 dXdddeeeef      deeeeeef   f      dee	e
      dee	eee	e   f         d	eeeed
edef   f      ddf fdZdeddfdZdeddfdZdedefdZdd dee   fdZdYdZde
defdZde
defdZdefdZdefdZdefdZdedefdZdedededdfdZ	 	 dZd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d,Z'dedefd-Z(e)fde
d.ed/e#defd0Z*e*Z+de
d.edefd1Z,d2e-d3e
d4e
d5eee
f   def
d6Z.d3e#de#fd7Z/d8ed9ed:e	e   de
fd;Z0d8ed9ed:e	e   defd<Z1defd=Z2d>ee-   d?e3d@edefdAZ4d>e-de
defdBZ5dCedDe	e   ddfdEZ6	 	 	 	 d[dFZ7d\dGZ8deddfdHZ9defdIZ:de	e   fdJZ;dKe<ddfdLZ=dMd
dNedOddeddf
dPZ>dQeddfdRZ?dKe<ddfdSZ@d]dTZAdKe<ddfdUZBdefdVZCd^dWZD xZES )_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	keepaliveNoutput_graphr%   save_for_backwardtensor_hookszvariables.TensorVariablez!variables.RemovableHandleVariabler+   c                     t         |           t        j                  |      | _        |xs i | _        |xs i | _        |xs g | _        |xs g | _        |xs i | _	        d| _
        d | _        t               | _        y )NF)super__init__weakrefrefoutput_graph_weakrefrA   rB   rC   rE   rF   _has_existing_dict_mutationca_final_callbacks_varset"ignore_mutation_on_these_variables)selfrD   rA   rB   rC   rE   rF   	__class__s          r6   rI   zSideEffects.__init__k   s    . 	$+KK$=!,2$8$>B!"b!2!8b(.B ,1( ?C# IL/r8   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)rP   addrQ   rS   s     r6   ignore_mutations_onzSideEffects.ignore_mutations_on   s     	//33C8r8   c                 X    || j                   v r| j                   j                  |       yy)zQRemove a variable from the skip mutation set, restoring normal mutation tracking.N)rP   removerV   s     r6   stop_ignoring_mutations_onz&SideEffects.stop_ignoring_mutations_on   s)    $99933::3? :r8   otherc                     t        |t              sJ | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r-   )
isinstancer@   rA   rB   rE   rF   )rQ   r[   s     r6   __eq__zSideEffects.__eq__   sz    %--- 5#7#77 8))U-G-GG8&&%*A*AA8 !!U%7%77		
r8   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 diffrE   rF   )rA   keysrB   rE   rF   )rQ   r[   sk_itvok_itvsk_samok_sams         r6   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!r8   c                 B   | j                         }|J | j                  |t        | j                        | j                  j                         D ci c]  \  }}|t        |       c}}t        | j                        | j                  | j                        S c c}}w )zCreate a shallow copy)rD   rA   rB   rC   rE   rF   )
rL   rR   dictrA   rB   r1   r<   rC   rE   rF   )rQ   rK   r4   r5   s       r6   clonezSideEffects.clone   s    '')~~ 3 34'+'@'@'F'F'H"#q!47
" 4>>*"44**  	
 		
"s   Bitemc                 0    t        |      | j                  v S r-   )idrA   rQ   ri   s     r6   __contains__zSideEffects.__contains__   s    $x4....r8   c                 2    | j                   t        |         S r-   )rA   rk   rl   s     r6   __getitem__zSideEffects.__getitem__   s    ""2d8,,r8   c                     | j                         }t        |xrV |j                  j                  j                  j
                  xr* |j                  j                  j                  j                        S r-   )rL   bool
current_txoutputcurrent_tracerunder_activation_checkpoint#allow_side_effects_under_checkpointrQ   rD   s     r6   *should_allow_side_effects_under_checkpointz6SideEffects.should_allow_side_effects_under_checkpoint   sb    002 b''..==YYb''..==aa
 	
r8   c                     | j                         }t        |xr* |j                  j                  j                  j
                        S r-   )rL   rq   rr   rs   rt   ,unsafe_allow_externally_visible_side_effectsrw   s     r6   9should_allow_externally_visible_side_effects_in_subtracerzESideEffects.should_allow_externally_visible_side_effects_in_subtracer   sA    002 k''..==jj
 	
r8   c                     | j                         }t        |xr* |j                  j                  j                  j
                        S r-   )rL   rq   rr   rs   rt   is_reconstructing_generatorrw   s     r6   r}   z'SideEffects.is_reconstructing_generator   sA    002 Z''..==YY
 	
r8   c                     ddl m} t        ||      ry| j                         ry| j	                         ry| j                         rt        d      t        |j                        st        dddg        y	)
Nr   r	   TzCannot reconstruct a generator with variable mutations. Dynamo needs to fully exhaust the generator, which may cause unintended variable modifications.zOHigherOrderOperator: Mutating a variable not in the current scope (SideEffects) This is not supported.gb_typecontextexplanationhintsF)
torch._dynamo.variables.miscr
   r]   r{   rx   r}   r   r    mutation_typer   )rQ   ri   r
   s      r6   check_allowed_side_effectz%SideEffects.check_allowed_side_effect   s|    P d;<IIK::<++- #5 
 #4#5#56i4	 r8   namevaluec                     | j                  |      sJ | j                  |       || j                  vri | j                  |<   || j                  |   |<   y r-   )is_attribute_mutationr   rB   )rQ   ri   r   r   s       r6   
store_attrzSideEffects.store_attr  sY     ))$///&&t,t000.0D%%d+05!!$'-r8   
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   )r   rB   r]   r   DeletedVariabler   r   
USER_ERROR)rQ   ri   r   r   r   results         r6   	load_attrzSideEffects.load_attr  sv     --d333**406j1J1JK> htf55)445	 r8   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   	DIFFICULTr]   r   CellVariabler#   r   )rQ   r   r   s      r6   
store_cellzSideEffects.store_cell(  sy    !1#G9IeW=d4)334	 '9#9#9:::%!:!:;;;%8r8   c                    t        |t        j                        sJ | j                  |d      r| j	                  |dd      S |j
                  r|j
                  S t        dt        |      dg t        j                         y )Nr   F)r   zRead uninitialized cellzBAttempted to read a cell variable that has not been populated yet.r   )
r]   r   r   has_pending_mutation_of_attrr   pre_existing_contentsr   strr   r   )rQ   r   s     r6   	load_cellzSideEffects.load_cell4  sv    '9#9#9:::,,WoF>>'?%>HH((000-L\1%001		
r8   gvarc                 ^    t        |t        j                        sJ | j                  ||      S r-   )r]   r   r#   r   )rQ   r   r   s      r6   load_globalzSideEffects.load_globalA  s)    $	 9 9:::~~dD))r8   c                     t        |t        j                        sJ t        |t        j                        sJ | j                  |||       y r-   )r]   r   r#   r   )rQ   r   r   r   s       r6   store_globalzSideEffects.store_globalE  s@     $	 9 9:::%!:!:;;;dE*r8   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   rg   rO   	frozensetintr   r<   tupleBaseException)r   s    r6   "cls_supports_mutation_side_effectsz.SideEffects.cls_supports_mutation_side_effectsL  sv    %%c+=tD##!!  &&    !!""**
I
 

 
	
r8   c                 6    t        |j                  t              S r-   )r]   r   r   rl   s     r6   r   z!SideEffects.is_attribute_mutationZ  s    $,,.?@@r8   c                 p    | j                  |      xr$ t        | j                  j                  |            S r-   )r   rq   rB   getrl   s     r6   has_pending_mutationz SideEffects.has_pending_mutation]  s5    ))$/ 
D%%))$/5
 	
r8   c                 d    | j                  |      xr || j                  j                  |d      v S )N )r   rB   r   )rQ   ri   r   s      r6   r   z(SideEffects.has_pending_mutation_of_attrb  s8    ))
 >d//33D"==	>r8   c                 F   |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                  S )NFT)r   r]   r   r   r"   r   UserDefinedObjectVariablerB   is_underlying_vt_modifiedr   is_modifiedrl   s     r6   r   zSideEffects.is_modifiedg  s    d((+?AQ*RSdI??@4444 8V8V9  %%d+44444!!---r8   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: .)rk   rA   AssertionErrorsourcer   rC   append)rQ   ri   r   r   s       r6   
_track_objzSideEffects._track_objx  s     d8t*** * ) *2(9 :88<8K8KBtH8U8\8\7]]^	`  "3!4(0BtH%d#r8   c                 2    | j                  ||t              S )N)r   )r   r   )rQ   ri   r   s      r6   track_object_existingz!SideEffects.track_object_existing  s#    
 7  
 	
r8   
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   )torchautogradfunctionFunctionCtxwarningscatch_warningsFunctionr   r   rA   rk   rC   r   )rQ   r   r   r   r   objr   s          r6   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|}nFt        |d      rt        |d      r ||      s|}n"t        |t        j                  j                        rt        j                   }nt        |t"        t$        j&                  f      rt        j(                  }nt        |t*        t,        f      rt        j.                  }nt        |t0              rt        j2                  }ntt        |t4              rt        j6                  }nSt        |t8              rt        j:                  }n2t=        |      rt>        }n t        |t@              rt        jB                  }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hasattrr   nnModuleUnspecializedNNModuleVariablerg   collectionsOrderedDictUserDefinedDictVariablerO   r   UserDefinedSetVariabler   UserDefinedTupleVariabler<   UserDefinedListVariabler   MutableMappingVariabler   r$   r   "UserDefinedExceptionObjectVariable)rQ   r   r   r   r   r   r   s          r6   get_variable_clszSideEffects.get_variable_cls  s6   5IGH // 	 '
'HHR4LHk**-0:9L%((//2$BBL4)@)@"AB$<<L3	"23$;;L%($==L$'$<<L.1$;;L *2L-0$GGL,	(K(KLLLr8   base_cls_vtcls_vt	init_argsc                    |j                   }t        |t        j                  j                        rt        |      }|S t        |t        j                        r|j                  }n5t        |t        j                        r|j                   }nt        d|       t        j                  j                  |j                        sJ |j                  |      }|S )NzUnexpected base_cls_vt )r   r   r   r   r   r   r]   r   BuiltinVariablefnUserDefinedClassVariableRuntimeErroris_supported_new_method__new__)rQ   r   r   r   r   r   base_clss          r6   get_example_valuezSideEffects.get_example_value  s     <<h0)C( 
% +y'@'@A&>>K)K)KL&,,"%<[M#JKK55MM     ""8,C
r8   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   rA   rk   rC   r   )	rQ   r   r   r   r   r   r   r   r   s	            r6   track_new_user_defined_objectz)SideEffects.track_new_user_defined_object  s     ]]
<<,,X6$$[&)D}}#.z:
 (0BsG$c"r8   c                     t               }t        j                  t                     }|| j                  t        |      <   | j                  j                  |       |S )Nr   )r   r   r   r   rA   rk   rC   r   )rQ   r   r   s      r6   track_cell_newzSideEffects.track_cell_new  sN     h)).0
 (0BsG$c"r8   r   cellcontentsc                     t        j                  |d n	t               ||      }|| j                  t	        |      <   | j
                  j                  |       |S )N)r   r   r   )r   r   r   rA   rk   rC   r   )rQ   r   r   r   r   s        r6   track_cell_existingzSideEffects.track_cell_existing  sV     )) #).$6O6Q"*
 )1BtH%d#r8   c                     t        j                  t               |      }|| j                  t	        |      <   | j
                  j                  |       |S )N)r   r   )r   NewGlobalVariabler   rA   rk   rC   r   )rQ   r   ri   r   s       r6   track_global_existingz!SideEffects.track_global_existing,  sH    ..35
 )1BtH%d#r8   ctxargsc                 v    t        |t        j                        sJ | j                  j	                  ||f       y r-   )r]   r   r
   rE   r   )rQ   r  r  s      r6   track_save_for_backwardz#SideEffects.track_save_for_backward5  s2     #yHHIII%%sDk2r8   c                     |j                   D ]h  }t        |      }|j                  |   }|| j                  vs,t        |t        j
                  t        j                  f      sW| j                  ||       j y r-   )rC   rk   rA   r]   r   TensorVariableSymNodeVariabler   )rQ   r[   
other_itemother_idother_variables        r6   -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r8   c                    	
 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 }|}|6|j                  |j                  |j                  g       |j                  }|6t        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 )NrS   r+   c                     | v ry j                  |        t        | j                  t              rj                  |        | j                  v r$t        j                  j                  |           y y r-   )rU   r]   r   r   rB   r#   visit)rS   live_new_objectsrQ   r  visiteds    r6   r  z0SideEffects.prune_dead_object_new.<locals>.visitN  sl    g~KK#++-AB $$S) d///%%--c2 0r8   c                 B    t        | j                  t              r| v S yNT)r]   r   r   )rS   r  s    r6   is_livez2SideEffects.prune_dead_object_new.<locals>.is_live^  s#    #++-AB...r8   )rO   r#   rq   rA   valuesr]   r   r   r=   stacksymbolic_localsparentr  rs   backward_staterF   r1   rB   )rQ   txr  rS   pre_existing_varsinit_live_varscur_txr4   r5   r  r  r  s   `        @@@r6   prune_dead_object_newz!SideEffects.prune_dead_object_newI  sz   (+14	 	4 	 	 	 	T 	 **113
c//1EF 
 
 68 !!6<<1G1G"HI]]F   	!		((!!		
  "00668
QGAJAqD
 "66<<>%
Q'!*AqD%
!O
H
%
s   #E-E2"E2E8E8c                 .   || j                   v ry | j                  |       t        |j                  t              rd|j                  _        |j                  r>t        |t        j                        r#t        |t        j                        sd| _
        y y y y r  )rP   r   r]   r   r!   r   r   r   ConstDictVariableSetVariablerM   rV   s     r6   mutationzSideEffects.mutation  s~    $999&&s+c'')>?,0C)JJ3	 ; ;<sI$9$9:/3D, ; = r8   c                     | j                   S r-   )rM   rQ   s    r6   has_existing_dict_mutationz&SideEffects.has_existing_dict_mutation  s    ///r8   c                     | j                   j                         D cg c]  }| j                  |      s| c}S c c}w r-   )rA   r  r   rV   s     r6   _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                        rj                  ^j                  fd       j                  t        dd             j                         t        j                           _        j                  t        j                        _        t        t
        j                        rpt        t
        j                   j"                        s d       j                         j%                          t        j                           _        ct        t
        j&                        rt)        dddg        t        t
        j*                        rdfd	}j                  |       nj                  fd
       j                  j,                  J  j                  j,                         j.                  D ]
  } |        j                  t        dt1        j.                        z   d             j                         t        j                           _         | j2                  D ]g  \  }} |j                         j5                  d       |D ]
  } |        j                  g t7        t1        |            t9        d             i y )Nc                  D     j                  t        j                  d      S )N	make_cellload_import_fromr   __name__r,  s   r6   <lambda>z3SideEffects.codegen_save_tempvars.<locals>.<lambda>       3 3ENNK P r8   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r,  rS   s   r6   load_new_methodz:SideEffects.codegen_save_tempvars.<locals>.load_new_method  s;    ":::3??+(("*=*=i*H)IJr8   c                  D     j                  t        j                  d      S )Nr   r0  r3  s   r6   r4  z3SideEffects.codegen_save_tempvars.<locals>.<lambda>  s     3 3ENNL Q r8   r   rE   POP_TOPr+   N)r+  r]   r   r   r   r   r   
local_nameadd_push_nullr9  r   	add_cacher   tempvarsr   r  torch_functionTensorWithTFOverrideVariable	clear_tosr
   r   r   r   r   lenrE   load_methodr   r   )rQ   r,  r<  argr  r  rS   s    `    @r6   codegen_save_tempvarsz!SideEffects.codegen_save_tempvars  s    **, J	;Cc//1EFzz---#y556
 >>)$$P $$%9!U%CDLL%!,R[[-=!>CJZZ'!0!@CJC!9!9: 11NN s.LL% LLN!,R[[-=!>CJ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!(S)9:
UJ	;X // 
	ICszzNNN./ 3'D	2&y1
	r8   tensorhookhandlec                    t        |t        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   )r]   r   r  r#   RemovableHandleVariable
is_mutabler   r   TensorrG  rF   r`   idx)rQ   rK  rL  rM  r   rR  s         r6   register_hookzSideEffects.register_hook  s     &)":":;;;$	 9 9:::vy@@A!!#	
$ u||T***$##((*+T&&&1HC T&&&"($!=#::~
r8   rR  c                     | j                   |= y r-   )rF   )rQ   rR  s     r6   remove_hookzSideEffects.remove_hook  s    c"r8   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 r-   )r9  r:  )r,  r   rK  s   r6   gen_fnz)SideEffects.codegen_hooks.<locals>.gen_fnD  s&    6
  ""5"5d";!<=r8   r   Fr?  )rF   r  r   rA  r9  r   rB  )rQ   r,  rL  rM  rX  r   rK  s    `   @@r6   codegen_hookszSideEffects.codegen_hooks  s     %%'3	! 
F ==X"XX=> V$tH1!U;< LL g3	!r8   c                     ddl m} | j                  !t        j                  g  |             | _        | j                  S )Nr   )r"   r   )variables.baser"   rN   r   r'   )rQ   r"   s     r6   get_ca_final_callbacks_varz&SideEffects.get_ca_final_callbacks_varP  s;    4&&.*3*@*@"2"4+D' ***r8   c           	         g }| j                         D 
]  t        t        j                        ru d        j                         j                  j                  d       j                  d       t        dd      g       |j                  t        d      g       t        t        j                  j                        rt        j                  t        j                        rj                  j                  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"                        r̉j%                         s j                         j                  d        d       j&                  r# j                         j                  d       |j                  g t!        d      t        d             j&                  s^|j                  g t!        d      t        d             t        t        j(                  j*                        rj-                  fd       j/                  dd       t        j(                  j1                         }j2                  dxx   |fz  cc<   j5                  t        d|             j-                  fd       j7                  j8                         j5                  t        dt;        j8                                     j/                  dd       j5                  t        d             t        t        j<                        rbj>                  V| j@                  v s| jC                        } |       |j                  jE                  j>                        g       ,| jG                        rt        t        jH                        rd| jK                  jL                        rHi }tN        jP                  jR                  D ])  }jT                  jV                  jY                         ||<   + 	 t[        j                        j\                  j_                  t`        jb                        }j                  t        d|      t        d|d         g        j                         j                  t        d|d         g        jL                  d       j                  t        d|d         g       ti        tN        |      }|j                  g |t        d             nt        t        jj                        r| jK                  jl                        ri }tn        jP                  jR                  D ])  }jT                  jV                  jY                         ||<   +  j                         j                  t        d|d         g        jl                  d       j                  t        d|d         g       ti        tn        |      }|j                  g |t        d             tq        | j@                  js                  i       ju                               D ]  \  }}	t        t        jv                        rgjT                  jV                  jy                  |        |	       t        j                  tz              sJ |j                  t        d|      g       t        |	t        j|                        rt        j~                  t              st        t        d d       |      sՉjT                  jV                  jy                  |        j                         |j                  t        d!|      g       +t        t        j                        rj                  |      rsj-                  fd"        j                          t        j                  |              |	       |j                  g t        d#d      t        d             t        t        j                        rj                         rj                  d$d%       j                  d&        j                          t        j                  |              |	       |j                  g t!        d#      t        d             tjT                  jV                  jy                  |        |	               |j                  t        d'|      g        	t        t        j                        rdt        j^                        D ]J  }
j-                  fd(        j                         j/                  dd       j                          L 
Kt        t        j                        rqd*fd)}j-                  |        j                  j                  j                                      |j                  g t        dd      t        d             
t        t[                     tq        |      D ]  }j                  |        y # td        $ r6 t[        j                        j\                  j_                  tf              }Y Qw xY w)+NFr6  BUILD_SLICE   )rI  STORE_SUBSCRz1Side effect on existing deque with limited maxlenr   r   z*Don't use a deque with `maxlen` specified.r   r=   r   r>  r0   r   updatec                  D     j                  t        j                  d      S )Nget_torch_function_mode_stackr0  r3  s   r6   r4  z4SideEffects.codegen_update_mutated.<locals>.<lambda>      B//(G r8   co_varnames
STORE_FAST)argvalc                  D     j                  t        j                  d      S )Nset_torch_function_mode_stackr0  r3  s   r6   r4  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  rd  r8   
BUILD_LIST
LOAD_CONSTr*   r)   r(   )varname_mapr:   r9   STORE_GLOBALr   DELETE_ATTRc                  D     j                  t        j                  d      S )N object_setattr_ignore_descriptorr0  r3  s   r6   r4  z4SideEffects.codegen_update_mutated.<locals>.<lambda>V  s    B$7$7 %0R% r8      builtinsr   __setattr__
STORE_ATTRc                  D     j                  t        j                  d      S )N	iter_nextr0  r3  s   r6   r4  z4SideEffects.codegen_update_mutated.<locals>.<lambda>x  r5  r8   c                  L      j                           j                  d       y )Nsetstate)r   r   r;  s   r6   rX  z2SideEffects.codegen_update_mutated.<locals>.gen_fn  s    szzNLL,r8   r?  )Pr+  r]   r   r'   r   r9  create_load_constr   r   listsDequeVariablemaxlenConstantVariabler   r   rH  r   r$  has_new_itemsshould_reconstruct_allrD  TorchFunctionModeStackVariablerA  call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackrG  r   r@  rB   r   create_store_derefr   r   r   _dict_vtr7   __code__re  r  rs   new_varr.   r/   indexr   r   
ValueErrorrg   r   r   _list_vtr>   reversedr   r1   r  update_co_namesr   r   r   r   r   getattrr   should_skip_descriptor_setterr   needs_slow_setattrr1  ListIteratorVariablerangepop_topRandomVariable
wrap_staterandomgetstater   )rQ   r,  suffixesr   contents_varrl  r*   dict_update_instslist_update_instsr   _rX  suffixrS   s    `           @r6   codegen_update_mutatedz"SideEffects.codegen_update_mutatedZ  s	   **, q	0C#y5563E*3::  ,,T2,,T2*=a@ !3N!C DEC!>!>? szz9+E+EF

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

3--.  &|S=O=O9PQ   E*  !3I!>?C!7!78S^^=W $333#'>>##6L|$OOR%:%:3>>%J$KL++C0::&&s||4 #%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  ::&&s||4 #%K 3 < < H H C,.EELL,@,@,BD)C szzN$$. ,[5K s||7$$. ,[5M )?+)% OO..y9. $,--11#r:@@B$ 5YKD% "#y'B'BC44T:5	)#**lCCC /tLM $E9+D+DE%--/H%gc7D&A4HEELL88>szzN$OO!3M$!O P $Y@@;;DA((
 3::955d;<5	 !5a!? 29 = #3	(K(KL224 ++JA}53::955d;<5	 S03S5G	5RS 44T:5	3 );LQU)V(WXk5Yl C!?!?@syy) !A$$P szzN$$Q.JJL! C!9!9:-   (3>>#**"5"5"789-a7*95 %T#Y//c	q	0h	 x( 	%FV$	%_ & H$(O$;$;$A$A$$G	Hs   <l"";m! m!c                     t        t        | j                  | j                  j	                                     xs( | j
                  xs | j                  xs | j
                   S r-   )anymapr   rA   r  rF   rE   r(  s    r6   is_emptyzSideEffects.is_empty  s\    D$$d&9&9&@&@&BCD !  !%%!   	
 	
r8   c                 l    | j                   j                          | j                  j                          y r-   )rC   r0   rA   r(  s    r6   r0   zSideEffects.clear  s$    !!#r8   )NNNNN)r+   r@   )FF)r[   r@   r+   N)r  r&   r+   N)r+   zvariables.ListVariabler?  )Fr2  
__module____qualname____doc__rg   r   r#   __annotations__r   r<   r   r   r   r
   rI   rW   rZ   r   rq   r^   re   rh   rm   ro   rx   r{   r}   r   r   r   r   r   r   r   staticmethodr.   r   r   r   r   r   r!   r   track_mutabler   r   r   r   r   r   r   r   r  r  r	  r  r"  r&  r)  r+  r   rJ  rS  rU  rY  r\  r  r  r0   __classcell__)rR   s   @r6   r@   r@   S   s   & o-..S/5I0JJKKCy
 @D )-  +,N#,N !c?&:!;<,N '$sO';"<<=
	,N DI&,N $6_8MMNO
,N .#7

,N, 
-,N\9 94 9
@o @$ @

F 
t 
- HSM ,
/ / /- - -
D 

4 

T 
o $ :6#6+.67F6	6 !  	
  
&
9/ 
9/ 
9d 
9
 
_ 
* *s * *+#++.+7F+	+ 
 
 
 
A/ Ad A
 
T 

> > >PT >
. .D .* #8	 "  	
 
* M	
	
 "	
 
		
  	
 c3h 
*% %$ %N$   (	
 
>$   (	
 
<			v&.6BQ	F # / 3"3*.*?3	3G"G	GC
J4O 4 40D 0VD$9 V]	 ]d ]~*  4	
  
,#s #t #4!	 4!d 4!l+w% w%t w%r	
$ 
$r8   r@   r  r&   )NNNc              #   F  K   | j                   j                  j                  sJ | j                   j                  j                  }	 d| j                   j                  _        d  || j                   j                  _        y # || j                   j                  _        w xY wwr  )rs   rt   ru   rv   r  orig_vals     r6   rv   rv     su      99##????yy''KKHPGK		  DGO		  Dx		  Ds   AB!B %B!BB!c              #     K   | j                   j                  j                  }	 d| j                   j                  _        d  || j                   j                  _        y # || j                   j                  _        w xY wwr  )rs   rt   rz   r  s     r6   2allow_externally_visible_side_effects_in_subtracerr    s]      yy''TTHYPT		  MPX		  MPX		  M   !A?A A?A<<A?c              #     K   | j                   j                  j                  }	 d| j                   j                  _        d  || j                   j                  _        y # || j                   j                  _        w xY wwr  )rs   rt   r}   r  s     r6   "disallow_side_effects_in_generatorr    s\      yy''CCHH?C		  <?G		  <x		  <r  )Cr  r   
contextlibr   r   rJ   collections.abcr   r   typesr   typingr   r   r   torch.nnr   r   r
   r   r   r   r   bytecode_transformationr   r   r   r   codegenr   excr   r   r   r   r   r   r   r   r   r   r[  r   r   r   r    r!   r"   r#   r   r$   torch._dynamo.output_graphr%   torch._dynamo.symbolic_convertr&   torch._dynamo.variables.listsr'   rg   r   r7   r<   r>   r@   contextmanagerrv   r  r  r   r8   r6   <module>r     ss  .      5  / /  H 1 1   3 F F A A   < 6H:
.CH~
.(,S#X
.CF
.	
.$49 $tCy $T $
J$ J$Z" 	P#	P 	P 	P Y#Y Y Y H#H H Hr8   