
    fTh T                        S r SSKrSSKJrJrJr  SSKrSSKrSSKJr  SSK	J
r
JrJr  SSKJr  SSKJrJrJr  SS	KJr  SS
KJrJr  SSKJr  \R4                  " \5      rS\S\4S jrS,S\\\4   S\4S jjr  " S S\RB                  5      r" " S S\RF                  5      r$ " S S\RB                  5      r% " S S\RB                  5      r& " S S\RB                  5      r' " S S\RB                  5      r( " S S \RB                  5      r) " S! S"\RB                  5      r*\ " S# S$\5      5       r+\ " S% S&\+5      5       r,\" S'S(9 " S) S*\+5      5       r-/ S+Qr.g)-zPyTorch EfficientNet model.    N)OptionalTupleUnion)nn)BCEWithLogitsLossCrossEntropyLossMSELoss   )ACT2FN)BaseModelOutputWithNoAttention(BaseModelOutputWithPoolingAndNoAttention$ImageClassifierOutputWithNoAttention)PreTrainedModel)auto_docstringlogging   )EfficientNetConfigconfignum_channelsc                     U R                   nXR                  -  n[        U[        XS-  -   5      U-  U-  5      nUSU-  :  a  X2-  n[        U5      $ )z4
Round number of filters based on depth multiplier.
   g?)depth_divisorwidth_coefficientmaxint)r   r   divisornew_dims       n/var/www/auris/envauris/lib/python3.13/site-packages/transformers/models/efficientnet/modeling_efficientnet.pyround_filtersr   '   s`     ""G,,,L'3|k9:gEOPG |##w<    kernel_sizeadjustc                     [        U [        5      (       a  X 4n U S   S-  U S   S-  4nU(       a  US   S-
  US   US   S-
  US   4$ US   US   US   US   4$ )a.  
Utility function to get the tuple padding value for the depthwise convolution.

Args:
    kernel_size (`int` or `tuple`):
        Kernel size of the convolution layers.
    adjust (`bool`, *optional*, defaults to `True`):
        Adjusts padding value to apply to right and bottom sides of the input.
r   r   r   )
isinstancer   )r!   r"   corrects      r   correct_padr&   6   s~     +s##"01~"KNa$78G
Q
GAJNGAJGG
GAJ
GAJ??r    c                   n   ^  \ rS rSrSrS\4U 4S jjrS\R                  S\R                  4S jr	Sr
U =r$ )	EfficientNetEmbeddingsJ   zD
A module that corresponds to the stem module of the original work.
r   c           	      |  > [         TU ]  5         [        US5      U l        [        R
                  " SS9U l        [        R                  " UR                  U R                  SSSSS9U l	        [        R                  " U R                  UR                  UR                  S	9U l        [        UR                     U l        g )
N    )r   r   r   r   paddingr
   r   validFr!   strider-   bias)epsmomentum)super__init__r   out_dimr   	ZeroPad2dr-   Conv2dr   convolutionBatchNorm2dbatch_norm_epsbatch_norm_momentum	batchnormr   
