
    wiS                     D   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j,         G d d                      Z- G d d          Z.dS )    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<   dS )GraphOutputEntryindexvariableN)__name__
__module____qualname__int__annotations__r        e/root/.openclaw/workspace/chatterbox_venv_py311/lib/python3.11/site-packages/torch/_dynamo/codegen.pyr!   r!   &   s'         JJJr*   r!   c                      e Zd ZdZ	 	 	 	 	 d:deej        j                 dee         ddfdZ	ddd	Z
d
 Zd Zd;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efdZdefdZd;d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/ Z0d0 Z1d1 Z2	 d=d2ed3e3j4        d-e.fd4Z5defd5Z6d2eddfd6Z7d>d7Z8dee         fd8Z9defd9Z:dS )?	PyCodegenz<
    Helper class uses for constructing Python bytecode
    Nrootgraph_output_varreturnc                 6   || _         d | _        t          j                    | _        i | _        g | _        |pi | _        || _        || _	        | j        j
        j        | _        | j        j        | _        | j        j
        j        | _        d| _        |pi | _        d S )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.C.C	:<*,
 !B 0 GN7!%!:w~-'+ 9K8Pbr*   T)r=   c                    | j         }| xj         |z  c_         	 |                     |           || _         d S # || _         w xY wN)r=   foreach)r?   stack_valuesr=   prevs       r+   restore_stackzPyCodegen.restore_stackN   sX    %"33	*LL&&&%)D"""TD"))))s	   7 	A c                 H    d | j                                         D             S )Nc                     g | ]	}|j         
S r)   )r#   .0xs     r+   
<listcomp>z/PyCodegen.graph_output_vars.<locals>.<listcomp>W   s    @@@q
@@@r*   )r5   valuesr?   s    r+   graph_output_varszPyCodegen.graph_output_varsV   s%    @@D$6$=$=$?$?@@@@r*   c                 N    |                     |           }|J d|             d S )Nzreconstruct!=None )reconstruct)r?   valueress      r+   call_reconstructzPyCodegen.call_reconstructY   s1    %%{{888{{{{{r*   Fc                    t          | j                  }t          j        dk     r|                                   |             | j        |d         }| j        |d= |r(| j                            t          |                     n'| j                            t          |                     t          j        dk    r|                                  dS dS )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     dl##g%% NNl788,L" 	<L >{ K KLLLLLk : :;;;w&&NN '&r*   c                    	 t          |t                    rF j                            ||          }                     |                                             dS t          |t                    sJ  j        	 j        |r j	        |u r#	
                    t                                 dS  j                            |          <	
                                          j        |                              | _	        dS |j        3|r1t          |j        t                     s j        r  |j                  S |                                r]t'          |                                          r<	
                                         |                                                     n&t          |t,                    r                     |                                fd                                         j                   	
                                         |                     j                  d                     	                    t?          dd                     n]t          |t@                    r|!                                tD          k    r j        j#        sz                     |$                     j        tJ          j&                            	 fd}                     |           	                    t?          dd                     nt          |tN          t@          tP          tR          f          r                     |          t          |tR                    r]                      fd	                                         j                   	                    t?          d
d                     nt          |tP                    rI|j*        rB	 fd}                     |           	                    t?          dd                     n                              j                   nut          |tV                    r|j,        -                    d          }|d          j.        d         v r9	
                                         |d                              |d
d         }n6 j/        J 	
                     0                     j/                             |D ]*}	
                     1                    |                     +n j2        |xx         d
z  cc<   	                      |           n"# tf          $ r ti          d|            Y nw xY w|rD| j        v r; j        
                    t                                  5                    |           | _	        dS )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                          t          j        d          S )Nto_subclassload_import_fromr   r$   rN   s   r+   <lambda>z$PyCodegen.__call__.<locals>.<lambda>   s    --enmLL r*   Tadd   Fc                                                     j                                                           d                     d S Nitemload_graph_outputr"   appendcreate_load_attrr5   graph_outputs_keyr9   r?   s   r+   r^   z"PyCodegen.__call__.<locals>.gen_fn   sF    &&}5F'G'MNNNd33F;;<<<<<r*   r   c                  D                          t          j        d          S )Nto_numpy_helperre   rN   s   r+   rg   z$PyCodegen.__call__.<locals>.<lambda>   s    D11%.BSTT r*   r   c                                                     j                                                           d                     d S rl   rn   rr   s   r+   r^   z"PyCodegen.__call__.<locals>.gen_fn   sF    **=9J+K+QRRRMM$"7"7"?"?@@@@@r*   .co_varnameszreconstruct: )6
