Ë
    ÛÓ^j÷l  ã                   ód  — d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z
 ddlmZ ddlmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ  ej<                  e«      Z d3de!e!e"f   fd„Z# G d„ dejH                  «      Z% G d„ dejL                  «      Z' G d„ dejP                  «      Z) G d„ dejT                  «      Z+ G d„ dejP                  «      Z, G d„ dejP                  «      Z-d4d„Z. G d„ dejP                  «      Z/ G d„ d ejP                  «      Z0 G d!„ d"ejP                  «      Z1 G d#„ d$ejP                  «      Z2 G d%„ d&ejP                  «      Z3e G d'„ d(e«      «       Z4e G d)„ d*e4«      «       Z5 ed+¬,«       G d-„ d.e4«      «       Z6 ed/¬,«       G d0„ d1ee4«      «       Z7g d2¢Z8y)5z9PyTorch BiT model. Also supports backbone for ViT hybrid.é    N)ÚTensorÚnné   )Úinitialization)ÚACT2FN)ÚBackboneMixinÚfilter_output_hidden_states)ÚBackboneOutputÚBaseModelOutputWithNoAttentionÚ(BaseModelOutputWithPoolingAndNoAttentionÚ$ImageClassifierOutputWithNoAttention)ÚPreTrainedModel)Úauto_docstringÚlogging)Úcan_return_tupleé   )Ú	BitConfigÚreturnc                 ó  — d}| €|dz
  ||dz
  z  z   dz  } | |fS t        | t        «      ra| j                  «       } | dk(  r0|dk(  r#||dz
  z  dz  dk(  r|dz
  ||dz
  z  z   dz  } | |fS d} d}| |fS | dk(  rd} | |fS |dz
  ||dz
  z  z   dz  } | |fS )al  
    Utility function to get the tuple padding value given the kernel_size and padding.

    Args:
        padding (Union[`str`, `int`], *optional*):
            Padding value, can be either `"same"`, `"valid"`. If a different value is provided the default padding from
            PyTorch is used.
        kernel_size (`int`, *optional*, defaults to 7):
            Kernel size of the convolution layers.
        stride (`int`, *optional*, defaults to 1):
            Stride value of the convolution layers.
        dilation (`int`, *optional*, defaults to 1):
            Dilation value of the convolution layers.
    Fr   é   Úsamer   TÚvalid)Ú
isinstanceÚstrÚlower)ÚpaddingÚkernel_sizeÚstrideÚdilationÚdynamics        úo/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/bit/modeling_bit.pyÚget_padding_valuer"   )   sõ   € ð €GØ€Ø˜Q‘J (¨k¸A©oÑ">Ñ>À1ÑDˆØ˜ÐÐä�'œ3Ôà—-‘-“/ˆØ�fÒà˜Š{ ¨K¸!©OÑ <ÀÑAÀQÒFà" Q™J¨(°kÀA±oÑ*FÑFÈ1ÑL�ð �GÐÐð �Ø�ð �GÐÐð ˜ÒàˆGð �GÐÐð  ™
 h°+À±/Ñ&BÑBÀqÑHˆGØ�GÐÐó    c                   ó6   ‡ — e Zd ZdZ	 	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚWeightStandardizedConv2dzÐConv2d with Weight Standardization. Used for ViT Hybrid model.

    Paper: [Micro-Batch Training with Batch-Channel Normalization and Weight
    Standardization](https://huggingface.co/papers/1903.10520)
    c
           
      ó¬   •— t        ||||¬«      \  }}
t        ‰| �	  ||||||||¬«       |
rt        |||«      | _        |	| _        y d | _        |	| _        y )N)r   r   )r   r   r   ÚgroupsÚbias)r"   ÚsuperÚ__init__ÚDynamicPad2dÚpadÚeps)ÚselfÚ
in_channelÚout_channelsr   r   r   r   r'   r(   r-   Ú
is_dynamicÚ	__class__s              €r!   r*   z!WeightStandardizedConv2d.__init__Y   ss   ø€ ô 0°¸ÈVÐ^fÔgÑˆ�Ü‰ÑØØØØØØØØð 	ô 		
ñ Ü# K°¸ÓBˆDŒHð ˆ�ð ˆDŒHØˆ�r#   c           	      óÈ  — | j                   �| j                  |«      }t        j                  j                  | j                  j                  d| j                  d«      d d dd| j                  ¬«      j                  | j                  «      }t        j                  j                  ||| j                  | j                  | j                  | j                  | j                  «      }|S )Nr   éÿÿÿÿTç        )ÚtrainingÚmomentumr-   )r,   r   Ú
functionalÚ
batch_normÚweightÚreshaper0   r-   Ú
reshape_asÚconv2dr(   r   r   r   r'   )r.   Úhidden_stater:   s      r!   Úforwardz WeightStandardizedConv2d.forwardv   s·   € Ø�8‰8ÐØŸ8™8 LÓ1ˆLÜ—‘×)Ñ)Ø�K‰K×Ñ  4×#4Ñ#4°bÓ9¸4ÀÐPTÐ_bÐhl×hpÑhpð *ó 
ç
‰*�T—[‘[Ó
!ð 	ô —}‘}×+Ñ+Ø˜& $§)¡)¨T¯[©[¸$¿,¹,ÈÏÉÐW[×WbÑWbó
ˆð Ðr#   )r   ÚSAMEr   r   Fg�íµ ÷Æ°>©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   r?   Ú__classcell__©r2   s   @r!   r%   r%   R   s&   ø„ ñð ØØØØØõö:	r#   r%   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚBitGroupNormActivationzQ
    A module that combines group normalization with an activation function.
    c                 ó¨   •— t         ‰| �  |j                  |||¬«       |rt        |j                     | _        y t        j                  «       | _        y )N)r-   Úaffine)r)   r*   Ú
