
    kh2              
       *   d Z ddlmZmZmZmZmZmZmZ ddl	Z	ddl
mZ ddlmc mZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZm Z  dgZ! G d dejD                        Z# G d dejH                        Z% G d dejH                        Z&dee'e	jP                  f   dejH                  dee'e	jP                  f   fdZ)d%de'dedee'ef   fdZ* e  e*d       e*d       e*d       e*d       e*        e*        e*       d      Z+d&de'de,dede&fdZ-ed&de,dede&fd       Z.ed&de,dede&fd       Z/ed&de,dede&fd        Z0ed&de,dede&fd!       Z1ed&de,dede&fd"       Z2ed&de,dede&fd#       Z3ed&de,dede&fd$       Z4y)'al  
Implementation of Prof-of-Concept Network: StarNet.

We make StarNet as simple as possible [to show the key contribution of element-wise multiplication]:
    - like NO layer-scale in network design,
    - and NO EMA during training,
    - which would improve the performance further.

Created by: Xu Ma (Email: ma.xu1@northeastern.edu)
Modified Date: Mar/29/2024
    )AnyDictListOptionalSetTupleUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathSelectAdaptivePool2dLinear	LayerTypetrunc_normal_   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsStarNetc                   B     e Zd Z	 	 	 	 ddedededededef fdZ xZS )	ConvBNin_channelsout_channelskernel_sizestridepaddingwith_bnc           	         t         |           | j                  dt        j                  |||f||d|       |r| j                  dt        j
                  |             t        j                  j                  | j                  j                  d       t        j                  j                  | j                  j                  d       y y )Nconvr   r   bnr   r   )super__init__
add_modulennConv2dBatchNorm2dinit	constant_r$   weightbias)	selfr   r   r   r   r   r    kwargs	__class__s	           O/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/starnet.pyr&   zConvBN.__init__   s     			{!^;A7!^V\!^ 	_OOD"..">?GGdggnna0GGdggllA.     )r   r   r   T)__name__
__module____qualname__intboolr&   __classcell__r1   s   @r2   r   r      sU    
  ! // / 	/
 / / / /r3   r   c            	            e Zd Zddej                  fdedededef fdZde	j                  d	e	j                  fd
Z xZS )Block           dim	mlp_ratio	drop_path	act_layerc           	      ~   t         |           t        ||ddd|d      | _        t        |||z  dd      | _        t        |||z  dd      | _        t        ||z  |dd      | _        t        ||ddd|d      | _         |       | _        |dkD  rt        |      | _        y t        j                         | _        y )	N   r   r=   T)groupsr    F)r    r>   )r%   r&   r   dwconvf1f2gdwconv2actr   r(   IdentityrA   )r/   r?   r@   rA   rB   r1   s        r2   r&   zBlock.__init__1   s     	S#q!QsDIi#oq%@i#oq%@	Ca>c31aUK;09B),BKKMr3   xreturnc                     |}| j                  |      }| j                  |      | j                  |      }}| j                  |      |z  }| j	                  | j                  |            }|| j                  |      z   }|S N)rF   rG   rH   rK   rJ   rI   rA   )r/   rM   residualx1x2s        r2   forwardzBlock.forwardA   sm    KKNTWWQZBHHRL2LL#t~~a((r3   )r4   r5   r6   r(   ReLU6r7   floatr   r&   torchTensorrT   r9   r:   s   @r2   r<   r<   0   s]     !#%88RR R 	R
 !R  %,, r3   r<   c                   H    e Zd Zdg ddddej                  ddddf
ded	ee   d
edededededede	def fdZ
d Zej                  j                  defd       Zej                  j                  d*dedee	ef   fd       Zej                  j                  d+defd       Zej                  j                  dej,                  fd       Zd,dedee	   fdZ	 	 	 	 	 d-dej4                  deeeee   f      deded e	d!edeeej4                     eej4                  eej4                     f   f   fd"Z	 	 	 d.deeee   f   d#ed$efd%Zdej4                  dej4                  fd&Zd*dej4                  d'edej4                  fd(Z dej4                  dej4                  fd)Z! xZ"S )/r       r=   r=            r>     r=   avgbase_dimdepthsr@   	drop_ratedrop_path_raterB   num_classesin_chansglobal_pooloutput_stridec                    t         |           |
dk(  sJ || _        || _        d| _        g | _        d}t        j                  t        ||ddd       |             | _	        |}t        j                  d|t        |            D cg c]  }|j                          }}g }d}t        t        |            D ]  }|d|z  z  }t        ||ddd      }t        ||         D cg c]  }t!        |||||z      |       }}|||   z  }|}|j#                  t        j                  |g|        | j
                  j#                  t%        |d|dz   z  d	| 
              t        j                  | | _        |x| _        | _        t        j,                  | j(                        | _        t1        |	      | _        |	rt        j4                  d      nt        j6                         | _        |dkD  rt;        | j(                  |      nt        j6                         | _        | j?                  | j@                         y c c}w c c}w )NrZ   Fr=      r   )r   r   r   r   r#   zstages.)num_chs	reductionmodule	pool_type)!r%   r&   re   rc   grad_checkpointingfeature_infor(   
