U
    d                     @   s   U d dl Z d dl mZ e jjZd dlmZmZmZmZ d dl	Z	d dl
mZ d dlZi Zeee jjf ed< e Zee ed< dd Zd	d
 ZdddZeejdeeee  ee eedddZeejdeeedddZdS )    N)Tensor)OptionalListDictSet)get_signature_for_torch_opdecomposition_tablefunction_name_setc                 C   s`   t j}t | }|j D ]$}|j|kstdj|j| jdq|j	|ks\tdj| jdd S )Nz0No signature on param {name} for function {func})namefuncz(No return annotation for function {func})r   )
inspect_empty	signature
parametersvalues
annotationAssertionErrorformatr
   return_annotation)finspect_emptysigparam r   =/tmp/pip-unpacked-wheel-ua33x9lu/torch/jit/_decompositions.py(check_decomposition_has_type_annotations   s    
r   c           
      C   s   | j }|j }t|t|kr dS t| | D ]z\}}tj}dD ]<}|dkrd|jdkrdtd t	||t	||krD  dS qD|j
}|j
}	||kr2|	|kr2||	kr2 dS q2| j|jkS )NF)r
   r   r
   selfz4PyTorch uses 'input' instead of 'self' on public api)r   lenzipr   r   r   r
   warningswarngetattrdefaultr   )
decomposition_sigtorch_op_sigZdecomp_paramsZ	op_paramsZdecomp_paramZop_paramr   fieldZdecomp_defaultZ
op_defaultr   r   r   signatures_match   s"    

r&   c                    s    fdd}|S )Nc           	         s   d krt t|  t dd\}}t| }d }t|D ]\}}t||r:|} qVq:|d k	sntdt|  | j	t
kstd| j	t
| j	 tj| }tj|j tdD ] }tj|j tj|j q|t|| < | S )NT)Zreturn_schemasz#Could not find matching signature: zDuplicated function name {}   )r   r   r   r   r   	enumerater&   r   str__name__r	   r   addtorchjitscriptZ_CZ_jit_pass_inlinegraphrangeZ_jit_pass_peepholeZ_jit_pass_constant_propagation)	r   Ztorch_op_sigsZtorch_op_schemasr#   Zfound_indexir$   Zscripted_func_aten_opregistryr   r   decomposition_decorator8   s(    

z7register_decomposition.<locals>.decomposition_decoratorr   )r4   r5   r6   r   r3   r   register_decomposition7   s     r7   F)inputdim
correctionkeepdimreturnc           
      C   s   |d krg }|}t |ttfr4t|dkr4|  }nd}|D ]}|| j| 9 }q<t| |d}| | }|| }t|||}	|d k	r|| }|	| S )Nr      T)	
isinstancetuplelistr   Znumelshapeatenmeansum)
r8   r9   r:   r;   Zdim_inrC   subsqrD   r   r   r   var_decomposition\   s    
rH   T)r8   unbiasedr<   c                 C   s   t | |rdnddS )Nr=   r   )r:   )rH   )r8   rI   r   r   r   vart   s    rJ   )N)NNF)T)r,   r   opsrB   typingr   r   r   r   r   Ztorch.fx.operator_schemasr   r   r   r)   r-   ZScriptFunction__annotations__setr	   r   r&   r7   rJ   intboolrH   r   r   r   r   <module>   s*    

%   