num_groupsr   Ú
hidden_actÚ
activationr   ÚIdentity)r.   ÚconfigÚnum_channelsr-   rK   Úapply_activationr2   s         €r!   r*   zBitGroupNormActivation.__init__‡   sA   ø€ Ü‰Ñ˜×*Ñ*¨L¸cÈ&ÐÔQÙÜ$ V×%6Ñ%6Ñ7ˆD�Oä Ÿk™k›mˆD�Or#   c                 ó¾   — t         j                  j                  || j                  | j                  | j
                  | j                  «      }| j                  |«      }|S ©N)r   r8   Ú
group_normrL   r:   r(   r-   rN   )r.   r>   s     r!   r?   zBitGroupNormActivation.forwardŽ   sH   € Ü—}‘}×/Ñ/°¸d¿o¹oÈtÏ{É{Ð\`×\eÑ\eÐgk×goÑgoÓpˆØ—‘ |Ó4ˆØÐr#   )gñhãˆµøä>TTrA   rG   s   @r!   rI   rI   ‚   s   ø„ ñõ,ör#   rI   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )r+   zŒ
    A module that wraps dynamic padding of any input, given the parameters of the convolutional layer and the input
    hidden states.
    c                 óæ   •— t         ‰| �  «        t        |t        «      r||f}t        |t        «      r||f}t        |t        «      r||f}|| _        || _        || _        || _        d„ }|| _        y )Nc                 óp   — t        t        j                  | |z  «      dz
  |z  |dz
  |z  z   dz   | z
  d«      S )Nr   r   )ÚmaxÚmathÚceil)Úxr   r   r   s       r!   Úcompute_paddingz.DynamicPad2d.__init__.<locals>.compute_padding«   sB   € ÜœŸ	™	 ! f¡*Ó-°Ñ1°VÑ;¸{ÈQ¹ÐRZÑ>ZÑZÐ]^Ñ^ÐabÑbÐdeÓfÐfr#   )	r)   r*   r   Úintr   r   r   Úvaluer]   )r.   r   r   r   r_   r]   r2   s         €r!   r*   zDynamicPad2d.__init__š   sw   ø€ Ü‰ÑÔä�k¤3Ô'Ø&¨Ð4ˆKä�fœcÔ"Ø˜fÐ%ˆFä�h¤Ô$Ø  (Ð+ˆHà&ˆÔØˆŒØ ˆŒØˆŒ
ò	gð  /ˆÕr#   c           	      ó¶  — |j                  «       dd  \  }}| j                  || j                  d   | j                  d   | j                  d   «      }| j                  || j                  d   | j                  d   | j                  d   «      }|dkD  s|dkD  rBt
        j                  j                  ||dz  ||dz  z
  |dz  ||dz  z
  g| j                  ¬«      }|S )Néþÿÿÿr   r   r   )r_   )	Úsizer]   r   r   r   r   r8   r,   r_   )r.   ÚinputÚinput_heightÚinput_widthÚpadding_heightÚpadding_widths         r!   r?   zDynamicPad2d.forward°   sù   € à$)§J¡J£L°°Ð$5Ñ!ˆ�kð ×-Ñ-¨l¸D×<LÑ<LÈQÑ<OÐQU×Q\ÑQ\Ð]^ÑQ_Ðae×anÑanÐopÑaqÓrˆØ×,Ñ,¨[¸$×:JÑ:JÈ1Ñ:MÈtÏ{É{Ð[\É~Ð_c×_lÑ_lÐmnÑ_oÓpˆð ˜AÒ °Ò!2Ü—M‘M×%Ñ%Øà! QÑ&Ø! M°QÑ$6Ñ6Ø" aÑ'Ø" ^°qÑ%8Ñ8ð	ð —j‘jð &ó 	ˆEð ˆr#   )r   rA   rG   s   @r!   r+   r+   ”   s   ø„ ñõ
/ö,r#   r+   c                   ó8   ‡ — e Zd Z	 	 	 	 	 	 ddefˆ fd„Zd„ Zˆ xZS )ÚBitMaxPool2dr   c                 ó†  •— t        |t        j                  j                  «      r|n||f}t        |t        j                  j                  «      r|n||f}t        |t        j                  j                  «      r|n||f}t        ‰| �  |||||«       |rt        ||||«      | _        y t        j                  «       | _        y rT   )
r   ÚcollectionsÚabcÚIterabler)   r*   r+   r,   r   rO   )	r.   r   r   r   Ú	ceil_moder   Úpadding_valueÚuse_dynamic_paddingr2   s	           €r!   r*   zBitMaxPool2d.__init__È   sž   ø€ ô &0°¼[¿_¹_×=UÑ=UÔ%V‘kÐ]hÐjuÐ\vˆÜ% f¬k¯o©o×.FÑ.FÔG‘ÈfÐV\ÐM]ˆÜ)¨(´K·O±O×4LÑ4LÔM‘8ÐT\Ð^fÐSgˆÜ‰Ñ˜ f¨g°xÀÔKÙÜ# K°¸À=ÓQˆD�Hä—{‘{“}ˆD�Hr#   c                 óÐ   — | j                  |«      }t        j                  j                  || j                  | j
                  | j                  | j                  | j                  «      S rT   )	r,   r   r8   Ú
max_pool2dr   r   r   r   rn   )r.   Úhidden_statess     r!   r?   zBitMaxPool2d.forwardÛ   sM   € ØŸ™ Ó/ˆÜ�}‰}×'Ñ'Ø˜4×+Ñ+¨T¯[©[¸$¿,¹,ÈÏÉÐW[×WeÑWeó
ð 	
r#   )Nr   F)r   r   r   T)rB   rC   rD   r^   r*   r?   rF   rG   s   @r!   ri   ri   Ç   s)   ø„ ð ØØØØØ ñ%àõ%ö&
r#   ri   c                   ó8   ‡ — e Zd ZdZdefˆ fd„Zdedefd„Zˆ xZS )ÚBitEmbeddingszL
    BiT Embeddings (stem) composed of a single aggressive convolution.
    rP   c                 ó.  •— t         ‰| �  «        t        |j                  |j                  ddd|j
                  ¬«      | _        t        dd|j                  ¬«      | _	        |j
                  �7|j
                  j                  «       dk(  rt        j                  «       | _        nt        j                  dd	¬
«      | _        |j                  dk7  rt!        ||j                  ¬«      | _        nt        j                  «       | _        |j                  | _        y )Né   r   ç:Œ0âŽyE>)r   r   r-   r   r   )r   r   rp   r@   )r   r   r   r   r5   )r   r_   Úpreactivation©rQ   )r)   r*   r%   rQ   Úembedding_sizeÚglobal_paddingÚconvolutionri   Úembedding_dynamic_paddingÚpoolerÚupperr   rO   r,   ÚConstantPad2dÚ
layer_typerI   Únorm©r.   rP   r2   s     €r!   r*   zBitEmbeddings.__init__ç   sÛ   ø€ Ü‰ÑÔä3Ø×ÑØ×!Ñ!ØØØØ×)Ñ)ô
ˆÔô #¨q¸ÐPV×PpÑPpÔqˆŒð × Ñ Ð,°×1FÑ1F×1LÑ1LÓ1NÐRXÒ1XÜ—{‘{“}ˆD�Hä×'Ñ'°ÀCÔHˆDŒHà×Ñ Ò/Ü.¨vÀF×DYÑDYÔZˆD�IäŸ™›ˆDŒIà"×/Ñ/ˆÕr#   Úpixel_valuesr   c                 óà   — |j                   d   }|| j                  k7  rt        d«      ‚| j                  |«      }| j	                  |«      }| j                  |«      }| j                  |«      }|S )Nr   zeMake sure that the channel dimension of the pixel values match with the one set in the configuration.)ÚshaperQ   Ú
ValueErrorr}   r,   rƒ   r   )r.   r…   rQ   Ú	embeddings       r!   r?   zBitEmbeddings.forward  sr   € Ø#×)Ñ)¨!Ñ,ˆØ˜4×,Ñ,Ò,ÜØwóð ð ×$Ñ$ \Ó2ˆ	à—H‘H˜YÓ'ˆ	à—I‘I˜iÓ(ˆ	à—K‘K 	Ó*ˆ	àÐr#   )	rB   rC   rD   rE   r   r*   r   r?   rF   rG   s   @r!   ru   ru   â   s'   ø„ ñð0˜yõ 0ð6 Fð ¨v÷ r#   ru   c                   ór   ‡ — e Zd ZdZd	deddfˆ fd„Zdej                  dej                  fd„Zde	fd„Z
ˆ xZS )
ÚBitDropPathzÏStochastic depth (DropPath) per sample, for residual blocks.

    Identity when ``drop_prob`` is 0 or outside training. See `Deep Networks with Stochastic Depth
    <https://arxiv.org/abs/1603.09382>`_.
    Ú	drop_probr   Nc                 ó0   •— t         ‰| �  «        || _        y rT   )r)   r*   rŒ   )r.   rŒ   r2   s     €r!   r*   zBitDropPath.__init__  s   ø€ Ü‰ÑÔØ"ˆ�r#   rs   c                 óP  — | j                   dk(  s| j                  s|S d| j                   z
  }|j                  d   fd|j                  dz
  z  z   }t	        j
                  ||j                  |j                  ¬«      }t	        j                  ||z   «      }|j                  |«      |z  S )Nr5   r   r   )r   )ÚdtypeÚdevice)
