Ë
    ÛÓ^jäŽ  ã                   óÄ  — d Z ddlZddlZddlmZ ddlZddlmZ ddlm	Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZ  ej<                  e«      Z  ed¬«      e G d„ de«      «       «       Z! ed¬«      e G d„ de«      «       «       Z" ed¬«      e G d„ de«      «       «       Z# ed¬«      e G d„ de«      «       «       Z$ G d„ dejJ                  «      Z& G d„ d ejJ                  «      Z' G d!„ d"ejJ                  «      Z( G d#„ d$ejJ                  «      Z) G d%„ d&ejJ                  «      Z* G d'„ d(ejJ                  «      Z+ G d)„ d*e«      Z, G d+„ d,ejJ                  «      Z-e G d-„ d.e«      «       Z.e G d/„ d0e.«      «       Z/ ed1¬«       G d2„ d3e.«      «       Z0 ed4¬«       G d5„ d6e.«      «       Z1 ed7¬«       G d8„ d9ee.«      «       Z2g d:¢Z3y);zPyTorch FocalNet model.é    N)Ú	dataclass)Únné   )Úinitialization)ÚACT2FN)ÚBackboneMixinÚfilter_output_hidden_states)ÚGradientCheckpointingLayer)ÚBackboneOutput)ÚPreTrainedModel)ÚModelOutputÚauto_docstringÚlogging)Úcan_return_tupleé   )ÚFocalNetConfigzC
    FocalNet encoder's outputs, with potential hidden states.
    )Úcustom_introc                   ó–   — e Zd ZU dZdZej                  dz  ed<   dZe	ej                     dz  ed<   dZ
e	ej                     dz  ed<   y)ÚFocalNetEncoderOutputaí  
    reshaped_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each stage) of
        shape `(batch_size, hidden_size, height, width)`.

        Hidden-states of the model at the output of each layer plus the initial embedding outputs reshaped to
        include the spatial dimensions.
    NÚlast_hidden_stateÚhidden_statesÚreshaped_hidden_states)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r   Útupler   © ó    úy/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/focalnet/modeling_focalnet.pyr   r   %   sT   … ñð 37Ð�u×(Ñ(¨4Ñ/Ó6Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø>BÐ˜E %×"3Ñ"3Ñ4°tÑ;ÔBr"   r   zZ
    FocalNet model's outputs that also contains a pooling of the last hidden states.
    c                   ó¾   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
ej                     dz  ed<   dZe
ej                     dz  ed<   y)ÚFocalNetModelOutputa±  
    pooler_output (`torch.FloatTensor` of shape `(batch_size, hidden_size)`, *optional*, returned when `add_pooling_layer=True` is passed):
        Average pooling of the last layer hidden-state.
    reshaped_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each stage) of
        shape `(batch_size, hidden_size, height, width)`.

        Hidden-states of the model at the output of each layer plus the initial embedding outputs reshaped to
        include the spatial dimensions.
    Nr   Úpooler_outputr   r   )r   r   r   r   r   r   r   r   r&   r   r    r   r!   r"   r#   r%   r%   :   si   … ñ	ð 37Ð�u×(Ñ(¨4Ñ/Ó6Ø.2€M�5×$Ñ$ tÑ+Ó2Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø>BÐ˜E %×"3Ñ"3Ñ4°tÑ;ÔBr"   r%   z.
    FocalNet masked image model outputs.
    c                   ó¾   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
ej                     dz  ed<   dZe
ej                     dz  ed<   y)Ú!FocalNetMaskedImageModelingOutputa  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `bool_masked_pos` is provided):
        Masked image modeling (MLM) loss.
    reconstruction (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
        Reconstructed pixel values.
    reshaped_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each stage) of
        shape `(batch_size, hidden_size, height, width)`.

        Hidden-states of the model at the output of each layer plus the initial embedding outputs reshaped to
        include the spatial dimensions.
    NÚlossÚreconstructionr   r   )r   r   r   r   r)   r   r   r   r*   r   r    r   r!   r"   r#   r(   r(   R   sh   … ñð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø/3€N�E×%Ñ%¨Ñ,Ó3Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø>BÐ˜E %×"3Ñ"3Ñ4°tÑ;ÔBr"   r(   z4
    FocalNet outputs for image classification.
    c                   ó¾   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
ej                     dz  ed<   dZe
ej                     dz  ed<   y)ÚFocalNetImageClassifierOutputa7  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided):
        Classification (or regression if config.num_labels==1) loss.
    logits (`torch.FloatTensor` of shape `(batch_size, config.num_labels)`):
        Classification (or regression if config.num_labels==1) scores (before SoftMax).
    reshaped_hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each stage) of
        shape `(batch_size, hidden_size, height, width)`.

        Hidden-states of the model at the output of each layer plus the initial embedding outputs reshaped to
        include the spatial dimensions.
    Nr)   Úlogitsr   r   )r   r   r   r   r)   r   r   r   r-   r   r    r   r!   r"   r#   r,   r,   l   sh   … ñð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø>BÐ˜E %×"3Ñ"3Ñ4°tÑ;ÔBr"   r,   c                   óŠ   ‡ — e Zd ZdZdˆ fd„	Z	 d	dej                  dz  dej                  dz  deej                     fd„Z
ˆ xZS )
ÚFocalNetEmbeddingszX
    Construct the patch embeddings and layernorm. Optionally, also the mask token.
    c           	      ó  •— t         ‰| �  «        t        ||j                  |j                  |j
                  |j                  |j                  d¬«      | _        | j                  j                  | _
        |r4t        j                  t        j                  dd|j                  «      «      nd | _        t        j                   |j                  |j"                  ¬«      | _        t        j&                  |j(                  «      | _        y )NT)ÚconfigÚ
