o
    | iZ  ã                   @   sD   d dl mZ d dlZd dlm  mZ d dlZG dd„ dejƒZdS )é    Nc                       s0   e Zd Z‡ fdd„Zdd„ Zedd„ ƒZ‡  ZS )ÚMlpProjectorc                    sJ  t ƒ  ¡  || _|jdkrt ¡ }në|jdkr"t |j|j¡}nÜ|jdkrW| 	dd¡}t |j|j¡g}t
d|ƒD ]}| t ¡ ¡ | t |j|j¡¡ q;tj|Ž }n§|jdkr¿| 	dd¡}| 	dd¡}t |j|j |j ¡t |j|j |j |j| ¡g}t
d|d ƒD ]}| t ¡ ¡ | t |j| |j| ¡¡ q‹| t ¡ ¡ | t |j| |j¡¡ tj|Ž }n?|jdkr| 	dd¡}| 	dd¡}t |j|j |j |j| ¡g}t
d|d ƒD ]}| t ¡ ¡ | t |j| |j| ¡¡ qé| t ¡ ¡ | t |j| |j¡¡ tj|Ž }nâ|jd	kra| 	dd¡}t |j|jd
 ¡| _t |j|jd
 ¡| _g }t
d|ƒD ]}| t ¡ ¡ | t |j|j¡¡ qEtj|Ž }n|jdkr·| 	dd¡}| 	dd¡}t |jd t|j| ƒ¡| _t |jd |jt|j| ƒ ¡| _g }t
d|ƒD ]}| t ¡ ¡ | t |j|j¡¡ q›tj|Ž }nG|jdkrö| 	dd¡}g }t
d|ƒD ]}| t ¡ ¡ | t |jd
 |jd
 ¡¡ qÊtj|Ž }tj|Ž | _t |¡| _ntd|j› ƒ‚| 	dd¡rt |jd |j¡| _| 	dd¡r t |j|j¡| _|| _d S )NÚidentityÚlinearÚmlp_geluÚdepthé   Únormlayer_downsample_mlp_geluÚ	mlp_ratioÚdownsample_mlp_geluÚlow_high_hybrid_split_mlp_gelué   Úhybrid_split_feature_mlp_geluÚchannel_divç      à?r   Úlow_high_split_mlp_geluzUnknown projector type: Útoken_poolingFé   Úconv_fusion_high_low_features)ÚsuperÚ__init__ÚcfgÚprojector_typeÚnnÚIdentityÚLinearÚ	input_dimÚn_embedÚgetÚrangeÚappendÚGELUÚ
SequentialÚ	LayerNormÚdownsample_ratioÚhigh_up_projÚlow_up_projÚintÚhigh_layersÚcopyÚdeepcopyÚ
low_layersÚ
ValueErrorÚtoken_pooling_layerÚfusion_layerÚlayers)Úselfr   ÚmodulesÚ	mlp_depthÚ_r	   r   ©Ú	__class__© úX/home/app/DeepSeek-OCR/DeepSeek-OCR-master/DeepSeek-OCR-vllm/deepencoder/build_linear.pyr   	   sŠ   




þ " $"

zMlpProjector.__init__c              	   C   s¾  | j  dd¡ra|j\}}}t|d ƒ }}| ||||¡}| dddd¡}| ddd¡ ddd¡}| ¡ \}}}}	}
}
| ¡  ||||	 d¡}| dddd¡ ¡ }| |||	 |d	 ¡}|  	|¡}| j  d
d¡r{|  
|d d …df ¡|d d …df  }| j jdkr|d |d }}|  |¡}|  |¡}tj||gdd}| j jdkrÎ|dd | j jd …f }|d| j jd d …f }|  |¡}|  |¡}tj||gdd}| j jdkrò|d |d }}|  |¡}|  |¡}tj||gdd}|S | j jdksÿ| j jdkrZ|j\}}}t|d ƒ }}	 || j j r | j j|| j j  }nd}| ||||¡}|dkr=t |ddd|d|fdd¡}	 | dddd¡}tj|| j j| j jdd}| ddd¡}|  |¡S )Nr   Fr   r   é   r   r   éÿÿÿÿr   r   r   )Údimr   .r   r
   r   Úconstant)Úkernel_sizeÚstrideÚpadding)r   r   Úshaper&   ÚviewÚpermuteÚunfoldÚsizeÚ
contiguousr,   r-   r   r$   r%   ÚtorchÚconcatr   r'   r*   r#   ÚreshapeÚFÚpadr.   )r/   ÚxÚ
batch_sizeZwxhÚchannelsÚwÚhÚpatchesZ	h_patchesZ	w_patchesr2   Zhigh_xZlow_xÚbsÚhwr   rH   r5   r5   r6   Úforwarda   sZ   
&







zMlpProjector.forwardc                 C   s¦   | j dkrd| j | j }|d S d| j v rM|  dd¡}|  dd¡}t| jtƒr-t| jƒn| j}|| | }d| | j |d d | j | j  }|d S d}|d S )	Nr   r   r   r   r   r#   r   r7   )r   r   r   r   Ú
isinstanceÚlistÚsum)r   Úfwdr1   r#   r   r5   r5   r6   Úget_flops_per_samplež   s   

÷&þz!MlpProjector.get_flops_per_sample)Ú__name__Ú
__module__Ú__qualname__r   rQ   ÚstaticmethodrV   Ú__classcell__r5   r5   r3   r6   r      s
    X=r   )	Útorch.nnr   rD   Útorch.nn.functionalÚ
functionalrG   r(   ÚModuler   r5   r5   r5   r6   Ú<module>   s
    