o
    Zh7)                     @   sx  U 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	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(d eejj%ed!ef f d"eee&ej'f  d#eee&ef  d$ejj(fd%d&Z)dS ))    N)AnyCallableOptionalUnionc                 C   s$   t jg |j| jjd R ddiS )Ndevicemeta)torchemptyshapeweightselfinput r   P/var/www/auris/lib/python3.10/site-packages/torch/fx/experimental/meta_tracer.pyembedding_override   s   $r   c                 C      |S Nr   r   r   r   r   nn_layernorm_override      r   c                 C   s   | S r   r   )xr   r   r   torch_relu_override   r   r   c                 C   r   r   r   )r   r   r   r   r   torch_nn_relu_override   r   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                     sX   d   fdd}t jj| | t jj||  d ur% jd| |S | i |S )Nc                    s   t | tjjr|  d S d S r   )
isinstancer	   fxProxyvproxyr   r   check_has_proxy;   s   zAgen_constructor_wrapper.<locals>.wrapper.<locals>.check_has_proxycall_function)r	   r$   nodemap_aggregatetracercreate_proxy)argskwargsr*   targetr(   r   wrapper7   s   z(gen_constructor_wrapper.<locals>.wrapper)	functoolswraps)r3   r4   r   r2   r   gen_constructor_wrapper6   s   r7   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_metaL      
zMetaProxy.install_tensor_metaNc                 C   sP   t | dr| jd ur| jj|r|g S g  S | jdd|r#| |fi S | fi S )Nr9   call_methodsize)hasattrr9   r=   r.   r/   )r   dimr   r   r   r=   O   s   zMetaProxy.sizec                 C   s2   t | dr| jd ur| j S | jdd| fi S )Nr9   r<   r?   )r>   r9   r?   r.   r/   r   r   r   r   r?   V   s   
zMetaProxy.dimc                 C   4   t | dr| jd ur| jjS | jdtj| dfi S )Nr9   r+   r   )r>   r9   r   r.   r/   builtinsgetattrr@   r   r   r   r   [   
   zMetaProxy.shapec                 C   rA   )Nr9   r+   dtype)r>   r9   rE   r.   r/   rB   rC   r@   r   r   r   rE   c   rD   zMetaProxy.dtypec                 C   s
   t | dS )Nr   )MetaDeviceAttributer@   r   r   r   r   k   s   
zMetaProxy.devicec                 C   s   |dkr	|  |S t| |S )Nr9   )__getattribute__MetaAttribute)r   kr   r   r   __getattr__q   s   

zMetaProxy.__getattr__r   )__name__
__module____qualname__r:   r=   r?   propertyr   rE   r   rJ   r   r   r   r   r8   K   s    



r8   c                   @   s.   e Zd ZdefddZedd Zdd ZdS )	rH   attrc                 C   s   || _ || _|j| _d | _d S r   )rootrO   r.   _node)r   rP   rO   r   r   r   __init__z   s   
zMetaAttribute.__init__c                 C   s.   | j d u r| jdt| j| jfi j| _ | j S )Nr+   )rQ   r.   r/   rC   rP   rO   r,   r@   r   r   r   r,      s   
zMetaAttribute.nodec                 O   s   | j d| j| jf| |S )Nr<   )r.   r/   rO   rP   )r   r0   r1   r   r   r   __call__   s   zMetaAttribute.__call__N)rK   rL   rM   strrR   rN   r,   rS   r   r   r   r   rH   y   s
    
	rH   c                   @   s   e Zd ZdS )rF   N)rK   rL   rM   r   r   r   r   rF      s    rF   c                 C   sT   t | trdS t | tjjr(t | tsJ dt|  t| ds%J d| jS | S )Nr   zExpected MetaProxy but got r9   z*MetaProxy does not have an associated meta)	r#   rF   r	   r$   r%   r8   typer>   r9   r&   r   r   r   proxys_to_metas   s   
