Ë
    ÜÓ^j„Œ  ã                   ó   — d Z 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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!m"Z" ddl#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«      «       «       Z- G d„ de
j\                  «      Z/ G d„ d e
j\                  «      Z0	 dAd!e
j\                  d"e	jb                  d#e	jb                  d$e	jb                  d%e	jb                  dz  d&e2d'e2fd(„Z3 G d)„ d*e
j\                  «      Z4 G d+„ d,e
j\                  «      Z5 G d-„ d.e«      Z6e  G d/„ d0e«      «       Z7 G d1„ d2e
j\                  «      Z8 e d3¬«       G d4„ d5e7«      «       Z9 e d6¬«       G d7„ d8e7«      «       Z: G d9„ d:e
j\                  «      Z;e  G d;„ d<e7«      «       Z< e d=¬«       G d>„ d?e7«      «       Z=g d@¢Z>y)BzPyTorch Siglip model.é    )ÚCallable)Ú	dataclass)ÚAnyN)Únné   )Úinitialization)ÚACT2FN)Úcreate_bidirectional_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputÚBaseModelOutputWithPoolingÚImageClassifierOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚ	torch_int)Úmerge_with_config_defaults)Úcapture_outputsé   )ÚSiglipConfigÚSiglipTextConfigÚSiglipVisionConfigz}
    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)ÚSiglipVisionModelOutputzø
    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#   © ó    úu/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/siglip/modeling_siglip.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)ÚSiglipTextModelOutputzö
    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'   r1   r(   r)   r*   r!   r"   r+   r#   r,   r-   r.   r0   r0   >   sr   … ñð
 -1€K�×"Ñ" TÑ)Ó0Ø26Ð�u×(Ñ(¨4Ñ/Ó6Ø:>€M�5˜×*Ñ*¨CÐ/Ñ0°4Ñ7Ó>Ø7;€J��e×'Ñ'¨Ð,Ñ-°Ñ4Ô;r-   r0   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)ÚSiglipOutputa±  
    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 [`SiglipTextModel`].
    image_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim`):
        The image embeddings obtained by applying the projection layer to the pooled output of [`SiglipVisionModel`].
    text_model_output (`BaseModelOutputWithPooling`):
        The output of the [`SiglipTextModel`].
    vision_model_output (`BaseModelOutputWithPooling`):
        The output of the [`SiglipVisionModel`].
    NÚlossÚlogits_per_imageÚlogits_per_textr1   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(SiglipOutput.to_tuple.<locals>.<genexpr>q   s$   è ø€ Ò^È1¤Z°´;Ô%?�Q—Z‘Z”\ÀQÓFÑ^ùs   ‚,.)r+   Úvalues©Úselfs    r.   r>   zSiglipOutput.to_tuplep   s   € ÜÑ^ÐPT×P[ÑP[ÓP]Ô^Ó^Ð^r-   )r$   r%   r&   r'   r4   r(   r)   r*   r5   r6   r1   r    r7   r   r8   r+   r   r>   r,   r-   r.   r3   r3   Q   s�   … ñð& &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø15Ð�e×'Ñ'¨$Ñ.Ó5Ø04€O�U×&Ñ&¨Ñ-Ó4Ø,0€K�×"Ñ" TÑ)Ó0Ø-1€L�%×#Ñ# dÑ*Ó1Ø48ÐÐ1Ó8Ø6:ÐÐ3Ó:ð_˜% ™*ô _r-   r3   c                   óž   ‡ — e Zd Zdefˆ fd„Zdej                  dededej                  fd„Zd
dej                  dej                  fd	„Z
ˆ xZS )ÚSiglipVisionEmbeddingsÚconfigc                 óf  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        |j                  | _        t        j                  |j                  | j                  | j                  | j                  d¬«      | _
        | j
                  | j                  z  dz  | _        | j                  | _        t        j                  | j                  | j                  «      | _        | j                  dt!        j"                  | j                  «      j%                  d«      d¬«       y )NÚvalid)Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚpaddingé   Úposition_ids©r   éÿÿÿÿF©Ú
persistent)ÚsuperÚ__init__rG   Úhidden_sizeÚ	embed_dimÚ
image_sizeÚ
patch_sizer   ÚConv2dÚnum_channelsÚpatch_embeddingÚnum_patchesÚnum_positionsÚ	EmbeddingÚposition_embeddingÚregister_bufferr(   ÚarangeÚexpand©rD   rG   Ú	__class__s     €r.   rV   zSiglipVisionEmbeddings.__init__u   sæ   ø€ Ü‰ÑÔØˆŒØ×+Ñ+ˆŒØ ×+Ñ+ˆŒØ ×+Ñ+ˆŒä!Ÿy™yØ×+Ñ+ØŸ™ØŸ™Ø—?‘?Øô 
ˆÔð !ŸO™O¨t¯©Ñ>À1ÑDˆÔØ!×-Ñ-ˆÔÜ"$§,¡,¨t×/AÑ/AÀ4Ç>Á>Ó"RˆÔØ×Ñ˜^¬U¯\©\¸$×:LÑ:LÓ-M×-TÑ-TÐU\Ó-]ÐjoÐÕpr-   Ú
embeddingsÚheightÚwidthr9   c                 ó”  — |j                   d   }| j                  j                  j                   d   }t        j                  j                  «       s%||k(  r ||k(  r| j                  | j                  «      S | j                  j                  j                  d«      }|j                   d   }|| j                  z  }|| j                  z  }	t        |dz  «      }
|j                  d|
|
|«      }|j                  dddd«      }t        j                  j                  |||	fdd¬	«      }|j                  dddd«      j                  dd|«      }|S )
a  
        This method allows to interpolate the pre-trained position encodings, to be able to use the model on higher resolution
        images. This method is also adapted to support torch.jit tracing and no class embeddings.

        Adapted from:
        - https://github.com/facebookresearch/dino/blob/de9ee3df6cf39fac952ab558447af1fa1365362a/vision_transformer.py#L174-L194, and
        - https://github.com/facebookresearch/dinov2/blob/e1277af2ba9496fbadf7aec6eba56e8d882d1e35/dinov2/models/vision_transformer.py#L179-L211
        r   r   rR   g      à?r   rO   ÚbicubicF)ÚsizeÚmodeÚalign_corners)Úshapera   Úweightr(   ÚjitÚ
is_tracingrP   Ú	unsqueezerZ   r   ÚreshapeÚpermuter   Ú
functionalÚinterpolateÚview)rD   rg   rh   ri   r^   r_   Úpatch_pos_embedÚdimÚ
new_heightÚ	new_widthÚsqrt_num_positionss              r.   Úinterpolate_pos_encodingz/SiglipVisionEmbeddings.interpolate_pos_encoding‰   sE  € ð !×&Ñ& qÑ)ˆØ×/Ñ/×6Ñ6×<Ñ<¸QÑ?ˆô �y‰y×#Ñ#Ô%¨+¸Ò*FÈ6ÐUZÊ?Ø×*Ñ*¨4×+<Ñ+<Ó=Ð=à×1Ñ1×8Ñ8×BÑBÀ1ÓEˆà×Ñ˜rÑ"ˆà˜tŸ™Ñ.ˆ
Ø˜TŸ_™_Ñ,ˆ	ä& }°cÑ'9Ó:ÐØ)×1Ñ1°!Ð5GÐI[Ð]`ÓaˆØ)×1Ñ1°!°Q¸¸1Ó=ˆäŸ-™-×3Ñ3ØØ˜iÐ(ØØð	 4ó 
ˆð *×1Ñ1°!°Q¸¸1Ó=×BÑBÀ1ÀbÈ#ÓNˆØÐr-   Úpixel_valuesc                 ó\  — |j                   \  }}}}| j                  j                  j                  }| j                  |j	                  |¬«      «      }|j                  d«      j                  dd«      }|r|| j                  |||«      z   }|S || j                  | j                  «      z   }|S )N)ÚdtyperO   r   )
ro   r]   rp   r�   ÚtoÚflattenÚ	transposer~   ra   rP   )	rD   r   r~   Ú_rh   ri   Útarget_dtypeÚpatch_embedsrg   s	            r.   ÚforwardzSiglipVisionEmbeddings.forward¯   s®   € Ø*×0Ñ0Ñˆˆ1ˆf�eØ×+Ñ+×2Ñ2×8Ñ8ˆØ×+Ñ+¨L¯O©OÀ,¨OÓ,OÓPˆØ!×)Ñ)¨!Ó,×6Ñ6°q¸!Ó<ˆ
á#Ø# d×&CÑ&CÀJÐPVÐX]Ó&^Ñ^ˆJð Ðð $ d×&=Ñ&=¸d×>OÑ>OÓ&PÑPˆJØÐr-   ©F)r$   r%   r&   r   rV   r(   ÚTensorÚintr~   r)   rˆ   Ú__classcell__©rf   s   @r.   rF   rF   t   s`   ø„ ðqÐ1õ qð($°5·<±<ð $Èð $ÐUXð $Ð]b×]iÑ]ió $ñL
 E×$5Ñ$5ð 
