U
    ¯Ê¹jÍ  ã                   @   s>   d dl mZmZmZ d dlZd dlmZ G dd„ dejƒZdS )é    )ÚOptionalÚTupleÚUnionNc                       sh   e Zd ZU dZejje ed< de	e
eedœ‡ fdd„Zeejeejeej f f d	œd
d„Z‡  ZS )ÚPatchDropoutz*
    https://arxiv.org/abs/2212.00794
    Úreturn_indicesç      à?é   F)ÚprobÚnum_prefix_tokensÚorderedr   c                    s@   t ƒ  ¡  d|  krdk s$n t‚|| _|| _|| _|| _d S )Nr   ç      ð?)ÚsuperÚ__init__ÚAssertionErrorr	   r
   r   r   )Úselfr	   r
   r   r   ©Ú	__class__© úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/layers/patch_dropout.pyr      s    
zPatchDropout.__init__)Úreturnc              	   C   s   | j r| jdkr"| jr|d fS |S | jrX|d d …d | j…f |d d …| jd …f  }}nd }|jd }|jd }tdt|d| j  ƒƒ}tjtj	|||j
d�dd�d d …d |…f }| jrÊ|jdd�d }| d| d¡ d|jd	d …  ¡¡}|d k	�rtj||fdd�}| j�r||fS |S )
Ng        r   r   r   )Údeviceéÿÿÿÿ)Údim)r   r   é   )Ztrainingr	   r   r
   ÚshapeÚmaxÚintÚtorchZargsortZrandnr   r   ÚsortZgatherZ	unsqueezeÚexpandÚcat)r   ÚxZprefix_tokensÚBÚLZnum_keepZkeep_indicesr   r   r   Úforward   s&    0

,&
zPatchDropout.forward)r   r   FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ZjitÚFinalÚboolÚ__annotations__Úfloatr   r   r   ZTensorr   r   r$   Ú__classcell__r   r   r   r   r      s   
    ûûr   )	Útypingr   r   r   r   Ztorch.nnÚnnÚModuler   r   r   r   r   Ú<module>   s   