o
    پi                     @   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                	       sv   e Zd ZU dZejje ed< 				dde	de
dedef fd	d
Zdeejeejeej f f fddZ  ZS )PatchDropoutzO
    https://arxiv.org/abs/2212.00794 and https://arxiv.org/pdf/2208.07220
    return_indices      ?   Fprobnum_prefix_tokensorderedc                    sB   t    d|  krdk sJ  J || _|| _|| _|| _d S )Nr         ?)super__init__r	   r
   r   r   )selfr	   r
   r   r   	__class__ M/home/ubuntu/.local/lib/python3.10/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r,|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re|jddd }|d|dd|jd	d   }|d urtj||fdd}| jr||fS |S )
Ng        r   r   r   )device)dim)r   r      )trainingr	   r   r
   shapemaxinttorchargsortrandnr   r   sortgather	unsqueezeexpandcat)r   xprefix_tokensBLnum_keepkeep_indicesr   r   r   forward   s&   0

,&zPatchDropout.forward)r   r   FF)__name__
__module____qualname____doc__r   jitFinalbool__annotations__floatr   r   r   Tensorr   r   r+   __classcell__r   r   r   r   r      s"   
 0r   )	typingr   r   r   r   torch.nnnnModuler   r   r   r   r   <module>   s    