ÐZ_×ZfÑZf÷ 
r-   rF   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 )
ÚSiglipTextEmbeddingsrG   c                 óN  •— t         ‰| �  «        |j                  }t        j                  |j
                  |«      | _        t        j                  |j                  |«      | _        | j                  dt        j                  |j                  «      j                  d«      d¬«       y )NrP   rQ   FrS   )rU   rV   rW   r   r`   Ú
vocab_sizeÚtoken_embeddingÚmax_position_embeddingsra   rb   r(   rc   rd   ©rD   rG   rX   rf   s      €r.   rV   zSiglipTextEmbeddings.__init__¾   sƒ   ø€ Ü‰ÑÔØ×&Ñ&ˆ	ä!Ÿ|™|¨F×,=Ñ,=¸yÓIˆÔÜ"$§,¡,¨v×/MÑ/MÈyÓ"YˆÔð 	×ÑØœEŸL™L¨×)GÑ)GÓH×OÑOÐPWÓXÐejð 	õ 	
r-   NÚ	input_idsrP   Úinputs_embedsr9   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 )NrR   éþÿÿÿr   zRSequence length must be less than max_position_embeddings (got `sequence length`: z and max_position_embeddings: )ro   ra   rp   Ú
ValueErrorrP   r’   )rD   r•   rP   r–   Ú
seq_lengthÚmax_position_embeddingÚposition_embeddingsrg   s           r.   rˆ   zSiglipTextEmbeddings.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   rV   r(   Ú
LongTensorr)   rŠ   rˆ   rŒ   r�   s   @r.   r�   r�   ½   sk   ø„ ð

Ð/õ 

ð .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 )NrR   r˜   )rz   r�   )ÚpÚtrainingr   rO   )r(   Úmatmulr„   r   rv   ÚsoftmaxÚfloat32r‚   r�   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 )	ÚSiglipAttentionz=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)rU   rV   rG   rW   rX   Únum_attention_headsÚ	num_headsÚhead_dimr™   ÚscaleÚattention_dropoutr¥   Ú	is_causalr   ÚLinearÚk_projÚv_projÚq_projÚout_projre   s     €r.   rV   zSiglipAttention.__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£   r9   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 ChannelNrR   r   rO   ç        )rº   r¤   r¥   )ro   r·   r¾   rx   r„   r¼   r½   r   Úget_interfacerG   Ú_attn_implementationr°   rº   r¸   r¨   r¥   rt   r¬   r¿   )rD   r"   r£   r­   Úinput_shapeÚhidden_shapeÚqueriesÚkeysrB   Úattention_interfacer¯   r®   s               r.   rˆ   zSiglipAttention.forward  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'   rV   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 )Ú	SiglipMLPc                 ó  •— t         ‰| �  «        || _        t        |j                     | _        t        j                  |j                  |j                  «      | _
        t        j                  |j                  |j                  «      | _        y r<   )rU   rV   rG   r	   Ú
hidden_actÚactivation_fnr   r»   rW   Úintermediate_sizeÚfc1Úfc2re   s     €r.   rV   zSiglipMLP.__init__9  sd   ø€ Ü‰ÑÔØˆŒÜ# F×$5Ñ$5Ñ6ˆÔÜ—9‘9˜V×/Ñ/°×1IÑ1IÓJˆŒÜ—9‘9˜V×5Ñ5°v×7IÑ7IÓJˆ�r-   r"   r9   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r<   )rÏ   rÍ   rÐ   )rD   r"   s     r.   rˆ   zSiglipMLP.forward@  s4   € ØŸ™ Ó/ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐr-   )r$   r%   r&   rV   r(   rŠ   rˆ   rŒ   r�   s   @r.   rÊ   rÊ   8  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 )ÚSiglipEncoderLayerrG   c                 óD  •— t         ‰| �  «        |j                  | _        t	        j
                  | j                  |j                  ¬«      | _        t        |«      | _	        t	        j
                  | j                  |j                  ¬«      | _
        t        |«      | _        y ©N©Úeps)rU   rV   rW   rX   r   Ú	LayerNormÚlayer_norm_epsÚlayer_norm1r²   Ú	self_attnÚlayer_norm2rÊ   Úmlpre   s     €r.   rV   zSiglipEncoderLayer.__init__H  sm   ø€ Ü‰ÑÔØ×+Ñ+ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÔÜ(¨Ó0ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÔÜ˜VÓ$ˆ�r-   r"   r£   r­   r9   c                 ó¸   — |}| j                  |«      } | j                  d||dœ|¤Ž\  }}||z   }|}| j                  |«      }| j                  |«      }||z   }|S )N)r"   r£   r,   )rÚ   rÛ   rÜ   rÝ   )rD   r"   r£   r­   Úresidualr…   s         r.   rˆ   zSiglipEncoderLayer.forwardP  s‚   € ð !ˆà×(Ñ(¨Ó7ˆØ)˜4Ÿ>™>ð 
Ø'Ø)ñ
ð ñ
Ñˆ�qð
 ! =Ñ0ˆà ˆØ×(Ñ(¨Ó7ˆØŸ™ Ó/ˆØ  =Ñ0ˆàÐr-   )r$   r%   r&   r   r   rV   r   r(   rŠ   r   r   r)   rˆ   rŒ   r�   s   @r.   rÓ   rÓ   G  sd   ø„ ð%Ð1Ð4DÑDõ %ð ðà—|‘|ðð Ÿ™ðð Ð+Ñ,ð	ð
 
×	Ñ	òó ô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 )ÚSiglipPreTrainedModelrG   Úsiglip)ÚimageÚtextT)r�   rF   rÓ   Ú#SiglipMultiheadAttentionPoolingHead)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   )ÚstdrP   rR   rQ   g�íµ ÷Æ°>r´   N)2rU   Ú_init_weightsr=   rF   rG   r   Úvision_configrW   ÚinitÚnormal_ra   rp   ÚnpÚsqrtÚhasattrÚcopy_rP   r(   rc   ro   rd   r   r`   Údefault_flax_embed_init_r²   Úxavier_uniform_r¾   r¼   r½   r¿   Úzeros_ÚbiasrÊ   rÏ   rÐ   rå   ÚprobeÚ	attentionÚin_proj_weightÚin_proj_biasÚSiglipModelÚlogit_scaleÚ
logit_biasÚSiglipForImageClassificationÚ
classifierÚinitializer_factorr»   r[   Úlecun_normal_r�   )rD   rŸ   ri   rf   s      €r.   rè   z#SiglipPreTrainedModel._init_weights€  sn  ø€ ô 	‰Ñ˜fÔ%Ü�fÔ4Ô5ô ˜dŸk™k¬<Ô8ð —‘×)Ñ)×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Ü× Ñ  §¡×!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Ü˜Ô CÔDÜ× Ñ  §¡Ô.Ü× Ñ  ×!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Õ(ð 'ä˜Ô 4Ô5Ü�J‰J�v×*Ñ*¬E¯L©L¸×9LÑ9L×9RÑ9RÐSUÑ9VÓ,W×,^Ñ,^Ð_fÓ,gÕhð 6r-   )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á   i  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 )
ÚSiglipEncoderz±
    Transformer encoder consisting of `config.num_hidden_layers` self attention layers. Each layer is a
    [`SiglipEncoderLayer`].

    Args:
        config: SiglipConfig
    rG   c                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w )NF)
