
    Ph{7                     &   d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	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mZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ejN                   G d d             Z( G d d      Z)y)    N)CounterDictListOptional   )utils)create_call_functioncreate_dup_topcreate_instructioncreate_load_globalcreate_rot_nInstruction)unimplemented)
AttrSourceSource)is_safe_constantrot_n_helper)VariableTracker)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableTensorVariableUnspecializedPythonVariable)TensorWithTFOverrideVariablec                   "    e Zd ZU eed<   eed<   y)GraphOutputEntryindexvariableN)__name__
__module____qualname__int__annotations__r        `C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_dynamo/codegen.pyr   r   !   s    Jr%   r   c                   ~   e Zd ZdZ	 	 	 	 d&deej                  j                     dee   fdZ	d Z
d Zd'dZd	 Zd
 Zd Zd Zd Zd Zd Zd Zdee   fdZdefdZdefdZdefdZd(dZdefdZdefdZeZdefdZd Z d)dZ!d Z"d Z#	 d)dede$jJ                  d e&fd!Z'd" Z(deddfd#Z)d*d$Z*dee   fd%Z+y)+	PyCodegenz<
    Helper class uses for constructing Python bytecode
    Nrootgraph_output_varc                 x   || _         d | _        t        j                         | _        i | _        g | _        |xs i | _        || _        || _	        | j                  j                  j                  | _        | j                  j                  | _        | j                  j                  j                  | _        d| _        y )NF)r)   top_of_stackcollectionsr   usesgraph_outputs_outputtempvarstxr*   outputcode_optionscell_and_freevarsnew_var mutable_side_effects_from_source)selfr2   r)   r*   r1   s        r&   __init__zPyCodegen.__init__,   s     	7;.9.A.A.C	:<*, B 0 GGNN77!%!:!:ww~~--05-r%   c                 t    | j                   }d| _         	 | j                  |       || _         y # || _         w xY w)NT)r7   foreach)r8   stack_valuespriors      r&   restore_stackzPyCodegen.restore_stack@   s7    5504-	:LL&49D1ED1s   . 	7c                 p    | j                   j                         D cg c]  }|j                   c}S c c}w N)r/   valuesr   )r8   xs     r&   graph_output_varszPyCodegen.graph_output_varsH   s/    $($6$6$=$=$?@$?q

$?@@@s   3c                 
   t        |t              r;| j                  j                  |j	                  |              | j                          yt        |t              sJ | j                  }| j                  }| j                  |u r|j                  t                      y| j                  r9ddlm} t        |j                  |      r | |j                  j                         y|r|j                  rW|j                  | j                   v r?|j                  | j#                  | j                   |j                                  || _        y| j                   j%                  |      5|j                  | j#                  | j                   |                || _        y|j                  4|r2|j                  |j                  j	                  |              || _        y|j'                         rOt)        |j+                               r6|j                  | j-                  |j+                                      || _        yt        |t.              r| j1                  |      }|j                  | j3                  |j5                         dd             | j7                  ||   j8                         |j                  t;        dd             || _        yt        |t<        t>        t@        tB        f      r| j1                  |      }t        |tB              r | jE                  tF        jH                  d       | j7                  ||   j8                         t        |tB              r#|j                  t;        dd             || _        yt        |t@              r|jJ                  r|j                  | jM                  d      gt;        dd      z          || _        yt        |tN              r|jP                  jS                  d	      }|d   | jT                  d
   v r)|j                  | j#                  |d                |dd }n8| jV                  J |j                  | jY                  | jV                               |D ]"  }|j                  | jM                  |             $ || _        y| jZ                  |xx   dz  cc<   	 |j                  |j	                  |              |rB|| j                   v r4| j                  j                  t                      | ja                  |       || _        y# t\        $ r t_        d|        Y ew xY w)z:Generate code such that top-of-stack (TOS) is set to valueNr   )MutableSideEffectsTaddto_numpy_helperitemr   .co_varnameszreconstruct: )1
isinstancer   r0   extendreconstruct	clear_tosr   r/   r,   appendr
   r7   side_effectsrE   mutable_localsourcer1   create_loadgetis_python_constantr   as_python_constantcreate_load_constr   add_graph_outputr   global_mangled_class_nameload_graph_outputr   r	   r   r   r   r   load_import_fromr   r   need_unwrapcreate_load_attrr   
module_keysplitr4   r)   create_load_outputr.   NotImplementedErrorr   	add_cache)	r8   valueallow_cacher3   r/   rE   graph_outputs_keypartsparts	            r&   __call__zPyCodegen.__call__K   sh   eV$LL 1 1$ 78NN%111**%MM.*+00
 9%--/ABU((//0""u':':dmm'Kd..t}}U=P=P/QRS$)!}}  '3d..t}}U/CDE$)!<<#MM%,,22489p "o %%',<$$&-
 MM$001I1I1KLMh "g ;< $ 5 5e <MM''335t ( 
 ""=1B#C#I#IJMM.q$78V "U +$	
 !% 5 5e <%!56%%enn6GH""=1B#C#I#IJ%!5621d;<2 "1 E#>?EDUDU**6236J1d6SS. ") /0$$**3/EQx4,,];;d..uQx89ab	yy,,,d55dii@Ad33D9:  " IIe!7e//56 u5##N$45u%! ' 7eW567s   7 T# #T=<T=c                     t        |j                               }|| j                  vr,t        t	        | j                        |      | j                  |<   |S r@   )idas_proxyr/   r   len)r8   rd   rf   s      r&   rY   zPyCodegen.add_graph_output   sP    u~~/0D$6$664DD&&'5D01 ! r%   c                     | j                   }|j                  | j                  | j                               |j                  | j	                  |             |j                  t        d             y )NBINARY_SUBSCR)r0   rP   rT   r*   _create_load_constr   )r8   r   r3   s      r&   r[   zPyCodegen.load_graph_output   sQ    d&&t'<'<=>d--e45(9:r%   c                     | j                         }|| j                  |<   |j                  r|| j                  |j                  <   | j                  j	                  | j                  |             y r@   )r6   r1   rR   r0   rP   create_store)r8   rd   vars      r&   rc   zPyCodegen.add_cache   sU    lln"e14DMM%--.D--c23r%   c                 "    |D ]
  } | |        y r@   r$   )r8   itemsis      r&   r;   zPyCodegen.foreach   s    AG r%   c                     t        j                  dd|      }| j                  j                  }||v rt	        ||         t	        |      k(  sJ |||<   | j                  ||d      gS )zStore value in a new globalz[^a-zA-Z0-9_]+_TrF   )resubr2   	f_globalsrk   r   )r8   namerd   	push_nullr{   s        r&   setup_globally_cachedzPyCodegen.setup_globally_cached   sk    vv'd3GG%%	9io&"U)333#IdO''iT'BCCr%   c                     d | _         y r@   )r,   r8   s    r&   rO   zPyCodegen.clear_tos   s
     r%   c                 ~    t        |t              sJ | j                  j                  |       | j	                          y r@   )rL   r   r0   rP   rO   )r8   insts     r&   append_outputzPyCodegen.append_output   s.    $,,,D!r%   c                     t        d |D              sJ | j                  j                  |       | j                          y )Nc              3   <   K   | ]  }t        |t                y wr@   )rL   r   ).0rB   s     r&   	<genexpr>z*PyCodegen.extend_output.<locals>.<genexpr>   s     =u!:a-us   )allr0   rM   rO   )r8   instss     r&   extend_outputzPyCodegen.extend_output   s2    =u====E"r%   returnc                     | j                   S r@   )r0   r   s    r&   get_instructionszPyCodegen.get_instructions   s    ||r%   c                     || j                         v rt        d|      S || j                  d   v s
J | d       t        d|      S )N
LOAD_DEREFargvalrK   z missing	LOAD_FASTr5   r   r4   r8   r|   s     r&   rT   zPyCodegen.create_load   sR    4))++%l4@@t((77JD69JJ7!+d;;r%   c                 D    || j                         v sJ t        d|      S )NLOAD_CLOSUREr   )r5   r   r   s     r&   create_load_closurezPyCodegen.create_load_closure   s&    t--////!.>>r%   c                     || j                         v rt        d|      S || j                  d   v sJ t        d|      S )NSTORE_DEREFr   rK   
STORE_FASTr   r   s     r&   rr   zPyCodegen.create_store   sF    4))++%mDAAt((7777!,t<<r%   c                     |r%| j                   j                  j                  |       || j                  d   v s
J | d       t	        ||      S )Nco_namesz not in co_names)r2   r3   update_co_namesr4   r   )r8   r|   r}   rG   s       r&   r   zPyCodegen.create_load_global   sN    GGNN**40t((44O>N6OO4!$	22r%   c                 N    t        |      s
J d|        | j                  |      S )Nzunsafe constant )r   rp   r8   rd   s     r&   rX   zPyCodegen.create_load_const   s.    &B*:5'(BB&&&u--r%   c                     t        d|      S )N
LOAD_CONSTr   )r   r   s     r&   rp   zPyCodegen._create_load_const   s    !,u==r%   c                 n    || j                   d   vr| j                   dxx   |fz  cc<   t        d|      S )Nr   	LOAD_ATTRr   )r4   r   r   s     r&   r^   zPyCodegen.create_load_attr   s:    t((44j)dW4)!+d;;r%   c                 h    |j                  d      D cg c]  }| j                  |       c}S c c}w )NrJ   )r`   r^   )r8   namesr|   s      r&   create_load_attrszPyCodegen.create_load_attrs  s0    8=C8HI8H%%d+8HIIIs   /c                    g }|rBt         j                  dk\  r/|j                  t        d      g| j	                  |dz                |j                  | j                  |dd      g| j	                  |dz                |S )z6Load the global fn_name on the stack num_on_stack down      	PUSH_NULLr   FTrF   )sysversion_inforM   r   rot_nr   )r8   fn_namer}   num_on_stackr3   s        r&   load_function_namezPyCodegen.load_function_name  s    ))W4MM#K0P4::lQ>N3OP 	''D'AL1,-	
 r%   c                     	 t        |      S # t        $ rO t        d|      | j                  t	        |            gt        d      t        dd      t        d|      cY S w xY w)NBUILD_TUPLEarg   CALL_FUNCTION_EXr   UNPACK_SEQUENCE)r   AttributeErrorr   rp   r   )r8   ns     r&   r   zPyCodegen.rot_n  sz    
	?" 	 #=a8''Q8 a ##51=	
 ##4!< 	s   
 AA%$A%c                     t         j                  dk\  sJ | j                  d       gt        dd      t	        d      S )Nr   c                       y r@   r$   r$   r%   r&   <lambda>z$PyCodegen.pop_null.<locals>.<lambda>%  s    Dr%   r   FPOP_TOP)r   r   rp   r	   r   r   s    r&   pop_nullzPyCodegen.pop_null   sN     7***##L1
