a
    d'                     @   sn  U 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	m
Z
 dd Zdd Zdd Zd	d
 Zd$ddZdd ZddddZe jjee jjee jee jjjee jjee jee jeiZeeef ed< dd ZG dd de jjZG dd deZ G dd de Z!dd Z"G dd de jj#Z$d%e
e jj%ed ef f ee&e j'f e	ee&ef  e jj(d!d"d#Z)dS )&    N)AnyCallableDictOptionalUnionc                 C   s$   t jg |j| jjd R ddiS )Ndevicemeta)torchemptyshapeZweightselfinput r   j/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/fx/experimental/meta_tracer.pyembedding_override	   s    r   c                 C   s   |S Nr   r   r   r   r   nn_layernorm_override   s    r   c                 C   s   | S r   r   )xr   r   r   torch_relu_override   s    r   c                 C   s   |S r   r   )r   r   r   r   r   torch_nn_relu_override   s    r   Fc                 C   s   |rJ d| S )Nz<dont support inplace functional.relu for metatensor analysisr   )r   Zinplacer   r   r   functional_relu_override   s    r   c                 C   s$   | j dd|j dd |j dd S )Nr	   r   )to)	conditionr   yr   r   r   torch_where_override   s    r   )outc                C   s   |d u sJ d| S )Nz1Dont support in-place abs for MetaTensor analysisr   )r   r   r   r   r   torch_abs_override$   s    r   manual_meta_overridesc                    s   t   fdd}| fS )Nc                     s\   d   fdd}t jj| | t jj||  d urJ jd| |S | i |S d S )Nc                    s   t | tjjr|  d S r   )
isinstancer
   fxProxyvproxyr   r   check_has_proxy7   s    zAgen_constructor_wrapper.<locals>.wrapper.<locals>.check_has_proxycall_function)r
   r"   nodemap_aggregatetracercreate_proxy)argskwargsr(   targetr&   r   wrapper3   s    z(gen_constructor_wrapper.<locals>.wrapper)	functoolswraps)r1   r2   r   r0   r   gen_constructor_wrapper2   s    r5   c                   @   sR   e Zd Zdd ZdddZdd Zedd	 Zed
d Zedd Z	dd Z
dS )	MetaProxyc                 C   s
   || _ d S r   )_tensor_meta)r   Ztensor_metar   r   r   install_tensor_metaE   s    zMetaProxy.install_tensor_metaNc                 C   sJ   t | dr*| jd ur*| jj|r$|gng  S | jdd|r@| |fn| fi S )Nr7   call_methodsize)hasattrr7   r:   r,   r-   )r   dimr   r   r   r:   H   s    zMetaProxy.sizec                 C   s2   t | dr| jd ur| j S | jdd| fi S )Nr7   r9   r<   )r;   r7   r<   r,   r-   r   r   r   r   r<   M   s    
zMetaProxy.dimc                 C   s4   t | dr| jd ur| jjS | jdtj| dfi S )Nr7   r)   r   )r;   r7   r   r,   r-   builtinsgetattrr=   r   r   r   r   R   s    zMetaProxy.shapec                 C   s4   t | dr| jd ur| jjS | jdtj| dfi S )Nr7   r)   dtype)r;   r7   r@   r,   r-   r>   r?   r=   r   r   r   r@   X   s    zMetaProxy.dtypec                 C   s
   t | dS )Nr   )MetaDeviceAttributer=   r   r   r   r   ^   s    zMetaProxy.devicec                 C   s   |dkr|  |S t| |S )Nr7   )__getattribute__MetaAttribute)r   kr   r   r   __getattr__d   s    
zMetaProxy.__getattr__)N)__name__
__module____qualname__r8   r:   r<   propertyr   r@   r   rE   r   r   r   r   r6   D   s   



r6   c                   @   s.   e Zd ZedddZedd Zdd ZdS )	rC   )attrc                 C   s   || _ || _|j| _d | _d S r   )rootrJ   r,   _node)r   rK   rJ   r   r   r   __init__l   s    zMetaAttribute.__init__c                 C   s.   | j d u r(| jdt| j| jfi j| _ | j S )Nr)   )rL   r,   r-   r?   rK   rJ   r*   r=   r   r   r   r*   s   s    
zMetaAttribute.nodec                 O   s   | j d| j| jf| |S )Nr9   )r,   r-   rJ   rK   )r   r.   r/   r   r   r   __call__{   s    zMetaAttribute.__call__N)rF   rG   rH   strrM   rI   r*   rN   r   r   r   r   rC   k   s   
rC   c                   @   s   e Zd ZdS )rA   N)rF   rG   rH   r   r   r   r   rA   ~   s   rA   c                 C   sT   t | trdS t | tjjrPt | ts8J dt|  t| dsJJ d| jS | S )Nr	   zExpected MetaProxy but got r7   z*MetaProxy does not have an associated meta)	r!   rA   r
   r"   r#   r6   typer;   r7   r$   r   r   r   proxys_to_metas   s    