isinstancer   r>   getrT   r\   r   r6   r5   r2   rp   r   r7   create_loadsourcemutation_typer   r=   is_python_constantr   as_python_constantr   r   add_graph_outputr	   ro   r"   create_load_globalglobal_mangled_class_namer8   r]   r   r   python_typefloatexport	as_tensortorchfloat64r   r   r   need_unwrapr   
module_keysplitr:   r.   create_load_const_uncheckedrq   r4   NotImplementedErrorr   	add_cache)
r?   rR   allow_cacher|   r^   partspartr5   rs   r9   s
   `      @@@r+   __call__zPyCodegen.__call__z   s+   $ eV$$ 	,00>>F!!&)))NNF%11111* 	 E))n..///}  ''3d..t}U/CDDEEE$)! <##$ 5.0EFF*)* tEL)))##%% R	&*:5;S;S;U;U*V*V R	&MM$001I1I1K1KLLMMMM;<< P	& $ 5 5e < <LLLL   ""=1B#C#IJJJMM''33DG<<$ (    
 MM.q%889999uo..C	&!!##u,,GN - !% 5 577! != = = = = = = = v&&&MM.q%889999+$	
 
 -	& !% 5 5e < <%!566 O""TTTT   &&}5F'G'MNNN21e<<====E#>?? 	OEDU 	OA A A A A A A A ""6***21e<<====&&}5F'G'MNNNN/00 	&$**3//EQx4,];;;d..uQx88999abb	y,,,d>>tyIIJJJ ; ;d33D99::::; Ie!7%%e,,,,& 7 7 75e55666667 &u55##N$4$4555u%%%!s   U2 2VVc                     t          |                                          }|| j        vr*t          t	          | j                  |          | j        |<   |S rB   )idas_proxyr5   r!   rY   )r?   rR   rs   s      r+   r   zPyCodegen.add_graph_output  sX    u~~//00D$6664DD&''5 5D01 ! r*   c                    | j         }|                    |                     | j                             |                    |                     |                     |                    t          d                     d S )NBINARY_SUBSCR)r6   rp   r{   r/   r   r   )r?   r"   r9   s      r+   ro   zPyCodegen.load_graph_output  sm    d&&t'<==>>>d,,U33444(99:::::r*   c                     |                                  }|| j        |<   | j                            |                     |                     d S rB   )r<   r7   r6   rp   create_store)r?   rR   vars      r+   r   zPyCodegen.add_cache  sE    llnn"eD--c2233333r*   c                 &    |D ]} | |           d S rB   r)   )r?   itemsis      r+   rC   zPyCodegen.foreach#  s*     	 	ADGGGG	 	r*   c                     t          j        dd|          }| j        j        }||v r)t	          ||                   t	          |          k    sJ n|||<   |                     |d          gS )zStore value in a new globalz[^a-zA-Z0-9_]+_Trh   )resubr8   	f_globalsr   r   )r?   namerR   r   s       r+   setup_globally_cachedzPyCodegen.setup_globally_cached'  sv    v'd33G%	9io&&"U))33333#IdO''$'7788r*   c                     d | _         d S rB   )r2   rN   s    r+   r\   zPyCodegen.clear_tos1  s     r*   c                     t          |t                    sJ | j                            |           |                                  d S rB   )ry   r   r6   rp   r\   )r?   insts     r+   append_outputzPyCodegen.append_output4  sD    $,,,,,D!!!r*   c                     t          d |D                       sJ | j                            |           |                                  d S )Nc              3   @   K   | ]}t          |t                    V  d S rB   )ry   r   rI   s     r+   	<genexpr>z*PyCodegen.extend_output.<locals>.<genexpr>:  s,      ==!:a--======r*   )allr6   r]   r\   )r?   instss     r+   extend_outputzPyCodegen.extend_output9  sQ    ==u========E"""r*   c                     | j         S rB   )r6   rN   s    r+   get_instructionszPyCodegen.get_instructions>  s
    |r*   c                 \    || j         d         v sJ | d            t          d|          S )Nrx    missing	LOAD_FASTargvalr:   r   r?   r   s     r+   r{   zPyCodegen.create_loadA  s?    t(7777D9J9J9J777!+d;;;;r*   c                 |    ||                                  v sJ t          j        dk    rdnd}t          ||          S )NrV   r   LOAD_CLOSUREr   )r;   rZ   r[   r   )r?   r   	inst_names      r+   create_load_closurezPyCodegen.create_load_closureE  sH    t--//////#&#3w#>#>KKN	!)D9999r*   c                 T    ||                                  v sJ t          d|          S )N
LOAD_DEREFr   r;   r   r   s     r+   create_load_derefzPyCodegen.create_load_derefJ  s2    t--//////!,t<<<<r*   c                 \    || j         d         v sJ | d            t          d|          S )Nrx   r   
STORE_FASTr   r   r   s     r+   r   zPyCodegen.create_storeN  s?    t(7777D9J9J9J777!,t<<<<r*   c                 T    ||                                  v sJ t          d|          S )NSTORE_DEREFr   r   r   s     r+   create_store_derefzPyCodegen.create_store_derefR  s2    t--//////!-====r*   c                     |r| 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   ri   s      r+   r   zPyCodegen.create_load_globalV  s_     	1GN**4000t(44446O6O6O444!-====r*   c                      t          |          S rB   r   r?   rR   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666r*   c                     | j         j                            |           |                     t	          |                     d S rB   )r8   r9   r   r   r   r   s     r+   load_methodzPyCodegen.load_methodb  s=    &&t,,,-d3344444r*   c                 J    |                      t          |                     d S rB   )r   r   )r?   nargss     r+   call_methodzPyCodegen.call_methodf  s%    -e445555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+   rq   zPyCodegen.create_load_attri  sI    t(444j)))dW4)))!+d;;;;r*   c                 V    |                      |                     |                     d S rB   )r   rq   r   s     r+   	load_attrzPyCodegen.load_attrn  s*    4006677777r*   c                 F      fd|                     d          D             S )Nc                 :    g | ]}                     |          S r)   )rq   )rJ   r   r?   s     r+   rL   z/PyCodegen.create_load_attrs.<locals>.<listcomp>r  s'    III%%d++IIIr*   rw   )r   )r?   namess   ` r+   create_load_attrszPyCodegen.create_load_attrsq  s)    IIIIC8H8HIIIIr*   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  sI    t(444j)))dW4)))!,t<<<<r*   c                 V    |                      |                     |                     d S rB   )r   r   r   s     r+   
store_attrzPyCodegen.store_attry  s*    411$7788888r*   r   c                    g }|rt           j        dk    r|                    t          |                     |d                               |dk    rE|                    g |                     |dz             |                     |dz                        nC|                    |                     |d          g|                     |dz                        |S )z6Load the global fn_name on the stack num_on_stack downrW      Trh   r   rj   r   )rZ   r[   r]   r	   r   rot_n)r?   fn_name	push_nullnum_on_stackr9   s        r+   load_function_namezPyCodegen.load_function_name|  s     	)W44MM-(?(?T(?(R(RSSTTTaL1$455L1$455   MM++G+>>ZZq 011   r*   c                 
   	 t          |          S # t          $ rg t          d|          |                     t	          |                    gt          d          t          dd          t          d|          cY S w xY w)NBUILD_TUPLEargrj   CALL_FUNCTION_EXr   UNPACK_SEQUENCE)r   AttributeErrorr   r   r   )r?   ns     r+   r   zPyCodegen.rot_n  s    
	??" 	 	 	 #=a88800aAA a ##51===	
 ##4!<<<   	s    A.BBc                     t           j        dk    sJ |                     d           gt           j        dk    rt          dd          fndt	          dd	          t          d
          S )Nr   c                      d S rB   r)   r)   r*   r+   rg   z$PyCodegen.pop_null.<locals>.<lambda>  s    T r*   rV   SWAPrj   r   r)   r   FPOP_TOP)rZ   r[   r   r   r   rN   s    r+   pop_nullzPyCodegen.pop_null  s     7****,,\\::


 #w.. $F22244

 "!U++

 y))

 
	
