
    Vh                        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 d dlmZ d dl	m
Z
mZmZ d dl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+m,Z, ddl-m.Z. erd dl/m0Z0 d Z1d Z2 G d d      Z3ejh                  dd       Z5ejh                  dd       Z6y)    N)MutableMapping)CellType)AnyOptionalTYPE_CHECKING   )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)InstructionTranslatorc                     t        |      j                  |   }|j                  |       | j                         D ]  \  }}|j	                  |||        y N)type__mro__clearitems__setitem__)	dict_fromdict_to	mro_index
dict_classkvs         J/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/side_effects.py_manual_dict_setitemr1   )   sR    
 g&&y1JW! .1w1-.    c                 Z    t         j                  |       t         j                  ||        y r$   )listr'   extend)	list_fromlist_tos     r0   _manual_list_updater8   4   s    JJwKK#r2   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<   	 	 	 	 	 d> fd	ZdedefdZdd dee   fd	Zd
 Zd Zd Zd Zd Zd ZdededefdZd?dZd Zd ZdedefdZdededefdZed        Zd Zd Z d Z!d Z"e#fde
defd Z$e$Z%de
defd!Z&d"e'd#e
d$e
fd%Z(d& Z)d' Z*d( Z+d) Z,d*ee'   d+e-d,efd-Z.d*e'de
fd.Z/d/ Z0d0 Z1d1 Z2d2 Z3d3 Z4d4 Z5d5e6fd6Z7d7 Z8d8 Z9d9 Z:d: Z;d5e6fd;Z<d< Z=d= Z> xZ?S )@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	keepalivec                     t         |           t        j                  |      | _        |xs i | _        |xs i | _        |xs g | _        |xs g | _        |xs i | _	        d| _
        d | _        y )NF)super__init__weakrefrefoutput_graph_weakrefr;   r<   r=   save_for_backwardtensor_hooks_has_existing_dict_mutationca_final_callbacks_var)selfoutput_graphr;   r<   r=   rD   rE   	__class__s          r0   r@   zSideEffects.__init__Q   st     	$+KK$=!,2$8$>B!"b!2!8b(.B ,1( '+#r2   otherreturnc                     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:   r;   r<   rD   rE   )rH   rK   s     r0   __eq__zSideEffects.__eq__h   sz    %--- 5#7#77 8))U-G-GG8&&%*A*AA8 !!U%7%77		
r2   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 diffrD   rE   )r;   keysr<   rD   rE   )rH   rK   sk_itvok_itvsk_samok_sams         r0   diffzSideEffects.diffr   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!r2   c                 6   | 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)rI   r;   r<   r=   rD   rE   )
rJ   rC   dictr;   r<   r(   r4   r=   rD   rE   )rH   r.   r/   s      r0   clonezSideEffects.clone   s    ~~224 3 34'+'@'@'F'F'H"#q!47
" 4>>*"44**  	
 		
"s   Bc                 0    t        |      | j                  v S r$   )idr;   rH   items     r0   __contains__zSideEffects.__contains__   s    $x4....r2   c                 2    | j                   t        |         S r$   )r;   r[   r\   s     r0   __getitem__zSideEffects.__getitem__   s    ""2d8,,r2   c                     | j                         }|xrV |j                  j                  j                  j                  xr* |j                  j                  j                  j
                  S r$   )rC   
current_txoutputcurrent_tracerunder_activation_checkpoint#allow_side_effects_under_checkpointrH   rI   s     r0   *should_allow_side_effects_under_checkpointz6SideEffects.should_allow_side_effects_under_checkpoint   sZ    002 b''..==YYb''..==aa	
r2   c                 ~    | j                         }|xr* |j                  j                  j                  j                  S r$   )rC   rb   rc   rd   is_reconstructing_generatorrg   s     r0   rj   z'SideEffects.is_reconstructing_generator   s;    002  Z''..==YY	
r2   c                     ddl m} t        ||      ry| j                         ry| j	                         rt        d      t        |j                        st        dddg        y y )	Nr   )AutogradFunctionContextVariableTzCannot 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hints)	torch._dynamo.variables.miscrl   rN   rh   rj   r   r   mutation_typer   )rH   r]   rl   s      r0   check_allowed_side_effectz%SideEffects.check_allowed_side_effect   sm    P d;<::<++- #5 
 #4#5#56i4	 7r2   r]   namevaluec                     | j                  |      sJ | j                  |       || j                  vri | j                  |<   || j                  |   |<   y r$   )is_attribute_mutationrv   r<   )rH   r]   rw   rx   s       r0   
