
    #hS                     :   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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!m"Z" dd
l#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ejX                   G d d             Z- G d d      Z.y)    N)CounterDictListOptional   )utils)
add_push_nulladd_push_null_call_function_excreate_call_functioncreate_call_methodcreate_dup_topcreate_instructioncreate_load_constcreate_load_methodcreate_rot_nInstruction)unimplemented)
AttrSourceSource)is_safe_constantrot_n_helper)ValueMutationExisting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        R/var/www/html/sandstorm/venv/lib/python3.12/site-packages/torch/_dynamo/codegen.pyr!   r!   &   s    Jr*   r!   c                      e Zd ZdZ	 	 	 	 	 d8deej                  j                     dee   ddfdZ	ddd	Z
d
 Zd Zd9d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efdZdefdZd9defdZdefdZ defdZ!d Z"d  Z#defd!Z$d" Z%d# Z&defd$Z'd% Z(d;d&Z)d' Z*d( Z+d) Z,d*e-d+e.fd,Z/d- Z0d. Z1d/ Z2	 d;d0ed1e3jh                  d+e.fd2Z5defd3Z6d0eddfd4Z7d<d5Z8dee   fd6Z9defd7Z:y)=	PyCodegenz<
    Helper class uses for constructing Python bytecode
    Nrootgraph_output_varreturnc                    || _         d | _        t        j                         | _        i | _        g | _        |xs i | _        || _        || _	        | j                  j                  j                  | _        | j                  j                  | _        | j                  j                  j                  | _        d| _        |xs i | _        y )NT)r.   top_of_stackcollectionsr   usesgraph_outputs_outputtempvarstxr/   outputcode_optionscell_and_freevarsnew_varvalue_from_sourceoverridden_sources)selfr8   r.   r/   r7   r>   s         r+   __init__zPyCodegen.__init__1   s     	7;.9.A.A.C	:<*,
 !B 0 GGNN77!%!:!:ww~~--'+ 9K8Pbr*   T)r=   c                    | j                   }| xj                   |z  c_         	 | j                  |       || _         y # || _         w xY wN)r=   foreach)r?   stack_valuesr=   prevs       r+   restore_stackzPyCodegen.restore_stackN   sA    %%"33	*LL&%)D"TD"s	   < 	Ac                 p    | j                   j                         D cg c]  }|j                   c}S c c}w rB   )r5   valuesr#   )r?   xs     r+   graph_output_varszPyCodegen.graph_output_varsV   s)    $($6$6$=$=$?@q

@@@s   3c                 >    |j                  |       }|
J d|        y )Nzreconstruct!=None )reconstruct)r?   valueress      r+   call_reconstructzPyCodegen.call_reconstructY   s)    %{8088{r*   c                    t        | j                        }t        j                  dk  r| j	                           |        | j                  |d }| j                  |d= |r%| j                  j                  t        |             n$| j                  j                  t        |             t        j                  dk\  r| j	                          yy)a  
        `gen_fn` generates instructions via PyCodegen methods
        that push a single callable to the stack.

        `add_push_null` pushes a NULL to the stack before or after the
        instructions generated by `gen_fn`, depending on Python version.

        Will attempt to use the NULL push bit for instructions
        with such bits (LOAD_GLOBAL 3.11+, LOAD_ATTR 3.12+, LOAD_SUPER_ATTR).
              N)lenr6   sysversion_info	clear_tosextendr
   r	   )r?   gen_fncall_function_exold_lenadded_instss        r+   r	   zPyCodegen.add_push_null]   s     dll#g% NNll78,LL"LL >{ KLLLk :;w&NN 'r*   c                 
   	 t        |t              r> j                  j                  ||      } j	                  |        j                          yt        |t              sJ  j                  	 j                  |rx j                  |u r	j                  t                      y j                  j                  |      5	j                   j                   j                  |                | _	        y|j                  :|r8t        |j                  t               s j"                  r  |j                        S |j%                         rOt'        |j)                               r6	j                   j+                  |j)                                      | _	        yt        |t,              r j/                  |       j1                   fd        j3                     j4                         	j                   j7                  |j9                   j:                        d             	j=                  t?        dd             | _	        yt        |t@              r|jC                         tD        k(  r j:                  jF                  su j/                  |jI                   j:                  tJ        jL                              	 fd} j1                  |       	j=                  t?        dd             | _	        yt        |tN        t@        tP        tR        f      r j/                  |      t        |tR              rU j1                   fd	        j3                     j4                         	j=                  t?        d