r*   c                 J    |                      t          d                     d S )Nr   )r   r   rN   s    r+   pop_topzPyCodegen.pop_top  s%    -i8899999r*   r   r   c                 N    |                      t          ||                     d S )N)r   )r   r   )r?   r   r   s      r+   call_functionzPyCodegen.call_function  s*    /KKKLLLLLr*   c                 H    |                      t                                 d S rB   )r   r   rN   s    r+   dup_topzPyCodegen.dup_top  s"    >++,,,,,r*   c                 V    |                      |                     |                     d S rB   )r   r   r?   varnames     r+   storezPyCodegen.store  s*    4,,W5566666r*   c                 V    |                      |                     |                     d S rB   )r   r   r   s     r+   
load_derefzPyCodegen.load_deref  s*    411'::;;;;;r*   r   codec                     j         sJ  j         fd}|r|t          j        dk    rl                     |                                                    |dz                                                                 |dz                        n5 |                                                      |dz                                                          d S )Nc                     D ]B} |                                  v sJ                                         |                      C                    t          dt	                                                                                                      t          j        dk     r(                                                             t          j        dk    r5                    t          d          t          dd          g           d S                     t          dd                     d S )Nr   r   r   rV   MAKE_FUNCTIONSET_FUNCTION_ATTRIBUTE   )	r;   rp   r   r   rY   r   rZ   r[   r]   )r   r  r   freevarsr9   r?   s    r+   r^   z4PyCodegen.make_function_with_closure.<locals>.gen_fn  s?   
   = =d44666666d66s;;<<<<MM,]HNNNOOOMM$0066777'))d44W==>>>7***?;;*+CNNN     0dKKKLLLLLr*   r   rj   r   )co_freevarsr6   rZ   r[   r	   r]   r   r\   )r?   r   r  r   r   r^   r  r9   s   ```   @@r+   make_function_with_closurez$PyCodegen.make_function_with_closure  s    #x	M 	M 	M 	M 	M 	M 	M 	M 	M,  	8)W44v&&&MM$**\A%566777MM$**\A%5667777FHHHMM$**\A%566777r*   c                 4   | j         j        }|j        }t          j        dd|j                  }|                    |d          |u r|                     |d          S d| }| j         j                            ||          }|                     |d          S )zT
        Generate a LOAD_GLOBAL instruction to fetch a given python module.
        z^.*[.] NTrh   
