
    ɯwgr                     N   d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlZddl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 dd	l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% ddl&m'Z'  G d de#      Z( G d de#      Z) G d de)      Z* G d de)      Z+d Z, G d d      Z-y)    N)MutableMapping)AnyDictListOptionalTypeUnion   )utils	variables)bytecode_from_templatecreate_call_functioncreate_call_methodcreate_instruction)	PyCodegen)unimplemented)GlobalSourceLocalSourceSource)is_frozen_dataclassnn_module_new
object_new)is_side_effect_safeMutableLocalBaseMutableLocalSourceVariableTracker)FrozenDataClassVariablec                   .     e Zd ZdZddedef fdZ xZS )MutableSideEffectsz
    VariableTracker.mutable_local marker to indicate a list passed as
    an input that if we mutate we need to re-apply those mutations after
    the graph runs.
    sourceis_modifiedc                 \    t         |   t        j                         || _        || _        y N)super__init__r   Existingr    r!   )selfr    r!   	__class__s      _/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/torch/_dynamo/side_effects.pyr%   zMutableSideEffects.__init__%   s&    +445&    F)__name__
__module____qualname____doc__r   boolr%   __classcell__r(   s   @r)   r   r      s     'v 'D ' 'r*   r   c                   2     e Zd ZdZdedee   f fdZ xZS )AttributeMutationzM
    VariableTracker.mutable_local marker to track changes to attributes
    typr    c                 2    t         |   |       || _        y r#   )r$   r%   r    )r'   r5   r    r(   s      r)   r%   zAttributeMutation.__init__0   s    r*   )	r,   r-   r.   r/   r   r   r   r%   r1   r2   s   @r)   r4   r4   +   s&    . 8H  r*   r4   c                   $     e Zd Zdef fdZ xZS )AttributeMutationExistingr    c                 P    t         |   t        j                  |       || _        y r#   )r$   r%   r   r&   r    )r'   r    r(   s     r)   r%   z"AttributeMutationExisting.__init__6   s     +44f=r*   )r,   r-   r.   r   r%   r1   r2   s   @r)   r8   r8   5   s    v  r*   r8   c                   4     e Zd Zdee   dee   f fdZ xZS )AttributeMutationNewr    
cls_sourcec                 P    t         |   t        j                  |       || _        y r#   )r$   r%   r   Localr<   )r'   r    r<   r(   s      r)   r%   zAttributeMutationNew.__init__<   s     +116:$r*   )r,   r-   r.   r   r   r%   r1   r2   s   @r)   r;   r;   ;   s%    %x/ %Xf=M % %r*   r;   c                 >    | j                         D ]
  \  }}|||<    y r#   )items)	dict_fromdict_tokvs       r)   _manual_update_dictrE   A   s%    ! 1
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<   	 	 	 	 	 d7 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ede	defdZd8d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'	 	 d9d$Z(d% Z)d&e&defd'Z*d&e&defd(Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d.e1fd/Z2d0 Z3d1 Z4d2 Z5d3 Z6d.e1fd4Z7d5 Z8d6 Z9 xZ:S ):SideEffectszp
    Track side effects (list mutation, setattr, etc) that need to be
    applied after an FX graph is run.
    id_to_variablestore_attr_mutations	keepalivec                     t         |           |xs i | _        |xs i | _        |xs g | _        |xs g | _        |xs i | _        d | _        y r#   )r$   r%   rH   rI   rJ   save_for_backwardtensor_hooksca_final_callbacks_var)r'   rH   rI   rJ   rL   rM   r(   s         r)   r%   zSideEffects.__init__P   sY     	,2$8$>B!"b!2!8b(.B '+#r*   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#   )
isinstancerG   rH   rI   rL   rM   )r'   rO   s     r)   __eq__zSideEffects.__eq__b   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   )rH   keysrI   rL   rM   )r'   rO   sk_itvok_itvsk_samok_sams         r)   diffzSideEffects.diffl   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                    | j                  t        | j                        | j                  j	                         D ci c]  \  }}|t        |       c}}t        | j                        | j                  | j                        S c c}}w )zCreate a shallow copy)rH   rI   rJ   rL   rM   )	r(   dictrH   rI   r@   listrJ   rL   rM   )r'   rC   rD   s      r)   clonezSideEffects.clone   sy    ~~ 3 34'+'@'@'F'F'H"#q!47
" 4>>*"44**  
 	
