o
    پif                     @   s<  d Z ddlmZmZmZmZ ddlZddlmZ ddlm	Z
 ddlmZmZmZmZmZmZmZmZmZmZmZ g dZeej Zdee defd	d
ZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZ G dd dejZ!G dd dejZ"G dd deZ#G dd dejZ$dS )z[ EfficientNet, MobileNetV3, etc Blocks

Hacked together by / Copyright 2019, Ross Wightman
    )CallableDictOptionalTypeN)
functional)create_conv2dDropPathmake_divisiblecreate_act_layer	create_aa	to_2tuple	LayerTypeConvNormActget_norm_act_layerMultiQueryAttention2dAttention2d)SqueezeExcite	ConvBnActDepthwiseSeparableConvInvertedResidualCondConvResidualEdgeResidualUniversalInvertedResidualMobileAttention
group_sizechannelsc                 C   s    | sdS ||  dksJ ||  S )N   r    )r   r   r   r   T/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/_efficientnet_blocks.py
num_groups   s   r   c                       sd   e Zd ZdZddejejddfdedede	e de
de
d	e	e
 d
e	e f fddZdd Z  ZS )r   a   Squeeze-and-Excitation w/ specific features for EfficientNet/MobileNet family

    Args:
        in_chs (int): input channels to layer
        rd_ratio (float): ratio of squeeze reduction
        act_layer (nn.Module): activation layer of containing block
        gate_layer (Callable): attention gate function
        force_act_layer (nn.Module): override block's activation fn if this is set/bound
        rd_round_fn (Callable): specify a fn to calculate rounding of reduced chs
    g      ?Nin_chsrd_ratiord_channels	act_layer
gate_layerforce_act_layerrd_round_fnc                    sv   t t|   |d u r|pt}||| }|p|}tj||ddd| _t|dd| _tj||ddd| _	t|| _
d S )Nr   T)biasinplace)superr   __init__roundnnConv2dconv_reducer
   act1conv_expandgate)selfr    r!   r"   r#   r$   r%   r&   	__class__r   r   r+   +   s   
zSqueezeExcite.__init__c                 C   s:   |j ddd}| |}| |}| |}|| | S )N)      T)keepdim)meanr/   r0   r1   r2   )r3   xx_ser   r   r   forward?   s
   


zSqueezeExcite.forward)__name__
__module____qualname____doc__r-   ReLUSigmoidintfloatr   r   r   r+   r<   __classcell__r   r   r4   r   r      s0    r   c                       s~   e Zd ZdZdddddejejddf	ded	ed
ededededede	de
de
dee
 def fddZdd Zdd Z  ZS )r   z@ Conv + Norm Layer + Activation w/ optional skip connection
    r   r    FN        r    out_chskernel_sizestridedilationr   pad_typeskipr#   