___module_)	r8   r9   global_scoper   r   r$   rz   r   install_global_by_id)r?   modr9   r  r   prefixglobal_names          r+   create_load_python_modulez#PyCodegen.create_load_python_module  s     *viS\22D$''3..**4T*:::$d$$gn99&#FF&&{&===r*   c                                                                |d                      j        j        j        }|D ]o}|j        rQ                      fd                                |                                 t          dd                     Z                     |           p                      t          t          |          d                     dS )z2Call the generated code function stored in fn_nameTc                                                                 t                                         d          g          S )N_as_tensor_fullprec)r   r  r   rq   rN   s   r+   rg   z4PyCodegen.make_call_generated_code.<locals>.<lambda>  s?    D.. ::5AA 112GHH  r*   r   FN)
r   r   r8   r9   	graphargspass_arg_as_tensorr	   rT   r   rY   )r?   r   r  r   s   `   r+   make_call_generated_codez"PyCodegen.make_call_generated_code  s    4227DAABBBGN,	 	+ 	+C% +""      %%c***""#75#A#ABBBB%%c****/IFFGGGGGr*   c                 h     | t          | j                            |          |                     d S rB   )r   r8   import_source)r?   module_nameobject_names      r+   rf   zPyCodegen.load_import_from  s2    Z--k::KHHIIIIIr*   c                    t           j        dk    rbt          ||          }|d         j        dk    sJ |                    d|                     |                     t          d|          |d<   |S t           j        dk    ret          ||          }t           j        dk    rd}d}nd}d	}||         j        |k    sJ t          d
|          }|                    ||           |S |                     |          t          d|          gS )NrV   CALLCALL_KWr   r   )rW      PRECALLKW_NAMESr   CALL_FUNCTION_KW)rZ   r[   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AAAF2JM(()%;;F7** & )#;%6666.z(KK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   rO   rT   r	   r   r   ro   r   rC   r   r\   r   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   rq   r   r   r   r   r   r   r   r   r'   boolr   r   r   r   typesCodeTyper	  r  r  rf   r,  r/  r)   r*   r+   r-   r-   ,   sI         *.*.Q Q ux'Q #3-	Q 
Q Q Q Q: @D * * * * *A A A9 9 9   :T" T" T" T"l! ! !; ; ;4 4 4
  9 9 9! ! !  
  
${"3    <; < < < <:; : : : :
= = = = ==K = = = =>+ > > > >> >[ > > > >(+ ( ( ( (7K 7 7 7 75 5 56 6 6< < < < <
8 8 8J J J= = = = =
9 9 9   *  
 
 
 : : :M3 M4 M M M M- - -7 7 7< < < QR$ $$"'.$=A$ $ $ $L> > > > >H H H H H H,J J J J
T+EV 
 
 
 
0?k ? ? ? ? ? ?r*   r-   )/r3   dataclassesr   rZ   r5  typingr   r   r   r   torch.nnr   r  r   bytecode_transformationr	   r
   r   r   r   r   r   r   r   r   excr   r|   r   r   r   r   variables.baser   r   variables.nn_moduler   variables.tensorr   r   r   r   variables.torch_functionr   	dataclassr!   r-   r)   r*   r+   <module>rA     s"           				 



  0 0 0 0 0 0 0 0 0 0 0 0                                     & & & & & & & & 1 1 1 1 1 1 1 1 B B B B B B B B 1 1 1 1 1 1            C B B B B B        
v? v? v? v? v? v? v? v? v? v?r*   