U
    <c~                  $   @   s  U d dl Z d dl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 d dlmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZ d dlmZ dhd
dZ dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&diddZ'dd Z(dd Z)dd Z*ed eej+dd d!d	d"d"d"d"d"eej,ej-ej.ee /d#d$d%ej,ej0ej1ej2fd&ee j3d'd(ee j3d$d)ee j3d$d*ee j3d+d,feeej.ed-d-d.id$d%eeej-ed-d-d.id$d%eeej-ed/d-d.id$d0ge"e#e$d1ed2eej4dd3d!d"d	d"d"d"d"d"eej,eej,ej-ej.ee j3d'd(ee j3d+d,ee /d#d$d%ej,ej0ej1ej2fd&ee /d4d$d0ej0ej1ej2fd&ee /d4d5d6d7ej,fe e d8feeej-ed-d/d.id$d%eeej-ed-d-d.id$d9ge"e#e$d:ed;eej.eej-ej.dd"d	d"d"ee j3d'd(ee /d4d+d,fe(ed<ed=eej.eej-ej.dd"d	d"d"ee j3d'd(ee /d4d+d,ee j3d>d?ej.fd@dAfe(ed<edBd!d	eej-ej.d"d"d"d"eej5ee j3d'd(ee j3d$d)ee j3d$d*ee /d4d+d,ee /d4d5d6ej,fe e d&fe"e#e$edCedDd!d	d"d"eej-ej.d"d"eej6ee j3d'd(ee j3d$d)ee j3d$d*ee j3d+d,ee /d4d5d6ej,fe e d&fe"e#e$edEedFd	d	d	eej-ej.eej7d	dGee j3d'd(ee j3d$d%ee j3d+d,fe"edH	edId	d	d	eej-ej.eej8d	dGee j3d'd(ee j3d$d%ee j3d+d,fe"edH	edJej9:ej;dKkrXeej<nddd!d	d"d"d"d"eej-ej.ej,ee j3d$d9ej,fd&ee j3d$d%ej,fd&ee j3d$d0ej,fd&ee j3d'd(ee j3d$d)ee j3d$d*ee j3d+d,ee /d4d5d6ej,fe e d&feeej-ed-d-d.id$d%ge"e$edLedMeej.eej-dd	d"d"ee j3d'd(ee /d4d+d,fe'edN
edOd dd!d	d"eej-ej.ee j3d'd(ee j3d$d)ee j3d$d*ee j3d+d,fd"d"e%edPedQej9:ej;dKkreej=nddd!d	d"d"d	d"eej-ej.ee /d4dRdSej>ej?fd&ee j3d'd(ee j3d$d)ee j3d$d*ee j3d+d,feeej-ed/d/d.ej.ed-d-d.id$d%eeej-ed/d/d.id$d0eeej-ed/d/d.id5d%eeej-ed/d/d.idTdUge&ed"dVedWej9:ej;dKkreej@nddd!d"d	d"d"d	d"eej.eej-ej.ee /d4dRdSej>ej?fd&ee j3d'd(ee j3d$d)ee j3d$d*ee j3d+d,ee /d4dTdUej-fd&feeej-ed/d/d.id$d%eeej-ed/d/d.id$d0eeej-ed/d/d.id5d%ge&ed"dXedYdeej.eejAej.e'ee j3d'd(ee j3d+d,fed"d"d	dZ
ed[deej.eejAej.e'ee j3d'd(ee j3d+d,feeej.ed/d/d.id5d%ged"d"d	d\ed]deej.eejAej.e'ee j3d'd(ee j3d+d,fed"d"d	dZ
ed^deejAej.e*ee j3d'd(ee j3d+d,ee j3d5d%d@ejAgd8fed"d"d"d	d_
ed`eej.d	d"d"d	ee j3d'd(ee /d4d+d,ee /d4dadbfe)edc	eddeej.eej-ej.dd!d	d"d"ee /d4d'd(ee /d4d$d)ee /d4d$d*ee /d4d$deee /d4d+d,ee /d4d>d?fe"edfgZBee eCdg< dS )j    N)partial)List)make_tensor)toltoleranceOverride)all_types_andall_types_and_complex_andcomplex_typesfloating_and_complex_types_andfloating_types_andintegral_types)	DecorateInfo"gradcheck_wrapper_masked_operation,gradcheck_wrapper_masked_pointwise_operationMOpInfoReductionOpInfoSsample_inputs_reductionSampleInput)reference_reduction_numpyFc                    s   t t|||dtfdfttfdfttfdfttfdftttfdfg}|rVttjdnd  t|jdkrt|	d  fd	d
|D S )N)devicedtyperequires_gradr      ))   r   Zxla) r   c                    s"   g | ]\}}t || d qS )argskwargs)r   ).0shapedimr#   Zmake_argr    V/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/opinfo/definitions/_masked.py
<listcomp>5   s    z1sample_inputs_softmax_variant.<locals>.<listcomp>)
r   r   r   r   dicttorchZfloat64r   typeappend)op_infor   r   r   
with_dtyper#   Zcasesr    r'   r(   sample_inputs_softmax_variant!   s$       



r0   c                 k   s   d V  t | tj|ddV  t| dkrt | d d d tj|ddV  t | d d d | dd   tj|ddV  t d| dd   tj|ddV  t | dd  tj|ddV  t | dd  tj|ddV  d S )NFr   r   r   r   r   r   r   )r   r+   boollen)Zinput_shaper   r#   r    r    r(   _generate_masked_op_mask:   sB       
   
   r4   c                 k   s   | j |d< t| |||f|D ]}t|jj|f|D ]}|jtf d|i|j }}t|j	 
|||dV  |s2|jr2|jjdkr2|dk	r2|j|jjkr2tjtj tjfD ]8}	|j	 }
|
ddd|	 t|

|||dV  qq2qdS )	zSample inputs for masked reduction operators.

    Masked reduction operator is a reduction operator with trailing
    mask optional argument. A mask is a bool tensor with the same
    shape as input or a shape that is broadcastable to input shape.
    supports_multiple_dimsmaskr!   r   Nr   r   )r5   r   r4   inputr%   r"   r*   r#   r   detachrequires_grad_Zis_floating_pointndimr+   infnanZdiagonalZfill_)r.   r   r   r   r#   sample_inputr6   sample_input_argssample_input_kwargsvtr    r    r(   sample_inputs_masked_reduction^   sV    
    



rC   c           	      k   s   | j r| jdd}t| |||f|D ]p}|jd}|dk	rr|j }|j| d t	|j
 |j|dV  q&|dkr|q&t	|j
 |j|jdV  q&dS )zbSample inputs for masked reduction operators that support inputs
    with sparse coo layouts.
    masked. r6   Nr6   r!   >   aminamaxprod)supports_sparsenamereplacerC   r#   getcopyupdateZ	to_sparser   r8   r"   )	r.   r   r   r   r#   op_namer>   r6   r@   r    r    r(   )sample_inputs_sparse_coo_masked_reduction   s4       

rQ   c           
      k   s   | j r| jdd}t| |||f|D ]}|jjdkr&|jdsDq&|jd}|dk	r|j }|j	|
 d t|j
 |j|d}	n"|d	krq&t|j
 |j|jd}	|	V  |jd
 dkr&|	j }|j	dd t|	j |j|dV  q&dS )zbSample inputs for masked reduction operators that support inputs
    with sparse csr layouts.
    rD   rE   r   keepdimr6   NrF   r!   )rI   rH   rG   meanr&   r   r   )r&   )supports_sparse_csrrK   rL   rC   r8   r;   r#   rM   rN   rO   Zto_sparse_csrr   r"   clone)
r.   r   r   r   r#   rP   r>   r6   r@   Z
new_sampler    r    r(   )sample_inputs_sparse_csr_masked_reduction   sP       



rV   c           	      k   sl   ddt dt ddfD ]P}t| |||f|D ]8}|f|j |j  }}t|j |||dV  q,qdS )zSample inputs for masked norm.       @r   r<   -infr   r!   N)	floatrC   r"   r#   rN   r   r8   rU   r:   )	r.   r   r   r   r#   ordr>   r?   r@   r    r    r(   sample_inputs_masked_norm   s(       r[   c                 k   s.  dD ]"}t | |||f|D ]}|jr`|jd }|jdd |f |jdd  }|j }	n |jd}|j}t|j|d}	|r
|	ddkrtjjtj	|j
jtjd|d	d
}
n:tjj|j
f||	}tjj|j|j
jtjd|d	|d}
|
 t|d kr
