Ë
    ÜÓ^j(¡  ã                   ó  — d dl mZ d dlmZ d dlmZ d dlZd dlZd dl	m
Z
 d dlm
c mZ ddl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mZ ddlmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z-  e#d¬«      e G d„ de!«      «       «       Z. e#d¬«      e G d„ de!«      «       «       Z/e#e G d„ de!«      «       «       Z0 G d„ de
jb                  «      Z2 G d„ de
jb                  «      Z3	 d?de
jb                  d ejh                  d!ejh                  d"ejh                  d#ejh                  dz  d$e5d%e5fd&„Z6 G d'„ d(e
jb                  «      Z7 G d)„ d*e
jb                  «      Z8 G d+„ d,e«      Z9e# G d-„ d.e«      «       Z: G d/„ d0e
jb                  «      Z; e#d1¬«       G d2„ d3e:«      «       Z< e#d4¬«       G d5„ d6e:«      «       Z= G d7„ d8e
jb                  «      Z>e# G d9„ d:e:«      «       Z? e#d;¬«       G d<„ d=e:«      «       Z@g d>¢ZAy)@é    )ÚCallable)Ú	dataclass)ÚAnyNé   )Úinitialization)ÚACT2FN)Úcreate_bidirectional_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputÚBaseModelOutputWithPoolingÚImageClassifierOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚtorch_compilable_check)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputsé   )ÚSiglip2ConfigÚSiglip2TextConfigÚSiglip2VisionConfigz}
    Base class for vision model's outputs that also contains image embeddings of the pooling of the last hidden states.
    )Úcustom_introc                   óÆ   — 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f   dz  ed<   dZe
ej                  df   dz  ed<   y)ÚSiglip2VisionOutputzø
    image_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim)` *optional* returned when model is initialized with `with_projection=True`):
        The image embeddings obtained by applying the projection layer to the pooler_output.
    NÚimage_embedsÚlast_hidden_state.Úhidden_statesÚ
attentions)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r    r!   Útupler"   © ó    úw/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/siglip2/modeling_siglip2.pyr   r   ,   sr   … ñð
 .2€L�%×#Ñ# dÑ*Ó1Ø26Ð�u×(Ñ(¨4Ñ/Ó6Ø:>€M�5˜×*Ñ*¨CÐ/Ñ0°4Ñ7Ó>Ø7;€J��e×'Ñ'¨Ð,Ñ-°Ñ4Ô;r,   r   ze
    Base class for text 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f   dz  ed<   dZe
ej                  df   dz  ed<   y)ÚSiglip2TextOutputzö
    text_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim)` *optional* returned when model is initialized with `with_projection=True`):
        The text embeddings obtained by applying the projection layer to the pooler_output.
    NÚtext_embedsr    .r!   r"   )r#   r$   r%   r&   r0   r'   r(   r)   r    r!   r*   r"   r+   r,   r-   r/   r/   >   sr   … ñð
 -1€K�×"Ñ" TÑ)Ó0Ø26Ð�u×(Ñ(¨4Ñ/Ó6Ø:>€M�5˜×*Ñ*¨CÐ/Ñ0°4Ñ7Ó>Ø7;€J��e×'Ñ'¨Ð,Ñ-°Ñ4Ô;r,   r/   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j                  dz  ed<   dZ
ej                  dz  ed<   dZej                  dz  ed<   dZeed<   dZeed	<   d
ee   fd„Zy)ÚSiglip2Outputaµ  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `return_loss` is `True`):
        Contrastive loss for image-text similarity.
    logits_per_image (`torch.FloatTensor` of shape `(image_batch_size, text_batch_size)`):
        The scaled dot product scores between `image_embeds` and `text_embeds`. This represents the image-text
        similarity scores.
    logits_per_text (`torch.FloatTensor` of shape `(text_batch_size, image_batch_size)`):
        The scaled dot product scores between `text_embeds` and `image_embeds`. This represents the text-image
        similarity scores.
    text_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim`):
        The text embeddings obtained by applying the projection layer to the pooled output of [`Siglip2TextModel`].
    image_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim`):
        The image embeddings obtained by applying the projection layer to the pooled output of [`Siglip2VisionModel`].
    text_model_output (`BaseModelOutputWithPooling`):
        The output of the [`Siglip2TextModel`].
    vision_model_output (`BaseModelOutputWithPooling`):
        The output of the [`Siglip2VisionModel`].
    NÚlossÚlogits_per_imageÚlogits_per_textr0   r   Útext_model_outputÚvision_model_outputÚreturnc                 óB   — t        d„ | j                  «       D «       «      S )Nc              3   ó`   K  — | ]&  }t        |t        «      r|j                  «       n|–— Œ( y ­w©N)Ú
isinstancer   Úto_tuple)Ú.0Úvs     r-   ú	<genexpr>z)Siglip2Output.to_tuple.<locals>.<genexpr>o   s$   è ø€ Ò^È1¤Z°´;Ô%?�Q—Z‘Z”\ÀQÓFÑ^ùs   ‚,.)r*   Úvalues©Úselfs    r-   r=   zSiglip2Output.to_tuplen   s   € ÜÑ^ÐPT×P[ÑP[ÓP]Ô^Ó^Ð^r,   )r#   r$   r%   r&   r3   r'   r(   r)   r4   r5   r0   r   r6   r   r7   r*   r   r=   r+   r,   r-   r2   r2   P   s�   … ñð& &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø15Ð�e×'Ñ'¨$Ñ.Ó5Ø04€O�U×&Ñ&¨Ñ-Ó4Ø,0€K�×"Ñ" TÑ)Ó0Ø-1€L�%×#Ñ# dÑ*Ó1Ø48ÐÐ1Ó8Ø6:ÐÐ3Ó:ð_˜% ™*ô _r,   r2   c            	       óÒ   ‡ — e Zd Zdefˆ fd„Zedej                  dej                  de	dej                  fd„«       Z
dej                  dej                  dej                  fd	„Zˆ xZS )
ÚSiglip2VisionEmbeddingsÚconfigc                 óÂ  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        t        j                  |j                  | j
                  z  | j
                  z  | j                  ¬«      | _	        |j                  | _
        t        | j                  dz  «      | _        t        j                  | j                  | j                  «      | _        y )N)Úin_featuresÚout_featuresg      à?)ÚsuperÚ__init__rF   Úhidden_sizeÚ	embed_dimÚ
patch_sizeÚnnÚLinearÚnum_channelsÚpatch_embeddingÚnum_patchesÚintÚposition_embedding_sizeÚ	EmbeddingÚposition_embedding©rC   rF   Ú	__class__s     €r-   rK   z Siglip2VisionEmbeddings.__init__s   s§   ø€ Ü‰ÑÔØˆŒØ×+Ñ+ˆŒØ ×+Ñ+ˆŒä!Ÿy™yØ×+Ñ+¨d¯o©oÑ=ÀÇÁÑOØŸ™ô 
ˆÔð
 "×-Ñ-ˆÔÜ'*¨4×+;Ñ+;¸SÑ+@Ó'AˆÔ$Ü"$§,¡,¨t×/?Ñ/?ÀÇÁÓ"PˆÕr,   Úpositional_embeddingsÚspatial_shapesÚ
max_lengthr8   c                 óÞ  — |j                   d   }| j                   d   }| j                  }t        j                  |||f| j                  |¬«      }| j                  ddd«      j                  d«      } | j                  j                  dk(  r| j                  t        j                  «      } t        |«      D ]µ  }||   j                  «       \  }}	t        |	dkD  d«       t        |dkD  d«       t        ||	z  |k  d	«       t        j                  | ||	fd
dd¬«      }
|
j                  |||	z  «      j!                  dd«      }
|
j                  |«      }
|
||d||	z  …f<   |
d   ||||	z  d…f<   Œ· |S )ac  
        Resize positional embeddings to image-specific size and pad to a fixed size.

        Args:
            positional_embeddings (`torch.Tensor`):
                Position embeddings of shape (height, width, embed_dim)
            spatial_shapes (`torch.LongTensor`):
                Spatial shapes of shape (batch_size, 2) to resize the positional embeddings to
            max_length (`int`):
                Maximum length of the positional embeddings to pad resized positional embeddings to

        Returns:
            `torch.Tensor`: Embeddings of shape (batch_size, max_length, embed_dim)
        r   éÿÿÿÿ©ÚdeviceÚdtypeé   r   Úcpuz8Width of resized positional embeddings must be positive.z9Height of resized positional embeddings must be positive.z0Resized positional embeddings exceed max_length.ÚbilinearFT)ÚsizeÚmodeÚalign_cornersÚ	antialiasN)Úshapera   r'   Úemptyr`   ÚpermuteÚ	unsqueezeÚtypeÚtoÚfloat32ÚrangeÚtolistr   ÚFÚinterpolateÚreshapeÚ	transpose)rZ   r[   r\   Ú
batch_sizerM   Úsource_dtypeÚresulted_positional_embeddingsÚiÚheightÚwidthÚresized_embeddingss              r-   Úresize_positional_embeddingsz4Siglip2VisionEmbeddings.resize_positional_embeddings‚   sž  € ð( $×)Ñ)¨!Ñ,ˆ
Ø)×/Ñ/°Ñ3ˆ	Ø,×2Ñ2ˆä).¯©Ø˜ YÐ/Ø(×/Ñ/Øô*
Ð&ð !6× =Ñ =¸aÀÀAÓ F× PÑ PÐQRÓ SÐð !×'Ñ'×,Ñ,°Ò5Ø$9×$<Ñ$<¼U¿]¹]Ó$KÐ!ä�zÓ"ò 	XˆAà*¨1Ñ-×4Ñ4Ó6‰MˆF�EÜ" E¨A¡IÐ0jÔkÜ" F¨Q¡JÐ1lÔmÜ" F¨U¡N°zÑ#AÐCuÔvÜ!"§¡Ø%Ø˜e�_ØØ#Øô"Ðð "4×!;Ñ!;¸IÀvÐPUÁ~Ó!V×!`Ñ!`ÐabÐdeÓ!fÐð "4×!6Ñ!6°|Ó!DÐàBTÐ*¨1Ð.>°¸±Ð.>Ð+>Ñ?ØBTÐUVÑBWÐ*¨1¨f°u©nÑ.>Ð+>Ò?ð+	Xð. .Ð-r,   Úpixel_valuesc                 óJ  — | j                   j                  j                  }| j                  |j                  |¬«      «      }| j                  j                  j                  | j                  | j                  d«      }| j                  |||j                  d   ¬«      }||z   }|S )aH  
        Args:
            pixel_values (`torch.FloatTensor`):
                Pixel values of shape (batch_size, max_num_patches, num_channels * patch_size * patch_size)
            spatial_shapes (`list[tuple[int, int]]`):
                Spatial shapes of shape (batch_size, 2) to resize the positional embeddings to
        )ra   r^   r   )r\   )	rR   Úweightra   rn   rW   rt   rU   r}   ri   )rC   r~   r[   Útarget_dtypeÚpatch_embedsrZ   Úresized_positional_embeddingsÚ
embeddingss           r-   ÚforwardzSiglip2VisionEmbeddings.forwardÀ   s§   € ð ×+Ñ+×2Ñ2×8Ñ8ˆØ×+Ñ+¨L¯O©OÀ,¨OÓ,OÓPˆð !%× 7Ñ 7× >Ñ >× FÑ FØ×(Ñ(¨$×*FÑ*FÈó!
Ðð )-×(IÑ(IØ! >¸l×>PÑ>PÐQRÑ>Sð )Jó )
Ð%ð
 "Ð$AÑAˆ
ØÐr,   )r#   r$   r%   r   rK   Ústaticmethodr'   ÚTensorÚ
LongTensorrT   r}   r(   r…   Ú__classcell__©rY   s   @r-   rE   rE   r   s†   ø„ ðQÐ2õ Qð ð;.Ø$Ÿ|™|ð;.à×(Ñ(ð;.ð ð;.ð 
�‰ò	;.ó ð;.ðz E×$5Ñ$5ð Àu×GWÑGWð Ð\a×\hÑ\h÷ r,   rE   c            	       ó¦   ‡ — e Zd Zdefˆ fd„Z	 	 	 d	dej                  dz  dej                  dz  dej                  dz  dej                  fd„Z	ˆ xZ
S )
ÚSiglip2TextEmbeddingsrF   c                 óN  •— t         ‰| �  «        |j                  }t        j                  |j
                  |«      | _        t        j                  |j                  |«      | _        | j                  dt        j                  |j                  «      j                  d«      d¬«       y )NÚposition_ids©r   r^   F)Ú