rŒ   r6   r‡   ÚndimÚtorchÚrandr�   r�   ÚfloorÚdiv)r.   rs   Ú	keep_probr‡   Úrandom_tensors        r!   r?   zBitDropPath.forward   s—   € Ø�>‰>˜SÒ ¨¯ªØ Ð Ø˜Ÿ™Ñ&ˆ	Ø×$Ñ$ QÑ'Ð)¨D°M×4FÑ4FÈÑ4JÑ,KÑKˆÜŸ
™
 5°×0CÑ0CÈM×L`ÑL`ÔaˆÜŸ™ M°IÑ$=Ó>ˆØ× Ñ  Ó+¨mÑ;Ð;r#   c                 ó    — d| j                   › �S )Nzp=)rŒ   )r.   s    r!   Ú
extra_reprzBitDropPath.extra_repr)  s   € Ø�D—N‘NÐ#Ð$Ð$r#   )r5   )rB   rC   rD   rE   Úfloatr*   r’   r   r?   r   r™   rF   rG   s   @r!   r‹   r‹     sB   ø„ ññ# %ð #°$õ #ð< U§\¡\ð <°e·l±ló <ð%˜C÷ %r#   r‹   c                 óf   — |}t        |t        | |dz  z   «      |z  |z  «      }|d| z  k  r||z  }|S )Nr   gÍÌÌÌÌÌì?)rY   r^   )r_   ÚdivisorÚ	min_valueÚ	new_values       r!   Úmake_divrŸ   -  sG   € Ø€IÜ�Iœs 5¨7°Q©;Ñ#6Ó7¸7ÑBÀWÑLÓM€IØ�3˜‘;ÒØ�WÑˆ	ØÐr#   c                   ó:   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚBitPreActivationBottleneckLayera  Pre-activation (v2) bottleneck block.
    Follows the implementation of "Identity Mappings in Deep Residual Networks":
    https://github.com/KaimingHe/resnet-1k-layers/blob/master/resnet-pre-act.lua

    Except it puts the stride on 3x3 conv when available.
    c           	      ó  •— t         ‰| �  «        |xs |}|xs |}t        ||z  «      }|
