
    RЦij                        S r SSKJrJrJrJrJr  SSKrSSKJ	r	  SSKJ
r  SSKJrJrJrJrJrJrJrJrJrJrJrJr  / SQr\\	R4                     rS\\   S\4S	 jr " S
 S\	R4                  5      r " S S\	R4                  5      r " S S\	R4                  5      r  " S S\	R4                  5      r! " S S\	R4                  5      r" " S S\	R4                  5      r# " S S\!5      r$ " S S\	R4                  5      r%g)zZEfficientNet, MobileNetV3, etc Blocks

Hacked together by / Copyright 2019, Ross Wightman
    )CallableDictOptionalTypeUnionN)
functional)create_conv2dDropPathmake_divisiblecreate_act_layer	create_aa	to_2tuple	LayerTypeConvNormActget_norm_act_layerMultiQueryAttention2dAttention2dLayerScale2d)SqueezeExcite	ConvBnActDepthwiseSeparableConvInvertedResidualCondConvResidualEdgeResidualUniversalInvertedResidualMobileAttention
group_sizechannelsc                 .    U (       d  gX-  S:X  d   eX-  $ )N   r    )r   r   s     _/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/_efficientnet_blocks.py
num_groupsr#   "   s$     $)))%%    c                      ^  \ rS rSrSrSS\R                  \R                  SSSS4S\S\	S\
\   S\S	\S
\
\   S\
\   4U 4S jjjrS rSrU =r$ )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
                 2  > XS.n
