o
    H&i5(                     @   s|  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(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Dict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   LC:\wamp64\www\opt\env\Lib\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_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      
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:   r>   r/   r0   )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 )Nr:   r=   r@   )r?   r:   r@   r/   r0   r   r   r   r   r@   M   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   )r?   r:   r   r/   r0   builtinsgetattrrA   r   r   r   r   R      zMetaProxy.shapec                 C   rB   )Nr:   r,   dtype)r?   r:   rF   r/   r0   rC   rD   rA   r   r   r   rF   X   rE   zMetaProxy.dtypec                 C   s
   t | dS )Nr   )MetaDeviceAttributerA   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__r   )__name__
__module____qualname__r;   r>   r@   propertyr   rF   r   rK   r   r   r   r   r9   D   s    



r9   c                   @   s.   e Zd ZdefddZedd Zdd ZdS )	rI   attrc                 C   s   || _ || _|j| _d | _d S r   )rootrP   r/   _node)r   rQ   rP   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,   )rR   r/   r0   rD   rQ   rP   r-   rA   r   r   r   r-   s   s   
zMetaAttribute.nodec                 O   s   | j d| j| jf| |S )Nr=   )r/   r0   rP   rQ   )r   r1   r2   r   r   r   __call__{   s   zMetaAttribute.__call__N)rL   rM   rN   strrS   rO   r-   rT   r   r   r   r   rI   k   s
    
rI   c                   @   s   e Zd ZdS )rG   N)rL   rM   rN   r   r   r   r   rG   ~   s    rG   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 r:   z*MetaProxy does not have an associated meta)	r$   rG   r
   r%   r&   r9   typer?   r:   r'   r   r   r   proxys_to_metas   s   
rW   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rdt|	d ||	dd  i |
}np|dkrt| d	soJ 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: )superr0   	meta_argsr;   orig_fnsr
   r%   r-   r.   rW   r#   getrD   r?   _disable_module_getattrrQ   Zget_submodulerV   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      sZ   
"
&zMetaTracer.create_proxyc                    s    t | ddr|S t  |||S )Nrd   F)rD   r`   )r   rP   Zattr_valZparameter_proxy_cacherp   r   r   rD      s   zMetaTracer.getattrc                    s   || _ t ||||S r   )r^   r`   r]   )r   mforwardr1   r2   rp   r   r   r]      s   zMetaTracer.call_modulerm   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\   )rq   rL   lowerr?   rQ   Z
add_module)r   rm   idxmod_namepathr   r   r   _insert_module_as_submodule   s   z&MetaTracer._insert_module_as_submodulec              
      sx   zt  |W S  ty; } z(| jr6tt| dkr6tt| dkr6| |}|| _	|W  Y d }~S  d }~ww )Nr   )
r`   path_of_module	NameErrorrY   lenlist
parametersbuffersrz   Zprev_module)r   rm   ro   ry   rp   r   r   r{      s   .
zMetaTracer.path_of_modulec                 C   s
   t || S r   )r9   )r   r-   r   r   r   r*      r<   zMetaTracer.proxyra   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   )r8   rD   r
   ).0r4   r   r   r   
<dictcomp>   s    z$MetaTracer.trace.<locals>.<dictcomp>ra   )r$   dictra   _TORCH_METHODS_TO_PATCHZpatched_torch_methodssetrb   itemssetattrr
   addr`   traceZ_tracer_extras)	r   rQ   ra   concrete_argsrk   r5   origgraphru   rp   r   r   r      s$   
zMetaTracer.trace)NNNr   )rL   rM   rN   rY   bool__annotations__r   r0   rD   r]   r
   nnModulerU   rz   r{   r*   r   rf   r   __classcell__r   r   rp   r   rX      s   
 ;
&rX   rQ   .ra   r   rt   c                 C   sF   t  }|| ||}t| tjjr| jjn| j}tj	|j
||}|S r   )rX   r   r$   r
   r   r   rq   rL   r%   GraphModulerQ   )rQ   ra   r   r/   r   rk   Zgmr   r   r   symbolic_trace  s
   r   )F)NN)*r
   Ztorch.fxrh   r6   rC   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   rI   rG   rW   ZTracerrX   r   rU   rf   r   r   r   r   r   r   <module>   sH   
 


'	|