
    wi|>              	       &   d dl mZmZmZ d dlZd dlmc mZ d dlmZ ddl	m
Z
 g dgg dg dgg d	g d
gg dg dg dg dg dgg dg dg dg dgdZg dgg dg dgg dg d
gg dg dg dg dg dgg dg dg dg dgd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dS )'    )absolute_importdivisionprint_functionN)nn   )
Activation)             F)r	   r   @   r   F)r	   r   r   r   F)r	   r      r   F)r	   r   r   r   F)r	   r      r   F)   r   r   r   F)r   r      r   T)r   r   r   r   T)r   r   r   r   F)blocks2blocks3blocks4blocks5blocks6)r	   r   r   r   F)r	   r   r   r   r   F)r	   r   r   )r   r   F)r   r   r   r   T)r   r   r   r   Fr
   c                 |    ||}t          |t          | |dz  z             |z  |z            }|d| z  k     r||z  }|S )Nr   g?)maxint)vdivisor	min_valuenew_vs       /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/rapidocr/networks/backbones/rec_lcnetv3.pymake_divisibler    B   sR    		3q7Q;//7:WDEEEsQwL    c                   &     e Zd Zd fd	Zd Z xZS )LearnableAffineBlock      ?        皙?c                     t                                                       t          j        t	          j        |g                    | _        t          j        t	          j        |g                    | _        d S N)super__init__r   	ParametertorchTensorscalebias)selfscale_value
bias_valuelr_multlab_lr	__class__s        r   r*   zLearnableAffineBlock.__init__L   sW    \%,}"="=>>
Lzl!;!;<<			r!   c                 &    | j         |z  | j        z   S r(   )r.   r/   r0   xs     r   forwardzLearnableAffineBlock.forwardQ   s    zA~	))r!   )r$   r%   r$   r&   __name__
__module____qualname__r*   r9   __classcell__r5   s   @r   r#   r#   K   sL        = = = = = =
* * * * * * *r!   r#   c                   (     e Zd Z	 d fd	Zd Z xZS )ConvBNLayerr   r$   c           	          t                                                       t          j        |||||dz
  dz  |d          | _        t          j        |          | _        d S )Nr   r   F)in_channelsout_channelskernel_sizestridepaddinggroupsr/   )r)   r*   r   Conv2dconvBatchNorm2dbn)r0   rC   rD   rE   rF   rH   r3   r5   s          r   r*   zConvBNLayer.__init__V   sm     	I#%# 1_*
 
 
	 .
 
r!   c                 Z    |                      |          }|                     |          }|S r(   )rJ   rL   r7   s     r   r9   zConvBNLayer.forwardh   s%    IIaLLGGAJJr!   )r   r$   r:   r?   s   @r   rA   rA   U   sO        PS
 
 
 
 
 
$      r!   rA   c                   &     e Zd Zd fd	Zd Z xZS )Acthswishr$   r&   c                     t                                                       |dk    rt          j        d          | _        n|dk    sJ t          |          | _        t          ||          | _        d S )NrP   Tinplacerelur3   r4   )r)   r*   r   	Hardswishactr   r#   lab)r0   rW   r3   r4   r5   s       r   r*   zAct.__init__o   sj    (??|D111DHH&====!#DH'GGGr!   c                 R    |                      |                     |                    S r(   )rX   rW   r7   s     r   r9   zAct.forwardx   s    xx$$$r!   )rP   r$   r&   r:   r?   s   @r   rO   rO   n   sR        H H H H H H% % % % % % %r!   rO   c                   H     e Zd Z	 	 	 	 	 d
 fd	Zd Zd Zd Zd Zd	 Z xZ	S )LearnableRepLayerr   r$   r&   c	                 4   t                                                       d| _        | _        | _        | _        | _        | _        || _        dz
  dz  | _	        k    rdk    rt          j                  nd | _        t          j        fdt          | j                  D                       | _        dk    rt!          d          nd | _        t%          |          | _        t)          |          | _        d S )NFr   r   )num_featuresc           
      :    g | ]}t                     S )rH   r3   )rA   ).0_rH   rC   rE   r3   rD   rF   s     r   
