
    PhW                        d dl Z d dl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 ddlmZ ddlmZ ddlmZmZ dd	l
mZmZ dd
lmZmZmZmZ  G d de      Z G d de      Z G d de      Z  G d de      Z! G d d      Z"y)    N)AnyDictListOptionalUnion   )utils	variables)create_call_functioncreate_call_methodcreate_instruction)	PyCodegen)unimplemented)LocalSourceSource)nn_module_new
object_new)is_side_effect_safeMutableLocalBaseMutableLocalSourceVariableTrackerc                   .     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      eC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\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!   r/   r   r"   s      r#   r   zAttributeMutation.__init__*   s    r$   )	r&   r'   r(   r)   r   r   r   r   r+   r,   s   @r#   r.   r.   %   s&    . 8H  r$   r.   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__0   s     +44f=r$   )r&   r'   r(   r   r   r+   r,   s   @r#   r2   r2   /   s    v  r$   r2   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   Localr6   )r!   r   r6   r"   s      r#   r   zAttributeMutationNew.__init__6   s     +116:$r$   )r&   r'   r(   r   r   r   r+   r,   s   @r#   r5   r5   5   s%    %x/ %Xf=M % %r$   r5   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<   	 	 	 	 	 d6 fd	Zdedefd	Zdd dee	   fd
Zd Zdd fdZd Zd Zd Zdede	defdZd7d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!e"fde#ded efd!Z$e$Z%e$Z&de#ded efd"Z'd#e#d$ed%efd&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.e0fd/Z1d0 Z2d1 Z3d2 Z4d.e0fd3Z5d4 Z6d5 Z7 xZ8S )8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	keepaliveNc                     t         |           |xs i | _        |xs i | _        |xs g | _        |xs g | _        |xs i | _        y r   )r   r   r;   r<   r=   save_for_backwardtensor_hooks)r!   r;   r<   r=   r?   r@   r"   s         r#   r   zSideEffects.__init__E   sO     	,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   )
isinstancer:   r;   r<   r?   r@   )r!   rA   s     r#   __eq__zSideEffects.__eq__T   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y )Nzid_to_variable keys: z != zid_to_variable: unknown diffzstore_attr_mutations keys: z"store_attr_mutations: unknown diffr?   )r;   keysr<   r?   )r!   rA   sk_itvok_itvsk_samok_sams         r#   diffzSideEffects.diff^   s    %"6"66((--/F))..0F.vhd6(CC 2&&%*D*DD..335F//446F4VHDII7##u'>'>>&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)r;   r<   r=   r?   r@   )	r"   dictr;   r<   itemslistr=   r?   r@   )r!   kvs      r#   clonezSideEffects.cloner   s~    ~~ 3 34'+'@'@'F'F'H"'Htq!47
'H" 4>>*"44**  
 	
"s   Bc                      y)NF )_s    r#   <lambda>zSideEffects.<lambda>~   s    er$   c                    |
t               }| j                  j                         D ci c]  \  }}|t        j                  ||||        c}}| _        | j
                  j                         D ci c]  \  }}|t        j                  ||||        c}}| _        t        j                  || j                  ||      | _        t        j                  || j                  ||      | _        y c c}}w c c}}w r   )rN   r;   rO   r   applyr<   r?   r@   )r!   fncacheskip_fnrQ   rR   s         r#   rY   zSideEffects.apply~   s    =FE ++113
31 $$RE7;;3
 11779%
91 $$RE7;;9%
! "1!6!6&&w"
 ,11"d6G6GPWX
