o
    iX                     @   sz   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 zd dl
mZ W n ey1   dZY nw G dd dejZdS )	    )partialN)	rearrange)_assert)_pair)
FusedDensec                       s:   e Zd ZdZ								d fd	d
	Zdd Z  ZS )
PatchEmbedz2D Image to Patch Embedding            NTFc	           
         s   t    t|}t|}|| _|| _|d |d  |d |d  f| _| jd | jd  | _|| _|r<td u r<t	d|r@|sCt
jnt}	|	||d  |d  ||d| _|r^||| _d S t
 | _d S )Nr      zfused_dense is not installed)bias)super__init__r   img_size
patch_size	grid_sizenum_patchesflattenr   ImportErrornnLinearprojIdentitynorm)
selfr   r   in_chans	embed_dim
norm_layerr   r   fused_bias_fc
linear_cls	__class__ S/home/ubuntu/vllm_env/lib/python3.10/site-packages/flash_attn/layers/patch_embed.pyr      s   
"  zPatchEmbed.__init__c                 C   s   |j \}}}}t|| jd kd| d| jd  d t|| jd kd| d| jd  d | t|d| jd | jd d}| jrHt|d	}| |}|S )
Nr   zInput image height (z) doesn't match model (z).r   zInput image width (z$b c (h p1) (w p2) -> b h w (c p1 p2))p1p2zb h w c -> b (h w) c)shaper   r   r   r   r   r   r   )r   x_HWr#   r#   r$   forward.   s*   

zPatchEmbed.forward)r   r	   r
   r   NTTF)__name__
__module____qualname____doc__r   r,   __classcell__r#   r#   r!   r$   r      s    r   )	functoolsr   torch.nnr   einopsr   torchr   torch.nn.modules.utilsr   flash_attn.ops.fused_denser   r   Moduler   r#   r#   r#   r$   <module>   s   