rU   rV   rG   r   Ú
ModuleListÚrangeÚnum_hidden_layersrÓ   ÚlayersÚgradient_checkpointing)rD   rG   r…   rf   s      €r.   rV   zSiglipEncoder.__init__»  sO   ø€ Ü‰ÑÔØˆŒÜ—m‘mÌÈv×OgÑOgÓIhÖ$iÀAÔ%7¸Õ%?Ò$iÓjˆŒØ&+ˆÕ#ùò %js   ½A#Nr£   r­   r9   c                 óT   — |}| j                   D ]  } |||fi |¤Ž}Œ t        |¬«      S )N)r!   )r  r   )rD   r–   r£   r­   r"   Úencoder_layers         r.   rˆ   zSiglipEncoder.forwardÂ  sC   € ð &ˆØ!Ÿ[™[ò 	ˆMÙ)ØØñð ñ‰Mð	ô °Ô?Ð?r-   r<   )r$   r%   r&   r'   r   rV   r   r(   rŠ   r   r   r   rˆ   rŒ   r�   s   @r.   r
  r
  ²  s_   ø„ ñð,˜|õ ,ð ð /3ñ@ð Ÿ™ tÑ+ð@ð Ð+Ñ,ð	@ð
 
ò@ó ô@r-   r
  zK
    The text model from SigLIP 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 )ÚSiglipTextModelrG   )rä   Ú
