
    khC                        d Z ddlZddlmZ ddlmZ ddlmZmZ ddl	Z	ddl
mZ ddlmZ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mZ dgZd*dej<                  dede fdZ! G d dej<                        Z" G d dej<                        Z# G d de#      Z$ G d dej<                        Z% G d dej<                        Z& G d dej<                        Z' G d dej<                        Z( G d dej<                        Z)d  Z*d+d!Z+d,d"Z, e e,d#$       e,d#$       e,d#$      d%      Z-ed+d&e)fd'       Z.ed+d&e)fd(       Z/ed+d&e)fd)       Z0y)-zk Sequencer

Paper: `Sequencer: Deep LSTM for Image Classification` - https://arxiv.org/pdf/2205.01972.pdf

    N)partial)
accumulate)OptionalTuple)IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STDDEFAULT_CROP_PCT)lecun_normal_DropPathMlp
PatchEmbedClassifierHead   )build_model_with_cfg)named_apply)register_modelgenerate_default_cfgsSequencer2dmodulename	head_biasc                    t        | t        j                        rC|j                  d      rTt        j                  j                  | j                         t        j                  j                  | j                  |       y |rKt        | j                         | j                  t        j                  j                  | j                         y t        j                  j                  | j                         | j                  Zd|v r,t        j                  j                  | j                  d       y t        j                  j                  | j                         y y y t        | t        j                        rLt        | j                         | j                  *t        j                  j                  | j                         y y t        | t        j                  t        j                  t        j                  f      rSt        j                  j!                  | j                         t        j                  j                  | j                         y t        | t        j"                  t        j$                  t        j&                  f      rZdt)        j*                  | j,                        z  }| j/                         D ]$  }t        j                  j1                  || |       & y t3        | d      r| j5                          y y )Nheadmlpư>)stdg      ?init_weights)
isinstancennLinear
startswithinitzeros_weight	constant_biasr
   xavier_uniform_normal_Conv2d	LayerNormBatchNorm2d	GroupNormones_RNNGRULSTMmathsqrthidden_size
parametersuniform_hasattrr   )r   r   r   flaxstdvr$   s         Q/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/sequencer.py_init_weightsr:      s   &"))$??6"GGNN6==)GGfkk95fmm,;;*GGNN6;;/''6;;*}>v{{3	 +	 + 
FBII	&fmm$;;"GGNN6;;' #	FR\\2>>2<<H	I
fmm$
v{{#	FRVVRVVRWW5	6TYYv1122'') 	2FGGVdUD1	2		( 
)    c                   `     e Zd Z fdZdej
                  deej
                  df   fdZ xZS )RNNIdentityc                 *    t         t        |           y N)superr=   __init__)selfargskwargs	__class__s      r9   rA   zRNNIdentity.__init__<   s    k4)+r;   xreturnNc                 
    |d fS r?    rB   rF   s     r9   forwardzRNNIdentity.forward?   s    $wr;   )	__name__
__module____qualname__rA   torchTensorr   rK   __classcell__rE   s   @r9   r=   r=   ;   s-    , %d0B*C r;   r=   c                   F     e Zd Z	 	 	 	 	 ddededededef
 fdZd Z xZS )		RNN2dBase
input_sizer3   
num_layersr&   bidirectionalc                 H   t         |           || _        || _        |rd|z  n|| _        || _        d| _        d| _        || _        d | _	        |r|dk(  r*t        j                  d| j                  z  |      | _	        n|dk(  r't        j                  | j                  |      | _	        nY|dk(  r.t        j                  | j                  |      | _	        d| _        n&|dk(  r-t        j                  | j                  |      | _	        d| _        nt        d|z         |dk(  r2	 d| j                  z  |k7  rt        d	d| j                  z   d
| d      |dk(  r,	 | j                  |k7  rt        d	| j                   d
| d      |dk(  r3| j                  |k7  rt        d	| j                   d
| d      d| _        nF|dk(  r3| j                  |k7  rt        d	| j                   d
| d      d| _        nt        d|z         t               | _        t               | _        y )N   TcataddverticalF
horizontalzUnrecognized union: zThe output channel z% is different from the input channel .)r@   rA   rU   r3   output_sizeunionwith_verticalwith_horizontalwith_fcfcr   r    
ValueErrorr=   rnn_vrnn_h	rB   rU   r3   rV   r&   rW   r`   rc   rE   s	           r9   rA   zRNN2dBase.__init__E   s2    	$&.;1{?
!#~))A(8(8$8*E%))D$4$4jA*$))D$4$4jA',$,&))D$4$4jA%*" !7%!?@@e^4###z1 #6q4;K;K7K6LLqr|q}}~!  A  Ae^:- #6t7G7G6HHmnxmyyz!{||j :- #6t7G7G6HHmnxmyyz!{||#(D l":- #6t7G7G6HHmnxmyyz!{||!&D3e;<< ]
 ]
r;   c                 R   |j                   \  }}}}| j                  rd|j                  dddd      }|j                  d||      }| j	                  |      \  }}|j                  |||d      }|j                  dddd      }nd }| j
                  r<|j                  d||      }| j                  |      \  }}|j                  |||d      }nd }|1|/| j                  dk(  rt        j                  ||gd      }n||z   }n	||}n||}| j                  | j                  |      }|S )Nr   rY   r      rZ   )dim)shapera   permutereshaperf   rb   rg   r`   rO   rZ   rd   )	rB   rF   BHWCv_hs	            r9   rK   zRNN2dBase.forward~   s'   WW
1a		!Q1%A		"a#A::a=DAq		!Q2&A		!Q1%AA		"a#A::a=DAq		!Q2&AA=Q]zzU"IIq!f"-E]A]A77
Ar;   r   TTrZ   T)rL   rM   rN   intboolrA   rK   rQ   rR   s   @r9   rT   rT   C   sO      "&7#7# 7# 	7#
 7#  7#r r;   rT   c                   @     e Zd Z	 	 	 	 	 ddededededef
 fdZ xZS )LSTM2drU   r3   rV   r&   rW   c           	          t         |   |||||||       | j                  r t        j                  |||d||      | _        | j                  r!t        j                  |||d||      | _        y y )NT)batch_firstr&   rW   )r@   rA   ra   r   r0   rf   rb   rg   rh   s	           r9   rA   zLSTM2d.__init__   s}     	[*dMSXZab +DJ  +DJ  r;   rw   )rL   rM   rN   rx   ry   rA   rQ   rR   s   @r9   r{   r{      sN      "&  	
    r;   r{   c                   t     e Zd Zdee eej                  d      ej                  ddddddf fd	Z	d	 Z
 xZS )
Sequencer2dBlock      @r   epsr   TrZ           c                    t         |           t        ||z        } ||      | _         |||||	|
|      | _        |dkD  rt        |      nt        j                         | _         ||      | _	         |||||      | _
        y )N)rV   rW   r`   rc   r   )	act_layerdrop)r@   rA   rx   norm1
