Ë
    ÛÓ^jG) ã                   ó¸  — d Z ddlmZ ddlmZ ddlmZ ddlZddlmZ ddl	m
Z
 dd	lmZ dd
lmZmZ ddlmZ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!m"Z" ddl#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/m0Z0 ddl1m2Z2m3Z3m4Z4  e*jj                  e6«      Z7dZ8 e)d¬«      e G d„ de«      «       «       Z9 e)d¬«      e G d„ de«      «       «       Z: G d„ d ejv                  «      Z< G d!„ d"ejv                  «      Z= G d#„ d$ejv                  «      Z> G d%„ d&ejv                  «      Z? G d'„ d(ejv                  «      Z@ G d)„ d*ejv                  «      ZA G d+„ d,ejv                  «      ZB G d-„ d.ejv                  «      ZC G d/„ d0ejv                  «      ZD	 	 ddd1ejv                  d2ejŠ                  d3ejŠ                  d4ejŠ                  d5ejŠ                  dz  d6eFdz  d7eFd8e$e(   fd9„ZG G d:„ d;ejv                  «      ZH G d<„ d=ejv                  «      ZI G d>„ d?ejv                  «      ZJ G d@„ dAejv                  «      ZK G dB„ dCe«      ZL G dD„ dEejv                  «      ZM G dF„ dGejv                  «      ZNe) G dH„ dIe"«      «       ZO G dJ„ dKeO«      ZP e)dL¬«       G dM„ dNeO«      «       ZQ e)dO¬«       G dP„ dQeO«      «       ZR G dR„ dSejv                  «      ZS G dT„ dUejv                  «      ZT G dV„ dWejv                  «      ZU e)dX¬«       G dY„ dZeO«      «       ZV e)d[¬«       G d\„ d]eO«      «       ZW G d^„ d_ejv                  «      ZX e)d`¬«       G da„ dbeO«      «       ZYg dc¢ZZy)ezPyTorch BridgeTower Modelé    )ÚOrderedDict)ÚCallable)Ú	dataclassN)Únn)ÚCrossEntropyLossé   )Úinitialization)ÚACT2FNÚQuickGELUActivation)ÚCacheÚDynamicCacheÚEncoderDecoderCache)Úcreate_bidirectional_maskÚcreate_causal_mask)ÚGradientCheckpointingLayer)Ú)BaseModelOutputWithPastAndCrossAttentionsÚ,BaseModelOutputWithPoolingAndCrossAttentionsÚMaskedLMOutputÚModelOutputÚSequenceClassifierOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)Úapply_chunking_to_forward)ÚTransformersKwargsÚauto_docstringÚloggingÚ	torch_int)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputsé   )ÚBridgeTowerConfigÚBridgeTowerTextConfigÚBridgeTowerVisionConfigÚRobertaTokenizerz.
    Output type of [`BridgeTowerModel`].
    )Ú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j                  dz  ed<   dZ
eej                     dz  ed<   dZeej                     dz  ed<   y)ÚBridgeTowerModelOutputa«  
    text_features (`torch.FloatTensor` of shape `(batch_size, text_sequence_length, hidden_size)`):
        Sequence of hidden-states at the text output of the last layer of the model.
    image_features (`torch.FloatTensor` of shape `(batch_size, image_sequence_length, hidden_size)`):
        Sequence of hidden-states at the image output of the last layer of the model.
    pooler_output (`torch.FloatTensor` of shape `(batch_size, hidden_size x 2)`):
        Concatenation of last layer hidden-state of the first token of the text and image sequence (classification
        token), respectively, after further processing through layers used for auxiliary pretraining tasks.
    NÚtext_featuresÚimage_featuresÚpooler_outputÚhidden_statesÚ
attentions)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r*   ÚtorchÚFloatTensorÚ__annotations__r+   r,   r-   Útupler.   © ó    ú/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/bridgetower/modeling_bridgetower.pyr)   r)   2   s|   … ñð /3€M�5×$Ñ$ tÑ+Ó2Ø/3€N�E×%Ñ%¨Ñ,Ó3Ø.2€M�5×$Ñ$ tÑ+Ó2Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ô6r8   r)   z>
    Output type of ['BridgeTowerForContrastiveLearning']
    c                   óH  — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
ej                     dz  ed<   dZe
ej                     dz  ed<   dZe
ej                     dz  ed<   dZe
ej                     dz  ed<   dZe
ej                     dz  ed	<   y)
ÚBridgeTowerContrastiveOutputaö  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `return_loss` is `True`):
        Image-text contrastive loss.
    logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`):
        Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
    text_embeds (`torch.FloatTensor)`, *optional*, returned when model is initialized with `with_projection=True`):
        The text embeddings obtained by applying the projection layer to the pooler_output.
    image_embeds (`torch.FloatTensor)`, *optional*, returned when model is initialized with `with_projection=True`):
        The image embeddings obtained by applying the projection layer to the pooler_output.
    cross_embeds (`torch.FloatTensor)`, *optional*, returned when model is initialized with `with_projection=True`):
        The text-image cross-modal embeddings obtained by applying the projection layer to the pooler_output.
    attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`):
        Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length,
        sequence_length)`.
    NÚlossÚlogitsÚtext_embedsÚimage_embedsÚcross_embedsr-   r.   )r/   r0   r1   r2   r<   r3   r4   r5   r=   r>   r6   r?   r@   r-   r.   r7   r8   r9   r;   r;   J   sµ   … ñð  &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø37€K��u×(Ñ(Ñ)¨DÑ0Ó7Ø48€L�%˜×)Ñ)Ñ*¨TÑ1Ó8Ø48€L�%˜×)Ñ)Ñ*¨TÑ1Ó8Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ô6r8   r;   c                   ó–   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zddej
                  dej
                  dz  fd„Zˆ xZS )ÚBridgeTowerResidualAttentionc                 óh  •— t         ‰| �  «        t        j                  |j                  |j                  dz  «      | _        t        j                  |j                  |j                  ¬«      | _        t        j                  t        dt        j                  |j                  |j                  dz  «      fdt        «       fdt        j                  |j                  dz  |j                  «      fg«      «      | _        t        j                  |j                  |j                  ¬«      | _        d | _        y )Né@   ©ÚepsÚc_fcé   ÚgeluÚc_proj)ÚsuperÚ__init__r   ÚMultiheadAttentionÚhidden_sizeÚattnÚ	LayerNormÚlayer_norm_epsÚln_1Ú
ModuleDictr   ÚLinearr   ÚmlpÚln_2Ú	attn_mask©ÚselfÚconfigÚ	__class__s     €r9   rL   z%BridgeTowerResidualAttention.__init__k   së   ø€ Ü‰ÑÔä×)Ñ)¨&×*<Ñ*<¸f×>PÑ>PÐTVÑ>VÓWˆŒ	Ü—L‘L ×!3Ñ!3¸×9NÑ9NÔOˆŒ	Ü—=‘=ÜàœRŸY™Y v×'9Ñ'9¸6×;MÑ;MÐPQÑ;QÓRÐSØÔ0Ó2Ð3ØœrŸy™y¨×);Ñ);¸aÑ)?À×ASÑASÓTÐUðóó
ˆŒô —L‘L ×!3Ñ!3¸×9NÑ9NÔOˆŒ	Øˆ�r8   Úhidden_stateÚattention_maskc                 ó,  — |�+|j                  t        j                  |j                  ¬«      }| j                  �1| j                  j                  |j
                  |j                  ¬«      nd | _        | j                  |||d| j                  |¬«      d   S )N©ÚdtypeÚdeviceF)Úneed_weightsrW   Úkey_padding_maskr   )Útor3   Úboolra   rW   r`   rO   )rY   r\   r]   s      r9   Ú	attentionz&BridgeTowerResidualAttention.attention|   sš   € ØÐ%Ø+×.Ñ.´U·Z±ZÈ×H[ÑH[Ð.Ó\ˆNð �~‰~Ð)ð �N‰N×Ñ L×$6Ñ$6¸|×?RÑ?RÐÔSàð 	Œð
 �y‰yØØØØØ—n‘nØ+ð ó 
ð ñð 	r8   Nc                 óÈ   — || j                  | j                  |«      |«      z   }| j                  |«      }| j                  j	                  «       D ]
  } ||«      }Œ ||z   }|S ©N)rf   rR   rV   rU   Úvalues)rY   r\   r]   Úresidual_stateÚlayers        r9   Úforwardz$BridgeTowerResidualAttention.forward�   sc   € Ø%¨¯©°t·y±yÀÓ7NÐP^Ó(_Ñ_ˆØ—y‘y Ó0ˆØ—X‘X—_‘_Ó&ò 	/ˆEÙ  Ó.‰Lð	/à%¨Ñ4ˆØÐr8   rh   )	r/   r0   r1   rL   r3   ÚTensorrf   rl   Ú__classcell__©r[   s   @r9   rB   rB   j   sD   ø„ ôð" e§l¡lð ÀEÇLÁLó ñ" E§L¡Lð À%Ç,Á,ÐQUÑBU÷ r8   rB   c                   ó^   ‡ — e Zd Zˆ fd„Zddej
                  dej
                  dz  fd„Zˆ xZS )ÚBridgeTowerTransformerc                 óÌ  •— t         ‰| �  «        |j                  | _        |j                  | _        |j                  rHt        j                  t        | j                  dz
  «      D �cg c]  }t        |«      ‘Œ c}«      | _	        nDt        j                  t        | j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _	        |j                  | _
        y c c}w c c}w )Nr"   )rK   rL   rN   Únum_hidden_layersÚremove_last_layerr   Ú
ModuleListÚrangerB   Ú	resblocksÚstop_gradient©rY   rZ   Ú_r[   s      €r9   rL   zBridgeTowerTransformer.__init__—   sµ   ø€ Ü‰ÑÔØ!×-Ñ-ˆÔØ!'×!9Ñ!9ˆÔØ×#Ò#ÜŸ]™]Ü?DÀT×E[ÑE[Ð^_ÑE_Ó?`Öa¸!Ô-¨fÕ5ÒaóˆD�Nô  Ÿ]™]Ü?DÀT×E[ÑE[Ó?\Ö]¸!Ô-¨fÕ5Ò]óˆDŒNð $×1Ñ1ˆÕùò bùò ^s   Á'CÂ,C!Nr\   r]   c                 ó¸   — g }| j                   D ]H  } |||«      }| j                  r |j                  |j                  «       «       Œ8|j                  |«       ŒJ |S rh   )rw   rx   ÚappendÚdetach)rY   r\   r]   r-   Úblocks        r9   rl   zBridgeTowerTransformer.forward¥   s\   € ØˆØ—^‘^ò 	3ˆEÙ  ¨~Ó>ˆLØ×!Ò!Ø×$Ñ$ \×%8Ñ%8Ó%:Õ;à×$Ñ$ \Õ2ð	3ð Ðr8   rh   ©r/   r0   r1   rL   r3   rm   rl   rn   ro   s   @r9   rq   rq   –   s)   ø„ ô2ñ E§L¡Lð À%Ç,Á,ÐQUÑBU÷ r8   rq   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 )ÚBridgeTowerVisionEmbeddingsrZ   c                 óÚ  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        |j                  | _        t        j                  t        j                  | j                  «      «      | _        t        j                  |j                  | j                  | j                  | j                  d¬«      | _        | j
                  | j                  z  dz  | _        | j                  dz   | _        t        j"                  | j                   | j                  «      | _        | j'                  dt        j(                  | j                   «      j+                  d«      d¬«       y )NF)Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚbiasé   r"   Úposition_ids©r"   éÿÿÿÿ©Ú
persistent)rK   rL   rZ   rN   Ú	embed_dimÚ
image_sizeÚ
patch_sizer   Ú	Parameterr3   ÚrandnÚclass_embeddingÚConv2dÚnum_channelsÚpatch_embeddingÚnum_patchesÚnum_positionsÚ	EmbeddingÚposition_embeddingÚregister_bufferÚarangeÚexpandrX   s     €r9   rL   z$BridgeTowerVisionEmbeddings.__init__²   s	  ø€ Ü‰ÑÔØˆŒØ×+Ñ+ˆŒØ ×+Ñ+ˆŒØ ×+Ñ+ˆŒä!Ÿ|™|¬E¯K©K¸¿¹Ó,GÓHˆÔä!Ÿy™yØ×+Ñ+ØŸ™ØŸ™Ø—?‘?Øô 
ˆÔð !ŸO™O¨t¯©Ñ>À1ÑDˆÔØ!×-Ñ-°Ñ1ˆÔÜ"$§,¡,¨t×/AÑ/AÀ4Ç>Á>Ó"RˆÔØ×Ñ˜^¬U¯\©\¸$×:LÑ:LÓ-M×-TÑ-TÐU\Ó-]ÐjoÐÕpr8   Ú
embeddingsÚheightÚwidthÚreturnc                 óÒ  — |j                   d   dz
  }| j                  j                  j                  d«      }|j                   d   dz
  }t        j
                  j                  «       s%||k(  r ||k(  r| j                  | j                  «      S |dd…dd…f   }|dd…dd…f   }|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|	«      }t	        j                   ||f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.

        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   Nr‹   ç      à?r   rˆ   ÚbicubicF)ÚsizeÚmodeÚalign_corners©Údim)Úshaperš   ÚweightÚ	unsqueezer3   ÚjitÚ