%
s   #C.3#C4c                 0    t        |      | j                  v S r   )idr;   r!   items     r#   __contains__zSideEffects.__contains__   s    $x4....r$   c                 2    | j                   t        |         S r   )r;   r^   r_   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.miscre   rD   r   mutable_localr   )r!   r`   re   s      r#   check_allowed_side_effectz%SideEffects.check_allowed_side_effect   s3    P d;<"4#5#56a 7r$   r`   namevaluec                     | j                  |      sJ | j                  |       |j                  | j                  vri | j                  |j                  <   || j                  |j                     |<   y r   )is_attribute_mutationrh   rg   r<   )r!   r`   ri   rj   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)rl   r<   rg   rD   r
   DeletedVariabler   )r!   r`   ri   
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)rD   r
   NewCellVariabler   rm   )r!   cellvarrj   s      r#   
store_cellzSideEffects.store_cell   s>    '9#<#<===%!:!:;;;%8r$   c                 ^    t        |t        j                        sJ | j                  |d      S rt   )rD   r
   rv   rr   )r!   rw   s     r#   	load_cellzSideEffects.load_cell   s)    '9#<#<===~~g77r$   gvarc                 ^    t        |t        j                        sJ | j                  ||      S r   )rD   r
   r   rr   )r!   r{   ri   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   )rD   r
   r   rm   )r!   r{   ri   rj   s       r#   store_globalzSideEffects.store_global   s>    $	 9 9:::%!:!:;;;dE*r$   c                     t        j                  | dd       t        j                  t        j
                  j                  j                  fv S )N__setattr__)inspectgetattr_staticobjectr   torchnnModule)clss    r#   "cls_supports_mutation_side_effectsz.SideEffects.cls_supports_mutation_side_effects   s>    %%c=$?HHOO''D
 
 	
r$   c                 6    t        |j                  t              S r   )rD   rg   r.   r_   s     r#   rl   z!SideEffects.is_attribute_mutation   s    $,,.?@@r$   c                     | j                  |      xr. t        | j                  j                  |j                              S r   )rl   r*   r<   getrg   r_   s     r#   has_pending_mutationz SideEffects.has_pending_mutation   s;    ))$/ 
D%%))$*<*<=5
 	
r$   c                     t        |j                  t              ry| j                  |      r|j                  | j                  v S |j                  j
                  S NT)rD   rg   r5   rl   r<   r   r_   s     r#   r   zSideEffects.is_modified   sM    d((*>?%%d+%%)B)BBB!!---r$   r   variablec                     |j                   ||      |      }|| j                  t        |      <   | j                  j	                  |       |S )z*Start tracking a new variable for mutation)rg   r   )rS   r;   r^   r=   append)r!   r   r`   r   mutable_clss        r#   
_track_objzSideEffects._track_obj   sF     >>F0CF>S(0BtH%d#r$   c                 4    | j                  |||t              S )N)r   )r   r2   r!   r   r`   r   s       r#   track_object_existingz!SideEffects.track_object_existing   s$     D(0I  
 	
r$   r6   user_clsvariable_clsc                    |t         j                  j                  j                  u rt         j                  j	                         }n;t        |t         j                  j                        rt        |      }nt        |      } ||fdt        d |      i|}|| j                  t        |      <   | j                  j                  |       |S )Nrg   )r   autogradfunctionFunctionCtxFunction
issubclassr   r   r   r   r5   r;   r^   r=   r   )r!   r6   r   r   optionsobjr   s          r#   track_object_newzSideEffects.track_object_new   s     u~~..:::..))+C%((//2)CX&C
.tZ@
 

 (0BsG$c"r$   c                     t               }t        j                  t        d d             }|| j                  t        |      <   | j                  j                  |       |S Nrg   )r   r
   rv   r5   r;   r^   r=   r   )r!   r   r   s      r#   track_cell_newzSideEffects.track_cell_new  sR     h,,.tT:
 (0BsG$c"r$   c                     t        j                  t        |            }|| j                  t	        |      <   | j
                  j                  |       |S r   )r
   rv   r2   r;   r^   r=   r   r   s       r#   track_cell_existingzSideEffects.track_cell_existing  sG    ,,3F;
 )1BtH%d#r$   c                     t        j                  t        |            }|| j                  t	        |      <   | j
                  j                  |       |S r   )r
   NewGlobalVariabler2   r;   r^   r=   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   )rD   r
   re   r?   r   )r!   ctxargss      r#   track_save_for_backwardz#SideEffects.track_save_for_backward"  s0    #yHHIII%%sDk2r$   c                   	 t               d 	dt        f	fd}dt        t        t        f   ffdt        j                  ||j
                  |j                  f       | j                  j                         D ]3  }t        |j                  t              rt        j                  ||       5 | j                  j                         D ]  \  	}t        j                  ||        | j                  j                         D ci c]  \  }} |      s|| c}}| _        | j                  j                         D ci c]  \  }} |      s|| c}}| _        y c c}}w c c}}w )Nvarc                     t        | j                  t              r)| j                  urj                  | j                         | S r   )rD   rg   r5   add)r   live_new_objectsskip_objs    r#   visitz0SideEffects.prune_dead_object_new.<locals>.visit*  s;    3,,.BC%%X5 $$S%6%67Jr$   c                 r    t        | t              r| v S t        | t              r | j                        S yr   )rD   r5   r   rg   )r   is_liver   s    r#   r   z2SideEffects.prune_dead_object_new.<locals>.is_live2  s8    #34...#/s0011r$   )setr   r   r   rY   stacksymbolic_localsr;   valuesrD   rg   r5   r<   rO   )