d             | _	        yt        |tP              rH|jT                  r<	 fd} j1                  |       	j=                  t?        dd             | _	        y j3                     j4                         | _	        yt        |tV              r|jX                  j[                  d      }|d    j\                  d   v r)	j                   j                  |d                |d
d }n8 j^                  J 	j                   ja                   j^                               |D ]"  }	j                   jc                  |             $ | _	        y jd                  |xx   d
z  cc<   	  j	                  |       |rB| j                  v r4 j                  j                  t                       jk                  |       | _	        y# tf        $ r ti        d|        Y ew xY w)a2  
        Generate code such that top-of-stack (TOS) is set to value.

        `allow_cache` is used to determine whether the following could happen,
        when `value` is a `VariableTracker`:
        1. if `value` was codegen-ed previously with `allow_cache=True` and
           without using source, reuse the generated code by loading from top
           of stack or tempvars.
        2. emit code based on `value.source` to handle aliasing.

        Notable effects:
        1. `self.top_of_stack` will be set to `value`, if we don't codegen
           `value` based on source.
        2. `self.uses[value]` will increment, if we don't codegen `value` based
           on source or cache/top-of-stack reuse; in other words, if we codegen
           as if `value` is modelling some brand new python value.
        Nc                  D     j                  t        j                  d      S )Nto_subclassload_import_fromr   r$   r?   s   r+   <lambda>z$PyCodegen.__call__.<locals>.<lambda>   s    --ennmL r*   Tadd   Fc                      j                      j                         j                  j                  d             y Nitemload_graph_outputr"   appendcreate_load_attrr5   graph_outputs_keyr9   r?   s   r+   rY   z"PyCodegen.__call__.<locals>.gen_fn   s4    &&}5F'G'M'MNd33F;<r*   r   c                  D     j                  t        j                  d      S )Nto_numpy_helperr`   rb   s   r+   rc   z$PyCodegen.__call__.<locals>.<lambda>   s    D11%..BST r*   r   c                      j                      j                         j                  j                  d             y rh   rj   rn   s   r+   rY   z"PyCodegen.__call__.<locals>.gen_fn   s4    **=9J+K+Q+QRMM$"7"7"?@r*   .co_varnameszreconstruct: )6