store_attrzSideEffects.store_attr   sW    ))$///&&t,t000.0D%%d+05!!$'-r2   c                     |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: rm   ro   )rz   r<   rN   r   DeletedVariabler   r	   
USER_ERROR)rH   r]   rw   
deleted_okcheckresults         r0   	load_attrzSideEffects.load_attr   st    --d333**406j1J1JK> htf55)445	 r2   c                    |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.ro   cell_contents)	is_immutabler   r	   	DIFFICULTrN   r   CellVariabler    r{   )rH   cellvarrx   s      r0   
store_cellzSideEffects.store_cell   sy    !1#G9IeW=d4)334	 '9#9#9:::%!:!:;;;%8r2   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.ro   )
rN   r   r   has_pending_mutation_of_attrr   pre_existing_contentsr   strr	   r~   )rH   r   s     r0   	load_cellzSideEffects.load_cell   sv    '9#9#9:::,,WoF>>'?%>HH((000-L\1%001		
r2   gvarc                 ^    t        |t        j                        sJ | j                  ||      S r$   )rN   r   r    r   )rH   r   rw   s      r0   load_globalzSideEffects.load_global   s)    $	 9 9:::~~dD))r2   c                     t        |t        j                        sJ t        |t        j                        sJ | j                  |||       y r$   )rN   r   r    r{   )rH   r   rw   rx   s       r0   store_globalzSideEffects.store_global   s>    $	 9 9:::%!:!:;;;dE*r2   c                     t        j                  | dd       t        j                  t        j                  t
        j                  t        j                  t        j                  t        j                  fv S )N__getattribute__)	inspectgetattr_staticobjectr   rX   intr   r4   BaseException)clss    r0   "cls_supports_mutation_side_effectsz.SideEffects.cls_supports_mutation_side_effects   s[    %%c+=tD##!!    !!**I
 
 	
r2   c                 6    t        |j                  t              S r$   )rN   ru   r   r\   s     r0   rz   z!SideEffects.is_attribute_mutation  s    $,,.?@@r2   c                 p    | j                  |      xr$ t        | j                  j                  |            S r$   )rz   boolr<   getr\   s     r0   has_pending_mutationz SideEffects.has_pending_mutation	  s5    ))$/ 
D%%))$/5
 	
r2   c                 d    | j                  |      xr || j                  j                  |d      v S )N )rz   r<   r   )rH   r]   rw   s      r0   r   z(SideEffects.has_pending_mutation_of_attr  s8    ))
 >d//33D"==	>r2   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   rN   ru   r   r   r   UserDefinedObjectVariabler<   is_underlying_vt_modifiedrz   is_modifiedr\   s     r0   r   zSideEffects.is_modified  s    d((+?AQ*RSdI??@4444 8V8V9  %%d+44444!!---r2   variablec           
      J   |j                   J t        |      | j                  v r>t        | d|j                    d| j                  t        |         j                    d       |       |_        || j                  t        |      <   | j
                  j                  |       |S )z*Start tracking a 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: .)sourcer[   r;   AssertionErrorru   r=   append)rH   r]   r   mutation_type_clss       r0   