is_tracingr‰   r�   r   ÚreshapeÚpermuter   Ú
functionalÚinterpolateÚviewÚcat)rY   rž   rŸ   r    r—   rš   r˜   Úclass_pos_embedÚpatch_pos_embedr©   Ú
new_heightÚ	new_widthÚsqrt_num_positionss                r9   Úinterpolate_pos_encodingz4BridgeTowerVisionEmbeddings.interpolate_pos_encodingÈ   sv  € ð !×&Ñ& qÑ)¨AÑ-ˆØ!×4Ñ4×;Ñ;×EÑEÀaÓHÐØ*×0Ñ0°Ñ3°aÑ7ˆô �y‰y×#Ñ#Ô%¨+¸Ò*FÈ6ÐUZÊ?Ø×*Ñ*¨4×+<Ñ+<Ó=Ð=à,ªQ°°°¨UÑ3ˆØ,ªQ°±¨UÑ3ˆà×Ñ˜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ˆä�y‰y˜/¨?Ð;ÀÔCÐCr8   Úpixel_valuesc                 ó`  — |j                   \  }}}}|sJ|| j                  k7  s|| j                  k7  r,t        d|› d|› d| j                  › d| j                  › d�	«      ‚| j                  j                  j
                  }| j                  |j                  |¬«      «      }|j                  d«      j                  dd«      }| j                  j                  |dd«      }	t        j                  |	|gd¬	«      }
|r|
| j                  |
||«      z   }
|
S |
| j                  | j                  «      z   }
|
S )
NzInput image size (Ú*z) doesn't match model (z).©r`   rˆ   r"   r‹   r¨   )rª   r�   Ú
ValueErrorr–   r«   r`   rd   ÚflattenÚ	transposer“   r�   r3   r´   rº   rš   r‰   )rY   r»   rº   Ú
batch_sizerz   rŸ   r    Útarget_dtypeÚpatch_embedsÚclass_embedsrž   s              r9   rl   z#BridgeTowerVisionEmbeddings.forwardñ   s6  € Ø'3×'9Ñ'9Ñ$ˆ
�A�v˜uÙ'¨V°t·±Ò-FÈ%ÐSW×SbÑSbÒJbÜØ$ V H¨A¨e¨WÐ4KÈDÏOÉOÐK\Ð\]Ð^b×^mÑ^mÐ]nÐnpÐqóð ð ×+Ñ+×2Ñ2×8Ñ8ˆØ×+Ñ+¨L¯O©OÀ,¨OÓ,OÓPˆØ#×+Ñ+¨AÓ.×8Ñ8¸¸AÓ>ˆà×+Ñ+×2Ñ2°:¸qÀ"ÓEˆÜ—Y‘Y ¨lÐ;ÀÔCˆ
Ù#Ø# d×&CÑ&CÀJÐPVÐX]Ó&^Ñ^ˆJð Ðð $ d×&=Ñ&=¸d×>OÑ>OÓ&PÑPˆJØÐr8   ©F)r/   r0   r1   r%   rL   r3   rm   Úintrº   r4   rl   rn   ro   s   @r9   r�   r�   ±   se   ø„ ðqÐ6õ qð,'D°5·<±<ð 'DÈð 'DÐUXð 'DÐ]b×]iÑ]ió 'DñR E×$5Ñ$5ð ÐZ_×ZfÑZf÷ r8   r�   c                   óŽ   ‡ — e Zd Zˆ fd„Z	 ddej
                  defd„Z	 ddej
                  defd„Zdej
                  fd„Z	ˆ xZ
S )	ÚBridgeTowerVisionTransformerc           	      ó0  •— t         ‰| �  «        t        |«      | _        t	        j
                  |j                  |j                  ¬«      | _        t        |«      | _
        t	        j
                  |j                  |j                  ¬«      | _        |j                  | _        |j                  set	        j                  t        |j                  «      D �cg c]-  }t	        j
                  |j                  |j                  ¬«      ‘Œ/ c}«      | _        y y c c}w ©NrE   )rK   rL   r�   rž   r   rP   rN   rQ   Úln_prerq   ÚtransformerÚln_postÚshare_layernormru   rv   rs   Úln_separatery   s      €r9   rL   z%BridgeTowerVisionTransformer.__init__  sÅ   ø€ Ü‰ÑÔä5°fÓ=ˆŒÜ—l‘l 6×#5Ñ#5¸6×;PÑ;PÔQˆŒÜ1°&Ó9ˆÔÜ—|‘| F×$6Ñ$6¸F×<QÑ<QÔRˆŒØ%×5Ñ5ˆÔØ×%Ò%Ü!Ÿ}™}ÜV[Ð\b×\tÑ\tÓVuÖvÐQR”—‘˜f×0Ñ0°f×6KÑ6KÖLÒvó ˆDÕð &ùâvs   Ã2Dr»   rº   c                 óÊ  — | j                  ||«      }| j                  |«      }|j                  ddd«      }| j                  ||«      }t	        j
                  |d¬«      }|j                  dddd«      }| j                  r| j                  |«      }|S g }t        || j                  «      D ]  \  }} ||«      }|j                  |«       Œ  t	        j
                  |d¬«      }|S )Nr"   r   rˆ   r¨   r   )rž   rÌ   r°   rÍ   r3   ÚstackrÏ   rÎ   ÚziprÐ   r|   )rY   r»   r]   rº   r-   Úhidden_states_stackÚlns          r9   rl   z$BridgeTowerVisionTransformer.forward  sè   € ð Ÿ™¨Ð6NÓOˆØŸ™ MÓ2ˆà%×-Ñ-¨a°°AÓ6ˆà×(Ñ(¨¸ÓGˆäŸ™ M°qÔ9ˆà%×-Ñ-¨a°°A°qÓ9ˆØ×ÒØ ŸL™L¨Ó7ˆMð Ðð #%ÐÜ%(¨¸×8HÑ8HÓ%Iò :Ñ!�˜rÙ " =Ó 1�Ø#×*Ñ*¨=Õ9ð:ô "ŸK™KÐ(;ÀÔCˆMØÐr8   c                 ót   — | j                  ||¬«      }| j                  |«      }|j                  ddd«      }|S )N©rº   r"   r   rˆ   )rž   rÌ   r°   )rY   r»   rº   r-   s       r9   Úforward_prez(BridgeTowerVisionTransformer.forward_pre-  s?   € ð
 Ÿ™¨ÐOg˜ÓhˆØŸ™ MÓ2ˆà%×-Ñ-¨a°°AÓ6ˆØÐr8   r\   c                 óN   — |j                  ddd«      }| j                  |«      }|S )Nr"   r   rˆ   )r°   rÎ   )rY   r\   Úvisual_output_posts      r9   Úforward_postz)BridgeTowerVisionTransformer.forward_post8  s-   € Ø)×1Ñ1°!°Q¸Ó:ÐØ!Ÿ\™\Ð*<Ó=ÐØ!Ð!r8   rÆ   )r/   r0   r1   rL   r3   rm   re   rl   rØ   rÛ   rn   ro   s   @r9   rÉ   rÉ     sX   ø„ ôð" */ñ	à—l‘lðð #'ó	ð< */ñ	à—l‘lð	ð #'ó	ð"¨¯©÷ "r8   rÉ   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚBridgeTowerLinkTowerc                 ó  •— t         ‰| �  «        |j                  | _        |j                  | _        |j                  dv rª|j                  dk(  r.t	        j
                  t        j                  d«      «      | _        n<|j                  dk(  r-t	        j
                  t        j                  d«      «      | _	        t	        j                  | j                  |j                  ¬«      | _
        y t        d|j                  › d�«      ‚)	N)ÚaddÚ
scaled_addr²   rà   g      ð?r²   r£   rE   úlink_tower_type ú is not implemented)rK   rL   Úlink_tower_typerN   r   r‘   r3   ÚtensorÚscaled_factorÚbetarP   rQ   ÚNotImplementedErrorrX   s     €r9   rL   zBridgeTowerLinkTower.__init__?  sÃ   ø€ Ü‰ÑÔØ%×5Ñ5ˆÔØ!×-Ñ-ˆÔØ×!Ñ!Ð%IÑIØ×%Ñ%¨Ò5Ü%'§\¡\´%·,±,¸sÓ2CÓ%D�Õ"Ø×'Ñ'¨=Ò8ÜŸL™L¬¯©°cÓ):Ó;�”	ÜŸ\™\¨$×*:Ñ*:À×@UÑ@UÔVˆD�Nä%Ð(8¸×9OÑ9OÐ8PÐPcÐ&dÓeÐer8   c                 óZ  — | j                   dk(  r| j                  ||z   «      S | j                   dk(  r!| j                  || j                  z  |z   «      S | j                   dk(  r1| j                  |d| j                  z
  z  || j                  z  z   «      S t	        d| j                   › d�«      ‚)Nrß   rà   r²   r"   rá   râ   )rã   rP   rå   ræ   rç   )rY   r-   Úcross_modal_hidden_statesr]   s       r9   rl   zBridgeTowerLinkTower.forwardL  s¬   € Ø×Ñ 5Ò(Ø—>‘> -Ð2KÑ"KÓLÐLØ×!Ñ! \Ò1Ø—>‘> -°$×2DÑ2DÑ"DÐG`Ñ"`ÓaÐaØ×!Ñ! ]Ò2Ø—>‘> -°1°t·y±y±=Ñ"AÐD]Ð`d×`iÑ`iÑDiÑ"iÓjÐjä%Ð(8¸×9MÑ9MÐ8NÐNaÐ&bÓcÐcr8   ©r/   r0   r1   rL   rl   rn   ro   s   @r9   rÝ   rÝ   >  s   ø„ ôfödr8   rÝ   c                   ón   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  dej
                  fd„Zˆ xZS )ÚBridgeTowerSelfOutputc                 ó(  •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        j                  |j                  |j                  ¬«      | _        t        j                  |j                  «      | _
        y rË   )rK   rL   r   rT   rN   ÚdenserP   rQ   ÚDropoutÚhidden_dropout_probÚdropoutrX   s     €r9   rL   zBridgeTowerSelfOutput.__init__Y  s`   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
ÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÜ—z‘z &×"<Ñ"<Ó=ˆ�r8   r-   Úinput_tensorr¡   c                 ór   — | j                  |«      }| j                  |«      }| j                  ||z   «      }|S rh   ©rî   rñ   rP   ©rY   r-   rò   s      r9   rl   zBridgeTowerSelfOutput.forward_  ó7   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØŸ™ }°|Ñ'CÓDˆØÐr8   r   ro   s   @r9   rì   rì   X  ó1   ø„ ô>ð U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r8   rì   c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )ÚBridgeTowerIntermediatec                 ó  •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        |j                  t        «      rt        |j                     | _        y |j                  | _        y rh   )rK   rL   r   rT   rN   Úintermediate_sizerî   Ú
isinstanceÚ
hidden_actÚstrr
   Úintermediate_act_fnrX   s     €r9   rL   z BridgeTowerIntermediate.__init__h  s]   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3KÑ3KÓLˆŒ