text_modelr’   c                 ó@  •— t         ‰| �  |«       || _        |j                  }t	        |«      | _        t        |«      | _        t        j                  ||j                  ¬«      | _        t        j                  ||j                  «      | _        | j                  «        y rÕ   )rU   rV   rG   rW   r�   rg   r
  Úencoderr   rØ   rÙ   Úfinal_layer_normr»   Úprojection_sizeÚheadÚ	post_initr”   s      €r.   rV   zSiglipTextModel.__init__ß  su   ø€ Ü‰Ñ˜Ô ØˆŒØ×&Ñ&ˆ	Ü.¨vÓ6ˆŒÜ$ VÓ,ˆŒÜ "§¡¨Y¸F×<QÑ<QÔ RˆÔä—I‘I˜i¨×)?Ñ)?Ó@ˆŒ	Ø�‰Õr-   F©Útie_last_hidden_statesNr•   r£   rP   r­   r9   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, SiglipTextModel

        >>> model = SiglipTextModel.from_pretrained("google/siglip-base-patch16-224")
        >>> tokenizer = AutoTokenizer.from_pretrained("google/siglip-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_idsrR   )r•   rP   )rG   r–   r£   )r–   r£   ©r!   Úpooler_outputr,   )r™   rl   rx   rg   r
   rG   r  r!   r  r  r   )
