U
    <c<                      @   s  d dl Z d dlZd dlmZmZ d dlmZ d dlZd dl	Z	d dl
mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ eeeeeeeefZeeeeefZdgerdgng  ZG d	d
 d
eZ dd Z!dd Z"dd Z#dd Z$dd Z%dddZ&dS )    N)partialwraps)Sequence)	TEST_CUDA)_dispatch_dtypes	all_typesall_types_andall_types_and_complexall_types_and_complex_andall_types_and_halfcomplex_typesfloating_and_complex_typesfloating_and_complex_types_andfloating_typesfloating_types_andfloating_types_and_halfintegral_typesintegral_types_and)torch_to_numpy_dtype_dictcpucudac                   @   s   e Zd ZdS )_dynamic_dispatch_dtypesN)__name__
__module____qualname__ r   r   H/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/opinfo/utils.pyr   4   s   r   c           	      C   s   |dkst ts*|dkr*td tdS t }ttjtj	tj
D ]}z|| ||d}W n. tk
r   td| d|  Y qBY nX d}|D ]P}z| |jf|j|j W q tk
r } zd}W Y  qW 5 d }~X Y qX q|rB|| qBt|S )	N)r   r   r   zGWARNING: CUDA is not available, empty_dtypes dispatch will be returned!r   Fz.WARNING: Unable to generate sample for device:z and dtype:T)AssertionErrorr   warningswarnr   setr
   torchboolbfloat16ZhalfRuntimeErrorinputargskwargsadd)	opZsample_inputs_fnZdevice_typeZsupported_dtypesdtypeZsamples	supportedsamplerer   r   r   get_supported_dtypes9   s2    
r.   c                 C   s   t dd}t| dkr(|dtt S t| }tD ]&}t| |kr4|||jd   S q4d }d}tD ]2}t| }|	|sqht|}||krh|}|}qh|d kr|dt| S |t
|ftt| t|   |jttt| t|   S )Nreturn_typezdispatch_fn dispatch_fn_strr   r   z()g        )collections
namedtuplelenstrtupler    COMPLETE_DTYPES_DISPATCHr   EXTENSIBLE_DTYPE_DISPATCHissubsetr   )dtypesr/   Z
set_dtypesdispatchZchosen_dispatchZchosen_dispatch_scoreZdispatch_dtypesZscorer   r   r   dtypes_dispatch_hinta   s.    

r:   c                 C   s   | j S N)Zdynamic_dtypes)r)   r   r   r   is_dynamic_dtype_set   s    r<   c                 C   s&   dj | jt| jjt| jjd}|S )Nzv
        OpInfo({name},
               dtypes={dtypes},
               dtypesIfCUDA={dtypesIfCUDA},
        )
        )namer8   dtypesIfCUDA)formatr=   r:   r8   Zdispatch_fn_strr>   )r)   Zfmt_strr   r   r   str_format_dynamic_dtype   s    

r@   c                    s"   dd t   fdd}|S )Nc                 S   s"   | t jtt jt jt jt jt jfkS r;   )npZbool_r"   Zuint8Zint8Zint16Zint32Zint64)r*   r   r   r   is_integral   s    z=np_unary_ufunc_integer_promotion_wrapper.<locals>.is_integralc                    s,   t t  }| jr$ | |S  | S r;   )r   r!   Zget_default_dtyper*   Zastype)xZnp_dtypefnrB   r   r   
wrapped_fn   s    
z<np_unary_ufunc_integer_promotion_wrapper.<locals>.wrapped_fn)r   )rE   rF   r   rD   r   (np_unary_ufunc_integer_promotion_wrapper   s    	rG   Tc                    s"   t  tjd fdd}|S )aA  Wraps a NumPy reduction operator.

    The wrapper function will forward dim, keepdim, mask, and identity
    kwargs to the wrapped function as the NumPy equivalent axis,
    keepdims, where, and initiak kwargs, respectively.

    Args:
        f: NumPy reduction operator to wrap
        supports_keepdims (bool, optional): Whether the NumPy operator accepts
            keepdims parameter. If it does not, the wrapper will manually unsqueeze
            the reduced dimensions if it was called with keepdim=True. Defaults to True.

    Returns:
        Wrapped function

    )rC   c           
         s  t | }|dd }|dd}d|krft|tr>t|n|}| jdkr^|dkr^d |d< n||d< d|krzrz||d< d|kr|d}|d k	r|jtj	kst
|  |d	< d
|kr|d
}|d k	r|jtjkr| tj}n| }| |d< d|kr.|d}|d k	r.t||d<  | f||}	|r~s~| jdkr~|d krntt| jn|}t|	|}	|	S )NdimkeepdimFr   >   r   r   rL   ZaxisZkeepdimsmaskwhereidentityinitialunbiasedZddof)r    keyspop
isinstancer   r4   ndimZlayoutr!   Zstridedr   r   numpyr*   r#   toZfloat32intlistrangerA   Zexpand_dims)
rC   r&   r'   rR   rH   rI   rM   rO   rQ   resultfsupports_keepdimsr   r   wrapper   s>    







z*reference_reduction_numpy.<locals>.wrapper)r   rA   Zndarray)r]   r^   r_   r   r\   r   reference_reduction_numpy   s    1r`   )T)'r0   r   	functoolsr   r   typingr   rV   rA   r!   Z#torch.testing._internal.common_cudar   Z$torch.testing._internal.common_dtyper   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Z$torch.testing._internal.common_utilsr   r5   r6   ZDEVICESr   r.   r:   r<   r@   rG   r`   r   r   r   r   <module>   s>   @	(&$