
    kh=                        d Z ddlZddlmZ ddlmc mZ ddlmZ 	 	 	 	 	 	 dde	de
de	ded	ed
efdZ	 	 	 	 	 ddej                  de	de
de	ded	efdZ G d dej                        Zdde	dedefdZ G d dej                        Zy)a>   DropBlock, DropPath

PyTorch implementations of DropBlock and DropPath (Stochastic Depth) regularization layers.

Papers:
DropBlock: A regularization method for convolutional networks (https://arxiv.org/abs/1810.12890)

Deep Networks with Stochastic Depth (https://arxiv.org/abs/1603.09382)

Code:
DropBlock impl inspired by two Tensorflow impl that I liked:
 - https://github.com/tensorflow/tpu/blob/master/models/official/resnet/resnet_model.py#L74
 - https://github.com/clovaai/assembled-cnn/blob/master/nets/blocks.py

Hacked together by / Copyright 2020 Ross Wightman
    N   )ndgrid	drop_prob
block_sizegamma_scale
with_noiseinplace	batchwisec                 .   | j                   \  }}}	}
|
|	z  }t        |t        |
|	            }||z  |z  |dz  z  |
|z
  dz   |	|z
  dz   z  z  }t        t        j                  |
| j
                        t        j                  |	| j
                              \  }}||dz  k\  ||
|dz
  dz  z
  k  z  ||dz  k\  ||	|dz
  dz  z
  k  z  z  }t        j                  |dd|	|
f      j                  | j                        }|r1t        j                  d||	|
f| j                  | j
                        }nt        j                  |       }d|z
  |z
  |z   dk\  j                  | j                        }t        j                  | |d|dz         }|r|r0t        j                  d||	|
f| j                  | j
                        nt        j                  |       }|r(| j                  |      j!                  |d|z
  z         | S | |z  |d|z
  z  z   } | S |j#                         |j                  t        j$                        j'                         j)                  d      z  j                  | j                        }|r| j                  ||z         | S | |z  |z  } | S )a	   DropBlock. See https://arxiv.org/pdf/1810.12890.pdf

    DropBlock with an experimental gaussian noise option. This layer has been tested on a few training
    runs with success, but needs further validation and possibly optimization for lower runtime impact.
       r   )devicedtype)r   r   kernel_sizestridepaddinggHz>)shapeminr   torcharanger   reshapetor   rand	rand_likeF
max_pool2drandn
randn_likemul_add_numelfloat32sumadd)xr   r   r   r   r	   r
   BCHW
total_sizeclipped_block_sizegammaw_ih_ivalid_blockuniform_noise
block_masknormal_noisenormalize_scales                        L/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/layers/drop.pydrop_block_2dr6      s    JAq!QQJZQ3)#j03E3JJ^aA
NQ$679E ell1QXX6Qqxx8XYHC-22sQBTWXBX]^A^=^7^_-22sQBTWXBX]^A^=^7^_aK--aAq\:==AGG=LK

Aq!Q<qwwqxxP*u9{*]:q@DD177DSJ,,	&"a'	) )J T]u{{Aq!Q<qwwqxxPchcscstucvFF:##LA
N$CD H JZ!@@A H &++-
EMM0R0V0V0X0\0\]a0bbffghgngnoFF:/0 H J0AH    r&   c                 (   | j                   \  }}}}	|	|z  }
t        |t        |	|            }||z  |
z  |dz  z  |	|z
  dz   ||z
  dz   z  z  }t        j                  |       j	                  |      }t        j                  |j                  | j                        |d|dz        }|r]t        j                  |       j                         }|r(| j                  d|z
        j                  ||z         | S | d|z
  z  ||z  z   } | S d|z
  }|j                         |j                  t        j                        j                         j                  d      z  j                  | j                        }|r| j                  ||z         | S | |z  |z  } | S )z DropBlock. See https://arxiv.org/pdf/1810.12890.pdf

    DropBlock with an experimental gaussian noise option. Simplied from above without concern for valid
    block mask at edges.
    r   r   r         ?r   gư>)r   r   r   