isinstancer   r>   getrO   rW   r   r6   r5   r2   rl   r   r7   create_loadsourcemutation_typer   r=   is_python_constantr   as_python_constantr   r   add_graph_outputr	   rk   r"   create_load_globalglobal_mangled_class_namer8   rX   r   r   python_typefloatexport	as_tensortorchfloat64r   r   r   need_unwrapr   
module_keysplitr:   r.   create_load_const_uncheckedrm   r4   NotImplementedErrorr   	add_cache)
r?   rM   allow_cacherx   rY   partspartr5   ro   r9   s
   `      @@@r+   __call__zPyCodegen.__call__z   s   $ eV$,,00>F!!&)NN%111**  E)n./}}  '3d..t}}U/CDE$)! <<#$ 5..0EF))ELL))##%*:5;S;S;U*VMM$001I1I1KLMf "e ;< $ 5 5e <L ""=1B#C#I#IJMM''33DGG<$ ( 
 MM.q%89L "I uo.!!#u,GGNN !% 5 57!= v&MM.q%89` "_ +$	
 !% 5 5e <%!56""T &&}5F'G'M'MN21e<=> "= E#>?EDUDUA ""6*21e<=. "+ &&}5F'G'M'MN* ") /0$$**3/EQx4,,];;d..uQx89ab	yy,,,d>>tyyIJ ;d33D9:; " IIe!7%%e, u5##N$45u%! ' 7eW567s   :U U10U1c                     t        |j                               }|| j                  vr,t        t	        | j                        |      | j                  |<   |S rB   )idas_proxyr5   r!   rT   )r?   rM   ro   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)r6   rl   rw   r/   r   r   )r?   r"   r9   s      r+   rk   zPyCodegen.load_graph_output  sQ    d&&t'<'<=>d,,U34(9:r*   c                     | j                         }|| j                  |<   | j                  j                  | j	                  |             y rB   )r<   r7   r6   rl   create_store)r?   rM   vars      r+   r   zPyCodegen.add_cache  s8    lln"eD--c23r*   c                 "    |D ]
  } | |        y rB   r)   )r?   itemsis      r+   rC   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_]+_Trd   )resubr8   	f_globalsr   r}   )r?   namerM   r   s       r+   setup_globally_cachedzPyCodegen.setup_globally_cached'  si    vv'd3GG%%	9io&"U)333#IdO''$'788r*   c                     d | _         y rB   )r2   rb   s    r+   rW   zPyCodegen.clear_tos1  s
     r*   c                 ~    t        |t              sJ | j                  j                  |       | j	                          y rB   )ru   r   r6   rl   rW   )r?   insts     r+   append_outputzPyCodegen.append_output4  s.    $,,,D!r*   c                     t        d |D              sJ | j                  j                  |       | j                          y )Nc              3   <   K   | ]  }t        |t                y wrB   )ru   r   ).0rI   s     r+   	<genexpr>z*PyCodegen.extend_output.<locals>.<genexpr>:  s     =!:a-=s   )allr6   rX   rW   )r?   instss     r+   extend_outputzPyCodegen.extend_output9  s2    =u====E"r*   c                     | j                   S rB   )r6   rb   s    r+   get_instructionszPyCodegen.get_instructions>  s    ||r*   c                 R    || j                   d   v s