rD   r•   r£   rP   r­   rÄ   r"   Úencoder_outputsr!   Úpooled_outputs
             r.   rˆ   zSiglipTextModel.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ÿ   Ú_input_embed_layerrV   r   r   r   r(   rŠ   r   r   r   rˆ   rŒ   r�   s   @r.   r  r  Ô  s¯   ø… ð ÓØ ÐØ$ÐØ*Ðð	Ð/õ 	ð  Ù¨EÔ2Øð *.Ø.2Ø,0ñ	6
à—<‘< $Ñ&ð6
ð Ÿ™ tÑ+ð6
ð —l‘l TÑ)ð	6
ð
 Ð+Ñ,ð6
ð 
$ò6
ó ó 3ó  ô6
r-   r  zM
    The vision model from SigLIP 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d	ed
z  dee   defd„«       «       «       Zˆ xZS )ÚSiglipVisionModelrG   r   ©rã   Úvision_modelr]   c                 ól  •— t         ‰| �  |«       || _        |j                  }t	        |«      | _        t        |«      | _        t        j                  ||j                  ¬«      | _        t        |d«      sdn|j                  | _        | j                  rt        |«      | _        | j#                  «        y )NrÖ   Úvision_use_headT)rU   rV   rG   rW   rF   rg   r
  r  r   rØ   rÙ   Úpost_layernormrî   r)  Úuse_headrå   r  r  r”   s      €r.   rV   zSiglipVisionModel.__init__2  s‰   ø€ Ü‰Ñ˜Ô ØˆŒØ×&Ñ&ˆ	ä0°Ó8ˆŒÜ$ VÓ,ˆŒÜ Ÿl™l¨9¸&×:OÑ:OÔPˆÔÜ$+¨FÐ4EÔ$F™ÈF×LbÑLbˆŒØ�=Š=Ü;¸FÓCˆDŒIØ�‰Õr-   Fr  r~   Nr­   r9   c                 óâ   — | j                  ||¬«      } | j                  dd|i|¤Ž}|j                  }| j                  |«      }| j                  r| j                  |«      nd}t        ||¬«      S )a/  
        Examples:

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

        >>> model = SiglipVisionModel.from_pretrained("google/siglip-base-patch16-224")
        >>> processor = AutoProcessor.from_pretrained("google/siglip-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
        ```)r~   r–   Nr  r,   )rg   r  r!   r*  r+  r  r   )rD   r   r~   r­   r"   r!  r!   r   s           r.   rˆ   zSiglipVisionModel.forward?  s�   € ð> Ÿ™¨ÐOg˜Óhˆà+7¨4¯<©<ñ ,
Ø'ð,
àñ,
ˆð
 ,×=Ñ=ÐØ ×/Ñ/Ð0AÓBÐà8<¿º˜Ÿ	™	Ð"3Ô4È4ˆä)Ø/Ø'ô
ð 	
r-   r‰   )r$   r%   r&   r   r*   Úmain_input_namer   rÿ   r#  rV   r   r   r   Úboolr   r   r   rˆ   rŒ   r�   s   @r.   r%  r%  &  s…   ø… ð ÓØ$€OØ!ÐØ&ÐØ*ÐðÐ1õ ð  Ù¨EÔ2Øð 16ñ+
ð #'¨¡+ð+
ð Ð+Ñ,ð	+
ð
 
$ò+
ó ó 3ó  ô+
r-   r%  c                   ó.   ‡ — e Zd ZdZdefˆ fd„Zd„ Zˆ xZS )rå   zMultihead Attention Pooling.rG   c                 óŠ  •— t         ‰| �  «        t        j                  t	        j
                  dd|j                  «      «      | _        t        j                  j                  |j                  |j                  d¬«      | _
        t        j                  |j                  |j                  ¬«      | _        t        |«      | _        y )Nr   T)Úbatch_firstrÖ   )rU   rV   r   Ú	Parameterr(   ÚrandnrW   rô   ÚMultiheadAttentionrµ   rõ   rØ   rÙ   Ú	layernormrÊ   rÝ   re   s     €r.   rV   z,SiglipMultiheadAttentionPoolingHead.__init__s  s…   ø€ Ü‰ÑÔä—\‘\¤%§+¡+¨a°°F×4FÑ4FÓ"GÓHˆŒ
ÜŸ™×4Ñ4°V×5GÑ5GÈ×IcÑIcÐquÐ4ÓvˆŒÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÜ˜VÓ$ˆ�r-   c                 óæ   — |j                   d   }| j                  j                  |dd«      }| j                  |||«      d   }|}| j	                  |«      }|| j                  |«      z   }|d d …df   S )Nr   r   )ro   rô   Úrepeatrõ   r5  rÝ   )rD   Úhidden_stateÚ
batch_sizerô   rß   s        r.   rˆ   z+SiglipMultiheadAttentionPoolingHead.forward{  sv   € Ø!×'Ñ'¨Ñ*ˆ
Ø—
‘
×!Ñ! *¨a°Ó3ˆà—~‘~ e¨\¸<ÓHÈÑKˆàˆØ—~‘~ lÓ3ˆØ $§(¡(¨<Ó"8Ñ8ˆàšA˜q˜DÑ!Ð!r-   )r$   r%   r&   r'   r   rV   rˆ   rŒ   r�   s   @r.   rå   rå   p  s   ø„ Ù&ð%Ð1õ %ö
"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e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dz  dedee   defd„«       «       Zˆ xZS )rø   rG   c                 ó�  •— t         ‰| �  |«       |j                  }|j                  }t        j                  |«      | _        t        j                  |«      | _        t        j                  t        j                  d«      «      | _        t        j                  t        j                  d«      «      | _        | j                  «        y )Nr   )rU   rV   Útext_configré   r  Ú_from_configr  r%  r'  r   r2  r(   r3  rù   rú   r  )rD   rG   r<  ré   rf   s       €r.   rV   zSiglipModel.__init__Œ  sŠ   ø€ Ü‰Ñ˜Ô à×(Ñ(ˆØ×,Ñ,ˆô *×6Ñ6°{ÓCˆŒÜ-×:Ñ:¸=ÓIˆÔäŸ<™<¬¯©°A«Ó7ˆÔÜŸ,™,¤u§{¡{°1£~Ó6ˆŒð 	�‰Õr-   r9   c                 óB   — | j                   j                  j                  S r<   ©r  rg   r’   rC   s    r.   Úget_input_embeddingsz SiglipModel.get_input_embeddingsœ  s   € Ø�‰×)Ñ)×9Ñ9Ð9r-   r¢   c                 ó:   — || j                   j                  _        y r<   r?  ©rD   r¢   s     r.   Úset_input_embeddingsz SiglipModel.set_input_embeddingsŸ  s   € Ø5:ˆ�‰×"Ñ"Õ2r-   Nr•   r£   rP   r­   c                 ó.   —  | j                   d|||dœ|¤ŽS )am  
        Examples:

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

        >>> model = AutoModel.from_pretrained("google/siglip-base-patch16-224")
        >>> tokenizer = AutoTokenizer.from_pretrained("google/siglip-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£   rP   r,   )r  )rD   r•   r£   rP   r­   s        r.   Úget_text_featureszSiglipModel.get_text_features¢  s/   € ð0 ˆt�‰ð 
ØØ)Ø%ñ
ð ñ	
ð 	
r-   r   r~   c                 ó,   —  | j                   d||dœ|¤ŽS )a‡  
        Examples:

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

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

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

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

        >>> with torch.no_grad():
        ...     image_features = model.get_image_features(**inputs)
        ```©r   r~   r,   )r'  )rD   r   r~   r­   s       r.   Úget_image_featureszSiglipModel.get_image_featuresÁ  s.   € ð6 !ˆt× Ñ ð 