image_sizeÚ
patch_sizeÚnum_channelsÚ	embed_dimÚuse_conv_embedÚis_stemr   ©Úeps)ÚsuperÚ__init__ÚFocalNetPatchEmbeddingsr2   r3   r4   r5   r6   Úpatch_embeddingsÚ	grid_sizeÚ
patch_gridr   Ú	Parameterr   ÚzerosÚ
mask_tokenÚ	LayerNormÚlayer_norm_epsÚnormÚDropoutÚhidden_dropout_probÚdropout)Úselfr1   Úuse_mask_tokenÚ	__class__s      €r#   r;   zFocalNetEmbeddings.__init__‹   s¿   ø€ Ü‰ÑÔä 7ØØ×(Ñ(Ø×(Ñ(Ø×,Ñ,Ø×&Ñ&Ø!×0Ñ0Øô!
ˆÔð ×/Ñ/×9Ñ9ˆŒÙO]œ"Ÿ,™,¤u§{¡{°1°a¸×9IÑ9IÓ'JÔKÐcgˆŒä—L‘L ×!1Ñ!1°v×7LÑ7LÔMˆŒ	Ü—z‘z &×"<Ñ"<Ó=ˆ�r"   NÚpixel_valuesÚbool_masked_posÚreturnc                 ó8  — | j                  |«      \  }}| j                  |«      }|j                  «       \  }}}|�K| j                  j	                  ||d«      }|j                  d«      j                  |«      }	|d|	z
  z  ||	z  z   }| j                  |«      }||fS )Néÿÿÿÿç      ð?)r=   rE   ÚsizerB   ÚexpandÚ	unsqueezeÚtype_asrH   )
rI   rL   rM   Ú
embeddingsÚoutput_dimensionsÚ
batch_sizeÚseq_lenÚ_Úmask_tokensÚmasks
             r#   ÚforwardzFocalNetEmbeddings.forward�   s¦   € ð )-×(=Ñ(=¸lÓ(KÑ%ˆ
Ð%Ø—Y‘Y˜zÓ*ˆ
Ø!+§¡Ó!2Ñˆ
�G˜QàÐ&ØŸ/™/×0Ñ0°¸WÀbÓIˆKà"×,Ñ,¨RÓ0×8Ñ8¸ÓEˆDØ# s¨T¡zÑ2°[À4Ñ5GÑGˆJà—\‘\ *Ó-ˆ
ØÐ,Ð,Ð,r"   )F©N)r   r   r   r   r;   r   r   Ú
BoolTensorr    ÚTensorr]   Ú__classcell__©rK   s   @r#   r/   r/   †   sQ   ø„ ñõ>ð& bfñ-Ø!×-Ñ-°Ñ4ð-ØGL×GWÑGWÐZ^ÑG^ð-à	ˆu�|‰|Ñ	÷-r"   r/   c                   óz   ‡ — e Zd Z	 	 	 dˆ fd„	Zd„ Zdej                  dz  deej                  ee	   f   fd„Z
ˆ xZS )r<   c	                 ód  •— t         ‰| �  «        t        |t        j                  j
                  «      r|n||f}t        |t        j                  j
                  «      r|n||f}|d   |d   z  |d   |d   z  z  }	|| _        || _        || _        |	| _	        |d   |d   z  |d   |d   z  f| _
        |r/|rd}
d}d}nd}
d}d}t        j                  |||
||¬«      | _        nt        j                  ||||¬«      | _        |r't        j                  ||j                  ¬	«      | _        y d | _        y )
Nr   r   é   é   é   r   )Úkernel_sizeÚstrideÚpadding)rh   ri   r8   )r:   r;   Ú
isinstanceÚcollectionsÚabcÚIterabler2   r3   r4   Únum_patchesr>   r   ÚConv2dÚ
projectionrC   rD   rE   )rI   r1   r2   r3   r4   r5   Úadd_normr6   r7   ro   rh   rj   ri   rK   s                €r#   r;   z FocalNetPatchEmbeddings.__init__¯   s7  ø€ ô 	‰ÑÔÜ#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ü#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ø! !‘}¨
°1©Ñ5¸*ÀQ¹-È:ÐVWÉ=Ñ:XÑYˆØ$ˆŒØ$ˆŒØ(ˆÔØ&ˆÔØ$ Q™-¨:°a©=Ñ8¸*ÀQ¹-È:ÐVWÉ=Ñ:XÐYˆŒááØ�Ø�Ø‘à�Ø�Ø�Ü Ÿi™iØ˜i°[ÈÐY`ôˆD�Oô !Ÿi™i¨°iÈZÐ`jÔkˆDŒOáÜŸ™ Y°F×4IÑ4IÔJˆD�IàˆD�Ir"   c                 ón  — || j                   d   z  dk7  rDd| j                   d   || j                   d   z  z
  f}t        j                  j                  ||«      }|| j                   d   z  dk7  rFddd| j                   d   || j                   d   z  z
  f}t        j                  j                  ||«      }|S )Nr   r   )r3   r   Ú
functionalÚpad)rI   rL   ÚheightÚwidthÚ
pad_valuess        r#   Ú	maybe_padz!FocalNetPatchEmbeddings.maybe_padÙ   s±   € Ø�4—?‘? 1Ñ%Ñ%¨Ò*Ø˜TŸ_™_¨QÑ/°%¸$¿/¹/È!Ñ:LÑ2LÑLÐMˆJÜŸ=™=×,Ñ,¨\¸:ÓFˆLØ�D—O‘O AÑ&Ñ&¨!Ò+Ø˜Q  4§?¡?°1Ñ#5¸ÀÇÁÐQRÑASÑ8SÑ#SÐTˆJÜŸ=™=×,Ñ,¨\¸:ÓFˆLØÐr"   rL   NrN   c                 óN  — |j                   \  }}}}|| j                  k7  rt        d«      ‚| j                  |||«      }| j	                  |«      }|j                   \  }}}}||f}|j                  d«      j                  dd«      }| j                  �| j                  |«      }||fS )NzeMake sure that the channel dimension of the pixel values match with the one set in the configuration.rf   r   )Úshaper4   Ú
ValueErrorry   rq   ÚflattenÚ	transposerE   )rI   rL   rZ   r4   rv   rw   rV   rW   s           r#   r]   zFocalNetPatchEmbeddings.forwardâ   sµ   € Ø)5×);Ñ);Ñ&ˆˆ<˜ Ø˜4×,Ñ,Ò,ÜØwóð ð —~‘~ l°F¸EÓBˆØ—_‘_ \Ó2ˆ
Ø(×.Ñ.Ñˆˆ1ˆf�eØ# U˜OÐØ×'Ñ'¨Ó*×4Ñ4°Q¸Ó:ˆ
à�9‰9Ð ØŸ™ :Ó.ˆJàÐ,Ð,Ð,r"   )FFF)r   r   r   r;   ry   r   r   r    r`   Úintr]   ra   rb   s   @r#   r<   r<   ®   sL   ø„ ð ØØõ(òTð- E×$5Ñ$5¸Ñ$<ð -ÀÀuÇ|Á|ÐUZÐ[^ÑU_ÐG_ÑA`÷ -r"   r<   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚFocalNetModulationc                 ó  •— t         ‰	| �  «        || _        |j                  |   | _        |j
                  |   | _        || _        |j                  | _        |j                  | _	        t        j                  |d|z  | j                  dz   z   |¬«      | _        t        j                  ||dd|¬«      | _        t        j                  «       | _        t        j                  ||«      | _        t        j$                  |«      | _        t        j(                  «       | _        g | _        t/        | j                  «      D ]—  }| j                  |z  | j                  z   }| j*                  j1                  t        j2                  t        j                  |||d||dz  d¬«      t        j                  «       «      «       | j,                  j1                  |«       Œ™ | j                  r't        j4                  ||j6                  ¬«      | _        y y )Nrf   r   )Úbias)rh   ri   rƒ   F)rh   ri   Úgroupsrj   rƒ   r8   )r:   r;   ÚdimÚfocal_windowsÚfocal_windowÚfocal_levelsÚfocal_levelÚfocal_factorÚ use_post_layernorm_in_modulationÚnormalize_modulatorr   ÚLinearÚprojection_inrp   Úprojection_contextÚGELUÚ