<listcomp>z.LearnableRepLayer.__init__.<locals>.<listcomp>   sL     
 
 
   !#  
 
 
r!   r_   rU   )r)   r*   	is_reppedrH   rF   rE   rC   rD   num_conv_branchesrG   r   rK   identity
ModuleListrangeconv_kxkrA   conv_1x1r#   rX   rO   rW   )
r0   rC   rD   rE   rF   rH   rd   r3   r4   r5   s
    ````` ` r   r*   zLearnableRepLayer.__init__}   sq    	&&(!2#aA- {**v{{ N(     	 
 
 
 
 
 
 
 
 
 t566
 
 

 
$ Q \1fVW     	 (GGGwv666r!   c                    | j         rJ|                     |                     |                    }| j        dk    r|                     |          }|S d}| j        ||                     |          z  }| j        ||                     |          z  }| j        D ]}| ||          z  }|                     |          }| j        dk    r|                     |          }|S Nr   r   )rc   rX   reparam_convrF   rW   re   ri   rh   )r0   r8   outrJ   s       r   r9   zLearnableRepLayer.forward   s    > 	((4,,Q//00C{ahhsmmJ=$4==###C=$4==###CM 	 	D4477NCChhsmm;!((3--C
r!   c                    | j         rd S |                                 \  }}t          j        | j        | j        | j        | j        | j        | j	                  | _
        || j
        j        _        || j
        j        _        d| _         d S )N)rC   rD   rE   rF   rG   rH   T)rc   _get_kernel_biasr   rI   rC   rD   rE   rF   rG   rH   rl   weightdatar/   )r0   kernelr/   s      r   repzLearnableRepLayer.rep   s    > 	F,,..I(*(;L;
 
 
 )/ %&*#r!   c                     t          |t          j                  sdS t          j                            |||||g          S )Nr   )
isinstancer,   r-   r   
functionalpad)r0   	kernel1x1rw   s      r   _pad_kernel_1x1_to_kxkz(LearnableRepLayer._pad_kernel_1x1_to_kxk   s=    )U\22 	F1=$$Yc30DEEEr!   c                 :   |                      | j                  \  }}|                     || j        dz            }|                      | j                  \  }}d}d}| j        D ]$}|                      |          \  }}	||z  }||	z  }%||z   |z   }
||z   |z   }|
|fS rk   )_fuse_bn_tensorri   ry   rE   re   rh   )r0   kernel_conv_1x1bias_conv_1x1kernel_identitybias_identitykernel_conv_kxkbias_conv_kxkrJ   rr   r/   kernel_reparambias_reparams               r   ro   z"LearnableRepLayer._get_kernel_bias   s    )-)=)=dm)L)L&55T-2
 
 *.)=)=dm)L)L&M 	" 	"D//55LFDv%OT!MM(?:_L$}4}D|++r!   c                    |sdS t          |t                    rI|j        j        }|j        j        }|j        j        }|j        j        }|j        j        }|j        j        }nt          |t          j
                  sJ t          | d          s|| j        | j        z  }t          j        | j        || j        | j        f|j        j                  }	t%          | j                  D ]}