Ø%Ø%=ñ
ð ñ
ð 	
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 )a  
        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/siglip-base-patch16-224")
        >>> processor = AutoProcessor.from_pretrained("google/siglip-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'
        ```rH  rE  rO   rR   T)r§   rz   ÚkeepdimNr   )Údevice©rz   )r4   r5   r6   r1   r    r7   r8   r,   )r'  r  r   Únormr(   r©   Útr‚   rM  rù   rú   ÚexpÚeyerl   Ú	ones_liker   rv   Ú
logsigmoidÚsumÚmeanr3   )rD   r•   r   r£   rP   rJ  r~   r­   Úvision_outputsÚtext_outputsr    r1   r6   rù   rú   r5   r4   rR  Úm1_diag1ÚloglikÚnlls                        r.   rˆ   zSiglipModel.forwardã  sÑ  € ðX 6G°T×5FÑ5Fð 6
Ø%Ø%=ñ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‰   )NNNNNF)r$   r%   r&   r   r*   rV   r   ÚModuler@  rC  r   r   r(   rŠ   r   r   r+   r   rF  r)   r.  rI  rž   r3   rˆ   rŒ   r�   s   @r.   rø   rø   ˆ  sÁ  ø… àÓð˜|õ ð : b§i¡ió :ð;¨"¯)©)ó ;ð Øð /3Ø,0ñ	
à—<‘<ð
ð Ÿ™ tÑ+ð
ð —l‘l TÑ)ð	
ð
 Ð+Ñ,ð
ð 
Ð+Ñ	+ò
ó ó ð
ð: Øð */ñ
à×'Ñ'ð
ð #'ð
ð Ð+Ñ,ð	
ð
 
Ð+Ñ	+ò
ó ó ð
ð@ Øð .2Ø15Ø.2Ø04Ø#'Ø).ñW
à×#Ñ# dÑ*ðW
ð ×'Ñ'¨$Ñ.ðW
ð Ÿ™ tÑ+ð	W
ð
 ×&Ñ&¨Ñ-ðW
ð ˜D‘[ðW
ð #'ðW
ð Ð+Ñ,ðW
ð 
òW
ó ó ôW
r-   rø   z­
    SigLIP 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dee   def
d„«       «       Zˆ xZS )rû   r   r&  rG   r9   Nc                 óf  •— t         ‰| �  |«       |j                  | _        t        j	                  |j
                  «      | _        |j                  dkD  r4t        j                  |j
                  j                  |j                  «      nt        j                  «       | _        | j                  «        y )Nr   )rU   rV   Ú
num_labelsr%  r=  ré   r'  r   r»   rW   ÚIdentityrü   r  re   s     €r.   rV   z%SiglipForImageClassification.__init__I  s‡   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ-×:Ñ:¸6×;OÑ;OÓPˆÔð 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'  rg   r]   rC   s    r.   r@  z1SiglipForImageClassification.get_input_embeddingsW  s   € Ø× Ñ ×+Ñ+×;Ñ;Ð;r-   r¢   c                 ó:   — || j                   j                  _        y r<   rb  rB  s     r.   rC  z1SiglipForImageClassification.set_input_embeddingsZ  s   € Ø7<ˆ×Ñ×$Ñ$Õ4r-   Úlabelsr~   r­   c                 ó  —  | j                   |fd|i|¤Ž}|j                  }t        j                  |d¬«      }| j	                  |«      }d}|�| j                  ||| j                  «      }t        |||j                  |j                  ¬«      S )au  
        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, SiglipForImageClassification
        >>> 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 `SiglipModel` 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/siglip-base-patch16-224")
        >>> model = SiglipForImageClassification.from_pretrained("google/siglip-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   rN  N)r4   Úlogitsr"   r#   )
r'  r!   r(   rV  rü   Úloss_functionrG   r   r"   r#   )	rD   r   rd  r~   r­   ÚoutputsÚsequence_outputrf  r4   s	            r.   rˆ   z$SiglipForImageClassification.forward]  s¢   € ðT /@¨d×.?Ñ.?Øñ/
à%=ð/
ð ñ/
ˆð "×3Ñ3ˆô  Ÿ*™* _¸!Ô<ˆà—‘ Ó1ˆàˆØÐØ×%Ñ% f¨f°d·k±kÓBˆDä$ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r-   )NNF)r$   r%   r&   r-  r   r   rV   r   r\  r@  rC  r   r   r(   rŠ   r.  r   r   r   rˆ   rŒ   r�   s   @r.   rû   rû   ?  s²   ø„ ð %€OØ!Ðð˜|ð °õ ð< b§i¡ió <ð=¨"¯)©)ó =ð Øð -1Ø&*Ø).ñ	>
à—l‘l TÑ)ð>
ð —‘˜tÑ#ð>
ð #'ð	>
ð
 Ð+Ñ,ð>
ð 
ò>
ó ó ô>
r-   rû   )rø   rá   r  r%  rû   )rÁ   )?r'   Úcollections.abcr   Údataclassesr   Útypingr   Únumpyrì   r(   r   Ú r   rê   Úactivationsr	   Úmasking_utilsr
   Úmodeling_layersr   Úmodeling_outputsr   r   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   r   Úutils.genericr   Úutils.output_capturingr   Úconfiguration_siglipr   r   r   r   r0   r3   r\  rF   r�   rŠ   Úfloatr°   r²   rÊ   rÓ   rá   r
  r  r%  rå   rø   rû   Ú__all__r,   r-   r.   ú<module>r{     ss  ðñ å $Ý !Ý ã Û Ý å &Ý !Ý 6Ý 9ß bÑ bß FÝ &÷õ õ 8Ý 5ß TÑ Tñ ðôð
 ô	<˜kó 	<ó óð	<ñ ðôð
 ô	<˜Kó 	<ó óð	<ð Ø
ô_�;ó _ó ó ð_ô@E˜RŸY™Yô EôR%˜2Ÿ9™9ô %ð^ ñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð ð%ð ó%ô.8)�b—i‘iô 8)ôx�—	‘	ô ôÐ3ô ðD ôDi˜Oó Dió ðDiôP@�B—I‘Iô @ñD ðôô
J
Ð+ó J
óð
J
ñZ ðôô
B
Ð-ó B
óð
B
ôJ"¨"¯)©)ô "ð0 ôs
Ð'ó s
ó ðs
ñl ðôôX
Ð#8ó X
óðX
òv�r-   