J | d       t        d|      S )Nrt    missing	LOAD_FASTargvalr:   r   r?   r   s     r+   rw   zPyCodegen.create_loadA  s4    t((77JD69JJ7!+d;;r*   c                 r    || j                         v sJ t        j                  dk\  rdnd}t        ||      S )NrQ   r   LOAD_CLOSUREr   )r;   rU   rV   r   )r?   r   	inst_names      r+   create_load_closurezPyCodegen.create_load_closureE  s:    t--////#&#3#3w#>KN	!)D99r*   c                 D    || j                         v sJ t        d|      S )N
LOAD_DEREFr   r;   r   r   s     r+   create_load_derefzPyCodegen.create_load_derefJ  s&    t--////!,t<<r*   c                 R    || j                   d   v s
J | d       t        d|      S )Nrt   r   
STORE_FASTr   r   r   s     r+   r   zPyCodegen.create_storeN  s4    t((77JD69JJ7!,t<<r*   c                 D    || j                         v sJ t        d|      S )NSTORE_DEREFr   r   r   s     r+   create_store_derefzPyCodegen.create_store_derefR  s&    t--////!-==r*   c                     |r%| j                   j                  j                  |       || j                  d   v s
J | d       t	        d|      S )Nco_namesz not in co_namesLOAD_GLOBALr   )r8   r9   update_co_namesr:   r   )r?   r   re   s      r+   r}   zPyCodegen.create_load_globalV  sN    GGNN**40t((44O>N6OO4!-==r*   c                     t        |      S rB   r   r?   rM   s     r+   r   zPyCodegen.create_load_const\  s     ''r*   c                     t        |d      S )NF)checkedr   r   s     r+   r   z%PyCodegen.create_load_const_unchecked_  s     66r*   c                     | j                   j                  j                  |       | j                  t	        |             y rB   )r8   r9   r   r   r   r   s     r+   load_methodzPyCodegen.load_methodb  s,    &&t,-d34r*   c                 8    | j                  t        |             y rB   )r   r   )r?   nargss     r+   call_methodzPyCodegen.call_methodf  s    -e45r*   c                 n    || j                   d   vr| j                   dxx   |fz  cc<   t        d|      S )Nr   	LOAD_ATTRr   r   r   s     r+   rm   zPyCodegen.create_load_attri  s:    t((44j)dW4)!+d;;r*   c                 D    | j                  | j                  |             y rB   )r   rm   r   s     r+   	load_attrzPyCodegen.load_attrn  s    40067r*   c                 h    |j                  d      D cg c]  }| j                  |       c}S c c}w )Nrs   )r   rm   )r?   namesr   s      r+   create_load_attrszPyCodegen.create_load_attrsq  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_attrt  s:    t((44j)dW4)!,t<<r*   c                 D    | j                  | j                  |             y rB   )r   r   r   s     r+   
store_attrzPyCodegen.store_attry  s    411$78r*   c                 x   g }|r~t         j                  dk\  rk|j                  t        | j	                  |d                   |dkD  r9|j                  g | j                  |dz         | j                  |dz                |S |j                  | j	                  |d      g| j                  |dz                |S )z6Load the global fn_name on the stack num_on_stack downrR      Trd   r   rf   r   )rU   rV   rX   r	   r}   rot_n)r?   fn_name	push_nullnum_on_stackr9   s        r+   load_function_namezPyCodegen.load_function_name|  s    ))W4MM-(?(?T(?(RSTaL1$45L1$45  MM++G+>ZZq 01 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argrf   CALL_FUNCTION_EXr   UNPACK_SEQUENCE)r   AttributeErrorr   r   r   )r?   ns     r+   r   zPyCodegen.rot_n  sz    
	?" 	 #=a800aA a ##51=	
 ##4!< 	s   
 AA%$A%c                     t         j                  dk\  sJ | j                  d       gt         j                  dk\  rt        dd      fndt	        dd	      t        d
      S )Nr   c                       y rB   r)   r)   r*   r+   rc   z$PyCodegen.pop_null.<locals>.<lambda>  s    r*   rQ   SWAPrf   r   r)   r   FPOP_TOP)rU   rV   r   r   r   rb   s    r+   pop_nullzPyCodegen.pop_null  sw     7***,,\:


 ##w. $F24

 "!U+

 y)

 
	
r*   c                 8    | j                  t        d             y )Nr   )r   r   rb   s    r+   pop_topzPyCodegen.pop_top  s    -i89r*   r   r   c                 <    | j                  t        ||             y )N)r   )r   r   )r?   r   r   s      r+   call_functionzPyCodegen.call_function  s    /KLr*   c                 6    | j                  t                      y rB   )r   r   rb   s    r+   dup_topzPyCodegen.dup_top  s    >+,r*   c                 D    | j                  | j                  |             y rB   )r   r   r?   varnames     r+   storezPyCodegen.store  s    4,,W56r*   c                 D    | j                  | j                  |             y rB   )r   r   r   s     r+   
load_derefzPyCodegen.load_deref  s    411':;r*   r   codec                     j                   sJ  j                   fd}|rkt        j                  dk\  rX j	                  |       j                   j                  |dz                j                   j                  |dz                n* |        j                   j                  |dz                 j                          y )Nc                     D ]6  } | j                         v sJ j                  j                  |              8 j                  t        dt	                           j                  j                               t        j                  dk  r j                  j                               t        j                  dk\  r(j                  t        d      t        dd      g       y j                  t        dd             y )Nr   r   r   rQ   MAKE_FUNCTIONSET_FUNCTION_ATTRIBUTE   )	r;   rl   r   r   rT   r   rU   rV   rX   )r   r   r   freevarsr9   r?   s    r+   rY   z4PyCodegen.make_function_with_closure.<locals>.gen_fn  s    
   =d446666d66s;<= MM,]HNOMM$0067')d44W=>7**?;*+CN 0dKLr*   r   rf   r   )co_freevarsr6   rU   rV   r	   rX   r   rW   )r?   r   r   r   r   rY   r  r9   s   ```   @@r+   make_function_with_closurez$PyCodegen.make_function_with_closure  s     ##x	M 	M, ))W4v&MM$**\A%567MM$**\A%567HMM$**\A%567r*   c                 R   | 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^.*[.] NTrd   
