U
    <c                  $   @   s  d dl Z ddlmZmZmZmZmZ g Zdddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'g$Zd(d) e	e
eddd*d&d$d#d%h D Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 eD Zd5d4 eD Ze	e Ze	e Zd6d7 Zd8d9 ZdS ):    N   )_map_mt_args_kwargs_masks_match_tensors_match_wrap_resultis_masked_tensoraddatan2Zarctan2Zbitwise_andZ
bitwise_orZbitwise_xorZbitwise_left_shiftZbitwise_right_shiftdivdivideZfloor_dividefmodZ	logaddexpZ
logaddexp2mulmultiplyZ	nextafter	remaindersubsubtractZtrue_divideeqnelegeZgreaterZgreater_equalgtZ
less_equalltZlessmaximumZminimumZfmaxZfmin	not_equalc                 C   s   g | ]}|d  qS )_ ).0nr   r   D/tmp/pip-unpacked-wheel-gikjz4vx/torch/masked/maskedtensor/binary.py
<listcomp>0   s   r   equalc                 C   sB   t | st |stdt| |s*tdt | r:|  S | S )Nz2At least one of `a` and `b` must be a MaskedTensorz a and b must have matching masks)r   	TypeErrorr   
ValueErrorget_mask)abr   r   r   _get_at_least_one_maskC   s    
r&   c                 C   sN  t |dkrtd|dd  D ]}t|r tdq t|d d  sPtdt||dd \}}t||dd \}}|d j}	t|d	 st|d	 o|	|d	 jk}
|	tj	krN|
rt
|d  |d	  std
|d  |d	  krtd|d	  |d	< |d  }|d  }|d  |d< | | }t|||}n|	tjkr|
rt
|d  |d	  rt
|d  |d	  std|d	  |d	< |d  }|d  }|d  |d< | | }t|||}n| | }|r|d ||d  |d S t|d d  }|	tjkr@||}t||S d S )Nr   zlen(kwargs) must equal 0   zRMaskedTensor binary ops do not support Tensor arguments aside from the lhs and rhszUInput masks must match. If you need support for this, please open an issue on Github.c                 S   s   |   S N)get_dataxr   r   r   <lambda>Z       z _binary_helper.<locals>.<lambda>c                 S   s   |   S r(   )r#   r*   r   r   r   r,   ]   r-   r   z\sparse_coo indices must match. If you need support for this, please open an issue on Github.z?input1 and input2 must have the same size for binary functions.z\sparse_csr indices must match. If you need support for this, please open an issue on Github.)lenr"   torchZ	is_tensorr!   r   r   Zlayoutr   Z
sparse_coor   indicessizevaluesZsparse_coo_tensorZ
sparse_csrZcrow_indicesZcol_indicesZsparse_csr_tensorZ_set_data_maskr&   ZstridedZ	expand_asr   )fnargskwargsinplacer$   Z	data_argsZdata_kwargsZ	mask_argsZmask_kwargsZargs0_layoutZsame_layoutir1   vZresult_dataZcrowcolZresult_maskr   r   r   _binary_helperM   s~    

    

 

r:   c                    s   t tjj|   fdd}|S )Nc                     s   t  | |ddS )NFr6   r:   r4   r5   r3   r   r   	binary_fn   s    z _torch_binary.<locals>.binary_fngetattrr/   opsatenfn_namer?   r   r>   r   _torch_binary   s    rF   c                    s   t tjj|   fdd}|S )Nc                     s   t  | |ddS )NTr;   r<   r=   r>   r   r   r?      s    z(_torch_inplace_binary.<locals>.binary_fnr@   rD   r   r>   r   _torch_inplace_binary   s    rG   c                 C   s    i | ]}t tjj|t|qS r   )rA   r/   rB   rC   rF   r   namer   r   r   
<dictcomp>   s     rJ   c                 C   s    i | ]}t tjj|t|qS r   )rA   r/   rB   rC   rG   rH   r   r   r   rJ      s    c                 C   s   | t kp| tkS r(   )NATIVE_BINARY_FNSNATIVE_INPLACE_BINARY_FNSr>   r   r   r   _is_native_binary   s    rM   c                 O   s0   | t krt|  ||S | tkr,t|  ||S tS r(   )rK   NATIVE_BINARY_MAPrL   NATIVE_INPLACE_BINARY_MAPNotImplemented)r3   r4   r5   r   r   r   _apply_native_binary   s
    rQ   )r/   corer   r   r   r   r   __all__ZBINARY_NAMESlistsetZINPLACE_BINARY_NAMESr&   r:   rF   rG   rN   rO   keysrK   rL   rM   rQ   r   r   r   r   <module>   s   '
L		