activationÚprojection_outrF   Úprojection_dropoutÚ
ModuleListÚfocal_layersÚkernel_sizesÚrangeÚappendÚ
SequentialrC   rD   Ú	layernorm)
rI   r1   Úindexr…   rŠ   rƒ   r“   Úkrh   rK   s
            €r#   r;   zFocalNetModulation.__init__ö   s¬  ø€ Ü‰ÑÔàˆŒØ"×0Ñ0°Ñ7ˆÔØ!×.Ñ.¨uÑ5ˆÔØ(ˆÔØ06×0WÑ0WˆÔ-Ø#)×#=Ñ#=ˆÔ äŸY™Y s¨A°©G°t×7GÑ7GÈ!Ñ7KÑ,LÐSWÔXˆÔÜ"$§)¡)¨C°À!ÈAÐTXÔ"YˆÔäŸ'™'›)ˆŒÜ Ÿi™i¨¨SÓ1ˆÔÜ"$§*¡*Ð-?Ó"@ˆÔÜŸM™M›OˆÔàˆÔÜ�t×'Ñ'Ó(ò 
	2ˆAØ×+Ñ+¨aÑ/°$×2CÑ2CÑCˆKØ×Ñ×$Ñ$Ü—‘Ü—I‘IØ˜S¨kÀ!ÈCÐYdÐhiÑYiÐpuôô —G‘G“Ió	ôð ×Ñ×$Ñ$ [Õ1ð
	2ð ×0Ò0ÜŸ\™\¨#°6×3HÑ3HÔIˆD�Nð 1r"   c                 ó,  — |j                   d   }| j                  |«      j                  dddd«      j                  «       }t	        j
                  |||| j                  dz   fd«      \  }}}d}t        | j                  «      D ]+  } | j                  |   |«      }|||dd…||dz   …f   z  z   }Œ- | j                  |j                  dd¬«      j                  dd¬«      «      }	||	|dd…| j                  d…f   z  z   }| j                  r|| j                  dz   z  }| j                  |«      }
||
z  }|j                  dddd«      j                  «       }| j                  r| j                  |«      }| j                  |«      }| j!                  |«      }|S )	zˆ
        Args:
            hidden_state:
                Input features with shape of (batch_size, height, width, num_channels)
        rP   r   r   r   rf   NT)Úkeepdim)r{   rŽ   ÚpermuteÚ
contiguousr   Úsplitr‰   r—   r•   r‘   ÚmeanrŒ   r�   r‹   rš   r’   r“   )rI   Úhidden_stater4   ÚxÚqÚctxÚgatesÚctx_allÚlevelÚ
ctx_globalÚ	modulatorÚx_outs               r#   r]   zFocalNetModulation.forward  s­  € ð $×)Ñ)¨"Ñ-ˆð ×Ñ˜|Ó,×4Ñ4°Q¸¸1¸aÓ@×KÑKÓMˆÜŸ™ A¨°lÀD×DTÑDTÐWXÑDXÐ'YÐ[\Ó]‰ˆˆ3�ð ˆÜ˜4×+Ñ+Ó,ò 	BˆEØ*�$×#Ñ# EÑ*¨3Ó/ˆCØ  eªA¨u°u¸q±yÐ/@Ð,@Ñ&AÑ AÑA‰Gð	Bð —_‘_ S§X¡X¨a¸ XÓ%>×%CÑ%CÀAÈtÐ%CÓ%TÓUˆ
Ø˜J¨ªq°$×2BÑ2BÑ2DÐ/DÑ)EÑEÑEˆð ×#Ò#Ø ×!1Ñ!1°AÑ!5Ñ6ˆGð ×+Ñ+¨GÓ4ˆ	Ø�I‘ˆØ—‘˜a  A qÓ)×4Ñ4Ó6ˆØ×0Ò0Ø—N‘N 5Ó)ˆEð ×#Ñ# EÓ*ˆØ×'Ñ'¨Ó.ˆØˆr"   )rf   Tç        ©r   r   r   r;   r]   ra   rb   s   @r#   r�   r�   õ   s   ø„ õJöB"r"   r�   c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )ÚFocalNetMlpc                 ó
  •— t         ‰| �  «        |xs |}|xs |}t        j                  ||«      | _        t
        |j                     | _        t        j                  ||«      | _        t        j                  |«      | _
        y r^   )r:   r;   r   r�   Úfc1r   Ú