___module_)	r8   r9   global_scoper   r   r$   rv   r}   install_global_by_id)r?   modr9   r	  r   prefixglobal_names          r+   create_load_python_modulez#PyCodegen.create_load_python_module  s     **vviS\\2D$'3.**4T*::dV$ggnn99&#F&&{&==r*   c                      j                   j                  |d              j                  j                  j                  }|D ]`  }|j
                  rA j                   fd        j                  |        j                  t        dd             P j                  |       b  j                  t        t        |      d             y)z2Call the generated code function stored in fn_nameTc                  n     j                   j                  t               j                  d      g      S )N_as_tensor_fullprec)r   r  r   rm   rb   s   r+   rc   z4PyCodegen.make_call_generated_code.<locals>.<lambda>  s4    D.. ::5A 112GH r*   r   FN)
r   r   r8   r9   	graphargspass_arg_as_tensorr	   rO   r   rT   )r?   r   r  r   s   `   r+   make_call_generated_codez"PyCodegen.make_call_generated_code  s    4227DABGGNN,,	 	+C%%"" %%c*""#75#AB%%c*	+ 	/IFGr*   c                 Z     | t        | j                  j                  |      |             y rB   )r   r8   import_source)r?   module_nameobject_names      r+   ra   zPyCodegen.load_import_from  s     Z--k:KHIr*   c                    t         j                  dk\  rSt        ||      }|d   j                  dk(  sJ |j	                  d| j                  |             t        d|      |d<   |S t         j                  dk\  r]t        ||      }t         j                  dk\  rd}d}nd}d	}||   j                  |k(  sJ t        d
|      }|j	                  ||       |S | j                  |      t        d|      gS )NrQ   CALLCALL_KWr   r   )rR      PRECALLKW_NAMESr   CALL_FUNCTION_KW)rU   rV   r   opnameinsertr   r   )r?   r   kw_namesr   r9   idxexpected_instkw_names_insts           r+   create_call_function_kwz!PyCodegen.create_call_function_kw	  s    w&)%;F":$$...MM"d44X>?+I5AF2JM()%;F7* & )#;%%666.z(KMMM#}-M""8,1u=
 	
r*   c                     t        d|      S )NDELETE_FASTr   )r   r   s     r+   create_deletezPyCodegen.create_delete!  s    !->>r*   )NNNNN)F)T)r   )r0   N);r$   r%   r&   __doc__r   r   nnModulestrr@   rF   rJ   rO   r	   r   r|   rk   r   rC   r   rW   r   r   r   r   r   rw   r   r   r   r   r}   r   r   r   r   rm   r   r   r   r   r   r   r   r   r'   boolr   r   r   r   typesCodeTyper  r  r  ra   r(  r+  r)   r*   r+   r-   r-   ,   s    *.*.Q uxx'Q #3-	Q 
Q: @D *A9:T"l!;4
9!

${"3 <; <:; :
= ==K =>+ >>[ >(+ (7K 756< <
8J= =
9*
 :M3 M4 M-7< QR$$"'..$=A$L> >H H H,J
T+EV 
0?k ?r*   r-   )/r3   dataclassesr   rU   r1  typingr   r   r   r   torch.nnr   r  r   bytecode_transformationr	   r
   r   r   r   r   r   r   r   r   excr   rx   r   r   r   r   variables.baser   r   variables.nn_moduler   variables.tensorr   r   r   r   variables.torch_functionr   	dataclassr!   r-   r)   r*   r+   <module>r=     s{      	 
  0 0      & 1 B 1  C   
v? v?r*   