
    3j=                        S SK Jr  S SKrS SKJs  Jr  S SKJr  SS jrSS jr " S S\R                  5      r
 " S S	\R                  5      rSSS
 jjrSSS jjrSS jrg)    )annotationsN)nnc                r    X-  nUS-  n[         R                  " U5      nSXCU4'   UR                  USX5      $ z"Return neigh2channels conv kernel.   r      torcheyeview)kxkynumelcenterweights        T/home/wildlama/miniconda3/lib/python3.13/site-packages/kornia/geometry/subpix/nms.py_get_nms_kernel2dr      s?    E1*FYYuFF6>;;ua((    c                z    X-  U-  nUS-  n[         R                  " U5      nSXTU4'   UR                  USXU5      $ r   r	   )kdr   r   r   r   r   s         r   _get_nms_kernel3dr   "   sE    2E1*FYYuFF6>;;ua,,r   c                  ^   ^  \ rS rSr% SrS\S'   S	U 4S jjr\S
S j5       rSSS jjr	Sr
U =r$ )NonMaximaSuppression2d+   zApply non maxima suppression to filter.

Flag `minima_are_also_good` is useful, when you want to detect both maxima and minima, e.g. for DoG
torch.Tensorkernelc                   > [         TU ]  5         Xl        U R                  U5      U l        U R                  S[        U6 5        g )Nr   )super__init__kernel_size_compute_zero_padding2dpaddingregister_bufferr   selfr    	__class__s     r   r   NonMaximaSuppression2d.__init__3   s<    ,7262N2N{2[X'8+'FGr   c                    [        U [        5      (       d  [        [        U 5      5      e[	        U 5      S:w  a  [        U 5      eSS jnU u  p#U" U5      U" U5      U" U5      U" U5      4$ )Nr   c                    U S-
  S-  $ Nr   r    xs    r   pad;NonMaximaSuppression2d._compute_zero_padding2d.<locals>.padA       Ea<r   r-   intreturnr2   
isinstancetupleAssertionErrortypelen)r    r.   r   r   s       r   r!   .NonMaximaSuppression2d._compute_zero_padding2d9   sf     +u-- k!233{q  --	  BR#b'3r733r   c           	     :   [        UR                  5      S:w  a  [        UR                  5      eUR                  5       u  p4pVU R                  S:X  a  [        SS5      n[        SS5      n[        SS 5      n	[        R                  " X4XVUR                  [        R                  S9n
US	X4   nXS	Xw4   :  XS	Xx4   :  -  XS	Xy4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  U
S	SS2SS24'   GOU R                  S
:X  Gav  [        SS5      n[        SS5      n[        SS5      n[        SS5      n[        SS 5      n[        R                  " X4XVUR                  [        R                  S9n
US	X4   nXS	X4   :  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  U
S	SS2SS24'   GOiU R                  S:X  Ga  [        SS5      n[        SS5      n[        SS5      n[        SS5      n[        SS5      n[        SS5      n[        SS 5      n[        R                  " X4XVUR                  [        R                  S9n
US	X4   nXS	UU4   :  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	X4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  XS	UU4   :  -  U
S	SS2SS24'   O[        R                  " U[        U R                  5      S S S2   SS9nUR                  5       u  p4nn[        R                  " UR                  X4-  SUU5      U R                   R#                  UR                  UR$                  5      SS9R                  X4SXV5      nUR'                  SS9S   nUU:  n
U(       a  U
$ XR#                  UR$                  5      -  $ )N   )   r=   r   r   r   devicedtype.)   rC   r=   )   rF   irC      	replicatemode)stride)dim)r9   shaper7   sizer    slicer
   zerosrA   boolFr.   listr"   conv2dr   r   torB   max)r%   r-   	mask_onlyBCHHWleftr   rightmaskctc2c1c0p1p2c3p3x_paddedHPWPneighborhoodmax_non_centers                           r   forwardNonMaximaSuppression2d.forwardG   s	   qww<1 ))ffhqv%B<D1b\F!TNE;;qa1885::ND3&'BT((#t+,,.#t*++- #v+,,. #v,--	/
 #u*++- #u,--/ #u+,,. adAbD! 'q"Bq"Bq"Bq"Bq$B;;qa1885::ND3;BRn$#r+&(#r+&( #r+&( #r2+&	(
 #r+&( #r+&( #r+&( #r+&( #r2+&	( #r+&
( #r+&( #r+&( #r2+&( #r+&( #r+&(  #r+&!(" #r+&#($ #r2+&%(& #r2+&'(( #r2+&)(* #r2+&+(, #r2+&-(. #r2+&/( adAbD!4 'q"Bq"Bq"Bq"Bq"Bq"Bq$B;;qa1885::ND3;BRn$#r2+&(#r2+&( #r2+&( #r2+&	(
 #r2+&( #r2+&( #r2+&( #r+&( #r+&	( #r+&
( #r+&( #r2+&( #r2+&( #r2+&( #r+&(  #r+&!(" #r+&#($ #r+&%(& #r2+&'(( #r2+&)(* #r2+&+(, #r+&-(. #r+&/(0 #r+&1(2 #r2+&3(4 #r2+&5(6 #r2+&7(8 #r+&9(: #r+&;(< #r+&=(> #r+&?(@ #r2+&A (B #r2+&C!(D #r2+&E"(F #r2+&G#(H #r2+&I$(J #r2+&K%(L #r2+&M&(N #r2+&O'(P #r2+&Q((R #r2+&S)(T #r2+&U*(V #r2+&W+(X #r2+&Y,(Z #r2+&[-(\ #r2+&].(^ #r2+&_/( adAbD!h uuQT\\ 24R4 8{KH$MMOMA2r88HMM!&!R$DdkknnUVU]U]_`_f_fFgpqrwwr1L *--!-4Q7N~%DKGGAGG$%%r   )r    r"   )r    tuple[int, int]r3   None)r    ro   r3   ztuple[int, int, int, int]Fr-   r   rX   rR   r3   r   )__name__
__module____qualname____firstlineno____doc____annotations__r   staticmethodr!   rm   __static_attributes____classcell__r&   s   @r   r   r   +   s6    
 H 4 4B& B&r   r   c                  R   ^  \ rS rSrSrSU 4S jjr\SS j5       rS	S
S jjrSr	U =r
$ )NonMaximaSuppression3d   z'Apply non maxima suppression to filter.c                t   > [         TU ]  5         Xl        U R                  U5      U l        [        U6 U l        g )N)r   r   r    _compute_zero_padding3dr"   r   r   r$   s     r   r   NonMaximaSuppression3d.__init__   s3    1<<@<X<XYd<e'5r   c                    [        U [        5      (       d  [        [        U 5      5      e[	        U 5      S:w  a  [        U 5      eSS jnU u  p#nX"X3XD4$ )Nr=   c                    U S-
  S-  $ r*   r+   r,   s    r   r.   ;NonMaximaSuppression3d._compute_zero_padding3d.<locals>.pad   r0   r   r1   r4   )r    r.   r   r   r   s        r   r   .NonMaximaSuppression3d._compute_zero_padding3d   sV     +u-- k!233{q  --	  !
''r   c           
        [        UR                  5      S:w  a  [        UR                  5      eUR                  5       u  p4pVnU R                  S:X  Ga  [
        R                  " X4XVXqR                  [
        R                  S9nUSSS2SS2SS24   n	XSSS2SS2SS24   :  XSSS2SS2SS24   :  -  XSSS2SS2S	S 24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2S	S 24   :  -  XSSS2S	S 2SS24   :  -  XSSS2S	S 2SS24   :  -  XSSS2S	S 2S	S 24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2S	S 24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2S	S 24   :  -  XSSS2S	S 2SS24   :  -  XSSS2S	S 2SS24   :  -  XSSS2S	S 2S	S 24   :  -  XSS	S 2SS2SS24   :  -  XSS	S 2SS2SS24   :  -  XSS	S 2SS2S	S 24   :  -  XSS	S 2SS2SS24   :  -  XSS	S 2SS2SS24   :  -  XSS	S 2SS2S	S 24   :  -  XSS	S 2S	S 2SS24   :  -  XSS	S 2S	S 2SS24   :  -  XSS	S 2S	S 2S	S 24   :  -  USSS2SS2SS24'   O[        R                  " [        R                  " U[        U R                  5      S S S2   S
S9U R                  R                  USSSS5      R!                  UR                  UR"                  5      SUS9R%                  X4SXVU5      R'                  S	SS9S   n
X:  nU(       a  U$ XR!                  UR"                  5      -  $ )NrC   )r=   r=   r=   r@   .r   r?   r   r>   r   rI   rJ   )rL   groupsF)rM   keepdim)r9   rN   r7   rO   r    r
   rQ   rA   rR   rS   conv3dr.   rT   r"   r   repeatrV   rB   r   rW   )r%   r-   rX   rY   rZ   Dr[   r\   r_   r`   rl   s              r   rm   NonMaximaSuppression3d.forward   s	   qww<1 ))qQy( ;;qaAhhejjQD3"adAbD()BQrT1R42-..#qtQrT1R4/002#qtQrT12-..0 #qtQrT1R4/002 #qtQrT1R4/00	2
 #qtQrT12-..0 #qtQR2-..0 #qtQR2-..0 #qtQR+,,. #qtQrT1R4/00	2 #qtQrT1R4/00
2 #qtQrT12-..0 #qtQrT1R4/002 #qtQrT12-..0 #qtQR2-..0 #qtQR2-..0  #qtQR+,,!." #qr1R42-..#0$ #qr1R42-..%0& #qr1R4+,,'.( #qr1R42-..)0* #qr1R42-..+0, #qr1R4+,,-.. #qr12qt+,,/.0 #qr12qt+,,1.2 #qr12qr/**3, adAbD!B$&'< EE!T$,,/"5KHKK&&r1aA699!((AGGL	 aRq)E*1.  %DKGGAGG$%%r   )r   r    r"   )r    tuple[int, int, int]r3   rp   )r    r   r3   z#tuple[int, int, int, int, int, int]rq   rr   )rs   rt   ru   rv   rw   r   ry   r   rm   rz   r{   r|   s   @r   r~   r~      s)    26 ( (5& 5&r   r~   c                $    [        U5      " X5      $ )zrApply non maxima suppression to filter.

See :class:`~kornia.geometry.subpix.NonMaximaSuppression2d` for details.
)r   inputr    rX   s      r   nms2dr     s    
 "+.u@@r   c                $    [        U5      " X5      $ )zkApply non maxima suppression to filter.

See
:class: `~kornia.feature.NonMaximaSuppression3d` for details.
)r~   r   s      r   nms3dr   &  s     "+.u@@r   c           
        U R                  5       S:w  a  [        U R                  5      eU R                  u  pp4n[        R                  " XX4XPR
                  [        R                  S9n[        R                  " XX4XPR
                  [        R                  S9nU SSS2SS2SS24   nXSSS2SS2SS24   :  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS	24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS	24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS	24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS	24   :  -  XSSS	2SS	2SS24   :  -  XSSS	2SS	2SS24   :  -  XSSS	2SS	2SS	24   :  -  n	XSSS2SS2SS24   :  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS	24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS2SS24   :  -  XSSS2SS2SS	24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS24   :  -  XSSS2SS	2SS	24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS	24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS24   :  -  XSSS	2SS2SS	24   :  -  XSSS	2SS	2SS24   :  -  XSSS	2SS	2SS24   :  -  XSSS	2SS	2SS	24   :  -  n
XSSS2SS2SS24'   XSSS2SS2SS24'   Xg4$ )
a  Compute both local-maxima and local-minima NMS masks for a 3-D scale-space tensor in one pass.

Equivalent to calling ``nms3d(input, (3,3,3), mask_only=True)`` and
``nms3d(-input, (3,3,3), mask_only=True)`` separately, but only traverses
the 26-neighbour comparisons once, halving the NMS cost.

Uses integer slice literals (not Python loops or slice objects) so the 52
comparison-and-reduction ops are visible to the compiler at trace time,
allowing full fusion into a minimal number of kernels.

Args:
    input: 5-D tensor of shape :math:`(B, C, D, H, W)`.

Returns:
    A pair ``(max_mask, min_mask)`` of bool tensors with the same shape as
    *input*.  ``max_mask[..., d, h, w]`` is ``True`` when the voxel is
    strictly greater than all 26 neighbours; ``min_mask`` is the same for
    strict local minima.

Example:
    >>> x = torch.randn(1, 1, 5, 10, 10)
    >>> max_mask, min_mask = nms3d_minmax(x)
    >>> max_mask.shape
    torch.Size([1, 1, 5, 10, 10])

rC   r@   .r   r?   r   r>   r   N)rM   r7   rN   r
   rQ   rA   rR   )r   rY   rZ   r   r[   r\   max_maskmin_maskr`   is_maxis_mins              r   nms3d_minmaxr   /  sB   6 yy{aU[[))[[NA1{{1!,,ejjQH{{1!,,ejjQH	sAbD!B$"$	%B 
C2qtQrT)*	*c1R42qt+,,	.c1R42qr)**	, c1R42qt+,,	. c1R42qt+,,		.
 c1R42qr)**	, c1R4QrT)**	, c1R4QrT)**	, c1R4QR'((	* c1R42qt+,,		. c1R42qt+,,
	. c1R42qr)**	, c1R42qt+,,	. c1R42qr)**	, c1R4QrT)**	, c1R4QrT)**	,  c1R4QR'((!	*" c12qtQrT)**#	,$ c12qtQrT)**%	,& c12qtQR'(('	*( c12qtQrT)**)	,* c12qtQrT)**+	,, c12qtQR'((-	*. c12qr1R4'((/	*0 c12qr1R4'((1	*2 c12qr12o&&3	( : 
C2qtQrT)*	*c1R42qt+,,	.c1R42qr)**	, c1R42qt+,,	. c1R42qt+,,		.
 c1R42qr)**	, c1R4QrT)**	, c1R4QrT)**	, c1R4QR'((	* c1R42qt+,,		. c1R42qt+,,
	. c1R42qr)**	, c1R42qt+,,	. c1R42qr)**	, c1R4QrT)**	, c1R4QrT)**	,  c1R4QR'((!	*" c12qtQrT)**#	,$ c12qtQrT)**%	,& c12qtQR'(('	*( c12qtQrT)**)	,* c12qtQrT)**+	,, c12qtQR'((-	*. c12qr1R4'((/	*0 c12qr1R4'((1	*2 c12qr12o&&3	( 8 '-S!B$"ad"#&,S!B$"ad"#r   )r   r2   r   r2   r3   r   )r   r2   r   r2   r   r2   r3   r   rq   )r   r   r    ro   rX   rR   r3   r   )r   r   r    r   rX   rR   r3   r   )r   r   r3   z!tuple[torch.Tensor, torch.Tensor])
__future__r   r
   torch.nn.functionalr   
functionalrS   r   r   Moduler   r~   r   r   r   r+   r   r   <module>r      sX   $ #    )-^&RYY ^&BL&RYY L&dAA]r   