hidden_actr‘   Úfc2rF   Údrop)rI   r1   Úin_featuresÚhidden_featuresÚout_featuresrµ   rK   s         €r#   r;   zFocalNetMlp.__init__=  sh   ø€ Ü‰ÑÔØ#Ò2 {ˆØ)Ò8¨[ˆÜ—9‘9˜[¨/Ó:ˆŒÜ  ×!2Ñ!2Ñ3ˆŒÜ—9‘9˜_¨lÓ;ˆŒÜ—J‘J˜tÓ$ˆ�	r"   c                 ó°   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|S r^   )r²   r‘   rµ   r´   )rI   r£   s     r#   r]   zFocalNetMlp.forwardF  sN   € Ø—x‘x Ó-ˆØ—‘ |Ó4ˆØ—y‘y Ó.ˆØ—x‘x Ó-ˆØ—y‘y Ó.ˆØÐr"   )NNr­   r®   rb   s   @r#   r°   r°   <  s   ø„ õ%ör"   r°   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 )
ÚFocalNetDropPathzÏ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_probrN   Nc                 ó0   •— t         ‰| �  «        || _        y r^   )r:   r;   r¼   )rI   r¼   rK   s     €r#   r;   zFocalNetDropPath.__init__W  s   ø€ Ü‰ÑÔØ"ˆ�r"   r   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 )Nr­   r   r   )r   )ÚdtypeÚdevice)
r¼   Útrainingr{   Úndimr   Úrandr¿   rÀ   ÚfloorÚdiv)rI   r   Ú	keep_probr{   Úrandom_tensors        r#   r]   zFocalNetDropPath.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¼   ©rI   s    r#   Ú
extra_reprzFocalNetDropPath.extra_reprd  s   € Ø�D—N‘NÐ#Ð$Ð$r"   ©r­   )r   r   r   r   Úfloatr;   r   r`   r]   ÚstrrÊ   ra   rb   s   @r#   r»   r»   P  sB   ø„ ññ# %ð #°$õ #ð< U§\¡\ð <°e·l±ló <ð%˜C÷ %r"   r»   c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )ÚFocalNetLayeraƒ  Focal Modulation Network layer (block).

    Args:
        config (`FocalNetConfig`):
            Model config.
        index (`int`):
            Layer index.
        dim (`int`):
            Number of input channels.
        input_resolution (`tuple[int]`):
            Input resolution.
        drop_path (`float`, *optional*, defaults to 0.0):
            Stochastic depth rate.
    c                 óH  •— t         ‰| �  «        || _        || _        || _        |j
                  | _        |j                  | _        t        j                  ||j                  ¬«      | _        t        |||| j                  ¬«      | _        |dkD  rt        |«      nt        j                  «       | _        t        j                  ||j                  ¬«      | _        t%        ||j&                  z  «      }t)        |||| j                  ¬«      | _        d| _        d| _        |j0                  ryt        j2                  |j4                  t7        j8                  |«      z  d¬«      | _        t        j2                  |j4                  t7        j8                  |«      z  d¬«      | _        y y )Nr8   )r1   r›   r…   r“   r­   )r1   r¶   r·   rµ   rQ   T)Úrequires_grad)r:   r;   r1   r…   Úinput_resolutionrG   rµ   Úuse_post_layernormr   rC   rD   Únorm1r�   Ú