qt|j
 |||	dV  qqdS )z!Sample inputs for masked std/var.)FTr   Nr   r&   )unbiasedr6   r   T)rR   )rR   r6   r!   )rC   r"   r#   rN   rM   r*   r+   ZmaskedsumZonesr8   r%   Zint64Z_input_maskZnew_onesminintr   r9   r:   )r.   r   r   r   r#   r\   r>   r&   r?   r@   Z
orig_countZinmaskr    r    r(   sample_inputs_masked_std_var   sX    
   

 r`   c              	   K   s|   g }t | |||fd|i|D ]X}t|jj|f|D ]@}|jtf d|i|j }	}
|t|j	 
||	|
d q4q|S )a  Sample inputs for masked softmax, log_softmax, and softmin.

    Masked normalization operator is a reduction operator with
    trailing mask optional argument. A mask is a bool tensor with the
    same shape as input or a shape that is broadcastable to input
    shape.
    r/   r6   r!   )r0   r4   r8   r%   r"   r*   r#   r-   r   rU   r:   )r.   r   r   r   r/   r#   inputsr>   r6   r?   r@   r    r    r(   sample_inputs_masked_softmax  s<    
   
 

rb   c              	   K   s   g }t | |||f|D ]}t|jj|f|D ]}t|tjkr@q,|jtf d|i|j	 }}	d|	krn|	
d |r~|jd }
nd|	krq,|	
d}
|
f}|t|j |||	d q,q|S )z,Sample inputs for masked cumsum and cumprod.r6   rR   r   r&   r!   )r0   r4   r8   r%   r,   r+   ZTensorr"   r*   r#   popr-   r   rU   r:   )r.   r   r   r   r#   ra   r>   r6   r?   r@   r&   r    r    r(   sample_inputs_masked_cumops=  sL        



rd   c                    s   g }t ft t ft tt fg} fdd|D } fdd|D }t|||D ]p\}	}
}t|
|D ]Z\}}t|	| |d}t|	| |d}|t| || |ft||dd qbqN|S )z#Sample inputs for masked logaddexp.c                    s   g | ]}t t| fqS r    listr4   r$   r%   r   r#   r    r(   r)   d  s    z2sample_inputs_masked_logaddexp.<locals>.<listcomp>c                    s   g | ]}t t| fqS r    re   rg   rh   r    r(   r)   g  s    r1   )
input_mask
other_maskr!   )	r   r   zipr   r-   r   rU   r:   r*   )r.   r   r   r   r#   ra   ZshapesZinput_mask_listsZother_mask_listsr%   Zinput_masksZother_masksri   rj   r8   otherr    rh   r(   sample_inputs_masked_logaddexp`  sD            
rm   c           
   	   K   st   g }ddt dt ddfD ]T}t| |||f|D ]<}|f|j |j  }}	|t|j 	|||	d q0q|S )z#Sample inputs for masked normalize.rW   r   r<   rX   r   r!   )
