
    wiN                        d dl Zd dlZd dlmZ ddlmZ dd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 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S )    N)nn   )
Activation        Fc                    |dk    s|s| S t          j        d|z
            }| j        d         fd| j        dz
  z  z   }|t          j        || j                  z   }t          j        |          }|                     |          |z  }|S )a%  Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).
    the original name is misleading as 'Drop Connect' is a different form of dropout in a separate paper...
    See discussion: https://github.com/tensorflow/tpu/issues/494#issuecomment-532968956 ...
    r      r   )r   dtype)torch	as_tensorshapendimrandr
   floordivide)x	drop_probtraining	keep_probr   random_tensoroutputs          /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/rapidocr/networks/backbones/rec_svtrnet.py	drop_pathr      s    
 CxI..IWQZMDAFQJ//E
5 @ @ @@MK..MXXi  =0FM    c                   2     e Zd Z	 	 	 	 	 	 d fd	Zd Z xZS )	ConvBNLayer   r   r   Fgeluc	           	          t                                                       t          j        |||||||          | _        t          j        |          | _        t          |d          | _        d S )N)in_channelsout_channelskernel_sizestridepaddinggroupsbiasTact_typeinplace)	super__init__r   Conv2dconvBatchNorm2dnormr   act)
selfr    r!   r"   r#   r$   	bias_attrr%   r0   	__class__s
            r   r+   zConvBNLayer.__init__   ss     	I#%#
 
 
	 N<00	sD999r   c                     |                      |          }|                     |          }|                     |          }|S N)r-   r/   r0   )r1   inputsouts      r   forwardzConvBNLayer.forward0   s6    iiiinnhhsmm
r   )r   r   r   Fr   r   __name__
__module____qualname__r+   r8   __classcell__r3   s   @r   r   r      s`        
 : : : : : :0      r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )DropPathzYDrop paths (Stochastic Depth) per sample  (when applied in main path of residual blocks).Nc                 d    t          t          |                                            || _        d S r5   )r*   r@   r+   r   )r1   r   r3   s     r   r+   zDropPath.__init__:   s*    h&&((("r   c                 8    t          || j        | j                  S r5   )r   r   r   r1   r   s     r   r8   zDropPath.forward>   s    DNDM:::r   r5   r:   r;   r<   __doc__r+   r8   r=   r>   s   @r   r@   r@   7   sR        cc# # # # # #; ; ; ; ; ; ;r   r@   c                   $     e Zd Z fdZd Z xZS )Identityc                 V    t          t          |                                            d S r5   )r*   rG   r+   )r1   r3   s    r   r+   zIdentity.__init__C   s%    h&&(((((r   c                     |S r5    )r1   inputs     r   r8   zIdentity.forwardF   s    r   r9   r>   s   @r   rG   rG   B   sG        ) ) ) ) )      r   rG   c                   .     e Zd Z	 	 	 	 d fd	Zd Z xZS )MlpNr   r   c                    t                                                       |p|}|p|}t          j        ||          | _        t          |d          | _        t          j        ||          | _        t          j        |          | _	        d S )NTr'   )
r*   r+   r   Linearfc1r   r0   fc2Dropoutdrop)r1   in_featureshidden_featuresout_features	act_layerrS   r3   s         r   r+   zMlp.__init__K   s~     	#2{)8[9[/::y$???9_l;;Jt$$			r   c                     |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|S r5   )rP   r0   rS   rQ   rC   s     r   r8   zMlp.forward[   sR    HHQKKHHQKKIIaLLHHQKKIIaLLr   )NNr   r   r9   r>   s   @r   rM   rM   J   sZ         % % % % % %       r   rM   c                   4     e Zd Zdddgddgf fd	Zd Z xZS )	ConvMixer      r   c           	          t                                                       || _        || _        t	          j        |||d|d         dz  |d         dz  g|          | _        d S )Nr   r   r   )r%   )r*   r+   HWdimr   r,   local_mixer)r1   r_   	num_headsr^   local_kr3   s        r   r+   zConvMixer.__init__e   so     	9QZ1_gajAo.
 
 
r   c                    | j         d         }| j         d         }|                    g d                              d| j        ||g          }|                     |          }|                    d                              ddd          }|S )Nr   r   )r   r   r   r   )r^   	transposereshaper_   r`   flattenpermute)r1   r   hws       r   r8   zConvMixer.forwardx   s    GAJGAJKK			""**AtxA+>??QIIaLL  Aq))r   r9   r>   s   @r   rZ   rZ   d   s_         r7A
 
 
 
 
 