rt        ||||d¬«      | _        nd | _        t        ||«      | _        t        ||dd|j                  ¬«      | _	        t        ||¬«      | _
        t        ||d||d|j                  ¬«      | _        t        ||«      | _        t        ||dd|j                  ¬«      | _        |	d	kD  rt        |	«      | _        y t        j                   «       | _        y )
NT©r   Úpreactr   rx   ©r-   r   rz   r   )r   r'   r-   r   r   )r)   r*   rŸ   ÚBitDownsampleConvÚ
downsamplerI   Únorm1r%   r|   Úconv1Únorm2Úconv2Únorm3Úconv3r‹   r   rO   Ú	drop_path)r.   rP   Úin_channelsr0   Úbottle_ratior   r   Úfirst_dilationr'   Údrop_path_rateÚis_first_layerÚmid_channelsr2   s               €r!   r*   z(BitPreActivationBottleneckLayer.__init__=  s  ø€ ô 	‰ÑÔà'Ò3¨8ˆà#Ò2 {ˆÜ ¨|Ñ ;Ó<ˆáÜ/ØØØØØôˆD�Oð #ˆDŒOä+¨F°KÓ@ˆŒ
Ü-¨k¸<ÈÐPTÐ^d×^sÑ^sÔtˆŒ
ä+¨FÀÔNˆŒ
Ü-Ø˜,¨°&ÀÈTÐ[a×[pÑ[pô
ˆŒ
ô ,¨F°LÓAˆŒ
Ü-¨l¸LÈ!ÐQUÐ_e×_tÑ_tÔuˆŒ
à8FÈÒ8Jœ ^Ó4ˆ�ÔPR×P[ÑP[ÓP]ˆ�r#   c                 ó0  — | j                  |«      }|}| j                  �| j                  |«      }| j                  |«      }| j                  | j	                  |«      «      }| j                  | j                  |«      «      }| j                  |«      }||z   S rT   )r¨   r§   r©   r«   rª   r­   r¬   r®   )r.   rs   Úhidden_states_preactÚshortcuts       r!   r?   z'BitPreActivationBottleneckLayer.forwardi  s‰   € Ø#Ÿz™z¨-Ó8Ðð !ˆØ�?‰?Ð&Ø—‘Ð';Ó<ˆHð Ÿ
™
Ð#7Ó8ˆØŸ
™
 4§:¡:¨mÓ#<Ó=ˆØŸ
™
 4§:¡:¨mÓ#<Ó=ˆØŸ™ }Ó5ˆØ˜xÑ'Ð'r#   ©Nç      Ð?r   r   Nr   r5   FrA   rG   s   @r!   r¡   r¡   5  s.   ø„ ñð ØØØØØØØõ*^öX(r#   r¡   c                   ó:   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„	Zd„ Zˆ xZS )ÚBitBottleneckLayerz\Non Pre-activation bottleneck block, equivalent to V1.5/V1b bottleneck. Used for ViT Hybrid.c           
      óD  •— t         ‰| �  «        |xs |}|xs |}t        ||z  «      }|
rt        ||||d¬«      | _        nd | _        t        ||dd|j                  ¬«      | _        t        ||¬«      | _	        t        ||d|||d|j                  ¬«      | _
        t        ||¬«      | _        t        ||dd|j                  ¬«      | _        t        ||d¬	«      | _        |	d
kD  rt        |	«      nt        j                   «       | _        t$        |j&                     | _        y )NFr£   r   rx   r¥   rz   r   )r   r   r'   r-   r   ©rQ   rR   r   )r)   r*   rŸ   r¦   r§   r%   r|   r©   rI   r¨   r«   rª   r­   r¬   r‹   r   rO   r®   r   rM   rN   )r.   rP   r¯   r0   r°   r   r   r±   r'   r²   r³   Úmid_chsr2   s               €r!   r*   zBitBottleneckLayer.__init__|  s  ø€ ô 	‰ÑÔØ'Ò3¨8ˆà#Ò2 {ˆÜ˜<¨,Ñ6Ó7ˆáÜ/ØØØØØôˆD�Oð #ˆDŒOä-¨k¸7ÀAÈ4ÐY_×YnÑYnÔoˆŒ
Ü+¨FÀÔIˆŒ
Ü-ØØØØØ#ØØØ×)Ñ)ô	
ˆŒ
ô ,¨FÀÔIˆŒ
Ü-¨g°|ÀQÈDÐZ`×ZoÑZoÔpˆŒ
Ü+¨FÀÐ`eÔfˆŒ
Ø8FÈÒ8Jœ ^Ô4ÔPR×P[ÑP[ÓP]ˆŒä  ×!2Ñ!2Ñ3ˆ�r#   c                 óZ  — |}| j                   �| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j	                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j                  ||z   «      }|S rT   )	r§   r©   r¨   r«   rª   r­   r¬   r®   rN   )r.   rs   r·   s      r!   r?   zBitBottleneckLayer.forward­  sœ   € à ˆØ�?‰?Ð&Ø—‘ }Ó5ˆHð Ÿ
™
 =Ó1ˆØŸ
™
 =Ó1ˆàŸ
™
 =Ó1ˆØŸ
™
 =Ó1ˆàŸ
™
 =Ó1ˆØŸ
™
 =Ó1ˆàŸ™ }Ó5ˆØŸ™¨¸Ñ(@ÓAˆØÐr#   r¸   rA   rG   s   @r!   r»   r»   y  s+   ø„ Ùfð ØØØØØØØõ/4öbr#   r»   c                   ó*   ‡ — e Zd Z	 	 dˆ fd„	Zd„ Zˆ xZS )r¦   c                 óÀ   •— t         ‰| �  «        t        ||d|d|j                  ¬«      | _        |rt        j                  «       | _        y t        ||d¬«      | _        y )Nr   rx   )r   r-   r   Fr½   )	r)   r*   r%   r|   Úconvr   rO   rI   rƒ   )r.   rP   r¯   r0   r   r¤   r2   s         €r!   r*   zBitDownsampleConv.__init__Ã  s\   ø€ ô 	‰ÑÔÜ,Ø˜ q°¸TÈ6×K`ÑK`ô
ˆŒ	ñ
 ô �K‰K‹Mð 	�	ô (¨¸\Ð\aÔbð 	�	r#   c                 óB   — | j                  | j                  |«      «      S rT   )rƒ   rÂ   )r.   r\   s     r!   r?   zBitDownsampleConv.forwardÕ  s   € Ø�y‰y˜Ÿ™ 1›Ó&Ð&r#   )r   T)rB   rC   rD   r*   r?   rF   rG   s   @r!   r¦   r¦   Â  s   ø„ ð Øõ
ö$'r#   r¦   c                   ó>   ‡ — e Zd ZdZ	 	 dˆ fd„	Zd„ Zdedefd„Zˆ xZS )ÚBitStagez7
    A ResNet v2 stage composed by stacked layers.
    c	                 ó^  •— t         ‰| �  «        |dv rdnd}	|j                  dk(  rt        }
nt        }
|}t        j                  «       | _        t        |«      D ]Q  }| j                  |||«      \  }}}| j                  j                  t        |«       |
|||||||	||¬«	      «       |}|}	ŒS y )N)r   r   r   r   Ú
bottleneck)r   r   r°   r±   r²   r³   )r)   r*   r‚   r»   r¡   r   Ú
SequentialÚlayersÚrangeÚ_get_updated_hyperparametersÚ
add_moduler   )r.   rP   r¯   r0   r   r   Údepthr°   Úlayer_dropoutr±   Ú	layer_clsÚprev_chsÚ	layer_idxr²   r³   r2   s                  €r!   r*   zBitStage.__init__Þ  sÅ   ø€ ô 	‰ÑÔà&¨&Ñ0™°aˆð ×Ñ Ò,Ü*‰Iä7ˆIàˆÜ—m‘m“oˆŒÜ˜u›ò 	&ˆIà59×5VÑ5VØ˜6 =ó6Ñ2ˆF�N Nð �K‰K×"Ñ"Ü�I“ÙØØØ Ø!Ø%Ø!-Ø#1Ø#1Ø#1ô
ôð $ˆHØ%‰Nñ+	&r#   c                 ó8   — |r||   }nd}|dk7  rd}|dk(  }|||fS )zt
        Get the new hyper-parameters with respect to the previous ones and the index of the current layer.
        r5   r   r   © )r.   rÑ   r   rÎ   r²   r³   s         r!   rË   z%BitStage._get_updated_hyperparameters  s8   € ñ Ø*¨9Ñ5‰Nà ˆNà˜Š>ØˆFà" a™ˆà�~ ~Ð5Ð5r#   rc   r   c                 óT   — |}t        | j                  «      D ]  \  }} ||«      }Œ |S rT   )Ú	enumeraterÉ   )r.   rc   r>   Ú_Úlayers        r!   r?   zBitStage.forward  s3   € ØˆÜ! $§+¡+Ó.ò 	/‰HˆAˆuÙ  Ó.‰Lð	/àÐr#   )r¹   N)	rB   rC   rD   rE   r*   rË   r   r?   rF   rG   s   @r!   rÅ   rÅ   Ù  s.   ø„ ñð Øõ,&ò\6ð ˜Vð ¨÷ r#   rÅ   c            	       óF   ‡ — e Zd Zdefˆ fd„Zd„ Z	 d	dedededefd„Z	ˆ xZ
