U
    §Ê¹jû  ã                   @   sê   U d dl Z d dl mZ e jjZd dlZd dlZd dlmZmZm	Z	m
Z
 d dlm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jƒdee	ee  e	e eedœdd„ƒZeejjƒdeeedœdd„ƒZdS )é    N)ÚTensor)ÚDictÚListÚOptionalÚSet)ÚNumberÚdecomposition_tableÚfunction_name_setc                 C   s`   t j}t  | ¡}|j ¡ D ]&}|j|kstd|j› d| j› �ƒ‚q|j|ks\td| j› �ƒ‚d S )NzNo signature on param z for function z"No return annotation for function )	ÚinspectÚ_emptyÚ	signatureÚ
parametersÚvaluesÚ
annotationÚAssertionErrorÚnameÚreturn_annotation)ÚfÚinspect_emptyÚsigÚparam© r   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/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   )
Zdecomposition_sigZ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jjƒst‚| jtks8td| j› �ƒ‚t | j¡ tj	 
| ¡}tj |j¡ tdƒD ] }tj |j¡ tj |j¡ qf|ˆtˆ jƒ< | S )NzDuplicated function name é   )r   Ú
isinstanceÚtorchZ_opsZ
OpOverloadr   Ú__name__r	   ÚaddÚjitÚscriptZ_CZ_jit_pass_inlineÚgraphÚrangeZ_jit_pass_peepholeZ_jit_pass_constant_propagationÚstrZ_schema)r   Zscripted_funcÚ_©Úaten_opÚregistryr   r   Údecomposition_decorator<   s    ÿ
þz7register_decomposition.<locals>.decomposition_decoratorr   )r/   r0   r1   r   r.   r   Úregister_decomposition;   s    r2   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’t	|d ƒ}
n8t |t
ƒrªt	|| ƒ}
n t |t	ƒrÂt	|ƒ| }
ntdƒ‚|	td|
ƒ S )Nr   é   Tzcorrection must be int or float)r$   ÚtupleÚlistr   ZnumelÚshapeÚatenÚmeanÚsumÚfloatÚintÚRuntimeErrorÚmax)r3   r4   r5   r6   Zdim_iÚnr=   ÚsubÚsqr>   Údenomr   r   r   Úvar_decompositionY   s(    


rG   T)r3   Úunbiasedr7   c                 C   s   t | |rdndd�S )Nr8   r   )r5   )rG   )r3   rH   r   r   r   Úvar}   s    rI   )N)NNF)T)r%   r   Zopsr<   r
   r   Útypingr   r   r   r   Ztorch.typesr   r   r,   r(   ZScriptFunctionÚ__annotations__Úsetr	   r   r"   r2   rI   r5   r@   ÚboolrG   r    r   r   r   r   Ú<module>   s2    

   ü
û#