Ü�f×'Ñ'¬Ô-Ü'-¨f×.?Ñ.?Ñ'@ˆDÕ$à'-×'8Ñ'8ˆDÕ$r8   r-   r¡   c                 óJ   — | j                  |«      }| j                  |«      }|S rh   )rî   rÿ   ©rY   r-   s     r9   rl   zBridgeTowerIntermediate.forwardp  s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆØÐr8   r   ro   s   @r9   rù   rù   g  s#   ø„ ô9ð U§\¡\ð °e·l±l÷ r8   rù   c                   ón   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  dej
                  fd„Zˆ xZS )ÚBridgeTowerOutputc                 ó(  •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        j                  |j
                  |j                  ¬«      | _        t        j                  |j                  «      | _        y rË   )rK   rL   r   rT   rû   rN   rî   rP   rQ   rï   rð   rñ   rX   s     €r9   rL   zBridgeTowerOutput.__init__x  s`   ø€ Ü‰ÑÔÜ—Y‘Y˜v×7Ñ7¸×9KÑ9KÓLˆŒ
ÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÜ—z‘z &×"<Ñ"<Ó=ˆ�r8   r-   rò   r¡   c                 ór   — | j                  |«      }| j                  |«      }| j                  ||z   «      }|S rh   rô   rõ   s      r9   rl   zBridgeTowerOutput.forward~  rö   r8   r   ro   s   @r9   r  r  w  r÷   r8   r  c                   óV   ‡ — e Zd Zˆ fd„Zdej
                  dej
                  fd„Zˆ xZS )ÚBridgeTowerPoolerc                 ó²   •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        j                  «       | _        y rh   )rK   rL   r   rT   rN   rî   ÚTanhÚ
activationrX   s     €r9   rL   zBridgeTowerPooler.__init__‡  s9   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
ÜŸ'™'›)ˆ�r8   r-   r¡   c                 ó\   — |d d …df   }| j                  |«      }| j                  |«      }|S )Nr   )rî   r
  )rY   r-   Úfirst_token_tensorÚpooled_outputs       r9   rl   zBridgeTowerPooler.forwardŒ  s6   € ð +ª1¨a¨4Ñ0ÐØŸ
™
Ð#5Ó6ˆØŸ™¨Ó6ˆØÐr8   r   ro   s   @r9   r  r  †  s#   ø„ ô$ð
 U§\¡\ð °e·l±l÷ r8   r  ÚmoduleÚqueryÚkeyÚvaluer]   Úscalingrñ   Úkwargsc                 óœ  — |€|j                  d«      dz  }t        j                  ||j                  dd«      «      |z  }|�||z   }t        j
                  j                  |d¬«      }t        j
                  j                  ||| j                  ¬«      }t        j                  ||«      }	|	j                  dd«      j                  «       }	|	|fS )Nr‹   ç      à¿rˆ   r   r¨   )ÚpÚtrainingr"   )
r¥   r3   ÚmatmulrÁ   r   r±   Úsoftmaxrñ   r  Ú
contiguous)
r  r  r  r  r]   r  rñ   r  Úattn_weightsÚattn_outputs
             r9   Úeager_attention_forwardr  –  s»   € ð €Ø—*‘*˜R“. DÑ(ˆô —<‘<  s§}¡}°Q¸Ó':Ó;¸gÑE€LàÐ!Ø# nÑ4ˆä—=‘=×(Ñ(¨¸2Ð(Ó>€LÜ—=‘=×(Ñ(¨¸È6Ï?É?Ð(Ó[€Lä—,‘,˜|¨UÓ3€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€Kà˜Ð$Ð$r8   c                   ó–   ‡ — e Zd Zd	ˆ fd„	Z	 	 d
dej
                  dej                  dz  dedz  dee	   de
ej
                     f
d„Zˆ xZS )ÚBridgeTowerSelfAttentionNc                 ó@  •— t         ‰| �  «        |j                  |j                  z  dk7  r2t	        |d«      s&t        d|j                  › d|j                  › d�«      ‚|| _        |j                  | _        t        |j                  |j                  z  «      | _        | j                  | j                  z  | _	        | j                  dz  | _
        t        j                  |j                  | j                  «      | _        t        j                  |j                  | j                  «      | _        t        j                  |j                  | j                  «      | _        t        j                   |j"                  «      | _        |j&                  | _        || _        || _        y ©Nr   Úembedding_sizezThe hidden size (z6) is not a multiple of the number of attention heads (ú)r  )rK   rL   rN   Únum_attention_headsÚhasattrr¿   rZ   rÇ   Úattention_head_sizeÚall_head_sizer  r   rT   r  r  r  rï   Úattention_probs_dropout_probrñ   Ú
is_decoderÚ	is_causalÚ	layer_idx©rY   rZ   r*  r+  r[   s       €r9   rL   z!BridgeTowerSelfAttention.__init__´  sP  ø€ Ü‰ÑÔØ×Ñ × :Ñ :Ñ:¸aÒ?ÌÐPVÐXhÔHiÜØ# F×$6Ñ$6Ð#7ð 8Ø ×4Ñ4Ð5°Qð8óð ð ˆŒà#)×#=Ñ#=ˆÔ Ü#& v×'9Ñ'9¸F×<VÑ<VÑ'VÓ#WˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔØ×/Ñ/°Ñ5ˆŒä—Y‘Y˜v×1Ñ1°4×3EÑ3EÓFˆŒ
Ü—9‘9˜V×/Ñ/°×1CÑ1CÓDˆŒÜ—Y‘Y˜v×1Ñ1°4×3EÑ3EÓFˆŒ
ä—z‘z &×"EÑ"EÓFˆŒà ×+Ñ+ˆŒØ"ˆŒØ"ˆ�r8   r-   r]   Úpast_key_valuesr  r¡   c                 ó   — |j                   d d }g |¢d‘| j                  ‘­} | j                  |«      j                  |Ž j	                  dd«      } | j                  |«      j                  |Ž j	                  dd«      } | j                  |«      j                  |Ž j	                  dd«      }	|�>|}
t        |t        «      r|j                  }
|
j                  ||	| j                  «      \  }}	t        j                  | j                  j                  t         «      } || |||	|f| j"                  sdn| j$                  j&                  | j(                  dœ|¤Ž\  }} |j*                  g |¢d‘­Ž j-                  «       }||fS )Nr‹   r"   rˆ   ç        ©rñ   r  )rª   r&  r  r³   rÁ   r  r  rü   r   Úself_attention_cacheÚupdater+  r   Úget_interfacerZ   Ú_attn_implementationr  r  rñ   r  r  r¯   r  )rY   r-   r]   r-  r  Úinput_shapeÚhidden_shapeÚquery_layerÚ	key_layerÚvalue_layerÚcurrent_past_key_valuesÚattention_interfacer  r  s                 r9   rl   z BridgeTowerSelfAttention.forwardÌ  s�  € ð $×)Ñ)¨#¨2Ð.ˆØC˜ÐC bÐC¨$×*BÑ*BÑCˆð 5�d—j‘j Ó/×4Ñ4°lÐC×MÑMÈaÐQRÓSˆØ0�D—H‘H˜]Ó+×0Ñ0°,Ð?×IÑIÈ!ÈQÓOˆ	Ø4�d—j‘j Ó/×4Ñ4°lÐC×MÑMÈaÐQRÓSˆàÐ&à&5Ð#Ü˜/Ô+>Ô?Ø*9×*NÑ*NÐ'ð &=×%CÑ%CÀIÈ{Ð\`×\jÑ\jÓ%kÑ"ˆI�{ä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØð	%
ð  $Ÿ}š}‘C°$·,±,·.±.Ø—L‘Lñ	%
ð ñ	%
Ñ!ˆ�\ð *�k×)Ñ)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ˜LÐ(Ð(r8   ©FN)NN©r/   r0   r1   rL   r3   rm   r4   r   r   r   r6   rl   rn   ro   s   @r9   r  r  ³  sg   ø„ õ#ð6 48Ø(,ñ	')à—|‘|ð')ð ×)Ñ)¨DÑ0ð')ð  ™ð	')ð
 Ð+Ñ,ð')ð 
ˆu�|‰|Ñ	÷')r8   r  c                   ó¶   ‡ — e Zd Zd
ˆ fd„	Z	 	 	 ddej
                  dej                  dz  dej                  dz  dedz  dee	   de
ej
                     fd	„Zˆ xZS )ÚBridgeTowerCrossAttentionNc                 ó  •— t         ‰| �  «        |j                  |j                  z  dk7  r2t	        |d«      s&t        d|j                  › d|j                  › d�«      ‚|| _        |j                  | _        t        |j                  |j                  z  «      | _        | j                  | j                  z  | _	        | j                  dz  | _
        t        j                  |j                  | j                  «      | _        t        j                  |j                  | j                  «      | _        t        j                  |j                  | j                  «      | _        t        j                   |j"                  «      | _        || _        || _        y r!  )rK   rL   rN   r$  r%  r¿   rZ   rÇ   r&  r'  r  r   rT   r  r  r  rï   r(  rñ   r*  r+  r,  s       €r9   rL   z"BridgeTowerCrossAttention.__init__ø  sC  ø€ Ü‰ÑÔØ×Ñ × :Ñ :Ñ:¸aÒ?ÌÐPVÐXhÔHiÜØ# F×$6Ñ$6Ð#7ð 8Ø ×4Ñ4Ð5°Qð8óð ð ˆŒà#)×#=Ñ#=ˆÔ Ü#& v×'9Ñ'9¸F×<VÑ<VÑ'VÓ#WˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔØ×/Ñ/°Ñ5ˆŒä—Y‘Y˜v×1Ñ1°4×3EÑ3EÓFˆŒ
Ü—9‘9˜V×/Ñ/°×1CÑ1CÓDˆŒÜ—Y‘Y˜v×1Ñ1°4×3EÑ3EÓFˆŒ
ä—z‘z &×"EÑ"EÓFˆŒà"ˆŒØ"ˆ�r8   r-   Úencoder_hidden_statesr]   r-  r  r¡   c                 óf  — |j                   d d }g |¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }|�%|j
                  j                  | j                  «      nd}	|�]|	r[|j                  j                  | j                     j                  }
|j                  j                  | j                     j                  }nÅg |j                   d d ¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }
| j                  |«      j                  |«      j	                  dd«      }|�C|j                  j                  |
|| j                  «      \  }
}d|j
                  | j                  <   t        j                   | j"                  j$                  t&        «      } || ||
||f| j(                  sdn| j*                  j,                  | j.                  dœ|¤Ž\  }} |j0                  g |¢d‘­Ž j3                  «       }||fS )Nr‹   r"   rˆ   FTr/  r0  )rª   r&  r  r³   rÁ   Ú
is_updatedÚgetr+  Úcross_attention_cacheÚlayersÚkeysri   r  r  r2  r   r3  rZ   r4  r  r  rñ   r  r  r¯   r  )rY   r-   rA  r]   r-  r  r5  r6  r7  rC  r8  r9  Úkv_shaper;  r  r  s                   r9   rl   z!BridgeTowerCrossAttention.forward  s  € ð $×)Ñ)¨#¨2Ð.ˆàC˜ÐC bÐC¨$×*BÑ*BÑCˆð —j‘j Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆàGVÐGb�_×/Ñ/×3Ñ3°D·N±NÔCÐhmˆ
ØÐ&©:à'×=Ñ=×DÑDÀTÇ^Á^ÑT×YÑYˆIØ)×?Ñ?×FÑFÀtÇ~Á~ÑV×]Ñ]‰KàXÐ.×4Ñ4°S°bÐ9ÐX¸2ÐX¸t×?WÑ?WÑXˆHØŸ™Ð!6Ó7×<Ñ<¸XÓF×PÑPÐQRÐTUÓVˆIØŸ*™*Ð%:Ó;×@Ñ@ÀÓJ×TÑTÐUVÐXYÓZˆKàÐ*à)8×)NÑ)N×)UÑ)UØ˜{¨D¯N©Nó*Ñ&�	˜;ð >B�×*Ñ*¨4¯>©>Ñ:ä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ %8ØØØØØð	%
ð  $Ÿ}š}‘C°$·,±,·.±.Ø—L‘Lñ	%
ð ñ	%
Ñ!ˆ�\ð *�k×)Ñ)Ð;¨;Ð;¸Ò;×FÑFÓHˆØ˜LÐ(Ð(r8   r<  ©NNN)r/   r0   r1   rL   r3   rm   r4   r   r   r   r6   rl   rn   ro   s   @r9   r?  r?  ÷  s€   ø„ õ#ð4 ;?Ø37Ø6:ñ1)à—|‘|ð1)ð  %×0Ñ0°4Ñ7ð1)ð ×)Ñ)¨DÑ0ð	1)ð
 -¨tÑ3ð1)ð Ð+Ñ,ð1)ð 
ˆu�|‰|Ñ	÷1)r8   r?  c                   óÖ   ‡ — e Zd Zdˆ fd„	Z	 	 	 	 ddej
                  dej                  dz  dej                  dz  dej                  dz  dedz  dee	   d	e
ej
                     fd
„Zˆ xZS )ÚBridgeTowerAttentionNc                 óŒ   •— t         ‰| �  «        || _        |rt        nt        } ||||¬«      | _        t        |«      | _        y )N©r*  r+  )rK   rL   Úis_cross_attentionr?  r  rY   rì   Úoutput)rY   rZ   r*  r+  rN  Úattention_classr[   s         €r9   rL   zBridgeTowerAttention.__init__E  s=   ø€ Ü‰ÑÔØ"4ˆÔÙ7IÕ3ÔOgˆÙ# F°iÈ9ÔUˆŒ	Ü+¨FÓ3ˆ�r8   r-   r]   rA  Úencoder_attention_maskr-  r  r¡   c                 ó‚   — | j                   s|n|} | j                  |f|||dœ|¤Ž\  }}| j                  ||«      }||fS )N)rA  r]   r-  )rN  rY   rO  )	rY   r-   r]   rA  rQ  r-  r  Úattention_outputr  s	            r9   rl   zBridgeTowerAttention.forwardL  sd   € ð 04×/FÒ/F™ÐLbˆØ)2¨¯©Øð*
à"7Ø)Ø+ñ	*
ð
 ñ*
Ñ&Ð˜,ð  Ÿ;™;Ð'7¸ÓGÐØ Ð-Ð-r8   )FNF©NNNNr=  ro   s   @r9   rK  rK  D  s—   ø„ õ4ð 48Ø:>Ø;?Ø(,ñ.à—|‘|ð.ð ×)Ñ)¨DÑ0ð.ð  %×0Ñ0°4Ñ7ð	.ð
 !&× 1Ñ 1°DÑ 8ð.ð  ™ð.ð Ð+Ñ,ð.ð 
ˆu�|‰|Ñ	÷.r8   rK  c                   ó@   ‡ — e Zd Zdˆ fd„	Z	 	 	 ddee   fd„Zd„ Zˆ xZS )ÚBridgeTowerBertCrossLayerc                 ó$  •— t         ‰| �  «        |j                  | _        d| _        t	        |d|¬«      | _        |j                  | _        |j                  | _        t	        |d|d¬«      | _        t        |«      | _
        t        |«      | _        y )Nr"   TrM  F©r*  r+  rN  )rK   rL   Úchunk_size_feed_forwardÚseq_len_dimrK  rf   r)  Úadd_cross_attentionÚcrossattentionrù   Úintermediater  rO  ©rY   rZ   r+  r[   s      €r9   rL   z"BridgeTowerBertCrossLayer.__init__b  s„   ø€ Ü‰ÑÔØ'-×'EÑ'EˆÔ$ØˆÔÜ-¨fÀÐPYÔZˆŒØ ×+Ñ+ˆŒØ#)×#=Ñ#=ˆÔ Ü2ØØØØ#ô	
ˆÔô 4°FÓ;ˆÔÜ'¨Ó/ˆ�r8   r  c                 óÔ   —  | j                   |f|d dœ|¤Ž\  }}|}	 | j                  |	f||||dœ|¤Ž\  }
}|
}	t        | j                  | j                  | j
                  |	«      }|||fS )N)r]   r-  )r]   rA  rQ  r-  )rf   r\  r   Úfeed_forward_chunkrY  rZ  )rY   r-   rA  r]   rQ  r-  r  Úself_attention_outputÚself_attn_weightsrS  Úcross_attention_outputÚcross_attn_weightsÚlayer_outputs                r9   rl   z!BridgeTowerBertCrossLayer.forwardr  s¶   € ð 4B°4·>±>Øð4
à)Ø ñ4
ð ñ	4
Ñ0ÐÐ0ð 1Ðà5H°T×5HÑ5HØð6
à)Ø"7Ø#9Ø+ñ6
ð ñ6
Ñ2ÐÐ 2ð 2Ðä0Ø×#Ñ# T×%AÑ%AÀ4×CSÑCSÐUeó
ˆð ØØð
ð 	
r8   c                 óL   — | j                  |«      }| j                  ||«      }|S rh   ©r]  rO  ©rY   rS  Úintermediate_outputre  s       r9   r`  z,BridgeTowerBertCrossLayer.feed_forward_chunk–  ó,   € Ø"×/Ñ/Ð0@ÓAÐØ—{‘{Ð#6Ð8HÓIˆØÐr8   rh   rI  )	r/   r0   r1   rL   r   r   rl   r`  rn   ro   s   @r9   rV  rV  a  s.   ø„ õ0ð( Ø#Øñ"
ð Ð+Ñ,ó"
öHr8   rV  c                   óÖ   ‡ — e Zd Zdˆ fd„	Z	 	 	 	 ddej
                  dej                  dz  dej                  dz  dej                  dz  dedz  dee	   d	ej
                  fd