rV   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	de
jjdefddZde
jjdef fddZdd Zddeee
jf f fddZ  ZS )
MetaTracerTallow_insert_stateless_mods)ZarangeZzerosZonesZ	full_likeeyeNc                    s  t  |||||||}|dkr|| jv r|| j|  |S || jv r,d|v r,d|d< ztjj|t	}	tjj|t	}
|dkrOt
||}||	i |
}n|dkrft|	d |}||	dd  i |
}np|dkrt| d	sqJ d
| _z)| j|}t|}|t
v rt
| |g|	R i |
}n| j|	i |
}W d| _n8d| _w |dkrd
| _z%| j}|d}|D ]}t||}qt|tjsJ |jdd}W d| _nd| _w |W S t|tjjsJ d|| W |S  ty
 } ztd| d| d|  W Y d }~|S d }~ww )Nplaceholderr   r   r+   r<   r      call_moduleorig_forwardTFZget_attr.r   z!Dont support composite output yetzCould not compute metadata for z target z: )superr/   	meta_argsr:   orig_fnsr	   r$   r,   r-   rV   r"   getrC   r>   _disable_module_getattrrP   Zget_submodulerU   r]   splitr#   Tensorr   r%   	Exceptionwarningswarn)r   kindr3   r0   r1   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/      sl   


&zMetaTracer.create_proxyc                    s    t | ddr|S t  |||S )Nrc   F)rC   r_   )r   rO   Zattr_valZparameter_proxy_cachero   r   r   rC      s   zMetaTracer.getattrc                    s   || _ t ||||S r   )r]   r_   r\   )r   mforwardr0   r1   ro   r   r   r\      s   zMetaTracer.call_modulerl   returnc                 C   s^   d}|j j }| d| }t| j|r&| d| }|d7 }t| j|s| j|| |S )zb
        Helper method which tries to insert a module that was not declared as submodule.
        r   _r[   )rp   rK   lowerr>   rP   Z
add_module)r   rl   idxmod_namepathr   r   r   _insert_module_as_submodule   s   z&MetaTracer._insert_module_as_submodulec                    sf   zt  |W S  ty2   | jr1tt| dkr1tt| dkr1| |}|| _	| Y S  w )Nr   )
r_   path_of_module	NameErrorrX   lenlist
parametersbuffersry   Zprev_module)r   rl   rx   ro   r   r   rz     s   
zMetaTracer.path_of_modulec                 C   s
   t || S r   )r8   )r   r,   r   r   r   r)     r;   zMetaTracer.proxyr`   c           	         s   t |tsJ || _dd | jD | _t | _| j D ]\}\}}tt	|| | j
| qz!t ||}d|i|_|W | j D ]\}\}}tt	|| qCS | j D ]\}\}}tt	|| qVw )Nc                 S   s   i | ]
}|t tt|qS r   )r7   rC   r	   ).0r3   r   r   r   
<dictcomp>  s    z$MetaTracer.trace.<locals>.<dictcomp>r`   )r#   dictr`   _TORCH_METHODS_TO_PATCHZpatched_torch_methodssetra   itemssetattrr	   addr_   traceZ_tracer_extras)	r   rP   r`   concrete_argsrj   r4   origgraphrt   ro   r   r   r     s$   
zMetaTracer.trace)NNNr   )rK   rL   rM   rX   bool__annotations__r   r/   rC   r\   r	   nnModulerT   ry   rz   r)   r   re   r   __classcell__r   r   ro   r   rW      s   
 I&rW   rP   .r`   r   rs   c                 C   sF   t  }|| ||}t| tjjr| jjn| j}tj	|j
||}|S r   )rW   r   r#   r	   r   r   rp   rK   r$   GraphModulerP   )rP   r`   r   r.   r   rj   Zgmr   r   r   symbolic_trace,  s   r   )F)NN)*rB   r5   rg   typingr   r   r   r   r	   Ztorch.fxr   r   r   r   r   r   r!   r   Z	EmbeddingZ	LayerNormZreluZ
functionalZReLUwhereabsr"   r   r   r7   r$   r%   r8   rH   rF   rV   ZTracerrW   r   rT   re   r   r   r   r   r   r   <module>   sN   


.
 