
    khN                         d dl Z d dlmZmZ d dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ dd	lmZ 	 	 	 	 	 dd
edededee   deeef   deeef   deeef   dee   defdZ G d dej&                        Zy)    N)OptionalTuple)nnTensor)init)_pair)	Parameter)_assert_has_ops   )_log_api_usage_onceinputoffsetweightbiasstridepaddingdilationmaskreturnc                 T   t         j                  j                         s-t         j                  j                         st	        t
               t                |j                  d   }|du}	|;t        j                  | j                  d   df| j                  | j                        }|,t        j                  || j                  | j                        }t        |      \  }
}t        |      \  }}t        |      \  }}|j                  dd \  }}| j                  \  }}}}|j                  d   d|z  |z  z  }||j                  d   z  }|dk(  r$t        d|j                  d    dd|z  |z         t         j                  j                  j                  | |||||
||||||||	      S )	a?  
    Performs Deformable Convolution v2, described in
    `Deformable ConvNets v2: More Deformable, Better Results
    <https://arxiv.org/abs/1811.11168>`__ if :attr:`mask` is not ``None`` and
    Performs Deformable Convolution, described in
    `Deformable Convolutional Networks
    <https://arxiv.org/abs/1703.06211>`__ if :attr:`mask` is ``None``.

    Args:
        input (Tensor[batch_size, in_channels, in_height, in_width]): input tensor
        offset (Tensor[batch_size, 2 * offset_groups * kernel_height * kernel_width, out_height, out_width]):
            offsets to be applied for each position in the convolution kernel.
        weight (Tensor[out_channels, in_channels // groups, kernel_height, kernel_width]): convolution weights,
            split into groups of size (in_channels // groups)
        bias (Tensor[out_channels]): optional bias of shape (out_channels,). Default: None
        stride (int or Tuple[int, int]): distance between convolution centers. Default: 1
        padding (int or Tuple[int, int]): height/width of padding of zeroes around
            each image. Default: 0
        dilation (int or Tuple[int, int]): the spacing between kernel elements. Default: 1
        mask (Tensor[batch_size, offset_groups * kernel_height * kernel_width, out_height, out_width]):
            masks to be applied for each position in the convolution kernel. Default: None

    Returns:
        Tensor[batch_sz, out_channels, out_h, out_w]: result of convolution

    Examples::
        >>> input = torch.rand(4, 3, 10, 10)
        >>> kh, kw = 3, 3
        >>> weight = torch.rand(5, 3, kh, kw)
        >>> # offset and mask should have the same spatial size as the output
        >>> # of the convolution. In this case, for an input of 10, stride of 1
        >>> # and kernel size of 3, without padding, the output size is 8
        >>> offset = torch.rand(4, 2 * kh * kw, 8, 8)
        >>> mask = torch.rand(4, kh * kw, 8, 8)
        >>> out = deform_conv2d(input, offset, weight, mask=mask)
        >>> print(out.shape)
        >>> # returns
        >>>  torch.Size([4, 5, 8, 8])
    r   N   )devicedtyper   zthe shape of the offset tensor at dimension 1 is not valid. It should be a multiple of 2 * weight.size[2] * weight.size[3].
Got offset.shape[1]=z,, while 2 * weight.size[2] * weight.size[3]=)torchjitis_scripting
is_tracingr   deform_conv2dr
   shapezerosr   r   r   RuntimeErroropstorchvision)r   r   r   r   r   r   r   r   out_channelsuse_maskstride_hstride_wpad_hpad_wdil_hdil_w	weights_h	weights_w_n_in_channelsn_offset_grpsn_weight_grpss                         W/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/ops/deform_conv.pyr   r      s   b 99!!#EII,@,@,BM*<<?L4H|{{EKKNA.u||5;;W|{{<EKKPvHh>LE5?LE5!<<,Iy"[[A}aLLOI	(ABM!V\\!_4M##)<<?"33_`adm`mpy`y_z|
 	
 99  ..     c                        e Zd ZdZ	 	 	 	 	 ddededededededed	ef fd