hidden_act
activationselfr   	__class__s     r   r5   EfficientNetEmbeddings.__init__O   s    $VR0||L9991QPW^c
 &:O:OZ`ZtZtu !2!23r    pixel_valuesreturnc                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU$ N)r-   r9   r=   r?   )rA   rD   featuress      r   forwardEfficientNetEmbeddings.forwardZ   sA    <<-##H->>(+??8,r    )r?   r=   r9   r6   r-   )__name__
__module____qualname____firstlineno____doc__r   r5   torchTensorrI   __static_attributes____classcell__rB   s   @r   r(   r(   J   s5    	41 	4ELL U\\  r    r(   c                   :   ^  \ rS rSr       SU 4S jjrSrU =r$ )EfficientNetDepthwiseConv2dc   c	                 8   > X-  n	[         T
U ]  UU	UUUUUUUS9	  g )N)	in_channelsout_channelsr!   r0   r-   dilationgroupsr1   padding_mode)r4   r5   )rA   rY   depth_multiplierr!   r0   r-   r[   r1   r]   rZ   rB   s             r   r5   $EfficientNetDepthwiseConv2d.__init__d   s:     #5#%#% 	 
	
r     )r   r
   r   r   r   Tzeros)rK   rL   rM   rN   r5   rR   rS   rT   s   @r   rV   rV   c   s$     
 
r    rV   c                   z   ^  \ rS rSrSrS\S\S\S\4U 4S jjrS\R                  S	\R                  4S
 jrSrU =r$ )EfficientNetExpansionLayer}   zW
This corresponds to the expansion phase of each block in the original implementation.
r   in_dimr6   r0   c                    > [         TU ]  5         [        R                  " UUSSSS9U l        [        R
                  " X1R                  S9U l        [        UR                     U l
        g )Nr   sameFrY   rZ   r!   r-   r1   )num_featuresr2   )r4   r5   r   r8   expand_convr:   r;   	expand_bnr   r>   
expand_act)rA   r   re   r6   r0   rB   s        r   r5   #EfficientNetExpansionLayer.__init__   sX    99 
 WBWBWX !2!23r    hidden_statesrE   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ rG   )rj   rk   rl   rA   rn   s     r   rI   "EfficientNetExpansionLayer.forward   s4    ((7}56r    )rl   rk   rj   )rK   rL   rM   rN   rO   r   r   r5   rP   FloatTensorrQ   rI   rR   rS   rT   s   @r   rc   rc   }   sM    
41 
43 
4 
4VY 
4U%6%6 5<<  r    rc   c            
       ~   ^  \ rS rSrSrS\S\S\S\S\4
U 4S jjrS	\	R                  S
\	R                  4S jrSrU =r$ )EfficientNetDepthwiseLayer   zc
This corresponds to the depthwise convolution phase of each block in the original implementation.
r   re   r0   r!   adjust_paddingc                 F  > [         TU ]  5         X0l        U R                  S:X  a  SOSn[        XES9n[        R
                  " US9U l        [        X$X6SS9U l        [        R                  " X!R                  UR                  S9U l        [        UR                     U l        g )	Nr   r.   rg   )r"   r,   Fr/   ri   r2   r3   )r4   r5   r0   r&   r   r7   depthwise_conv_padrV   depthwise_convr:   r;   r<   depthwise_normr   r>   depthwise_act)	rA   r   re   r0   r!   rv   conv_padr-   rB   s	           r   r5   #EfficientNetDepthwiseLayer.__init__   s     	"kkQ.7FkA"$,,w"?9FSX
 !nn%:%:VE_E_
 $F$5$56r    rn   rE   c                     U R                   S:X  a  U R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU$ )Nr   )r0   ry   rz   r{   r|   rp   s     r   rI   "EfficientNetDepthwiseLayer.forward   sT    ;;! 33MBM++M:++M:**=9r    )r|   rz   ry   r{   r0   rK   rL   rM   rN   rO   r   r   boolr5   rP   rr   rQ   rI   rR   rS   rT   s   @r   rt   rt      s_    7"7 7 	7
 7 7,	U%6%6 	5<< 	 	r    rt   c            	       ~   ^  \ rS rSrSrSS\S\S\S\4U 4S jjjrS\	R                  S	\	R                  4S
 jrSrU =r$ )EfficientNetSqueezeExciteLayer   zd
This corresponds to the Squeeze and Excitement phase of each block in the original implementation.
r   re   
expand_dimexpandc                   > [         TU ]  5         U(       a  UOUU l        [        S[	        X!R
                  -  5      5      U l        [        R                  " SS9U l	        [        R                  " U R                  U R                  SSS9U l        [        R                  " U R                  U R                  SSS9U l        [        UR                     U l        [        R                   " 5       U l        g )Nr   )output_sizerg   )rY   rZ   r!   r-   )r4   r5   dimr   r   squeeze_expansion_ratiodim_ser   AdaptiveAvgPool2dsqueezer8   reducer   r   r>   
act_reduceSigmoid
act_expand)rA   r   re   r   r   rB   s        r   r5   'EfficientNetSqueezeExciteLayer.__init__   s    !':V!S*H*H!HIJ++:ii	
 ii	
 !!2!23**,r    rn   rE   c                     UnU R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      n[
        R                  " X!5      nU$ rG   )r   r   r   r   r   rP   mul)rA   rn   inputss      r   rI   &EfficientNetSqueezeExciteLayer.forward   sa    ]3M26M26		&8r    )r   r   r   r   r   r   r   )Fr   rT   s   @r   r   r      sR    '1 '3 'C 'Y] ' '*
U%6%6 
5<< 
 
r    r   c                      ^  \ rS rSrSrS\S\S\S\S\S\4U 4S	 jjr	S
\
R                  S\
R                  S\
R                  4S jrSrU =r$ )EfficientNetFinalBlockLayer   zS
This corresponds to the final phase of each block in the original implementation.
r   re   r6   r0   	drop_rateid_skipc                   > [         TU ]  5         US:H  =(       a    U(       + U l        [        R                  " UUSSSS9U l        [        R                  " X1R                  UR                  S9U l	        [        R                  " US9U l        g )Nr   rg   Frh   rx   p)r4   r5   apply_dropoutr   r8   project_convr:   r;   r<   
project_bnDropoutdropout)rA   r   re   r6   r0   r   r   rB   s          r   r5   $EfficientNetFinalBlockLayer.__init__   sx     	#q[8[II 
 .. &;&;fF`F`
 zzI.r    
embeddingsrn   rE   c                     U R                  U5      nU R                  U5      nU R                  (       a  U R                  U5      nX!-   nU$ rG   )r   r   r   r   )rA   r   rn   s      r   rI   #EfficientNetFinalBlockLayer.forward   sE    ))-86 LL7M)6Mr    )r   r   r   r   rK   rL   rM   rN   rO   r   r   floatr   r5   rP   rr   rQ   rI   rR   rS   rT   s   @r   r   r      so    /(/25/@C/MP/]b/mq/"%"3"3 EDUDU Z_ZfZf  r    r   c                      ^  \ rS rSrSrS\S\S\S\S\S\S	\S
\S\4U 4S jjr	S\
R                  S\
R                  4S jrSrU =r$ )EfficientNetBlocki  aA  
This corresponds to the expansion and depthwise convolution phase of each block in the original implementation.

Args:
    config ([`EfficientNetConfig`]):
        Model configuration class.
    in_dim (`int`):
        Number of input channels.
    out_dim (`int`):
        Number of output channels.
    stride (`int`):
        Stride size to be used in convolution layers.
    expand_ratio (`int`):
        Expand ratio to set the output dimensions for the expansion and squeeze-excite layers.
    kernel_size (`int`):
        Kernel size for the depthwise convolution layer.
    drop_rate (`float`):
        Dropout rate to be used in the final phase of each block.
    id_skip (`bool`):
        Whether to apply dropout and sum the final hidden states with the input embeddings during the final phase
        of each block. Set to `True` for the first block of each stage.
    adjust_padding (`bool`):
        Whether to apply padding to only right and bottom side of the input kernel before the depthwise convolution
        operation, set to `True` for inputs with odd input sizes.
r   re   r6   r0   expand_ratior!   r   r   rv   c
           	      p  > [         TU ]  5         XPl        U R                  S:w  a  SOSU l        X%-  n
U R                  (       a  [	        XXS9U l        [        UU R                  (       a  U
OUUUU	S9U l        [        XXR                  S9U l	        [        UU R                  (       a  U
OUUUUUS9U l        g )Nr   TF)r   re   r6   r0   )r   re   r0   r!   rv   )r   re   r   r   )r   re   r6   r0   r   r   )r4   r5   r   r   rc   	expansionrt   rz   r   squeeze_exciter   
projection)rA   r   re   r6   r0   r   r!   r   r   rv   expand_in_dimrB   s              r   r5   EfficientNetBlock.__init__!  s     	("//14d%-;;7mDN 9$(KK=V#)
 =];;
 6$(KK=V
r    rn   rE   c                     UnU R                   S:w  a  U R                  U5      nU R                  U5      nU R                  U5      nU R	                  X!5      nU$ )Nr   )r   r   rz   r   r   )rA   rn   r   s      r   rI   EfficientNetBlock.forwardJ  sY    "
! NN=9M++M: ++M:
Br    )rz   r   r   r   r   r   r   rT   s   @r   r   r     s    4'
"'
 '
 	'

 '
 '
 '
 '
 '
 '
R
U%6%6 
5<< 
 
r    r   c            	       v   ^  \ rS rSrSrS\4U 4S jjr  SS\R                  S\	\
   S\	\
   S\4S	 jjrS
rU =r$ )EfficientNetEncoderiW  z
Forward propagates the embeddings through each EfficientNet block.

Args:
    config ([`EfficientNetConfig`]):
        Model configuration class.
r   c                   >^ ^ [         TT ]  5         UT l        UR                  T l        U 4S jm[	        UR
                  5      n[        U4S jUR                   5       5      nSn/ n[        U5       H  n[        XR
                  U   5      n[        XR                  U   5      nUR                  U   n	UR                  U   n
UR                  U   n[        T" UR                  U   5      5       Hm  nUS:X  a  SOSnUS:  a  SOU	n	US:  a  UOUnXAR                  ;   a  SOSnUR                  U-  U-  n[!        UUUU	U
UUUUS9	nUR#                  U5        US-  nMo     M     [$        R&                  " U5      T l        [$        R*                  " W[        US5      SS	SS
9T l        [$        R.                  " UR0                  UR2                  UR4                  S9T l        [8        UR:                     T l        g )Nc                 \   > [        [        R                  " TR                  U -  5      5      $ rG   )r   mathceildepth_coefficient)repeatsrA   s    r   round_repeats3EfficientNetEncoder.__init__.<locals>.round_repeatse  s"    tyy!7!7'!ABCCr    c              3   4   >#    U  H  nT" U5      v   M     g 7frG   r`   ).0nr   s     r   	<genexpr>/EfficientNetEncoder.__init__.<locals>.<genexpr>j  s     L3Kaq))3Ks   r   TFr   )	r   re   r6   r0   r!   r   r   r   rv   i   rg   rh   rx   )r4   r5   r   r   lenrY   sumnum_block_repeatsranger   rZ   strideskernel_sizesexpand_ratiosdepthwise_paddingdrop_connect_rater   appendr   
ModuleListblocksr8   top_convr:   
hidden_dimr;   r<   top_bnr   r>   top_activation)rA   r   num_base_blocks
num_blockscurr_block_numr   ire   r6   r0   r!   r   jr   rv   r   blockr   rB   s   `                @r   r5   EfficientNetEncoder.__init__`  s   !'!9!9	D f001L63K3KLL
'A"6+=+=a+@AF#F,?,?,BCG^^A&F --a0K!//2L=)A)A!)DEF"#q&$e!e$%Ev*8<T<T*TZ^"44~E
R	)!!#! +!-'##1
 e$!#' G (8 mmF+		&vt4
 nn**0E0EPVPjPj
 %V%6%67r    rn   output_hidden_statesreturn_dictrE   c                    U(       a  U4OS nU R                    H  nU" U5      nU(       d  M  XA4-  nM     U R                  U5      nU R                  U5      nU R                  U5      nU(       d  [	        S X4 5       5      $ [        UUS9$ )Nc              3   .   #    U  H  oc  M  Uv   M     g 7frG   r`   )r   vs     r   r   .EfficientNetEncoder.forward.<locals>.<genexpr>  s     X$Fq$Fs   	)last_hidden_statern   )r   r   r   r   tupler   )rA   rn   r   r   all_hidden_statesr   s         r   rI   EfficientNetEncoder.forward  s     1E],$[[E!-0M##!%55! !
 m4M2++M:X]$FXXX-++
 	