Sequentialr   stemrW   linspacesumitemrangelenr<   appenddictstagesnum_featureshead_hidden_sizer*   normr   rg   FlattenrL   flattenr   headapply_init_weights)r/   ra   rb   r@   rc   rd   rB   re   rf   rg   rh   r0   stem_chsprev_chsrM   dprr{   curi_layer	embed_dimdown_sampleriblocksr1   s                          r2   r&   zStarNet.__init__L   s    	"""&""' MM8X1QJK
	  "'>3v;!OPAqvvxPPS[) 	]G 1</I!(IqANLTYZ`ahZiTjkqeIy#cAg,	JkFk6'?"C HMM"-->v>?$$T$GAIQXPYGZ&\ ]	] mmV,4<<D1NN4#4#45	/+F(3rzz!}>IAoF4,,k:SUS^S^S`	

4%%&' Q ls   H;#I c                 
   t        |t        j                  t        j                  f      rjt	        |j
                  d       t        |t        j                        r8|j                  +t        j                  j                  |j                  d       y y y t        |t        j                        rUt        j                  j                  |j                  d       t        j                  j                  |j
                  d       y y )Ng{Gz?)stdr   g      ?)

isinstancer(   r   r)   r   r-   r.   r+   r,   r*   )r/   ms     r2   r   zStarNet._init_weights   s    a"))RYY/0!((,!RYY'AFF,>!!!&&!, -?'2>>*GGaffa(GGahh, +r3   rN   c                     t               S rP   )setr/   s    r2   no_weight_decayzStarNet.no_weight_decay   s	    ur3   coarsec                 0    t        d|rdndd fdg      }|S )Nz
^stem\.\d+z^stages\.(\d+)z^stages\.(\d+)\.(\d+))r~   )i )rs   r   )rz   )r/   r   matchers      r2   group_matcherzStarNet.group_matcher   s,    &,"2JDQ#
 r3   enablec                     || _         y rP   )rp   )r/   r   s     r2   set_grad_checkpointingzStarNet.set_grad_checkpointing   s
    "(r3   c                     | j                   S rP   )r   r   s    r2   get_classifierzStarNet.get_classifier   s    yyr3   c                    || _         |At        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  rt        | j                  |      | _	        y t        j
                         | _	        y )Nrn   r   r   )
re   r   rg   r(   r   rL   r   r   r}   r   )r/   re   rg   s      r2   reset_classifierzStarNet.reset_classifier   sa    &"3kJD,72::a=R[[]DLBMPQ/F400+>	WYWbWbWd	r3   rM   indicesr~   
stop_early
output_fmtintermediates_onlyc                 r   |dv sJ d       g }t        t        | j                        |      \  }}	t        | j                        dz
  }
| j                  |      }t        j
                  j                         s|s| j                  }n| j                  d|	dz    }t        |      D ]u  \  }}| j                  r+t        j
                  j                         st        ||      }n ||      }||v sJ|r||
k(  r| j                  |      }n|}|j                  |       w |r|S |
k(  r| j                  |      }||fS )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )NCHWzOutput shape must be NCHW.r   N)r   rx   r{   rs   rW   jitis_scripting	enumeraterp   r   r~   ry   )r/   rM   r   r~   r   r   r   intermediatestake_indices	max_indexlast_idxr{   feat_idxstagex_inters                  r2   forward_intermediateszStarNet.forward_intermediates   s*   * Y&D(DD&"6s4;;7G"Qit{{#a' IIaL99!!#:[[F[[)a-0F(0 
	.OHe&&uyy/E/E/G"5!,!H<'H0"iilGG$$W-
	.   x		!A-r3   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |rt        j                         | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   rx   r{   r(   rL   r~   r   )r/   r   r   r   r   r   s         r2   prune_intermediate_layersz!StarNet.prune_intermediate_layers   s]     #7s4;;7G"Qikk.9q=1DI!!!R(r3   c                     | j                  |      }| j                  r5t        j                  j	                         st        | j                  |      }n| j                  |      }| j                  |      }|S rP   )rs   rp   rW   r   r   r   r{   r~   r/   rM   s     r2   forward_featureszStarNet.forward_features   sV    IIaL""599+A+A+Ct{{A.AAAIIaLr3   
pre_logitsc                     | j                  |      }| j                  |      }| j                  dkD  r,t        j                  || j                  | j
                        }|r|S | j                  |      S )Nr>   )ptraining)rg   r   rc   Fdropoutr   r   )r/   rM   r   s      r2   forward_headzStarNet.forward_head   sZ    QLLO>>B		!t~~FAq0DIIaL0r3   c                 J    | j                  |      }| j                  |      }|S rP   )r   r   r   s     r2   rT   zStarNet.forward   s'    !!!$a r3   F)TrP   )NFFr   F)r   FT)#r4   r5   r6   r(   rU   r7   r   rV   r   strr&   r   rW   r   ignorer   r   r8   r   r   r   r   Moduler   r   r   rX   r	   r   r   r   r   r   rT   r9   r:   s   @r2   r   r   K   s     -!$&#%88#$!#1'1' I1' 	1'
 1' "1' !1' 1' 1' 1' 1'f- YY   YYD T#s(^   YY)T ) ) YY		  eC ehsm e 8<$$',3 ||3  eCcN343  	3 
 3  3  !%3  
tELL!5tELL7I)I#JJ	K3 n ./$#	3S	>*  	 %,, 5<< 1ell 1 1 1 %,, r3   
state_dictmodelrN   c                 &    | j                  d|       S )Nr   )get)r   r   s     r2   checkpoint_filter_fnr     s    >>,
33r3   urlr0   c                 6    | dddddt         t        dddd	d
d|S )Nr_   )r=      r   )rD   rD   g      ?bicubiczstem.0.convr   zarXiv:2403.19967zRewrite the Starsz*https://github.com/ma-xu/Rewrite-the-Stars)r   re   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifier	paper_ids
paper_name
origin_urlr
   )r   r0   s     r2   _cfgr     s9    4}SYI%.B#6')B	 	 	r3   ztimm/)	hf_hub_id)zstarnet_s1.in1kzstarnet_s2.in1kzstarnet_s3.in1kzstarnet_s4.in1kzstarnet_s050.untrainedzstarnet_s100.untrainedzstarnet_s150.untrainedvariant
pretrainedc                 N    t        t        | |ft        t        dd      d|}|S )N)r   r   rj   r=   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   rz   )r   r   r0   r   s       r2   _create_starnetr   *  s6     *1\dK 	E Lr3   c           	      N    t        dg d      }t        dd| it        |fi |S )N   )rj   rj      r=   ra   rb   r   )
starnet_s1rz   r   r   r0   
model_argss      r2   r   r   4  ,    r,7J]J]$zB\U[B\]]r3   c           	      N    t        dg d      }t        dd| it        |fi |S )NrZ   )r   rj      rj   r   r   )
starnet_s2r   r   s      r2   r   r   :  r   r3   c           	      N    t        dg d      }t        dd| it        |fi |S )NrZ   )rj   rj   r   r^   r   r   )
starnet_s3r   r   s      r2   r   r   @  r   r3   c           	      N    t        dg d      }t        dd| it        |fi |S )NrZ   r[   r   r   )
starnet_s4r   r   s      r2   r   r   F  s,    r-8J]J]$zB\U[B\]]r3   c           	      P    t        dg dd      }t        dd| it        |fi |S )N   )r   r   r=   r   r=   ra   rb   r@   r   )starnet_s050r   r   s      r2   r   r   M  .    r,!DJ_j_DD^W]D^__r3   c           	      P    t        dg dd      }t        dd| it        |fi |S )N   )r   rj   r^   r   r^   r   r   )starnet_s100r   r   s      r2   r   r   S  r   r3   c           	      P    t        dg dd      }t        dd| it        |fi |S )Nr   )r   rj   r^   rj   r=   r   r   )starnet_s150r   r   s      r2   r   r   Y  r   r3   )r   r   )5__doc__typingr   r   r   r   r   r   r	   rW   torch.nnr(   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rr   r   r   r<   r   r   rX   r   r   default_cfgsr8   r   r   r   r   r   r   r   r    r3   r2   <module>r
     s  
 @ ? ?     A X X * + ' <+/R]] /(BII 6tbii tn4T#u||*;%< 4RYY 4SWX[]b]i]iXiSj 4
c 
# 
$sCx. 
 %    #f"f"f'& .S d c g  ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^ `T `S `W ` `
 `T `S `W ` `
 `T `S `W ` `r3   