U
    <jg(                     @   s   d dl Z d dlZd dlZd dlZd dlZe ddd Zd(ddZeddd	 Z	ed
dd Z
eddd Zeddd Zeddd Zeddd Zeddd Zeddd Zejdd d! Zed"d#d$ Zed%d&d' ZdS ))    Nc                   C   s   t jdddS )NtorchvisionZIMPLZMeta)torchlibraryLibrary r   r   C/tmp/pip-unpacked-wheel-xh8d94dr/torchvision/_meta_registrations.pyget_meta_lib   s    r   defaultc                    s    fdd}|S )Nc                    s,   t j r(t tttjj  |  | S N)r   	extensionZ_has_opsr   implgetattrr   ops)fnop_nameoverload_namer   r   wrapper   s    
zregister_meta.<locals>.wrapperr   )r   r   r   r   r   r   register_meta   s    r   Z	roi_alignc           	         s^   t ddkdd  t  jjk fdd d} d} ||||fS )N      c                   S   s   dS Nz$rois must have shape as Tensor[K, 5]r   r   r   r   r   <lambda>       z meta_roi_align.<locals>.<lambda>c                      s   d j  dj  S NzMExpected tensor for input to have the same type as tensor for rois; but type  does not equal dtyper   inputroisr   r   r      s    r   )r   _checksizer   	new_empty)	r   r    spatial_scalepooled_heightpooled_widthsampling_ratioalignednum_roischannelsr   r   r   meta_roi_align   s    


r+   Z_roi_align_backwardc                    s0   t  jjk fdd  ||||fS )Nc                      s   d j  dj  S NzLExpected tensor for grad to have the same type as tensor for rois; but type r   r   r   gradr    r   r   r   .   s    z)meta_roi_align_backward.<locals>.<lambda>r   r!   r   r#   )r.   r    r$   r%   r&   
batch_sizer*   heightwidthr'   r(   r   r-   r   meta_roi_align_backward(   s
    
r3   Zps_roi_alignc           	         s   t ddkdd  t  jjk fdd  d}t |||  dkd d}||||  ||f} |t j|t jdd	fS )
Nr   r   c                   S   s   dS r   r   r   r   r   r   r   8   r   z#meta_ps_roi_align.<locals>.<lambda>c                      s   d j  dj  S r   r   r   r   r   r   r   ;   s    r   Cinput channels must be a multiple of pooling height * pooling widthmeta)r   devicer   r!   r"   r   r#   emptyZint32)	r   r    r$   r%   r&   r'   r*   r)   out_sizer   r   r   meta_ps_roi_align6   s    


r:   Z_ps_roi_align_backwardc                    s0   t  jjk fdd  |||	|
fS )Nc                      s   d j  dj  S r,   r   r   r-   r   r   r   [   s    z,meta_ps_roi_align_backward.<locals>.<lambda>r/   )r.   r    channel_mappingr$   r%   r&   r'   r0   r*   r1   r2   r   r-   r   meta_ps_roi_align_backwardK   s
    
r<   Zroi_poolc                    st   t ddkdd  t  jjk fdd d} d}||||f} |t j|dt jdfS )	Nr   r   c                   S   s   dS r   r   r   r   r   r   r   e   r   zmeta_roi_pool.<locals>.<lambda>c                      s   d j  dj  S r   r   r   r   r   r   r   h   s    r   r5   r6   r   r7   )r   r    r$   r%   r&   r)   r*   r9   r   r   r   meta_roi_poolc   s    


r>   Z_roi_pool_backwardc
           
         s0   t  jjk fdd  ||||	fS )Nc                      s   d j  dj  S r,   r   r   r-   r   r   r   y   s    z(meta_roi_pool_backward.<locals>.<lambda>r/   )
r.   r    Zargmaxr$   r%   r&   r0   r*   r1   r2   r   r-   r   meta_roi_pool_backwards   s
    
r?   Zps_roi_poolc                    s   t ddkdd  t  jjk fdd  d}t |||  dkd d}||||  ||f} |t j|dt jd	fS )
Nr   r   c                   S   s   dS r   r   r   r   r   r   r      r   z"meta_ps_roi_pool.<locals>.<lambda>c                      s   d j  dj  S r   r   r   r   r   r   r      s    r   r4   r5   r=   r7   )r   r    r$   r%   r&   r*   r)   r9   r   r   r   meta_ps_roi_pool   s    


r@   Z_ps_roi_pool_backwardc
           
         s0   t  jjk fdd  ||||	fS )Nc                      s   d j  dj  S r,   r   r   r-   r   r   r      s    z+meta_ps_roi_pool_backward.<locals>.<lambda>r/   )
r.   r    r;   r$   r%   r&   r0   r*   r1   r2   r   r-   r   meta_ps_roi_pool_backward   s
    
rA   ztorchvision::nmsc                    s   t   dk fdd t  ddk fdd t  dkfdd t  ddk fd	d t j }| } j|t jd
S )N   c                      s   d    dS )Nz!boxes should be a 2d tensor, got Ddimr   detsr   r   r      r   zmeta_nms.<locals>.<lambda>r      c                      s   d  d S )Nz1boxes should have 4 elements in dimension 1, got r   r"   r   rF   r   r   r      r   c                      s   d    S )Nz"scores should be a 1d tensor, got rD   r   )scoresr   r   r      r   r   c                      s   d  d d d S )NzIboxes and scores should have same number of elements in dimension 0, got r   z and rI   r   rG   rJ   r   r   r      r   r   )	r   r!   rE   r"   Z_custom_opsZget_ctxZcreate_unbacked_symintr#   long)rG   rJ   Ziou_thresholdctxZnum_to_keepr   rK   r   meta_nms   s    
rN   Zdeform_conv2dc                 C   s8   |j dd  \}}|j d }| j d }| ||||fS )Nr   )shaper#   )r   weightoffsetmaskbiasstride_hstride_wpad_hpad_wZdil_hZdil_wZn_weight_grpsZn_offset_grpsuse_maskZ
out_heightZ	out_widthZout_channelsr0   r   r   r   meta_deform_conv2d   s    

rZ   Z_deform_conv2d_backwardc                 C   sJ   | |j}| |j}| |j}| |j}| |j}|||||fS r
   )r#   rP   )r.   r   rQ   rR   rS   rT   rU   rV   rW   rX   Z
dilation_hZ
dilation_wgroupsZoffset_groupsrY   Z
grad_inputZgrad_weightZgrad_offsetZ	grad_maskZ	grad_biasr   r   r   meta_deform_conv2d_backward   s    r\   )r	   )	functoolsr   Ztorch._custom_opsZtorch.libraryZtorchvision.extensionr   	lru_cacher   r   r+   r3   r:   r<   r>   r?   r@   rA   r   Zregister_fakerN   rZ   r\   r   r   r   r   <module>   s:   

	










