
    '}h:                     &   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        T/var/www/html/test/engine/venv/lib/python3.12/site-packages/torch/_dynamo/codegen.pyr   r   !   s    Jr%   r   c                      e Zd ZdZ	 	 	 	 d1deej                  j                     dee   fdZ	dddZ
d	 Zd
 Zd2d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d3defdZdefdZdefdZeZd Z defdZ!d Z"d Z#defd Z$d! Z%d4d"Z&d# Z'd$ Z(d%e)d&e*fd'Z+d( Z,d) Z-	 d4d*ed+e.j^                  d&e*fd,Z0defd-Z1d*eddfd.Z2d5d/Z3dee   fd0Z4y)6	PyCodegenz<
    Helper class uses for constructing Python bytecode
    Nrootgraph_output_varc                    || _         d | _        t        j                         | _        i | _        g | _        |xs i | _        || _        || _	        | j                  j                  j                  | _        | j                  j                  | _        | j                  j                  j                  | _        d| _        d| _        y )NFT)r)   top_of_stackcollectionsr   usesgraph_outputs_outputtempvarstxr*   outputcode_optionscell_and_freevarsnew_var mutable_side_effects_from_sourcevalue_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%   T)r8   c                    | j                   }d| _         | j                  }| xj                  |z  c_        	 | j                  |       || _         || _        y # || _         || _        w xY w)NT)r7   r8   foreach)r9   stack_valuesr8   priorprevs        r&   restore_stackzPyCodegen.restore_stackA   sg    5504-%%"33	*LL&49D1%)D" 5:D1%)D"s   A A&c                 p    | j                   j                         D cg c]  }|j                   c}S c c}w N)r/   valuesr   )r9   xs     r&   graph_output_varszPyCodegen.graph_output_varsL   s)    $($6$6$=$=$?@q

@@@s   3c                 >    |j                  |       }|
J d|        y )Nzreconstruct!=None )reconstruct)r9   valueress      r&   call_reconstructzPyCodegen.call_reconstructO   s)    %{8088{r%   c                 
   t        |t              r"| j                  |       | j                          yt        |t              sJ | j
                  }| j                  }| j                  |u r|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                  1|r/| j$                  r#| j                  |j                         || _        y|j'                         rOt)        |j+                               r6|j                  | j-                  |j+                                      || _        yt        |t.              r| j1                  |      }| j3                  t4        j6                  d       | j9                  ||   j:                         |j                  | j=                  |j?                  | j@                        dd             |jC                  tE        dd             || _        yt        |tF        tH        tJ        tL        f      r| j1                  |      }t        |tL              r | j3                  t4        j6                  d	       | j9                  ||   j:                         t        |tL              r#|jC                  tE        dd             || _        yt        |tJ              r|jN                  rr|jC                  | jQ                  d
      gtE        dd      z          || _        yt        |tR              r|jT                  jW                  d      }|d   | jX                  d   v r)|j                  | j!                  |d                |dd }n8| jZ                  J |j                  | j]                  | jZ                               |D ]"  }|j                  | jQ                  |             $ || _        y| j^                  |xx   dz  cc<   	 | j                  |       |rB|| j                  v r4| j
                  j                  t                      | je                  |       || _        y# t`        $ r tc        d|        Y ew xY w)z:Generate code such that top-of-stack (TOS) is set to valueNr   )MutableSideEffectsto_subclassFTadd   to_numpy_helperitemr   .co_varnameszreconstruct: )3
isinstancer   rJ   	clear_tosr   r0   r/   r,   appendr
   r7   side_effectsrL   mutable_localsourcer1   create_loadgetr8   is_python_constantr   as_python_constantcreate_load_constr   add_graph_outputload_import_fromr   r   load_graph_outputr   r   global_mangled_class_namer2   extendr	   r   r   r   r   need_unwrapcreate_load_attrr   
module_keysplitr4   r)   create_load_outputr.   NotImplementedErrorr   	add_cache)	r9   rH   allow_cacher3   r/   rL   graph_outputs_keypartsparts	            r&   __call__zPyCodegen.__call__S   sp   eV$!!%(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$)!<<#8N8N!!%,,/t "s %%',<$$&-
 MM$001I1I1KLMl "k ;< $ 5 5e <!!%..-@""=1B#C#I#IJMM''33DGG<e ( 
 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, u5##N$45u%! ' 7eW567s   T% %T?>T?c                     t        |j                               }|| j                  vr,t        t	        | j                        |      | j                  |<   |S rB   )idas_proxyr/   r   len)r9   rH   rm   s      r&   r`   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   rW   r[   r*   _create_load_constr   )r9   r   r3   s      r&   rb   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 rB   )r6   r1   rY   r0   rW   create_store)r9   rH   vars      r&   rk   zPyCodegen.add_cache   sU    lln"e14DMM%--.D--c23r%   c                 "    |D ]
  } | |        y rB   r$   )r9   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_]+_TrN   )resubr2   	f_globalsrr   r   )r9   namerH   	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 rB   )r,   r9   s    r&   rV   zPyCodegen.clear_tos   s
     r%   c                 ~    t        |t              sJ | j                  j                  |       | j	                          y rB   )rU   r   r0   rW   rV   )r9   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rB   )rU   r   ).0rD   s     r&   	<genexpr>z*PyCodegen.extend_output.<locals>.<genexpr>   s     =!:a-=s   )allr0   rd   rV   )r9   instss     r&   extend_outputzPyCodegen.extend_output   s2    =u====E"r%   returnc                     | j                   S rB   )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argvalrT   z missing	LOAD_FASTr5   r   r4   r9   r   s     r&   r[   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   rT   