&      r   rZ   c                   >     e Zd Zddddgddgddddf fd		Zd
 Z xZS )	Attentionr[   Globalr\         FNr   c
           	      (   t                                                       || _        ||z  }
|p|
dz  | _        t	          j        ||dz  |          | _        t	          j        |          | _        t	          j        ||          | _	        t	          j        |	          | _
        || _        |!|d         }|d         }||z  | _        || _        |dk    r5|2|d         }|d         }t          j        ||z  ||z   dz
  ||z   dz
  t          j                  }t#          d|          D ]-}t#          d|          D ]}d|||z  |z   |||z   |||z   f<   .|d d |d	z  ||d	z  z   |d	z  ||d	z  z   f                             d          }t          j        ||z  ||z  gt)          d
          t          j                  }t          j        |dk     ||          }|                    d                              d          | _        || _        d S )Ng      r   )r&   r   r   Localr	   r   r   z-Inf)
fill_valuer
   )r*   r+   ra   scaler   rO   qkvrR   	attn_dropproj	proj_dropr^   NCr   onesfloat32rangerf   fullfloatwhere	unsqueezemaskmixer)r1   r_   ra   r   r^   rb   qkv_biasqk_scalert   rv   head_dimHWhkwkr   rh   ri   mask_paddlemask_infr3   s                       r   r+   zAttention.__init__   s2    	")#/4
9S#'999I..Ic3''	I..>1A1AUDFDFGBB:a!eQVaZR!5=QQQD1a[[ B Bq! B BA>ADQABJAF
:;;Bqqq"'AaK"7q1rQw;9NNOWW K zQA5==  H ;{QXFFDq))33A66DI


r   c                    | j         | j        }| j        }n|j        \  }}}|                     |          }|                    d|d| j        || j        z  f                              ddddd          }|d         | j        z  |d         |d         }}}|	                    |                    dddd                    }	| j
        dk    r
|	| j        z  }	t          j                            |	d          }	|                     |	          }	|		                    |                              dddd                              d||f          }|                     |          }|                     |          }|S )	Nr   r   r   r      rp   )r_   )r^   rw   rx   r   rs   re   ra   rg   rr   matmulr   r   r   
functionalsoftmaxrt   ru   rv   )
r1   r   rw   rx   _rs   qkvattns
             r   r8   zAttention.forward   s[   7AAAgGAq!hhqkkkk2q!T^Q$.5HIJJRRq!Q
 
 a&4:%s1vs1va1xx		!Q1--..:  DID}$$Tr$22~~d##[[^^$$Q1a0088"aDDIIaLLNN1r   r9   r>   s   @r   rk   rk      so         r7B* * * * * *X      r   rk   c                   D     e Zd Zdddgddddddddd	d