[         TU ]  5         Uc  U=(       d    [        nU" X-  5      nU=(       d    Un[        R                  " XS4SS0U
D6U l        [        USS9U l        [        R                  " X1S4SS0U
D6U l        [        U5      U l	        g )Ndevicedtyper    biasT)inplace)
super__init__roundnnConv2dconv_reducer   act1conv_expandgate)selfr'   r(   r)   r*   r+   r,   r-   r0   r1   dd	__class__s              r"   r5   SqueezeExcite.__init__7   s     /%.K%f&78K#0y	99V!M$M"M$Y=	99[!M$M"M$Z0	r$   c                     UR                  SSS9nU R                  U5      nU R                  U5      nU R                  U5      nXR	                  U5      -  $ )N)      T)keepdim)meanr9   r:   r;   r<   )r=   xx_ses      r"   forwardSqueezeExcite.forwardN   sR    vvfdv+%yy%99T?""r$   )r:   r;   r9   r<   )__name__
__module____qualname____firstlineno____doc__r7   ReLUSigmoidintfloatr   r   r   r5   rH   __static_attributes____classcell__r?   s   @r"   r   r   +   s    	 #)-#%77$&JJ37.211 1 "#	1
 !1 "1 &i01 "(+1 1.# #r$   r   c                      ^  \ rS rSrSrSSSSS\R                  \R                  SSSS4S	\S
\S\S\S\S\S\	\\
4   S\S\\   S\S\\   S\4U 4S jjjrS rS rSrU =r$ )r   V   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                   > XS.n[         TU ]  5         [        X5      n[        Xa5      nU=(       a    US:H  =(       a    X:H  U l        US L=(       a    US:  n[        UUU4U(       a  SOUUUUS.UD6U l        U" U4SS0UD6U l        [        U4X$US.UD6U l	        U(       a  [        U5      U l        g [        R                  " 5       U l        g )Nr/   r    r\   r]   groupspaddingr3   Tr   r\   enable)r4   r5   r   r#   has_skipr	   convbn1r   aar
   r7   Identity	drop_path)r=   r'   rZ   r[   r\   r]   r   r^   r_   r*   r`   ra   rb   r0   r1   r>   norm_act_layerre   use_aar?   s                      r"   r5   ConvBnAct.__init__Y   s    " /+JBJ/B1B1B%4&1*!	
 1F	
 	
	 "'>4>2>H[wf[XZ[5C.1r$   c                     US:X  a  [        SSU R                  R                  S9$ [        SU R                  R                  S9$ )N	expansionrk   rH   module	hook_typenum_chsrX   ru   rw   )dictrj   out_channelsr=   locations     r"   feature_infoConvBnAct.feature_info   s:    {"u	499CYCYZZr499+A+ABBr$   c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  (       a  U R	                  U5      U-   nU$ N)rj   rk   rl   ri   rn   r=   rF   shortcuts      r"   rH   ConvBnAct.forward   sM    IIaLHHQKGGAJ==q!H,Ar$   )rl   rk   rj   rn   ri   )rJ   rK   rL   rM   rN   r7   rO   BatchNorm2drQ   r   strboolr   r   rR   r5   r}   rH   rS   rT   rU   s   @r"   r   r   V   s     (*-/WW$&NN,0$&$W$W $W 	$W
 $W $W $W CHo$W $W  	*$W "$W y)$W "$W $WLC r$   r   c            !          ^  \ rS rSrSrSSSSSSSSS\R                  \R                  SSS	SS4S
\S\S\S\S\S\S\	S\
S\S\
S\S\S\S\\   S\\   S\4 U 4S jjjrS rS rSrU =r$ )r      zDepthwise-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.
rC   r    rX   Fr   NrY   r'   rZ   dw_kernel_sizer\   r]   r   r^   noskippw_kernel_sizepw_acts2dr*   r`   ra   se_layerrb   c                 ,  > UUS.n[         TU ]  5         [        X5      nUS:H  =(       a    X:H  =(       a    U(       + U l        Xl        US L=(       a    US:  nUS:X  aI  [        US-  5      n[        UU4SSSS.UD6U l        U" U40 UD6U l        US-   S-  nUS:X  a  SOUnUnSnOS U l        S U l        Un[        Xa5      n[        UUU4U(       a  SOUUUUS.UD6U l
        U" U4S	S
0UD6U l        [        U4X$US.UD6U l        U(       a  U" U4SU0UD6O[        R                  " 5       U l        [        XU	4SU0UD6U l        U" U4S
U R                  S.UD6U l        U(       a  ['        U5      U l        g [        R                  " 5       U l        g )Nr/   r       rB   samer[   r\   rf   F)r\   r]   rf   re   r3   Trg   r*   rf   )r3   	apply_act)r4   r5   r   ri   
has_pw_actrQ   r	   conv_s2dbn_s2dr#   conv_dwrk   r   rl   r7   rm   seconv_pwbn2r
   rn   )r=   r'   rZ   r   r\   r]   r   r^   r   r   r   r   r*   r`   ra   r   rb   r0   r1   r>   ro   rp   sd_chsdw_pad_typere   r?   s                            r"   r5   DepthwiseSeparableConv.__init__   s   * /+JB1:):JF
 %4&1* !8!_F)&&haPQ[aheghDM(626DK,q0Q6N$2a$7&XKFF DMDK"KJ/$	
 1F	
 	
 "&=$="=H[wf[XZ[ BJ(6=Y="=r{{}$Vn]h]Z\]!'Y44??YVXY5C.1r$   c                     US:X  a  [        SSU R                  R                  S9$ [        SU R                  R                  S9$ Nrs   r   forward_prert   rX   rx   ry   r   in_channelsrz   r{   s     r"   r}   #DepthwiseSeparableConv.feature_info   :    {"yM4<<KcKcddr4<<+D+DEEr$   c                 ~   UnU R                   b"  U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  (       a  U R                  U5      U-   nU$ r   )
r   r   r   rk   rl   r   r   r   ri   rn   r   s      r"   rH   DepthwiseSeparableConv.forward   s    ==$a AAALLOHHQKGGAJGGAJLLOHHQK==q!H,Ar$   )rl   rk   r   r   r   r   r   rn   r   ri   r   )rJ   rK   rL   rM   rN   r7   rO   r   rQ   r   r   r   r   
ModuleTyperR   r5   r}   rH   rS   rT   rU   s   @r"   r   r      s    #$ "# #%77$&NN,0-1$&'>W>W >W  	>W
 >W >W >W >W >W  >W >W >W !>W ">W y)>W  z*!>W" "#>W >W@F r$   r   c            %          ^  \ rS rSrSrSSSSSSSSSS\R                  \R                  S	S	S	S
S	S	4S\S\S\S\S\S\S\	S\
S\S\S\S\S\S\S\\   S\\   S\\   S\4$U 4S jjjrS rS rS rU =r$ )!r      ak  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
rC   r    rX   F      ?r   NrY   r'   rZ   r   r\   r]   r   r^   r   	exp_ratioexp_kernel_sizer   r   r*   r`   ra   r   conv_kwargsrb   c                   > UUS.n[         TU ]  5         [        X5      nU=(       d    0 nX:H  =(       a    US:H  =(       a    U(       + U l        US L=(       a    US:  nUS:X  aI  [	        US-  5      n[        UU4SSSS.UD6U l        U" U40 UD6U l        US-   S-  nUS:X  a  SOUnUnSnOS U l        S U l        Un[        X-  5      n[        UU5      n[        UUU
4SU0UDUD6U l
        U" U4S	S
0UD6U l        [        UUU4U(       a  SOUUUUS.UDUD6U l        U" U4S	S
0UD6U l        [        U4UUUS.UD6U l        U(       a  U" U4SU0UD6O[         R"                  " 5       U l        [        UX+4SU0UDUD6U l        U" U4SS0UD6U l        U(       a  [+        U5      U l        g [         R"                  " 5       U l        g )Nr/   r    r   rB   r   r   Frf   r3   Trd   rg   r*   r   )r4   r5   r   ri   rQ   r	   r   r   r   r#   r   rk   r   r   r   rl   r7   rm   r   conv_pwlbn3r
   rn   )r=   r'   rZ   r   r\   r]   r   r^   r   r   r   r   r   r*   r`   ra   r   r   rb   r0   r1   r>   ro   rp   r   r   mid_chsre   r?   s                               r"   r5   InvertedResidual.__init__   s   . /+JB!'R*:v{JF
%4&1* !8!_F)&&haPQ[aheghDM(626DK,q0Q6N$2a$7&XKFF DMDK"K !34J0 %VWomxm[fmjlm!'>4>2> %

 1F

 

 

 "'>4>2>H[wvf[XZ[ CK(7>i>2>PRP[P[P] &gwnPXn\gnkmn!'AUAbA5C.1r$   c                     US:X  a  [        SSU R                  R                  S9$ [        SU R                  R                  S9$ Nrs   r   r   rt   rX   rx   ry   r   r   rz   r{   s     r"   r}   InvertedResidual.feature_info>  :    {"z]DMMLeLeffr4==+E+EFFr$   c                    UnU R                   b"  U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  (       a  U R                  U5      U-   nU$ r   )r   r   r   rk   r   r   rl   r   r   r   ri   rn   r   s      r"   rH   InvertedResidual.forwardD  s    ==$a AAALLOHHQKLLOHHQKGGAJGGAJMM!HHQK==q!H,Ar$   )rl   rk   r   r   r   r   r   r   r   rn   ri   r   rJ   rK   rL   rM   rN   r7   rO   r   rQ   r   r   rR   r   r   r   r   r5   r}   rH   rS   rT   rU   s   @r"   r   r      sK    #$ "#$"##%77$&NN,0-1*.$&+HWHW HW  	HW
 HW HW HW HW HW HW !HW  HW HW !HW "HW  y)!HW" z*#HW$ "$%HW& "'HW HWTG r$   r   c            &          ^  \ rS rSrSrSSSSSSSSS\R                  \R                  S	S	S	S
SS	S	4S\S\S\S\S\S\S\S\S\	S\
S\S\S\S\\   S\\   S\\   S\S\\   4$U 4S jjjrS rS  rS!rU =r$ )"r   iV  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   rC   r    rX   Fr   NrY   h㈵>r'   rZ   dw_kernel_size_startdw_kernel_size_middw_kernel_size_endr\   r]   r   r^   r   r   r*   r`   ra   r   r   rb   layer_scale_init_valuec                 r  > UUS.n[         TU ]  5         U=(       d    0 nX:H  =(       a    US:H  =(       a    U
(       + U l        US:  a  U(       d  U(       d	  U(       d   eU(       a4  U(       d  UOSn[        X5      n[	        XU4UUUU	SUUUS.UDUD6U l        O[        R                  " 5       U l        [        X-  5      n[	        UUS4U	UUS.UDUD6U l	        U(       a*  [        UU5      n[	        UUU4UUUU	UUUS.UDUD6U l
        O[        R                  " 5       U l
        U(       a  U" U4SU0UD6O[        R                  " 5       U l        [	        UUS4U	SUUS.UDUD6U l        U(       aI  U(       d	  U(       d  UOSn[        X5      nUS:  a	  U(       a   e[	        X"U4UUUU	SUUS	.UDUD6U l        O[        R                  " 5       U l        Ub  [        UU40 UD6U l        O[        R                  " 5       U l        U(       a  [!        U5      U l        g [        R                  " 5       U l        g )
Nr/   r    F)r\   r]   re   rf   r   r*   r`   ra   )rf   r*   r`   )r\   r]   re   rf   r*   r`   ra   r*   )rf   r   r*   r`   )r\   r]   re   rf   r   r*   r`   )r4   r5   ri   r#   r   dw_startr7   rm   r   pw_expdw_midr   pw_projdw_endr   layer_scaler
   rn   )r=   r'   rZ   r   r   r   r\   r]   r   r^   r   r   r*   r`   ra   r   r   rb   r   r0   r1   r>   dw_start_stridedw_start_groupsr   re   dw_end_stridedw_end_groupsr?   s                               r"   r5   "UniversalInvertedResidual.__init__]  s   . /!'R*:v{JF
A:'+=ASSS  ,>fAO(<O' 4&!& #%!  DM KKMDM !!34!GQ
!	

 
 
 
G4F%"4! #%!  DK ++-DK CK(7>i>2>PRP[P[P] #Wa
!
 
 
 *>GYF_`M&z;Mq ##|%"4$!$ #%  DK ++-DK!-+G5KRrRD!{{}D5C.1r$   c                     US:X  a)  [        SSU R                  R                  R                  S9$ [        SU R                  R                  R                  S9$ )Nrs   zpw_proj.convr   rt   rX   rx   )ry   r   rj   r   rz   r{   s     r"   r}   &UniversalInvertedResidual.feature_info  sI    {"~PTP\P\PaPaPmPmnnr4<<+<+<+I+IJJr$   c                 B   UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU R                  (       a  U R                  U5      U-   nU$ r   )	r   r   r   r   r   r   r   ri   rn   r   s      r"   rH   !UniversalInvertedResidual.forward  s    MM!KKNKKNGGAJLLOKKNQ==q!H,Ar$   )	rn   r   r   r   ri   r   r   r   r   r   rU   s   @r"   r   r   V  sO    )*&'&' "#%77$&NN,0-1*.$&6:+vWvW vW #&	vW
 !$vW !$vW vW vW vW vW vW vW !vW "vW y)vW  z*!vW" "$#vW$ "%vW& %-UO'vW vWpK r$   r   c            1         ^  \ rS rSrSrSSSSSSSSSS	SSS\R                  \R                  S
SSSSSSS
S
4S\S\S\S\S\S\S\	S\S\S\S\
S\S\S\S\
S\S\S\\   S\S \S!\S"\\   S#\
S$\
40U 4S% jjjrS& rS' rS(rU =r$ ))r   i  zMobile 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    rC   rX      @   F)r    r    NrY   r   r'   rZ   r\   r   r]   r   r^   	num_headskey_dim	value_dimuse_multi_queryquery_strides	kv_stridecpe_dw_kernel_sizer   r*   r`   ra   rb   	attn_drop	proj_dropr   use_biasuse_cpec                   > UUS.n[         TU ]  5         [        UU5      nUS:H  =(       a    X:H  =(       a    U(       + U l        [	        U5      U l        Xl        [        U R
                   Vs/ s H  nUS:  PM
     sn5      U l        U(       a  [        X4UUSSS.UD6U l
        OS U l
        U" U4SS0UD6U l        Uc  X-  S:X  d   eX-  nU(       a  [        U4UUU	U
UUUUUUUUS.UD6U l        O[        U4UUUUUS	.UD6U l        Ub  [        UU40 UD6U l        O["        R$                  " 5       U l        U(       a  ['        U5      U l        g ["        R$                  " 5       U l        g s  snf )
Nr/   r    T)r[   r]   	depthwiser2   r   Fr   )dim_outr   r   r   r   r   r   r]   rf   r   r   r`   )r   r   r   r   r2   )r4   r5   r   ri   r   r   r   anyhas_query_strider	   conv_cpe_dwnormr   attnr   r   r   r7   rm   r
   rn   )r=   r'   rZ   r\   r   r]   r   r^   r   r   r   r   r   r   r   r   r*   r`   ra   rb   r   r   r   r   r   r0   r1   r>   ro   sr?   s                                 r"   r5   MobileAttention.__init__  s   : /+J	B1:):JF
&}5" #D4F4F$G4FqQU4F$G H , .!   D  $D"6AUAbA	#q((()I-##+#-! ##% DI$ $### DI "-+G5KRrRD!{{}D5C.1w %Hs   -E.c                     US:X  a  [        SSU R                  R                  S9$ [        SU R                  R                  S9$ r   r   r{   s     r"   r}   MobileAttention.feature_infoO  r   r$   c                     U R                   b  U R                  U5      nX-   nUnU R                  U5      nU R                  U5      nU R                  U5      nU R                  (       a  U R                  U5      U-   nU$ r   )r   r   r   r   ri   rn   )r=   rF   x_cper   s       r"   rH   MobileAttention.forwardU  ss    '$$Q'E	AIIaLIIaLQ==q!H,Ar$   )	r   r   rn   r   ri   r   r   r   r   )rJ   rK   rL   rM   rN   r7   rO   r   rQ   r   r   r   r   rR   r5   r}   rH   rS   rT   rU   s   @r"   r   r     s    "#$)!'&' #%77$&NN,0$&""6:"!7^W^W ^W 	^W
  ^W ^W ^W ^W ^W ^W ^W "^W ^W ^W !$^W  !^W" !#^W$ "%^W& y)'^W( ")^W* +^W, -^W. %-UO/^W0 1^W2 3^W ^W@F r$   r   c            #          ^  \ rS rSrSrSSSSSSSSS\R                  \R                  SSS	S
SS4S\S\S\S\S\S\S\	S\
S\S\S\S\S\S\\   S\\   S\S\4"U 4S jjjrS rSrU =r$ )r   id  z+Inverted residual block w/ CondConv routingrC   r    rX   Fr   Nr   rY   r'   rZ   r   r\   r]   r   r^   r   r   r   r   r*   r`   ra   r   num_expertsrb   c                    > UUS.nUU l         [        U R                   S9n[        TU ]  " UU4UUUUUUU	U
UUUUUUUS.UD6  [        R
                  " XR                   40 UD6U l        g )Nr/   )r   )r   r\   r]   r   r^   r   r   r   r   r*   r`   ra   r   r   rb   )r   ry   r4   r5   r7   Linear
routing_fn)r=   r'   rZ   r   r\   r]   r   r^   r   r   r   r   r*   r`   ra   r   r   rb   r0   r1   r>   r   r?   s                         r"   r5   CondConvResidual.__init__g  s    , /&t'7'78	
 *!+)!#)#	
$ %	
( ))F,<,<CCr$   c                    Un[         R                  " US5      R                  S5      n[        R                  " U R                  U5      5      nU R                  X5      nU R                  U5      nU R                  X5      nU R                  U5      nU R                  U5      nU R                  X5      nU R                  U5      nU R                  (       a  U R                  U5      U-   nU$ )Nr    )Fadaptive_avg_pool2dflattentorchsigmoidr   r   rk   r   r   r   r   r   ri   rn   )r=   rF   r   pooled_inputsrouting_weightss        r"   rH   CondConvResidual.forward  s    --a3;;A>--(FGLL,HHQKLL,HHQKGGAJMM!-HHQK==q!H,Ar$   )r   r   )rJ   rK   rL   rM   rN   r7   rO   r   rQ   r   r   rR   r   r   r   r5   rH   rS   rT   rU   s   @r"   r   r   d  s   6 #$ "#$"##%77$&NN,0-1 $&)-D-D -D  	-D
 -D -D -D -D -D -D !-D  -D !-D "-D y)-D  z*!-D" #-D$ "%-D -D^ r$   r   c            !          ^  \ rS rSrSrSSSSSSSSS\R                  \R                  S	S	S
S	S	4S\S\S\S\S\S\S\	S\S\
S\S\S\S\S\\   S\\   S\4 U 4S jjjrS rS rSrU =r$ )r   i  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
rC   r    r   rX   Fr   NrY   r'   rZ   r   r\   r]   r   r^   force_in_chsr   r   r   r*   r`   ra   r   rb   c                   > UUS.n[         TU ]  5         [        X5      nUS:  a  [        X-  5      nO[        X-  5      n[	        UU5      nX:H  =(       a    US:H  =(       a    U	(       + U l        US L=(       a    US:  n[        UUU4U(       a  SOUUUUS.UD6U l        U" U4SS0UD6U l        [        U4UUUS.UD6U l
        U(       a  U" U4SU0UD6O[        R                  " 5       U l        [        UX+4S	U0UD6U l        U" U4S
S0UD6U l        U(       a  [!        U5      U l        g [        R                  " 5       U l        g )Nr/   r   r    rd   r3   Trg   r*   rf   r   F)r4   r5   r   r   r#   ri   r	   conv_exprk   r   rl   r7   rm   r   r   r   r
   rn   )r=   r'   rZ   r   r\   r]   r   r^   r   r   r   r   r*   r`   ra   r   rb   r0   r1   r>   ro   r   re   rp   r?   s                           r"   r5   EdgeResidual.__init__  s^   * /+JB!$\%=>G$V%78GJ0*:v{JF
%4&1* &	
 1F	
 	
 "'>4>2>H[wvf[XZ[ CK(7>i>2>PRP[P[P] &gw_PX_\^_!'AUAbA5C.1r$   c                     US:X  a  [        SSU R                  R                  S9$ [        SU R                  R                  S9$ r   r   r{   s     r"   r}   EdgeResidual.feature_info  r   r$   c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  (       a  U R                  U5      U-   nU$ r   )r   rk   rl   r   r   r   ri   rn   r   s      r"   rH   EdgeResidual.forward  sv    MM!HHQKGGAJGGAJMM!HHQK==q!H,Ar$   )rl   rk   r   r   r   rn   ri   r   )rJ   rK   rL   rM   rN   r7   rO   r   rQ   r   r   rR   r   r   r   r5   r}   rH   rS   rT   rU   s   @r"   r   r     s   	 $% ! "#$#%77$&NN,0-1$&'5W5W 5W !	5W
 5W 5W 5W 5W 5W 5W 5W !5W !5W "5W y)5W  z*!5W" "#5W 5WnG
 
r$   r   )&rN   typingr   r   r   r   r   r   torch.nnr7   r   r   timm.layersr	   r
   r   r   r   r   r   r   r   r   r   r   __all__Moduler   rQ   r#   r   r   r   r   r   r   r   r   r!   r$   r"   <module>r     s    9 8   $   
 "))_
&8C= &C &(#BII (#V6		 6rXRYY Xviryy iXP		 Pfxbii xv?' ?DS299 Sr$   