!!U+
 y)
 	
r%   r   coder}   c                    |j                   }|sJ | j                  }t        j                  dk\  r?|r=|j	                  t        d             |j                  | j                  |dz                |D ]2  }|| j                         v sJ |j	                  t        d|             4 |j	                  t        dt        |                   |j	                  | j                  |             t        j                  dk  r |j	                  | j                  |             |j	                  t        dd	             |j                  | j                  |dz                | j                          y )
Nr   r   r   r   r   r   r   MAKE_FUNCTION   )co_freevarsr0   r   r   rP   r   rM   r   r5   rm   rX   rO   )r8   r   r   r}   r   freevarsr3   rs   s           r&   make_function_with_closurez$PyCodegen.make_function_with_closure*  s    ##xw&9MM,[9:MM$**\A%567C$002222MM,^CHI  	(CMJKd,,T23g%MM$009:(dCDdjj!123r%   c                 r   | j                   j                  j                  }t        j                  dd|j
                        }|j                  |d      |u r| j                  ||d      S d| dt        |       }||vr&| j                   j                  j                  ||       | j                  ||d      S )zT
        Generate a LOAD_GLOBAL instruction to fetch a given python module.
        z^.*[.] NTrF   
___module_rx   )
r2   r3   global_scopery   rz   r   rU   r   rk   install_global)r8   modr}   r   r|   mangled_names         r&   create_load_python_modulez#PyCodegen.create_load_python_module>  s     ww~~22vviS\\2D$'3.**4*EE#D62c7)4|+GGNN)),<&&|YD&IIr%   c                    | j                  | j                  |d             | j                  j                  j                  }|D ]  }|j
                  rr| j                  | j                  t        d      | j                  d      g       | j                  |j                  |              | j                  t        dd             | j                  |j                  |               | j                  t        t        |      d             y)z2Call the generated code function stored in fn_nameT	as_tensorr   FN)r   r   r2   r3   	graphargsis_unspecializedr   torchr^   loadr	   rm   )r8   r   r   r   s       r&   make_call_generated_codez"PyCodegen.make_call_generated_codeK  s    4227DABGGNN,,	C##""66udC--k: ""388D>2""#75#AB""388D>2  	/IFGr%   c                     | j                  t        | j                  j                  |      |      j	                  |              y r@   )r   r   r2   import_sourcerN   )r8   module_nameobject_names      r&   r\   zPyCodegen.load_import_from_  s7    tww,,[9;GSS	