r    )r   r   r   r   r   r   )FT)rK   rL   rM   rN   rO   r   r5   rP   rr   r   r   r   rI   rR   rS   rT   s   @r   r   r   W  s\    581 58t 05&*	
((
 'tn
 d^	

 
(
 
r    r   c                   *    \ rS rSr\rSrSr/ rS r	Sr
g)EfficientNetPreTrainedModeli  efficientnetrD   c                 
   [        U[        R                  [        R                  45      (       ak  UR                  R
                  R                  SU R                  R                  S9  UR                  b%  UR                  R
                  R                  5         gg[        U[        R                  5      (       aJ  UR                  R
                  R                  5         UR                  R
                  R                  S5        gg)zInitialize the weightsg        )meanstdNg      ?)r$   r   Linearr8   weightdatanormal_r   initializer_ranger1   zero_	LayerNormfill_)rA   modules     r   _init_weights)EfficientNetPreTrainedModel._init_weights  s    fryy"))455 MM&&CT[[5R5R&S{{&  &&( '--KK""$MM$$S) .r    r`   N)rK   rL   rM   rN   r   config_classbase_model_prefixmain_input_name_no_split_modulesr   rR   r`   r    r   r   r     s    %L&$O
*r    r   c                      ^  \ rS rSrS\4U 4S jjr\   S
S\\R                     S\\
   S\\
   S\\\4   4S jj5       rS	rU =r$ )EfficientNetModeli  r   c                   > [         TU ]  U5        Xl        [        U5      U l        [        U5      U l        UR                  S:X  a%  [        R                  " UR                  SS9U l        OMUR                  S:X  a%  [        R                  " UR                  SS9U l        O[        SUR                   35      eU R                  5         g )Nr   T)	ceil_moder   z2config.pooling must be one of ['mean', 'max'] got )r4   r5   r   r(   r   r   encoderpooling_typer   	AvgPool2dr   pooler	MaxPool2d
ValueErrorpooling	post_initr@   s     r   r5   EfficientNetModel.__init__  s     08*62 &(,,v'8'8DIDK  E),,v'8'8DIDKQRXR`R`Qabcc 	r    rD   r   r   rE   c                    Ub  UOU R                   R                  nUb  UOU R                   R                  nUc  [        S5      eU R	                  U5      nU R                  UUUS9nUS   nU R                  U5      nUR                  UR                  S S 5      nU(       d	  Xg4USS  -   $ [        UUUR                  S9$ )Nz You have to specify pixel_valuesr   r   r   r   r   )r   pooler_outputrn   )r   r   use_return_dictr  r   r   r  reshapeshaper   rn   )rA   rD   r   r   embedding_outputencoder_outputsr   pooled_outputs           r   rI   EfficientNetModel.forward  s     %9$D $++JjJj 	 &1%<k$++B]B]?@@??<8,,!5# ' 
 ,A.$56%--m.A.A"1.EF%58KKK7/')77
 	
r    )r   r   r   r  )NNN)rK   rL   rM   rN   r   r5   r   r   rP   rr   r   r   r   r   rI   rR   rS   rT   s   @r   r   r     ss    1 "  59/3&*	"
u001"
 'tn"
 d^	"

 