rnn_tokensr   r   Identity	drop_pathnorm2mlp_channels)rB   rl   r3   	mlp_ratio	rnn_layer	mlp_layer
norm_layerr   rV   rW   r`   rc   r   r   channels_dimrE   s                  r9   rA   zSequencer2dBlock.__init__   s      	9s?+_
#!'
 1:B),BKKM_
%c<9SWXr;   c                     || j                  | j                  | j                  |                  z   }|| j                  | j                  | j	                  |                  z   }|S r?   )r   r   r   r   r   rJ   s     r9   rK   zSequencer2dBlock.forward   sQ    ttzz!}=>>t00A?@@r;   )rL   rM   rN   r{   r   r   r   r*   GELUrA   rK   rQ   rR   s   @r9   r   r      s@    
 r||6ggY>r;   r   c                   $     e Zd Z fdZd Z xZS )Shufflec                 "    t         |           y r?   )r@   rA   )rB   rE   s    r9   rA   zShuffle.__init__   s    r;   c                     | j                   rZ|j                  \  }}}}t        j                  ||z        }|j	                  |d|      }|d d |d d f   j	                  |||d      }|S )Nrk   )trainingrm   rO   randpermro   )rB   rF   rp   rq   rr   rs   rs          r9   rK   zShuffle.forward   sc    ==JAq!Qq1u%A		!R#A!Q'
""1aB/Ar;   rL   rM   rN   rA   rK   rQ   rR   s   @r9   r   r      s    r;   r   c                   $     e Zd Z fdZd Z xZS )Downsample2dc                 ^    t         |           t        j                  ||||      | _        y )N)kernel_sizestride)r@   rA   r   r)   down)rB   	input_dim
output_dim
patch_sizerE   s       r9   rA   zDownsample2d.__init__   s%    IIiT^_	r;   c                 x    |j                  dddd      }| j                  |      }|j                  dddd      }|S )Nr   rj   r   rY   )rn   r   rJ   s     r9   rK   zDownsample2d.forward   s<    IIaAq!IIaLIIaAq!r;   r   rR   s   @r9   r   r      s    `r;   r   c                   v     e Zd Zdeee eej                  d      ej                  ddddddf fd	Z
d	 Z xZS )
Sequencer2dStageFr   r   r   TrZ   r   c                 \   t         |           |rt        |||      | _        n ||k(  sJ t	        j
                         | _        g }t        |      D ]A  }|j                   |||||	|
