
    Ng=                        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dS )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皙?         ?F	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                  }|r&t          j	        d||	|
f| j        | j                  }nt          j
        |           }d|z
  |z
  |z   dk                        | j                  }t          j        | |d|dz             }|r{|r%t          j        d||	|
f| j        | j                  nt          j        |           }|r/|                     |                              |d|z
  z             n| |z  |d|z
  z  z   } n|                                |                    t          j                                                                      d          z                      | j                  }|r|                     ||z             n| |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/html/ai-engine/env/lib/python3.11/site-packages/timm/layers/drop.pydrop_block_2dr9      s    JAq!QQJZQ33)#j03E3JJ^aA
NQ$679E el1QX666Qqx8X8X8XYYHC-22sQBTWXBX]^A^=^7^_-22sQBTWXBX]^A^=^7^_aK-aAq\::==AG=LLK +
Aq!Q<qwqxPPP**u9{*]:q@DD17DSSJ,	&"a'	) ) ) )J  1T]vu{Aq!Q<qwqxPPPPchcstucvcv 	AFF:##LA
N$CDDDDJZ!@@AA%++--
EM0R0R0V0V0X0X0\0\]a0b0bbffghgnoo 	1FF:/0000J0AH    r)   c                 ^   | j         \  }}}}	|	|z  }
t          |t          |	|                    }||z  |
z  |dz  z  |	|z
  dz   ||z
  dz   z  z  }t          j        |                               |          }t          j        |                    | j                  |d|dz            }|rft          j        |           	                                }|r/| 
                    d|z
                                ||z             n| d|z
  z  ||z  z   } nd|z
  }|                                |                    t          j                                                                      d          z                      | j                  }|r| 
                    ||z             n| |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   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/   r0   r5   r6   r7   s                   r8   drop_block_fast_2dr?   N   s    JAq!QQJZQ33)#j03E3JJ^aA
NQ$679E !!$$//66Jag,>qRdhiRik k kJ  1'**2244 	BFF2
?##((
)BCCCCR*_%z(AAAA^
%++--
EM0R0R0V0V0X0X0\0\]a0b0bbffmnmtfuu 	1FF:/0000J0AHr:   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   FTr   r	   r
   r   r   r   fastc                     t          t          |                                            || _        || _        || _        || _        || _        || _        || _	        d S N)
superrA   __init__r   r
   r	   r   r   r   rB   )	selfr   r	   r
   r   r   r   rB   	__class__s	           r8   rF   zDropBlock2d.__init__y   sW     	k4  ))+++"&$$"			r:   c           	          | j         r| j        s|S | j        r-t          || j        | j        | j        | j        | j                  S t          || j        | j        | j        | j        | j        | j	                  S rD   )
trainingr   rB   r?   r	   r
   r   r   r9   r   rG   r)   s     r8   forwardzDropBlock2d.forward   s    } 	DN 	H9 	u%4>4?D4DdoW[Wce e e !4>4?D4DdoW[Wceiesu u ur:   )r   r   r   FFFT)
__name__
__module____qualname____doc__floatintboolrF   rL   __classcell__rH   s   @r8   rA   rA   u   s         
  #!$$!#   	
         $u u u u u u ur:   rA           TrJ   scale_by_keepc                     |dk    s|s| S d|z
  }| j         d         fd| j        dz
  z  z   }|                     |                              |          }|dk    r|r|                    |           | |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.

    rV   r   r   )r   )r   ndim	new_emptyr=   div_)r)   r   rJ   rW   	keep_probr   random_tensors          r8   	drop_pathr^      s     BhIIWQZMDAFQJ//EKK&&11)<<M3=9%%%}r:   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).
    rV   Tr   rW   c                 r    t          t          |                                            || _        || _        d S rD   )rE   r`   rF   r   rW   )rG   r   rW   rH   s      r8   rF   zDropPath.__init__   s4    h&&((("*r:   c                 D    t          || j        | j        | j                  S rD   )r^   r   rJ   rW   rK   s     r8   rL   zDropPath.forward   s    DNDM4;MNNNr:   c                 4    dt          | j        d          dS )Nz
drop_prob=   z0.3f)roundr   )rG   s    r8   
extra_reprzDropPath.extra_repr   s    :E$.33::::r:   )rV   T)
rM   rN   rO   rP   rQ   rS   rF   rL   rf   rT   rU   s   @r8   r`   r`      s{         + +% +T + + + + + +
O O O; ; ; ; ; ; ;r:   r`   )r   r   r   FFF)r   r   r   FF)rV   FT)rP   r   torch.nnnntorch.nn.functional
functionalr   gridr   rQ   rR   rS   r9   Tensorr?   ModulerA   r^   r`    r:   r8   <module>ro      s                          
   3 33 3 	3
 3 3 3 3 3 3p   $ $<$$ $ 	$
 $ $ $ $ $Nu u u u u") u u uB E $ t    (; ; ; ; ;ry ; ; ; ; ;r:   