S )
Ú
BitEncoderrP   c           
      ó�  •— t         ‰| �  «        t        j                  g «      | _        |j
                  }d}d}t        j                  t        j                  d|j                  t        |j                  «      «      «      j                  |j                  «      D �cg c]  }|j                  «       ‘Œ }}t        t!        |j                  |j"                  |«      «      D ]`  \  }\  }}	}
| j%                  |||	||«      \  }}}t'        |||||||
¬«      }|}||z  }| j                  j)                  t+        |«      |«       Œb y c c}w )Né   r   r   )r   r   rÍ   rÎ   )r)   r*   r   Ú
ModuleListÚstagesr{   r’   r   ÚnpÚlinspacer²   ÚsumÚdepthsÚsplitÚtolistrÕ   ÚzipÚhidden_sizesrË   rÅ   rÌ   r   )r.   rP   rÐ   Úcurrent_strider   r\   Úlayer_dropoutsÚ	stage_idxÚcurrent_depthÚcurrent_hidden_sizerÎ   r0   r   Ústager2   s                 €r!   r*   zBitEncoder.__init__$  sA  ø€ Ü‰ÑÔÜ—m‘m BÓ'ˆŒà×(Ñ(ˆð ˆØˆô —\‘\¤"§+¡+¨a°×1FÑ1FÌÈFÏMÉMÓHZÓ"[Ó\×bÑbÐci×cpÑcpÓqö
àð �H‰H�Jð
ˆð 
ô
 OXÜ�—‘˜v×2Ñ2°NÓCóO