|||||||t        |t        t        f      r||   n|             C t	        j                  | | _        y )N)r   r   r   r   r   rV   rW   r`   rc   r   r   )r@   rA   r   
downsampler   r   rangeappendr   listtuple
Sequentialblocks)rB   rl   dim_outdepthr   r3   r   r   block_layerr   r   r   r   rV   rW   r`   rc   r   r   r   	block_idxrE   s                        r9   rA   zSequencer2dStage.__init__  s    * 	*3DDO'>!> kkmDOu 	IMM+###%#%+2<Yu2V)I.\e 	  mmV,r;   c                 J    | j                  |      }| j                  |      }|S r?   )r   r   rJ   s     r9   rK   zSequencer2dStage.forward1  s"    OOAKKNr;   )rL   rM   rN   r   r{   r   r   r   r*   r   rA   rK   rQ   rR   s   @r9   r   r     sC     (r||6gg'--^r;   r   c                       e Zd Zddddddddd	eee eej                  d
      ej                  ddddddddf fd	Z
ddZej                  j                  dd       Zej                  j                  dd       Zej                  j                  dej"                  fd       Zd dedee   fdZd ZddefdZd Z xZS )!r        rj   avg   rj      rj   )   rY   rY   r        r   r   0   `   r   r   r   r   r   r   r   r   r   TrZ   r   Fc           	         t         |           |dv sJ || _        || _        |d   x| _        | _        d| _        d| _        g | _        t        d |d   ||d   |r|nd dd      | _
        t        |      t        |      cxk(  r-t        |      cxk(  rt        |      cxk(  rt        |	      k(  sJ  J t        t        |d             }g }|d   }t        |      D ]  \  }}|t        |||   fi d||   d	|dkD  d
||   d||   d|	|   d|
d|d|d|d|d|d|d|d|d|d|gz  }||   }| xj                  t!        |||   d|       gz  c_         t#        j$                  | | _         ||d         | _        t+        | j                  |||| j                        | _        | j/                  |       y )N) r   rk   NHWCr   F)img_sizer   in_chans	embed_dimr   flatten
output_fmtc                     | |z  S r?   rI   )rF   ys     r9   <lambda>z&Sequencer2d.__init__.<locals>.<lambda>e  s
    q1u r;   r   r   r   r3   r   r   r   r   r   r   rV   rW   r`   rc   r   r   stages.)num_chs	reductionr   )	pool_type	drop_rate	input_fmt)nlhb)r@   rA   num_classesglobal_poolnum_featureshead_hidden_sizefeature_dimr   feature_infor   stemlenr   r   	enumerater   dictr   r   stagesnormr   r   r   )rB   r   r   r   r   layerspatch_sizes
embed_dimshidden_sizes
mlp_ratiosr   r   r   r   r   num_rnn_layersrW   r`   rc   r   drop_path_rater   	stem_norm
reductionsr   prev_dimiru   rE   s                               r9   rA   zSequencer2d.__init__8  sc   2 	k)))&&4>rNBD1 "1~ m%.zD
	 6{c+.i#j/iSEViZ]^hZiiiiii*[2DEF
a=j) 	iDAq'1 Qi q5	
 'q> )O %Q- ( $ $ & $ * ,    !" #$ )%  F( "!}H$x:a=[bcdbeYf"g!hh-	i0 mmV,z"~.	"!oo
	 	t$r;   c                     |r t        j                  | j                         nd}t        t	        t
        |      |        y )Nr   )r   )r   )r1   logr   r   r   r:   )rB   r   r   s      r9   r   zSequencer2d.init_weights  s.    37TXXd..//R	GMY?Mr;   c                 6    t        d|r	ddg      S g d      S )Nz^stem)z^stages\.(\d+)Nz^norm)i ))z^stages\.(\d+)\.blocks\.(\d+)N)z^stages\.(\d+)\.downsample)r   r   )r   r   )r   )rB   coarses     r9   group_matcherzSequencer2d.group_matcher  s3      *$

 
	



 
	