persistent)rJ   rK   rL   rO   rV   Ú
vocab_sizeÚtoken_embeddingÚmax_position_embeddingsrW   Úregister_bufferr'   ÚarangeÚexpand©rC   rF   rM   rY   s      €r-   rK   zSiglip2TextEmbeddings.__init__Û   sƒ   ø€ Ü‰ÑÔØ×&Ñ&ˆ	ä!Ÿ|™|¨F×,=Ñ,=¸yÓIˆÔÜ"$§,¡,¨v×/MÑ/MÈyÓ"YˆÔð 	×ÑØœEŸL™L¨×)GÑ)GÓH×OÑOÐPWÓXÐejð 	õ 	
r,   NÚ	input_idsrŽ   Úinputs_embedsr8   c                 ó8  — |�|j                   d   n|j                   d   }| j                  j                  j                   d   }||kD  rt        d|› d|› �«      ‚|€| j                  d d …d |…f   }|€| j                  |«      }| j                  |«      }||z   }|S )Nr^   éþÿÿÿr   zRSequence length must be less than max_position_embeddings (got `sequence length`: z and max_position_embeddings: )ri   rW   r€   Ú
ValueErrorrŽ   r’   )rC   r˜   rŽ   r™   Ú
seq_lengthÚmax_position_embeddingÚposition_embeddingsr„   s           r-   r…   zSiglip2TextEmbeddings.forwardç   sÇ   € ð -6Ð,A�Y—_‘_ RÒ(À}×GZÑGZÐ[]ÑG^ˆ
Ø!%×!8Ñ!8×!?Ñ!?×!EÑ!EÀaÑ!HÐàÐ.Ò.ÜØdØ�,Ð<Ð=SÐ<TðVóð ð
 ÐØ×,Ñ,ªQ°°°¨^Ñ<ˆLàÐ Ø ×0Ñ0°Ó;ˆMà"×5Ñ5°lÓCÐØ"Ð%8Ñ8ˆ