„Z
d„ Zˆ xZS )ÚBridgeTowerTextLayerNc                 ó„  •— t         ‰| �  «        |j                  | _        d| _        t	        ||j
                  |¬«      | _        |j
                  | _        |j                  | _        | j                  r.| j
                  st        | › d�«      ‚t	        |d|d¬«      | _	        t        |«      | _        t        |«      | _        y )Nr"   rM  z> should be used as a decoder model if cross attention is addedFTrX  )rK   rL   rY  rZ  rK  r)  rf   r[  r¿   r\  rù   r]  r  rO  r^  s      €r9   rL   zBridgeTowerTextLayer.__init__�  s­   ø€ Ü‰ÑÔØ'-×'EÑ'EˆÔ$ØˆÔÜ-¨fÀ×@QÑ@QÐ]fÔgˆŒØ ×+Ñ+ˆŒØ#)×#=Ñ#=ˆÔ Ø×#Ò#Ø—?’?Ü  D 6Ð)gÐ!hÓiÐiÜ"6ØØØ#Ø#'ô	#ˆDÔô 4°FÓ;ˆÔÜ'¨Ó/ˆ�r8   r-   r]   rA  rQ  r-  r  r¡   c                 ó   —  | j                   ||fd|i|¤Ž\  }}|}	| j                  r:|�8t        | d«      st        d| › d�«      ‚ | j                  |d ||fd|i|¤Ž\  }
}|
}	t        | j                  | j                  | j                  |	«      }|S )Nr-  r\  z'If `encoder_hidden_states` are passed, z` has to be instantiated with cross-attention layers by setting `config.add_cross_attention=True`)	rf   r)  r%  r¿   r\  r   r`  rY  rZ  )rY   r-   r]   rA  rQ  r-  r  ra  rz   rS  rc  re  s               r9   rl   zBridgeTowerTextLayer.forward±  så   € ð $2 4§>¡>ØØñ$
ð ,ð$
ð ñ	$
Ñ Ð˜qð 1Ðà�?Š?Ð4Ð@Ü˜4Ð!1Ô2Ü Ø=¸d¸Vð DDð Dóð ð
 )<¨×(;Ñ(;Ø%ØØ%Ø&ñ	)ð
 !0ð)ð ñ)Ñ%Ð" Að  6Ðä0Ø×#Ñ# T×%AÑ%AÀ4×CSÑCSÐUeó
ˆð Ðr8   c                 óL   — | j                  |«      }| j                  ||«      }|S rh   rg  rh  s       r9   r`  z'BridgeTowerTextLayer.feed_forward_chunkØ  rj  r8   rh   rT  )r/   r0   r1   rL   r3   rm   r4   r   r   r   rl   r`  rn   ro   s   @r9   rl  rl  œ  s˜   ø„ õ0ð. 48Ø:>Ø;?Ø(,ñ%à—|‘|ð%ð ×)Ñ)¨DÑ0ð%ð  %×0Ñ0°4Ñ7ð	%ð
 !&× 1Ñ 1°DÑ 8ð%ð  ™ð%ð Ð+Ñ,ð%ð 
�‰ó%öNr8   rl  c                   óÆ   ‡ — e Zd Zˆ fd„Z	 	 	 	 	 ddej
                  dej                  dz  dej                  dz  dej                  dz  dedz  dedz  d	e	e
   d