_track_objzSideEffects._track_obj$  s     ***d8t*** * ) *2(9 :88<8K8KBtH8U8\8\7]]^	`  "3!4(0BtH%d#r2   c                 2    | j                  ||t              S )N)r   )r   r   )rH   r]   r   s      r0   track_object_existingz!SideEffects.track_object_existing=  s#    
 7  
 	
r2   
cls_sourceuser_clsvariable_clsc                    |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)recordru   )torchautogradfunctionFunctionCtxwarningscatch_warningsFunctionr   r   r;   r[   r=   r   )rH   r   r   r   optionsobjr   s          r0   track_object_newzSideEffects.track_object_newH  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|}nt        |d      rt        |d      r ||      s|}nt        |t        j                  j                        rt        j                   }nt        |t"        t$        j&                  f      rt        j(                  }nt        |t*              rt        j,                  }ntt        |t.              rt        j0                  }nSt        |t2              rt        j4                  }n2t7        |      rt8        }n t        |t:              rt        j<                  }t        |t        j                        sJ |S )	Nr   )TorchFunctionModer   )GenericContextWrappingVariable)TorchFunctionModeVariable)is_forbidden_context_manager	__enter____exit__)torch.overridesr   variables.ctx_managerr   variables.torch_functionr   variables.user_definedr   r   r   
issubclass is_supported_torch_function_modehasattrr   nnModuleUnspecializedNNModuleVariablerX   collectionsOrderedDictUserDefinedDictVariabletupleUserDefinedTupleVariabler4   UserDefinedListVariabler   MutableMappingVariabler   r!   r   "UserDefinedExceptionObjectVariable)rH   r   r   r   r   r   r   s          r0   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%($==L$'$<<L.1$;;L *2L-0$GGL,	(K(KLLLr2   c                    |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 )rx   r   r   r   r   r   rN   r   BuiltinVariablefnUserDefinedClassVariableRuntimeErroris_supported_new_method__new__)rH   base_cls_vtcls_vt	init_argsr   r   base_clss          r0   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
r2   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   ru   )	r   rx   r   r   r   r;   r[   r=   r   )	rH   r   r   r   r   r   r   r   r   s	            r0   track_new_user_defined_objectz)SideEffects.track_new_user_defined_object  s     ]]
<<,,X6$$[&)D}}#.z:
 (0BsG$c"r2   c                     t               }t        j                  t                     }|| j                  t        |      <   | j                  j                  |       |S )Nru   )r   r   r   r   r;   r[   r=   r   )rH   r   r   s      r0   track_cell_newzSideEffects.track_cell_new  sN     h)).0
 (0BsG$c"r2   r   cellcontentsc                     t        j                  |d n	t               ||      }|| j                  t	        |      <   | j
                  j                  |       |S )N)ru   r   r   )r   r   r   r;   r[   r=   r   )rH   r   r   r   r   s        r0   track_cell_existingzSideEffects.track_cell_existing  sV     )) #).$6O6Q"*
 )1BtH%d#r2   c                     t        j                  t               |      }|| j                  t	        |      <   | j
                  j                  |       |S )N)ru   r   )r   NewGlobalVariabler   r;   r[   r=   r   )rH   r   r]   r   s       r0   track_global_existingz!SideEffects.track_global_existing  sH    ..35
 )1BtH%d#r2   c                 v    t        |t        j                        sJ | j                  j	                  ||f       y r$   )rN   r   rl   rD   r   )rH   ctxargss      r0   track_save_for_backwardz#SideEffects.track_save_for_backward  s0    #yHHIII%%sDk2r2   c                     |j                   D ]X  }t        |      }|j                  |   }|| j                  vs,t        |t        j
                        sG| j                  ||       Z y r$   )r=   r[   r;   rN   r   TensorVariabler   )rH   rK   
other_itemother_idother_variables        r0   1track_tensor_variables_from_runahead_side_effectsz=SideEffects.track_tensor_variables_from_runahead_side_effects  sd      // 	GJ*~H"11(;Nt222z	 8 88 **:~F	Gr2   c                    	 t               	t               dt        f 	fddt        ffd} j                  j                         D cg c]  }t	        |j
                  t              s|  }}t        j                  |j                  |j                  ||j                  j                   j                  f        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 )Nvarc                     | v ry j                  |        t        | j                  t              rj                  |        | j                  v r$t        j                  j                  |           y y r$   )addrN   ru   r   r<   r    visit)r   live_new_objectsrH   r  visiteds    r0   r  z0SideEffects.prune_dead_object_new.<locals>.visit  sl    g~KK#++-AB $$S) d///%%--c2 0r2   c                 B    t        | j                  t              r| v S yNT)rN   ru   r   )r   r  s    r0   is_livez2SideEffects.prune_dead_object_new.<locals>.is_live  s#    #++-AB...r2   )setr    r;   valuesrN   ru   r   r  stacksymbolic_localsrc   backward_staterE   r(   r<   )
rH   txr  r   pre_existing_varsr.   r/   r  r  r  s
   `      @@@r0   prune_dead_object_newz!SideEffects.prune_dead_object_new  s5   (+14	 	 	 	 	 **113
c//1EF 
 
 	 ""!		((!!
	
  "00668
QGAJAqD
 "66<<>%
Q'!*AqD%
!E
>
%
s   #D< E1EE-Ec                    | j                  |       t        |j                  t              rd|j                  _        |j
                  r>t        |t        j                        r#t        |t        j                        sd| _	        y y y y r  )
rv   rN   ru   r   r   r   r   ConstDictVariableSetVariablerF   rH   r   s     r0   mutationzSideEffects.mutation1  sm    &&s+c'')>?,0C)JJ3	 ; ;<sI$9$9:/3D, ; = r2   c                     | j                   S r$   )rF   rH   s    r0   has_existing_dict_mutationz&SideEffects.has_existing_dict_mutation<  s    ///r2   c                     | j                   j                         D cg c]  }| j                  |      s| c}S c c}w r$   )r;   r  r   r  s     r0   _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              rt        t        j
                        rj                  ^j                  fd       j                  t        dd             j                         t        j                           _        j                  t        j                        _        t        j                  t              rt        t        j                        rt!        dddg        t        t        j"                        rfd}j                  |       nj                  fd	        j                  j$                         j&                  D ]
  } |        j                  t        d
