o
    {i:                     @   sJ   d dl Z d dlmZmZmZ d dlmZmZ dd ZG dd dej	Z
dS )    N)CallableTupleUnion)Tensornnc                 C   s4   t | trt| dksJ | S t | tsJ | | fS )N   )
isinstancetuplelenint)x r   E/data/cameron/keygrip/volume_dino_tracks/dinov3/layers/patch_embed.pymake_2tuple   s
   
r   c                       s   e Zd ZdZ						ddeeeeef f d	eeeeef f d
edededB deddf fddZ	de
de
fddZdefddZdd Z  ZS )
PatchEmbeda%  
    2D image to patch embedding: (B,C,H,W) -> (B,N,D)

    Args:
        img_size: Image size.
        patch_size: Patch token size.
        in_chans: Number of input image channels.
        embed_dim: Number of linear projection output channels.
        norm_layer: Normalization layer.
                NTimg_size
patch_sizein_chans	embed_dim
norm_layerflatten_embeddingreturnc           
         s   t    t|}t|}|d |d  |d |d  f}	|| _|| _|	| _|	d |	d  | _|| _|| _|| _	t
j||||d| _|rK||| _d S t
 | _d S )Nr      )kernel_sizestride)super__init__r   r   r   patches_resolutionZnum_patchesr   r   r   r   Conv2dprojIdentitynorm)
selfr   r   r   r   r   r   Zimage_HWZpatch_HWZpatch_grid_size	__class__r   r   r    !   s   
	 zPatchEmbed.__init__r   c                 C   sf   |j \}}}}| |}|d|d}}|ddd}| |}| js1|d||| j}|S )Nr   r   r   )	shaper#   sizeflatten	transposer%   r   reshaper   )r&   r   _HWr   r   r   forward@   s   

zPatchEmbed.forwardc                 C   sR   | j \}}|| | j | j | jd | jd   }| jd ur'||| | j 7 }|S )Nr   r   )r!   r   r   r   r%   )r&   ZHoZWoflopsr   r   r   r3   N   s
   
(
zPatchEmbed.flopsc                 C   sp   d| j | jd d   }tj| jjt| t| | jj	d ur6tj| jj	t| t| d S d S )Nr   r   r   )
r   r   r   inituniform_r#   weightmathsqrtbias)r&   kr   r   r   reset_parametersU   s
   "&zPatchEmbed.reset_parameters)r   r   r   r   NT)__name__
__module____qualname____doc__r   r   r   r   boolr    r   r2   floatr3   r;   __classcell__r   r   r'   r   r      s4    r   )r7   typingr   r   r   torchr   r   r   Moduler   r   r   r   r   <module>   s
   	