U
    h(                     @   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   Q/var/www/html/venv/lib/python3.8/site-packages/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   Z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
    
r2   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    


r9   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&   r/   r)   r0   r1   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   r4   r5   r   r6   )r   r   r#   r$   r%   r(   r)   r8   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%   r/   r)   r0   r1   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   r3   r4   r<   r6   )r   r   r#   r$   r%   r)   r(   r8   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%   r/   r)   r0   r1   r   r,   r   meta_ps_roi_pool_backward   s
    
r@   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   rE   r   r   r      r   c                      s   d    S )Nz"scores should be a 1d tensor, got rC   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 rH   r   rF   rI   r   r   r      r   r   )	r   r    rD   r!   Z_custom_opsZget_ctxZcreate_unbacked_symintr"   long)rF   rI   Ziou_thresholdctxZnum_to_keepr   rJ   r   meta_nms   s    
rM   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_channelsr/   r   r   r   meta_deform_conv2d   s    

rY   Z_deform_conv2d_backwardc                 C   sJ   | |j}| |j}| |j}| |j}| |j}|||||fS r
   )r"   rO   )r-   r   rP   rQ   rR   rS   rT   rU   rV   rW   Z
dilation_hZ
dilation_wgroupsZoffset_groupsrX   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*   r2   r9   r;   r=   r>   r?   r@   r   Zregister_fakerM   rY   r[   r   r   r   r   <module>   s:   

	