modulationr»   ÚIdentityÚ	drop_pathÚnorm2r   Ú	mlp_ratior°   ÚmlpÚgamma_1Úgamma_2Úuse_layerscaler@   Úlayerscale_valuer   Úones)rI   r1   r›   r…   rÒ   r×   Úmlp_hidden_dimrK   s          €r#   r;   zFocalNetLayer.__init__x  sC  ø€ Ü‰ÑÔàˆŒð ˆŒØ 0ˆÔð ×.Ñ.ˆŒ	Ø"(×";Ñ";ˆÔä—\‘\ #¨6×+@Ñ+@ÔAˆŒ
Ü,ØØØØ#Ÿy™yô	
ˆŒð 9BÀCºÔ)¨)Ô4ÌRÏ[É[Ë]ˆŒÜ—\‘\ #¨6×+@Ñ+@ÔAˆŒ
Ü˜S 6×#3Ñ#3Ñ3Ó4ˆÜ f¸#È~Ðdh×dmÑdmÔnˆŒàˆŒØˆŒØ× Ò ÜŸ<™<¨×(?Ñ(?Ä%Ç*Á*ÈSÃ/Ñ(QÐaeÔfˆDŒLÜŸ<™<¨×(?Ñ(?Ä%Ç*Á*ÈSÃ/Ñ(QÐaeÔfˆD�Lð !r"   c           	      ó:  — |\  }}|j                   \  }}}|}| j                  r|n| j                  |«      }|j                  ||||«      }| j	                  |«      j                  |||z  |«      }| j                  s|n| j                  |«      }|| j                  | j                  |z  «      z   }|| j                  | j                  | j                  r | j                  | j                  |«      «      n| j                  | j                  |«      «      z  «      z   }|S r^   )
r{   rÓ   rÔ   ÚviewrÕ   r×   rÛ   rÜ   rØ   rÚ   )	rI   r£   Úinput_dimensionsrv   rw   rX   rZ   r4   Úshortcuts	            r#   r]   zFocalNetLayer.forward˜  s  € Ø(‰ˆ�Ø&2×&8Ñ&8Ñ#ˆ
�A�|Øˆð (,×'>Ò'>‘|ÀDÇJÁJÈ|ÓD\ˆØ#×(Ñ(¨°V¸UÀLÓQˆØ—‘ |Ó4×9Ñ9¸*ÀfÈuÁnÐVbÓcˆØ+/×+BÒ+B‘|ÈÏ
É
ÐS_ÓH`ˆð   $§.¡.°·±ÀÑ1LÓ"MÑMˆØ# d§n¡nØ�L‰LØ59×5LÒ5Lˆt�z‰z˜$Ÿ(™( <Ó0Ô1ÐRV×RZÑRZÐ[_×[eÑ[eÐfrÓ[sÓRtñvó'
ñ 
ˆð
 Ðr"   rË   )r   r   r   r   r;   r]   ra   rb   s   @r#   rÏ   rÏ   h  s   ø„ ñõgö@r"   rÏ   c                   ój   ‡ — e Zd Zˆ fd„Zdej
                  deeef   deej
                     fd„Zˆ xZ	S )ÚFocalNetStagec                 ó–  •— t         ‰| �  «        || _        t        |j                  «      | _        t        | j
                  «      D �cg c]  }|j                  d|z  z  ‘Œ }}||   }|| j
                  dz
  k  r||dz      nd }|| j
                  dz
  k  rt        nd }t        j                  d|j                  t        |j                  «      d¬«      D �	cg c]  }	|	j                  «       ‘Œ }
}	|
t        |j                  d | «      t        |j                  d |dz    «       }t        j                  t        |j                  |   «      D �cg c]'  }t!        ||||t#        |t$        «      r||   n|¬«      ‘Œ) c}«      | _        |�' |||d||d|j(                  d¬	«      | _        d| _        y d | _        d| _        y c c}w c c}	w c c}w )
Nrf   r   r   Úcpu)rÀ   )r1   r›   r…   rÒ   r×   TF)r1   r2   r3   r4   r5   rr   r6   r7   )r:   r;   r1   ÚlenÚdepthsÚ
num_stagesr—   r5   r<   r   ÚlinspaceÚdrop_path_rateÚsumÚitemr   r”   rÏ   rk   ÚlistÚlayersr6   Ú
downsampleÚpointing)rI   r1   r›   rÒ   Úir5   r…   Úout_dimrò   r¤   Údprr×   rK   s               €r#   r;   zFocalNetStage.__init__®  s¶  ø€ Ü‰ÑÔàˆŒÜ˜fŸm™mÓ,ˆŒä8=¸d¿o¹oÓ8NÖO°1�V×%Ñ%¨¨A©Ó.ÐOˆ	ÐOØ˜ÑˆØ+0°4·?±?ÀQÑ3FÒ+F�)˜E A™IÒ&ÈTˆØ16¸¿¹È1Ñ9LÒ1LÕ,ÐSWˆ
ô "'§¡°°6×3HÑ3HÌ#ÈfÏmÉmÓJ\ÐejÔ!kÖl˜Aˆq�v‰v�xÐlˆÐlØœ˜FŸM™M¨&¨5Ð1Ó2´S¸¿¹À{ÈÐQRÉÐ9SÓ5TÐUˆ	ä—m‘mô ˜vŸ}™}¨UÑ3Ó4ö	ð ô Ø!ØØØ%5Ü.8¸ÄDÔ.I˜i¨šlÈyöò	ó
ˆŒð Ð!Ù(ØØ+ØØ Ø!ØØ%×4Ñ4Øô	ˆDŒOð ˆ�ð #ˆDŒOàˆ�ùòI Pùò mùò	s   ÁF<ÃGÅ,Gr   rã   rN   c                 ó  — |\  }}| j                   D ]  } |||«      }Œ |}| j                  �K|\  }}|j                  dd«      j                  |j                  d   d||«      }| j                  |«      \  }}n||||f}|||f}|S )Nr   rf   r   rP   )rñ   rò   r~   Úreshaper{   )	rI   r   rã   rv   rw   Úlayer_moduleÚ!hidden_states_before_downsamplingrW   Ústage_outputss	            r#   r]   zFocalNetStage.forwardÚ  s´   € Ø(‰ˆ�Ø ŸK™Kò 	JˆLÙ(¨Ð8HÓI‰Mð	Jð -:Ð)Ø�?‰?Ð&Ø,‰MˆF�EØ)×3Ñ3°A°qÓ9×AÑAØ1×7Ñ7¸Ñ:¸BÀÈóˆMð 04¯©¸}Ó/MÑ,ˆMÑ,ð "(¨°¸Ð >Ðà&Ð(IÐK\Ð]ˆàÐr"   )
r   r   r   r;   r   r`   r    r   r]   ra   rb   s   @r#   ræ   ræ   ­  s=   ø„ ô*ðX U§\¡\ð ÀUÈ3ÐPSÈ8Á_ð ÐY^Ð_d×_kÑ_kÑYl÷ r"   ræ   c                   ó|   ‡ — e Zd Zˆ fd„Z	 	 	 d
dej
                  deeef   dedz  dedz  dedz  dee	z  fd	„Z
ˆ xZS )ÚFocalNetEncoderc                 ó2  •— t         ‰| �  «        t        |j                  «      | _        || _        t        j                  t        | j                  «      D �cg c]$  }t        |||d   d|z  z  |d   d|z  z  f¬«      ‘Œ& c}«      | _
        d| _        y c c}w )Nr   rf   r   )r1   r›   rÒ   F)r:   r;   ré   rê   rë   r1   r   r”   r—   ræ   ÚstagesÚgradient_checkpointing)rI   r1   r>   Úi_layerrK   s       €r#   r;   zFocalNetEncoder.__init__ð  s—   ø€ Ü‰ÑÔÜ˜fŸm™mÓ,ˆŒØˆŒä—m‘mô  % T§_¡_Ó5öð ô Ø!Ø!Ø&/°¡l°q¸'±zÑ&BÀIÈaÁLÐUVÐX_ÑU_ÑD`Ð%aöòó	
ˆŒð ',ˆÕ#ùòs   Á)Br   rã   Úoutput_hidden_statesNÚ(output_hidden_states_before_downsamplingÚreturn_dictrN   c                 ó¨  — |rdnd }|rdnd }|rE|j                   \  }}	}
 |j                  |g|¢|
‘­Ž }|j                  dddd«      }||fz  }||fz  }t        | j                  «      D ]Ä  \  }} |||«      }|d   }|d   }|d   }|d   |d   f}|rP|rN|j                   \  }}	}
 |j                  |g|d   |d   f¢|
‘­Ž }|j                  dddd«      }||fz  }||fz  }Œz|sŒ}|rŒ€|j                   \  }}	}
 |j                  |g|¢|