efd„Zˆ xZS )ÚBridgeTowerTextEncoderc           	      óÆ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        ||¬«      ‘Œ c}«      | _        y c c}w )N©r+  )	rK   rL   rZ   r   ru   rv   rs   rl  rk   )rY   rZ   Úir[   s      €r9   rL   zBridgeTowerTextEncoder.__init__à  sI   ø€ Ü‰ÑÔØˆŒÜ—]‘]Ü@EÀf×F^ÑF^Ó@_Ö`¸1Ô! &°AÖ6Ò`ó
ˆ�
ùÚ`s   ½ANr-   r]   rA  rQ  r-  Ú	use_cacher  r¡   c                 ól   — | j                   D ]  } ||||f||dœ|¤Ž}Œ t        ||r|¬«      S d ¬«      S )N)rQ  r-  )Úlast_hidden_stater-  )rk   r   )	rY   r-   r]   rA  rQ  r-  ru  r  Úlayer_modules	            r9   rl   zBridgeTowerTextEncoder.forwardç  se   € ð !ŸJ™Jò 	ˆLÙ(ØØØ%ðð (>Ø /ñð ñ‰Mð	ô 9Ø+Ù/8˜Oô
ð 	
à>Bô
ð 	
r8   )NNNNN)r/   r0   r1   rL   r3   rm   r4   r   re   r   r   r   rl   rn   ro   s   @r9   rq  rq  ß  sŸ   ø„ ô
ð 48Ø:>Ø;?Ø(,Ø!%ñ
à—|‘|ð
ð ×)Ñ)¨DÑ0ð
ð  %×0Ñ0°4Ñ7ð	
ð
 !&× 1Ñ 1°DÑ 8ð
ð  ™ð
ð ˜$‘;ð
ð Ð+Ñ,ð
ð 
3÷
r8   rq  c                   óì   ‡ — e Zd ZdZˆ fd„Z	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  ded	ej                  fd
„Z
ed„ «       Zedd„«       Zˆ xZS )ÚBridgeTowerTextEmbeddingszGConstruct the embeddings from word, position and token_type embeddings.c                 óT  •— t         ‰| �  «        t        j                  |j                  |j
                  |j                  ¬«      | _        t        j                  |j                  |j
                  «      | _	        t        j                  |j
                  |j                  ¬«      | _
        t        j                  |j                  «      | _        | j                  dt!        j"                  |j$                  «      j'                  d«      d¬«       | j                  dt!        j(                  | j*                  j-                  «       t         j.                  ¬«      d¬«       |j                  | _        t        j                  |j$                  |j
                  | j0                  ¬«      | _        y )	N)Úpadding_idxrE   r‰   rŠ   FrŒ   Útoken_type_idsr¾   )rK   rL   r   r™   Ú
vocab_sizerN   Úpad_token_idÚword_embeddingsÚtype_vocab_sizeÚtoken_type_embeddingsrP   rQ   rï   rð   rñ   r›   r3   rœ   Úmax_position_embeddingsr�   Úzerosr‰   r¥   Úlongr|  Úposition_embeddingsrX   s     €r9   rL   z"BridgeTowerTextEmbeddings.__init__  s4  ø€ Ü‰ÑÔÜ!Ÿ|™|¨F×,=Ñ,=¸v×?QÑ?QÐ_e×_rÑ_rÔsˆÔÜ%'§\¡\°&×2HÑ2HÈ&×J\ÑJ\Ó%]ˆÔ"äŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÜ—z‘z &×"<Ñ"<Ó=ˆŒà×ÑØœEŸL™L¨×)GÑ)GÓH×OÑOÐPWÓXÐejð 	ô 	
ð 	×ÑØœeŸk™k¨$×*;Ñ*;×*@Ñ*@Ó*BÌ%Ï*É*ÔUÐbgð 	ô 	
ð "×.Ñ.ˆÔÜ#%§<¡<Ø×*Ñ*¨F×,>Ñ,>ÈD×L\ÑL\ô$
ˆÕ r8   NÚ	input_idsr}  r‰   Úinputs_embedsÚpast_key_values_lengthr¡   c                 ó  — |€<|�| j                  || j                  |«      }n| j                  || j                  «      }|�|j                  «       }n|j                  «       d d }|\  }}|€³t	        | d«      rm| j
                  j                  |j                  «      j                  |j                  d   d«      }	t        j                  |	d|¬«      }	|	j                  ||«      }n:t        j                  |t        j                  | j                  j                  ¬«      }|€| j                  |«      }| j!                  |«      }
||
z   }| j#                  |«      }||z   }| j%                  |«      }| j'                  |«      }|S )Nr‹   r}  r   r"   )r©   Úindexr_   )Ú"create_position_ids_from_input_idsr|  Ú&create_position_ids_from_inputs_embedsr¥   r%  r}  rd   ra   r�   rª   r3   Úgatherr„  r…  r‰   r€  r‚  r†  rP   rñ   )rY   r‡  r}  r‰   rˆ  r‰  r5  rÂ   Ú
seq_lengthÚbuffered_token_type_idsr‚  rž   r†  s                r9   rl   z!BridgeTowerTextEmbeddings.forward  s€  € ð ÐØÐ$à#×FÑFØ˜t×/Ñ/Ð1Gó ‘ð  $×JÑJÈ=ÐZ^×ZjÑZjÓk�àÐ Ø#Ÿ.™.Ó*‰Kà'×,Ñ,Ó.¨s°Ð3ˆKà!,Ñˆ
�Jð
 Ð!Ü�tÐ-Ô.à*.×*=Ñ*=×*@Ñ*@À×ATÑATÓ*U×*\Ñ*\Ð]i×]oÑ]oÐpqÑ]rÐtvÓ*wÐ'Ü*/¯,©,Ð7NÐTUÐ]iÔ*jÐ'Ø!8×!?Ñ!?À
ÈJÓ!W‘ä!&§¡¨[ÄÇ
Á
ÐSW×SdÑSd×SkÑSkÔ!l�àÐ Ø ×0Ñ0°Ó;ˆMØ $× :Ñ :¸>Ó JÐØ"Ð%:Ñ:ˆ
à"×6Ñ6°|ÓDÐØÐ"5Ñ5ˆ
à—^‘^ JÓ/ˆ
Ø—\‘\ *Ó-ˆ
ØÐr8   c                 óæ   — | j                  «       dd }|d   }t        j                  |dz   ||z   dz   t        j                  | j                  ¬«      }|j                  d«      j                  |«      S )z×
        We are provided embeddings directly. We cannot infer which are padded so just generate sequential position ids.

        Args:
            inputs_embeds: torch.Tensor

        Returns: torch.Tensor
        Nr‹   r"   r_   r   )r¥   r3   rœ   r…  ra   r¬   r�   )rˆ  r|  r5  Úsequence_lengthr‰   s        r9   r�  z@BridgeTowerTextEmbeddings.create_position_ids_from_inputs_embedsI  sp   € ð $×(Ñ(Ó*¨3¨BÐ/ˆØ% a™.ˆä—|‘|Ø˜!‰O˜_¨{Ñ:¸QÑ>ÄeÇjÁjÐYf×YmÑYmô
ˆð ×%Ñ% aÓ(×/Ñ/°Ó<Ð<r8   c                 ó¾   — | j                  |«      j                  «       }t        j                  |d¬«      j	                  |«      |z   |z  }|j                  «       |z   S )a  
        Replace non-padding symbols with their position numbers. Position numbers begin at padding_idx+1. Padding symbols
        are ignored. This is modified from fairseq's `utils.make_positions`.

        Args:
            x: torch.Tensor x:

        Returns: torch.Tensor
        r"   r¨   )ÚnerÇ   r3   ÚcumsumÚtype_asr…  )r‡  r|  r‰  ÚmaskÚincremental_indicess        r9   rŒ  z<BridgeTowerTextEmbeddings.create_position_ids_from_input_ids[  sW   € ð �|‰|˜KÓ(×,Ñ,Ó.ˆÜ$Ÿ|™|¨D°aÔ8×@Ñ@ÀÓFÐI_Ñ_ÐcgÑgÐØ"×'Ñ'Ó)¨KÑ7Ð7r8   )NNNNr   )r   )r/   r0   r1   r2   rL   r3   Ú
LongTensorr4   rÇ   rm   rl   Ústaticmethodr�  rŒ  rn   ro   s   @r9   rz  rz    s´   ø„ ÙQô
ð, .2Ø26Ø04Ø26Ø&'ñ.à×#Ñ# dÑ*ð.ð ×(Ñ(¨4Ñ/ð.ð ×&Ñ&¨Ñ-ð	.ð
 ×(Ñ(¨4Ñ/ð.ð !$ð.ð 
�‰ó.ð` ñ=ó ð=ð" ò8ó ô8r8   rz  c                   ó’   ‡ — e Zd ZU eed<   dZdZdZddgZdgZ	e
eedœZ ej                  «       d	ej"                  fˆ fd
„«       Zˆ xZS )ÚBridgeTowerPreTrainedModelrZ   Úbridgetower)ÚimageÚtextFr  rB   r-  )r-   r.   Úcross_attentionsr  c                 óþ  •— t         ‰| �  |«       | j                  j                  }t	        |t
        «      �rï| j                  j                  dz  d| j                  j                  z  dz  z  }| j                  j                  dz  }d| j                  j                  z  dz  }|j                  j                  D �]  }t        j                  |j                  j                  ||z  ¬«       t        j                  |j                  j                  «       t        j                  |j                  j                   j"                  ||z  ¬«       t        j                  |j$                  j&                  j"                  ||z  ¬«       t        j                  |j$                  j(                  j"                  ||z  ¬«       �Œ t        j                  |j*                  j,                  ||z  ¬«       t        j                  |j*                  j.                  j"                  ||z  ¬«       �nŠt	        |t0        j2                  t0        j4                  t0        j6                  f«      r't        j                  |j"                  dd|z  ¬«       �n*t	        |t8        «      r5t        j:                  |j<                  | j                  j>                  «       nåt	        |t@        «      rMt        jB                  |jD                  tG        jH                  |jJ                  «      jM                  d«      «       nˆt	        |tN        «      rxt        jB                  |jD                  tG        jH                  |jD                  jP                  d   «      jM                  d«      «       t        j                  |jR                  «       t	        |t0        j2                  tT        f«      r-|jV                  � t        j                  |jV                  «       y y y )	Nr  rˆ   )Ústdr/  gš™™™™™©?)Úmeanr¢  rŠ   r‹   ),rK   Ú_init_weightsrZ   Úinitializer_factorrü   rÉ   rN   rs   rÍ   rw   ÚinitÚnormal_rO   Úin_proj_weightÚzeros_Úin_proj_biasÚout_projr«   rU   rG   rJ   rž   r“   rš   r   rT   r”   r™   Ú!BridgeTowerForContrastiveLearningÚ	constant_Úlogit_scaleÚlogit_scale_init_valuer�   Úcopy_r‰   r3   rœ   r˜   r�   rz  rª   r}  ÚBridgeTowerMLMHeadr‡   )rY   r  r¢  Úproj_stdÚattn_stdÚfc_stdr~   r[   s          €r9   r¤  z(BridgeTowerPreTrainedModel._init_weightsz  s¤  ø€ ä‰Ñ˜fÔ%Ø�k‰k×,Ñ,ˆÜ�fÔ:Õ;ØŸ™×/Ñ/°Ñ5¸1¸t¿{¹{×?\Ñ?\Ñ;\ÐaeÑ:eÑfˆHØ—{‘{×.Ñ.°Ñ4ˆHØ˜$Ÿ+™+×1Ñ1Ñ1°dÑ:ˆFØ×+Ñ+×5Ñ5ó J�Ü—‘˜UŸZ™Z×6Ñ6¸HÀs¹NÕKÜ—‘˜EŸJ™J×3Ñ3Ô4Ü—‘˜UŸZ™Z×0Ñ0×7Ñ7¸XÈ¹^ÕLÜ—‘˜UŸY™YŸ^™^×2Ñ2¸À¹ÕEÜ—‘˜UŸY™Y×-Ñ-×4Ñ4¸(ÀS¹.×IðJô �L‰L˜×*Ñ*×:Ñ:ÀÈ3ÁÕOÜ�L‰L˜×*Ñ*×=Ñ=×DÑDÈ(ÐUXÉ.×YÜ˜¤§¡¬B¯I©I´r·|±|Ð DÔEÜ�L‰L˜Ÿ™¨S°d¸S±j×AÜ˜Ô AÔBÜ�N‰N˜6×-Ñ-¨t¯{©{×/QÑ/QÕRÜ˜Ô ;Ô<Ü�J‰J�v×*Ñ*¬E¯L©L¸×9MÑ9MÓ,N×,UÑ,UÐV]Ó,^Õ_Ü˜Ô 9Ô:Ü�J‰J�v×*Ñ*¬E¯L©L¸×9LÑ9L×9RÑ9RÐSUÑ9VÓ,W×,^Ñ,^Ð_fÓ,gÔhÜ�K‰K˜×-Ñ-Ô.ä�fœrŸy™yÔ*<Ð=Ô>À6Ç;Á;ÐCZÜ�K‰K˜Ÿ™Õ$ð D[Ð>r8   )r/   r0   r1   r#   r5   Úbase_model_prefixÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_skip_keys_device_placementrl  r  r?  Ú_can_record_outputsr3   Úno_gradr   ÚModuler¤  rn   ro   s   @r9   rœ  rœ  l  sh   ø… àÓØ%ÐØ(ÐØ&+Ð#Ø3Ð5SÐTÐØ#4Ð"5Ðà-Ø.Ø5ñÐð €U‡]�]ƒ_ð% B§I¡Iô %ó ô%r8   rœ  c                   óF   ‡ — e Zd ZU eed<   dZˆ fd„Zed„ «       Zdd„Z	ˆ xZ
S )ÚBridgeTowerVisionModelrZ   )rž  c                 ód   •— t         ‰| �  |«       t        |«      | _        | j	                  «        y rh   )rK   rL   rÉ   ÚvisualÚ	post_initrX   s     €r9   rL   zBridgeTowerVisionModel.__init__�  s&   ø€ Ü‰Ñ˜Ô Ü2°6Ó:ˆŒØ�‰Õr8   c                 ój   — | j                   j                  j                  j                  j                  S rh   )rÀ  rž   r–   r«   r`   ©rY   s    r9   r`   zBridgeTowerVisionModel.dtype¢  s$   € à�{‰{×%Ñ%×5Ñ5×<Ñ<×BÑBÐBr8   c                 óZ   — | j                  |j                  | j                  «      ||«      S rh   )rÀ  Útyper`   )rY   rž  Ú
image_maskrº   r  s        r9   rl   zBridgeTowerVisionModel.forward¦  s#   € Ø�{‰{˜5Ÿ:™: d§j¡jÓ1°:Ð?WÓXÐXr8   )NF)r/   r0   r1   r%   r5   r¶  rL   Úpropertyr`   rl   rn   ro   s   @r9   r¾  r¾  ™  s0   ø… Ø#Ó#Ø!Ðôð
 ñCó ðC÷Yr8   r¾  a0  
    The model can behave as an encoder (with only self-attention) as well as a decoder, in which case a layer of
    cross-attention is added between the self-attention layers, following the architecture described in *Attention is
    all you need*_ by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz
    Kaiser and Illia Polosukhin.

    To behave as an decoder the model needs to be initialized with the `is_decoder` argument of the configuration set
    to `True`. To be used in a Seq2Seq model, the model needs to initialized with both `is_decoder` argument and
    `add_cross_attention` set to `True`; an `encoder_hidden_states` is then expected as an input to the forward pass.

    .. _*Attention is all you need*: https://huggingface.co/papers/1706.03762
    c                   óp  ‡ — e Zd ZU eed<   dZdˆ fd„	Zd„ Zd„ Ze	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j                  dz  dedz  dedz  dee   defd„«       «       «       Zd„ Zˆ xZS )ÚBridgeTowerTextModelrZ   )rŸ  c                 óÈ   •— t         ‰| �  |«       || _        d| _        t	        |«      | _        t        |«      | _        |rt        |«      nd| _	        | j                  «        y)zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        FN)rK   rL   rZ   Úgradient_checkpointingrz  rž   rq  Úencoderr  ÚpoolerrÁ  )rY   rZ   Úadd_pooling_layerr[   s      €r9   rL   zBridgeTowerTextModel.__init__¼  sV   ø€ ô
 	‰Ñ˜Ô ØˆŒØ&+ˆÔ#ä3°FÓ;ˆŒÜ-¨fÓ5ˆŒá3DÔ'¨Ô/È$ˆŒð 	�‰Õr8   c                 ó.   — | j                   j                  S rh   ©rž   r€  rÃ  s    r9   Úget_input_embeddingsz)BridgeTowerTextModel.get_input_embeddingsÍ  s   € Ø�‰×.Ñ.Ð.r8   c                 ó&   — || j                   _        y rh   rÐ  ©rY   r  s     r9   Úset_input_embeddingsz)BridgeTowerTextModel.set_input_embeddingsÐ  s   € Ø*/ˆ�‰Õ'r8   Nr‡  r]   r}  r‰   rˆ  rA  rQ  r-  ru  r  r¡   c
           
      óü  — |d u |d uz  rt        d«      ‚| j                  j                  sd}	|	r6|€4t        t	        | j                  ¬«      t	        | j                  ¬«      «      }|�|j                  «       nd}| j                  |||||¬«      }| j                  |||||¬«      \  }} | j                  |f|||||	|dœ|
¤Ž}|d   }| j                  �| j                  |«      nd }t        |||j                  ¬«      S )	Nz:You must specify exactly one of input_ids or inputs_embedsF)rZ   r   )r‡  r‰   r}  rˆ  r‰  )r]   rQ  Úembedding_outputrA  r-  )r]   rA  rQ  r-  ru  r‰   )rw  r,   r-  )r¿   rZ   r)  r   r   Úget_seq_lengthrž   Ú_create_attention_masksrÌ  rÍ  r   r-  )rY   r‡  r]   r}  r‰   rˆ  rA  rQ  r-  ru  r  r‰  rÖ  Úencoder_outputsÚsequence_outputr  s                   r9   rl   zBridgeTowerTextModel.forwardÓ  s=  € ð& ˜Ð -°tÐ";Ò<ÜÐYÓZÐZà�{‰{×%Ò%ØˆIá˜Ð0Ü1´,ÀdÇkÁkÔ2RÔT`Ðhl×hsÑhsÔTtÓuˆOàETÐE` ×!?Ñ!?Ô!AÐfgÐàŸ?™?ØØ%Ø)Ø'Ø#9ð +ó 
Ðð 26×1MÑ1MØ)Ø#9Ø-Ø"7Ø+ð 2Nó 2
Ñ.ˆÐ.ð '˜$Ÿ,™,Øð	
à)Ø"7Ø#9Ø+ØØ%ñ	
ð ñ	
ˆð *¨!Ñ,ˆØ8<¿¹Ð8O˜Ÿ™ OÔ4ÐUYˆä;Ø-Ø'Ø+×;Ñ;ô
ð 	
r8   c                 óÐ   — | j                   j                  rt        | j                   |||¬«      }nt        | j                   ||¬«      }|�t        | j                   |||¬«      }||fS )N)rZ   rˆ  r]   r-  ©rZ   rˆ  r]   )rZ   rˆ  r]   rA  )rZ   r)  r   r   )rY   r]   rQ  rÖ  rA  r-  s         r9   rØ  z,BridgeTowerTextModel._create_attention_masks  su   € ð �;‰;×!Ò!Ü/Ø—{‘{Ø.Ø-Ø /ô	‰Nô 7Ø—{‘{Ø.Ø-ôˆNð "Ð-Ü%>Ø—{‘{Ø.Ø5Ø&;ô	&Ð"ð Ð5Ð5Ð5r8   )T)	NNNNNNNNN)r/   r0   r1   r$   r5   r¶  rL   rÑ  rÔ  r    r!   r   r3   rm   r   re   r   r   r   rl   rØ  rn   ro   s   @r9   rÉ  rÉ  ª  s   ø… ð "Ó!Ø Ðõò"/ò0ð  ØØð *.Ø.2Ø.2Ø,0Ø-1Ø59Ø6:Ø(,Ø!%ñ9
à—<‘< $Ñ&ð9
ð Ÿ™ tÑ+ð9
ð Ÿ™ tÑ+ð	9
ð
 —l‘l TÑ)ð9
ð —|‘| dÑ*ð9
ð  %Ÿ|™|¨dÑ2ð9
ð !&§¡¨tÑ 3ð9
ð  ™ð9
ð ˜$‘;ð9
ð Ð+Ñ,ð9
ð 
6ò9
ó	 ó ó  ð9
öx6r8   rÉ  zv
    The bare BridgeTower Model transformer outputting BridgeTowerModelOutput object without any specific head on
    c                   ó  ‡ — e Zd Zˆ fd„Zd„ Zd„ Zdej                  dedej                  fd„Z	dej                  de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j                  d	z  dej                  d	z  dej                  d	z  ded	z  dej                  d	z  dedee   deej                     ez  fd„«       «       Zd„ Zˆ xZS )ÚBridgeTowerModelc           	      ó¶  •— t         ‰| �  |«       || _        |j                  }|j                  }|j
                  r_t        j                  |j                  |j                  «      | _	        t        j                  |j                  |j                  «      | _
        nÆt        j                  t        |j                  «      D �cg c],  }t        j                  |j                  |j                  «      ‘Œ. c}«      | _	        t        j                  t        |j                  «      D �cg c],  }t        j                  |j                  |j                  «      ‘Œ. c}«      | _
        t        j                  d|j                  «      | _        t!        |«      | _        t%        |«      | _        |j(                  s·|j*                  r«| j"                  j,                  j.                  D ]ˆ  }| j"                  j,                  j0                  j2                  j4                  |j2                  _        | j"                  j,                  j0                  j6                  j4                  |j6                  _        ŒŠ t        j                  t        |j                  «      D �cg c]  }t9        |«      ‘Œ c}«      | _        t        j                  t        |j                  «      D �cg c]  }t9        |«      ‘Œ c}«      | _        t?        |«      | _         t?        |«      | _!        t        jD                  |j                  |jF                  ¬«      | _$        t        jD                  |j                  |jF                  ¬«      | _%        |jL                  r!tO        |«      | _(        tO        |«      | _)        nŽt        j                  t        |j                  dz
  «      D �cg c]  }tO        |«      ‘Œ c}«      | _(        t        j                  t        |j                  dz
  «      D �cg c]  }tO        |«      ‘Œ c}«      | _)        | jU                  «        y c c}w c c}w c c}w c c}w c c}w c c}w )Nrˆ   rE   r"   )+rK   rL   rZ   Úvision_configÚtext_configÚ$share_cross_modal_transformer_layersr   rT   rN   Úcross_modal_text_transformÚcross_modal_image_transformru   rv   rs   r™   r‚  r¾  Úvision_modelrÉ  Ú