r!   txr   r   setattrsrQ   rR   r   r   r   s
          @@@r#   prune_dead_object_newz!SideEffects.prune_dead_object_new&  sA   5	 		/@A 	 	ebhh0B0B%CD&&--/Cc//1EF%%eS1 0 #'";";"A"A"CHh!!%2 #D "00668
8TQGAJAqD8
 "66<<>%
>TQ'!*AqD>%
!
%
s   E$E$E*E*c                     | j                  |       |j                  t        |j                  j                  d            S )NTr   )rh   rS   r   rg   r   )r!   oldvarnewvars      r#   mutationzSideEffects.mutationH  s<    &&v.||,V-A-A-H-H$O  
 	
r$   c                     | j                   j                         D cg c]  }| j                  |      s| c}S c c}w r   )r;   r   r   )r!   r   s     r#   _get_modified_varszSideEffects._get_modified_varsN  s9    #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                  t        j                  d       |j                  t        dd             |j                  |       t        |j                  t              st        |j                  |         |j                  _        t        |j                  t              rt        |t
        j                         rt#        d       d| j$                  j'                  |j                  i       v r=t        |t
        j(                        sJ |j                  t        j                  d       n |j                  t        j                  d        ||j                  j*                         |j                  t        dd             |j                  |       t        |j                  |         |j                  _        ||j                  v s|j                  j'                  |      J  ||j                  j                         |j                  |       _ | j,                  D ]s  \  }} ||j                         |j                  t/        d	d
      g       |D ]
  } ||        |j                  g t1        t3        |            t/        d             u y )N	make_cellr   Tz'AutogradFunctionContextVariable escaped__call_nn_module_initr   r   r   LOAD_METHODr?   argvalPOP_TOP)r   rD   rg   r2   r5   r
   rv   load_import_fromr	   r&   extend_outputr   	add_cacher   tempvarsr   re   r   r<   r   UnspecializedNNModuleVariabler6   r?   r   r   len)r!   r   r   r   r   args         r#   codegen_save_tempvarsz!SideEffects.codegen_save_tempvarsQ  sJ   **,C!!$=?S#TS)";";<##ENNK@  !5a!>?S!c//1EF/:2;;s;K/LC%%,C--/CDc9#L#LM!"KL*d.G.G.K.K%%r/  &c9+R+RSSS''H''E3$$//0  !5a!>?S!+6r{{37G+H!!(#{{s+3333$$++,S!7 -: //ICszzN#M:MNO 3 'D	2&y1 0r$   c                     t        | j                  j                               }||||f| j                  |<   |j                  rJ ||_        y r   )r   r@   rG   idx)r!   tensorhookhandleri   r   s         r#   register_hookzSideEffects.register_hook}  sG    $##((*+"($!=#::~