ZddZddedede	e   defdZ
defdZ xZS )DeformConv2dz$
    See :func:`deform_conv2d`.
    in_channelsr%   kernel_sizer   r   r   groupsr   c	           	      D   t         	|           t        |        ||z  dk7  rt        d      ||z  dk7  rt        d      || _        || _        t        |      | _        t        |      | _        t        |      | _	        t        |      | _
        || _        t        t        j                  |||z  | j                  d   | j                  d               | _        |r$t        t        j                  |            | _        n| j#                  dd        | j%                          y )Nr   z'in_channels must be divisible by groupsz(out_channels must be divisible by groupsr   r   )super__init__r   
ValueErrorr7   r%   r   r8   r   r   r   r9   r	   r   emptyr   r   register_parameterreset_parameters)
selfr7   r%   r8   r   r   r   r9   r   	__class__s
            r3   r<   zDeformConv2d.__init__s   s     	D!1$FGG& A%GHH&( -FmW~hKKkV&;T=M=Ma=PRVRbRbcdRef
 !%++l";<DI##FD1r4   r   c                 >   t        j                  | j                  t        j                  d             | j
                  ]t        j                  | j                        \  }}dt        j                  |      z  }t        j                  | j
                  | |       y y )N   )ar   )r   kaiming_uniform_r   mathsqrtr   _calculate_fan_in_and_fan_outuniform_)rA   fan_inr/   bounds       r3   r@   zDeformConv2d.reset_parameters   sn    dkkTYYq\:99 ::4;;GIFA		&))EMM$))eVU3 !r4   r   r   r   c           
          t        ||| j                  | j                  | j                  | j                  | j
                  |      S )a  
        Args:
            input (Tensor[batch_size, in_channels, in_height, in_width]): input tensor
            offset (Tensor[batch_size, 2 * offset_groups * kernel_height * kernel_width, out_height, out_width]):
                offsets to be applied for each position in the convolution kernel.
            mask (Tensor[batch_size, offset_groups * kernel_height * kernel_width, out_height, out_width]):
                masks to be applied for each position in the convolution kernel.
        )r   r   r   r   )r   r   r   r   r   r   )rA   r   r   r   s       r3   forwardzDeformConv2d.forward   s=     KKII;;LL]]	
 		
r4   c           	         | j                   j                   d| j                   d| j                   d| j                   d| j
                   	}|| j                  dk7  rd| j                   ndz  }|| j                  dk7  rd	| j                   ndz  }|| j                  d
k7  rd| j                   ndz  }|| j                  dndz  }|dz  }|S )N(z, z, kernel_size=z	, stride=r   r   z
, padding= r   r   z, dilation=r   z	, groups=z, bias=False))
rB   __name__r7   r%   r8   r   r   r   r9   r   )rA   ss     r3   __repr__zDeformConv2d.__repr__   s    ~~&&'q ""#T--.}	& 	
 	
DLLF,Bz$,,(J	dmmv.E{4==/*2M	$++*:y&B	tyy0^b8	Sr4   )r   r   r   r   T)r   N)N)rU   
__module____qualname____doc__intboolr<   r@   r   r   rN   strrW   __classcell__)rB   s   @r3   r6   r6   n   s     $ $  $  	$ 
 $  $  $  $  $ L4
V 
V 
8F;K 
W] 
(# r4   r6   )NrS   rQ   rS   N)rG   typingr   r   r   r   r   torch.nnr   torch.nn.modules.utilsr   torch.nn.parameterr	   torchvision.extensionr
   utilsr   r[   r   Moduler6    r4   r3   <module>rg      s     "    ( ( 1 ' "$% &!]]] ] 6
	]
 #s(O] 38_] CHo] 6
] ]@U299 Ur4   