ò 	:ÑJˆIÑJ˜Ð':¸Mð .2×-NÑ-NØ˜>Ð+>ÀÈ&ó.Ñ*ˆL˜& (ô ØØØØØ!Ø#Ø+ôˆEð $ˆHØ˜fÑ$ˆNà�K‰K×"Ñ"¤3 y£>°5Õ9ñ+	:ùò
s   ÂEc                 óz   — t        ||j                  z  «      }|dk(  rdnd}||j                  k\  r||z  }d}|||fS )Nr   r   r   )rŸ   Úwidth_factorÚoutput_stride)r.   rè   ræ   rê   r   rP   r0   r   s           r!   rË   z'BitEncoder._get_updated_hyperparametersJ  sO   € ÜÐ 3°f×6IÑ6IÑ IÓJˆØ 1’n‘¨!ˆØ˜V×1Ñ1Ò1Ø˜ÑˆHØˆFØ˜V XÐ-Ð-r#   r>   Úoutput_hidden_statesÚreturn_dictr   c                 ó¦   — |rdnd }| j                   D ]  }|r||fz   } ||«      }Œ |r||fz   }|st        d„ ||fD «       «      S t        ||¬«      S )NrÓ   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wrT   rÓ   )Ú.0Úvs     r!   ú	<genexpr>z%BitEncoder.forward.<locals>.<genexpr>a  s   è ø€ ÒS˜qÀQÁ]œÑSùs   ‚Š)Úlast_hidden_staters   )rÝ   Útupler   )r.   r>   rï   rð   rs   Ústage_modules         r!   r?   zBitEncoder.forwardR  sv   € ñ 3™¸ˆà ŸK™Kò 	6ˆLÙ#Ø -°°Ñ ?�á'¨Ó5‰Lð		6ñ  Ø)¨\¨OÑ;ˆMáÜÑS \°=Ð$AÔSÓSÐSä-Ø*Ø'ô
ð 	
r#   )FT)rB   rC   rD   r   r*   rË   r   Úboolr   r?   rF   rG   s   @r!   rÙ   rÙ   #  sA   ø„ ð$:˜yõ $:òL.ð ]añ
Ø"ð
Ø:>ð
ØUYð
à	'÷
r#   rÙ   c                   ód   ‡ — e Zd ZU eed<   dZdZdZdgZ e	j                  «       ˆ fd„«       Zˆ xZS )ÚBitPreTrainedModelrP   Úbit)Úimager…   ru   c                 óD  •— t         ‰| �  |«       t        |t        j                  «      r#t        j                  |j                  dd¬«       y t        |t        j                  «      r¹t        j                  |j                  t        j                  d«      ¬«       |j                  �xt        j                  j
                  j                  |j                  «      \  }}|dkD  rdt        j                  |«      z  nd}t        j                  |j                  | |«       y y y )NÚfan_outÚrelu)ÚmodeÚnonlinearityé   )Úar   r   )r)   Ú_init_weightsr   r   ÚConv2dÚinitÚkaiming_normal_r:   ÚLinearÚkaiming_uniform_rZ   Úsqrtr(   r’   Ú_calculate_fan_in_and_fan_outÚuniform_)r.   ÚmoduleÚfan_inrÖ   Úboundr2   s        €r!   r  z BitPreTrainedModel._init_weightsq  sÃ   ø€ ä‰Ñ˜fÔ%Ü�fœbŸi™iÔ(Ü× Ñ  §¡°YÈVÖTä˜¤§	¡	Ô*Ü×!Ñ! &§-¡-´4·9±9¸Q³<Õ@Ø�{‰{Ð&Ü!ŸH™HŸM™M×GÑGÈÏÉÓV‘	�˜Ø17¸!²˜œDŸI™I fÓ-Ò-À�Ü—‘˜fŸk™k¨E¨6°5Õ9ð 'ð +r#   )rB   rC   rD   r   Ú__annotations__Úbase_model_prefixÚinput_modalitiesÚmain_input_nameÚ_no_split_modulesr’   Úno_gradr  rF   rG   s   @r!   rû   rû   i  s=   ø… àÓØÐØ!ÐØ$€OØ(Ð)Ðà€U‡]�]ƒ_ó
:ó ô
:r#   rû   c            
       óR   ‡ — e Zd Zˆ fd„Ze	 	 ddededz  dedz  defd„«       Zˆ xZ	S )	ÚBitModelc                 óJ  •— t         ‰| �  |«       || _        t        |«      | _        t        |«      | _        |j                  dk(  rt        ||j                  d   ¬«      nt        j                  «       | _        t        j                  d«      | _        | j                  «        y )Nry   r4   rz   )r   r   )r)   r*   rP   ru   ÚembedderrÙ   Úencoderr‚   rI   rå   r   rO   rƒ   ÚAdaptiveAvgPool2dr   Ú	post_initr„   s     €r!   r*   zBitModel.__init__�  s„   ø€ Ü‰Ñ˜Ô ØˆŒä% fÓ-ˆŒä! &Ó)ˆŒð × Ñ  OÒ3ô # 6¸×8KÑ8KÈBÑ8OÕPä—‘“ð 	Œ	ô ×*Ñ*¨6Ó2ˆŒà�‰Õr#   Nr…   rï   rð   r   c                 óJ  — |�|n| j                   j                  }|�|n| j                   j                  }| j                  |«      }| j	                  |||¬«      }|d   }| j                  |«      }| j                  |«      }|s
