o
    "i%3                     @   s   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 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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"m#Z# ej$G dd dZ%G dd dZ&dS )    N)List   )utils)create_call_functioncreate_dup_topcreate_instructioncreate_load_globalcreate_rot_nInstruction)unimplemented)
AttrSourceGeneratorStateSourceSource)is_safe_constantrot_n_helper)VariableTracker)NNModuleVariable)NumpyNdarrayVariableSymNodeVariableTensorVariableTensorWithTFOverrideVariableUnspecializedPythonVariablec                   @   s,   e Zd ZU eed< eed< defddZdS )GraphOutputEntryindexvariableotherc                 C   s   | j || _ d S N)r   add_options)selfr    r   d/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/torch/_dynamo/codegen.pymerge&   s   zGraphOutputEntry.mergeN)__name__
__module____qualname__int__annotations__r   r!   r   r   r   r    r   !   s   
 r   c                   @   s4  e Zd ZdZ				dDdejjdefddZdd Z	dEd
dZ
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# ZdFd%d&Zd'd( Zd)d* ZeZd+d, Zd-d. ZdGd0d1Zd2d3 Zd4d5 Z	/dGd6ed7e j!d8e"fd9d:Z#d;d< Z$d6ed=e%e& fd>d?Z'd@dA Z(dBdC Z)dS )H	PyCodegenz<
    Helper class uses for constructing Python bytecode
    Nrootgraph_output_varc                 C   sb   || _ d | _t | _t | _g | _|pi | _|| _	|| _
| j	jj| _| j	j| _| j	jj| _d S r   )r(   top_of_stackcollectionsCounterusesOrderedDictgraph_outputs_outputtempvarstxr)   outputcode_optionscell_and_freevarsnew_var)r   r2   r(   r)   r1   r   r   r    __init__0   s   



zPyCodegen.__init__c                 C   s   dd | j  D S )Nc                 S   s   g | ]}|j qS r   )r   .0xr   r   r    
<listcomp>D   s    z/PyCodegen.graph_output_vars.<locals>.<listcomp>)r/   valuesr   r   r   r    graph_output_varsC   s   zPyCodegen.graph_output_varsTc           	      C   s&  t |tr| j||  |   dS | jjj	|j t |t
s$J | j}| j}| j|u r7|t  dS |rk|jrS|j| jv rS|| | j|j  || _dS | j|durk|| | j|  || _dS |jdur|rt |jts||j|  n| rt| r|| |  nt |tr|j}| |}|| j| ddd | || j |t dd nt |t!t"t#t$fr| |}t |t$r| %t&j'd | || j t |t$r|t dd nt |t#r|j(r|| )dgt dd  nt |t*rT|j+,d}|d | j-d	 v r4|| |d  |dd }n| j.dus<J || /| j. |D ]}|| )| qGn:| j0|  d7  < z
|||  W n t1yx   t2d
|  Y nw |r|| jv r| jt  | 3| || _dS )z:Generate code such that top-of-stack (TOS) is set to valueNTaddr   Zto_numpy_helperitemr   .co_varnameszreconstruct: )4
isinstancer   r0   extendreconstruct	clear_tosr2   r3   Zguardsupdater   r/   r*   appendr   mutable_localr1   create_loadgetsourcer   Zis_python_constantr   Zas_python_constantcreate_load_constr   tensor_variableadd_graph_outputr   Zglobal_class_nameload_graph_outputr   r   r   r   r   r   load_import_fromr   r"   Zneed_unwrapcreate_load_attrr   Z
module_keysplitr4   r(   create_load_outputr-   NotImplementedErrorr   	add_cache)	r   valueZallow_cacher3   r/   rO   graph_outputs_keypartspartr   r   r    __call__F   s   







	



zPyCodegen.__call__c                 C   sD   t | }|| jvrtt| j|| j|< |S | j| | |S r   )idZas_proxyr/   r   lenr!   )r   rX   rY   r   r   r    rP      s   


zPyCodegen.add_graph_outputc                 C   s:   | j }|| | j || | |td d S )NBINARY_SUBSCR)r0   rI   rK   r)   _create_load_constr   )r   r   r3   r   r   r    rQ      s   zPyCodegen.load_graph_outputc                 C   s:   |   }|| j|< |jr|| j|j< | j| | d S r   )r6   r1   rJ   r0   rI   create_store)r   rX   varr   r   r    rW      s
   
zPyCodegen.add_cachec                 C   s   |D ]}| | qd S r   r   )r   itemsir   r   r    foreach   s   
zPyCodegen.foreachc                 C   sR   t dd|}| jj}||v rt|| t|ksJ n|||< | j||ddgS )zStore value in a new globalz[^a-zA-Z0-9_]+_Tr?   )resubr2   	f_globalsr]   r   )r   namerX   	push_nullri   r   r   r    setup_globally_cached   s   zPyCodegen.setup_globally_cachedc                 C   s
   d | _ d S r   )r*   r=   r   r   r    rG      s   
zPyCodegen.clear_tosc                 C   s&   t |tsJ | j| |   d S r   )rD   r
   r0   rI   rG   )r   instr   r   r    append_output   s   zPyCodegen.append_outputc                 C   s.   t dd |D sJ | j| |   d S )Nc                 s   s    | ]}t |tV  qd S r   )rD   r
   r8   r   r   r    	<genexpr>   s    z*PyCodegen.extend_output.<locals>.<genexpr>)allr0   rE   rG   )r   Zinstsr   r   r    extend_output   s   zPyCodegen.extend_outputc                 C   s   | j S r   )r0   r=   r   r   r    get_instructions   s   zPyCodegen.get_instructionsc                 C   s@   ||   v rtd|dS || jd v sJ | dtd|dS )N