t)        j&                        z   d             j                         t        j                           _        j                  J  | j*                  D ]g  \  }} |j                         j-                  d       |D ]
  } |        j                  g t/        t)        |            t1        d             i y )Nc                  D     j                  t        j                  d      S )N	make_cellload_import_fromr
   __name__r  s   r0   <lambda>z3SideEffects.codegen_save_tempvars.<locals>.<lambda>O       3 3ENNK P r2   r   Fz<AutogradFunctionContextVariable escaped Dynamo-traced regionrm   zAWe cannot reconstruct a torch.autograd.Function's context object.ro   c                      j                   J   j                           j                   j                  d      g       y )Nr   )r   extend_outputcreate_load_attrr  r   s   r0   load_new_methodz:SideEffects.codegen_save_tempvars.<locals>.load_new_methodd  s;    ":::3??+(("*=*=i*H)IJr2   c                  D     j                  t        j                  d      S )Nr   r  r   s   r0   r!  z3SideEffects.codegen_save_tempvars.<locals>.<lambda>l  s     3 3ENNL Q r2   r   rD   POP_TOP)r  rN   ru   r   r   r   
local_nameadd_push_nullr$  r   	add_cacher   tempvarsr   r   rl   r   r   r   r   lenrD   load_methodr   r   )rH   r  r'  argr   r   r   s    `    @r0   codegen_save_tempvarsz!SideEffects.codegen_save_tempvarsB  s&    **, 7	.C#++-ABzY++H >>)$$P $$%9!U%CDLL%!,R[[-=!>CJZZ'!0!@CJC--/CDc9#L#LM$ ^ "$g 	 c9#F#FGK
 $$_5$$Q 3$$//0 == CsG   !5a#cmm:L6Le!TUS!(S)9:
 zz---o7	.r // 
	ICszzNNN./ 3'D	2&y1
	r2   c                    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   )rN   r   r   r    RemovableHandleVariable