r$   c                     | j                   |= y r   )r@   )r!   r   s     r#   remove_hookzSideEffects.remove_hook  s    c"r$   c                    | j                   j                         D ]  \  }}}}|j                  sJ d        ||       |j                  |j	                  |      g        ||       |j                  t        dd             t        |d      r8|j                  r,|j                  |j                  |j                        g       |j                  t        d      g        y )Nz4Hooks on non input tensors NYI - should not get herer   Tuser_code_variable_namer   )
r@   r   r   r   create_load_attrr   hasattrr   create_storer   )r!   r   r   r   r   ri   s         r#   codegen_hookszSideEffects.codegen_hooks  s     %%'
F ==X"XX=vJb11$789tH1!T:;  9:22   "//&2P2P"Q!RS   "4Y"?!@Aw (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|j                  j                  j                  d       |j                  j                  j                  d        ||j                  j
                         |j                  t        d	d
      g        ||d        ||j                  j
                         |j                  t        d	d
      g       |j                  g t        d      t        d      t        d      t        d             | j                  |      r| j                   j#                  |j                  i       j%                         D ]  \  }}t        |t        j&                        rK|j                  j                  j                  |        ||       |j                  t        d|
      g       l|dk(  rrt        |t        j(                        rt        |j                  t*              st-        t/        |dd       |      s|j                  j                  j                  |        ||j                  j
                         |j                  t        d|
      g       |j                  j                  j                  |        ||        ||j                  j
                         |j                  t        d|
      g        t1        t3        |             t5        |      D ]  }|j                  |        y )NF)allow_cacheBUILD_SLICE   )r   STORE_SUBSCRclearupdater   r   r   r   r   STORE_GLOBALr   rj   DELETE_ATTR
STORE_ATTR)r   rD   r
   ListVariablerg   r   r   create_load_constr   r   ConstDictVariabler   outputupdate_co_namesr   rl   r<   r   rO   r   ro   r2   r   getattrAssertionErrortypereversed)r!   r   suffixesr   ri   rj   suffixs          r#   codegen_update_mutatedz"SideEffects.codegen_update_mutated  s   **,C#y5563E*3$$++,  ,,T2,,T2*=a@ !3N!C DEC!<!<=,,W5,,X63$$++,  "4]8"T!UV3E*3$$++,  "4]7"S!TU+A.*95 ,A. +95	 ++C0#'#<#<#@#@%%r$%'$KD% "#y'B'BC44T:5	 /tLM !88#E9+D+DE%--/H%gc7D&A4HEELL88>s00778$OO!3M$!O P 44T:5	3,,334 );LQU)V(WX1$4 %T#Y//w -| x(FV$ )r$   c                     t        t        | j                  | j                  j	                                     xs( | j
                  xs | j                  xs | j
                   S r   )anymapr   r;   r   r@   r?   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   )r=   r   r;   r   s    r#   r   zSideEffects.clear  s$    !!#r$   )NNNNNr%   )9r&   r'   r(   r)   r   intr   __annotations__r   strr   r   r   r   r*   rE   r   rL   rS   rY   ra   rc   rh   rm   rr   rx   rz   r}   r   staticmethodr   rl   r   r   r   r   r   
track_list
track_dictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r,   s   @r#   r:   r:   ;   s   
 o-../c?6J1KKLLCy !/
F 
t 
- HSM (

 #O Y"/-
D Dc D/ D9
8* *s *+ + +O +
 
 
A

. '  "	 JJ

 
 "	
  	,	&  F # 3 
D
V*	 *X#ABFA% A%F
$r$   r:   )#r   typingr   r   r   r   r   torch.nnr    r	   r
   bytecode_transformationr   r   r   codegenr   excr   r   r   r   r   r   variables.baser   r   r   r   r   r.   r2   r5   r:   rU   r$   r#   <module>r     sv     3 3   
   ' , 
') 
'(  1 %, %[$ [$r$   