àÐr,   ©NNN)r#   r$   r%   r   rK   r'   rˆ   r(   r‡   r…   r‰   rŠ   s   @r-   rŒ   rŒ   Ú   sk   ø„ ð

Ð0õ 

ð .2Ø04Ø26ñ	à×#Ñ# dÑ*ðð ×&Ñ&¨Ñ-ðð ×(Ñ(¨4Ñ/ð	ð
 
�‰÷r,   rŒ   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingÚdropoutc                 óÀ  — t        j                  ||j                  dd«      «      |z  }|�||z   }t        j                  j                  |dt         j                  ¬«      j                  |j                  «      }t        j                  j                  ||| j                  ¬«      }t        j                  ||«      }	|	j                  dd«      j                  «       }	|	|fS )Nr^   r›   )Údimra   )ÚpÚtrainingr   rb   )r'   Úmatmulru   rO   Ú
functionalÚsoftmaxro   rn   ra   r§   r«   Ú
contiguous)
r¡   r¢   r£   r¤   r¥   r¦   r§   ÚkwargsÚattn_weightsÚattn_outputs
             r-   Úeager_attention_forwardr³     sº   € ô —<‘<  s§}¡}°R¸Ó'<Ó=ÀÑG€LØÐ!Ø# nÑ4ˆä—=‘=×(Ñ(¨¸2ÄUÇ]Á]Ð(ÓS×VÑVÐW\×WbÑWbÓc€LÜ—=‘=×(Ñ(¨¸È6Ï?É?Ð(Ó[€Lä—,‘,˜|¨UÓ3€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€Kà˜Ð$Ð$r,   c            
       ó    ‡ — e Zd ZdZˆ fd„Z	 ddej                  dej                  dz  deej                  ej                  dz  f   fd„Zˆ xZ	S )	ÚSiglip2Attentionz=Multi-headed attention from 'Attention Is All You Need' paperc                 ó  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        | j                  | j                  z  | _        | j                  | j                  z  | j                  k7  r&t        d| j                  › d| j                  › d�«      ‚| j                  dz  | _	        |j                  | _        d| _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        y )Nz;embed_dim must be divisible by num_heads (got `embed_dim`: z and `num_heads`: z).ç      à¿F)rJ   rK   rF   rL   rM   Únum_attention_headsÚ	num_headsÚhead_dimrœ   ÚscaleÚattention_dropoutr§   Ú	is_causalrO   rP   Úk_projÚv_projÚq_projÚout_projrX   s     €r-   rK   zSiglip2Attention.__init__  s  ø€ Ü‰ÑÔØˆŒØ×+Ñ+ˆŒØ×3Ñ3ˆŒØŸ™¨$¯.©.Ñ8ˆŒØ�=‰=˜4Ÿ>™>Ñ)¨T¯^©^Ò;ÜØMÈdÏnÉnÐM]ð ^Ø—N‘NÐ# 2ð'óð ð —]‘] DÑ(ˆŒ
Ø×/Ñ/ˆŒØˆŒä—i‘i §¡°·±Ó?ˆŒÜ—i‘i §¡°·±Ó?ˆŒÜ—i‘i §¡°·±Ó?ˆŒÜŸ	™	 $§.¡.°$·.±.ÓAˆ�r,   Nr!   r¥   r8   c           
      ó®  — |j                   dd }g |¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }t        j                  | j                  j                  t        «      }	 |	| ||||| j                  | j                  | j                  sdn| j                  ¬«      \  }
} |
j                   g |¢d‘­Ž j#                  «       }
| j%                  |
«      }
|
|fS )z#Input shape: Batch x Time x ChannelNr^   r   rb   ç        )r½   r¦   r§   )ri   rº   rÀ   Úviewru   r¾   r¿   r   Úget_interfacerF   Ú_attn_implementationr³   r½   r»   r«   r§   rt   r¯   rÁ   )rC   r!   r¥   r°   Úinput_shapeÚhidden_shapeÚqueriesÚkeysrA   Úattention_interfacer²   r±   s               r-   r…   zSiglip2Attention.forward0  s<  € ð $×)Ñ)¨#¨2Ð.ˆà8˜Ð8 bÐ8¨$¯-©-Ñ8ˆØ—+‘+˜mÓ,×1Ñ1°,Ó?×IÑIÈ!ÈQÓOˆØ�{‰{˜=Ó)×.Ñ.¨|Ó<×FÑFÀqÈ!ÓLˆØ—‘˜]Ó+×0Ñ0°Ó>×HÑHÈÈAÓNˆä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØØ—n‘nØ—J‘JØ#Ÿ}š}‘C°$·,±,ô	%
Ñ!ˆ�\ð *�k×)Ñ)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ—m‘m KÓ0ˆà˜LÐ(Ð(r,   r;   )
r#   r$   r%   r&   rK   r'   r‡   r*   r…   r‰   rŠ   s   @r-   rµ   rµ     sV   ø„ ÙGôBð. /3ñ!)à—|‘|ð!)ð Ÿ™ tÑ+ð!)ð
 
ˆu�|‰|˜UŸ\™\¨DÑ0Ð0Ñ	1÷!)r,   rµ   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )Ú
Siglip2MLPc                 ó  •— t         ‰| �  «        || _        t        |j                     | _        t        j                  |j                  |j                  «      | _
        t        j                  |j                  |j                  «      | _        y r;   )rJ   rK   rF   r   Ú