rQ   c                       s   e Zd ZU dZeed< g dZd fdd	Z fddZ fd	d
Z	e
jjedddZe
jjed fddZdd Zdeee
jf d fddZ  ZS )
MetaTracerTallow_insert_stateless_mods)ZarangezerosZonesZ	full_likeZeyeNc                    s&  t  |||||||}|dkr>|| jv r>|| j|  |S || jv rXd|v rXd|d< ztjj|t	}	tjj|t	}
|dkrt
||}||	i |
}n|dkrt|	d ||	dd  i |
}n|dkrJt| d	sJ d
| _zT| j|}t|}|t
v r&t
| |g|	R i |
}n| j|	i |
}W d| _nd| _0 np|dkrd
| _zN| j}|d}|D ]}t||}qpt|tjsJ |jdd}W d| _nd| _0 n|W S t|tjjsJ d|| W nB ty  } z(td| d| d|  W Y d }~n
d }~0 0 |S )Nplaceholderr   r	   r)   r9   r      call_moduleorig_forwardTFZget_attr.r   z!Dont support composite output yetzCould not compute metadata for z target z: )superr-   	meta_argsr8   orig_fnsr
   r"   r*   r+   rQ   r    getr?   r;   _disable_module_getattrrK   Zget_submodulerP   rX   splitr!   Tensorr   r#   	Exceptionwarningswarn)r   kindr1   r.   r/   nameZ	type_exprZproxy_factory_fnrvZ
args_metasZkwargs_metasZmeta_targetZmeta_outmodmod_typeZattr_itrZatomsZatome	__class__r   r   r-      sR    
"



2zMetaTracer.create_proxyc                    s$   t | ddr|S t  |||S d S )Nr^   F)r?   rZ   )r   rJ   Zattr_valZparameter_proxy_cacherj   r   r   r?      s    zMetaTracer.getattrc                    s   || _ t ||||S r   )rX   rZ   rW   )r   mZforwardr.   r/   rj   r   r   rW      s    zMetaTracer.call_module)rg   returnc                 C   sT   d}|j j }| d| }t| j|rB| d| }|d7 }q| j|| |S )zb
        Helper method which tries to insert a module that was not declared as submodule.
        r   _rV   )rk   rF   lowerr;   rK   Z
add_module)r   rg   idxmod_namepathr   r   r   _insert_module_as_submodule   s    
z&MetaTracer._insert_module_as_submodulec              
      s   zt  |W S  ty } z\| jrltt| dkrltt| dkrl| |}|| _	|W  Y d }~S  W Y d }~n
d }~0 0 d S )Nr   )
rZ   path_of_module	NameErrorrS   lenlist
parametersbuffersrs   Zprev_module)r   rg   ri   rr   rj   r   r   rt      s    .
zMetaTracer.path_of_modulec                 C   s
   t || S r   )r6   )r   r*   r   r   r   r'      s    zMetaTracer.proxy)r[   c           	         s   t |tsJ || _dd | jD | _t | _| j D ]$\}\}}tt	|| | j
| q8z^t ||}d|i|_|W | j D ]\}\}}tt	|| qS ]\}\}}tt	|| qn&| j D ]\}\}}tt	|| q0 d S )Nc                 S   s   i | ]}|t tt|qS r   )r5   r?   r
   ).0r1   r   r   r   
<dictcomp>   s   z$MetaTracer.trace.<locals>.<dictcomp>r[   )r!   dictr[   _TORCH_METHODS_TO_PATCHZpatched_torch_methodssetr\   itemssetattrr
   addrZ   traceZ_tracer_extras)	r   rK   r[   concrete_argsre   r2   origgraphrn   rj   r   r   r      s(    
zMetaTracer.trace)NNN)N)rF   rG   rH   rS   bool__annotations__r}   r-   r?   rW   r
   nnModulerO   rs   rt   r'   r   r`   r   __classcell__r   r   rj   r   rR      s   
;
rR   .)rK   r[   r   rm   c                 C   sF   t  }|| ||}t| tjjr*| jjn| j}tj	|j
||}|S r   )rR   r   r!   r
   r   r   rk   rF   r"   GraphModulerK   )rK   r[   r   r,   r   re   Zgmr   r   r   symbolic_trace  s
    r   )F)NN)*r
   Ztorch.fxrb   r3   r>   typingr   r   r   r   r   r   r   r   r   r   r   r   r   Z	EmbeddingZ	LayerNormZreluZ
functionalZReLUwhereabsr    r   r5   r"   r#   r6   rC   rA   rQ   ZTracerrR   r   rO   r`   r   r   r   r   r   r   <module>   s@   



'	|  