r%   c                     t         j                  dk\  rAt        ||      }|d   j                  dk(  sJ t	        d|      }|j                  d|       |S | j                  |      t	        d|      gS )Nr   PRECALLKW_NAMESr   CALL_FUNCTION_KWr   )r   r   r	   opnamer   insertrX   )r8   nargskw_namesr}   r3   kw_names_insts         r&   create_call_function_kwz!PyCodegen.create_call_function_kwf  sv    w&)%;F":$$	111.z(KMMM"m,M""8,1u=
 	
r%   )NNNN)T)F)r   )r   N),r   r    r!   __doc__r   r   nnModulestrr9   r>   rC   ri   rY   r[   rc   r;   r~   rO   r   r   r   r   r   rT   r   rr   r   rX   rp   ra   r^   r   r   r   r   typesCodeTypeboolr   r   r   r\   r   r$   r%   r&   r(   r(   '   sO    *.*.6 uxx'6 #3-	6(:A]"~!;4D!

${"3 <; <?; ?=K =3.+ .>; > ,< <
J
 QR"'..=A(JH H H(


T+EV 

r%   r(   )*r-   dataclassesry   r   r   typingr   r   r   r   torch.nnr   r   r   bytecode_transformationr	   r
   r   r   r   r   excr   rS   r   r   r   r   variables.baser   variables.nn_moduler   variables.tensorr   r   r   r   variables.torch_functionr   	dataclassr   r(   r$   r%   r&   <module>r      sv      	 
  0 0     & 1 + 1  C   
I
 I
r%   