d|	|
|
|z  | j        dz  | j        dz  f<   |	| _        | j        }|j        }|j        }|j        }|j        }|j        }||z                                   }||z                      d          }||z  |||z  |z  z
  fS )N)r   r   	id_tensor)dtyper   r   )r   r   r   )ru   rA   rJ   rp   rL   _mean	_variancer/   _epsilonr   rK   hasattrrC   rH   r,   zerosrE   r   rg   r   sqrtreshape)r0   branchrr   running_meanrunning_vargammabetaeps	input_dimkernel_valueistdts                r   r{   z!LearnableRepLayer._fuse_bn_tensor   s    	"4,, 	"['F!9?L )-KI$E9>D)$CCfbn555554-- 
. ,;	${%y$2BDDTU --      t/00  A  !1y=$*:a*?AQUVAVV  ".^F!<L *KME;D/CS &&((S[!!-00z4,"6"<<<<r!   )r   r   r   r$   r&   )
r;   r<   r=   r*   r9   rs   ry   ro   r{   r>   r?   s   @r   r[   r[   |   s         47 47 47 47 47 47l  .   F F F, , ,&= = = = = = =r!   r[   c                   &     e Zd Zd fd	Zd Z xZS )SELayer   r$   c                 b   t                                                       t          j        d          | _        t          j        |||z  ddd          | _        t          j                    | _        t          j        ||z  |ddd          | _	        t          j
        d          | _        d S )Nr   r   )rC   rD   rE   rF   rG   TrR   )r)   r*   r   AdaptiveAvgPool2davg_poolrI   conv1ReLUrT   conv2Hardsigmoidhardsigmoid)r0   channel	reductionr3   r5   s       r   r*   zSELayer.__init__  s    ,Q//Y I-
 
 

 GII	Y9, 
 
 

 >$777r!   c                     |}|                      |          }|                     |          }|                     |          }|                     |          }|                     |          }||z  }|S r(   )r   r   rT   r   r   )r0   r8   re   s      r   r9   zSELayer.forward*  sf    MM!JJqMMIIaLLJJqMMQqLr!   )r   r$   r:   r?   s   @r   r   r     sL        8 8 8 8 8 8(      r!   r   c                   .     e Zd Z	 	 	 	 d fd	Zd Z xZS )LCNetV3BlockFr   r$   r&   c	           
          t                                                       || _        t          ||||||||          | _        |rt          ||          | _        t          ||dd|||          | _        d S )N)rC   rD   rE   rF   rH   rd   r3   r4   )r3   r   )rC   rD   rE   rF   rd   r3   r4   )r)   r*   use_ser[   dw_convr   sepw_conv)
r0   rC   rD   rF   dw_sizer   conv_kxk_numr3   r4   r5   s
            r   r*   zLCNetV3Block.__init__6  s     	(#$*	
 	
 	
  	<k7;;;DG(#%*
 
 
r!   c                     |                      |          }| j        r|                     |          }|                     |          }|S r(   )r   r   r   r   r7   s     r   r9   zLCNetV3Block.forwardY  s>    LLOO; 	

ALLOOr!   )Fr   r$   r&   r:   r?   s   @r   r   r   5  s[         !
 !
 !
 !
 !
 !
F      r!   r   c                   4     e Zd Zddg dddf fd	Zd Z xZS )	PPLCNetV3r$   r   )r$   r$   r$   r$   r$   r$   r&   Fc                     t                                                        _        | _        | _         j        rt
          nt           _        t           j        t          t          f          s/J d                    t           j                                        t           j                  dk    s/J d                    t           j                                        t          dt          dz            dd j        d                    _        t#          j         fd	t'           j        d
                   D               _        t#          j         fdt'           j        d                   D               _        t#          j         fdt'           j        d                   D               _        t#          j         fdt'           j        d                   D               _        t#          j         fdt'           j        d                   D               _        t          dz             _         j        r	g d}t           j        d         d         d         z            t           j        d         d         d         z            t           j        d         d         d         z            t           j        d         d         d         z            g _        t#          j        t#          j         j        d         t9          |d         z            ddd          t#          j         j        d         t9          |d         z            ddd          t#          j         j        d         t9          |d         z            ddd          t#          j         j        d         t9          |d         z            ddd          g           _        t9          |d         z            t9          |d         z            t9          |d         z            t9          |d         z            g _        d S d S )Nz2lr_mult_list should be in (list, tuple) but got {}   z*lr_mult_list length should be 6 but got {}r	   r
   r   r   )rC   rD   rE   rF   r3   c                     g | ]M\  }\  }}}}}t          t          |	z            t          |	z            |||