df fd	Zd Z xZS )Blockrl   rm   rn   Ng      @Fr   r   nn.LayerNormư>Tc                    t                                                       t          |t                    r  t	          |          ||          | _        n ||          | _        |dk    s|dk    rt          ||||||||
|		  	        | _        n.|dk    rt          ||||          | _        nt          d          |dk    rt          |          nt                      | _        t          |t                    r  t	          |          ||          | _        n ||          | _        t          ||z            }|| _        t!          ||||		          | _        || _        d S )
Nepsrl   rp   )ra   r   r^   rb   r   r   rt   rv   Conv)ra   r^   rb   z.The mixer must be one of [Global, Local, Conv]r   )rT   rU   rW   rS   )r*   r+   
isinstancestrevalnorm1rk   r   rZ   	TypeErrorr@   rG   r   norm2int	mlp_ratiorM   mlpprenorm)r1   r_   ra   r   r`   r^   r   r   r   rS   rt   r   rW   
norm_layerepsilonr   mlp_hidden_dimr3   s                    r   r+   zBlock.__init__   s   $ 	j#&& 	))j))#7;;;DJJ#CDJH 0 0"##!!#
 
 
DJJ f__"3)KXXXDJJLMMM09C),,,XZZj#&& 	))j))#7;;;DJJ#CDJS9_--"*	
 
 
 r   c                    | j         r}|                     ||                     |                     |                    z             }|                     ||                     |                     |                    z             }n|||                     |                     |                     |                              z   }||                     |                     |                     |                              z   }|S r5   )r   r   r   r   r   r   rC   s     r   r8   zBlock.forward   s    < 	<

1t~~djjmm<<<==A

1t~~dhhqkk:::;;AADNN4::djjmm#<#<===ADNN488DJJqMM#:#:;;;Ar   r9   r>   s   @r   r   r      sz        
 G!!5 5 5 5 5 5n      r   r   c                   >     e Zd ZdZddgdddddgdf fd		Zd
 Z xZS )
PatchEmbedzImage to Patch Embedding    d   r   i   r   r   popec                    t                                                       |d         d|z  z  |d         d|z  z  z  }|| _        || _        || _        d | _        |dk    r|dk    rHt          j        t          ||dz  ddddd          t          |dz  |ddddd                    | _	        |dk    ret          j        t          ||d	z  ddddd          t          |d	z  |dz  ddddd          t          |dz  |ddddd                    | _	        d S d S |d
k    rGt          j
        d|||          | _	        |d         |d         z  |d         z  |d         z  | _        d S d S )Nr   r   r   r   r   r   T)r    r!   r"   r#   r$   r0   r2   r   linear)r"   r#   )r*   r+   img_sizenum_patches	embed_dimr/   r   
Sequentialr   ru   r,   )	r1   r   r    r   sub_num
patch_sizemoder   r3   s	           r   r+   zPatchEmbed.__init__  s    	{q'z2x{q'z7RS &"	6>>!||M$/%.!^$%  !""&    $-N%.$%  !""&   	( !||M$/%.!^$%  !""&    $-N%.!^$%  !""&    $-N%.$%  !""&  ' 			 |< X	9*Z  DI z!},x{:jmK 	 r   c                 H   |j         \  }}}}|| j        d         k    r|| j        d         k    s6J d                    ||| j        d         | j        d                               |                     |                              d                              ddd          }|S )Nr   r   z5Input image size ({}*{}) doesn't match model ({}*{}).r   )r   r   formatru   rf   rg   )r1   r   Brx   r   r   s         r   r8   zPatchEmbed.forwardV  s    W
1aq!!!a4=+;&;&;&;BIIq$-"DM!$4
 
 '<&;&; IIaLL  ##++Aq!44r   rD   r>   s   @r   r   r     su        "" cq6I I I I I IV      r   r   c                   2     e Zd Zdddgddf fd	Zd Z xZS )	SubSamplePoolr   r   r   Nc                    t                                                       || _        |dk    r[t          j        ddg|ddg          | _        t          j        ddg|ddg          | _        t          j        ||          | _	        nt          j
        ||d|d          | _         t          |          |          | _        | |            | _        d S d | _        d S )Nr   r      r   r   )r"   r#   r$   )r*   r+   typesr   	AvgPool2davgpool	MaxPool2dmaxpoolrO   ru   r,   r-   r   r/   r0   )r1   r    r!   r   r#   sub_normr0   r3   s          r   r+   zSubSample.__init__b  s     	
F??<F6Aq6  DL <F6Aq6  DL 	+|<<DII	  DI #DNN<00	?suuDHHHDHHHr   c                    | j         dk    rp|                     |          }|                     |          }||z   dz  }|                     |                    d                              ddd                    }n?|                     |          }|                    d                              ddd          }|                     |          }| j        |                     |          }|S )Nr   g      ?r   r   r   )	r   r   r   ru   rf   rg   r-   r/   r0   )r1   r   x1x2r7   s        r   r8   zSubSample.forward  s    :aBaBbCA))AIIaLL00Aq99::CC		!A))A,,&&q!Q//Ciinn8((3--C
r   r9   r>   s   @r   r   r   a  s_        
 1v     B      r   r   c                        e Zd Zddgdg dg dg ddgdz  d	gdz  z   d
dgd
dgd
dggdddddddddddddddddddf fd	Zd Zd Zd Z xZS )SVTRNetr   r   r   )@         )r      r   )r   r   r[   rp   r   rl   rm   rn   r   r   TNr   g?r   r      r\   r   r   r   Fc                    	
 t                                                       | _         _        | _         _        |dk    r|dk    rd n|}t          ||d         |           _         j        j        }|d         d|z  z  |d         d|z  z  g _	        t          j        t          j        d|d                              _        t          j                   _        t#          |          t%          j        d|t)                              t          j        	
 fdt-          d                   D                        _        |Et1          d         d         |ddg|	           _         j	        d         dz   j	        d         gn j	        | _        t          j        	
fd
t-          d                   D                        _        |Et1          d         d         |ddg|	           _         j	        d         dz   j	        d         gn j	        t          j        	
fdt-          d                   D                        _        | _        |rut          j        d|g           _         t          j!        d          j        dddd           _"        tG          dd           _$        t          j        |           _%        s% t#                    d                    _&        | _'        |rUt          j(        d          j                   _)        tG          dd           _*        t          j        |           _+        t          j
        j,        -                     j                    .                     j/                   d S )Nr   r   r   )r   r    r   r   r   r   )pc                     g | ][} d          d          d d                   |         j         
d          d d                   |         	          \S )r   r_   ra   r   r^   r`   r   r   r   rS   rW   rt   r   r   r   r   )r^   ).0i
Block_unitr0   attn_drop_ratedepthdpr	drop_rater   r   r`   r   r   r   ra   r   r   r   r1   s     r   
<listcomp>z$SVTRNet.__init__.<locals>.<listcomp>  s       $ # 
!!'lE!H-a0w +A'%%"!,!!eAh,/2)##    r   )r   r#   r   c                     g | ]t} 	d          d          d         d         d          z            |         d          d         d         d          z            |         
          uS )r   r   r   rJ   r   r   r   r^   r0   r   r   r   r   r   r   r`   r   r   r   ra   r   r   r   s     r   r   z$SVTRNet.__init__.<locals>.<listcomp>  s       $ # 
