U
    9%e)'                     @   sr  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&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|j| jjd fddiS )Ndevicemeta)torchemptyshapeweightselfinput r   `/var/www/html/Darija-Ai-API/env/lib/python3.8/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t d| S )Nz<dont support inplace functional.relu for metatensor analysisAssertionError)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 ks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 k	rJ jd| |S | |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)r4   r5   r   r3   r   gen_constructor_wrapper2   s    r8   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 k	r*| jj|r$|gng  S | jdd|r@| |fn| fi S )Nr:   call_methodsize)hasattrr:   r=   r/   r0   )r   dimr   r   r   r=   H   s    zMetaProxy.sizec                 C   s2   t | dr| jd k	r| j S | jdd| fi S )Nr:   r<   r?   )r>   r:   r?   r/   r0   r   r   r   r   r?   M   s    
zMetaProxy.dimc                 C   s4   t | dr| jd k	r| jjS | jdtj| dfi S )Nr:   r,   r   )r>   r:   r   r/   r0   builtinsgetattrr@   r   r   r   r   R   s    zMetaProxy.shapec                 C   s4   t | dr| jd k	r| jjS | jdtj| dfi S )Nr:   r,   dtype)r>   r:   rC   r/   r0   rA   rB   r@   r   r   r   rC   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 )Nr:   )__getattribute__MetaAttribute)r   kr   r   r   __getattr__d   s    
zMetaProxy.__getattr__)N)__name__
__module____qualname__r;   r=   r?   propertyr   rC   r   rH   r   r   r   r   r9   D   s   



r9   c                   @   s.   e Zd ZedddZedd Zdd ZdS )	rF   )attrc                 C   s   || _ || _|j| _d | _d S r   )rootrM   r/   _node)r   rN   rM   r   r   r   __init__l   s    zMetaAttribute.__init__c                 C   s.   | j d kr(| jdt| j| jfi j| _ | j S )Nr,   )rO   r/   r0   rB   rN   rM   r-   r@   r   r   r   r-   s   s    
zMetaAttribute.nodec                 O   s   | j d| j| jf| |S )Nr<   )r/   r0   rM   rN   )r   r1   r2   r   r   r   __call__{   s    zMetaAttribute.__call__N)rI   rJ   rK   strrP   rL   r-   rQ   r   r   r   r   rF   k   s   
rF   c                   @   s   e Zd ZdS )rD   N)rI   rJ   rK   r   r   r   r   rD   ~   s   rD   c                 C   sT   t | trdS t | tjjrPt | ts8tdt|  t| dsJtd| j	S | S )Nr	   zExpected MetaProxy but got r:   z*MetaProxy does not have an associated meta)
r$   rD   r
   r%   r&   r9   r   typer>   r:   r'   r   r   r   proxys_to_metas   s    
rT   c                       s   e Zd ZU dZeed< dddddg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_modsZarangeZzerosZonesZ	full_likeeyeNc                    s  t  |||||||}|dkr>|| jkr>|| j|  |S || jkrXd|krXd|d< zdtjj|t	}	tjj|t	}
|dkrt
||}||	|
}n|dkrt|	d ||	dd  |
}n|dkr0t| d	std
| _zD| j|}t|}|t
krt
| |f|	|
}n| j|	|
}W 5 d| _X nj|dkrd
| _zH| j}|d}|D ]}t||}qVt|tjszt|jdd}W 5 d| _X n|W S t|tjjstd|| W n@ tk
r } z td| d| d|  W 5 d }~X Y nX |S )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: )superr0   	meta_argsr;   orig_fnsr
   r%   r-   r.   rT   r#   getrB   r>   r   _disable_module_getattrrN   Zget_submodulerS   r[   splitr$   Tensorr   r&   	Exceptionwarningswarn)r   kindr4   r1   r2   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   r0      sR    






.zMetaTracer.create_proxyc                    s$   t | ddr|S t  |||S d S )Nra   F)rB   r]   )r   rM   Zattr_valZparameter_proxy_cacherm   r   r   rB      s    zMetaTracer.getattrc                    s   || _ t ||||S r   )r[   r]   rZ   )r   mforwardr1   r2   rm   r   r   rZ      s    zMetaTracer.call_module)rj   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   _rY   )rn   rI   lowerr>   rN   Z
add_module)r   rj   idxmod_namepathr   r   r   _insert_module_as_submodule   s    
z&MetaTracer._insert_module_as_submodulec              
      s   zt  |W S  tk
r| } zP| jrjtt| dkrjtt| dkrj| |}|| _	| W Y S  W 5 d }~X Y nX d S )Nr   )
r]   path_of_module	NameErrorrV   lenlist
parametersbuffersrw   Zprev_module)r   rj   rl   rv   rm   r   r   rx      s    .
zMetaTracer.path_of_modulec                 C   s
   t || S r   )r9   )r   r-   r   r   r   r*      s    zMetaTracer.proxy)r^   c           	         s   t |tst|| _dd | jD | _t | _| j D ]$\}\}}t	t
|| | j| q8z t ||}d|i|_|W S | j D ]\}\}}t	t
|| qX d S )Nc                 S   s   i | ]}|t tt|qS r   )r8   rB   r
   ).0r4   r   r   r   
<dictcomp>   s     z$MetaTracer.trace.<locals>.<dictcomp>r^   )r$   dictr   r^   _TORCH_METHODS_TO_PATCHZpatched_torch_methodssetr_   itemssetattrr
   addr]   traceZ_tracer_extras)	r   rN   r^   concrete_argsrh   r5   origrr   graphrm   r   r   r      s    
zMetaTracer.trace)NNN)N)rI   rJ   rK   rV   bool__annotations__r   r0   rB   rZ   r
   nnModulerR   rw   rx   r*   r   rc   r   __classcell__r   r   rm   r   rU      s   
;
rU   .)rN   r^   r   rq   c                 C   sF   t  }|| ||}t| tjjr*| jjn| j}tj	|j
||}|S r   )rU   r   r$   r
   r   r   rn   rI   r%   GraphModulerN   )rN   r^   r   r/   r   rh   Zgmr   r   r   symbolic_trace  s
    r   )F)NN)*r
   Ztorch.fxre   r6   rA   typingr   r   r   r   r   r   r   r   r   r   r    r"   r   Z	EmbeddingZ	LayerNormZreluZ
functionalZReLUwhereabsr#   r   r8   r%   r&   r9   rF   rD   rT   ZTracerrU   r   rR   rc   r   r   r   r   r   r   <module>   sR    
       
'	|   