a
    d@                     @   s.  d dl Z 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 d dl	Z	ddl
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mZmZ d	d
lmZmZ dddZdd Zdd ZG dd deZG dd deZ G dd de Z!G dd de!Z"G dd de Z#dd Z$G dd deZ%dS )     N)DictList   )	variables)create_instruction)unimplemented)
AttrSourceConstantSourceDefaultsSourceGetItemSource)istensoristype	make_cell   )typestrVariableTrackerc                    sp  d vsJ dt |trBtj fdd| D tfi  S t |ttfrtjt	|}| fdd|D fi  S tj
|st|tjtjtjfrtj
|fi  S t |tjrtj|fd|i S t |tj rtj|fd|i S t |t	tjfr"tj|fd|i S t|rPddlm} |fd|i |S t |tshJ t||S d S )	NsourcezOSource needs to be separate from options due to recursive calls for lists/dictsc                    s*   i | ]"\}}|t | t|d ddqS r   Nr   wrap_bound_arggetattr.0kvoptionstx j/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/_dynamo/variables/functions.py
<dictcomp>   s   z"wrap_bound_arg.<locals>.<dictcomp>c              
      s$   g | ]}t | t|d ddqS r   r   r   xr   r   r    
<listcomp>%   s   z"wrap_bound_arg.<locals>.<listcomp>r   VariableBuilder)
isinstancedictr   ConstDictVariableitemstuplelistZBaseListVariableZcls_fortypeZConstantVariableZ
is_literalr   torchSizeZdeviceZdtypetypesFunctionTypeUserFunctionVariableenumEnumZEnumVariableabcABCMetaUserDefinedClassVariabler   Ztorch._dynamo.variables.builderr&   r   r   )r   valr   r   clsr&   r   r   r    r      sJ    

r   c                 C   s8   t | D ]&\}}t|ttfrt| ||||< qd S N)r,   r*   r'   r+   r(   r   )r   resultr   r   r   r   r   r    wrap_args_kwargs?   s    r<   c                 C   sH   t  }| jj}|jD ].}| ||< ||v r||| || q|S r:   )r(   outputside_effectsco_cellvarsZtrack_cell_new
store_cellpop)parentr;   codeclosure_cellsr>   namer   r   r    init_cellvarsF   s    
rF   c                   @   s>   e Zd Zdd Zdd Zddddd	d
Zdd Zdd ZdS )BaseUserFunctionVariablec                 C   s
   |   jS r:   )get_codeco_filenameselfr   r   r    get_filenameS   s    z%BaseUserFunctionVariable.get_filenamec                 C   s
   |   jS r:   )rH   co_namerJ   r   r   r    get_nameV   s    z!BaseUserFunctionVariable.get_nameList[VariableTracker]Dict[str, VariableTracker]r   argskwargsreturnc                 C   s   | | t|  t| |S r:   )Zinline_user_function_returnr,   	self_args)rK   r   rR   rS   r   r   r    call_functionY   s    z&BaseUserFunctionVariable.call_functionc                 C   s   t t|  jS r:   )leninspect	signatureget_function
parametersrJ   r   r   r    num_parameters`   s    z'BaseUserFunctionVariable.num_parametersc                 C   s   i S r:   r   )rK   r   r   r   r    closure_varsc   s    z%BaseUserFunctionVariable.closure_varsN)__name__
__module____qualname__rL   rN   rV   r\   r]   r   r   r   r    rG   R   s   rG   c                       sx   e Zd ZdZd f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dd fddZ  ZS )r2   z-Some unsupported user-defined global functionFc                    s   t  jf i | t|ddr&d| _nd| _t|tjtjj	fsXJ dt
| d| t|d|}t|ddrt|d|}|| _d S )	NZ_dynamo_marked_constantFTzexpected FunctionType found  Z_torchdynamo_inlineZ__script_if_tracing_wrapperZ__original_fn)super__init__r   is_constantr'   r0   r1   r.   ZjitZScriptFunctionr   rX   getattr_staticfn)rK   rf   rd   rS   	__class__r   r    rc   j   s    zUserFunctionVariable.__init__c                 C   s   g S r:   r   rJ   r   r   r    rU   |   s    zUserFunctionVariable.self_argsc                 C   s   | j S r:   )rf   rJ   r   r   r    rZ      s    z!UserFunctionVariable.get_functionc                 C   s   | j jS r:   )rf   __code__rJ   r   r   r    rH      s    zUserFunctionVariable.get_codec                 C   s   t jS r:   )r0   r1   rJ   r   r   r    python_type   s    z UserFunctionVariable.python_typec                 C   s   t | jdd d uS )N__self__)r   rf   rJ   r   r   r    has_self   s    zUserFunctionVariable.has_selfc                 C   s   | j jS r:   )rf   __globals__rJ   r   r   r    get_globals   s    z UserFunctionVariable.get_globalsc              
      sT  j r
J tg}|jj}tjt||dj}|j	p<g }fddt
|D }t|j|j|jtfddt||D |j}	|jrfdd|jD   fdd|j D |	_t|	j|i |}
|
  t|
j }t||| t|||j}jjpd}t|tjjjks,J tt  jjj|D ]\}}}|d	krj!rlt"j!d	nd }t#j$|j%|d
||< n|&||}|d ur|||< nj!r@ddl'm(} |jj)}||v r|| }n`t*t"j!d|}t"|d}||||j%}|+ |j,vr|||< qB|-||}|.|| |||< nt/d qB||fS )N)r   r   c                    s*   g | ]"\}} j d u rd n
t j |qS r:   r   r
   )r   idx_rJ   r   r    r$      s   z2UserFunctionVariable.bind_args.<locals>.<listcomp>c                    s   g | ]\}} ||d qS )r8   r   r   )r   argr   )wrapr   r    r$      s   c                    s,   i | ]$}| j d u rd nt j |ddqS )NT)Zis_kwro   )r   r   rJ   r   r    r!      s
   z2UserFunctionVariable.bind_args.<locals>.<dictcomp>c                    s"   i | ]\}}|| | d qS rr   r   r   )kwdefaults_sourcesrt   r   r    r!      s   r   rh   r   r   r%   __closure__cell_contentszinline with __closure__)0rd   r   	propagater=   root_tx	functoolspartialr   rf   __defaults__	enumerater0   r1   ri   rm   r^   r+   ziprv   __kwdefaults__r*   rX   rY   bindapply_defaultsr(   	argumentsr<   rF   rW   co_freevars	itertoolscountr   r   r   r7   rw   Zmatch_nested_cellZbuilderr&   r>   r   rE   Zmutated_closure_cell_contentsZtrack_cell_existingr@   r   )rK   rB   rR   rS   r   r   rf   defaultsZdefaults_sourcesZ	fake_funcboundr;   rD   closurerp   rE   cellr   varr&   r>   outZclosure_cellZclosure_cell_contentsZcontents_varr   )ru   rK   rt   r    	bind_args   s    