u>>	?"
 "
r    r   z
    EfficientNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g.
    for ImageNet.
    )custom_introc                      ^  \ rS rSrU 4S jr\    S
S\\R                     S\\R                     S\\
   S\\
   S\\\4   4
S jj5       rS	rU =r$ )"EfficientNetForImageClassificationi  c                   > [         TU ]  U5        UR                  U l        Xl        [	        U5      U l        [        R                  " UR                  S9U l	        U R                  S:  a+  [        R                  " UR                  U R                  5      O[        R                  " 5       U l        U R                  5         g )Nr   r   )r4   r5   
num_labelsr   r   r   r   r   dropout_rater   r   r   Identity
classifierr  r@   s     r   r5   +EfficientNetForImageClassification.__init__  s      ++-f5zzF$7$78KO??]^K^"))F$5$5tGdfdododq 	r    rD   labelsr   r   rE   c                 T   Ub  UOU R                   R                  nU R                  XUS9nU(       a  UR                  OUS   nU R	                  U5      nU R                  U5      nSnUGb  U R                   R                  c  U R                  S:X  a  SU R                   l        OoU R                  S:  aN  UR                  [        R                  :X  d  UR                  [        R                  :X  a  SU R                   l        OSU R                   l        U R                   R                  S:X  aI  [        5       n	U R                  S:X  a&  U	" UR                  5       UR                  5       5      nOU	" Xr5      nOU R                   R                  S:X  a=  [        5       n	U	" UR                  SU R                  5      UR                  S5      5      nO,U R                   R                  S:X  a  [!        5       n	U	" Xr5      nU(       d  U4USS -   n
Ub  U4U
-   $ U
$ [#        UUUR$                  S	9$ )
ab  
labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
    Labels for computing the image classification/regression loss. Indices should be in `[0, ...,
    config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
    `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
Nr	  r   
regressionsingle_label_classificationmulti_label_classificationr   )losslogitsrn   )r   r  r   r
  r   r  problem_typer  dtyperP   longr   r	   r   r   viewr   r   rn   )rA   rD   r  r   r   outputsr  r"  r!  loss_fctoutputs              r   rI   *EfficientNetForImageClassification.forward  s    &1%<k$++B]B]##Lit#u1<--'!*]3/{{''/??a'/;DKK,__q(fllejj.HFLL\a\e\eLe/LDKK,/KDKK,{{''<7"9??a'#FNN$4fnn6FGD#F3D))-JJ+-B @&++b/R))-II,./Y,F)-)9TGf$EvE3!//
 	
r    )r  r   r   r   r  )NNNN)rK   rL   rM   rN   r5   r   r   rP   rr   
LongTensorr   r   r   r   rI   rR   rS   rT   s   @r   r  r    s    
  59-1/3&*4
u0014
 ))*4
 'tn	4

 d^4
 
u::	;4
 4
r    r  )r  r   r   )T)/rO   r   typingr   r   r   rP   torch.utils.checkpointr   torch.nnr   r   r	   activationsr   modeling_outputsr   r   r   modeling_utilsr   utilsr   r   configuration_efficientnetr   
get_loggerrK   loggerr   r   r   r&   Moduler(   r8   rV   rc   rt   r   r   r   r   r   r   r  __all__r`   r    r   <module>r8     sr   "  ) )    A A ! 
 . , : 
		H	%, C @U3:. @ @(RYY 2
")) 
4 4$ $N$RYY $N")) BN		 NbW
")) W
t */ * *& 5
3 5
 5
p B
)D B
B
J er    