r;   c                     |rJ d       y )Nz$gradient checkpointing not supportedrI   )rB   enables     r9   set_grad_checkpointingz"Sequencer2d.set_grad_checkpointing  s    AAAz6r;   rG   c                     | j                   S r?   r   )rB   s    r9   get_classifierzSequencer2d.get_classifier  s    yyr;   r   r   c                 L    || _         | j                  j                  ||       y )N)r   )r   r   reset)rB   r   r   s      r9   reset_classifierzSequencer2d.reset_classifier  s    &		{;r;   c                 l    | j                  |      }| j                  |      }| j                  |      }|S r?   )r   r   r   rJ   s     r9   forward_featureszSequencer2d.forward_features  s.    IIaLKKNIIaLr;   
pre_logitsc                 N    |r| j                  |d      S | j                  |      S )NT)r   r   )rB   rF   r   s      r9   forward_headzSequencer2d.forward_head  s$    0:tyyty,L		!Lr;   c                 J    | j                  |      }| j                  |      }|S r?   )r   r   rJ   s     r9   rK   zSequencer2d.forward  s'    !!!$a r;   F)Tr?   )rL   rM   rN   r   r{   r   r   r   r*   r   rA   r   rO   jitignorer   r   Moduler   rx   r   strr   r   ry   r   rK   rQ   rR   s   @r9   r   r   7  s     $+)+(r||6gg/R%hN YY
 
 YYB B YY		  <C <hsm <M$ Mr;   c                     d| v r| S d| v r| d   } ddl }i }| j                         D ]C  \  }}|j                  dd |      }|j                  dd|      }|j                  d	d
      }|||<   E |S )z$ Remap original checkpoints -> timm zstages.0.blocks.0.norm1.weightmodelr   Nzblocks.([0-9]+).([0-9]+).downc                 D    dt        | j                  d            dz    dS )Nr   r   z.downsample.down)rx   group)rF   s    r9   r   z&checkpoint_filter_fn.<locals>.<lambda>  s$    QWWUVZ[\I\H]]m?n r;   zblocks.([0-9]+).([0-9]+)zstages.\1.blocks.\2zhead.zhead.fc.)reitemssubreplace)
state_dictr  r  out_dictkrt   s         r9   checkpoint_filter_fnr    s    ':5*(
H  " 1FF35npqrFF.0FJIIgz*	 Or;   c                     t        t        d            }|j                  d|      }t        t        | |ft
        t        d|      d|}|S )Nrj   out_indicesT)flatten_sequentialr  )pretrained_filter_fnfeature_cfg)r   r   popr   r   r  r   )variant
pretrainedrD   default_out_indicesr  r  s         r9   _create_sequencer2dr    sY    a/**],?@K  2DkJ E Lr;   c                 :    | ddd t         ddt        t        ddd|S )Nr   )rj   r   r   bicubicTz	stem.projzhead.fc)urlr   rU   	pool_sizecrop_pctinterpolationfixed_input_sizemeanr   
first_conv
classifier)r	   r   r   )r  rD   s     r9   _cfgr'    s3    =t$yVZ%.B!  r;   ztimm/)	hf_hub_id)zsequencer2d_s.in1kzsequencer2d_m.in1kzsequencer2d_l.in1krG   c                 x    t        g dg dg dg dg dt        ddd	      }t        d
d	| it        |fi |}|S )Nr   r   rY   r   r   r   r   r   TrZ   	r   r   r   r   r   r   rW   r`   rc   r  )sequencer2d_sr   r{   r  r  rD   
model_argsr  s       r9   r,  r,    sK     '%'
J  eJe$zJd]cJdeELr;   c                 z    t        d
g dg dg dg dg dt        dddd	|}t        dd	| it        |fi |}|S )N)r   rj      rj   r*  r   r   r   TrZ   r+  r  rI   )sequencer2d_mr-  r.  s       r9   r2  r2    Z     
 '%'
 
J  eJe$zJd]cJdeELr;   c                 z    t        d
g dg dg dg dg dt        dddd	|}t        dd	| it        |fi |}|S )N)r   r      r   r*  r   r   r   TrZ   r+  r  rI   )sequencer2d_lr-  r.  s       r9   r6  r6    r3  r;   )r   Fr  )r   )1__doc__r1   	functoolsr   	itertoolsr   typingr   r   rO   torch.nnr   	timm.datar   r   r	   timm.layersr
   r   r   r   r   _builderr   _manipulater   	_registryr   r   __all__r  r  floatr:   r=   rT   r{   r   r   r   r   r   r  r  r'  default_cfgsr,  r2  r6  rI   r;   r9   <module>rD     sg       "   S S P P * $ </")) 3 5 B")) [		 [|Y B#ryy #L
bii 
	299 	3ryy 3l")) D$ %111&            r;   