"s   Bc                 0    t        |      | j                  v S r#   )idrH   r'   items     r)   __contains__zSideEffects.__contains__   s    $x4....r*   c                 2    | j                   t        |         S r#   )rH   r`   ra   s     r)   __getitem__zSideEffects.__getitem__   s    ""2d8,,r*   c                 l    ddl m} t        ||      ryt        |j                        st        d       y y )Nr   )AutogradFunctionContextVariableTzOHigherOrderOperator: Mutating a variable not in the current scope (SideEffects))torch._dynamo.variables.miscrg   rR   r   mutable_localr   )r'   rb   rg   s      r)   check_allowed_side_effectz%SideEffects.check_allowed_side_effect   s3    P d;<"4#5#56a 7r*   rb   namevaluec                     | j                  |      sJ | j                  |       |j                  | j                  vri | j                  |j                  <   || j                  |j                     |<   y r#   )is_attribute_mutationrj   ri   rI   )r'   rb   rk   rl   s       r)   
store_attrzSideEffects.store_attr   si    ))$///&&t,T%>%>><>D%%d&8&89>C!!$"4"45d;r*   c                     | j                  |      sJ | j                  |j                     |   }|s%t        |t        j
                        rt        d       |S )Nzread deleted attribute)rn   rI   ri   rR   r   DeletedVariabler   )r'   rb   rk   
deleted_okresults        r)   	load_attrzSideEffects.load_attr   sQ    ))$///**4+=+=>tDj1J1JK23r*   c                     t        |t        j                        sJ t        |t        j                        sJ | j	                  |d|       y Ncell_contents)rR   r   NewCellVariabler   ro   )r'   cellvarrl   s      r)   
store_cellzSideEffects.store_cell   s>    '9#<#<===%!:!:;;;%8r*   c                 ^    t        |t        j                        sJ | j                  |d      S rv   )rR   r   rx   rt   )r'   ry   s     r)   	load_cellzSideEffects.load_cell   s)    '9#<#<===~~g77r*   gvarc                 ^    t        |t        j                        sJ | j                  ||      S r#   )rR   r   r   rt   )r'   r}   rk   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 r#   )rR   r   r   ro   )r'   r}   rk   rl   s       r)   store_globalzSideEffects.store_global   s>    $	 9 9:::%!:!:;;;dE*r*   c                 P    t        j                  | dd       t        j                  u S )N__getattribute__)inspectgetattr_staticobjectr   )clss    r)   "cls_supports_mutation_side_effectsz.SideEffects.cls_supports_mutation_side_effects   s*     ""3(:DA&&'	
r*   c                 6    t        |j                  t              S r#   )rR   ri   r4   ra   s     r)   rn   z!SideEffects.is_attribute_mutation   s    $,,.?@@r*   c                     | j                  |      xr. t        | j                  j                  |j                              S r#   )rn   r0   rI   getri   ra   s     r)   has_pending_mutationz SideEffects.has_pending_mutation   s;    ))$/ 
D%%))$*<*<=5
 	
r*   c                 x    | j                  |      xr( || j                  j                  |j                  d      v S )N )rn   rI   r   ri   )r'   rb   rk   s      r)   has_pending_mutation_of_attrz(SideEffects.has_pending_mutation_of_attr   s@    ))
 Ld//33D4F4FKK	Lr*   c                     t        |j                  t              ry| j                  |      r|j                  | j                  v S |j                  j
                  S NT)rR   ri   r;   rn   rI   r!   ra   s     r)   r!   zSideEffects.is_modified   sM    d((*>?%%d+%%)B)BBB!!---r*   variablec           
      `   |j                   J t        |      | j                  v r>t        | d|j                    d| j                  t        |         j                    d       ||j                         |_        || 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: .)r    r`   rH   AssertionErrorri   rJ   append)r'   rb   r   mutable_clss       r)   