!!'la58eAh+> >?B +A'%%"!,!%(U1Xa-@"@A!D)##    r   r   c                     g | ]h} 	d          d          d         d         z   d         |         d          d         d         z   d         |         
          iS )r   r   r   Nr   rJ   r   s     r   r   z$SVTRNet.__init__.<locals>.<listcomp>  s       $ # 
!!'la58 3 5 56q9 +A'%%"!,!%(U1X"5"7"78;)##    r   F)r    r!   r"   r#   r$   r&   
hard_swishT)r)   r   r   )0r*   r+   r   r   r!   r   r   patch_embedr   r^   r   	Parameterr   zeros	pos_embedrR   pos_dropr   nplinspacesum
ModuleListr{   blocks1r   sub_sample1patch_mergingblocks2sub_sample2blocks3
last_stageAdaptiveAvgPool2davg_poolr,   	last_convr   	hardswishdropoutr/   use_lenheadrO   len_convhardswish_lendropout_leninitxavier_normal_apply_init_weights)!r1   r   r    r   r   ra   r   r`   r   r   r   r   r   	last_dropr   drop_path_rater   r   r   r!   out_char_num
block_unitr0   r   r   r   r   kwargsr   r   r^   r   r3   s!   `  ````` ```` ` ` `   `  `   @@@r   r+   zSVTRNet.__init__  s   < 	 "( &&=F+B+B D 	
 &#l	
 
 
 &2A;1g:.7