LOAD_DEREFargvalrC   z missing	LOAD_FASTr5   r   r4   r   rj   r   r   r    rK      s   zPyCodegen.create_loadc                 C   s   ||   v sJ td|dS )NLOAD_CLOSURErt   )r5   r   rx   r   r   r    create_load_closure   s   zPyCodegen.create_load_closurec                 C   s6   ||   v rtd|dS || jd v sJ td|dS )NSTORE_DEREFrt   rC   
STORE_FASTrw   rx   r   r   r    ra      s   zPyCodegen.create_storeFc                 C   s8   |r	| j j| || jd v sJ | dt||S )Nco_namesz not in co_names)r2   r3   Zupdate_co_namesr4   r   )r   rj   rk   r@   r   r   r    r      s   
zPyCodegen.create_load_globalc                 C   s    t |sJ d| | |S )Nzunsafe constant )r   r`   r   rX   r   r   r    rN      s   
zPyCodegen.create_load_constc                 C   s   t d|dS )N
LOAD_CONSTrt   )r   r~   r   r   r    r`      s   zPyCodegen._create_load_constc                 C   s.   || j d vr| j d  |f7  < td|dS )Nr}   	LOAD_ATTRrt   )r4   r   rx   r   r   r    rS      s   zPyCodegen.create_load_attrc                    s    fdd| dD S )Nc                    s   g | ]}  |qS r   )rS   )r9   rj   r=   r   r    r;      s    z/PyCodegen.create_load_attrs.<locals>.<listcomp>rB   )rT   )r   namesr   r=   r    create_load_attrs   s   zPyCodegen.create_load_attrsr   c                 C   sZ   g }|rt jdkr|tdg| |d  || j|dddg| |d  |S )z6Load the global fn_name on the stack num_on_stack down      	PUSH_NULLr   FTr?   )sysversion_inforE   r   rot_nr   )r   fn_namerk   num_on_stackr3   r   r   r    load_function_name   s   zPyCodegen.load_function_namec                 C   sX   zt |W S  ty+   td|d| t|gt dtdddtd|d Y S w )NBUILD_TUPLEarg   CALL_FUNCTION_EXr   UNPACK_SEQUENCE)r	   AttributeErrorr   r`   r   )r   nr   r   r    r     s   



zPyCodegen.rot_nc                 C   s0   t jdksJ | dd gtddtdS )Nr   c                   S   s   d S r   r   r   r   r   r    <lambda>  s    z$PyCodegen.pop_null.<locals>.<lambda>r   FPOP_TOP)r   r   r`   r   r   r=   r   r   r    pop_null  s   zPyCodegen.pop_nullr   coderk   c                 C   s   |j }|sJ | j}tjdkr"|r"|td || |d  |D ]}||  v s.J |td|d q$|tdt	|d || 
| tjdk rX|| 
| |tdd	d || |d  |   d S )
Nr   r   r   ry   rt   r   r   MAKE_FUNCTION   )co_freevarsr0   r   r   rI   r   rE   r   r5   r^   rN   rG   )r   r   r   rk   r   Zfreevarsr3   rb   r   r   r    make_function_with_closure"  s    
z$PyCodegen.make_function_with_closurec                 C   sv   | j jj}tdd|j}||d|u r| j||ddS d| dt| }||vr3| j j	|| | j||ddS )zT
        Generate a LOAD_GLOBAL instruction to fetch a given python module.
        z^.*[.] NTr?   Z
___module_rf   )
r2   r3   global_scoperg   rh   r"   rL   r   r]   Zinstall_global)r   modrk   r   rj   Zmangled_namer   r   r    create_load_python_module6  s   
z#PyCodegen.create_load_python_modulereturnc                 C   s   |  | |d | jjj}|D ],}|jr4|  | td| dg |  |	|  |  t
dd q|  |	|  q|  t
t|d dS )z2Call the generated code function stored in fn_nameTZ	as_tensorr   FN)rq   r   r2   r3   	graphargsZis_unspecializedr   torchrS   loadr   r^   )r   r   r   r   r   r   r    make_call_generated_codeC  s   

z"PyCodegen.make_call_generated_codec                 C   s"   |  t| j|||  d S r   )rq   r   r2   Zimport_sourcerF   )r   module_nameZobject_namer   r   r    rR   W  s
   zPyCodegen.load_import_fromc                 C   sX   t jdkr!t||}|d jdksJ td|d}|d| |S | |td|dgS )Nr   ZPRECALLZKW_NAMESrt   CALL_FUNCTION_KWr   )r   r   r   opnamer   insertrN   )r   nargsZkw_namesrk   r3   Zkw_names_instr   r   r    create_call_function_kw^  s   


z!PyCodegen.create_call_function_kw)NNNN)T)F)r   )*r"   r#   r$   __doc__r   nnModulestrr7   r>   r\   rP   rQ   rW   re   rl   rG   rn   rq   rr   rK   rz   ra   r   rN   r`   rU   rS   r   r   r   r   typesCodeTypeboolr   r   r   r
   r   rR   r   r   r   r   r    r'   +   s\    

Y



r'   )'r+   dataclassesrg   r   r   typingr   Ztorch.nnr   r   r   Zbytecode_transformationr   r   r   r   r	   r
   excr   rM   r   r   r   r   r   Zvariables.baser   Zvariables.nn_moduler   Zvariables.tensorr   r   r   r   r   	dataclassr   r'   r   r   r   r    <module>   s$     		