||f|dd  z   S t        |||j                  ¬«      S )N©rï   rð   r   r   )rö   Úpooler_outputrs   )	rP   rï   rð   r  r  rƒ   r   r   rs   )	r.   r…   rï   rð   ÚkwargsÚembedding_outputÚencoder_outputsrö   Úpooled_outputs	            r!   r?   zBitModel.forward’  sÃ   € ð %9Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆàŸ=™=¨Ó6ÐàŸ,™,ØÐ3GÐU`ð 'ó 
ˆð ,¨AÑ.Ðà ŸI™IÐ&7Ó8ÐàŸ™Ð$5Ó6ˆáØ% }Ð5¸ÈÈÐ8KÑKÐKä7Ø/Ø'Ø)×7Ñ7ô
ð 	
r#   ©NN)
rB   rC   rD   r*   r   r   rù   r   r?   rF   rG   s   @r!   r  r    sR   ø„ ôð" ð -1Ø#'ñ	
àð
ð # T™kð
ð ˜D‘[ð	
ð 
2ò
ó ô
r#   r  zƒ
    BiT Model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    )Úcustom_introc                   óŽ   ‡ — e Zd Zˆ fd„Ze	 	 	 	 d	dej                  dz  dej                  dz  dedz  dedz  de	f
d„«       Z
ˆ xZS )
ÚBitForImageClassificationc                 ó|  •— t         ‰| �  |«       |j                  | _        t        |«      | _        t        j                  t        j                  «       |j                  dkD  r-t        j                  |j                  d   |j                  «      nt        j                  «       «      | _        | j                  «        y )Nr   r4   )r)   r*   Ú
num_labelsr  rü   r   rÈ   ÚFlattenr	  rå   rO   Ú
classifierr  r„   s     €r!   r*   z"BitForImageClassification.__init__¼  s‡   ø€ Ü‰Ñ˜Ô Ø ×+Ñ+ˆŒÜ˜FÓ#ˆŒäŸ-™-Ü�J‰J‹LØEK×EVÑEVÐYZÒEZŒB�I‰I�f×)Ñ)¨"Ñ-¨v×/@Ñ/@ÔAÔ`b×`kÑ`kÓ`mó
ˆŒð
 	�‰Õr#   Nr…   Úlabelsrï   rð   r   c                 óB  — |�|n| j                   j                  }| j                  |||¬«      }|r|j                  n|d   }| j	                  |«      }d}	|�| j                  ||| j                   «      }	|s|f|dd z   }
|	�|	f|
z   S |
S t        |	||j                  ¬«      S )a0  
        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 classification loss is computed (Cross-Entropy).
        Nr  r   r   )ÚlossÚlogitsrs   )rP   rð   rü   r   r,  Úloss_functionr   rs   )r.   r…   r-  rï   rð   r!  Úoutputsr$  r0  r/  Úoutputs              r!   r?   z!BitForImageClassification.forwardÈ  s¶   € ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—(‘(˜<Ð>RÐ`k�(Ólˆá1<˜×-Ò-À'È!Á*ˆà—‘ Ó/ˆàˆàÐØ×%Ñ% f¨f°d·k±kÓBˆDáØ�Y ¨¨ Ñ,ˆFØ'+Ð'7�D�7˜VÑ#ÐC¸VÐCä3¸ÀfÐ\c×\qÑ\qÔrÐrr#   )NNNN)rB   rC   rD   r*   r   r’   ÚFloatTensorÚ
LongTensorrù   r   r?   rF   rG   s   @r!   r(  r(  µ  s   ø„ ô
ð ð 26Ø*.Ø,0Ø#'ñsà×'Ñ'¨$Ñ.ðsð × Ñ  4Ñ'ðsð # T™kð	sð
 ˜D‘[ðsð 
.òsó ôsr#   r(  zL
    BiT backbone, to be used with frameworks like DETR and MaskFormer.
    c                   ój   ‡ — e Zd ZdZˆ fd„Zeee	 	 d	dede	dz  de	dz  de
fd„«       «       «       Zˆ xZS )
ÚBitBackboneFc                 ó¢   •— t         ‰| �  |«       t        |«      | _        |j                  g|j
                  z   | _        | j                  «        y rT   )r)   r*   r  rü   r{   rå   Únum_featuresr  r„   s     €r!   r*   zBitBackbone.__init__ò  sD   ø€ Ü‰Ñ˜Ô ä˜FÓ#ˆŒØ#×2Ñ2Ð3°f×6IÑ6IÑIˆÔð 	�‰Õr#   Nr…   rï   rð   r   c                 óŽ  — |�|n| j                   j                  }|�|n| j                   j                  }| j                  |dd¬«      }|j                  }d}t        | j                  «      D ]  \  }}	|	| j                  v sŒ|||   fz  }Œ |s|f}
|r|
|j                  fz  }
|
S t        ||r|j                  d¬«      S dd¬«      S )aŸ  
        Examples:

        ```python
        >>> from transformers import AutoImageProcessor, AutoBackbone
        >>> import torch
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read()))

        >>> processor = AutoImageProcessor.from_pretrained("google/bit-50")
        >>> model = AutoBackbone.from_pretrained("google/bit-50")

        >>> inputs = processor(image, return_tensors="pt")
        >>> outputs = model(**inputs)
        ```NTr  rÓ   )Úfeature_mapsrs   Ú