_track_objzSideEffects._track_obj   s     ***d8t*** * ) *2(9 :88<8K8KBtH8U8\8\7]]^	`  "-X__!=(0BtH%d#r*   c                 2    | j                  ||t              S )N)r   )r   r8   )r'   rb   r   s      r)   track_object_existingz!SideEffects.track_object_existing   s    
 tX;TUUr*   r<   user_clsvariable_clsc                    |t         j                  j                  j                  u r>t	        j
                  d      5  t         j                  j                         }d d d        n;t        |t         j                  j                        rt        |      }nt        |      } |fdt        d |      i|}|| j                  t        |      <   | j                  j!                  |       |S # 1 sw Y   SxY w)NT)recordri   )torchautogradfunctionFunctionCtxwarningscatch_warningsFunction
issubclassnnModuler   r   r;   rH   r`   rJ   r   )r'   r<   r   r   optionsobjr   s          r)   track_object_newzSideEffects.track_object_new   s     u~~..:::((5 0nn--/0 0%((//2)CX&C
.tZ@
 

 (0BsG$c"0 0s   C**C3c                    |j                   }|j                  }t        j                  }t	        |t
        j                  j                        rt        j                  }nCt	        |t              rt        j                  }n"t        |      rt        }nt        j                  }t	        |t        j                        sJ t        j                  ||      }| j                  |||i       S )N)r<   )r    rl   r   UserDefinedObjectVariabler   r   r   r   UnspecializedNNModuleVariabler   MutableMappingVariabler   r   	functoolspartialr   )r'   cls_variabler<   r   r   s        r)   (track_object_new_from_user_defined_classz4SideEffects.track_object_new_from_user_defined_class  s     "((
%%
 // 	 h0$BBL.1$;;L *2L$>>L,	(K(KLLL ((*M$$Z<LLr*   c                     t               }t        j                  t        d d             }|| j                  t        |      <   | j                  j                  |       |S Nri   )r   r   rx   r;   rH   r`   rJ   r   )r'   r   r   s      r)   track_cell_newzSideEffects.track_cell_new,  sR     h,,.tT:
 (0BsG$c"r*   r    c                     t        j                  t        |            }|| j                  t	        |      <   | j
                  j                  |       |S r   )r   rx   r8   rH   r`   rJ   r   r'   r    rb   r   s       r)   track_cell_existingzSideEffects.track_cell_existing7  sG    ,,3F;
 )1BtH%d#r*   c                     t        j                  t        |            }|| j                  t	        |      <   | j
                  j                  |       |S r   )r   NewGlobalVariabler8   rH   r`   rJ   r   r   s       r)   track_global_existingz!SideEffects.track_global_existing?  sG    ..3F;
 )1BtH%d#r*   c                 v    t        |t        j                        sJ | j                  j	                  ||f       y r#   )rR   r   rg   rL   r   )r'   ctxargss      r)   track_save_for_backwardz#SideEffects.track_save_for_backwardG  s0    #yHHIII%%sDk2r*   c                     |j                   D ]X  }t        |      }|j                  |   }|| j                  vs,t        |t        j
                        sG| j                  ||       Z y r#   )rJ   r`   rH   rR   r   TensorVariabler   )r'   rO   