0KLek![)A,&O&OPP
Y///*%%
k!^SZZ88}                   $ uQx%  
 
, $(!!!1v#     D '!*/471:.BBB*}                   $ uQx%  
 
, $(!!!1v#     D '!*/471:.BBB}                   $ uQx%  
 
, % 	30!\1BCCDMY%aL!.  DN (dCCCDN:	222DL 	E(Z((2GDDDDI& 	7IilD4EFFDM!+d" " "D  "zI666D$$T^444

4%&&&&&r   c                 0   t          |t          j                  rUt          j                            |j        d           |j        &t          j                            |j                   d S d S t          |t          j                  rJt          j        	                    |j                   t          j                            |j                   d S t          |t          j
                  rUt          j                            |j        dd           |j        &t          j                            |j                   d S d S t          |t          j                  rUt          j                            |j        d           |j        &t          j                            |j                   d S d S t          |t          j                  rJt          j        	                    |j                   t          j                            |j                   d S d S )Nfan_out)r   r   g{Gz?)r   r   r,   r   kaiming_normal_weightr&   zeros_r.   ones_rO   normal_ConvTranspose2d	LayerNorm)r1   ms     r   r   zSVTRNet._init_weights=  s   a## 	#G##AH9#===v!qv&&&&& "!2>** 	#GMM!(###GNN16"""""29%% 
	#GOOAHa...v!qv&&&&& "!2-.. 	#G##AH9#===v!qv&&&&& "!2<(( 	#GMM!(###GNN16"""""	# 	#r   c           	         |                      |          }|| j        z   }|                     |          }| j        D ]} ||          }| j        b|                     |                    ddd                              d| j        d         | j	        d         | j	        d         g                    }| j
        D ]} ||          }| j        e|                     |                    ddd                              d| j        d         | j	        d         dz  | j	        d         g                    }| j        D ]} ||          }| j        s|                     |          }|S )Nr   r   r   r   )r   r   r   r   r   r   rg   re   r   r^   r   r   r   r   r/   )r1   r   blks      r   forward_featureszSVTRNet.forward_featuresR  sx   QMM!< 	 	CAAA)  		!Q""***DGAJ
C  A
 < 	 	CAAA)  		!Q""***DGAJ!OTWQZH  A
 < 	 	CAAA| 			!Ar   c           	      x   |                      |          }| j        rP|                     |                    d                    }|                     |                     |                    }| j        r| j        | j        d         dz  }n| j        d         }| 	                    |
                    ddd                              d| j        d         || j        d         g                    }|                     |          }|                     |          }|                     |          }| j        r||fS |S )Nr   r   r   r   r   )r  r   r   meanr   r   r   r   r^   r   rg   re   r   r   r   r   )r1   r   len_xrh   s       r   r8   zSVTRNet.forwardl  s"   !!!$$ 	@MM!&&)),,E$$T%7%7%>%>??E? 
	 !-GAJ!OGAJ		!Q""**Bq0A1dgaj+QRR A q!!Aq!!AQA 	e8Or   )r:   r;   r<   r+   r   r  r8   r=   r>   s   @r   r   r     s         c ..ii))i!mxj1n,Wq"g2w/!7g' g' g' g' g' g'R# # #*  4      r   r   )r   F)numpyr   r   r   commonr   r   Moduler   r@   rG   rM   rZ   rk   r   r   r   r   rJ   r   r   <module>r     s3                          ")   @; ; ; ; ;ry ; ; ;    ry       ")   4    	   :B B B B B	 B B BJ? ? ? ? ?BI ? ? ?DV V V V V V V Vr/ / / / /	 / / /dk k k k kbi k k k k kr   