attentions)	rP   rð   rï   rü   rs   rÕ   Ústage_namesÚout_featuresr
   )r.   r…   rï   rð   r!  r2  rs   r;  Úidxrë   r3  s              r!   r?   zBitBackbone.forwardû  sî   € ð< &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð —(‘(˜<¸dÐPT�(ÓUˆà×-Ñ-ˆàˆÜ# D×$4Ñ$4Ó5ò 	6‰JˆC�Ø˜×)Ñ)Ò)Ø ¨sÑ!3Ð 5Ñ5‘ð	6ñ Ø"�_ˆFÙ#Ø˜7×0Ñ0Ð2Ñ2�ØˆMäØ%Ù3G˜'×/Ñ/Øô
ð 	
àMQØô
ð 	
r#   r%  )rB   rC   rD   Úhas_attentionsr*   r   r	   r   r   rù   r
   r?   rF   rG   s   @r!   r7  r7  ê  si   ø„ ð €Nôð Ø Øð -1Ø#'ñ	3
àð3
ð # T™kð3
ð ˜D‘[ð	3
ð 
ò3
ó ó !ó ô3
r#   r7  )r(  r  rû   r7  )Nrw   r   r   )é   )9rE   rk   rZ   ÚnumpyrÞ   r’   r   r   Ú r   r  Úactivationsr   Úbackbone_utilsr   r	   Úmodeling_outputsr
   r   r   r   Úmodeling_utilsr   Úutilsr   r   Úutils.genericr   Úconfiguration_bitr   Ú
get_loggerrB   Úloggerr÷   rù   r"   r  r%   Ú	GroupNormrI   ÚModuler+   Ú	MaxPool2dri   ru   r‹   rŸ   r¡   r»   r¦   rÅ   rÙ   rû   r  r(  r7  Ú__all__rÓ   r#   r!   ú<module>rQ     sÂ  ðñ @ã Û ã Û ß å &Ý !ß H÷ó õ .ß ,Ý -Ý (ð 
ˆ×	Ñ	˜HÓ	%€ñ&ÈEÐRWÐY]ÐR]ÑL^ó &ôR-˜rŸy™yô -ô`˜RŸ\™\ô ô$0�2—9‘9ô 0ôf
�2—<‘<ô 
ô6/�B—I‘Iô /ôf%�"—)‘)ô %ó0ôA( b§i¡iô A(ôHF˜Ÿ™ô FôR'˜Ÿ	™	ô 'ô.Gˆr�y‰yô GôTC
�—‘ô C
ðL ô:˜ó :ó ð:ð* ô2
Ð!ó 2
ó ð2
ñj ðôô,sÐ 2ó ,sóð,sñ^ ðôô
B
�-Ð!3ó B
óð
B
òJ Y�r#   