hidden_actÚactivation_fnrO   rP   rL   Úintermediate_sizeÚfc1Úfc2rX   s     €r-   rK   zSiglip2MLP.__init__U  sd   ø€ Ü‰ÑÔØˆŒÜ# F×$5Ñ$5Ñ6ˆÔÜ—9‘9˜V×/Ñ/°×1IÑ1IÓJˆŒÜ—9‘9˜V×5Ñ5°v×7IÑ7IÓJˆ�r,   r!   r8   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r;   )rÒ   rÐ   rÓ   )rC   r!   s     r-   r…   zSiglip2MLP.forward\  s4   € ØŸ™ Ó/ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐr,   )r#   r$   r%   rK   r'   r‡   r…   r‰   rŠ   s   @r-   rÍ   rÍ   T  s$   ø„ ôKð U§\¡\ð °e·l±l÷ r,   rÍ   c            	       óŽ   ‡ — e Zd Zdeez  fˆ fd„Zedej                  dej                  de	e
   dej                  fd„«       Zˆ xZS )ÚSiglip2EncoderLayerrF   c                 óD  •— t         ‰| �  «        |j                  | _        t	        j
                  | j                  |j                  ¬«      | _        t        |«      | _	        t	        j
                  | j                  |j                  ¬«      | _
        t        |«      | _        y ©N©Úeps)rJ   rK   rL   rM   rO   Ú	LayerNormÚlayer_norm_epsÚlayer_norm1rµ   Ú	self_attnÚlayer_norm2rÍ   ÚmlprX   s     €r-   rK   zSiglip2EncoderLayer.__init__d  sm   ø€ Ü‰ÑÔØ×+Ñ+ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÔÜ)¨&Ó1ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÔÜ˜fÓ%ˆ�r,   r!   r¥   r°   r8   c                 ó¸   — |}| j                  |«      } | j                  d||dœ|¤Ž\  }}||z   }|}| j                  |«      }| j                  |«      }||z   }|S )N)r!   r¥   r+   )rÝ   rÞ   rß   rà   )rC   r!   r¥   r°   ÚresidualÚ_s         r-   r…   zSiglip2EncoderLayer.forwardl  s‚   € ð !ˆà×(Ñ(¨Ó7ˆØ)˜4Ÿ>™>ð 
Ø'Ø)ñ
ð ñ
Ñˆ�qð
 ! =Ñ0ˆà ˆØ×(Ñ(¨Ó7ˆØŸ™ Ó/ˆØ  =Ñ0ˆàÐr,   )r#   r$   r%   r   r   rK   r   r'   r‡   r   r   r(   r…   r‰   rŠ   s   @r-   rÖ   rÖ   c  sd   ø„ ð&Ð2Ð5FÑFõ &ð ðà—|‘|ðð Ÿ™ðð Ð+Ñ,ð	ð
 
×	Ñ	òó ôr,   rÖ   c                   ó€   ‡ — e Zd ZU eed<   dZdZdZg d¢ZdZ	dZ
dZdZeedœZ ej"                  «       ˆ fd„«       Zˆ xZS )	ÚSiglip2PreTrainedModelrF   Úsiglip2)ÚimageÚtextT)rŒ   rE   rÖ   Ú$Siglip2MultiheadAttentionPoolingHeadF)r!   r"   c                 ó  •— t         ‰| �  |«       t        |t        «      røt        | j                  t
        «      r | j                  j                  j                  n| j                  j                  }t        j                  |j                  j                  dt        j                  |«      z  ¬«       t        |d«      rZt        j                  |j                   t#        j$                  |j                   j&                  d   «      j)                  d«      «       yyt        |t*        j,                  «      r t        j.                  |j                  «       yt        |t0        «      �rIt        j2                  |j4                  j                  «       t        j2                  |j6                  j                  «       t        j2                  |j8                  j                  «       t        j2                  |j:                  j                  «       t        j<                  |j4                  j>                  «       t        j<                  |j6                  j>                  «       t        j<                  |j8                  j>                  «       t        j<                  |j:                  j>                  «       yt        |t@        «      r©t        j2                  |jB                  j                  «       t        j2                  |jD                  j                  «       t        j                  |jB                  j>                  d¬«       t        j                  |jD                  j>                  d¬«       yt        |tF        «      rrt        j2                  |jH                  «       t        j2                  |jJ                  jL                  «       t        j<                  |jJ                  jN                  «       yt        |tP        «      r?t        j<                  |jR                  «       t        j<                  |jT                  «       yt        |tV        «      rdt        j                  |jX                  j                  | j                  j                  j                  dz  | j                  jZ                  z  ¬«       yt        |t*        j\                  t*        j^                  f«      rLt        j`                  |j                  «       |j>                  � t        j<                  |j>                  «       yyt        |tb        «      rZt        j                  |j                   t#        j$                  |j                   j&                  d   «      j)                  d«      «       yy)	zInitialize the weightsr   )ÚstdrŽ   r^   r�   g�íµ ÷Æ°>r·   N)2rJ   Ú_init_weightsr<   rE   rF   r   Úvision_configrL   ÚinitÚnormal_rW   r€   ÚnpÚsqrtÚhasattrÚcopy_rŽ   r'   r•   ri   r–   rO   rV   Údefault_flax_embed_init_rµ   Úxavier_uniform_rÀ   r¾   r¿   rÁ   Úzeros_ÚbiasrÍ   rÒ   rÓ   ré   ÚprobeÚ	attentionÚin_proj_weightÚin_proj_biasÚSiglip2ModelÚlogit_scaleÚ
logit_biasÚSiglip2ForImageClassificationÚ
classifierÚinitializer_factorrP   ÚConv2dÚlecun_normal_rŒ   )rC   r¡   r{   rY   s      €r-   rì   z$Siglip2PreTrainedModel._init_weights�  so  ø€ ô 	‰Ñ˜fÔ%Ü�fÔ5Ô6ô ˜dŸk™k¬=Ô9ð —‘×)Ñ)×5Ò5à—[‘[×,Ñ,ð ô
 �L‰L˜×2Ñ2×9Ñ9¸qÄ2Ç7Á7È5Ã>Ñ?QÕRÜ�v˜~Ô.Ü—
‘
˜6×.Ñ.´·±¸V×=PÑ=P×=VÑ=VÐWYÑ=ZÓ0[×0bÑ0bÐcjÓ0kÕlð /ä˜¤§¡Ô-Ü×)Ñ)¨&¯-©-Õ8Ü˜Ô 0Õ1Ü× Ñ  §¡×!5Ñ!5Ô6Ü× Ñ  §¡×!5Ñ!5Ô6Ü× Ñ  §¡×!5Ñ!5Ô6Ü× Ñ  §¡×!7Ñ!7Ô8Ü�K‰K˜Ÿ™×*Ñ*Ô+Ü�K‰K˜Ÿ™×*Ñ*Ô+Ü�K‰K˜Ÿ™×*Ñ*Ô+Ü�K‰K˜Ÿ™×,Ñ,Õ-Ü˜¤
Ô+Ü× Ñ  §¡×!2Ñ!2Ô3Ü× Ñ  §¡×!2Ñ!2Ô3Ü�L‰L˜Ÿ™Ÿ™¨dÕ3Ü�L‰L˜Ÿ™Ÿ™¨dÖ3Ü˜Ô DÔEÜ× Ñ  §¡Ô.Ü× Ñ  ×!1Ñ!1×!@Ñ!@ÔAÜ�K‰K˜×(Ñ(×5Ñ5Õ6Ü˜¤Ô-Ü�K‰K˜×*Ñ*Ô+Ü�K‰K˜×)Ñ)Õ*Ü˜Ô =Ô>Ü�L‰LØ×!Ñ!×(Ñ(Ø—K‘K×-Ñ-×9Ñ9¸4Ñ?À$Ç+Á+×B`ÑB`Ñ`öô ˜¤§¡¬B¯I©IÐ 6Ô7Ü×Ñ˜vŸ}™}Ô-Ø�{‰{Ð&Ü—‘˜FŸK™KÕ(ð 'ä˜Ô 5Ô6Ü�J‰J�v×*Ñ*¬E¯L©L¸×9LÑ9L×9RÑ9RÐSUÑ9VÓ,W×,^Ñ,^Ð_fÓ,gÕhð 7r,   )r#   r$   r%   r   r)   Úbase_model_prefixÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_supports_flash_attnÚ_supports_sdpaÚ_supports_flex_attnÚ_supports_attention_backendrÖ   rµ   Ú_can_record_outputsr'   Úno_gradrì   r‰   rŠ   s   @r-   rå   rå   …  sj   ø… àÓØ!ÐØ(ÐØ&*Ð#òÐð !ÐØ€NàÐØ"&Ðð -Ø&ñÐð
 €U‡]�]ƒ_ó-ió ô-ir,   rå   c                   ój   ‡ — e Zd ZdZdefˆ fd„Ze	 d	dej                  dz  de	e
   defd„«       Zˆ xZS )
ÚSiglip2Encoderz³
    Transformer encoder consisting of `config.num_hidden_layers` self attention layers. Each layer is a
    [`Siglip2EncoderLayer`].

    Args:
        config: Siglip2Config
    rF   c                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w )NF)
rJ   rK   rF   rO   Ú
ModuleListrp   Únum_hidden_layersrÖ   ÚlayersÚgradient_checkpointing)rC   rF   rã   rY   s      €r-   rK   zSiglip2Encoder.__init__×  sP   ø€ Ü‰ÑÔØˆŒÜ—m‘mÌ%ÐPV×PhÑPhÓJiÖ$jÀQÔ%8¸Õ%@Ò$jÓkˆŒØ&+ˆÕ#ùò %ks   ½A#Nr¥   r°   r8   c                 óT   — |}| j                   D ]  } |||fi |¤Ž}Œ t        |¬«      S )N)r    )r  r   )rC   r™   r¥   r°   r!   Úencoder_layers         r-   r…   zSiglip2Encoder.forwardÞ  sC   € ð &ˆØ!Ÿ[™[ò 	ˆMÙ)ØØñð ñ‰Mð	ô °Ô?Ð?r,   r;   )r#   r$   r%   r&   r   rK   r   r'   r‡   r   r   r   r…   r‰   rŠ   s   @r-   r  r  Î  s_   ø„ ñð,˜}õ ,ð ð /3ñ@ð Ÿ™ tÑ+ð@ð Ð+Ñ,ð	@ð
 
ò@ó ô@r,   r  zN
    The vision model from Siglip2 without any head or projection on top.
    c                   óÊ   ‡ — e Zd ZU eed<   dZdZdZdZdefˆ fd„Z	e
 ed¬«      edej                  d	ej                  d
ej                   dee   def
d„«       «       «       Zˆ xZS )ÚSiglip2VisionModelrF   r~   ©rç   Úvision_modelrR   c                 ól  •— t         ‰| �  |«       || _        |j                  }t	        |«      | _        t        |«      | _        t        j                  ||j                  ¬«      | _        t        |d«      sdn|j                  | _        | j                  rt        |«      | _        | j#                  «        y )NrÙ   Úvision_use_headT)rJ   rK   rF   rL   rE   r„   r  ÚencoderrO   rÛ   rÜ   Úpost_layernormrò   r  Úuse_headré   ÚheadÚ	post_initr—   s      €r-   rK   zSiglip2VisionModel.__init__ü  s‰   ø€ Ü‰Ñ˜Ô ØˆŒØ×&Ñ&ˆ	ä1°&Ó9ˆŒÜ% fÓ-ˆŒÜ Ÿl™l¨9¸&×:OÑ:OÔPˆÔÜ$+¨FÐ4EÔ$F™ÈF×LbÑLbˆŒØ�=Š=Ü<¸VÓDˆDŒIØ�‰Õr,   F©Útie_last_hidden_statesÚpixel_attention_maskr[   r°   r8   c                 ó  — | j                  ||«      }t        | j                  ||¬«      } | j                  d||dœ|¤Ž}|j                  }| j                  |«      }| j                  r| j                  ||«      nd}	t        ||	¬«      S )a“  
        pixel_attention_mask (`torch.Tensor` of shape `(batch_size, image_size, image_size)`, *optional*):
            Mask to avoid performing attention on padding pixel indices.
        spatial_shapes (`torch.LongTensor` of shape `(batch_size, 2)`):
            Tensor containing the spatial dimensions (height, width) of the input images.

        Examples:

        ```python
        >>> import httpx
        >>> from io import BytesIO
        >>> from PIL import Image
        >>> from transformers import AutoProcessor, Siglip2VisionModel

        >>> model = Siglip2VisionModel.from_pretrained("google/siglip2-base-patch16-224")
        >>> processor = AutoProcessor.from_pretrained("google/siglip2-base-patch16-224")

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

        >>> inputs = processor(images=image, return_tensors="pt")

        >>> outputs = model(**inputs)
        >>> last_hidden_state = outputs.last_hidden_state
        >>> pooled_output = outputs.pooler_output  # pooled features
        ```
        ©rF   r™   r¥   ©r™   r¥   N©r    Úpooler_outputr+   )	r„   r	   rF   r  r    r  r  r   r   )
rC   r~   r$  r[   r°   r!   Úencoder_attention_maskÚencoder_outputsr    r)  s
             r-   r…   zSiglip2VisionModel.forward	  s¢   € ðL Ÿ™¨°nÓEˆä!:Ø—;‘;Ø'Ø/ô"
Ðð ,8¨4¯<©<ð ,
Ø'Ø1ñ,
ð ñ,
ˆð ,×=Ñ=ÐØ ×/Ñ/Ð0AÓBÐàNRÏmÊm˜Ÿ	™	Ð"3Ð5IÔJÐaeˆä)Ø/Ø'ô
ð 	
r,   )r#   r$   r%   r   r)   Úmain_input_namer  r  Ú_input_embed_layerrK   r   r   r   r'   r(   r‡   rˆ   r   r   r   r…   r‰   rŠ   s   @r-   r  r  ð  sž   ø… ð  ÓØ$€OØ!ÐØ&ÐØ*ÐðÐ2õ ð  Ù¨EÔ2Øð9
à×'Ñ'ð9
ð $Ÿl™lð9
ð ×(Ñ(ð	9
ð
 Ð+Ñ,ð9
ð 
$ò9
ó ó 3ó  ô9
r,   r  zL
    The text model from Siglip2 without any head or projection on top.
    c                   óà   ‡ — e Zd ZU eed<   dZdZdZdefˆ fd„Ze	 e
d¬«      e	 	 	 dd	ej                  dz  d
ej                  dz  dej                  dz  dee   def
d„«       «       «       Zˆ xZS )ÚSiglip2TextModelrF   )rè   Ú
text_modelr’   c                 ó@  •— t         ‰| �  |«       || _        |j                  }t	        |«      | _        t        |«      | _        t        j                  ||j                  ¬«      | _        t        j                  ||j                  «      | _        | j                  «        y rØ   )rJ   rK   rF   rL   rŒ   r„   r  r  rO   rÛ   rÜ   Úfinal_layer_normrP   Úprojection_sizer   r!  r—   s      €r-   rK   zSiglip2TextModel.__init__S  su   ø€ Ü‰Ñ˜Ô ØˆŒØ×&Ñ&ˆ	Ü/°Ó7ˆŒÜ% fÓ-ˆŒÜ "§¡¨Y¸F×<QÑ<QÔ RˆÔä—I‘I˜i¨×)?Ñ)?Ó@ˆŒ	Ø�‰Õr,   Fr"  Nr˜   r¥   rŽ   r°   r8   c                 ót  — |€t        d«      ‚|j                  «       }|j                  d|d   «      }| j                  ||¬«      }t	        | j
                  ||¬«      } | j                  d||dœ|¤Ž}|j                  }| j                  |«      }|dd…ddd…f   }	| j                  |	«      }	t        ||	¬«      S )	a°  
        Examples:

        ```python
        >>> from transformers import AutoTokenizer, Siglip2TextModel

        >>> model = Siglip2TextModel.from_pretrained("google/siglip2-base-patch16-224")
        >>> tokenizer = AutoTokenizer.from_pretrained("google/siglip2-base-patch16-224")

        >>> # important: make sure to set padding="max_length" as that's how the model was trained
        >>> inputs = tokenizer(["a photo of a cat", "a photo of a dog"], padding="max_length", return_tensors="pt")

        >>> outputs = model(**inputs)
        >>> last_hidden_state = outputs.last_hidden_state
        >>> pooled_output = outputs.pooler_output  # pooled (EOS token) states
        ```NzYou have to specify input_idsr^   )r˜   rŽ   r&  r'  r(  r+   )rœ   re   rÄ   r„   r	   rF   r  r    r2  r   r   )
rC   r˜   r¥   rŽ   r°   rÇ   r!   r+  r    Úpooled_outputs
             r-   r…   zSiglip2TextModel.forward^  sÛ   € ð4 ÐÜÐ<Ó=Ð=à—n‘nÓ&ˆØ—N‘N 2 {°2¡Ó7ˆ	àŸ™°)È,˜ÓWˆô 3Ø—;‘;Ø'Ø)ô
ˆð ,8¨4¯<©<ð ,
Ø'Ø)ñ,
ð ñ,
ˆð ,×=Ñ=ÐØ ×1Ñ1Ð2CÓDÐð *ª!¨R²¨(Ñ3ˆØŸ	™	 -Ó0ˆä)Ø/Ø'ô
ð 	
r,   r    )r#   r$   r%   r   r)   r  r  r-  rK   r   r   r   r'   r‡   r   r   r   r…   r‰   rŠ   s   @r-   r/  r/  H  s¯   ø… ð ÓØ ÐØ$ÐØ*Ðð	Ð0õ 	ð  Ù¨EÔ2Øð *.Ø.2Ø,0ñ	6
à—<‘< $Ñ&ð6
ð Ÿ™ tÑ+ð6
ð —l‘l TÑ)ð	6
ð
 Ð+Ñ,ð6
ð 
$ò6
ó ó 3ó  ô6
r,   r/  c                   ó€   ‡ — e Zd ZdZdefˆ fd„Zd	dej                  dej                  dz  dej                  fd„Zˆ xZ	S )
ré   zMultihead Attention Pooling.rF   c                 óº  •— t         ‰| �  «        t        j                  t	        j
                  dd|j                  «      «      | _        t        j                  j                  |j                  |j                  d¬«      | _
        t        j                  |j                  |j                  ¬«      | _        t        |«      | _        || _        |j                  | _        y )Nr   T)Úbatch_firstrÙ   )rJ   rK   rO   Ú	Parameterr'   ÚrandnrL   rø   ÚMultiheadAttentionr¸   rù   rÛ   rÜ   Ú	layernormrÍ   rà   rF   r¹   rX   s     €r-   rK   z-Siglip2MultiheadAttentionPoolingHead.__init__�  s™   ø€ Ü‰ÑÔä—\‘\¤%§+¡+¨a°°F×4FÑ4FÓ"GÓHˆŒ
ÜŸ™×4Ñ4°V×5GÑ5GÈ×IcÑIcÐquÐ4ÓvˆŒÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÜ˜fÓ%ˆŒàˆŒØ×3Ñ3ˆ�r,   NÚhidden_stater¥   r8   c                 óÌ  — |j                   d   }| j                  j                  |dd«      }|�ï|j                   d   |j                   d   }}t        | j                  |||¬«      }|�¶|j                  d| j
                  |d«      }|j                  d||«      }|j                  t        j                  k(  rht        j                  |t        j                  d|j                  |j                  ¬«      t        j                  |j                  «      j                  «      }| j                  ||||¬«      d   }|}| j!                  |«      }|| j#                  |«      z   }|d d …df   S )Nr   r   )rF   r™   r¥   Úencoder_hidden_statesr^   rÃ   r_   )Ú	attn_mask)ri   rø   Úrepeatr	   rF   r¹   rt   ra   r'   ÚboolÚwhereÚtensorr`   ÚfinfoÚminrù   r<  rà   )rC   r=  r¥   rv   rø   Ú
target_lenÚ
source_lenrâ   s           r-   r…   z,Siglip2MultiheadAttentionPoolingHead.forward¨  sF  € Ø!×'Ñ'¨Ñ*ˆ
Ø—
‘
×!Ñ! *¨a°Ó3ˆàÐ%Ø%*§[¡[°¡^°\×5GÑ5GÈÑ5J˜
ˆJÜ6Ø—{‘{Ø#Ø-Ø&2ô	ˆNð Ð)Ø!/×!6Ñ!6°q¸$¿.¹.È*ÐVWÓ!X�Ø!/×!7Ñ!7¸¸JÈ
Ó!S�ð "×'Ñ'¬5¯:©:Ò5Ü%*§[¡[Ø&ÜŸ™ S°×1FÑ1FÈeÏkÉkÔZÜŸ™ E§K¡KÓ0×4Ñ4ó&�Nð —~‘~ e¨\¸<ÐSa�~ÓbÐcdÑeˆàˆØ—~‘~ lÓ3ˆØ $§(¡(¨<Ó"8Ñ8ˆàšA˜q˜DÑ!Ð!r,   r;   )
r#   r$   r%   r&   r   rK   r'   r‡   r…   r‰   rŠ   s   @r-   ré   ré   š  sB   ø„ Ù&ð	4Ð2õ 	4ñ" E§L¡Lð "À%Ç,Á,ÐQUÑBUð "Ðaf×amÑam÷ "r,   ré   c                   ó„  ‡ — e Zd ZU eed<   defˆ fd„Zdej                  fd„Zdej                  fd„Z	e
e	 	 ddej                  d	ej                  dz  d
ej                  dz  dee   deez  f
d„«       «       Ze
e	 	 	 ddej&                  dz  dej                  dz  dej(                  dz  dee   deez  f
d„«       «       Ze
e	 	 	 	 	 	 	 ddej(                  dz  dej&                  dz  dej                  dz  dej(                  dz  d	ej                  dz  d
ej(                  dz  dedz  dee   defd„«       «       Zˆ xZS )rü   rF   c                 ó�  •— t         ‰| �  |«       |j                  }|j                  }t        j                  |«      | _        t        j                  |«      | _        t        j                  t        j                  d«      «      | _        t        j                  t        j                  d«      «      | _        | j                  «        y )Nr   )rJ   rK   Útext_configrí   r/  Ú_from_configr0  r  r  rO   r9  r'   r:  rý   rþ   r!  )rC   rF   rK  rí   rY   s       €r-   rK   zSiglip2Model.__init__Í  sŠ   ø€ Ü‰Ñ˜Ô à×(Ñ(ˆØ×,Ñ,ˆô +×7Ñ7¸ÓDˆŒÜ.×;Ñ;¸MÓJˆÔäŸ<™<¬¯©°A«Ó7ˆÔÜŸ,™,¤u§{¡{°1£~Ó6ˆŒð 	�‰Õr,   r8   c                 óB   — | j                   j                  j                  S r;   ©r0  r„   r’   rB   s    r-   Úget_input_embeddingsz!Siglip2Model.get_input_embeddingsÝ  s   € Ø�‰×)Ñ)×9Ñ9Ð9r,   r¤   c                 ó:   — || j                   j                  _        y r;   rN  ©rC   r¤   s     r-   Úset_input_embeddingsz!Siglip2Model.set_input_embeddingsà  s   € Ø5:ˆ�‰×"Ñ"Õ2r,   Nr˜   r¥   rŽ   r°   c                 ó.   —  | j                   d|||dœ|¤ŽS )ao  
        Examples:

        ```python
        >>> from transformers import AutoTokenizer, AutoModel
        >>> import torch

        >>> model = AutoModel.from_pretrained("google/siglip2-base-patch16-224")
        >>> tokenizer = AutoTokenizer.from_pretrained("google/siglip2-base-patch16-224")

        >>> # important: make sure to set padding="max_length" as that's how the model was trained
        >>> inputs = tokenizer(["a photo of a cat", "a photo of a dog"], padding="max_length", return_tensors="pt")
        >>> with torch.no_grad():
        ...     text_features = model.get_text_features(**inputs)
        ```©r˜   r¥   rŽ   r+   )r0  )rC   r˜   r¥   rŽ   r°   s        r-   Úget_text_featureszSiglip2Model.get_text_featuresã  s/   € ð0 ˆt�‰ð 
ØØ)Ø%ñ
ð ñ	
ð 	
r,   r~   r$  r[   c                 ó.   —  | j                   d|||dœ|¤ŽS )aé  
        pixel_attention_mask (`torch.Tensor` of shape `(batch_size, image_size, image_size)`, *optional*):
            Mask to avoid performing attention on padding pixel indices.
        spatial_shapes (`torch.LongTensor` of shape `(batch_size, 2)`):
            Tensor containing the spatial dimensions (height, width) of the input images.

        Examples:

        ```python
        >>> import torch
        >>> from transformers import AutoProcessor, AutoModel
        >>> from transformers.image_utils import load_image

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = load_image(url)

        >>> model = AutoModel.from_pretrained("google/siglip2-base-patch16-224")
        >>> processor = AutoProcessor.from_pretrained("google/siglip2-base-patch16-224")

        >>> inputs = processor(images=image, return_tensors="pt")

        >>> with torch.no_grad():
        ...     image_features = model.get_image_features(**inputs)
        ```
        ©r~   r$  r[   r+   )r  )rC   r~   r$  r[   r°   s        r-   Úget_image_featureszSiglip2Model.get_image_features  s2   € ðD !ˆt× Ñ ð 
Ø%Ø!5Ø)ñ
ð ñ	
ð 	
r,   Úreturn_lossc           	      ó¬  —  | j                   d|||dœ|¤Ž}	 | j                  d|||dœ|¤Ž}
|	j                  }|
j                  }||j                  ddd¬«      z  }||j                  ddd¬«      z  }t	        j
                  ||j                  «       j                  |j                  «      «      }| j                  j                  |j                  «      | j                  j                  |j                  «      }}||j                  «       z  |z   }|j                  «       }d}|r t	        j                  |j                  d«      |j                  ¬	«      }t	        j                  |«       d|z  z   }t        j                  j                   j#                  ||z  «      }t	        j$                  |d¬
