o
    ei+                     @   s  U d dl Z d dlZd dlZd dlmZ d dl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)Callable)Any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   k/var/www/addictedbytheproject.nl/epg/venv/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t d| S )Nz<dont support inplace functional.relu for metatensor analysisAssertionError)r   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rt 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   wrapper<   s   z(gen_constructor_wrapper.<locals>.wrapper)	functoolswraps)r6   r7   r   r5   r   gen_constructor_wrapper;   s   r:   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   tensor_metar   r   r   install_tensor_metaQ      
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 )Nr<   call_methodsize)hasattrr<   rA   r1   r2   )r   dimr   r   r   rA   T   s   zMetaProxy.sizec                 C   s2   t | dr| jd ur| j S | jdd| fi S )Nr<   r@   rC   )rB   r<   rC   r1   r2   r   r   r   r   rC   [   s   
zMetaProxy.dimc                 C   4   t | dr| jd ur| jjS | jdtj| dfi S )Nr<   r.   r   )rB   r<   r   r1   r2   builtinsgetattrrD   r   r   r   r   `   
   zMetaProxy.shapec                 C   rE   )Nr<   r.   dtype)rB   r<   rI   r1   r2   rF   rG   rD   r   r   r   rI   h   rH   zMetaProxy.dtypec                 C   s
   t | dS )Nr   )MetaDeviceAttributerD   r   r   r   r   p   s   
zMetaProxy.devicec                 C   s   |dkr	|  |S t| |S )Nr<   )__getattribute__MetaAttribute)r   kr   r   r   __getattr__v   s   

zMetaProxy.__getattr__r   )__name__
__module____qualname__r>   rA   rC   propertyr   rI   r   rN   r   r   r   r   r;   P   s    



r;   c                   @   s.   e Zd ZdefddZedd Zdd ZdS )	rL   attrc                 C   s   || _ || _|j| _d | _d S r   )rootrS   r1   _node)r   rT   rS   r   r   r   __init__   s   
zMetaAttribute.__init__c                 C   s.   | j d u r| jdt| j| jfi j| _ | j S )Nr.   )rU   r1   r2   rG   rT   rS   r/   rD   r   r   r   r/      s   
zMetaAttribute.nodec                 O   s   | j d| j| jf| |S )Nr@   )r1   r2   rS   rT   )r   r3   r4   r   r   r   __call__   s   zMetaAttribute.__call__N)rO   rP   rQ   strrV   rR   r/   rW   r   r   r   r   rL   ~   s
    
	rL   c                   @   s   e Zd ZdS )rJ   N)rO   rP   rQ   r   r   r   r   rJ      s    rJ   c                 C   sT   t | trdS t | tjjr(t | tstdt|  t| ds%td| j	S | S )Nr   zExpected MetaProxy but got r<   z*MetaProxy does not have an associated meta)
r&   rJ   r	   r'   r(   r;   r   typerB   r<   r)   r   r   r   proxys_to_metas   s   


rZ   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)arangezerosones	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 |
}ny|dkrt| d	sstd
d| _z)| j|}t|}|t
v rt
| |g|	R i |
}n| j|	i |
}W d| _n?d| _w |dkrd| _z,| j}|d}|D ]}t||}qt|tjstdt| |jdd}W d| _nd| _w |W S t|tjjst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_forwardz$orig_forward not set for call_moduleTFget_attr.zExpected Tensor, got r   z!Dont support composite output yetzCould not compute metadata for z target z: )superr2   	meta_argsr>   orig_fnsr	   r'   r/   r0   rZ   r%   getrG   rB   r   _disable_module_getattrrT   get_submodulerY   re   splitr&   Tensorr   r(   	Exceptionwarningswarn)r   kindr6   r3   r4   name	type_exprproxy_factory_fnrv
args_metaskwargs_metasmeta_targetmeta_outmodmod_typeattr_itratomsatome	__class__r   r   r2      s~   



&zMetaTracer.create_proxyc                    s    t | ddr|S t  |||S )Nrl   F)rG   rh   )r   rS   attr_valparameter_proxy_cacher   r   r   rG      s   zMetaTracer.getattrc                    s   || _ t ||||S r   )re   rh   rd   )r   mforwardr3   r4   r   r   r   rd     s   zMetaTracer.call_moduler|   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   _rc   )r   rO   lowerrB   rT   
add_module)r   r|   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   )
rh   path_of_module	NameErrorr\   lenlist
parametersbuffersr   prev_module)r   r|   r   r   r   r   r     s   
zMetaTracer.path_of_modulec                 C   s
   t || S r   )r;   )r   r/   r   r   r   r,   $  r?   zMetaTracer.proxyri   c           	         s   t |tstdt| || _dd | jD | _t | _| j	 D ]\}\}}t
t|| | j| q#z!t ||}d|i|_|W | j	 D ]\}\}}t
t|| qJS | j	 D ]\}\}}t
t|| q]w )Nz!Expected dict for meta_args, got c                 S   s   i | ]
}|t tt|qS r   )r:   rG   r	   ).0r6   r   r   r   
<dictcomp>,  s    z$MetaTracer.trace.<locals>.<dictcomp>ri   )r&   dictr   rY   ri   _TORCH_METHODS_TO_PATCHpatched_torch_methodssetrj   itemssetattrr	   addrh   trace_tracer_extras)	r   rT   ri   concrete_argsrt   r7   origgraphr   r   r   r   r   '  s&   

zMetaTracer.trace)NNNr   )rO   rP   rQ   r\   bool__annotations__r   r2   rG   rd   r	   nnModulerX   r   r   r,   r   ro   r   __classcell__r   r   r   r   r[      s   
 T&r[   rT   .ri   r   r   c                 C   sF   t  }|| ||}t| tjjr| jjn| j}tj	|j
||}|S r   )r[   r   r&   r	   r   r   r   rO   r'   GraphModulerT   )rT   ri   r   r1   r   rt   gmr   r   r   symbolic_trace?  s   r   )F)NN)+rF   r8   rq   collections.abcr   typingr   r   r   r	   torch.fxr   r   r   r   r   r"   r$   r   	Embedding	LayerNormrelu
functionalReLUwhereabsr%   r   r   r:   r'   r(   r;   rL   rJ   rZ   Tracerr[   r   rX   ro   r   r   r   r   r   r   <module>   sP   


. 