other_itemother_idother_variables        r)   1track_tensor_variables_from_runahead_side_effectsz=SideEffects.track_tensor_variables_from_runahead_side_effectsK  sd      // 	GJ*~H"11(;Nt222z	 8 88 **:~F	Gr*   c                 x   	 t               t        i       	dt        f 	fddt        t        t        f   ffd j                  j                         D cg c]  }t        |j                  t              s|  }}t        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                    | j                   }|y |v ry j                  |       t        |t              rj                  |       | j                   j                  v r.t        j                  j                  | j                             y y r#   )ri   addrR   r;   rI   r   visit)r   ri   live_new_objectsr'   r   visiteds     r)   r   z0SideEffects.prune_dead_object_new.<locals>.visit^  s    --M$'KK&-)=> $$]3   D$=$==%%444S5F5FG >r*   c                 r    t        | t              r| v S t        | t              r | j                        S yr   )rR   r;   r   ri   )r   is_liver   s    r)   r   z2SideEffects.prune_dead_object_new.<locals>.is_livep  s8    #34...#/s0011r*   )setr   r	   r   rH   valuesrR   ri   r;   r   stacksymbolic_localsr@   rI   )
r'   txr   pre_existing_varsrC   rD   r   r   r   r   s
   `     @@@@r)   prune_dead_object_newz!SideEffects.prune_dead_object_newW  s   5 2w	 	 	$	/@A 	 **113
c//1EF 
 
 	ebhh0B0BDU%VW "00668
QGAJAqD
 "66<<>%
Q'!*AqD%
!)
"
%
s    #D+D0 D0D6D6c                     | j                  |       t        |j                  t              r&t        |j                  j                  d      |_        y y r   )rj   rR   ri   r   r    r'   r   s     r)   mutationzSideEffects.mutation  sA    &&s+c'');< 233D3D3K3KT RC =r*   c                     | j                   j                         D cg c]  }| j                  |      s| c}S c c}w r#   )rH   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        t        f      rt        |t
        j                        rj                  fd       j                  t        dd             j                  |       t        |j                  t              st        j                  |         |j                  _        t        |j                  t              rt        |t
        j                        rt        d       j                  fd        |j                  j                          j                  t        dd             j                  |       t        j                  |         |j                  _        |j                  v sj                  j#                  |      J  |j                  j                         j                  |        | j$                  D ]g  \  }} |j                         j'                  d       |D ]
  } |        j                  g t)        t+        |            t-        d             i y )	Nc                  D     j                  t        j                  d      S )N	make_cellload_import_fromr   r,   r   s   r)   <lambda>z3SideEffects.codegen_save_tempvars.<locals>.<lambda>  s    B//L r*   r   Fz'AutogradFunctionContextVariable escapedc                  D     j                  t        j                  d      S )Nr   r   r   s   r)   r   z3SideEffects.codegen_save_tempvars.<locals>.<lambda>  s    B//M r*   r
   rL   POP_TOP)r   rR   ri   r8   r;   r   rx   add_push_nullextend_outputr   	add_cacher   tempvarsr    rg   r   r<   r   rL   load_methodr   lenr   )r'   r   r   r   r   args    `    r)   codegen_save_tempvarsz!SideEffects.codegen_save_tempvars  s   **, 	"C!!$=?S#TS)";";<  L   !5a!?@S!c//1EF/:2;;s;K/LC%%,C--/CDc9#L#LM!"KL  M 3$$//0  !5a!?@S!+6r{{37G+H!!(#{{s+3333$$++,S!3	"6 // 
	ICszzNNN./ 3'D	2&y1
	r*   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
   )rR   r   r   r   RemovableHandleVariableri   hasattrr   Tensorr   rM   rU   idx)r'   tensorhookhandlerk   r   s         r)   register_hookzSideEffects.register_hook  s    &)":":;;;$	 9 9:::vy@@A$$	
% u||T***$##((*+T&&&1HC T&&&"($!=#::~
r*   c                     | j                   |= y r#   )rM   )r'   r   s     r)   remove_hookzSideEffects.remove_hook  s    c"r*   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   create_load_attr)r   rk   r   s   r)   gen_fnz)SideEffects.codegen_hooks.<locals>.gen_fn  s&    6
  ""5"5d";!<=r*   r
   F)rM   r   r    r   r   r   r   )r'   r   r   r   r   rk   r   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
   )MutableLocalr   )variables.baser   rN   r   ListVariable)r'   r   s     r)   get_ca_final_callbacks_varz&SideEffects.get_ca_final_callbacks_var  s9    0&&.*3*@*@,.+D' ***r*   c           	        
 g }| j                         D ]  
t        
t        j                        r 
d        
j                  j
                         j                  j                  d       j                  d       t        dd      g       |j                  t        d      g       t        
t        j                        r"i }t        j                  j                  D ])  }j                  j                  j!                         ||<   +  
j                  j
                         j                  t        d|d   	      g        
d       j                  t        d|d
   	      g        
j                  j
                         j#                  d       t%        t        |      }|j                  g t'        d      t        d      |t        d             t        
t        j(                        r 
j                  j
                         j#                  d        
d        
j                  j
                         j#                  d       |j                  g t'        d      t        d      t'        d      t        d             t        
t        j*                  j,                        rj/                  fd       j1                  
j2                         j5                  t        dt7        
j2                                     j9                  dd       j5                  t        d             G| j;                  
      rt=        | j>                  jA                  
j                  i       jC                               D ]Y  \  }}t        
t        jD                        rqj                  j                  jG                  |        |       t        
j                  j
                  tH              sJ |j                  t        d|	      g       t        |t        jJ                        rt        
j                  tL              stO        tQ        
dd       |      s߉j                  j                  jG                  |        
j                  j
                         |j                  t        d|	      g       ?t        
t        jR                        r
jU                         rjW                  dd       j#                  d        
j                  j
                          t        jX                  |              |       |j                  g t'        d      t        d             j                  j                  jG                  |        |        
j                  j
                         |j                  t        d|	      g       \ t        
t        jZ                        rnt]        
j^                        D ]T  }j/                  fd        
j                  j
                         j9                  dd       ja                          V }t        