«       }|j'                  «       }t)        ||||||
|	¬«      S )ae  
        pixel_attention_mask (`torch.Tensor` of shape `(batch_size, image_size, image_size)`, *optional*):
            Mask to avoid performing attention on padding pixel indices.
        spatial_shapes (`torch.LongTensor` of shape `(batch_size, 2)`):
            Tensor containing the spatial dimensions (height, width) of the input images.
        return_loss (`bool`, *optional*):
            Whether or not to return the contrastive loss.

        Examples:

        ```python
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO
        >>> from transformers import AutoProcessor, AutoModel
        >>> import torch

        >>> model = AutoModel.from_pretrained("google/siglip2-base-patch16-224")
        >>> processor = AutoProcessor.from_pretrained("google/siglip2-base-patch16-224")

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

        >>> texts = ["a photo of 2 cats", "a photo of 2 dogs"]
        >>> # important: we pass `padding=max_length` since the model was trained with this
        >>> inputs = processor(text=texts, images=image, padding="max_length", return_tensors="pt")

        >>> with torch.no_grad():
        ...     outputs = model(**inputs)

        >>> logits_per_image = outputs.logits_per_image
        >>> probs = torch.sigmoid(logits_per_image) # these are the probabilities
        >>> print(f"{probs[0][0]:.1%} that image 0 is '{texts[0]}'")
        31.9% that image 0 is 'a photo of 2 cats'
        ```
        rW  rT  rb   r^   T)rª   r©   ÚkeepdimNr   )r`   ©r©   )r3   r4   r5   r0   r   r6   r7   r+   )r  r0  r)  Únormr'   r¬   Útrn   r`   rý   rþ   ÚexpÚeyere   Ú	ones_likerO   r­   Ú