STORE_FASTr   r   s     r&   ry   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   )r9   r   r   rO   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   rw   r9   rH   s     r&   r_   zPyCodegen.create_load_const   s.    &B*:5'(BB&&&u--r%   c                     t        d|      S )N
LOAD_CONSTr   )r   r   s     r&   rw   zPyCodegen._create_load_const  s    !,u==r%   c                 f    | j                   j                  j                  |       t        d|      S )NLOAD_METHODr   )r2   r3   r   r   r   s     r&   create_load_methodzPyCodegen.create_load_method  s%    &&t,!-==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&   rf   zPyCodegen.create_load_attr
  s:    t((44j)dW4)!+d;;r%   c                 D    | j                  | j                  |             y rB   )r   rf   r   s     r&   	load_attrzPyCodegen.load_attr  s    40067r%   c                 h    |j                  d      D cg c]  }| j                  |       c}S c c}w )NrS   )rh   rf   )r9   namesr   s      r&   create_load_attrszPyCodegen.create_load_attrs  s*    8=C8HI%%d+IIIs   /c                 n    || j                   d   vr| j                   dxx   |fz  cc<   t        d|      S )Nr   
STORE_ATTRr   r   r   s     r&   create_store_attrzPyCodegen.create_store_attr  s:    t((44j)dW4)!,t<<r%   c                 D    | j                  | j                  |             y rB   )r   r   r   s     r&   
store_attrzPyCodegen.store_attr  s    411$78r%   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   FTrN   )sysversion_inford   r   rot_nr   )r9   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argrP   CALL_FUNCTION_EXr   UNPACK_SEQUENCE)r   AttributeErrorr   rw   r   )r9   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 rB   r$   r$   r%   r&   <lambda>z$PyCodegen.pop_null.<locals>.<lambda>>  s    r%   r   FPOP_TOP)r   r   rw   r	   r   r   s    r&   pop_nullzPyCodegen.pop_null9  sN     7***##L1
!!U+
 y)
 	
r%   nargsr   c                 <    | j                  t        ||             y )N)r   )r   r	   )r9   r   r   s      r&   call_functionzPyCodegen.call_functionC  s    /KLr%   c                 6    | j                  t                      y rB   )r   r
   r   s    r&   dup_topzPyCodegen.dup_topF  s    >+,r%   c                 D    | j                  | j                  |             y rB   )r   ry   )r9   varnames     r&   storezPyCodegen.storeI  s    4,,W56r%   r   codec                    |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   rW   r   rd   r   r5   rt   r_   rV   )r9   r   r   r   r   freevarsr3   rz   s           r&   make_function_with_closurez$PyCodegen.make_function_with_closureL  s%    ##xw&9MM,[9:MM$**\A%567 	JC$002222MM,^CHI	J 	(CMJKd,,T23g%MM$009:(dCDdjj!123r%   c                 V   | j                   j                  }|j                  }t        j                  dd|j
                        }|j                  |d      |u r| j                  ||d      S d| }| j                   j                  j                  ||      }| j                  ||d      S )zT
        Generate a LOAD_GLOBAL instruction to fetch a given python module.
        z^.*[.] NTrN   
___module_)	r2   r3   global_scoper   r   r   r\   r   install_global_by_id)r9   modr   r3   r   r   prefixglobal_names           r&   create_load_python_modulez#PyCodegen.create_load_python_module`  s     **vviS\\2D$'3.**4*EEdV$ggnn99&#F&&{I4&HHr%   c                    | j                  | j                  |d             | j                  j                  j                  }|D ]  }|j
                  rc| j                  | j                  t        d      | j                  d      g       | j                  |       | j                  t        dd             r| 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   torchrf   rJ   r	   rt   )r9   r   r   r   s       r&   make_call_generated_codez"PyCodegen.make_call_generated_codem  s    4227DABGGNN,,	 	+C##""66udC--k: %%c*""#75#AB%%c*	+ 	/IFGr%   c                 Z     | t        | j                  j                  |      |             y rB   )r   r2   import_source)r9   module_nameobject_names      r&   ra   zPyCodegen.load_import_from  s     Z--k:KHIr%   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   insertr_   )r9   r   kw_namesr   r3   kw_names_insts         r&   create_call_function_kwz!PyCodegen.create_call_function_kw  sv    w&)%;F":$$	111.z(KMMM"m,M""8,1u=
 	
r%   )NNNN)T)F)r   )r   N)5r   r    r!   __doc__r   r   nnModulestrr:   r@   rE   rJ   rp   r`   rb   rk   r<   r   rV   r   r   r   r   r   r[   r   ry   r   r_   rw   ri   r   rf   r   r   r   r   r   r   r   r"   boolr   r   r   typesCodeTyper   r   r   ra   r   r$   r%   r&   r(   r(   '   s    *.*., uxx', #3-	,* @D 	*A9_"B!;4D!

${"3 <; <?; ?=K =3 3.+ .>; > ,>< <
8J= =
9
M3 M4 M-7 QR"'..=A(I; IH H H(J

T+EV 

r%   r(   )*r-   dataclassesr   r   r  typingr   r   r   r   torch.nnr   r   r   bytecode_transformationr	   r
   r   r   r   r   excr   rZ   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   
g
 g
r%   