t        jb                        rp
fd}j/                  |        
je                  
jf                  ji                                      |j                  g tk        dd      t        d             tm        to        
             t=        |      D ]  }	j                  |	        y )NF)allow_cacheBUILD_SLICE   )r   STORE_SUBSCR
STORE_FASTrB   )argvalrA   clear)varname_mapr   r   updater
   c                  D     j                  t        j                  d      S )Nset_torch_function_mode_stackr   r   s   r)   r   z4SideEffects.codegen_update_mutated.<locals>.<lambda>U  s    B//(G r*   
BUILD_LISTSTORE_GLOBALrl   DELETE_ATTRbuiltinsr   __setattr__   
STORE_ATTRc                  D     j                  t        j                  d      S )N	iter_nextr   r   s   r)   r   z4SideEffects.codegen_update_mutated.<locals>.<lambda>  s     3 3ENNK P r*   c                  `      j                   j                          j                  d       y )Nsetstate)ri   r    rt   )r   r   s   r)   r   z2SideEffects.codegen_update_mutated.<locals>.gen_fn  s#    s((//0LL,r*   )8r   rR   r   r  ri   r    r   create_load_constr   r   CustomizedDictVariablerE   __code__co_varnamesr   outputnew_varr   r   r   ConstDictVariabletorch_functionTorchFunctionModeStackVariabler   foreachsymbolic_stackappend_outputr   call_functionrn   reversedrI   r   r@   r   update_co_namesr   rq   r8   r   getattrr   needs_slow_setattrr   ConstantVariableTupleIteratorVariablerangeindexpop_topRandomVariable
wrap_staterandomgetstater   r   type)r'   r   suffixesr  rk   dict_update_instsrl   _r   suffixr   s    `        @r)   codegen_update_mutatedz"SideEffects.codegen_update_mutated  s   **, Z	0C#y5563E*3$$++,  ,,T2,,T2*=a@ !3N!C DEC!A!AB /88DD ?D(*(<(<(>K%? 3$$++,  '[=STU 3E*  '[=UVW 3$$++,w' %;'[%! +A.*95 + +95	 C!<!<=3$$++,x(3E*3$$++,w'+A.*95 ,A. +95	 Y--LL   
 

3--.  &|S=O=O9PQ   E*  !3I!>?++C0" $,--11#2C2CRHNNP$ $YKD% "#y'B'BC44T:5	)#*;*;*B*BLQQQ /tLM $E9+D+DE%--/H%gc7D&A4HEELL88>s00778$OO!3M$!O P #3	(K(KL224 ++JA}53,,334955d;<5	 S03S5G	5RS 44T:5	3,,334 );LQU)V(WXI$YJ C!@!@Asyy) !A$$P s((//0$$Q.JJL! C!9!9:-   (3>>#**"5"5"789-a7*95 %T#Y//uZ	0z x( 	%FV$	%r*   c                     t        t        | j                  | j                  j	                                     xs( | j
                  xs | j                  xs | j
                   S r#   )anymapr!   rH   r   rM   rL   r'   s    r)   is_emptyzSideEffects.is_empty  s\    D$$d&9&9&@&@&BCD !  !%%!   	
 	
r*   c                 l    | j                   j                          | j                  j                          y r#   )rJ   r  rH   r>  s    r)   r  zSideEffects.clear  s$    !!#r*   )NNNNNr+   )r   z"variables.UserDefinedClassVariable);r,   r-   r.   r/   r   intr   __annotations__r   strr   r   r%   r   r0   rS   r   rZ   r^   rc   re   rj   ro   rt   rz   r|   r   r   staticmethodr   rn   r   r   r!   r   r   track_mutabler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r:  r?  r  r1   r2   s   @r)   rG   rG   F   s   
 o-../c?6J1KKLLCy !+$
F 
t 
- HSM ,

/-
D Dc D/ D9
8* *s *+ + +O +
 
 
A

L
. '	 ". MVV "V  	.M:M4	&  F # 3
G6
pS
V&	 &P #4!l+`% `%D
$r*   rG   ).r   r   r   collections.abcr   typingr   r   r   r   r   r	   torch.nnr    r   r   bytecode_transformationr   r   r   r   codegenr   excr   r    r   r   r   r   r   r   r  r   r   r   r   variables.user_definedr   r   r4   r8   r;   rE   rG   r   r*   r)   <module>rN     s       * 9 9      5 5 A A  <
') 
'(  1 %, %
w	$ w	$r*   