norm_layeraa_layerdrop_path_ratec              	      s   t t|   t|
|	}t||}|o|dko||k| _|d uo#|dk}t||||r,dn||||d| _||dd| _t	||||d| _
|rMt|| _d S t | _d S )Nr   rJ   rK   groupspaddingTr(   r   rJ   enable)r*   r   r+   r   r   has_skipr   convbn1r   aar   r-   Identity	drop_path)r3   r    rH   rI   rJ   rK   r   rL   rM   r#   rN   rO   rP   norm_act_layerrR   use_aar4   r   r   r+   J   s   


 zConvBnAct.__init__c                 C   s*   |dkrt dd| jjdS t d| jjdS )N	expansionrX   r<   module	hook_typenum_chsrF   r`   rb   )dictrW   out_channelsr3   locationr   r   r   feature_infog      zConvBnAct.feature_infoc                 C   s:   |}|  |}| |}| |}| jr| || }|S N)rW   rX   rY   rV   r[   r3   r:   shortcutr   r   r   r<   m   s   


zConvBnAct.forwardr=   r>   r?   r@   r-   rA   BatchNorm2drC   strboolr   r   rD   r+   rh   r<   rE   r   r   r4   r   r   G   sL    	
r   c                !       s   e Zd ZdZdddddddddejejdddfd	ed
edededededede	dede	dede
de
dee
 dee def  fddZdd Zdd Z  ZS )r   z Depthwise-separable block
    Used for DS convs in MobileNet-V1 and in the place of IR blocks that have no expansion
    (factor of 1.0). This is an alternative to having a IR with an optional first pw conv.
    r7   r   rF   Fr   NrG   r    rH   dw_kernel_sizerJ   rK   r   rL   noskippw_kernel_sizepw_acts2dr#   rN   rO   se_layerrP   c              	      sX  t t|   t||}|dko||ko| | _|
| _|d uo"|dk}|dkrPt|d }t||dddd| _|||| _	|d d }|dkrIdn|}|}d}nd | _d | _	|}t
||}t||||redn||||d| _||dd	| _t||||d
| _|r|||dnt | _t|||	|d| _||d| jd| _|rt|| _d S t | _d S )Nr      r6   samerI   rJ   rS   F)rJ   rK   rS   rR   Tr(   rT   r#   rS   )r)   	apply_act)r*   r   r+   r   rV   
has_pw_actrC   r   conv_s2dbn_s2dr   conv_dwrX   r   rY   r-   rZ   seconv_pwbn2r   r[   )r3   r    rH   rq   rJ   rK   r   rL   rr   rs   rt   ru   r#   rN   rO   rv   rP   r\   r]   sd_chsdw_pad_typerR   r4   r   r   r+   |   s8   


 zDepthwiseSeparableConv.__init__c                 C   *   |dkrt dd| jjdS t d| jjdS Nr^   r   forward_prer_   rF   rc   rd   r   in_channelsre   rf   r   r   r   rh      ri   z#DepthwiseSeparableConv.feature_infoc                 C   sv   |}| j d ur|  |}| |}| |}| |}| |}| |}| |}| |}| jr9| 	|| }|S rj   )
r~   r   r   rX   rY   r   r   r   rV   r[   rk   r   r   r   r<      s   








zDepthwiseSeparableConv.forward)r=   r>   r?   r@   r-   rA   rn   rC   ro   rp   r   r   
ModuleTyperD   r+   rh   r<   rE   r   r   r4   r   r   w   sf    	
7r   c                %       s   e Zd ZdZddddddddddejejdddd	fd
ededededededede	de
dedededededee dee dee de
f$ fddZdd Zd d! Z  ZS )"r   a   Inverted residual block w/ optional SE

    Originally used in MobileNet-V2 - https://arxiv.org/abs/1801.04381v4, this layer is often
    referred to as 'MBConv' for (Mobile inverted bottleneck conv) and is also used in
      * MNasNet - https://arxiv.org/abs/1807.11626
      * EfficientNet - https://arxiv.org/abs/1905.11946
      * MobileNet-V3 - https://arxiv.org/abs/1905.02244
    r7   r   rF   F      ?r   NrG   r    rH   rq   rJ   rK   r   rL   rr   	exp_ratioexp_kernel_sizers   ru   r#   rN   rO   rv   conv_kwargsrP   c                    s  t t|   t||}|pi }||ko|dko| | _|d uo#|dk}|dkrQt|d }t||dddd| _|||| _|d d }|dkrJdn|}|}d}nd | _d | _|}t	||	 }t
||}t|||
fd|i|| _||dd	| _t|||f|rdn||||d
|| _||dd	| _t||||d| _|r|||dnt | _t|||fd|i|| _||dd| _|rt|| _d S t | _d S )Nr   rw   r6   rx   ry   FrS   Tr(   rQ   rT   rz   r|   )r*   r   r+   r   rV   rC   r   r~   r   r	   r   r   rX   r   r   r   rY   r-   rZ   r   conv_pwlbn3r   r[   )r3   r    rH   rq   rJ   rK   r   rL   rr   r   r   rs   ru   r#   rN   rO   rv   r   rP   r\   r]   r   r   mid_chsrR   r4   r   r   r+      sD   


 zInvertedResidual.__init__c                 C   r   Nr^   r   r   r_   rF   rc   rd   r   r   re   rf   r   r   r   rh     ri   zInvertedResidual.feature_infoc                 C   s   |}| j d ur|  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| j
rC| || }|S rj   )r~   r   r   rX   r   r   rY   r   r   r   rV   r[   rk   r   r   r   r<     s   










zInvertedResidual.forwardr=   r>   r?   r@   r-   rA   rn   rC   ro   rp   rD   r   r   r   r   r+   rh   r<   rE   r   r   r4   r   r      sr    	
@r   c                       s4   e Zd Zd
dededef fddZdd	 Z  ZS )LayerScale2dh㈵>Fdiminit_valuesr)   c                    s*   t    || _t|t| | _d S rj   )r*   r+   r)   r-   	Parametertorchonesgamma)r3   r   r   r)   r4   r   r   r+   ,  s   
zLayerScale2d.__init__c                 C   s*   | j dddd}| jr||S || S )Nr   )r   viewr)   mul_)r3   r:   r   r   r   r   r<   1  s   zLayerScale2d.forward)r   F)	r=   r>   r?   rC   rD   rp   r+   r<   rE   r   r   r4   r   r   +  s    r   c                &       s   e Zd ZdZdddddddddejejdddd	d
fdededededededededede	de
dededee dee dee de
dee
 f$ fddZdd  Zd!d" Z  ZS )#r   a   Universal Inverted Residual Block (aka Universal Inverted Bottleneck, UIB)

    For MobileNetV4 - https://arxiv.org/abs/, referenced from
    https://github.com/tensorflow/models/blob/d93c7e932de27522b2fa3b115f58d06d6f640537/official/vision/modeling/layers/nn_blocks.py#L778
    r   r7   r   rF   Fr   NrG   r   r    rH   dw_kernel_size_startdw_kernel_size_middw_kernel_size_endrJ   rK   r   rL   rr   r   r#   rN   rO   rv   r   rP   layer_scale_init_valuec                    s  t t|   |p
i }||ko|dko|
 | _|dkr#|s#|s#|s#J |rE|s)|nd}t||}t|||f||||	d|||d|| _nt | _t	|| }t||df|	||d|| _
|rzt||}t|||f||||	|||d|| _nt | _|r|||dnt | _t||df|	d||d|| _|r|s|s|nd}t||}|dkr|rJ t|||f||||	d||d|| _nt | _|d urt||| _nt | _|rt|| _d S t | _d S )	Nr   F)rJ   rK   rR   rS   r|   r#   rN   rO   )rS   r#   rN   )rJ   rK   rR   rS   r#   rN   rO   rz   )rS   r|   r#   rN   )rJ   rK   rR   rS   r|   r#   rN   )r*   r   r+   rV   r   r   dw_startr-   rZ   r	   pw_expdw_midr   pw_projdw_endr   layer_scaler   r[   )r3   r    rH   r   r   r   rJ   rK   r   rL   rr   r   r#   rN   rO   rv   r   rP   r   dw_start_stridedw_start_groupsr   rR   dw_end_stridedw_end_groupsr4   r   r   r+   =  s   



	
	

	
	


 z"UniversalInvertedResidual.__init__c                 C   s.   |dkrt dd| jjjdS t d| jjjdS )Nr^   zpw_proj.convr   r_   rF   rc   )rd   r   rW   r   re   rf   r   r   r   rh     s   z&UniversalInvertedResidual.feature_infoc                 C   sb   |}|  |}| |}| |}| |}| |}| |}| |}| jr/| || }|S rj   )	r   r   r   r   r   r   r   rV   r[   rk   r   r   r   r<     s   






z!UniversalInvertedResidual.forwardr   r   r   r4   r   r   6  sr    
	
pr   c                1       s   e Zd ZdZdddddddddddddejejd	d
d
d
dddfdedededededededededede	dededede	de
de
dee
 deded ed!ee d"e	d#e	f0 fd$d%Zd&d' Zd(d) Z  ZS )*r   z Mobile Attention Block

    For MobileNetV4 - https://arxiv.org/abs/, referenced from
    https://github.com/tensorflow/models/blob/d93c7e932de27522b2fa3b115f58d06d6f640537/official/vision/modeling/layers/nn_blocks.py#L1504
    r   r7   rF      @   F)r   r   NrG   r   r    rH   rJ   rq   rK   r   rL   	num_headskey_dim	value_dimuse_multi_queryquery_strides	kv_stridecpe_dw_kernel_sizerr   r#   rN   rO   rP   	attn_drop	proj_dropr   use_biasuse_cpec                    s&  t t|   t||}|dko||ko| | _t|| _|| _tdd | jD | _	|r9t
||||ddd| _nd | _||dd| _|d u rS||	 dksOJ ||	 }|rht||||	|
||||||||d	| _nt||||||d
| _|d ur~t||| _nt | _|rt|| _d S t | _d S )Nr   c                 S   s   g | ]}|d kqS )r   r   ).0sr   r   r   
<listcomp>  s    z,MobileAttention.__init__.<locals>.<listcomp>T)rI   rK   	depthwiser'   Fr   r   )dim_outr   r   r   r   r   rq   rK   rS   r   r   rN   )r   r   r   r   r'   )r*   r   r+   r   rV   r   r   r   anyhas_query_strider   conv_cpe_dwnormr   attnr   r   r   r-   rZ   r   r[   )r3   r    rH   rJ   rq   rK   r   rL   r   r   r   r   r   r   r   rr   r#   rN   rO   rP   r   r   r   r   r   r\   r4   r   r   r+     s^   



	
 zMobileAttention.__init__c                 C   r   r   r   rf   r   r   r   rh   !  ri   zMobileAttention.feature_infoc                 C   sV   | j d ur|  |}|| }|}| |}| |}| |}| jr)| || }|S rj   )r   r   r   r   rV   r[   )r3   r:   x_cperl   r   r   r   r<   '  s   




zMobileAttention.forwardrm   r   r   r4   r   r     s    		
Zr   c                #       s   e Zd ZdZdddddddddejejdddd	fd
ededededededede	de
dededededee dee dede
f" fddZdd Z  ZS )r   z, Inverted residual block w/ CondConv routingr7   r   rF   Fr   Nr   rG   r    rH   rq   rJ   rK   r   rL   rr   r   r   rs   r#   rN   rO   rv   num_expertsrP   c                    s\   || _ t| j d}tt| j||f|||||||	|
|||||||d t|| j | _d S )N)r   )rq   rJ   rK   r   rL   rr   r   r   rs   r#   rN   rO   rv   r   rP   )r   rd   r*   r   r+   r-   Linear
routing_fn)r3   r    rH   rq   rJ   rK   r   rL   rr   r   r   rs   r#   rN   rO   rv   r   rP   r   r4   r   r   r+   9  s.   
zCondConvResidual.__init__c                 C   s   |}t |dd}t| |}| ||}| |}| ||}| 	|}| 
|}| ||}| |}| jrC| || }|S )Nr   )Fadaptive_avg_pool2dflattenr   sigmoidr   r   rX   r   r   r   r   r   rV   r[   )r3   r:   rl   pooled_inputsrouting_weightsr   r   r   r<   e  s   



zCondConvResidual.forward)r=   r>   r?   r@   r-   rA   rn   rC   ro   rp   rD   r   r   r   r+   r<   rE   r   r   r4   r   r   6  sj    	
,r   c                !       s   e Zd ZdZdddddddddejejddd	fd
edededededededede	de
dedededee dee de
f  fddZdd Zdd Z  ZS ) r   a(   Residual block with expansion convolution followed by pointwise-linear w/ stride

    Originally introduced in `EfficientNet-EdgeTPU: Creating Accelerator-Optimized Neural Networks with AutoML`
        - https://ai.googleblog.com/2019/08/efficientnet-edgetpu-creating.html

    This layer is also called FusedMBConv in the MobileDet, EfficientNet-X, and EfficientNet-V2 papers
      * MobileDet - https://arxiv.org/abs/2004.14525
      * EfficientNet-X - https://arxiv.org/abs/2102.05610
      * EfficientNet-V2 - https://arxiv.org/abs/2104.00298
    r7   r   r   rF   Fr   NrG   r    rH   r   rJ   rK   r   rL   force_in_chsrr   r   rs   r#   rN   rO   rv   rP   c              	      s  t t|   t||}|dkrt||
 }nt||
 }t||}||ko,|dko,|	 | _|d uo5|dk}t||||r>dn||||d| _||dd| _	t
||||d| _|r^|||dnt | _t||||d| _||d	d
| _|r|t|| _d S t | _d S )Nr   r   rQ   Tr(   rT   rz   r{   Fr   )r*   r   r+   r   r	   r   rV   r   conv_exprX   r   rY   r-   rZ   r   r   r   r   r[   )r3   r    rH   r   rJ   rK   r   rL   r   rr   r   rs   r#   rN   rO   rv   rP   r\   r   rR   r]   r4   r   r   r+     s&   


 zEdgeResidual.__init__c                 C   r   r   r   rf   r   r   r   rh     ri   zEdgeResidual.feature_infoc                 C   sX   |}|  |}| |}| |}| |}| |}| |}| jr*| || }|S rj   )r   rX   rY   r   r   r   rV   r[   rk   r   r   r   r<     s   





zEdgeResidual.forward)r=   r>   r?   r@   r-   rA   rn   rC   ro   rp   rD   r   r   r   r+   rh   r<   rE   r   r   r4   r   r   u  sf    	
.r   )%r@   typingr   r   r   r   r   torch.nnr-   r   r   timm.layersr   r   r	   r
   r   r   r   r   r   r   r   __all__Moduler   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s&    4
	(0Rb u?