U
    ©Ê¹j)'  ã                   @   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/bwave/python/venv/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rœt
 ||¡}||	|
Ž}nþ|dkrÂt|	d |ƒ|	dd … |
Ž}nØ|dk�r0t| d	ƒsÚt‚d
| _zD| j |¡}t|ƒ}|t
k�rt
| |f|	ž|
Ž}n| j|	|
Ž}W 5 d| _X nj|dk�r”d
| _zH| j}| d¡}|D ]}t||ƒ}�qVt|tjƒ�szt‚|jdd�}W 5 d| _X n|W S t|tjjƒ�s²t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
||ƒ qŠX 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    
       ù
'	|  þ þ