‘­Ž }|j                  dddd«      }||fz  }||fz  }ŒÆ |st        d„ ||fD «       «      S t        |||¬	«      S )
Nr!   r   r   r   rf   éþÿÿÿrP   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr^   r!   )Ú.0Úvs     r#   ú	<genexpr>z*FocalNetEncoder.forward.<locals>.<genexpr>1  s   è ø€ ÒX˜qÈ!É-œÑXùs   ‚Š)r   r   r   )r{   râ   rŸ   Ú	enumeraterÿ   r    r   )rI   r   rã   r  r  r  Úall_hidden_statesÚall_reshaped_hidden_statesrX   rZ   Úhidden_sizeÚreshaped_hidden_staterô   Ústage_modulerû   rú   rW   s                    r#   r]   zFocalNetEncoder.forward  s  € ñ #7™B¸DÐÙ+?¡RÀTÐ"áØ)6×)<Ñ)<Ñ&ˆJ˜˜;à$6 M×$6Ñ$6°zÐ$bÐDTÐ$bÐVaÒ$bÐ!Ø$9×$AÑ$AÀ!ÀQÈÈ1Ó$MÐ!Ø -Ð!1Ñ1ÐØ&Ð+@Ð*BÑBÐ&ä(¨¯©Ó5ò 	G‰OˆAˆ|Ù(¨Ð8HÓIˆMà)¨!Ñ,ˆMØ0=¸aÑ0@Ð-Ø -¨aÑ 0Ðà 1°"Ñ 5Ð7HÈÑ7LÐMÐá#Ñ(PØ-N×-TÑ-TÑ*�
˜A˜{ð )OÐ(I×(NÑ(NØð)Ø"3°AÑ"6Ð8IÈ!Ñ8LÐ!Mð)ØOZò)Ð%ð )>×(EÑ(EÀaÈÈAÈqÓ(QÐ%Ø!Ð&GÐ%IÑIÐ!Ø*Ð/DÐ.FÑFÑ*Ú%Ò.VØ-:×-@Ñ-@Ñ*�
˜A˜{à(:¨×(:Ñ(:¸:Ð(fÐHXÐ(fÐZeÒ(fÐ%Ø(=×(EÑ(EÀaÈÈAÈqÓ(QÐ%Ø! mÐ%5Ñ5Ð!Ø*Ð/DÐ.FÑFÑ*ð3	Gñ6 ÜÑX ]Ð4EÐ$FÔXÓXÐXä$Ø+Ø+Ø#=ô
ð 	
r"   )FFT)r   r   r   r;   r   r`   r    r   Úboolr   r]   ra   rb   s   @r#   rý   rý   ï  sp   ø„ ô,ð, -2Ø@EØ#'ñ5
à—|‘|ð5
ð    S ™/ð5
ð # T™kð	5
ð
 37¸±+ð5
ð ˜D‘[ð5
ð 
Ð&Ñ	&÷5
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 )ÚFocalNetPreTrainedModelr1   ÚfocalnetrL   Træ   c                 ó¾  •— t         ‰| �  |«       t        |t        «      r-|j                  � t        j                  |j                  «       yyt        |t        «      r€| j                  j                  rit        j                  |j                  | j                  j                  «       t        j                  |j                  | j                  j                  «       yyy)zInitialize the weightsN)r:   Ú_init_weightsrk   r/   rB   ÚinitÚzeros_rÏ   r1   rÝ   Ú	constant_rÛ   rÞ   rÜ   )rI   ÚmodulerK   s     €r#   r  z%FocalNetPreTrainedModel._init_weightsB  s™   ø€ ô 	‰Ñ˜fÔ%Ü�fÔ0Ô1Ø× Ñ Ð,Ü—‘˜F×-Ñ-Õ.ð -ä˜¤Ô.Ø�{‰{×)Ò)Ü—‘˜vŸ~™~¨t¯{©{×/KÑ/KÔLÜ—‘˜vŸ~™~¨t¯{©{×/KÑ/KÕLð *ð /r"   )r   r   r   r   r   Úbase_model_prefixÚmain_input_nameÚsupports_gradient_checkpointingÚ_no_split_modulesr   Úno_gradr  ra   rb   s   @r#   r  r  :  s?   ø… àÓØ"ÐØ$€OØ&*Ð#Ø(Ð)Ðà€U‡]�]ƒ_ó	Mó ô	Mr"   r  c                   óœ   ‡ — e Zd Zd
ˆ fd„	Zd„ Ze	 	 	 	 ddej                  dz  dej                  dz  de	dz  de	dz  de
ez  f
d	„«       Zˆ xZS )ÚFocalNetModelc                 óê  •— t         ‰| �  |«       || _        t        |j                  «      | _        t        |j                  d| j
                  dz
  z  z  «      | _        t        ||¬«      | _
        t        || j                  j                  «      | _        t        j                  | j                  |j                   ¬«      | _        |rt        j$                  d«      nd| _        | j)                  «        y)zû
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        use_mask_token (`bool`, *optional*, defaults to `False`):
            Whether to use a mask token for masked image modeling.
        rf   r   )rJ   r8   N)r:   r;   r1   ré   rê   rë   r   r5   Únum_featuresr/   rV   rý   r?   Úencoderr   rC   rD   rš   ÚAdaptiveAvgPool1dÚpoolerÚ	post_init)rI   r1   Úadd_pooling_layerrJ   rK   s       €r#   r;   zFocalNetModel.__init__Q  sµ   ø€ ô 	‰Ñ˜Ô ØˆŒÜ˜fŸm™mÓ,ˆŒÜ × 0Ñ 0°1¸¿¹È1Ñ9LÑ3MÑ MÓNˆÔä,¨VÀNÔSˆŒÜ& v¨t¯©×/IÑ/IÓJˆŒäŸ™ d×&7Ñ&7¸V×=RÑ=RÔSˆŒÙ1B”b×*Ñ*¨1Ô-ÈˆŒð 	�‰Õr"   c                 ó.   — | j                   j                  S r^   )rV   r=   rÉ   s    r#   Úget_input_embeddingsz"FocalNetModel.get_input_embeddingsf  s   € Ø�‰×/Ñ/Ð/r"   NrL   rM   r  r  rN   c                 óò  — |�|n| j                   j                  }|�|n| j                   j                  }|€t        d«      ‚| j	                  ||¬«      \  }}| j                  ||||¬«      }|d   }	| j                  |	«      }	d}
| j                  �7| j                  |	j                  dd«      «      }
t        j                  |
d«      }
|s|	|
f|dd z   }|S t        |	|
|j                  |j                  ¬«      S )	z¿
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
        Nz You have to specify pixel_values)rM   ©r  r  r   r   rf   )r   r&   r   r   )r1   r  r  r|   rV   r$  rš   r&  r~   r   r}   r%   r   r   )rI   rL   rM   r  r  ÚkwargsÚembedding_outputrã   Úencoder_outputsÚsequence_outputÚpooled_outputÚoutputs               r#   r]   zFocalNetModel.forwardi  s  € ð %9Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆàÐÜÐ?Ó@Ð@à-1¯_©_¸\Ð[j¨_Ó-kÑ*ÐÐ*àŸ,™,ØØØ!5Ø#ð	 'ó 