text_modelrÏ   Ú"init_layernorm_from_vision_encoderrÀ  Úcross_modal_ln_separaterÎ   r«   Údatar‡   rV  Úcross_modal_image_layersÚcross_modal_text_layersr  Úcross_modal_image_poolerÚcross_modal_text_poolerrP   rQ   Úcross_modal_text_layernormÚcross_modal_image_layernormÚshare_link_tower_layersrÝ   Úcross_modal_text_link_towerÚcross_modal_image_link_towerrÁ  )rY   rZ   rà  rá  rz   rÕ   r[   s         €r9   rL   zBridgeTowerModel.__init__<  s9  ø€ Ü‰Ñ˜Ô ØˆŒØ×,Ñ,ˆØ×(Ñ(ˆà×6Ò6Ü.0¯i©i¸×8OÑ8OÐQW×QcÑQcÓ.dˆDÔ+Ü/1¯y©y¸×9RÑ9RÐTZ×TfÑTfÓ/gˆDÕ,ä.0¯m©mÜQVÐW]×WoÑWoÓQpÖqÈA”—‘˜;×2Ñ2°F×4FÑ4FÕGÒqó/ˆDÔ+ô 02¯}©}ÜSXÐY_×YqÑYqÓSrÖsÈa”—‘˜=×4Ñ4°f×6HÑ6HÕIÒsó0ˆDÔ,ô &(§\¡\°!°V×5GÑ5GÓ%HˆÔ"ä2°=ÓAˆÔä.¨{Ó;ˆŒà×,Ò,°×1ZÒ1ZØ×'Ñ'×.Ñ.×FÑFò J�Ø!%×!2Ñ!2×!9Ñ!9×!AÑ!A×!HÑ!H×!MÑ!M�—	‘	”Ø#×0Ñ0×7Ñ7×?Ñ?×DÑD×IÑI�—‘•ðJô )+¯©Ü=BÀ6×C[ÑC[Ó=\Ö]¸Ô& {Õ3Ò]ó)
ˆÔ%ô (*§}¡}Ü=BÀ6×C[ÑC[Ó=\Ö]¸Ô& {Õ3Ò]ó(
ˆÔ$ô
 ):¸&Ó(AˆÔ%Ü'8¸Ó'@ˆÔ$ô +-¯,©,°v×7IÑ7IÈv×OdÑOdÔ*eˆÔ'Ü+-¯<©<¸×8JÑ8JÐPV×PeÑPeÔ+fˆÔ(à×)Ò)Ü/CÀFÓ/KˆDÔ,Ü0DÀVÓ0LˆDÕ-ä/1¯}©}Ü7<¸V×=UÑ=UÐXYÑ=YÓ7ZÖ[°!Ô% fÕ-Ò[ó0ˆDÔ,ô 13·±Ü7<¸V×=UÑ=UÐXYÑ=YÓ7ZÖ[°!Ô% fÕ-Ò[ó1ˆDÔ-ð 	�‰ÕùòW rùò tùò ^ùò ^ùò  \ùò \s$   Ã1P=Ä$1QÊQËQÏQÐQc                 ó6   — | j                   j                  «       S rh   )ræ  rÑ  rÃ  s    r9   rÑ  z%BridgeTowerModel.get_input_embeddingst  s   € Ø�‰×3Ñ3Ó5Ð5r8   c                 ó:   — | j                   j                  |«       y rh   )ræ  rÔ  rÓ  s     r9   rÔ  z%BridgeTowerModel.set_input_embeddingsw  s   € Ø�‰×,Ñ,¨UÕ3r8   r-   r+  r¡   c                 óz   — | j                   j                  r| j                  |«      S  | j                  |   |«      S rh   )rZ   râ  rã  ©rY   r-   r+  s      r9   Ú_apply_text_transformz&BridgeTowerModel._apply_text_transformz  s8   € Ø�;‰;×;Ò;Ø×2Ñ2°=ÓAÐAØ9ˆt×.Ñ.¨yÑ9¸-ÓHÐHr8   c                 óz   — | j                   j                  r| j                  |«      S  | j                  |   |«      S rh   )rZ   râ  rä  rö  s      r9   Ú_apply_image_transformz'BridgeTowerModel._apply_image_transform  s8   € Ø�;‰;×;Ò;Ø×3Ñ3°MÓBÐBØ:ˆt×/Ñ/°	Ñ:¸=ÓIÐIr8   Nr‡  r]   r}  r»   Ú
pixel_maskrˆ  r?   Úimage_token_type_idxÚlabelsrº   r  c           
      ó4  — g }g }g }g }|�|€t        d«      ‚|xs d}|j                  «       }| j                  j                  |¬«      }|j	                  |«       |€0t        j                  |t
        j                  |j                  ¬«      }t        | j                  |dd…dd…dd…f   |¬«      }t        | j                  j                  j                  «      | j                  j                  z
  dz   }| j                  j                  j                  d| D ]  } |||«      }|j	                  |«       Œ |€K| j                  j                   j#                  |j%                  | j                  j&                  «      |
¬«      }n|j)                  ddd	«      }|j	                  |«       | j                  j                   j*                  j,                  d| D ]  } ||«      }|j	                  |«       Œ | j                  j                   j/                  |j%                  | j                  j&                  «      «      }| j1                  |d¬
«      }| j3                  t        j4                  dt
        j                  |j                  ¬«      «      j7                  |«      }| j9                  ||z   «      }| j;                  |d¬
«      }| j3                  t        j<                  d|t
        j                  |j                  ¬«      «      j7                  |«      }||z   }| j?                  |«      }t        j                  |j                  d«      |j                  d«      ft
        j                  |j                  ¬«      }t        | j                  ||¬«      } | j@                  d   ||||¬«      }|d   } | jB                  d   ||||¬«      }|d   }|j	                  ||f«       |j	                  |d   |d   f«       d} tE        |t        | j                  j                  j                  «      «      D �]�  }! | j                  j                  j                  |!   ||«      } | j                  j                   j*                  j,                  |!   |«      j%                  | j                  j&                  «      }| j;                  | j                  j                   j/                  |«      | dz   «      |z   }| jF                  |    }"| jH                  |    }#| j1                  || dz   «      }$ |"|$|z   ||«      }% |#|||«      }& | j@                  | dz      |%|&||¬«      }|d   } | jB                  | dz      |&|%||¬«      }|d   }| dz  } |j	                  |«       |j	                  |«       |j	                  ||f«       |j	                  |d   |d   f«       �Œ  ||}(}'| jK                  |'|(«      })tM        |'|(|)tO        |«      tO        |«      tO        |«      ftO        |«      ¬«      S )aˆ  
        image_embeds (`torch.FloatTensor` of shape `(batch_size, num_patches, hidden_size)`, *optional*):
            Optionally, instead of passing `pixel_values`, you can choose to directly pass an embedded representation.
            This is useful if you want more control over how to convert `pixel_values` into patch embeddings.
        image_token_type_idx (`int`, *optional*):
            - The token type ids for images.
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels are currently not supported.

        Examples:

        ```python
        >>> from transformers import BridgeTowerProcessor, BridgeTowerModel
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO

        >>> # prepare image and text
        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read()))
        >>> text = "hello world"
        >>> processor = BridgeTowerProcessor.from_pretrained("BridgeTower/bridgetower-base")
        >>> model = BridgeTowerModel.from_pretrained("BridgeTower/bridgetower-base")

        >>> inputs = processor(image, text, return_tensors="pt")
        >>> outputs = model(**inputs)
        >>> outputs.keys()
        odict_keys(['text_features', 'image_features', 'pooler_output'])
        ```NzYBridgeTowerModel does not use `inputs_embeds`.  Make sure to pass in `input_ids` instead.r"   )r‡  r_   r   rÜ  r×   rˆ   rs  ©r"   )r]   rQ  )r*   r+   r,   r-   r.   )(rç   r¥   ræ  rž   r|   r3   Úonesr…  ra   r   rZ   ÚlenrÌ  rk   rs   rå  rÀ  rØ   rÅ  r`   r°   rÍ   rw   rÛ   r÷  r‚  r„  Ú	expand_asrî  rù  Úfullrï  rë  rê  rv   rñ  rò  Úget_cls_featuresr)   r6   )*rY   r‡  r]   r}  r»   rú  rˆ  r?   rû  rü  rº   r  Úall_hidden_states_textÚall_hidden_states_imageÚall_hidden_states_crossÚall_self_attentionsr5  r>   Úextend_text_masksÚsplit_indexrk   r~   Úimage_embeds_with_lnÚcross_modal_textÚtext_token_type_embeddingsÚimage_token_type_embeddingsÚcross_modal_imageÚextend_image_masksÚlayer_outputs_textÚcross_text_featuresÚlayer_outputs_imageÚcross_image_featuresÚlink_layer_indexrt  Útext_link_towerÚimage_link_towerÚtransformed_text_embedsÚcross_text_features_Úcross_image_features_r*   r+   Úcls_featuress*                                             r9   rl   zBridgeTowerModel.forward„  sb  € ð\ "$ÐØ"$ÐØ"$ÐØ ÐàÐ$¨Ð):Ü%Økóð ð  4Ò8°qÐØ—n‘nÓ&ˆØ—o‘o×0Ñ0¸9Ð0ÓEˆØ×%Ñ% kÔ2àÐ!Ü"ŸZ™Z¨¼5¿:¹:Èi×N^ÑN^Ô_ˆNä5Ø—;‘;Ø%¢a¨¨1¨ªa iÑ0Ø)ô
Ðô ˜$Ÿ/™/×1Ñ1×7Ñ7Ó8¸4¿;¹;×;XÑ;XÑXÐ[\Ñ\ˆð —_‘_×,Ñ,×2Ñ2°<°KÐ@ò 	7ˆEÙ Ð->Ó?ˆKØ"×)Ñ)¨+Õ6ð	7ð ÐØ×,Ñ,×3Ñ3×?Ñ?Ø×!Ñ! $×"3Ñ"3×"9Ñ"9Ó:ÐUmð @ó ‰Lð
 (×/Ñ/°°1°aÓ8ˆLà×&Ñ& |Ô4ð ×&Ñ&×-Ñ-×9Ñ9×CÑCÀLÀ[ÐQò 	9ˆEÙ  Ó.ˆLØ#×*Ñ*¨<Õ8ð	9ð  $×0Ñ0×7Ñ7×DÑDÀ\×EVÑEVÐW[×WhÑWh×WnÑWnÓEoÓpÐð  ×5Ñ5°kÈQÐ5ÓOÐà%)×%?Ñ%?Ü�K‰K˜¤§¡°I×4DÑ4DÔEó&
ç
‰)Ð$Ó
%ð 	#ð  ×:Ñ:Ð;KÐNhÑ;hÓiÐà#×:Ñ:Ð;OÐ[\Ð:Ó]ÐØ&*×&@Ñ&@Ü�J‰J�tÐ1¼¿¹ÈI×L\ÑL\Ô]ó'
ç
‰)Ð(Ó
)ð 	$ð  4Ð6QÑQÐØ ×<Ñ<Ð=QÓRÐä—Z‘ZØ×#Ñ# AÓ&Ð(9×(>Ñ(>¸qÓ(AÐBÜ—*‘*Ø×#Ñ#ô
ˆ
ô
 7Ø—;‘;Ø+Ø%ô
Ðð =˜T×9Ñ9¸!Ñ<ØØØ,Ø#5ô	
Ðð 1°Ñ3Ðà>˜d×;Ñ;¸AÑ>ØØØ-Ø#4ô	
Ðð  3°1Ñ5Ðà×&Ñ&Ð(;Ð=QÐ'RÔSà×"Ñ"Ð$6°qÑ$9Ð;NÈqÑ;QÐ#RÔSàÐô �{¤C¨¯©×(?Ñ(?×(EÑ(EÓ$FÓGó -	XˆAØ:˜$Ÿ/™/×1Ñ1×7Ñ7¸Ñ:¸;ÐHYÓZˆKØL˜4×,Ñ,×3Ñ3×?Ñ?×IÑIÈ!ÑLÈ\ÓZ×_Ñ_Ø×!Ñ!×'Ñ'óˆLð ×+Ñ+¨D×,=Ñ,=×,DÑ,D×,QÑ,QÐR^Ó,_ÐaqÐtuÑauÓvØ-ñ.ð !ð
 #×>Ñ>Ð?OÑPˆOØ#×@Ñ@ÐAQÑRÐð '+×&@Ñ&@ÀÐN^ÐabÑNbÓ&cÐ#Ù#2Ø'Ð*DÑDØ#Ø!ó$Ð ñ
 %5Ð5IÐK_ÐasÓ$tÐ!ð "T ×!=Ñ!=Ð>NÐQRÑ>RÑ!SØ$Ø%Ø0Ø'9ô	"Ðð #5°QÑ"7Ðà"U $×"?Ñ"?Ð@PÐSTÑ@TÑ"UØ%Ø$Ø1Ø'8ô	#Ðð $7°qÑ#9Ð à Ñ!Ðà"×)Ñ)¨+Ô6Ø#×*Ñ*¨<Ô8Ø#×*Ñ*Ð,?ÐAUÐ+VÔWà×&Ñ&Ð(:¸1Ñ(=Ð?RÐSTÑ?UÐ'VÖWð[-	Xð` )<Ð=Q�~ˆØ×,Ñ,¨]¸NÓKˆä%Ø'Ø)Ø&äÐ,Ó-ÜÐ-Ó.ÜÐ-Ó.ðô
 Ð0Ó1ô