zUserFunctionVariable.bind_argsc                 C   s   d S r:   r   )rK   rB   childr   r   r    export_freevars   s    z$UserFunctionVariable.export_freevarsrO   rP   r   rQ   c                    s@   | j r0t| || }t|| j|  |||S t |||S r:   )	rd   r   rx   valuesinvoke_and_store_as_constantrf   rN   rb   rV   )rK   r   rR   rS   r   rg   r   r    rV      s    z"UserFunctionVariable.call_function)F)r^   r_   r`   __doc__rc   rU   rZ   rH   rj   rl   rn   r   r   rV   __classcell__r   r   rg   r    r2   g   s   ir2   c                       sZ   e Zd ZdZ fddZdd Zdd Zdd	 Zd
ddd fddZ fddZ	  Z
S )UserMethodVariablez$Some unsupported user-defined methodc                    s    t  jf d|i| || _d S )Nrf   )rb   rc   obj)rK   rf   r   rS   rg   r   r    rc   	  s    zUserMethodVariable.__init__c                 C   s   | j j d| j d| j dS )N(z, ))rh   r^   rf   r   rJ   r   r   r    __str__  s    zUserMethodVariable.__str__c                 C   s   | j gS r:   )r   rJ   r   r   r    rU     s    zUserMethodVariable.self_argsc                 C   s   t jS r:   )r0   
MethodTyperJ   r   r   r    rj     s    zUserMethodVariable.python_typerO   rP   r   rQ   c                    sf   t | jtjrVt| jdd}|d ur.|ds4| jrV| jj|| jj	||| jd
| S t |||S )Nr_    z	torch.nn.)Zconstant)r'   r   r   ZNNModuleVariabler   rf   
startswithrd   Zcall_methodr^   add_optionsrb   rV   )rK   r   rR   rS   Zmodule_attrrg   r   r    rV     s    z UserMethodVariable.call_functionc                    s   t   d S )Nr   )rb   r\   rJ   rg   r   r    r\   %  s    z!UserMethodVariable.num_parameters)r^   r_   r`   r   rc   r   rU   rj   rV   r\   r   r   r   rg   r    r     s   r   c                       s2   e Zd Z fddZdddd fddZ  ZS )	WrappedUserMethodVariablec                    sB   | dd  | dd  t j|j|jfi | || _|| _d S Nrf   r   )rA   rb   rc   rf   r   wrappedcontextrK   r   r   rS   rg   r   r    rc   *  s
    z"WrappedUserMethodVariable.__init__rO   rP   r   rQ   c                    s,   | j | t |||}| j | |S r:   r   Zenterrb   rV   exitrK   r   rR   rS   r;   rg   r   r    rV   1  s    z'WrappedUserMethodVariable.call_functionr^   r_   r`   rc   rV   r   r   r   rg   r    r   )  s   r   c                       s2   e Zd Z fddZdddd fddZ  ZS )	WrappedUserFunctionVariablec                    s>   | dd  | dd  t j|jfi | || _|| _d S r   )rA   rb   rc   rf   r   r   r   rg   r   r    rc   ;  s
    z$WrappedUserFunctionVariable.__init__rO   rP   r   rQ   c                    s,   | j | t |||}| j | |S r:   r   r   rg   r   r    rV   B  s    z)WrappedUserFunctionVariable.call_functionr   r   r   rg   r    r   :  s   r   c                    s\   dd   fdd|D } fdd|  D }||i |}| jj||fdt|i|S )Nc                 S   s   t | tjr|  S |  S r:   )r'   r   ZTensorVariableZget_real_valueas_python_constant)r#   r   r   r    convertL  s    z-invoke_and_store_as_constant.<locals>.convertc                    s   g | ]} |qS r   r   r"   r   r   r    r$   Q      z0invoke_and_store_as_constant.<locals>.<listcomp>c                    s   i | ]\}}| |qS r   r   r   r   r   r    r!   R  r   z0invoke_and_store_as_constant.<locals>.<dictcomp>r   )r*   r=   Zregister_attr_or_moduler	   )r   rf   rE   r   rR   rS   resr   r   r    r   K  s    r   c                       sd   e Zd Z f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  ZS )NestedUserFunctionVariablec	           
         s   t  jf i |	 t| ts$J t| tjs8J t|tsFJ || _|| _	|| _