empty_like
bernoulli_r   r   r   r   normal_r    r!   r"   r#   r$   r%   )r&   r   r   r   r   r	   r'   r(   r)   r*   r+   r,   r-   r2   r3   r4   s                   r5   drop_block_fast_2dr=   N   s    JAq!QQJZQ3)#j03E3JJ^aA
NQ$679E !!!$//6Jagg,>qRdhiRikJ ''*224FF2
?#((
)BC H R*_%z(AAA H ^
%++-
EMM0R0V0V0X0\0\]a0bbffmnmtmtfuFF:/0 H J0AHr7   c                   V     e Zd ZdZ	 	 	 	 	 	 	 ddededededededef fd	Zd
 Z xZ	S )DropBlock2dz9 DropBlock. See https://arxiv.org/pdf/1810.12890.pdf
    r   r   r   r   r	   r
   fastc                     t         t        |           || _        || _        || _        || _        || _        || _        || _	        y N)
superr?   __init__r   r   r   r   r	   r
   r@   )	selfr   r   r   r   r	   r
   r@   	__class__s	           r5   rD   zDropBlock2d.__init__y   sD     	k4)+"&$$"	r7   c           	      l   | j                   r| j                  s|S | j                  rBt        || j                  | j                  | j
                  | j                  | j                        S t        || j                  | j                  | j
                  | j                  | j                  | j                        S rB   )
trainingr   r@   r=   r   r   r   r	   r6   r
   rE   r&   s     r5   forwardzDropBlock2d.forward   s    }}DNNH99%4>>4??D4D4DdooW[WcWce e !4>>4??D4D4DdooW[WcWceiesesu ur7   )皙?   r9   FFFT)
__name__
__module____qualname____doc__floatintboolrD   rJ   __classcell__rF   s   @r5   r?   r?   u   sn    
  #!$$!#  	
    $ur7   r?   rH   scale_by_keepc                     |dk(  s|s| S d|z
  }| j                   d   fd| j                  dz
  z  z   }| j                  |      j                  |      }|dkD  r|r|j	                  |       | |z  S )a(  Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).

    This is the same as the DropConnect impl I created for EfficientNet, etc networks, however,
    the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper...
    See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ... I've opted for
    changing the layer and argument names to 'drop path' rather than mix DropConnect as a layer name and use
    'survival rate' as the argument.

            r   r   )r   )r   ndim	new_emptyr;   div_)r&   r   rH   rV   	keep_probr   random_tensors          r5   	drop_pathr^      sw     BhIIWWQZMDAFFQJ//EKK&11)<M3=9%}r7   c                   :     e Zd ZdZddedef fdZd Zd Z xZ	S )DropPathz^Drop paths (Stochastic Depth) per sample  (when applied in main path of residual blocks).
    r   rV   c                 F    t         t        |           || _        || _        y rB   )rC   r`   rD   r   rV   )rE   r   rV   rF   s      r5   rD   zDropPath.__init__   s    h&("*r7   c                 Z    t        || j                  | j                  | j                        S rB   )r^   r   rH   rV   rI   s     r5   rJ   zDropPath.forward   s!    DNNDMM4;M;MNNr7   c                 6    dt        | j                  d      dS )Nz
drop_prob=   z0.3f)roundr   )rE   s    r5   
extra_reprzDropPath.extra_repr   s    E$..3D9::r7   )rX   T)
rM   rN   rO   rP   rQ   rS   rD   rJ   rf   rT   rU   s   @r5   r`   r`      s&    +% +T +
O;r7   r`   )rK   rL   r9   FFF)rK   rL   r9   FF)rX   FT)rP   r   torch.nnnntorch.nn.functional
functionalr   gridr   rQ   rR   rS   r6   Tensorr=   Moduler?   r^   r`    r7   r5   <module>ro      s         
   33 3 	3
 3 3 3p   $<<$$ $ 	$
 $ $Nu")) uBE $ t (;ryy ;r7   