rY   r0   r"   r#   rN   r-   r   r8   rU   r:   )
r.   r   r   r   r#   ra   rZ   r>   r?   r@   r    r    r(   sample_inputs_masked_normalize  s0       rn   z
masked.sum	propagateTzFailing on some jobsZTestReductionsZtest_reference_masked)dtypesZTestNormalizeOperatorsZ"test_normalize_operator_exhaustiveZtest_dim_emptyZtest_dim_empty_keepdimZTestJitZtest_variant_consistency_jitgMbP?)ZatolZrtolg{Gz?Ztest_ref_small_input)refmethod_variantidentity
nan_policysupports_outsupports_forward_adsupports_fwgrad_bwgradrJ   rT   promotes_int_to_int64rp   skips
decoratorssample_inputs_funcsample_inputs_sparse_coo_funcsample_inputs_sparse_csr_funczmasked.prodr   zSkipped!Z
TestMaskedZtest_mask_layoutZcuda)device_typerp   Ztest_ref_duplicate_values)rq   rr   rs   rt   gradcheck_fast_moderu   rv   rw   rJ   rT   rx   rp   dtypesIfCUDAry   rz   r{   r|   r}   zmasked.cumsum)
rp   r   rr   r   ru   rv   rw   ry   r{   gradcheck_wrapperzmasked.cumprodZ
TestDecompZtest_comprehensivecpu)rp   r~   zmasked.amax)rt   ru   rp   rJ   rv   rw   rT   rq   ry   r{   r|   r}   r   zmasked.amin)rt   ru   rv   rw   rp   rJ   rT   rq   ry   r{   r|   r}   r   zmasked.argmax)Zsupports_keepdims)ru   r5   Zsupports_autogradrp   rq   ry   r{   r   zmasked.argminzmasked.meanz1.20.2)rq   rr   rt   ru   rT   rv   rw   promotes_int_to_floatrp   ry   rz   r{   r}   r   zmasked.median)	rp   r   rr   ru   rv   rw   ry   r{   r   zmasked.norm)rs   rr   rt   ru   r   rp   ry   rv   rw   r{   r   z
masked.varZTestSchemaCheckModeOpInfoZtest_schema_correctnessZTestCudaFuserOpInfoZtest_nvfuser_correctness)rq   rr   rt   ru   rv   rw   check_batched_forward_gradr   rp   ry   rz   r{   r   check_batched_gradz
masked.std)rq   rr   rt   r   ru   rv   rw   r   r   rp   r   ry   rz   r{   r   r   zmasked.softmax)	rr   rp   r   r{   ry   r   rv   rw   ru   zmasked.log_softmax)
rr   rp   r   r{   ry   rz   r   rv   rw   ru   zmasked.softminzmasked.normalize)	rr   rp   r{   ry   r   r   rv   rw   ru   zmasked.logaddexpZTestGradientsZtest_fn_gradgrad)rp   ru   rv   rw   r   ry   r{   r   zmasked.logsumexpZtest_empty_tensor_empty_slice)
rp   r   rr   rt   ru   rv   rw   ry   r{   r   op_db)F)F)DZunittest	functoolsr   typingr   Znumpynpr+   Ztorch.testingr   Z*torch.testing._internal.common_device_typer   r   Z$torch.testing._internal.common_dtyper   r   r	   r
   r   r   Z#torch.testing._internal.opinfo.corer   r   r   r   r   r   r   r   r   Z$torch.testing._internal.opinfo.utilsr   r0   r4   rC   rQ   rV   r[   r`   rb   rd   rm   rn   r]   r2   Zfloat16Zbfloat16skipZint8Zint16Zint32ZexpectedFailurerI   rH   rG   ZargmaxZargminlibZNumpyVersion__version__rS   varZ	complex64Z
complex128ZstdZhalfr   __annotations__r    r    r    r(   <module>   s    , 
$("80 
#    8     B    "    '    '            *A      
     
 

D
    C  
    
               