|| _|| _|| _|| _|d u r|d }|| _d S r:   )rb   rc   r'   r   strr0   CodeTyper(   fn_namerC   	f_globalsr   
kwdefaultsannotationsr   closure_scope)
rK   r   rC   r   r   r   r   r   r   rS   rg   r   r    rc   ]  s    z#NestedUserFunctionVariable.__init__c                 C   s   g S r:   r   rJ   r   r   r    rU   x  s    z$NestedUserFunctionVariable.self_argsc                 C   s
   | j  S r:   )rC   r   rJ   r   r   r    rH   {  s    z#NestedUserFunctionVariable.get_codec                 C   s   | j rt t| j | j| j }| jr:| j |_	| j
rL| j
 |_| jr| j }t|tr~ddlm} t||}t|tsJ ||_|S )Nr   )pairwise)r   NotImplementedErrorr0   r1   rC   r   r   r   r   r|   r   r   r   r'   r+   r   r   r(   __annotations__)rK   funcr   r   r   r   r    rZ   ~  s&    

z'NestedUserFunctionVariable.get_functionc                 C   s
   | j d uS r:   )r   rJ   r   r   r    has_closure  s    z&NestedUserFunctionVariable.has_closurec                 C   s   dS )NFr   rJ   r   r   r    rl     s    z#NestedUserFunctionVariable.has_selfc                 C   s   | j S r:   )r   rJ   r   r   r    rn     s    z&NestedUserFunctionVariable.get_globalsc                 C   s  |   }t|| j| j | jr,t| jjnd tdd t	t
|   jD }| jr`| jj|_t|j|i |}|  t|j }t|jj|t|  t|||}t|jD ]@\}	}
t| jj|	 |
|
|
ksJ |
|vsJ | jj|	 ||
< q||fS )Nc                 s   s   | ]}t d V  qd S r:   )r   )r   rq   r   r   r    	<genexpr>  r   z7NestedUserFunctionVariable.bind_args.<locals>.<genexpr>)rH   r0   r1   r   r   r   r   r+   r*   rangerW   r   r   r   rX   rY   r   r   r(   r   r<   r=   ry   r   rx   rF   r}   r   r   )rK   rB   rR   rS   rC   r   r   r;   rD   rp   rE   r   r   r    r     s(    
z$NestedUserFunctionVariable.bind_argsc                 C   s2   |   }|jD ]}||jv r|j| |j|< qd S r:   )rH   r   Zsymbolic_locals)rK   rB   r   rC   r   r   r   r    r     s    

z*NestedUserFunctionVariable.export_freevarsc                 C   s   d}| j r|dO }|| j  | jr4|dO }|| j t| jtjsPt| jtjr|dO }zRt| jtjrdd | jj D }ntdd | jjD }|	|
|g W n ty   || j Y n0 | jr|d	O }|| j || j || j td
|gS )Nr   r   r      c                 S   s   i | ]\}}||  qS r   r   r   r   r   r    r!     s   z:NestedUserFunctionVariable.reconstruct.<locals>.<dictcomp>c                 S   s   g | ]}|  qS r   r   )r   r   r   r   r    r$     r   z:NestedUserFunctionVariable.reconstruct.<locals>.<listcomp>   MAKE_FUNCTION)r   r   r'   r   r   r)   ZTupleVariabler*   r+   Zextend_outputZ_create_load_constr   r   rC   r   r   )rK   Zcodegenflagsr   r   r   r    reconstruct  s8    





z&NestedUserFunctionVariable.reconstruct)r^   r_   r`   rc   rU   rH   rZ   r   rl   rn   r   r   r   r   r   r   rg   r    r   \  s   r   )N)&r5   r3   rz   rX   r   r0   typingr   r   r.   r   r   Zbytecode_transformationr   excr   r   r   r	   r
   r   utilsr   r   r   baser   r   r   r<   rF   rG   r2   r   r   r   r   r   r   r   r   r    <module>   s0   
,  #