ˆð *¨!Ñ,ˆØŸ.™.¨Ó9ˆàˆØ�;‰;Ð"Ø ŸK™K¨×(AÑ(AÀ!ÀQÓ(GÓHˆMÜ!ŸM™M¨-¸Ó;ˆMáØ% }Ð5¸ÈÈÐ8KÑKˆFàˆMä"Ø-Ø'Ø)×7Ñ7Ø#2×#IÑ#Iô	
ð 	
r"   )TF©NNNN)r   r   r   r;   r*  r   r   r   r_   r  r    r%   r]   ra   rb   s   @r#   r!  r!  O  sƒ   ø„ õò*0ð ð 26Ø37Ø,0Ø#'ñ/
à×'Ñ'¨$Ñ.ð/
ð ×)Ñ)¨DÑ0ð/
ð # T™kð	/
ð
 ˜D‘[ð/
ð 
Ð$Ñ	$ò/
ó ô/
r"   r!  a‰  
    FocalNet Model with a decoder on top for masked image modeling.

    This follows the same implementation as in [SimMIM](https://huggingface.co/papers/2111.09886).

    <Tip>

    Note that we provide a script to pre-train this model on custom data in our [examples
    directory](https://github.com/huggingface/transformers/tree/main/examples/pytorch/image-pretraining).

    </Tip>
    c                   ó”   ‡ — 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	e
z  f
d„«       Zˆ xZS )
ÚFocalNetForMaskedImageModelingc                 ó¾  •— t         ‰| �  |«       t        |dd¬«      | _        t	        |j
                  «      | _        t        |j                  d| j                  dz
  z  z  «      }t        j                  t        j                  ||j                  dz  |j                  z  d¬«      t        j                  |j                  «      «      | _        | j!                  «        y )NFT)r(  rJ   rf   r   )Úin_channelsÚout_channelsrh   )r:   r;   r!  r  ré   rê   rë   r   r5   r   r™   rp   Úencoder_strider4   ÚPixelShuffleÚdecoderr'  )rI   r1   r#  rK   s      €r#   r;   z'FocalNetForMaskedImageModeling.__init__«  s¯   ø€ Ü‰Ñ˜Ô ä% fÀÐVZÔ[ˆŒä˜fŸm™mÓ,ˆŒÜ˜6×+Ñ+¨a°D·O±OÀaÑ4GÑ.HÑHÓIˆÜ—}‘}Ü�I‰IØ(°v×7LÑ7LÈaÑ7OÐRX×ReÑReÑ7eÐstôô �O‰O˜F×1Ñ1Ó2ó	
ˆŒð 	�‰Õr"   NrL   rM   r  r  rN   c                 ó´  — |�|n| j                   j                  }| j                  ||||¬«      }|d   }|j                  dd«      }|j                  \  }}	}
t        j                  |
dz  «      x}}|j                  ||	||«      }| j                  |«      }d}|��| j                   j                  | j                   j                  z  }|j                  d||«      }|j                  | j                   j                  d«      j                  | j                   j                  d«      j                  d«      j                  «       }t        j                  j!                  ||d¬	«      }||z  j#                  «       |j#                  «       d
z   z  | j                   j$                  z  }|s|f|dd z   }|�|f|z   S |S t'        |||j(                  |j*                  ¬«      S )a�  
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).

        Examples:
        ```python
        >>> from transformers import AutoImageProcessor, FocalNetConfig, FocalNetForMaskedImageModeling
        >>> 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()))

        >>> image_processor = AutoImageProcessor.from_pretrained("microsoft/focalnet-base-simmim-window6-192")
        >>> config = FocalNetConfig()
        >>> model = FocalNetForMaskedImageModeling(config)

        >>> num_patches = (model.config.image_size // model.config.patch_size) ** 2
        >>> pixel_values = image_processor(images=image, return_tensors="pt").pixel_values
        >>> # create random boolean mask of shape (batch_size, num_patches)
        >>> bool_masked_pos = torch.randint(low=0, high=2, size=(1, num_patches)).bool()

        >>> outputs = model(pixel_values, bool_masked_pos=bool_masked_pos)
        >>> loss, reconstructed_pixel_values = outputs.loss, outputs.logits
        >>> list(reconstructed_pixel_values.shape)
        [1, 3, 192, 192]
        ```N)rM   r  r  r   r   rf   g      à?rP   Únone)Ú	reductiongñhãˆµøä>)r)   r*   r   r   )r1   r  r  r~   r{   ÚmathrÄ   rø   r;  r2   r3   Úrepeat_interleaverT   r    r   rt   Úl1_lossrî   r4   r(   r   r   )rI   rL   rM   r  r  r-  Úoutputsr0  rX   r4   Úsequence_lengthrv   rw   Úreconstructed_pixel_valuesÚmasked_im_lossrR   r\   Úreconstruction_lossr2  s                      r#   r]   z&FocalNetForMaskedImageModeling.forward¼  sÖ  € ðN &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—-‘-ØØ+Ø!5Ø#ð	  ó 
ˆð " !™*ˆà)×3Ñ3°A°qÓ9ˆØ4C×4IÑ4IÑ1ˆ
�L /ÜŸ™ O°SÑ$8Ó9Ð9ˆ�Ø)×1Ñ1°*¸lÈFÐTYÓZˆð &*§\¡\°/Ó%BÐ"àˆØÑ&Ø—;‘;×)Ñ)¨T¯[©[×-CÑ-CÑCˆDØ-×5Ñ5°b¸$ÀÓEˆOà×1Ñ1°$·+±+×2HÑ2HÈ!ÓLß"Ñ" 4§;¡;×#9Ñ#9¸1Ó=ß‘˜1“ß‘“ð	 ô #%§-¡-×"7Ñ"7¸ÐF`ÐlrÐ"7Ó"sÐØ1°DÑ8×=Ñ=Ó?À4Ç8Á8Ã:ÐPTÑCTÑUÐX\×XcÑXc×XpÑXpÑpˆNáØ0Ð2°W¸Q¸R°[Ñ@ˆFØ3AÐ3M�^Ð%¨Ñ.ÐYÐSYÐYä0ØØ5Ø!×/Ñ/Ø#*×#AÑ#Aô	
ð 	
r"   r3  )r   r   r   r;   r   r   r   r_   r  r    r(   r]   ra   rb   s   @r#   r5  r5  œ  s…   ø„ ôð" ð 26Ø37Ø,0Ø#'ñO
à×'Ñ'¨$Ñ.ðO
ð ×)Ñ)¨DÑ0ðO
ð # T™kð	O
ð
 ˜D‘[ðO
ð 
Ð2Ñ	2òO
ó ôO
r"   r5  z…
    FocalNet Model with an image classification head on top (a linear layer on top of the pooled output) e.g. for
    ImageNet.
    c                   ó”   ‡ — 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	e
z  f
d„«       Zˆ xZS )
ÚFocalNetForImageClassificationc                 ó>  •— t         ‰| �  |«       |j                  | _        t        |«      | _        |j                  dkD  r4t        j                  | j                  j                  |j                  «      nt        j                  «       | _	        | j                  «        y )Nr   )r:   r;   Ú
num_labelsr!  r  r   r�   r#  rÖ   Ú
classifierr'  ©rI   r1   rK   s     €r#   r;   z'FocalNetForImageClassification.__init__  sx   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ% fÓ-ˆŒð IO×HYÑHYÐ\]ÒH]ŒB�I‰I�d—m‘m×0Ñ0°&×2CÑ2CÔDÔce×cnÑcnÓcpð 	Œð
 	�‰Õr"   NrL   Úlabelsr  r  rN   c                 ó<  — |�|n| j                   j                  }| j                  |||¬«      }|d   }| j                  |«      }d}	|�| j	                  ||| j                   «      }	|s|f|dd z   }