is_mutabler   r   Tensorr.  rE   rQ   idx)rH   tensorhookhandlerw   r6  s         r0   register_hookzSideEffects.register_hook  s    &)":":;;;$	 9 9:::vy@@A!!#	
$ u||T***$##((*+T&&&1HC T&&&"($!=#::~
r2   c                     | j                   |= y r$   )rE   )rH   r6  s     r0   remove_hookzSideEffects.remove_hook  s    c"r2   c                    | j                   j                         D ]f  \  }}j                  sJ d       fd}j                  |        |       j	                  t        dd             j                  |       h y )Nz4Hooks on non input tensors NYI - should not get herec                  X              j                   j                        g       y r$   )r$  r%  )r  rw   r7  s   r0   gen_fnz)SideEffects.codegen_hooks.<locals>.gen_fn  s&    6
  ""5"5d";!<=r2   r   F)rE   r  r   r+  r$  r   r,  )rH   r  r8  r9  r?  rw   r7  s    `   @@r0   codegen_hookszSideEffects.codegen_hooks  s     %%'3	! 
F ==X"XX=> V$tH1!U;< LL g3	!r2   c                     ddl m} | j                  !t        j                  g  |             | _        | j                  S )Nr   )r   r   )variables.baser   rG   r   ListVariable)rH   r   s     r0   get_ca_final_callbacks_varz&SideEffects.get_ca_final_callbacks_var  s;    4&&.*3*@*@"2"4+D' ***r2   c           	         g }| j                         D 
]R  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 ]1  \  }}	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                         rj                  d"d#       j                  d$        j                          t        j                  |              |	       |j                  g t!        d%      t        d             ։jT                  jV                  jy                  |        |	        j                         |j                  t        d&|      g       4 	9t        t        j                        rdt        j^                        D ]J  }
j-                  fd'        j                         j/                  dd       j                          L 	t        t        j                        rpfd(}j-                  |        j                  j                  j                                      |j                  g t        dd      t        d             
At        t[                     tq        |      D ]  }j                  |        y # td        $ r6 t[        j                        j\                  j_                  tf              }Y w xY w))NF)allow_cacheBUILD_SLICE   )r0  STORE_SUBSCRz1Side effect on existing deque with limited maxlenrm   rn   z*Don't use a deque with `maxlen` specified.ro   r5   r   r)  r'   r   updatec                  D     j                  t        j                  d      S )Nget_torch_function_mode_stackr  r   s   r0   r!  z4SideEffects.codegen_update_mutated.<locals>.<lambda>8      B//(G r2   co_varnames
STORE_FAST)argvalc                  D     j                  t        j                  d      S )Nset_torch_function_mode_stackr  r   s   r0   r!  z4SideEffects.codegen_update_mutated.<locals>.<lambda>A  rM  r2   
BUILD_LIST
LOAD_CONSTr,   r+   r*   )varname_mapr7   r6   STORE_GLOBALrx   DELETE_ATTRbuiltinsr   __setattr__   
STORE_ATTRc                  D     j                  t        j                  d      S )N	iter_nextr  r   s   r0   r!  z4SideEffects.codegen_update_mutated.<locals>.<lambda>  r"  r2   c                  L      j                           j                  d       y )Nsetstate)r   r   r&  s   r0   r?  z2SideEffects.codegen_update_mutated.<locals>.gen_fn  s    szzNLL,r2   )Or  rN   r   rC  r   r$  create_load_constr   r   listsDequeVariablemaxlenConstantVariablerx   r   r/  r   r  has_new_itemsshould_reconstruct_alltorch_functionTorchFunctionModeStackVariabler+  call_functionget_prev_stack_var_namecode_optionsappend_outputforeachsymbolic_stackr.  r   r*  r<   r   create_store_derefrz   r   r   _dict_vtr1   __code__rN  r  rc   new_varr%   r&   indexr   r   
ValueErrorrX   r   r   _list_vtr8   reversedr   r(   r   update_co_namesr   r}   ru   r   r   getattrr   needs_slow_setattrr  ListIteratorVariablerangepop_topRandomVariable
wrap_staterandomgetstater   r   )rH   r  suffixesrw   contents_varrU  r,   dict_update_instslist_update_instsrx   _r?  suffixr   s    `           @r0   codegen_update_mutatedz"SideEffects.codegen_update_mutated  s	   **, `	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$ $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 #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XI$YJ C!?!?@syy) !A$$P szzN$$Q.JJL! C!9!9:-   (3>>#**"5"5"789-a7*95 %T#Y//A	`	0F	 x( 	%FV$	%} & H$(O$;$;$A$A$$G	Hs   <j;kkc                     t        t        | j                  | j                  j	                                     xs( | j
                  xs | j                  xs | j
                   S r$   )anymapr   r;   r  rE   rD   r  s    r0   is_emptyzSideEffects.is_empty  s\    D$$d&9&9&@&@&BCD !  !%%!   	
 	
r2   c                 l    | j                   j                          | j                  j                          y r$   )r=   r'   r;   r  s    r0   r'   zSideEffects.clear  s$    !!#r2   )NNNNN)FF)@r  
__module____qualname____doc__rX   r   r    __annotations__r   r4   r   r@   r   r   rO   r   rV   rY   r^   r`   rh   rj   rv   r{   r   r   r   r   r   staticmethodr   rz   r   r   r   r   r   track_mutabler   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r1  r:  r<  r@  rD  r  r  r'   __classcell__)rJ   s   @r0   r:   r:   9   s   & o-..S/5I0JJKKCy
 !+.
F 
t 
- HSM ,
/-

46 6c 6/ 6
9
* *s *+ + +O +
 
 
A

>
.* 0	 ". M	
	
 "	
  	*#J><	v&.6BQF # 3
G>
@	40VF	 FP #4!l+f% f%P	
$r2   r:   c              #   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  )rc   rd   re   rf   r  orig_vals     r0   rf   rf     ss     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  )rc   rd   rj   r  s     r0   "disallow_side_effects_in_generatorr    sZ     yy''CCHH?C		  <?G		  <x		  <s   !A?A A?A<<A?)r  r"   )7r   
contextlibr   r   rA   collections.abcr   typesr   typingr   r   r   torch.nnr   rm   r	   r
   r   bytecode_transformationr   r   r   r   codegenr   excr   r   r   r   r   r   r   r   r   r   rB  r   r   r   r   r   r   r    r   r!   torch._dynamo.symbolic_convertr"   r1   r8   r:   contextmanagerrf   r  r   r2   r0   <module>r     s         *  / /  1 1   3 F F A A   < D.$
U$ U$p P P H Hr2   