ð 
	
r8   c                 óx   — | j                  |«      }| j                  |«      }t        j                  ||gd¬«      S )Nr‹   r¨   )rí  rì  r3   r´   )rY   r*   r+   Úcls_features_textÚcls_features_images        r9   r  z!BridgeTowerModel.get_cls_featuresV  s<   € Ø ×8Ñ8¸ÓGÐØ!×:Ñ:¸>ÓJÐÜ�y‰yÐ+Ð-?Ð@ÀbÔIÐIr8   )
NNNNNNNNNF)r/   r0   r1   rL   rÑ  rÔ  r3   rm   rÇ   r÷  rù  r   r   r™  r4   re   r   r   r6   r)   rl   r  rn   ro   s   @r9   rÞ  rÞ  6  s�  ø„ ô6òp6ò4ðI°5·<±<ð IÈCð IÐTY×T`ÑT`ó Ið
J°E·L±Lð JÈSð JÐUZ×UaÑUaó Jð
 Øð .2Ø37Ø26Ø15Ø.2Ø26Ø15Ø+/Ø*.Ø).ñN
à×#Ñ# dÑ*ðN
ð ×)Ñ)¨DÑ0ðN
ð ×(Ñ(¨4Ñ/ð	N
ð
 ×'Ñ'¨$Ñ.ðN
ð ×$Ñ$ tÑ+ðN
ð ×(Ñ(¨4Ñ/ðN
ð ×'Ñ'¨$Ñ.ðN
ð " D™jðN
ð × Ñ  4Ñ'ðN
ð #'ðN
ð Ð+Ñ,ðN
ð 
ˆu�|‰|Ñ	Ð5Ñ	5òN
ó ó ðN
ö`Jr8   rÞ  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú"BridgeTowerPredictionHeadTransformc                 óh  •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        |j                  t        «      rt        |j                     | _
        n|j                  | _
        t        j                  |j                  |j                  ¬«      | _        y rË   )rK   rL   r   rT   rN   rî   rü   rý   rþ   r
   Útransform_act_fnrP   rQ   rX   s     €r9   rL   z+BridgeTowerPredictionHeadTransform.__init__^  s{   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
Ü�f×'Ñ'¬Ô-Ü$*¨6×+<Ñ+<Ñ$=ˆDÕ!à$*×$5Ñ$5ˆDÔ!ÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆ�r8   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S rh   )rî   r!  rP   r  s     r9   rl   z*BridgeTowerPredictionHeadTransform.forwardg  s4   € ØŸ
™
 =Ó1ˆØ×-Ñ-¨mÓ<ˆØŸ™ }Ó5ˆØÐr8   rê   ro   s   @r9   r  r  ]  s   ø„ ôUör8   r  c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )r±  c                 óp  •— t         ‰| �  «        || _        t        |«      | _        t        j                  |j                  |j                  j                  d¬«      | _
        t        j                  t        j                  |j                  j                  «      «      | _        |�|| j                  _        y y )NF)r‡   )rK   rL   rZ   r  Ú	transformr   rT   rN   rá  r~  Údecoderr‘   r3   r„  r‡   r«   )rY   rZ   r«   r[   s      €r9   rL   zBridgeTowerMLMHead.__init__o  s„   ø€ Ü‰ÑÔØˆŒÜ;¸FÓCˆŒÜ—y‘y ×!3Ñ!3°V×5GÑ5G×5RÑ5RÐY^Ô_ˆŒÜ—L‘L¤§¡¨V×-?Ñ-?×-JÑ-JÓ!KÓLˆŒ	ØÐØ"(ˆD�L‰LÕð r8   c                 ód   — | j                  |«      }| j                  |«      | j                  z   }|S rh   )r%  r&  r‡   )rY   ÚxÚ	mlm_scores      r9   rl   zBridgeTowerMLMHead.forwardx  s-   € Ø—N‘N 1Ó%ˆ	Ø—L‘L Ó+¨d¯i©iÑ7ˆ	ØÐr8   rh   rê   ro   s   @r9   r±  r±  n  s   ø„ õ)ör8   r±  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚBridgeTowerITMHeadc                 óX   •— t         ‰| �  «        t        j                  |d«      | _        y ©Nrˆ   ©rK   rL   r   rT   Úfc)rY   rN   r[   s     €r9   rL   zBridgeTowerITMHead.__init__  s    ø€ Ü‰ÑÔÜ—)‘)˜K¨Ó+ˆ�r8   c                 ó(   — | j                  |«      }|S rh   ©r/  )rY   r(  Ú	itm_scores      r9   rl   zBridgeTowerITMHead.forwardƒ  s   € Ø—G‘G˜A“Jˆ	ØÐr8   rê   ro   s   @r9   r+  r+  ~  s   ø„ ô,ör8   r+  z\
    BridgeTower Model with a language modeling head on top as done during pretraining.
    c                   ó^  ‡ — e Zd ZddiZˆ fd„Zd„ Z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	j                  dz  de	j                  dz  dee   defd„«       «       Zˆ xZS )ÚBridgeTowerForMaskedLMzmlm_score.decoder.weightz8bridgetower.text_model.embeddings.word_embeddings.weightc                 ó„   •— t         ‰| �  |«       t        |«      | _        t	        |«      | _        | j                  «        y rh   )rK   rL   rÞ  r�  r±  r)  rÁ  rX   s     €r9   rL   zBridgeTowerForMaskedLM.__init__�  s5   ø€ Ü‰Ñ˜Ô ä+¨FÓ3ˆÔÜ+¨FÓ3ˆŒð 	�‰Õr8   c                 ó.   — | j                   j                  S rh   ©r)  r&  rÃ  s    r9   Úget_output_embeddingsz,BridgeTowerForMaskedLM.get_output_embeddings™  s   € Ø�~‰~×%Ñ%Ð%r8   c                 ó&   — || j                   _        y rh   r7  )rY   Únew_embeddingss     r9   Úset_output_embeddingsz,BridgeTowerForMaskedLM.set_output_embeddingsœ  s   € Ø!/ˆ�‰Õr8   Nr‡  r]   r}  r»   rú  rˆ  r?   rü  r  r¡   c	                 ó�  —  | j                   d|||||||dœ|	¤Ž}
| j                  |
j                  «      }d}|�kt        «       }|j	                  |j
                  «      } ||j                  d| j                  j                  j                  «      |j                  d«      «      }t        |||
j                  |
j                  ¬«      S )aà  
        image_embeds (`torch.FloatTensor` of shape `(batch_size, num_patches, hidden_size)`, *optional*):
            Optionally, instead of passing `pixel_values`, you can choose to directly pass an embedded representation.
            This is useful if you want more control over how to convert `pixel_values` into patch embeddings.
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should be in `[-100, 0, ...,
            config.vocab_size]` (see `input_ids` docstring) Tokens with indices set to `-100` are ignored (masked), the
            loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`

        Examples:

        ```python
        >>> from transformers import BridgeTowerProcessor, BridgeTowerForMaskedLM
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO

        >>> url = "http://images.cocodataset.org/val2017/000000360943.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read())).convert("RGB")
        >>> text = "a <mask> looking out of the window"

        >>> processor = BridgeTowerProcessor.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")
        >>> model = BridgeTowerForMaskedLM.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")

        >>> # prepare inputs
        >>> encoding = processor(image, text, return_tensors="pt")

        >>> # forward pass
        >>> outputs = model(**encoding)

        >>> results = processor.decode(outputs.logits.argmax(dim=-1).squeeze(0).tolist())

        >>> print(results)
        .a cat looking out of the window.
        ```©r‡  r]   r}  r»   rú  rˆ  r?   Nr‹   ©r<   r=   r-   r.   r7   )r�  r)  r*   r   rd   ra   r³   rZ   rá  r~  r   r-   r.   )rY   r‡  r]   r}  r»   rú  rˆ  r?   rü  r  ÚoutputsÚ
mlm_logitsÚmasked_lm_lossÚloss_fcts                 r9   rl   zBridgeTowerForMaskedLM.forwardŸ  sÑ   € ðd #�$×"Ñ"ð 	
ØØ)Ø)Ø%Ø!Ø'Ø%ñ	
ð ñ	
ˆð —^‘^ G×$9Ñ$9Ó:ˆ
ØˆØÐÜ'Ó)ˆHà—Y‘Y˜z×0Ñ0Ó1ˆFÙ% j§o¡o°b¸$¿+¹+×:QÑ:Q×:\Ñ:\Ó&]Ð_e×_jÑ_jÐkmÓ_nÓoˆNäØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r8   ©NNNNNNNN)r/   r0   r1   Ú_tied_weights_keysrL   r8  r;  r   r   r3   r™  r4   r   r   r   rl   rn   ro   s   @r9   r4  r4  ˆ  s"  ø„ ð 5Ð6pÐqÐôò&ò0ð Øð .2Ø37Ø26Ø15Ø.2Ø26Ø15Ø*.ñH
à×#Ñ# dÑ*ðH
ð ×)Ñ)¨DÑ0ðH
ð ×(Ñ(¨4Ñ/ð	H
ð
 ×'Ñ'¨$Ñ.ðH
ð ×$Ñ$ tÑ+ðH
ð ×(Ñ(¨4Ñ/ðH
ð ×'Ñ'¨$Ñ.ðH
ð × Ñ  4Ñ'ðH
ð Ð+Ñ,ðH
ð 
òH
ó ó ôH
r8   r4  zª
    BridgeTower Model transformer with a classifier head on top (a linear layer on top of the final hidden state of the
    [CLS] token) for image-to-text matching.
    c                   óJ  ‡ — e Zd 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j                  dz  d
ej                  dz  de	e
   defd„«       «       Zˆ xZS )Ú#BridgeTowerForImageAndTextRetrievalc                 óž   •— t         ‰| �  |«       t        |«      | _        t	        |j
                  dz  «      | _        | j                  «        y r-  )rK   rL   rÞ  r�  r+  rN   r2  rÁ  rX   s     €r9   rL   z,BridgeTowerForImageAndTextRetrieval.__init__ó  s@   ø€ Ü‰Ñ˜Ô ä+¨FÓ3ˆÔä+¨F×,>Ñ,>ÀÑ,BÓCˆŒð 	�‰Õr8   Nr‡  r]   r}  r»   rú  rˆ  r?   rü  r  r¡   c	                 ó  —  | j                   d|||||||dœ|	¤Ž}
|
j                  }| j                  |«      }d}|�.t        «       }|j	                  |j
                  «      } |||«      }t        |||
j                  |
j                  ¬«      S )a^  
        image_embeds (`torch.FloatTensor` of shape `(batch_size, num_patches, hidden_size)`, *optional*):
            Optionally, instead of passing `pixel_values`, you can choose to directly pass an embedded representation.
            This is useful if you want more control over how to convert `pixel_values` into patch embeddings.
        labels (`torch.LongTensor` of shape `(batch_size, 1)`, *optional*):
            Labels for computing the image-text matching loss. 0 means the pairs don't match and 1 means they match.
            The pairs with 0 will be skipped for calculation.

        Examples:

        ```python
        >>> from transformers import BridgeTowerProcessor, BridgeTowerForImageAndTextRetrieval
        >>> import httpx
        >>> from io import BytesIO
        >>> from PIL import Image

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read()))
        >>> texts = ["An image of two cats chilling on a couch", "A football player scoring a goal"]

        >>> processor = BridgeTowerProcessor.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")
        >>> model = BridgeTowerForImageAndTextRetrieval.from_pretrained("BridgeTower/bridgetower-base-itm-mlm")

        >>> # forward pass
        >>> scores = dict()
        >>> for text in texts:
        ...     # prepare inputs
        ...     encoding = processor(image, text, return_tensors="pt")
        ...     outputs = model(**encoding)
        ...     scores[text] = outputs.logits[0, 1].item()
        ```r=  Nr>  r7   )	r�  r,   r2  r   rd   ra   r   r-   r.   )rY   r‡  r]   r}  r»   rú  rˆ  r?   rü  r  r?  r,   r=   Úitm_lossrB  s                  r9   rl   z+BridgeTowerForImageAndTextRetrieval.forwardý  s¬   € ð\ #�$×"Ñ"ð 	