logsigmoidÚsumÚmeanr2   )rC   r˜   r~   r$  r[   r¥   rŽ   rY  r°   Úvision_outputsÚtext_outputsr   r0   r5   rý   rþ   r4   r3   r`  Úm1_diag1ÚloglikÚnlls                         r-   r…   zSiglip2Model.forward,  sÔ  € ðd 6G°T×5FÑ5Fð 6
Ø%Ø!5Ø)ñ6
ð ñ	6
ˆð 4C°4·?±?ð 4
ØØ)Ø%ñ4
ð ñ	4
ˆð &×3Ñ3ˆØ"×0Ñ0ˆð $ l×&7Ñ&7¸!ÀÈTÐ&7Ó&RÑRˆØ! K×$4Ñ$4°q¸bÈ$Ð$4Ó$OÑOˆô  Ÿ,™, {°L·N±NÓ4D×4GÑ4GÈ×HZÑHZÓ4[Ó\ˆà"&×"2Ñ"2×"5Ñ"5°k×6HÑ6HÓ"IÈ4Ï?É?×K]ÑK]Ð^i×^pÑ^pÓKq�ZˆØ)¨K¯O©OÓ,=Ñ=À
ÑJˆà*×,Ñ,Ó.ÐàˆÙä—)‘)˜O×0Ñ0°Ó3¸O×<RÑ<RÔSˆCÜŸ™¨Ó8Ð8¸1¸s¹7ÑBˆHÜ—X‘X×(Ñ(×3Ñ3°H¸Ñ4NÓOˆFÜ—9‘9˜V¨Ô,Ð,ˆCØ—8‘8“:ˆDäØØ-Ø+Ø#Ø%Ø*Ø .ô
ð 	
r,   )NNr    )NNNNNNN)r#   r$   r%   r   r)   rK   rO   ÚModulerO  rR  r   r   r'   r‡   r   r   r*   r   rU  r(   rˆ   rX  rB  r2   r…   r‰   rŠ   s   @r-   rü   rü   É  s  ø… àÓð˜}õ ð : b§i¡ió :ð;¨"¯)©)ó ;ð Øð /3Ø,0ñ	
à—<‘<ð
ð Ÿ™ tÑ+ð
ð —l‘l TÑ)ð	
ð
 Ð+Ñ,ð
ð 
Ð+Ñ	+ò
ó ó ð
ð: Øð 26Ø48Ø26ñ	%
à×'Ñ'¨$Ñ.ð%
ð $Ÿl™l¨TÑ1ð%
ð ×(Ñ(¨4Ñ/ð	%
ð
 Ð+Ñ,ð%
ð 
Ð+Ñ	+ò%
ó ó ð%
ðP Øð .2Ø15Ø48Ø26Ø.2Ø04Ø#'ñ^
à×#Ñ# dÑ*ð^
ð ×'Ñ'¨$Ñ.ð^
ð $Ÿl™l¨TÑ1ð	^
ð
 ×(Ñ(¨4Ñ/ð^
ð Ÿ™ tÑ+ð^
ð ×&Ñ&¨Ñ-ð^
ð ˜D‘[ð^
ð Ð+Ñ,ð^
ð 
ò^
ó ó ô^
r,   rü   z®
    Siglip2 vision encoder with an image classification head on top (a linear layer on top of the pooled final hidden states of
    the patch tokens) e.g. for ImageNet.
    c                   ó  ‡ — e Zd ZdZdZdeddfˆ fd„Zdej                  fd„Z	dej                  fd	„Z
ee	 	 	 	 ddej                  dz  d
ej                  dz  dej                  dz  dej                  dz  dee   defd„«       «       Zˆ xZS )rÿ   r~   r  rF   r8   Nc                 óf  •— t         ‰| �  |«       |j                  | _        t        j	                  |j
                  «      | _        |j                  dkD  r4t        j                  |j
                  j                  |j                  «      nt        j                  «       | _        | j                  «        y )Nr   )rJ   rK   Ú
num_labelsr  rL  rí   r  rO   rP   rL   ÚIdentityr   r!  rX   s     €r-   rK   z&Siglip2ForImageClassification.__init__™  s‡   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ.×;Ñ;¸F×<PÑ<PÓQˆÔð OU×N_ÑN_ÐbcÒNcŒB�I‰I�f×*Ñ*×6Ñ6¸×8IÑ8IÔJÔik×itÑitÓivð 	Œð
 	�‰Õr,   c                 óB   — | j                   j                  j                  S r;   ©r  r„   rR   rB   s    r-   rO  z2Siglip2ForImageClassification.get_input_embeddings§  s   € Ø× Ñ ×+Ñ+×;Ñ;Ð;r,   r¤   c                 ó:   — || j                   j                  _        y r;   rp  rQ  s     r-   rR  z2Siglip2ForImageClassification.set_input_embeddingsª  s   € Ø7<ˆ×Ñ×$Ñ$Õ4r,   r$  r[   Úlabelsr°   c                 óÄ  —  | j                   |f||dœ|¤Ž}|j                  }|�Q|d   j                  |j                  «      }t	        j
                  ||z  d¬«      t	        j
                  |d¬«      z  }nt	        j                  |d¬«      }| j                  |«      }	d}
|�| j                  ||	| j                  «      }
t        |
|	|j                  |j                  ¬«      S )aÙ  
        pixel_attention_mask (`torch.Tensor` of shape `(batch_size, image_size, image_size)`, *optional*):
            Mask to avoid performing attention on padding pixel indices.
        spatial_shapes (`torch.LongTensor` of shape `(batch_size, 2)`):
            Tensor containing the spatial dimensions (height, width) of the input images.
        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).

        Examples:

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

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

        >>> # note: we are loading a `Siglip2Model` from the hub here,
        >>> # so the head will be randomly initialized, hence the predictions will be random if seed is not set above.
        >>> image_processor = AutoImageProcessor.from_pretrained("google/siglip2-base-patch16-224")
        >>> model = Siglip2ForImageClassification.from_pretrained("google/siglip2-base-patch16-224")

        >>> inputs = image_processor(images=image, return_tensors="pt")
        >>> outputs = model(**inputs)
        >>> logits = outputs.logits
        >>> # model predicts one of the two classes
        >>> predicted_class_idx = logits.argmax(-1).item()
        >>> print("Predicted class:", model.config.id2label[predicted_class_idx])
        Predicted class: LABEL_1
        ```
        )r$  r[   N).Nr   r\  )r3   Úlogitsr!   r"   )r  r    rn   r`   r'   rc  rd  r   Úloss_functionrF   r   r!   r"   )rC   r~   r$  r[   rr  r°   ÚoutputsÚsequence_outputÚ	pool_maskrt  r3   s              r-   r…   z%Siglip2ForImageClassification.forward­  sï   € ð` /@¨d×.?Ñ.?Øð/
à!5Ø)ñ/
ð ñ	/
ˆð "×3Ñ3ˆð  Ð+Ø,¨YÑ7×:Ñ:¸?×;QÑ;QÓRˆIÜ#Ÿi™i¨¸)Ñ(CÈÔKÌeÏiÉiÐXaÐghÔNiÑi‰Oä#Ÿj™j¨¸aÔ@ˆOð —‘ Ó1ˆàˆØÐØ×%Ñ% f¨f°d·k±kÓBˆDä$ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r,   )NNNN)r#   r$   r%   r,  r  r   rK   rO   rj  rO  rR  r   r   r'   r‡   rˆ   r   r   r   r…   r‰   rŠ   s   @r-   rÿ   rÿ   �  sÛ   ø„ ð %€OØ!Ðð˜}ð °õ ð< b§i¡ió <ð=¨"¯)©)ó =ð Øð -1Ø48Ø26Ø&*ñJ
à—l‘l TÑ)ðJ
ð $Ÿl™l¨TÑ1ðJ
ð ×(Ñ(¨4Ñ/ð	J
ð
 —‘˜tÑ#ðJ
ð Ð+Ñ,ðJ
ð 
òJ
ó ó ôJ
r,   rÿ   )rü   rå   r/  r  rÿ   )rÃ   )BÚcollections.abcr   Údataclassesr   Útypingr   Únumpyrð   r'   Útorch.nnrO   Útorch.nn.functionalr­   rr   Ú r   rî   Úactivationsr   Úmasking_utilsr	   Úmodeling_layersr
   Úmodeling_outputsr   r   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.genericr   r   Úutils.output_capturingr   Úconfiguration_siglip2r   r   r   r   r/   r2   rj  rE   rŒ   r‡   Úfloatr³   rµ   rÍ   rÖ   rå   r  r  r/  ré   rü   rÿ   Ú__all__r+   r,   r-   ú<module>rŒ     sq  ðõ, %Ý !Ý ã Û Ý ß Ð å &Ý !Ý 6Ý 9ß bÑ bß FÝ &ß \Ó \ß IÝ 5ß XÑ Xñ ðôð
 ô	<˜+ó 	<ó óð	<ñ ðôð
 ô	<˜ó 	<ó óð	<ð Ø
ô_�Kó _ó ó ð_ô@e˜bŸi™iô eôP%˜BŸI™Iô %ð^ ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð ð%ð ó%ô.8)�r—y‘yô 8)ôv�—‘ô ôÐ4ô ðD ôEi˜_ó Eió ðEiôP@�R—Y‘Yô @ñD ðôô
P
Ð/ó P
óð
P
ñf ðôô
J
Ð-ó J
óð
J
ôZ,"¨2¯9©9ô ,"ð^ ôB
Ð)ó B
ó ðB
ñJ ðôôd
Ð$:ó d
óðd
òN�r,   