|	�|	f|
z   S |
S t        |	||j                  |j                  ¬«      S )aŠ  
        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   rf   )r)   r-   r   r   )r1   r  r  rK  Úloss_functionr,   r   r   )rI   rL   rM  r  r  r-  rB  r1  r-   r)   r2  s              r#   r]   z&FocalNetForImageClassification.forward%  sÃ   € ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà—-‘-ØØ!5Ø#ð  ó 
ˆð   ™
ˆà—‘ Ó/ˆàˆØÐØ×%Ñ% f¨f°d·k±kÓBˆDáØ�Y ¨¨ Ñ,ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä,ØØØ!×/Ñ/Ø#*×#AÑ#Aô	
ð 	
r"   r3  )r   r   r   r;   r   r   r   Ú
LongTensorr  r    r,   r]   ra   rb   s   @r#   rH  rH    s~   ø„ ôð ð 26Ø*.Ø,0Ø#'ñ'
à×'Ñ'¨$Ñ.ð'
ð × Ñ  4Ñ'ð'
ð # T™kð	'
ð
 ˜D‘[ð'
ð 
Ð.Ñ	.ò'
ó ô'
r"   rH  zG
    FocalNet backbone, to be used with frameworks like X-Decoder.
    c                   ó„   ‡ — e Zd ZdZdefˆ fd„Zeee	 	 d
de	j                  dedz  dedz  defd	„«       «       «       Zˆ xZS )ÚFocalNetBackboneFr1   c                 ó¢   •— t         ‰| �  |«       |j                  g|j                  z   | _        t        |«      | _        | j                  «        y r^   )r:   r;   r5   Úhidden_sizesr#  r!  r  r'  rL  s     €r#   r;   zFocalNetBackbone.__init__X  sD   ø€ Ü‰Ñ˜Ô à#×-Ñ-Ð.°×1DÑ1DÑDˆÔÜ% fÓ-ˆŒð 	�‰Õr"   NrL   r  r  rN   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("microsoft/focalnet-tiny-lrf")
        >>> model = AutoBackbone.from_pretrained("microsoft/focalnet-tiny-lrf")

        >>> inputs = processor(image, return_tensors="pt")
        >>> outputs = model(**inputs)
        ```NTr,  r!   )Úfeature_mapsr   Ú
attentions)
r1   r  r  r  r   r  Ústage_namesr¸   r   r   )rI   rL   r  r  r-  rB  r   rV  ÚidxÚstager2  s              r#   r]   zFocalNetBackbone.forwarda  sî   € ð< &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð —-‘- À4ÐUY�-ÓZˆà×6Ñ6ˆàˆÜ# D×$4Ñ$4Ó5ò 	6‰JˆC�Ø˜×)Ñ)Ò)Ø ¨sÑ!3Ð 5Ñ5‘ð	6ñ Ø"�_ˆFÙ#Ø˜7×0Ñ0Ð2Ñ2�ØˆMäØ%Ù3G˜'×/Ñ/Øô
ð 	
àMQØô
ð 	
r"   )NN)r   r   r   Úhas_attentionsr   r;   r   r	   r   r   r`   r  r   r]   ra   rb   s   @r#   rR  rR  P  st   ø„ ð €Nð˜~õ ð Ø Øð -1Ø#'ñ	3
à—l‘lð3
ð # T™kð3
ð ˜D‘[ð	3
ð 
ò3
ó ó !ó ô3
r"   rR  )rH  r5  rR  r!  r  )4r   Úcollections.abcrl   r?  Údataclassesr   r   r   Ú r   r  Úactivationsr   Úbackbone_utilsr   r	   Úmodeling_layersr
   Úmodeling_outputsr   Úmodeling_utilsr   Úutilsr   r   r   Úutils.genericr   Úconfiguration_focalnetr   Ú
get_loggerr   Úloggerr   r%   r(   r,   ÚModuler/   r<   r�   r°   r»   rÏ   ræ   rý   r  r!  r5  rH  rR  Ú__all__r!   r"   r#   ú<module>rk     s`  ðñ ã Û Ý !ã Ý å &Ý !ß HÝ 9Ý .Ý -ß 9Ñ 9Ý -Ý 2ð 
ˆ×	Ñ	˜HÓ	%€ñ ðôð
 ôC˜Kó Có óðCñ ðôð
 ôC˜+ó Có óðCñ$ ðôð
 ôC¨ó Có óðCñ( ðôð
 ôC Kó Có óðCô(%-˜Ÿ™ô %-ôPD-˜bŸi™iô D-ôND˜Ÿ™ô DôN�"—)‘)ô ô(%�r—y‘yô %ô0B�B—I‘Iô BôJ?Ð.ô ?ôDH
�b—i‘iô H
ðV ôM˜oó Mó ðMð( ôI
Ð+ó I
ó ðI
ñX ðôôb
Ð%<ó b
óðb
ñJ ðôô8
Ð%<ó 8
óð8
ñv ðôô
B
�}Ð&=ó B
óð
B
òJ�r"   