ØØ)Ø)Ø%Ø!Ø'Ø%ñ	
ð ñ	
ˆð  ×-Ñ-ˆà—‘ Ó.ˆàˆØÐÜ'Ó)ˆHà—Y‘Y˜vŸ}™}Ó-ˆFÙ ¨Ó/ˆHä'ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r8   rC  )r/   r0   r1   rL   r   r   r3   r™  r4   r   r   r   rl   rn   ro   s   @r9   rF  rF  ì  s
  ø„ ôð Øð .2Ø37Ø26Ø15Ø.2Ø26Ø15Ø*.ñG
à×#Ñ# dÑ*ðG
ð ×)Ñ)¨DÑ0ðG
ð ×(Ñ(¨4Ñ/ð	G
ð
 ×'Ñ'¨$Ñ.ðG
ð ×$Ñ$ tÑ+ðG
ð ×(Ñ(¨4Ñ/ðG
ð ×'Ñ'¨$Ñ.ðG
ð × Ñ  4Ñ'ðG
ð Ð+Ñ,ðG
ð 
"òG
ó ó ôG
r8   rF  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚBridgeTowerContrastiveHeadc                 óX   •— t         ‰| �  «        t        j                  ||«      | _        y rh   r.  )rY   rN   Ú
embed_sizer[   s      €r9   rL   z#BridgeTowerContrastiveHead.__init__J  s    ø€ Ü‰ÑÔÜ—)‘)˜K¨Ó4ˆ�r8   c                 ó(   — | j                  |«      }|S rh   r1  )rY   r(  s     r9   rl   z"BridgeTowerContrastiveHead.forwardN  s   € Ø�G‰G�A‹JˆØˆr8   rê   ro   s   @r9   rK  rK  I  s   ø„ ô5ör8   rK  zl
    BridgeTower Model with a image-text contrastive head on top computing image-text contrastive loss.
    c                   ó6  ‡ — e Zd 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j                  dz  d
e	dz  de
e   defd„«       «       Zˆ xZS )r¬  c                 óÊ  •— t         ‰| �  |«       t        |«      | _        t	        |j
                  |j                  «      | _        t	        |j
                  |j                  «      | _        t	        |j
                  dz  |j                  «      | _	        t        j                  t        j                  | j                  j                  «      «      | _        | j#                  «        y r-  )rK   rL   rÞ  r�  rK  rN   Úcontrastive_hidden_sizeÚitc_text_headÚitc_image_headÚitc_cross_modal_headr   r‘   r3   rä   rZ   r¯  r®  rÁ  rX   s     €r9   rL   z*BridgeTowerForContrastiveLearning.__init__Y  s£   ø€ Ü‰Ñ˜Ô ä+¨FÓ3ˆÔä7¸×8JÑ8JÈF×LjÑLjÓkˆÔÜ8¸×9KÑ9KÈV×MkÑMkÓlˆÔÜ$>¸v×?QÑ?QÐTUÑ?UÐW]×WuÑWuÓ$vˆÔ!äŸ<™<¬¯©°T·[±[×5WÑ5WÓ(XÓYˆÔà�‰Õr8   Nr‡  r]   r}  r»   rú  rˆ  r?   Úreturn_lossr  r¡   c	                 óè  — |	j                  dd«        | j                  d|||||||dœ|	¤Ž}
|
j                  }|
j                  \  }}}|d   }|d   }| j                  j                  j
                  j                  |«      }| j                  j                  t        j                  ddt        j                  | j                  j                  j                  j                  ¬«      «      j                  |«      }| j                  j                  |«      |z   }t        j                   j#                  | j%                  |dd…d	dd…f   «      dd
¬«      }t        j                   j#                  | j'                  |dd…d	dd…f   «      dd
¬«      j)                  |j                  ¬«      }t        j                   j#                  | j+                  |«      dd
¬«      j)                  |j                  ¬«      }t        j,                  |||gd¬«      }| j.                  j1                  «       j)                  |j                  ¬«      }t        j2                  ||j5                  «       «      |z  }t        j2                  ||j5                  «       «      |z  }t        j2                  ||j5                  «       «      |z  }d}|r•t        j6                  t9        |«      |j                  ¬«      }t        j                   j;                  ||«      }t        j                   j;                  ||«      }t        j                   j;                  ||«      }||z   |z   dz  }t=        ||||||
j                  |
j>                  ¬«      S )a¥  
        image_embeds (`torch.FloatTensor` of shape `(batch_size, num_patches, hidden_size)`, *optional*):
            Optionally, instead of passing `pixel_values`, you can choose to directly pass an embedded representation.
            This is useful if you want more control over how to convert `pixel_values` into patch embeddings.
        return_loss (`bool`, *optional*):
            Whether or not to return the contrastive loss.

        Examples:

        ```python
        >>> from transformers import BridgeTowerProcessor, BridgeTowerForContrastiveLearning
        >>> import httpx
        >>> from io import BytesIO
        >>> from PIL import Image
        >>> import torch

        >>> image_urls = [
        ...     "https://farm4.staticflickr.com/3395/3428278415_81c3e27f15_z.jpg",
        ...     "http://images.cocodataset.org/val2017/000000039769.jpg",
        ... ]
        >>> texts = ["two dogs in a car", "two cats sleeping on a couch"]

        >>> with httpx.stream("GET", urls[0]) as response:
        ...     image1 = Image.open(BytesIO(response.read()))

        >>> with httpx.stream("GET", urls[1]) as response:
        ...     image2 = Image.open(BytesIO(response.read()))

        >>> images = [image1, image2]

        >>> processor = BridgeTowerProcessor.from_pretrained("BridgeTower/bridgetower-large-itm-mlm-itc")
        >>> model = BridgeTowerForContrastiveLearning.from_pretrained("BridgeTower/bridgetower-large-itm-mlm-itc")

        >>> inputs = processor(images, texts, padding=True, return_tensors="pt")
        >>> loss = model(**inputs, return_loss=True).loss

        >>> inputs = processor(images, texts[::-1], padding=True, return_tensors="pt")
        >>> loss_swapped = model(**inputs, return_loss=True).loss

        >>> print("Loss", round(loss.item(), 4))
        Loss 0.0019

        >>> print("Loss with swapped images", round(loss_swapped.item(), 4))
        Loss with swapped images 2.126
        ```Úoutput_hidden_statesTr=  r‹   rþ  r"   r_   Nr   rˆ   )r©   r  )ra   éþÿÿÿr¨   g      @)r<   r=   r>   r?   r@   r-   r.   r7   ) Ú
setdefaultr�  r,   r-   rå  rÀ  rÛ   r‚  r3   r  r…  r«   ra   r  rä  r   r±   Ú	normalizerR  rS  rd   rT  rÒ   r®  Úexpr  Útrœ   r   Úcross_entropyr;   r.   )rY   r‡  r]   r}  r»   rú  rˆ  r?   rU  r  r?  r,   Úhidden_states_txtÚhidden_states_imgÚhidden_states_cross_modalr>   r
  r  r@   r=   r®  Úlogits_text_to_imageÚlogits_text_to_crossÚlogits_image_to_crossÚitc_lossrü  Útext_to_image_lossÚtext_to_cross_lossÚimage_to_cross_losss                                r9   rl   z)BridgeTowerForContrastiveLearning.forwardf  s+  € ðv 	×ÑÐ0°$Ô7Ø"�$×"Ñ"ð 	
ØØ)Ø)Ø%Ø!Ø'Ø%ñ	
ð ñ	
ˆð  ×-Ñ-ˆØJQ×J_ÑJ_ÑGÐÐ,Ð.Gà'¨Ñ+ˆØ(¨Ñ,ˆà#×/Ñ/×<Ñ<×CÑC×PÑPÐQ]Ó^ÐØ&*×&6Ñ&6×&LÑ&LÜ�J‰J�t˜Q¤e§j¡j¸×9IÑ9I×9_Ñ9_×9fÑ9f×9mÑ9mÔnó'
ç
‰)Ð(Ó
)ð 	$ð ×'Ñ'×CÑCÐDXÓYÐ\wÑwˆô —m‘m×-Ñ-¨d×.@Ñ.@ÀÊQÐPQÒSTÈWÑAUÓ.VÐ\^ÐbcÐ-ÓdˆÜ—}‘}×.Ñ.¨t×/BÑ/BÀ<ÒPQÐSTÒVWÐPWÑCXÓ/YÐ_aÐefÐ.Óg×jÑjØ×%Ñ%ð kó 
ˆô —}‘}×.Ñ.¨t×/HÑ/HÈÓ/WÐ]_ÐcdÐ.Óe×hÑhØ×%Ñ%ð ió 
ˆô —‘˜k¨<¸ÐFÈBÔOˆà×&Ñ&×*Ñ*Ó,×/Ñ/°{×7IÑ7IÐ/ÓJˆÜ$Ÿ|™|¨K¸¿¹Ó9IÓJÈ[ÑXÐÜ$Ÿ|™|¨K¸¿¹Ó9IÓJÈ[ÑXÐÜ %§¡¨\¸<¿>¹>Ó;KÓ LÈ{Ñ ZÐàˆáÜ—\‘\¤# f£+°f·m±mÔDˆFÜ!#§¡×!<Ñ!<Ð=QÐSYÓ!ZÐÜ!#§¡×!<Ñ!<Ð=QÐSYÓ!ZÐÜ"$§-¡-×"=Ñ"=Ð>SÐU[Ó"\ÐØ*Ð-?Ñ?ÐBUÑUÐY\Ñ\ˆHä+ØØØ#Ø%Ø%Ø!×/Ñ/Ø×)Ñ)ô
ð 	
r8   rC  )r/   r0   r1   rL   r   r   r3   r™  r4   re   r   r   r;   rl   rn   ro   s   @r9   r¬  r¬  S  s  ø„ ôð Øð .2Ø37Ø26Ø15Ø.2Ø26Ø15Ø#'ñs
à×#Ñ# dÑ*ðs
ð ×)Ñ)¨DÑ0ðs
ð ×(Ñ(¨4Ñ/ð	s
ð
 ×'Ñ'¨$Ñ.ðs
ð ×$Ñ$ tÑ+ðs
ð ×(Ñ(¨4Ñ/ðs
ð ×'Ñ'¨$Ñ.ðs
ð ˜D‘[ðs
ð Ð+Ñ,ðs
ð 
&òs
ó ó ôs
r8   r¬  )r¬  rF  r4  rÞ  rœ  )Nr/  )[r2   Úcollectionsr   Úcollections.abcr   Údataclassesr   r3   r   Útorch.nnr   Ú r	   r¦  Úactivationsr
   r   Úcache_utilsr   r   r   Úmasking_utilsr   r   Úmodeling_layersr   Úmodeling_outputsr   r   r   r   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úpytorch_utilsr   Úutilsr   r   r   r   Úutils.genericr   r    Úutils.output_capturingr!   Úconfiguration_bridgetowerr#   r$   r%   Ú
get_loggerr/   ÚloggerÚ_TOKENIZER_FOR_DOCr)   r;   r¼  rB   rq   r�   rÉ   rÝ   rì   rù   r  r  rm   Úfloatr  r  r?  rK  rV  rl  rq  rz  rœ  r¾  rÉ  rÞ  r  r±  r+  r4  rF  rK  r¬  Ú__all__r7   r8   r9   ú<module>r~     s¡  ðñ  å #Ý $Ý !ã Ý Ý %å &ß 6ß CÑ Cß JÝ 9÷õ ÷ GÝ &Ý 6ß KÓ Kß IÝ 5ß hÑ hð 
ˆ×	Ñ	˜HÓ	%€à'Ð ñ ðôð
 ô7˜[ó 7ó óð7ñ$ ðôð
 ô7 ;ó 7ó óð7ô4) 2§9¡9ô )ôX˜RŸY™Yô ô6P "§)¡)ô Pôf7" 2§9¡9ô 7"ôtd˜2Ÿ9™9ô dô4˜BŸI™Iô ô˜bŸi™iô ô ˜Ÿ	™	ô ô˜Ÿ	™	ô ð, !Øñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð �T‰\ð%ð ð%ð Ð'Ñ(ó%ô:@)˜rŸy™yô @)ôHI) §	¡	ô I)ôZ.˜2Ÿ9™9ô .ô:8 §	¡	ô 8ôv?Ð5ô ?ôF
˜RŸY™Yô 
ôFg8 §	¡	ô g8ðT ô)% ó )%ó ð)%ôXYÐ7ô Yñ" ðôô{6Ð5ó {6óð{6ñ| ðôô
^JÐ1ó ^Jóð
^JôD	¨¯©ô ô"˜Ÿ™ô ô ˜Ÿ™ô ñ ðôô
\
Ð7ó \
óð
\
ñ~ ðôôT
Ð*Dó T
óðT
ôn §¡ô ñ ðôô
C
Ð(Bó C
óð
C
òL�r8   