
    j!                         d dl Zd dlZd dlmZ g dZ G d dej                  Z G d dej                  Z G d dej                  Z	dS )	    N)FASTConvLayerDropPathAdaptiveAvgPool2dc                   R     e Zd ZdZd
dedef fdZdej        dej        fd	Z	 xZ
S )r   z\
    DropPath (Drop Connect) layer. This is a stochastic version of the identity layer.
            T	drop_probscale_by_keepc                 r    t          t          |                                            || _        || _        d S N)superr   __init__r   r	   )selfr   r	   	__class__s      f/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/doctr/models/modules/layers/pytorch.pyr   zDropPath.__init__   s4    h&&((("*    xreturnc                    | j         dk    s| j        s|S d| j         z
  }|j        d         fd|j        dz
  z  z   }|                    |                              |          }|dk    r| j        r|                    |           ||z  S )Nr      r   )r   )r   trainingshapendim	new_empty
bernoulli_r	   div_)r   r   	keep_probr   random_tensors        r   forwardzDropPath.forward   s    >S   H&	
 33E**55i@@s??t1?y)))=  r   )r   T)__name__
__module____qualname____doc__floatboolr   torchTensorr   __classcell__r   s   @r   r   r      s         
+ +% +d + + + + + +
! !%, ! ! ! ! ! ! ! !r   r   c                   8     e Zd ZdZ fdZdej        fdZ xZS )r   z`
    Custom AdaptiveAvgPool2d implementation which is ONNX and `torch.compile` compatible.

    c                 V    t                                                       || _        d S r   )r   r   output_size)r   r+   r   s     r   r   zAdaptiveAvgPool2d.__init__*   s'    &r   r   c                    | j         \  }}|j        \  }}}}t          j        ||||f|j        |j                  }t          |          D ]y}	|	|z  |z  }
|	dz   |z  |z   dz
  |z  }t          |          D ]N}||z  |z  }|dz   |z  |z   dz
  |z  }|d d d d |
|||f                             d          |d d d d |	|f<   Oz|S )N)devicedtyper   ))dim)r+   r   r%   emptyr-   r.   rangemean)r   r   H_outW_outNCHWoutohstart_hend_howstart_wend_ws                  r   r   zAdaptiveAvgPool2d.forward.   s   'uW
1ak1a.qxqwOOO,, 	] 	]BAv%'G1f\E)A-%7EEll ] ]6e+q&A-1e;$%aaaGEM75=&H$I$N$NS[$N$\$\AAAqqq"bL!!	]
 
r   )	r   r    r!   r"   r   r%   r&   r   r'   r(   s   @r   r   r   $   s_         
' ' ' ' '        r   r   c                       e Zd ZdZ	 	 	 	 ddededeeeef         z  deded	ed
eddf fdZdej	        dej	        fdZ
dej        dz  deej	        ej	        f         eeef         z  fdZdej        dej        deej	        ej	        f         fdZdeej	        ej	        f         fdZdej	        dej	        fdZd Z xZS )r   z>Convolutional layer used in the TextNet and FAST architecturesr   Fin_channelsout_channelskernel_sizestridedilationgroupsbiasr   Nc           
      X   t                                                       || _        || _        t	          |t
                    r||fn|| _        d\  | _        | _        d\  | _	        | _
        t          | j        d         dz
  |z  dz            t          | j        d         dz
  |z  dz            f}t          j        d          | _        t          j        ||| j        |||||          | _        t          j        |          | _        | j        d         dk    rjt          j        ||| j        d         dft          | j        d         dz
  |z  dz            df||||          | _	        t          j        |          | _
        | j        d         dk    rjt          j        ||d| j        d         fdt          | j        d         dz
  |z  dz            f||||          | _        t          j        |          | _        ||k    r|dk    rt          j        |          nd | _        d S )	N)NNr   r      T)inplace)rE   rF   paddingrG   rH   rI   )rE   rM   rF   rG   rH   rI   )r   r   rH   rC   
isinstanceintconverted_kshor_convhor_bnver_convver_bnnnReLU
activationConv2dconvBatchNorm2dbnrbr_identity)
r   rC   rD   rE   rF   rG   rH   rI   rM   r   s
            r   r   zFASTConvLayer.__init__A   sQ    	&:D[RU:V:Vg[+66\g%/"t{%/"t{*1-1X=BCCS4K\]^K_bcKcgoJostItEuEuv'$///I)	
 	
 	
	 ...Q1$$I!.q115t03a78CqHII1M!	 	 	DM .66DKQ1$$I 1! 45C$"3A"6":h!F! KLLM!	 	 	DM .66DK;G;;V;V[aef[f[fBN;777lpr   r   c                    t          | d          r(|                     |                     |                    S |                     |                     |                    }| j        /| j        (|                     |                     |                    nd}| j        /| j        (|                     |                     |                    nd}| j	        | 	                    |          nd}|                     ||z   |z   |z             S )N
fused_convr   )
hasattrrW   r^   r[   rY   rS   rT   rR   rQ   r\   )r   r   main_outputsvertical_outputshorizontal_outputsid_outs         r   r   zFASTConvLayer.forward   s    4&& 	7??4??1#5#5666wwtyy||,,<@M<UZ^ZeZq4;;t}}Q'7'7888wx-1[-DIbDKKa(()))hi 	 *.):)F""1%%%A|.>>ASSV\\]]]r   identityc                 R   ||j         dS t          | d          s| j        | j        z  }t	          j        | j        |ddft          j                  }t          | j                  D ]}d||||z  ddf<   t          j	        |          
                    |j        j                  }|                     |          | _        | j        }|j         |j        z                                   }|j        |z                      dddd          }||z  |j        |j        |j        z  |z  z
  fS )Nr   r   	id_tensorr   )r.   r   r0   )running_varr_   rC   rH   npzerosfloat32r3   r%   
from_numpytoweightr-   _pad_to_mxn_tensorrg   epssqrtreshaperI   running_mean)	r   rd   	input_dimkernel_valueirg   kernelstdts	            r   _identity_to_convzFASTConvLayer._identity_to_conv   s-   x3;4t[)) 	@(DK7I8T%5y!Q$GrzZZZL4+,, 9 978QIq!344(6699(/:PQQI!44Y??DN#hl288::_s"++B1a88z8=8+@8?+RUX+XXXXr   rY   r[   c                     |j         }|                     |          }|j        |j        z                                   }|j         |z                      dddd          }||z  |j        |j        |j         z  |z  z
  fS )Nr0   r   )rn   ro   rh   rp   rq   rr   rI   rs   )r   rY   r[   rw   rx   ry   s         r   _fuse_bn_tensorzFASTConvLayer._fuse_bn_tensor   sy    ((00~&,,..Y_%%b!Q22z27R_ry%@3%FFFFr   c                 v   |                      | j        | j                  \  }}| j        $|                      | j        | j                  \  }}nd\  }}| j        $|                      | j        | j                  \  }}nd\  }}|                     | j                  \  }}||z   |z   |z   }||z   |z   |z   }||fS )Nrf   )	r|   rY   r[   rS   rT   rQ   rR   rz   r\   )	r   
kernel_mxnbias_mxn
kernel_mx1bias_mx1
kernel_1xnbias_1xn	kernel_idbias_ids	            r   _get_equivalent_kernel_biasz)FASTConvLayer._get_equivalent_kernel_bias   s    #33DItwGG
H=$#'#7#7t{#S#S J#' J=$#'#7#7t{#S#S J#' J!33D4EFF	7*,z9IE
h&1G;8##r   rw   c                     | j         \  }}|j        dd          \  }}||z
  dz  }||z
  dz  }t          j        j                            |||||gd          S )NrK   r   )value)rP   r   r%   rU   
functionalpad)r   rw   kernel_heightkernel_widthheightwidthpad_left_rightpad_top_downs           r   ro   z FASTConvLayer._pad_to_mxn_tensor   sm    &*&7#|QRR(&.14%.14x"&&vP\^j/kst&uuur   c           
      b   t          | d          rd S |                                 \  }}t          j        | j        j        | j        j        | j        j        | j        j        | j        j	        | j        j
        | j        j        d          | _        || j        j        _        || j        j        _        |                                 D ]}|                                 dD ]'}t          | |          r|                     |           (t          | d          r|                     d           d S d S )Nr^   T)rC   rD   rE   rF   rM   rG   rH   rI   )rY   r[   rS   rT   rQ   rR   r\   )r_   r   rU   rX   rY   rC   rD   rE   rF   rM   rG   rH   r^   rn   datarI   
parametersdetach___delattr__)r   rw   rI   paraattrs        r   reparameterize_layerz"FASTConvLayer.reparameterize_layer   s1   4&& 	F7799)	-/	-9#I%Y'9#	
 	
 	
 '-#$(!OO%% 	 	DLLNNNNN 	' 	'DtT"" '  &&&4(( 	-^,,,,,	- 	-r   )r   r   r   F)r   r    r!   r"   rO   tupler$   r   r%   r&   r   rU   rZ   rz   rX   r|   r   ro   r   r'   r(   s   @r   r   r   >   s       HH =q =q=q =q 5c?*	=q
 =q =q =q =q 
=q =q =q =q =q =q~^ ^%, ^ ^ ^ ^Y".4*? YE%,X]XdJdDehmnqsvnvhwDw Y Y Y YGBI G2> GeELZ_ZfLfFg G G G G$U5<3M-N $ $ $ $v v%, v v v v- - - - - - -r   r   )
numpyri   r%   torch.nnrU   __all__Moduler   r   r    r   r   <module>r      s              
<
<
<! ! ! ! !ry ! ! !,    	   4T- T- T- T- T-BI T- T- T- T- T-r   