j        d                    NS )r   rC   rD   r   rF   r   r   r3   r4   r   r    lr_mult_listr`   r   kin_cout_csr   r   r4   r.   r0   s          r   rb   z&PPLCNetV3.__init__.<locals>.<listcomp>          /A.42  .te| < <!/!>!>!- -a0!	 	 	  r!   r   c                     g | ]M\  }\  }}}}}t          t          |	z            t          |	z            |||
j        d                    NS )r   r   r   r   s          r   rb   z&PPLCNetV3.__init__.<locals>.<listcomp>  r   r!   r   c                     g | ]M\  }\  }}}}}t          t          |	z            t          |	z            |||
j        d                    NS )r	   r   r   r   s          r   rb   z&PPLCNetV3.__init__.<locals>.<listcomp>  r   r!   r   c                     g | ]M\  }\  }}}}}t          t          |	z            t          |	z            |||
j        d                    NS )r   r   r   r   s          r   rb   z&PPLCNetV3.__init__.<locals>.<listcomp>  r   r!   r   c                     g | ]M\  }\  }}}}}t          t          |	z            t          |	z            |||
j        d                    NS )r   r   r   r   s          r   rb   z&PPLCNetV3.__init__.<locals>.<listcomp>  r   r!   r   r   )r
      8   i  r   r   )r)   r*   r.   r   detNET_CONFIG_detNET_CONFIG_rec
net_configru   listtupleformattypelenrA   r    r   r   
Sequential	enumerater   r   r   r   r   rD   rf   rI   r   
layer_list)	r0   r.   r   r   r4   r   kwargsmv_cr5   s	   ``` `   r   r*   zPPLCNetV3.__init__b  s    	
(,0HH...e}
 
 	
 	
?FF"##
 
	
 	
 	
 !""a'''7>>s4CT?U?UVV ('' !'U
33%a(
 
 

 }       3<DOI<V2W2W  
  }       3<DOI<V2W2W  
  }       3<DOI<V2W2W  
  }       3<DOI<V2W2W  
  }       3<DOI<V2W2W  
 +3;778 	$$$Dty9"=a@5HIIty9"=a@5HIIty9"=a@5HIIty9"=a@5HII	!D !mId/2CQ%4H4H!QPQRRId/2CQ%4H4H!QPQRRId/2CQ%4H4H!QPQRRId/2CQ%4H4H!QPQRR	 DO DGeO$$DGeO$$DGeO$$DGeO$$	!D#	 	r!   c                 $   g }|                      |          }|                     |          }|                     |          }|                    |           |                     |          }|                    |           |                     |          }|                    |           |                     |          }|                    |           | j        r~ | j        d         |d                   |d<    | j        d         |d                   |d<    | j        d         |d                   |d<    | j        d         |d                   |d<   |S | j	        rt          j        |ddg          }nt          j        |ddg          }|S )Nr   r   r   r	   (   )r   r   r   appendr   r   r   r   r   trainingFadaptive_avg_pool2d
avg_pool2d)r0   r8   out_lists      r   r9   zPPLCNetV3.forward  sl   JJqMMLLOOLLOOLLOOLLOOLLOO8 	,$/!,Xa[99HQK,$/!,Xa[99HQK,$/!,Xa[99HQK,$/!,Xa[99HQKO= 	(%a!R11AAQA''Ar!   r:   r?   s   @r   r   r   a  sj         333H H H H H HT      r!   r   )r
   N)
__future__r   r   r   r,   torch.nn.functionalr   rv   r   commonr   r   r   r    Moduler#   rA   rO   r[   r   r   r    r!   r   <module>r      s   A @ @ @ @ @ @ @ @ @                      
 %%%'<'<'<=&&&(?(?(?@ 		 0 %%%'<'<'<=+++-D-D-DE$$$ 	$##$$$	 ,   * * * * *29 * * *    ")   2% % % % %") % % %V= V= V= V= V=	 V= V= V=r    bi   @) ) ) ) )29 ) ) )Xc c c c c	 c c c c cr!   