Ë
    ÛÓ^jÜ[ ã                   ó°  — d 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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 ddlmZ ddlmZ ddlmZmZmZmZmZm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&  ejN                  e(«      Z)dZ*dZ+dZ,e&e$z  e%z  Z- ed¬«      e G d„ de«      «       «       Z. ed¬«      e G d„ de«      «       «       Z/ ed¬«      e G d„ de«      «       «       Z0 G d„ de	jb                  «      Z2 G d „ d!e	jb                  «      Z3 G d"„ d#e	jb                  «      Z4 G d$„ d%e	jb                  «      Z5 G d&„ d'e	jb                  «      Z6 G d(„ d)e	jb                  «      Z7 G d*„ d+e	jb                  «      Z8 G d,„ d-e	jb                  «      Z9 G d.„ d/e«      Z: G d0„ d1e	jb                  «      Z; G d2„ d3e	jb                  «      Z<e G d4„ d5e«      «       Z=e G d6„ d7e=«      «       Z>e G d8„ d9e=«      «       Z?e G d:„ d;e=«      «       Z@e G d<„ d=e=«      «       ZA G d>„ d?e	jb                  «      ZB G d@„ dAe	jb                  «      ZC G dB„ dCe	jb                  «      ZD edD¬«       G dE„ dFe=«      «       ZE G dG„ dHe	jb                  «      ZF G dI„ dJe	jb                  «      ZG G dK„ dLe	jb                  «      ZH G dM„ dNe	jb                  «      ZI edO¬«       G dP„ dQe=«      «       ZJg dR¢ZKy)SzPyTorch FLAVA model.é    N)ÚOrderedDict)Ú	dataclass)ÚAny)Únné   )Úinitialization)ÚACT2FN)Úcreate_bidirectional_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputÚBaseModelOutputWithPooling)ÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚloggingÚ	torch_inté   )ÚFlavaConfigÚFlavaImageCodebookConfigÚFlavaImageConfigÚFlavaMultimodalConfigÚFlavaTextConfigzfacebook/flava-image-codebookg$(~Œ¹k@a–  
    Output from FlavaModel containing embeddings and outputs from individual encoders.

    Note that `image_embeddings` and `text_embeddigns` returned are similar to pooled output returned from a
    transformer. If you want embeddings for contrastive loss or retrieval use a FLAVA model's `image_projection` and
    `text_projection` layers on `image_embeddings` and `text_embeddings` respectively.
    )Úcustom_introc                   óØ   — e Zd ZU dZdZej                  dz  ed<   dZe	dz  ed<   dZ
ej                  dz  ed<   dZe	dz  ed<   dZej                  dz  ed<   dZe	dz  ed<   d	ee   fd
„Zy)ÚFlavaModelOutputaì  
    image_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `pixel_values` are present):
        The image embeddings which are basically the pooled output of [`FlavaImageModel`].
    image_output (`BaseModelOutputWithPooling`, *optional*, returned when `pixel_values` are present):
        The output of the [`FlavaImageModel`].
    text_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `input_ids` are present):
        The text embeddings which are basically the pooled output of [`FlavaTextModel`].
    text_output (`BaseModelOutputWithPooling`, *optional*, returned when `input_ids` are present):
        The output of the [`FlavaTextModel`].
    multimodal_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `input_ids` and `pixel_values` are present and `skip_multimodal_encoder` is `None` or `False`):
        The multimodal embeddings which are basically the pooled output of [`FlavaTextModel`].
    multimodal_output (`BaseModelOutputWithPooling`, returned when `input_ids` and `pixel_values` are present and `skip_multimodal_encoder` is `None` or `False`):
        The output of the [`FlavaMultimodalModel`].
    NÚimage_embeddingsÚimage_outputÚtext_embeddingsÚtext_outputÚmultimodal_embeddingsÚmultimodal_outputÚreturnc                 óH   ‡ — t        ˆ fd„‰ j                  «       D «       «      S )Nc              3   ód   •K  — | ]'  }|d vr‰|   nt        ‰|«      j                  «       –— Œ) y­w))r"   r    r$   N©ÚgetattrÚto_tuple)Ú.0ÚkÚselfs     €ús/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/flava/modeling_flava.pyú	<genexpr>z,FlavaModelOutput.to_tuple.<locals>.<genexpr>V   s=   øè ø€ ò 
àð Ð TÑTˆD�ŠGÔZaÐbfÐhiÓZj×ZsÑZsÓZuÓuñ
ùó   ƒ-0©ÚtupleÚkeys©r-   s   `r.   r*   zFlavaModelOutput.to_tupleU   s#   ø€ Üó 
à—Y‘Y“[ô
ó 
ð 	
ó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r    r   r!   r"   r#   r$   r2   r   r*   © r5   r.   r   r   4   s‹   … ñð 26Ð�e×'Ñ'¨$Ñ.Ó5Ø6:€LÐ,¨tÑ3Ó:Ø04€O�U×&Ñ&¨Ñ-Ó4Ø59€KÐ+¨dÑ2Ó9Ø6:Ð˜5×,Ñ,¨tÑ3Ó:Ø;?ÐÐ1°DÑ8Ó?ð
˜% ™*ô 
r5   r   z@
    Class representing pretraining losses from FLAVA model
    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j                  dz  ed<   d	efd
„Zy)ÚFlavaLossesa¯  
    mim (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `mim_labels` and `pixel_values` are present, `input_ids_masked` is absent and `mim_weight` > 0.):
        Masked Image Modeling loss as used in BeIT calculated only for unimodal image data.
    mlm (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `mlm_labels` and `input_ids_masked` are present, `pixel_values` is absent and `mlm_weight` > 0.):
        Masked Language Modeling loss as used in BERT calculated only for unimodal text data.
    itm (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `itm_labels`, `input_ids_masked`, `pixel_values` are present and `itm_weight` > 0.):
        Image Text Matching (ITM) loss calculated for paired image-text data. Note that ITM loss is calculated on
        masked pairs in FLAVA.
    global_contrastive (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `input_ids` and `pixel_values` are present and `global_contrastive_weight` > 0.):
        Contrastive loss for image-text similarity similar to CLIP but calculated globally for paired image-text
        data. This is calculated on unmasked images and texts.
    mmm_image (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `mim_labels`, `pixel_values` and `input_ids_masked` are present and `mmm_image_weight` > 0.):
        Masked Multimodal Modeling loss's image component calculated on paired image-text data.
    mmm_text (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `mlm_labels`, `pixel_values` and `input_ids_masked` are present and `mmm_text_weight` > 0.):
        Masked Multimodal Modeling loss's text component calculated on paired image-text data.
    NÚmimÚmlmÚitmÚglobal_contrastiveÚ	mmm_imageÚmmm_textr%   c                 óB   — d}| j                  «       D ]	  }|€Œd} |S  |S )NTF)Úvalues)r-   Úall_noneÚvs      r.   rH   zFlavaLosses.all_none{   s5   € ØˆØ—‘“ò 	ˆAØ‰}Ø �ØØˆð		ð ˆr5   )r6   r7   r8   r9   r@   r:   r;   r<   rA   rB   rC   rD   rE   ÚboolrH   r=   r5   r.   r?   r?   \   s”   … ñð" %)€Cˆ×	Ñ	˜TÑ	!Ó(Ø$(€Cˆ×	Ñ	˜TÑ	!Ó(Ø$(€Cˆ×	Ñ	˜TÑ	!Ó(Ø37Ð˜×)Ñ)¨DÑ0Ó7Ø*.€Iˆu× Ñ  4Ñ'Ó.Ø)-€Hˆe×Ñ $Ñ&Ó-ð˜$ô r5   r?   a   
    Output from FlavaForPreTraining containing embeddings, and outputs from individual encoders.

    Note that `image_embeddings` and `text_embeddings` returned are similar to pooled output returned from a
    transformer. If you want embeddings for contrastive loss or retrieval use a FLAVA model's `image_projection` and
    `text_projection` layers on `image_embeddings` and `text_embeddings` respectively.
    c                   óÚ  — e Zd ZU dZdZej                  dz  ed<   dZe	ed<   dZ
ej                  dz  ed<   dZedz  ed<   dZej                  dz  ed<   dZedz  ed<   dZej                  dz  ed	<   dZedz  ed
<   dZej                  dz  ed<   dZedz  ed<   dZej                  dz  ed<   dZedz  ed<   dZej                  dz  ed<   dZe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j                  dz  ed<   dZej                  dz  ed<   dZej                  dz  ed<   dee   fd„Z y)ÚFlavaForPreTrainingOutputay  
    loss (`torch.FloatTensor`, *optional*, returned when `return_loss` is True):
        Total loss calculated for this model.
    loss_info (`FlavaLosses`):
        Detailed info for FLAVA Pretraining losses. Check `FlavaLosses` class description for the information on
        the keys.
    image_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `pixel_values` are present):
        The image embeddings which are basically the pooled output of [`FlavaImageModel`].
    image_output (`BaseModelOutputWithPooling`, *optional*, returned when `pixel_values` are present):
        The output of the [`FlavaImageModel`].
    text_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `input_ids` are present):
        The text embeddings which are basically the pooled output of [`FlavaTextModel`].
    text_output (`BaseModelOutputWithPooling`, *optional*, returned when `input_ids` are present):
        The output of the [`FlavaTextModel`].
    multimodal_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `input_ids` and `pixel_values` are present and `skip_unmasked_multimodal_encoder` is `None` or `False`):
        The multimodal embeddings which are basically the pooled output of [`FlavaTextModel`].
    multimodal_output (`BaseModelOutputWithPooling`, returned when `input_ids` and `pixel_values` are present and `skip_unmasked_multimodal_encoder` is `None` or `False`):
        The output of the [`FlavaMultimodalModel`].
    image_masked_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `pixel_values` are present):
        The image embeddings which are basically the pooled output of [`FlavaImageModel`]. Uses `bool_masked_pos`
        to create masked images.
    image_masked_output (`BaseModelOutputWithPooling`, *optional*, returned when `pixel_values` are present):
        The output of the [`FlavaImageModel`]. Uses `bool_masked_pos` to create masked images.
    text_masked_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `input_ids_masked` are present):
        The text embeddings which are basically the pooled output of [`FlavaTextModel`].
    text_masked_output (`BaseModelOutputWithPooling`, *optional*, returned when `input_ids_masked` are present):
        The output of the [`FlavaTextModel`].
    multimodal_masked_embeddings (`torch.FloatTensor` of shape `(batch_size, output_dim)`, *optional*, returned when `input_ids` and `pixel_values` are present):
        The multimodal embeddings which are basically the pooled output of [`FlavaTextModel`].
    multimodal_masked_output (`BaseModelOutputWithPooling`, *optional*, returned when `input_ids_masked` and `pixel_values` are present):
        The output of the [`FlavaMultimodalModel`].
    mim_logits (`torch.FloatTensor` of shape `(batch_size, num_image_patches, image_vocab_size)` or of shape `(total_masked_patches, image_vocab_size)` , *optional*, returned when `pixel_values` are present and `input_ids_masked` are not):
        The logits for MIM unimodal loss. Uses `book_masked_pos` to get masked patches. The flattened output is
            returned when `bool_masked_pos` has some of the patches masked.
    mlm_logits (`torch.FloatTensor` of shape `(batch_size, text_seq_length, text_vocab_size)` or of shape `(total_masked_seq_length, text_vocab_size)`, *optional*, returned when `input_ids_masked` are present and `pixel_values` are not):
        The logits for MLM unimodal loss. The flattened output is returned when `input_ids_masked` has some of
            the tokens masked.
    itm_logits (`torch.FloatTensor` of shape `(batch_size, 2)`, *optional*, returned when `input_ids_masked` and `pixel_values` are present):
        The logits for ITM loss. Note that ITM loss is calculated on masked pairs in FLAVA.
    contrastive_logits_per_image (`torch.FloatTensor` of shape `(image_batch_size, text_batch_size)`):
        The scaled dot product scores between `image_embeddings` and `text_embeddings` but passed through FLAVA's
        `image_projection` and `text_projection` layers respectively. This represents the image-text similarity
        scores. This is calculated on unmasked images and texts.
    contrastive_logits_per_text (`torch.FloatTensor` of shape `(text_batch_size, image_batch_size)`):
        The scaled dot product scores between `text_embeddings` and `image_embeddings` but passed through FLAVA's
        `text_projection` and `image_projection` layers respectively. This is calculated on unmasked images and
        texts.
    mmm_image_logits (`torch.FloatTensor` of shape `(batch_size, num_image_patches, image_vocab_size)` or of shape`(total_masked_patches, image_vocab_size)`, *optional*, returned when `pixel_values` and `input_ids_masked` are present):
        The logits for MMM image multimodal loss. Uses `book_masked_pos` to get masked patches. The flattened
            output is returned when `bool_masked_pos` has some of the patches masked.
    mmm_text_logits (`torch.FloatTensor` of shape `(batch_size, text_seq_length, text_vocab_size)` or of shape `(`(total_masked_seq_length, text_vocab_size)`), *optional*, returned when `pixel_values` and `input_ids_masked` are present):
        The logits for MMM text multimodal loss. The flattened output is returned when `input_ids_masked` has
            some of the tokens masked.
    NÚlossÚ	loss_infor   r    r!   r"   r#   r$   Úimage_masked_embeddingsÚimage_masked_outputÚtext_masked_embeddingsÚtext_masked_outputÚmultimodal_masked_embeddingsÚmultimodal_masked_outputÚ
mim_logitsÚ
mlm_logitsÚ
itm_logitsÚcontrastive_logits_per_imageÚcontrastive_logits_per_textÚmmm_image_logitsÚmmm_text_logitsr%   c                 óT   ‡ ‡— g d¢Št        ˆ ˆfd„‰ j                  «       D «       «      S )N)r"   r    r$   rR   rP   rT   c              3   ód   •K  — | ]'  }|‰vr‰|   nt        ‰|«      j                  «       –— Œ) y ­w©Nr(   )r+   r,   r-   Útransformer_outputss     €€r.   r/   z5FlavaForPreTrainingOutput.to_tuple.<locals>.<genexpr>å   s4   øè ø€ ÒsÐbc Ð)<Ñ <�T˜!’WÄ'È$ÐPQÓBR×B[ÑB[ÓB]Ó]Ñsùr0   r1   )r-   r_   s   `@r.   r*   z"FlavaForPreTrainingOutput.to_tupleÜ   s(   ù€ ò
Ðô ÔsÐgk×gpÑgpÓgrÔsÓsÐsr5   )!r6   r7   r8   r9   rM   r:   r;   r<   rN   r?   r   r    r   r!   r"   r#   r$   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r2   r   r*   r=   r5   r.   rL   rL   „   s¸  … ñ5ðn &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø!€Iˆ{Ó!Ø15Ð�e×'Ñ'¨$Ñ.Ó5Ø6:€LÐ,¨tÑ3Ó:Ø04€O�U×&Ñ&¨Ñ-Ó4Ø59€KÐ+¨dÑ2Ó9Ø6:Ð˜5×,Ñ,¨tÑ3Ó:Ø;?ÐÐ1°DÑ8Ó?Ø8<Ð˜U×.Ñ.°Ñ5Ó<Ø=AÐÐ3°dÑ:ÓAØ7;Ð˜E×-Ñ-°Ñ4Ó;Ø<@ÐÐ2°TÑ9Ó@Ø=AÐ  %×"3Ñ"3°dÑ":ÓAØBFÐÐ8¸4Ñ?ÓFØ+/€J�×!Ñ! DÑ(Ó/Ø+/€J�×!Ñ! DÑ(Ó/Ø+/€J�×!Ñ! DÑ(Ó/Ø=AÐ  %×"3Ñ"3°dÑ":ÓAØ<@Ð ×!2Ñ!2°TÑ!9Ó@Ø15Ð�e×'Ñ'¨$Ñ.Ó5Ø04€O�U×&Ñ&¨Ñ-Ó4ð	t˜% ™*ô 	tr5   rL   c            	       óÒ   ‡ — e Zd ZdZddededdfˆ fd„Zdej                  de	d	e	dej                  fd
„Z
	 	 ddej                  dej                  dz  dedej                  fd„Zˆ xZS )ÚFlavaImageEmbeddingszb
    Construct the CLS token, position and patch embeddings. Optionally, also the mask token.
    ÚconfigÚuse_mask_tokenr%   Nc                 óÂ  •— t         ‰| �  «        |xs |j                  }t        j                  t        j                  dd|j                  «      «      | _        |r4t        j                  t        j                  dd|j                  «      «      nd | _        t        |j                  |j                  |j                  |j                  ¬«      | _        | j                  j                  }t        j                  t        j                  d|dz   |j                  «      «      | _        t        j                   |j"                  «      | _        |j                  | _        || _        y )Nr   )Ú
image_sizeÚ
patch_sizeÚnum_channelsÚ	embed_dim)ÚsuperÚ__init__Ú
mask_tokenr   Ú	Parameterr:   ÚzerosÚhidden_sizeÚ	cls_tokenÚPatchEmbeddingsre   rf   rg   Úpatch_embeddingsÚnum_patchesÚposition_embeddingsÚDropoutÚhidden_dropout_probÚdropoutrb   )r-   rb   rc   rr   Ú	__class__s       €r.   rj   zFlavaImageEmbeddings.__init__ï   s   ø€ Ü‰ÑÔà'Ò<¨6×+<Ñ+<ˆÜŸ™¤e§k¡k°!°Q¸×8JÑ8JÓ&KÓLˆŒÙQ_œ"Ÿ,™,¤u§{¡{°1°a¸×9KÑ9KÓ'LÔMÐeiˆŒÜ /Ø×(Ñ(Ø×(Ñ(Ø×,Ñ,Ø×(Ñ(ô	!
ˆÔð ×+Ñ+×7Ñ7ˆÜ#%§<¡<´·±¸A¸{ÈQ¹ÐPV×PbÑPbÓ0cÓ#dˆÔ Ü—z‘z &×"<Ñ"<Ó=ˆŒØ ×+Ñ+ˆŒØˆ�r5   Ú
embeddingsÚheightÚwidthc                 ó¦  — |j                   d   dz
  }| j                  j                   d   dz
  }t        j                  j	                  «       s||k(  r||k(  r| j                  S | j                  dd…dd…f   }| j                  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   Néÿÿÿÿg      à?r   r   é   ÚbicubicF)ÚsizeÚmodeÚalign_corners©Údim)Úshapers   r:   ÚjitÚ
is_tracingrf   r   ÚreshapeÚpermuter   Ú
functionalÚinterpolateÚviewÚcat)r-   rx   ry   rz   rr   Únum_positionsÚclass_pos_embedÚpatch_pos_embedrƒ   Ú
new_heightÚ	new_widthÚsqrt_num_positionss               r.   Úinterpolate_pos_encodingz-FlavaImageEmbeddings.interpolate_pos_encoding  s`  € ð !×&Ñ& qÑ)¨AÑ-ˆØ×0Ñ0×6Ñ6°qÑ9¸AÑ=ˆô �y‰y×#Ñ#Ô%¨+¸Ò*FÈ6ÐUZÊ?Ø×+Ñ+Ð+à×2Ñ2²1°b°q°b°5Ñ9ˆØ×2Ñ2²1°a±b°5Ñ9ˆà×Ñ˜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ÐCr5   Úpixel_valuesÚbool_masked_posr“   c                 óV  — |j                   \  }}}}| j                  ||¬«      }|j                  «       \  }}	}
|�| j                  j	                  ||	d«      }|j                  «       dk(  r!|j                  |j                  d«      d«      }|j                  d«      j                  |«      }|d|z
  z  ||z  z   }| j                  j	                  |dd«      }t        j                  ||fd¬«      }|r|| j                  |||«      z   }n|| j                  z   }| j                  |«      }|S )N)r“   r|   r   r   g      ð?r   r‚   )r„   rq   r   rk   Úexpandrƒ   r‹   Ú	unsqueezeÚtype_asro   r:   rŒ   r“   rs   rv   )r-   r”   r•   r“   Ú
batch_sizerg   ry   rz   rx   Úseq_lenÚ_Úmask_tokensÚmaskÚ
cls_tokenss                 r.   ÚforwardzFlavaImageEmbeddings.forward*  s4  € ð 3?×2DÑ2DÑ/ˆ
�L &¨%Ø×*Ñ*¨<ÐRjÐ*Ókˆ
à!+§¡Ó!2Ñˆ
�G˜QØÐ&ØŸ/™/×0Ñ0°¸WÀbÓIˆKà×"Ñ"Ó$¨Ò)Ø"1×"6Ñ"6°×7KÑ7KÈAÓ7NÐPRÓ"S�à"×,Ñ,¨RÓ0×8Ñ8¸ÓEˆDØ# s¨T¡zÑ2°[À4Ñ5GÑGˆJð —^‘^×*Ñ*¨:°r¸2Ó>ˆ
Ü—Y‘Y 
¨JÐ7¸QÔ?ˆ
ñ $Ø# d×&CÑ&CÀJÐPVÐX]Ó&^Ñ^‰Jà# d×&>Ñ&>Ñ>ˆJà—\‘\ *Ó-ˆ
àÐr5   ©F©NF)r6   r7   r8   r9   r   rJ   rj   r:   ÚTensorÚintr“   Ú
BoolTensorr    Ú__classcell__©rw   s   @r.   ra   ra   ê   s�   ø„ ññÐ/ð Àð ÐRVõ ð&&D°5·<±<ð &DÈð &DÐUXð &DÐ]b×]iÑ]ió &DðV 48Ø).ñ	à—l‘lðð ×)Ñ)¨DÑ0ðð #'ð	ð
 
�‰÷r5   ra   c            	       ó¨   ‡ — e Zd ZdZ	 	 	 	 ddeee   z  eeef   z  deeeef   z  dedefˆ fd„Zddej                  de
d	ej                  fd
„Zˆ xZS )rp   z#
    Image to Patch Embedding.
    re   rf   rg   rh   c                 óV  •— t         ‰| �  «        t        |t        j                  j
                  «      s||f}t        |t        j                  j
                  «      s||f}|d   |d   z  |d   |d   z  z  }|| _        || _        || _        t        j                  ||||¬«      | _        y )Nr   r   )Úkernel_sizeÚstride)ri   rj   Ú
isinstanceÚcollectionsÚabcÚIterablere   rf   rr   r   ÚConv2dÚ
projection)r-   re   rf   rg   rh   rr   rw   s         €r.   rj   zPatchEmbeddings.__init__S  sž   ø€ ô 	‰ÑÔÜ˜*¤k§o¡o×&>Ñ&>Ô?Ø$ jÐ1ˆJÜ˜*¤k§o¡o×&>Ñ&>Ô?Ø$ jÐ1ˆJØ! !‘}¨
°1©Ñ5¸*ÀQ¹-È:ÐVWÉ=Ñ:XÑYˆØ$ˆŒØ$ˆŒØ&ˆÔäŸ)™) L°)ÈÐ\fÔgˆ�r5   r”   r“   r%   c                 ó8  — |j                   \  }}}}|sV|| j                  d   k7  s|| j                  d   k7  r2t        d|› d|› d| j                  d   › d| j                  d   › d�	«      ‚| j                  |«      j	                  d«      j                  dd«      }|S )Nr   r   zInput image size (Ú*z) doesn't match model (z).r}   )r„   re   Ú
ValueErrorr±   ÚflattenÚ	transpose)r-   r”   r“   rš   rg   ry   rz   Úxs           r.   r    zPatchEmbeddings.forwardf  s­   € Ø2>×2DÑ2DÑ/ˆ
�L &¨%Ù'Ø˜Ÿ™¨Ñ+Ò+¨u¸¿¹ÈÑ8JÒ/JÜ Ø(¨¨°°%°ð 9ØŸ™¨Ñ+Ð,¨A¨d¯o©o¸aÑ.@Ð-AÀðEóð ð �O‰O˜LÓ)×1Ñ1°!Ó4×>Ñ>¸qÀ!ÓDˆØˆr5   )éà   é   r   i   r¡   )r6   r7   r8   r9   r¤   Úlistr2   rj   r:   r£   rJ   r    r¦   r§   s   @r.   rp   rp   N  s�   ø„ ñð 9<Ø,.ØØñhà˜$˜s™)‘O e¨C°¨H¡oÑ5ðhð ˜%  S ™/Ñ)ðhð ð	hð
 õhñ&	 E§L¡Lð 	ÈDð 	Ð]b×]iÑ]i÷ 	r5   rp   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  fd„Zˆ xZS )	ÚFlavaTextEmbeddingszGConstruct the embeddings from word, position and token_type embeddings.c                 ó  •— t         ‰| �  «        t        j                  |j                  |j
                  |j                  ¬«      | _        t        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$        j0                  ¬«      d¬«       y )	N)Úpadding_idx©ÚepsÚposition_ids©r   r|   F)Ú
persistentÚtoken_type_ids)Údtype)ri   rj   r   Ú	EmbeddingÚ
vocab_sizern   Úpad_token_idÚword_embeddingsÚmax_position_embeddingsrs   Útype_vocab_sizeÚtoken_type_embeddingsÚ	LayerNormÚlayer_norm_epsrt   ru   rv   Úregister_bufferr:   Úaranger—   rm   rÁ   r   Úlong©r-   rb   rw   s     €r.   rj   zFlavaTextEmbeddings.__init__u  s  ø€ Ü‰ÑÔÜ!Ÿ|™|¨F×,=Ñ,=¸v×?QÑ?QÐ_e×_rÑ_rÔsˆÔÜ#%§<¡<°×0NÑ0NÐPV×PbÑPbÓ#cˆÔ Ü%'§\¡\°&×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ð 	õ 	
r5   NÚ	input_idsrÄ   rÁ   c                 ó  — |j                  «       }|d   }|€| j                  d d …d |…f   }|€st        | d«      r-| j                  d d …d |…f   }|j	                  |d   |«      }|}n:t        j                  |t
        j                  | j                  j                  ¬«      }| j                  |«      }| j                  |«      }	||	z   }
| j                  |«      }|
|z  }
| j                  |
«      }
| j                  |
«      }
|
S )Nr   rÄ   r   )rÅ   Údevice)r   rÁ   ÚhasattrrÄ   r—   r:   rm   rÑ   rÕ   rÉ   rÌ   rs   rÍ   rv   )r-   rÓ   rÄ   rÁ   Úinput_shapeÚ
seq_lengthÚbuffered_token_type_idsÚ buffered_token_type_ids_expandedÚinputs_embedsrÌ   rx   rs   s               r.   r    zFlavaTextEmbeddings.forward…  s  € ð  —n‘nÓ&ˆØ  ‘^ˆ
àÐØ×,Ñ,ªQ°°°¨^Ñ<ˆLð
 Ð!Ü�tÐ-Ô.Ø*.×*=Ñ*=ºaÀÀ*À¸nÑ*MÐ'Ø3J×3QÑ3QÐR]Ð^_ÑR`ÐblÓ3mÐ0Ø!A‘ä!&§¡¨[ÄÇ
Á
ÐSW×SdÑSd×SkÑSkÔ!l�à×,Ñ,¨YÓ7ˆØ $× :Ñ :¸>Ó JÐØ"Ð%:Ñ:ˆ
à"×6Ñ6°|ÓDÐØÐ)Ñ)ˆ
à—^‘^ JÓ/ˆ
Ø—\‘\ *Ó-ˆ
ØÐr5   ©NNN)	r6   r7   r8   r9   rj   r:   r£   r    r¦   r§   s   @r.   r¼   r¼   r  sR   ø„ ÙQô
ð$ *.Ø.2Ø,0ñ	 à—<‘< $Ñ&ð ð Ÿ™ tÑ+ð ð —l‘l TÑ)÷	 r5   r¼   c                   óÆ   ‡ — e Zd Zdeddfˆ fd„Z	 	 d	dej                  dej                  dz  dedeej                  ej                  f   eej                     z  fd„Z	ˆ xZ
S )
ÚFlavaSelfAttentionrb   r%   Nc                 ó  •— t         ‰| �  «        |j                  |j                  z  dk7  r2t	        |d«      s&t        d|j                  › d|j                  › d�«      ‚|j                  | _        t        |j                  |j                  z  «      | _        | j                  | j                  z  | _        t        j                  |j                  | j                  |j                  ¬«      | _        t        j                  |j                  | j                  |j                  ¬«      | _        t        j                  |j                  | j                  |j                  ¬«      | _        t        j                  |j                   «      | _        y )Nr   Úembedding_sizezThe hidden size z4 is not a multiple of the number of attention heads ú.©Úbias)ri   rj   rn   Únum_attention_headsrÖ   r´   r¤   Úattention_head_sizeÚall_head_sizer   ÚLinearÚqkv_biasÚqueryÚkeyÚvaluert   Úattention_probs_dropout_probrv   rÒ   s     €r.   rj   zFlavaSelfAttention.__init__©  s.  ø€ Ü‰ÑÔØ×Ñ × :Ñ :Ñ:¸aÒ?ÌÐPVÐXhÔHiÜØ" 6×#5Ñ#5Ð"6ð 7Ø×3Ñ3Ð4°Að7óð ð
 $*×#=Ñ#=ˆÔ Ü#& v×'9Ñ'9¸F×<VÑ<VÑ'VÓ#WˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔä—Y‘Y˜v×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆŒ
Ü—9‘9˜V×/Ñ/°×1CÑ1CÈ&Ï/É/ÔZˆŒÜ—Y‘Y˜v×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆŒ
ä—z‘z &×"EÑ"EÓFˆ�r5   Úhidden_statesÚattention_maskÚoutput_attentionsc                 óR  — |j                   d d }g |¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }t        j                  ||j	                  dd«      «      }	|	t        j                  | j                  «      z  }	|�|	|z   }	t        j                  j                  |	d¬«      }
| j                  |
«      }
t        j                  |
|«      }|j                  dddd«      j!                  «       }|j#                  «       d d | j$                  fz   } |j                  |Ž }|r||
f}|S |f}|S )Nr|   r   r}   éþÿÿÿr‚   r   r   )r„   rå   ré   r‹   r¶   rê   rë   r:   ÚmatmulÚmathÚsqrtr   r‰   Úsoftmaxrv   rˆ   Ú
contiguousr   ræ   )r-   rí   rî   rï   r×   Úhidden_shapeÚquery_layerÚ	key_layerÚvalue_layerÚattention_scoresÚattention_probsÚcontext_layerÚnew_context_layer_shapeÚoutputss                 r.   r    zFlavaSelfAttention.forward»  s£  € ð $×)Ñ)¨#¨2Ð.ˆØC˜ÐC bÐC¨$×*BÑ*BÑCˆØ—j‘j Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆØ—H‘H˜]Ó+×0Ñ0°Ó>×HÑHÈÈAÓNˆ	Ø—j‘j Ó/×4Ñ4°\ÓB×LÑLÈQÐPQÓRˆô !Ÿ<™<¨°Y×5HÑ5HÈÈRÓ5PÓQÐà+¬d¯i©i¸×8PÑ8PÓ.QÑQÐØÐ%à/°.Ñ@Ðô Ÿ-™-×/Ñ/Ð0@ÀbÐ/ÓIˆð Ÿ,™, Ó7ˆäŸ™ _°kÓBˆà%×-Ñ-¨a°°A°qÓ9×DÑDÓFˆØ"/×"4Ñ"4Ó"6°s¸Ð";¸t×?QÑ?QÐ>SÑ"SÐØ*˜×*Ñ*Ð,CÐDˆá6G�= /Ð2ˆàˆð O\ÐM]ˆàˆr5   r¢   ©r6   r7   r8   ÚFlavaPossibleConfigsrj   r:   r£   rJ   r2   r    r¦   r§   s   @r.   rÞ   rÞ   ¨  sz   ø„ ðGÐ3ð G¸õ Gð* /3Ø"'ñ	#à—|‘|ð#ð Ÿ™ tÑ+ð#ð  ð	#ð
 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*¨U°5·<±<Ñ-@Ñ	@÷#r5   rÞ   c                   ó|   ‡ — e Zd ZdZdeddfˆ fd„Zdej                  dej                  dej                  fd„Zˆ xZ	S )	ÚFlavaSelfOutputzµ
    The residual connection is defined in FlavaLayer (same as ViTLayer) instead of here (as is the case with other
    models), due to the layernorm applied before each block.
    rb   r%   Nc                 óÈ   •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        j                  |j                  «      | _        y r^   )	ri   rj   r   rç   rn   Údensert   ru   rv   rÒ   s     €r.   rj   zFlavaSelfOutput.__init__ç  sB   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r5   rí   Úinput_tensorc                 óJ   — | j                  |«      }| j                  |«      }|S r^   ©r  rv   ©r-   rí   r  s      r.   r    zFlavaSelfOutput.forwardì  s$   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆàÐr5   )
r6   r7   r8   r9   r  rj   r:   r£   r    r¦   r§   s   @r.   r  r  á  sE   ø„ ñð
>Ð3ð >¸õ >ð
 U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r5   r  c                   óÆ   ‡ — e Zd Zdeddfˆ fd„Z	 	 d	dej                  dej                  dz  dedeej                  ej                  f   eej                     z  fd„Z	ˆ xZ
S )
ÚFlavaAttentionrb   r%   Nc                 ób   •— t         ‰| �  «        t        |«      | _        t	        |«      | _        y r^   )ri   rj   rÞ   Ú	attentionr  ÚoutputrÒ   s     €r.   rj   zFlavaAttention.__init__ô  s&   ø€ Ü‰ÑÔÜ+¨FÓ3ˆŒÜ% fÓ-ˆ�r5   rí   rî   rï   c                 ój   — | j                  |||¬«      }| j                  |d   |«      }|f|dd  z   }|S ©N)rî   rï   r   r   )r  r  )r-   rí   rî   rï   Úself_outputsÚattention_outputrÿ   s          r.   r    zFlavaAttention.forwardù  sO   € ð —~‘~Ø¨.ÐL]ð &ó 
ˆð  Ÿ;™; |°A¡¸ÓFÐà#Ð%¨°Q°RÐ(8Ñ8ˆØˆr5   r¢   r   r§   s   @r.   r  r  ó  sw   ø„ ð.Ð3ð .¸õ .ð /3Ø"'ñ	à—|‘|ðð Ÿ™ tÑ+ðð  ð	ð
 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*¨U°5·<±<Ñ-@Ñ	@÷r5   r  c                   ó`   ‡ — e Zd Zdeddfˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚFlavaIntermediaterb   r%   Nc                 ó  •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        |j                  t        «      rt        |j                     | _        y |j                  | _        y r^   )ri   rj   r   rç   rn   Úintermediate_sizer  r¬   Ú
hidden_actÚstrr	   Úintermediate_act_fnrÒ   s     €r.   rj   zFlavaIntermediate.__init__
  s]   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3KÑ3KÓLˆŒ
Ü�f×'Ñ'¬Ô-Ü'-¨f×.?Ñ.?Ñ'@ˆDÕ$à'-×'8Ñ'8ˆDÕ$r5   rí   c                 óJ   — | j                  |«      }| j                  |«      }|S r^   )r  r  ©r-   rí   s     r.   r    zFlavaIntermediate.forward  s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆàÐr5   ©	r6   r7   r8   r  rj   r:   r£   r    r¦   r§   s   @r.   r  r  	  s2   ø„ ð9Ð3ð 9¸õ 9ð U§\¡\ð °e·l±l÷ r5   r  c                   óx   ‡ — e Zd Zdeddfˆ fd„Zdej                  dej                  dej                  fd„Zˆ xZS )ÚFlavaOutputrb   r%   Nc                 óÈ   •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        j                  |j                  «      | _	        y r^   )
ri   rj   r   rç   r  rn   r  rt   ru   rv   rÒ   s     €r.   rj   zFlavaOutput.__init__  sB   ø€ Ü‰ÑÔÜ—Y‘Y˜v×7Ñ7¸×9KÑ9KÓLˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r5   rí   r  c                 óT   — | j                  |«      }| j                  |«      }||z   }|S r^   r  r	  s      r.   r    zFlavaOutput.forward!  s.   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆà%¨Ñ4ˆàÐr5   r  r§   s   @r.   r  r    s@   ø„ ð>Ð3ð >¸õ >ð U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r5   r  c                   óÊ   ‡ — e Zd ZdZdeddfˆ fd„Z	 	 d
dej                  dej                  dz  dede	ej                  ej                  f   e	ej                     z  fd	„Z
ˆ xZS )Ú
FlavaLayerz?This corresponds to the Block class in the timm implementation.rb   r%   Nc                 ór  •— t         ‰| �  «        |j                  | _        d| _        t	        |«      | _        t        |«      | _        t        |«      | _	        t        j                  |j                  |j                  ¬«      | _        t        j                  |j                  |j                  ¬«      | _        y )Nr   r¿   )ri   rj   Úchunk_size_feed_forwardÚseq_len_dimr  r  r  Úintermediater  r  r   rÍ   rn   rÎ   Úlayernorm_beforeÚlayernorm_afterrÒ   s     €r.   rj   zFlavaLayer.__init__-  s‰   ø€ Ü‰ÑÔØ'-×'EÑ'EˆÔ$ØˆÔÜ'¨Ó/ˆŒÜ-¨fÓ5ˆÔÜ! &Ó)ˆŒô !#§¡¨V×-?Ñ-?ÀV×EZÑEZÔ [ˆÔÜ!Ÿ|™|¨F×,>Ñ,>ÀF×DYÑDYÔZˆÕr5   rí   rî   rï   c                 óÞ   — | j                  | j                  |«      ||¬«      }|d   }|dd  }||z   }| j                  |«      }| j                  |«      }| j	                  ||«      }|f|z   }|S r  )r  r'  r(  r&  r  )r-   rí   rî   rï   Úself_attention_outputsr  rÿ   Úlayer_outputs           r.   r    zFlavaLayer.forward9  s–   € ð "&§¡Ø×!Ñ! -Ó0Ø)Ø/ð "0ó "
Ðð
 2°!Ñ4ÐØ(¨¨Ð,ˆð )¨=Ñ8ˆð ×+Ñ+¨MÓ:ˆØ×(Ñ(¨Ó6ˆð —{‘{ <°Ó?ˆà�/ GÑ+ˆàˆr5   r¢   )r6   r7   r8   r9   r  rj   r:   r£   rJ   r2   r    r¦   r§   s   @r.   r"  r"  *  s}   ø„ ÙIð
[Ð3ð 
[¸õ 
[ð /3Ø"'ñ	à—|‘|ðð Ÿ™ tÑ+ðð  ð	ð
 
ˆu�|‰|˜UŸ\™\Ð)Ñ	*¨U°5·<±<Ñ-@Ñ	@÷r5   r"  c                   ó†   ‡ — e Zd Zdeddfˆ fd„Z	 	 	 	 ddej                  dej                  dz  deded	edee	z  fd
„Z
ˆ xZS )ÚFlavaEncoderrb   r%   Nc                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w r¢   )
ri   rj   rb   r   Ú
ModuleListÚrangeÚnum_hidden_layersr"  ÚlayerÚgradient_checkpointing)r-   rb   rœ   rw   s      €r.   rj   zFlavaEncoder.__init__W  sN   ø€ Ü‰ÑÔØˆŒÜ—]‘]ÄÀf×F^ÑF^Ó@_Ö#`¸1¤J¨vÕ$6Ò#`ÓaˆŒ
Ø&+ˆÕ#ùò $as   ½A#rí   rî   rï   Úoutput_hidden_statesÚreturn_dictc                 óô   — |rdnd }|rdnd }t        | j                  «      D ](  \  }}	|r||fz   } |	|||«      }
|
d   }|sŒ ||
d   fz   }Œ* |r||fz   }|st        d„ |||fD «       «      S t        |||¬«      S )Nr=   r   r   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr^   r=   )r+   rI   s     r.   r/   z'FlavaEncoder.forward.<locals>.<genexpr>w  s   è ø€ Òm˜qÐ_`Ñ_lœÑmùó   ‚Š)Úlast_hidden_staterí   Ú
attentions)Ú	enumerater2  r2   r   )r-   rí   rî   rï   r4  r5  Úall_hidden_statesÚall_self_attentionsÚiÚlayer_moduleÚlayer_outputss              r.   r    zFlavaEncoder.forward]  s¼   € ñ #7™B¸DÐÙ$5™b¸4Ðä(¨¯©Ó4ò 		P‰OˆAˆ|Ù#Ø$5¸Ð8HÑ$HÐ!á(¨¸ÐHYÓZˆMà)¨!Ñ,ˆMâ Ø&9¸]È1Ñ=MÐ<OÑ&OÑ#ð		Pñ  Ø 1°]Ð4DÑ DÐáÜÑm ]Ð4EÐGZÐ$[ÔmÓmÐmÜØ+Ð;LÐYlô
ð 	
r5   )NFFT)r6   r7   r8   r   rj   r:   r£   rJ   r2   r   r    r¦   r§   s   @r.   r-  r-  V  su   ø„ ð,˜{ð ,¨tõ ,ð /3Ø"'Ø%*Ø ñ
à—|‘|ð
ð Ÿ™ tÑ+ð
ð  ð	
ð
 #ð
ð ð
ð 
�Ñ	 ÷
r5   r-  c                   óD   ‡ — e Zd Zdefˆ fd„Zdej                  fd„Zˆ xZS )ÚFlavaPoolerrb   c                 ó²   •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        j                  «       | _        y r^   )ri   rj   r   rç   rn   r  ÚTanhÚ
activationrÒ   s     €r.   rj   zFlavaPooler.__init__~  s9   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
ÜŸ'™'›)ˆ�r5   rí   c                 ó\   — |d d …df   }| j                  |«      }| j                  |«      }|S ©Nr   )r  rE  )r-   rí   Úfirst_token_tensorÚpooled_outputs       r.   r    zFlavaPooler.forwardƒ  s6   € ð +ª1¨a¨4Ñ0ÐØŸ
™
Ð#5Ó6ˆØŸ™¨Ó6ˆØÐr5   r  r§   s   @r.   rB  rB  }  s    ø„ ð$Ð3õ $ð
 U§\¡\÷ r5   rB  c                   ó°   ‡ — e Zd ZU eed<   dZdZdZ ej                  «       de
j                  e
j                  z  e
j                  z  ddfˆ fd„«       Zˆ xZS )	ÚFlavaPreTrainedModelrb   Úflava)ÚimageÚtextTÚmoduler%   Nc                 ó�  •— t         ‰| �  |«       t        |t        «      r t	        j
                  |j                  «       yt        |t        «      rkt	        j
                  |j                  «       t	        j
                  |j                  «       |j                  � t	        j
                  |j                  «       yyt        |t        «      ryt	        j                  |j                  t        j                  |j                  j                   d   «      j#                  d«      «       t	        j
                  |j$                  «       yt        |t&        «      r-|j(                  r t	        j
                  |j                  «       yyt        |t*        «      r5t	        j,                  |j.                  | j0                  j2                  «       yy)zInitialize the weightsNr|   rÂ   )ri   Ú_init_weightsr¬   ÚFlavaMaskedPredictionHeadÚinitÚzeros_rã   ra   ro   rs   rk   r¼   Úcopy_rÁ   r:   rÐ   r„   r—   rÄ   ÚFlavaMultimodalModelÚuse_cls_tokenÚ
FlavaModelÚ	constant_Úlogit_scalerb   Úlogit_scale_init_value)r-   rO  rw   s     €r.   rQ  z"FlavaPreTrainedModel._init_weights“  s/  ø€ ô 	‰Ñ˜fÔ%Ü�fÔ7Ô8Ü�K‰K˜Ÿ™Õ$Ü˜Ô 4Ô5Ü�K‰K˜×(Ñ(Ô)Ü�K‰K˜×2Ñ2Ô3Ø× Ñ Ð,Ü—‘˜F×-Ñ-Õ.ð -ä˜Ô 3Ô4Ü�J‰J�v×*Ñ*¬E¯L©L¸×9LÑ9L×9RÑ9RÐSUÑ9VÓ,W×,^Ñ,^Ð_fÓ,gÔhÜ�K‰K˜×-Ñ-Õ.Ü˜Ô 4Ô5Ø×#Ò#Ü—‘˜F×,Ñ,Õ-ð $ä˜¤
Ô+Ü�N‰N˜6×-Ñ-¨t¯{©{×/QÑ/QÕRð ,r5   )r6   r7   r8   r   r<   Úbase_model_prefixÚinput_modalitiesÚsupports_gradient_checkpointingr:   Úno_gradr   rç   r°   rÍ   rQ  r¦   r§   s   @r.   rK  rK  Œ  s]   ø… àÓØÐØ(ÐØ&*Ð#à€U‡]�]ƒ_ðS B§I¡I°·	±	Ñ$9¸B¿L¹LÑ$Hð SÈTô Só ôSr5   rK  c                   ó0  ‡ — e Zd ZU eed<   dZdZdZddedefˆ fd„Z	de
j                  fd„Zd	e
j                  fd
„Ze	 	 	 	 	 	 	 ddej                   dz  dej"                  dz  dedz  dej                   dz  dedz  dedz  dedz  deez  fd„«       Zˆ xZS )ÚFlavaImageModelrb   zflava.image_modelr”   ©rM  Úadd_pooling_layerc                 ó  •— t         ‰| �  |«       || _        t        |«      | _        t        |«      | _        t        j                  |j                  |j                  ¬«      | _        |rt        |«      nd| _        | j                  «        y©úv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        r¿   N)ri   rj   rb   ra   rx   r-  Úencoderr   rÍ   rn   rÎ   Ú	layernormrB  ÚpoolerÚ	post_init©r-   rb   rc  rw   s      €r.   rj   zFlavaImageModel.__init__°  si   ø€ ô
 	‰Ñ˜Ô àˆŒä.¨vÓ6ˆŒÜ# FÓ+ˆŒäŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÙ->”k &Ô)ÀDˆŒà�‰Õr5   r%   c                 ó.   — | j                   j                  S r^   ©rx   rq   r4   s    r.   Úget_input_embeddingsz$FlavaImageModel.get_input_embeddingsÁ  s   € Ø�‰×/Ñ/Ð/r5   rë   c                 ó&   — || j                   _        y r^   rm  ©r-   rë   s     r.   Úset_input_embeddingsz$FlavaImageModel.set_input_embeddingsÄ  s   € Ø+0ˆ�‰Õ(r5   Nr•   r“   rî   rï   r4  r5  c                 óÔ  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|€t	        d«      ‚| j                  |||¬«      }	| j                  |	||||¬«      }
|
d   }| j                  |«      }| j                  �| j                  |«      nd}|s
||f|
dd z   S t        |||
j                  |
j                  ¬«      S )zÅ
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, image_num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
        Nz You have to specify pixel_values)r•   r“   ©rî   rï   r4  r5  r   r   ©r9  Úpooler_outputrí   r:  )rb   rï   r4  r5  r´   rx   rg  rh  ri  r   rí   r:  )r-   r”   r•   r“   rî   rï   r4  r5  ÚkwargsÚembedding_outputÚencoder_outputsÚsequence_outputrI  s                r.   r    zFlavaImageModel.forwardÇ  s  € ð  2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆàÐÜÐ?Ó@Ð@àŸ?™?Ø¨/ÐTlð +ó 
Ðð Ÿ,™,ØØ)Ø/Ø!5Ø#ð 'ó 
ˆð *¨!Ñ,ˆØŸ.™.¨Ó9ˆØ8<¿¹Ð8O˜Ÿ™ OÔ4ÐUYˆáØ# ]Ð3°oÀaÀbÐ6IÑIÐIä)Ø-Ø'Ø)×7Ñ7Ø&×1Ñ1ô	
ð 	
r5   ©T©NNNNNNN)r6   r7   r8   r   r<   r\  Úmain_input_namer]  rJ   rj   r   ÚModulern  rq  r   r:   r£   r¥   r2   r   r    r¦   r§   s   @r.   ra  ra  ¨  sú   ø… àÓà+ÐØ$€OØ!ÐñÐ/ð ÀDõ ð"0 b§i¡ió 0ð1¨"¯)©)ó 1ð ð -1Ø37Ø04Ø.2Ø)-Ø,0Ø#'ñ/
à—l‘l TÑ)ð/
ð ×)Ñ)¨DÑ0ð/
ð #'¨¡+ð	/
ð
 Ÿ™ tÑ+ð/
ð   $™;ð/
ð # T™kð/
ð ˜D‘[ð/
ð 
Ð+Ñ	+ò/
ó ô/
r5   ra  c                   ó,  ‡ — e Zd ZU eed<   dZdZddedefˆ fd„Zde	fd„Z
dej                  fd	„Z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
z  ded
z  deez  fd„«       Zˆ xZS )ÚFlavaTextModelrb   zflava.text_model)rN  rc  c                 ó  •— t         ‰| �  |«       || _        t        |«      | _        t        |«      | _        t        j                  |j                  |j                  ¬«      | _        |rt        |«      nd| _        | j                  «        yre  )ri   rj   rb   r¼   rx   r-  rg  r   rÍ   rn   rÎ   rh  rB  ri  rj  rk  s      €r.   rj   zFlavaTextModel.__init__  si   ø€ ô
 	‰Ñ˜Ô ØˆŒä-¨fÓ5ˆŒÜ# FÓ+ˆŒäŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÙ->”k &Ô)ÀDˆŒà�‰Õr5   r%   c                 ó.   — | j                   j                  S r^   ©rx   rÉ   r4   s    r.   rn  z#FlavaTextModel.get_input_embeddings  s   € Ø�‰×.Ñ.Ð.r5   rë   c                 ó&   — || j                   _        y r^   r‚  rp  s     r.   rq  z#FlavaTextModel.set_input_embeddings  s   € Ø*/ˆ�‰Õ'r5   NrÓ   rî   rÄ   rÁ   rï   r4  r5  c                 ó  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|€t	        d«      ‚| j                  |||¬«      }	t        | j                   |	|¬«      }| j                  |	||||¬«      }
|
d   }| j                  |«      }| j                  �| j                  |«      nd}|s
||f|
dd z   S t        |||
j                  |
j                  ¬«      S )	aù  
        input_ids (`torch.LongTensor` of shape `(batch_size, text_seq_length)`):
            Indices of input sequence tokens in the vocabulary. Indices can be obtained using [`AutoTokenizer`]. See
            [`PreTrainedTokenizer.encode`] and [`PreTrainedTokenizer.__call__`] for details. [What are input
            IDs?](../glossary#input-ids)
        token_type_ids (`torch.LongTensor` of shape `(batch_size, text_seq_length)`, *optional*):
            Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
            1]`:
            - 0 corresponds to a *sentence A* token,
            - 1 corresponds to a *sentence B* token.
            [What are token type IDs?](../glossary#token-type-ids)
        NzYou have to specify input_ids)rÓ   rÄ   rÁ   ©rb   rÛ   rî   rs  r   r   rt  )rb   rï   r4  r5  r´   rx   r
   rg  rh  ri  r   rí   r:  )r-   rÓ   rî   rÄ   rÁ   rï   r4  r5  rv  rw  rx  ry  rI  s                r.   r    zFlavaTextModel.forward  s1  € ð0 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆàÐÜÐ<Ó=Ð=àŸ?™?ØØ)Ø%ð +ó 
Ðô 3Ø—;‘;Ø*Ø)ô
ˆð Ÿ,™,ØØ)Ø/Ø!5Ø#ð 'ó 
ˆð *¨!Ñ,ˆØŸ.™.¨Ó9ˆØ8<¿¹Ð8O˜Ÿ™ OÔ4ÐUYˆáØ# ]Ð3°oÀaÀbÐ6IÑIÐIä)Ø-Ø'Ø)×7Ñ7Ø&×1Ñ1ô	
ð 	
r5   rz  r{  )r6   r7   r8   r   r<   r\  r]  rJ   rj   rp   rn  r   r}  rq  r   r:   r£   r2   r   r    r¦   r§   s   @r.   r  r  ú  só   ø… àÓà*ÐØ Ðñ˜ð À4õ ð / oó /ð0¨"¯)©)ó 0ð ð *.Ø.2Ø.2Ø,0Ø)-Ø,0Ø#'ñ?
à—<‘< $Ñ&ð?
ð Ÿ™ tÑ+ð?
ð Ÿ™ tÑ+ð	?
ð
 —l‘l TÑ)ð?
ð   $™;ð?
ð # T™kð?
ð ˜D‘[ð?
ð 
Ð+Ñ	+ò?
ó ô?
r5   r  c                   ó´   ‡ — e Zd ZU eed<   dZdZddefˆ fd„Ze	 	 	 	 dde	j                  de	j                  dz  dedz  dedz  d	edz  d
eez  fd„«       Zˆ xZS )rV  rb   zflava.multimodal_modelrí   c                 óº  •— t         ‰| �  |«       || _        | j                  j                  | _        | j                  r9t	        j
                  t        j                  dd|j                  «      «      | _	        t        |«      | _        t	        j                  |j                  |j                  ¬«      | _        |rt        |«      nd| _        | j#                  «        y)rf  r   r¿   N)ri   rj   rb   rW  r   rl   r:   rm   rn   ro   r-  rg  rÍ   rÎ   rh  rB  ri  rj  rk  s      €r.   rj   zFlavaMultimodalModel.__init__a  s›   ø€ ô
 	‰Ñ˜Ô ØˆŒØ!Ÿ[™[×6Ñ6ˆÔØ×ÒÜŸ\™\¬%¯+©+°a¸¸F×<NÑ<NÓ*OÓPˆDŒNä# FÓ+ˆŒäŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒÙ->”k &Ô)ÀDˆŒà�‰Õr5   Nrî   rï   r4  r5  r%   c                 óx  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|j	                  «       \  }}}	| j
                  r;| j                  j                  |dd«      }
t        j                  |
|fd¬«      }|dz  }t        | j                   ||¬«      }| j                  |||||¬«      }|d   }| j                  |«      }| j                  �| j                  |«      nd}|s
||f|dd z   S t        |||j                  |j                   ¬«      S )	z¾
        hidden_states (`torch.FloatTensor` of shape `(batch_size, image_num_patches + text_seq_len, hidden_size)`):
            The concatenated hidden states of unimodal encoders.
        Nr|   r   r‚   r…  rs  r   rt  )rb   rï   r4  r5  r   rW  ro   r—   r:   rŒ   r
   rg  rh  ri  r   rí   r:  )r-   rí   rî   rï   r4  r5  rv  rš   rØ   rœ   rŸ   rx  ry  rI  s                 r.   r    zFlavaMultimodalModel.forwards  sT  € ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà$1×$6Ñ$6Ó$8Ñ!ˆ
�J à×ÒØŸ™×.Ñ.¨z¸2¸rÓBˆJÜ!ŸI™I z°=Ð&AÀqÔIˆMØ˜!‰OˆJä2Ø—;‘;Ø'Ø)ô
ˆð Ÿ,™,ØØ)Ø/Ø!5Ø#ð 'ó 
ˆð *¨!Ñ,ˆØŸ.™.¨Ó9ˆØ8<¿¹Ð8O˜Ÿ™ OÔ4ÐUYˆáØ# ]Ð3°oÀaÀbÐ6IÑIÐIä)Ø-Ø'Ø)×7Ñ7Ø&×1Ñ1ô	
ð 	
r5   rz  )NNNN)r6   r7   r8   r   r<   r\  r|  rj   r   r:   r£   rJ   r2   r   r    r¦   r§   s   @r.   rV  rV  Z  sœ   ø… à!Ó!à0ÐØ%€OñÐ4õ ð$ ð /3Ø)-Ø,0Ø#'ñ3
à—|‘|ð3
ð Ÿ™ tÑ+ð3
ð   $™;ð	3
ð
 # T™kð3
ð ˜D‘[ð3
ð 
Ð+Ñ	+ò3
ó ô3
r5   rV  c                   ó˜  ‡ — e Zd ZU eed<   defˆ fd„Zee	 	 	 ddej                  dej                  dz  dej                  dz  dej                  dz  de
e   d	eez  fd
„«       «       Zee	 	 	 ddej                  dej                  dz  dedz  dej                  dz  de
e   d	eez  fd„«       «       Z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dedz  d	eez  fd„«       Zˆ xZS )rX  rb   c                 óÜ  •— t         ‰| �  |«       t        |j                  t        «      s"t        dt        |j                  «      › d�«      ‚t        |j                  t        «      s"t        dt        |j                  «      › d�«      ‚t        |j                  t        «      s%t        ddt        |j                  «      › d�z   «      ‚|j                  }|j                  }|j                  }|j                  | _        |j                  | _        |j                  | _        |j                  | _        t!        |«      | _        t%        |«      | _        t)        |«      | _        t-        j.                  | j                  | j                  «      | _        t-        j.                  | j                  | j                  «      | _        t-        j4                  t7        j8                  | j:                  j<                  «      «      | _        t-        j.                  | j                  | j                  «      | _         t-        j.                  | j                  | j                  «      | _!        | jE                  «        y )NzLconfig.text_config is expected to be of type FlavaTextConfig but is of type rá   zNconfig.image_config is expected to be of type FlavaImageConfig but is of type zMconfig.multimodal_config is expected to be of type FlavaMultimodalConfig but zis of type )#ri   rj   r¬   Útext_configr   Ú	TypeErrorÚtypeÚimage_configr   Úmultimodal_configr   Úprojection_dimrn   Útext_hidden_sizeÚimage_hidden_sizeÚmm_hidden_sizer  Ú
text_modelra  Úimage_modelrV  Úmultimodal_modelr   rç   Úimage_projectionÚtext_projectionrl   r:   Útensorrb   r[  rZ  Úimage_to_mm_projectionÚtext_to_mm_projectionrj  )r-   rb   r‹  rŽ  r�  rw   s        €r.   rj   zFlavaModel.__init__®  sõ  ø€ Ü‰Ñ˜Ô ä˜&×,Ñ,¬oÔ>ÜðÜ˜×+Ñ+Ó,Ð-¨Qð0óð ô
 ˜&×-Ñ-Ô/?Ô@ÜðÜ˜×,Ñ,Ó-Ð.¨að1óð ô
 ˜&×2Ñ2Ô4IÔJÜØ_Ø¤ V×%=Ñ%=Ó >Ð?¸qÐAñBóð ð
 ×(Ñ(ˆØ×*Ñ*ˆØ"×4Ñ4Ðà$×3Ñ3ˆÔØ +× 7Ñ 7ˆÔØ!-×!9Ñ!9ˆÔØ/×;Ñ;ˆÔä(¨Ó5ˆŒÜ*¨<Ó8ˆÔÜ 4Ð5FÓ GˆÔä "§	¡	¨$×*@Ñ*@À$×BUÑBUÓ VˆÔÜ!Ÿy™y¨×)>Ñ)>À×@SÑ@SÓTˆÔÜŸ<™<¬¯©°T·[±[×5WÑ5WÓ(XÓYˆÔä&(§i¡i°×0FÑ0FÈ×H[ÑH[Ó&\ˆÔ#Ü%'§Y¡Y¨t×/DÑ/DÀd×FYÑFYÓ%ZˆÔ"à�‰Õr5   NrÓ   rî   rÄ   rÁ   rv  r%   c           	      óz   —  | j                   d||||ddœ|¤Ž}|j                  }| j                  |«      |_        |S )a	  
        input_ids (`torch.LongTensor` of shape `(batch_size, text_seq_length)`):
            Indices of input sequence tokens in the vocabulary. Indices can be obtained using [`AutoTokenizer`]. See
            [`PreTrainedTokenizer.encode`] and [`PreTrainedTokenizer.__call__`] for details. [What are input
            IDs?](../glossary#input-ids)
        token_type_ids (`torch.LongTensor` of shape `(batch_size, text_seq_length)`, *optional*):
            Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
            1]`:
            - 0 corresponds to a *sentence A* token,
            - 1 corresponds to a *sentence B* token.
            [What are token type IDs?](../glossary#token-type-ids)

        Examples:

        ```python
        >>> import torch
        >>> from transformers import AutoProcessor, FlavaModel

        >>> model = FlavaModel.from_pretrained("{0}")
        >>> processor = AutoProcessor.from_pretrained("{0}")

        >>> inputs = processor(
        ...     text=["a photo of a cat", "a photo of a dog"], max_length=77, padding="max_length", return_tensors="pt"
        ... )
        >>> with torch.inference_mode():
        ...     text_features = model.get_text_features(**inputs)
        ```
        T)rÓ   rî   rÄ   rÁ   r5  r=   )r”  r9  r˜  ru  )r-   rÓ   rî   rÄ   rÁ   rv  Útext_outputsr9  s           r.   Úget_text_featureszFlavaModel.get_text_featuresÙ  s\   € ðL 4C°4·?±?ð 4
ØØ)Ø)Ø%Øñ4
ð ñ4
ˆð )×:Ñ:ÐØ%)×%9Ñ%9Ð:KÓ%LˆÔ"àÐr5   r”   r•   r“   c           	      óz   —  | j                   d||||ddœ|¤Ž}|j                  }| j                  |«      |_        |S )a   
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, image_num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).

        Examples:

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

        >>> model = FlavaModel.from_pretrained("{0}")
        >>> processor = AutoProcessor.from_pretrained("{0}")

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

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

        >>> with torch.inference_mode():
        ...     image_features = model.get_image_features(**inputs)
        ```
        T)r”   r•   rî   r“   r5  r=   )r•  r9  r—  ru  )r-   r”   r•   r“   rî   rv  Úimage_outputsr9  s           r.   Úget_image_featureszFlavaModel.get_image_features  s^   € ðB 5E°D×4DÑ4Dð 5
Ø%Ø+Ø)Ø%=Øñ5
ð ñ5
ˆð *×;Ñ;ÐØ&*×&;Ñ&;Ð<MÓ&NˆÔ#àÐr5   Úimage_attention_maskÚskip_multimodal_encoderrï   r4  r5  c           	      óÒ  — |�|n| j                   j                  }|
st        d«      ‚d}d}d}d}|�5| j                  ||||	|
|¬«      }|d   |d   }}| j	                  |d   «      }d}d}d}d}|�6| j                  |||||	|
|¬«      }|d   |d   }}| j                  |d   «      }d}d}|�¡|�Ÿ|s�|�g|j                  \  }}}| j                  j                  r|dz  }t        j                  |||j                  ¬	«      }t        j                  ||gd¬
«      }nd}t        j                  ||gd¬
«      }| j                  |||¬«      }|d   }|s||||||fS t        ||||||¬«      S )a/
  
        input_ids (`torch.LongTensor` of shape `(batch_size, image_num_patches + text_seq_len)`):
            Indices of input sequence tokens in the vocabulary. Indices can be obtained using [`AutoTokenizer`]. See
            [`PreTrainedTokenizer.encode`] and [`PreTrainedTokenizer.__call__`] for details. [What are input
            IDs?](../glossary#input-ids)
        token_type_ids (`torch.LongTensor` of shape `(batch_size, image_num_patches + text_seq_len)`, *optional*):
            Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
            1]`:
            - 0 corresponds to a *sentence A* token,
            - 1 corresponds to a *sentence B* token.
            [What are token type IDs?](../glossary#token-type-ids)
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, image_num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
        image_attention_mask (`torch.Tensor` of shape `(batch_size, image_num_patches)`, *optional*):
            Mask to avoid performing attention on padding pixel values for image inputs. Mask values selected in `[0, 1]`:
            - 1 for pixel values that are real (i.e., **not masked**),
            - 0 for pixel values that are padding (i.e., **masked**).
        skip_multimodal_encoder (*bool*, *optional*):
            Skip any calculations for multimodal encoder. Useful if multimodal encoding is not going to be used.

        Examples:

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

        >>> model = FlavaModel.from_pretrained("facebook/flava-full")
        >>> processor = AutoProcessor.from_pretrained("facebook/flava-full")

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

        >>> inputs = processor(text=["a photo of a cat"], images=image, return_tensors="pt", padding=True)

        >>> outputs = model(**inputs)

        >>> image_embeddings = outputs.image_embeddings
        >>> text_embeddings = outputs.text_embeddings
        >>> multimodal_embeddings = outputs.multimodal_embeddings

        >>> outputs.image_embeddings.shape
        torch.Size([1, 197, 768])

        >>> text_embeddings.shape
        torch.Size([1, 7, 768])

        >>> multimodal_embeddings.shape
        torch.Size([1, 205, 768])
        ```
        NzRFLAVA model requires hidden states to work. Please set `output_hidden_states=True`)r”   r•   rî   rï   r4  r5  r   r}   r|   )rÓ   rî   rÁ   rÄ   rï   r4  r5  r   ©rÕ   r‚   )rî   r5  )r   r    r!   r"   r#   r$   )rb   r5  r´   r•  rš  r”  r›  r„   r–  rW  r:   ÚonesrÕ   rŒ   r   )r-   rÓ   r”   rî   rÄ   r•   rÁ   r¢  r£  rï   r4  r5  rv  r   Úimage_statesÚimage_mm_projectionr    r!   Útext_statesÚtext_mm_projectionr"   r#   r$   rš   r›   rœ   Úattention_mask_imageÚattention_multimodalÚmultimodal_inputs                                r.   r    zFlavaModel.forward:  s
  € ðL &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆÙ#ÜÐqÓrÐrØÐØˆØ"ÐØˆØÐ#Ø×+Ñ+Ø)Ø /Ø3Ø"3Ø%9Ø'ð ,ó ˆLð .:¸!©_¸lÈ1¹o˜lÐà"&×"=Ñ"=¸lÈ2Ñ>NÓ"OÐàˆØˆØ!ÐØˆØÐ ØŸ/™/Ø#Ø-Ø)Ø-Ø"3Ø%9Ø'ð *ó ˆKð ,7°q©>¸;Àq¹>˜[ˆOà!%×!;Ñ!;¸KÈ¹OÓ!LÐà $ÐØ ÐØÐ*Ð/AÐ/MÑVmØÐ)Ø)<×)BÑ)BÑ&�
˜G QØ×(Ñ(×6Ò6Ø˜q‘L�GÜ',§z¡z°*¸gÐNa×NhÑNhÔ'iÐ$Ü',§y¡yÐ2FÈÐ1WÐ]^Ô'_Ñ$à'+Ð$Ü$Ÿy™yÐ*=Ð?QÐ)RÐXYÔZÐØ $× 5Ñ 5Ø Ð1EÐS^ð !6ó !Ðð %6°aÑ$8Ð!áà ØØØØ%Ø!ðð ô  Ø-Ø%Ø+Ø#Ø"7Ø/ô
ð 	
r5   rÜ   )NNNNNNNNNTN)r6   r7   r8   r   r<   rj   r   r   r:   r£   r   r   r2   r   rž  r¥   rJ   r¡  Ú
LongTensorr;   r   r    r¦   r§   s   @r.   rX  rX  ª  s?  ø… àÓð)˜{õ )ðV Øð /3Ø.2Ø,0ñ/à—<‘<ð/ð Ÿ™ tÑ+ð/ð Ÿ™ tÑ+ð	/ð
 —l‘l TÑ)ð/ð Ð+Ñ,ð/ð 
Ð+Ñ	+ò/ó ó ð/ðb Øð 48Ø04Ø.2ñ*à—l‘lð*ð ×)Ñ)¨DÑ0ð*ð #'¨¡+ð	*ð
 Ÿ™ tÑ+ð*ð Ð+Ñ,ð*ð 
Ð+Ñ	+ò*ó ó ð*ðX ð .2Ø15Ø.2Ø.2Ø/3Ø04Ø48Ø/3Ø)-Ø%)Ø#'ñN
à×#Ñ# dÑ*ðN
ð ×'Ñ'¨$Ñ.ðN
ð Ÿ™ tÑ+ð	N
ð
 Ÿ™ tÑ+ðN
ð Ÿ™¨Ñ,ðN
ð ×&Ñ&¨Ñ-ðN
ð $Ÿl™l¨TÑ1ðN
ð "&¨¡ðN
ð   $™;ðN
ð #ðN
ð ˜D‘[ðN
ð 
Ð!Ñ	!òN
ó ôN
r5   rX  c                   ó`   ‡ — e Zd Zdedefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚFlavaImageCodebookResPathÚin_sizeÚout_sizec                 ó  •— t         ‰| �  «        |dz  }t        «       }t        j                  «       |d<   t        j
                  ||dd¬«      |d<   t        j                  «       |d<   t        j
                  ||dd¬«      |d<   t        j                  «       |d	<   t        j
                  ||dd¬«      |d
<   t        j                  «       |d<   t        j
                  ||dd¬«      |d<   t        j                  |«      | _        y )Né   Úrelu_1r   r   ©rª   ÚpaddingÚconv_1Úrelu_2Úconv_2Úrelu_3Úconv_3Úrelu_4r   Úconv_4)ri   rj   r   r   ÚReLUr°   Ú
SequentialÚpath)r-   r±  r²  rv  Úhid_sizerÁ  rw   s         €r.   rj   z"FlavaImageCodebookResPath.__init__Í  sÊ   ø€ Ü‰ÑÔØ˜q‘=ˆä‹}ˆÜŸ™›ˆˆX‰ÜŸ™ 7¨HÀ!ÈQÔOˆˆX‰ÜŸ™›ˆˆX‰ÜŸ™ 8¨XÀ1ÈaÔPˆˆX‰ÜŸ™›ˆˆX‰ÜŸ™ 8¨XÀ1ÈaÔPˆˆX‰ÜŸ™›ˆˆX‰ÜŸ™ 8¨XÀ1ÈaÔPˆˆX‰ä—M‘M $Ó'ˆ�	r5   r·   r%   c                 ó$   — | j                  |«      S r^   )rÁ  ©r-   r·   s     r.   r    z!FlavaImageCodebookResPath.forwardÝ  s   € Ø�y‰y˜‹|Ðr5   ©	r6   r7   r8   r¤   rj   r:   r£   r    r¦   r§   s   @r.   r°  r°  Ì  s1   ø„ ð( ð (¨sõ (ð ˜Ÿ™ð ¨%¯,©,÷ r5   r°  c                   ód   ‡ — e Zd Zdededefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚFlavaImageCodebookBlockr±  r²  Ú
num_layersc                 óØ   •— t         ‰| �  «        d|dz  z  | _        ||k7  rt        j                  ||dd¬«      | _        nt        j                  «       | _        t        ||«      | _        y )Nr   r}   r   r¶  )	ri   rj   Ú	post_gainr   r°   Úid_pathÚIdentityr°  Úres_path)r-   r±  r²  rÈ  rv  rw   s        €r.   rj   z FlavaImageCodebookBlock.__init__â  sW   ø€ Ü‰ÑÔà˜j¨!™mÑ,ˆŒà�hÒÜŸ9™9 W¨hÀAÈqÔQˆD�LäŸ;™;›=ˆDŒLä1°'¸8ÓDˆ�r5   r·   r%   c                 ób   — | j                  |«      | j                  | j                  |«      z  z   S r^   )rË  rÊ  rÍ  rÄ  s     r.   r    zFlavaImageCodebookBlock.forwardî  s'   € Ø�|‰|˜A‹ §¡°$·-±-ÀÓ2BÑ!BÑBÐBr5   rÅ  r§   s   @r.   rÇ  rÇ  á  s?   ø„ ð
E ð 
E¨sð 
EÀõ 
EðC˜Ÿ™ð C¨%¯,©,÷ Cr5   rÇ  c                   ón   ‡ — e Zd Zd
dededededef
ˆ fd„Zdej                  dej                  fd	„Zˆ xZ	S )ÚFlavaImageCodebookLayerGroupÚ
num_blocksrÈ  r±  r²  Úuse_poolc                 ó$  •— t         ‰| �  «        t        «       }t        |«      D ]4  }|dk(  rt	        |||«      |d|dz   › �<   Œt	        |||«      |d|dz   › �<   Œ6 |rt        j                  d¬«      |d<   t        j                  |«      | _        y )Nr   Úblock_r   r}   )rª   Úpool)	ri   rj   r   r0  rÇ  r   Ú	MaxPool2drÀ  Úgroup)	r-   rÑ  rÈ  r±  r²  rÒ  Úblocksr>  rw   s	           €r.   rj   z%FlavaImageCodebookLayerGroup.__init__ó  s—   ø€ Ü‰ÑÔÜ“ˆÜ�zÓ"ò 	cˆAØ�AŠvÜ+BÀ7ÈHÐV`Ó+a�˜  A¡˜wÐ'Ò(ä+BÀ8ÈXÐWaÓ+b�˜  A¡˜wÐ'Ò(ð		cñ ÜŸ\™\°aÔ8ˆF�6‰Nä—]‘] 6Ó*ˆ�
r5   r·   r%   c                 ó$   — | j                  |«      S r^   )r×  rÄ  s     r.   r    z$FlavaImageCodebookLayerGroup.forward  s   € Ø�z‰z˜!‹}Ðr5   rz  )
r6   r7   r8   r¤   rJ   rj   r:   r£   r    r¦   r§   s   @r.   rÐ  rÐ  ò  sH   ø„ ñ+ 3ð +°Cð +À#ð +ÐQTð +Ð`dõ +ð˜Ÿ™ð ¨%¯,©,÷ r5   rÐ  a"  
    The FLAVA's image codebook model inspired from DALL-E's original encoder. Outputs raw hidden states and can be used
    to generate image tokens for an image based on DALL-E's vocab. Used to generate labels for MIM. Use
    `get_codebook_indices` to get image tokens for an image.
    c                   óì   ‡ — e Zd ZU dZeed<   dZdZdZdede	fˆ fd„Z
dej                  dej                  fd	„Zdej                  dej                  fd
„Zdej                  dej                  fd„Zˆ xZS )ÚFlavaImageCodebookÚmodelrb   r”   rb  Frv  c                 óÆ  •— t         ‰| �  |«       || _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        | j                  | j
                  z  }t        «       }t        j                  «       |d<   t        j                  d| j                  z  | j                  dd¬«      |d<   t        «       }t        j                  | j                  d| j                  z  dd¬«      |d	<   t        | j
                  |d| j                  z  d| j                  z  «      |d
<   t        | j
                  |d| j                  z  d| j                  z  «      |d<   t        | j
                  |d| j                  z  d| j                  z  «      |d<   t        | j
                  |d| j                  z  d| j                  z  d¬«      |d<   t        j                  |«      |d<   t        j                  |«      | _        | j                  «        | j                  j                   r| j#                  «       D ]	  }d|_        Œ y y )NÚrelué   r   r   r¶  Úconvé   r   ÚinputÚgroup_1r}   Úgroup_2r´  Úgroup_3F)rÒ  Úgroup_4r  )ri   rj   rb   Ú
num_groupsÚinput_channelsÚnum_blocks_per_grouprn   rÇ   r   r   r¿  r°   rÐ  rÀ  rØ  rj  ÚfreezeÚ
parametersÚrequires_grad)r-   rb   rv  rÈ  Úoutput_blocksrØ  Úparamrw   s          €r.   rj   zFlavaImageCodebook.__init__  s  ø€ ô
 	‰Ñ˜Ô àˆŒØ ×+Ñ+ˆŒØ$×3Ñ3ˆÔØ$*×$?Ñ$?ˆÔ!Ø!×-Ñ-ˆÔØ ×+Ñ+ˆŒà—_‘_ t×'@Ñ'@Ñ@ˆ
ä#›ˆÜ "§¡£	ˆ�fÑÜ "§	¡	¨!¨d×.>Ñ.>Ñ*>ÀÇÁÐ]^ÐhiÔ jˆ�fÑä“ˆÜŸ)™) D×$7Ñ$7¸¸T×=MÑ=MÑ9MÐ[\ÐfgÔhˆˆw‰Ü8Ø×%Ñ% z°1°t×7GÑ7GÑ3GÈÈT×M]ÑM]ÑI]ó
ˆˆyÑô 9Ø×%Ñ% z°1°t×7GÑ7GÑ3GÈÈT×M]ÑM]ÑI]ó
ˆˆyÑô 9Ø×%Ñ% z°1°t×7GÑ7GÑ3GÈÈT×M]ÑM]ÑI]ó
ˆˆyÑô 9Ø×%Ñ% z°1°t×7GÑ7GÑ3GÈÈT×M]ÑM]ÑI]Ðhmô
ˆˆyÑô Ÿ=™=¨Ó7ˆˆxÑä—m‘m FÓ+ˆŒà�‰Ôà�;‰;×ÒØŸ™Ó*ò ,�Ø&+�Õ#ñ,ð r5   r%   c                 ót   — dt         › dt         › d� | j                  |«      }t        j                  |d¬«      S )NaI  
        Args:
            pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
                Pixel values. Codebook pixel values can be obtained using [`AutoImageProcessor`] by passing
                `return_codebook_pixels=True`. See [`FlavaImageProcessor.__call__`] for details.

        Examples:
        ```python
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO
        >>> from transformers import AutoImageProcessor, FlavaImageCodebook

        >>> model = FlavaImageCodebook.from_pretrained("úE")
        >>> image_processor = AutoImageProcessor.from_pretrained("a¹  ")

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

        >>> inputs = image_processor([image], return_codebook_pixels=True, return_tensors="pt")
        >>> inputs = dict(pixel_values=inputs.codebook_pixel_values)

        >>> outputs = model.get_codebook_indices(**inputs)
        ```
        r   )Úaxis)Ú_CHECKPOINT_FOR_CODEBOOK_DOCrØ  r:   Úargmax©r-   r”   Úz_logitss      r.   Úget_codebook_indicesz'FlavaImageCodebook.get_codebook_indices@  sI   € ð9ô :VÐ8Vð WCÜC_ÐB`ð a	ñ	ð4 —;‘;˜|Ó,ˆÜ�|‰|˜H¨1Ô-Ð-r5   c                 ó\   — | j                  |«      } t        j                  d¬«      |«      S )Nr   r‚   )rØ  r   ÚSoftmaxrô  s      r.   Úget_codebook_probsz%FlavaImageCodebook.get_codebook_probs^  s&   € Ø—;‘;˜|Ó,ˆØ Œr�z‰z˜aÔ  Ó*Ð*r5   c                 ó0  — dt         › dt         › d� t        |j                  «      dk7  rt        d|j                  › d�«      ‚|j                  d   | j                  k7  r(t        d|j                  d   › d	| j                  › �«      ‚| j                  |«      S )
NaJ  
        Args:
            pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
                Pixel values. Codebook pixel values can be obtained using [`AutoImageProcessor`] by passing
                `return_codebook_pixels=True`. See [`FlavaImageProcessor.__call__`] for details.

        Examples:

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

        >>> model = FlavaImageCodebook.from_pretrained("rð  aÖ  ")

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

        >>> inputs = image_processor([image], return_codebook_pixels=True, return_tensors="pt")
        >>> inputs = dict(pixel_values=inputs.codebook_pixel_values)

        >>> outputs = model(**inputs)
        >>> print(outputs.shape)
        (1, 196)
        ```
        r´  zinput shape z
 is not 4dr   z
input has z channels but model built for )rò  Úlenr„   r´   rè  rØ  )r-   r”   rv  s      r.   r    zFlavaImageCodebook.forwardb  s­   € ð9ô :VÐ8Vð WCÜC_ÐB`ð a	ñ	ô: ˆ|×!Ñ!Ó" aÒ'Ü˜|¨L×,>Ñ,>Ð+?¸zÐJÓKÐKØ×Ñ˜aÑ  D×$7Ñ$7Ò7Ü˜z¨,×*<Ñ*<¸QÑ*?Ð)@Ð@^Ð_c×_rÑ_rÐ^sÐtÓuÐuØ�{‰{˜<Ó(Ð(r5   )r6   r7   r8   r\  r   r<   r|  r]  r^  r   rj   r:   r£   rö  rù  r;   r    r¦   r§   s   @r.   rÛ  rÛ    s�   ø… ð  ÐØ$Ó$Ø$€OØ!ÐØ&+Ð#ð*,à(ð*,ð õ*,ðX.°·±ð .À%Ç,Á,ó .ð<+¨u¯|©|ð +ÀÇÁó +ð") E×$5Ñ$5ð ")ÀEÇLÁL÷ ")r5   rÛ  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFlavaPredictionHeadTransformc                 óh  •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        |j                  t        «      rt        |j                     | _
        n|j                  | _
        t        j                  |j                  |j                  ¬«      | _        y )Nr¿   )ri   rj   r   rç   rn   r  r¬   r  r  r	   Útransform_act_fnrÍ   rÎ   rÒ   s     €r.   rj   z%FlavaPredictionHeadTransform.__init__ˆ  s{   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
Ü�f×'Ñ'¬Ô-Ü$*¨6×+<Ñ+<Ñ$=ˆDÕ!à$*×$5Ñ$5ˆDÔ!ÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆ�r5   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r^   )r  rÿ  rÍ   r  s     r.   r    z$FlavaPredictionHeadTransform.forward‘  s4   € ØŸ
™
 =Ó1ˆØ×-Ñ-¨mÓ<ˆØŸ™ }Ó5ˆØÐr5   ©r6   r7   r8   rj   r    r¦   r§   s   @r.   rý  rý  ‡  s   ø„ ôUör5   rý  c                   ó&   ‡ — e Zd Zdˆ fd„	Zd„ Zˆ xZS )rR  c                 óH  •— t         ‰| �  «        || _        t        |«      | _        t        j                  |j                  |j                  d¬«      | _	        t        j                  t        j                  |j                  «      «      | _        |�|| j                  _        y y )NTrâ   )ri   rj   rb   rý  Ú	transformr   rç   rn   rÇ   Údecoderrl   r:   rm   rã   Úweight)r-   rb   r  rw   s      €r.   rj   z"FlavaMaskedPredictionHead.__init__™  sw   ø€ Ü‰ÑÔØˆŒÜ5°fÓ=ˆŒÜ—y‘y ×!3Ñ!3°V×5FÑ5FÈTÔRˆŒÜ—L‘L¤§¡¨V×->Ñ->Ó!?Ó@ˆŒ	ØÐØ"(ˆD�L‰LÕð r5   c                 óJ   — | j                  |«      }| j                  |«      }|S r^   )r  r  rÄ  s     r.   r    z!FlavaMaskedPredictionHead.forward¢  s"   € Ø�N‰N˜1ÓˆØ�L‰L˜‹OˆØˆr5   r^   r  r§   s   @r.   rR  rR  ˜  s   ø„ õ)ör5   rR  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFlavaITMHeadc                 óš   •— t         ‰| �  «        || _        t        |«      | _        t        j                  |j                  d«      | _        y )Nr}   )	ri   rj   rb   rB  ri  r   rç   rn   Úseq_relationshiprÒ   s     €r.   rj   zFlavaITMHead.__init__©  s:   ø€ Ü‰ÑÔØˆŒÜ! &Ó)ˆŒÜ "§	¡	¨&×*<Ñ*<¸aÓ @ˆÕr5   c                 óJ   — | j                  |«      }| j                  |«      }|S r^   )ri  r  rÄ  s     r.   r    zFlavaITMHead.forward¯  s$   € Ø�K‰K˜‹NˆØ×!Ñ! !Ó$ˆØˆr5   r  r§   s   @r.   r	  r	  ¨  s   ø„ ôAör5   r	  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚFlavaGlobalContrastiveHeadc                 óR   •— t         ‰| �  «        || _        |j                  | _        y r^   )ri   rj   rb   Úglobal_backprop_contrastiverÒ   s     €r.   rj   z#FlavaGlobalContrastiveHead.__init__¶  s#   ø€ Ü‰ÑÔØˆŒØ+1×+MÑ+MˆÕ(r5   c                 ó   — t        j                  |«      }t         j                  j                  «       rt         j                  j	                  «       s8t        j
                  |j                  d«      |j                  ¬«      }|g}|g}�n{|j                  d«      }t         j                  j                  «       }	| j                  rgt         j                  j                  j                  j                  |«      }t         j                  j                  j                  j                  |«      }n–t        |	«      D �
cg c]  }
t        j                  |«      ‘Œ }}
t        |	«      D �
cg c]  }
t        j                  |«      ‘Œ }}
t         j                  j                  ||«       t         j                  j                  ||«       |t         j                  j                  «       z  t        j
                  ||j                  ¬«      z   }t        j                   |«      }t        j                   |«      }t        j"                  ||j%                  dd«      «      |z  }t        j"                  ||j%                  dd«      «      |z  }|||fS c c}
w c c}
w )Nr   r¥  r   )r:   ÚexpÚdistributedÚis_availableÚis_initializedrÐ   r   rÕ   Úget_world_sizer  r   r‰   Ú
all_gatherr0  Ú
zeros_likeÚget_rankrŒ   rò   r¶   )r-   r   r!   rZ  ÚtemperatureÚlabelsÚimage_embeddings_allÚtext_embeddings_allÚlocal_batch_sizeÚ
world_sizerœ   Úlogits_per_imageÚlogits_per_texts                r.   r    z"FlavaGlobalContrastiveHead.forward»  s  € Ü—i‘i Ó,ˆÜ× Ñ ×-Ñ-Ô/´u×7HÑ7H×7WÑ7WÔ7YÜ—\‘\Ð"2×"7Ñ"7¸Ó":ÐCS×CZÑCZÔ[ˆFØ$4Ð#5Ð Ø#2Ð"3Òà/×4Ñ4°QÓ7ÐÜ×*Ñ*×9Ñ9Ó;ˆJà×/Ò/ô (-×'8Ñ'8×';Ñ';×'FÑ'F×'QÑ'QÐRbÓ'cÐ$Ü&+×&7Ñ&7×&:Ñ&:×&EÑ&E×&PÑ&PÐQ`Ó&aÑ#äSXÐYcÓSdÖ'eÈa¬×(8Ñ(8¸Õ(IÐ'eÐ$Ð'eÜSXÐYcÓSdÖ&eÈa¤u×'7Ñ'7Ð8HÕ'IÐ&eÐ#Ð&eÜ×!Ñ!×,Ñ,Ð-AÐCSÔTÜ×!Ñ!×,Ñ,Ð-@À/ÔRà%¬×(9Ñ(9×(BÑ(BÓ(DÑDÄuÇ|Á|Ø Ð)9×)@Ñ)@ôHñ ˆFô  %Ÿy™yÐ)=Ó>ÐÜ#Ÿi™iÐ(;Ó<Ðä Ÿ<™<Ð(8Ð:M×:WÑ:WÐXYÐ[\Ó:]Ó^ÐalÑlÐÜŸ,™, Ð8L×8VÑ8VÐWXÐZ[Ó8\Ó]Ð`kÑkˆà °&Ð8Ð8ùò (fùÚ&es   Ä9JÅ$Jr  r§   s   @r.   r  r  µ  s   ø„ ôNö
9r5   r  zk
    The FLAVA model for pretraining which outputs losses, embeddings, logits and transformer outputs.
    c            '       ó`  ‡ — e Zd ZdddddœZddedej                  dz  fˆ fd	„Zd
ej                  fd„Z
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j                  dz  de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dz  dedz  deej                     ez  f$d„«       Zˆ xZS )!ÚFlavaForPreTrainingzmmm_text_head.decoder.biaszmim_head.decoder.biaszmlm_head.decoder.biaszmmm_image_head.decoder.bias)zmmm_text_head.biaszmim_head.biaszmlm_head.biaszmmm_image_head.biasNrb   Úimage_codebookc                 ób  •— t         ‰| �  |«       t        |«      | _        || _        | j                  €&|j
                  rt        |j                  «      | _        t        |j                  «      | _
        t        |j                  «      | _        t        |«      | _        t        |j                  «      | _        t        |j                  «      | _        t#        |«      | _        |j                  j&                  | _        |j                  j&                  | _        |j,                  | _        |j.                  | _        |j0                  | _        |j2                  | _        |j4                  | _        |j6                  | _        |j8                  | _        |j:                  | _        | j=                  «        y)zò
        image_codebook ([`nn.Module`]):
            If passed, the image codebook will be set to this. Otherwise, it will be initialized using the
            image_codebook_config defined in the config first as the first parameter.
        N)ri   rj   rX  rL  r$  Úinit_codebookrÛ  Úimage_codebook_configrR  rŽ  Úmim_headr‹  Úmlm_headr	  Úitm_headÚmmm_image_headÚmmm_text_headr  Úglobal_contrastive_headrÇ   Úimage_vocab_sizeÚtext_vocab_sizeÚ
mlm_weightÚ
mim_weightÚglobal_contrastive_weightÚce_ignore_indexÚ
itm_weightÚmmm_image_weightÚmmm_text_weightÚ skip_unmasked_multimodal_encoderrj  )r-   rb   r$  rw   s      €r.   rj   zFlavaForPreTraining.__init__ë  sQ  ø€ ô 	‰Ñ˜Ô Ü Ó'ˆŒ
à,ˆÔØ×ÑÐ&¨6×+?Ò+?Ü"4°V×5QÑ5QÓ"RˆDÔô 2°&×2EÑ2EÓFˆŒÜ1°&×2DÑ2DÓEˆŒÜ$ VÓ,ˆŒÜ7¸×8KÑ8KÓLˆÔÜ6°v×7IÑ7IÓJˆÔÜ'AÀ&Ó'IˆÔ$à &× 3Ñ 3× >Ñ >ˆÔØ%×1Ñ1×<Ñ<ˆÔØ ×+Ñ+ˆŒØ ×+Ñ+ˆŒØ)/×)IÑ)IˆÔ&Ø%×5Ñ5ˆÔØ ×+Ñ+ˆŒØ &× 7Ñ 7ˆÔØ%×5Ñ5ˆÔØ06×0WÑ0WˆÔ-à�‰Õr5   r·   c                 ón   — |j                  «       dkD  r!|j                  |j                  d«      d«      }|S )Nr}   r   r|   )rƒ   r‹   r   rÄ  s     r.   Ú_resize_to_2dz!FlavaForPreTraining._resize_to_2d  s,   € Ø�5‰5‹7�QŠ;Ø—‘�q—v‘v˜a“y "Ó%ˆAØˆr5   rÓ   Úinput_ids_maskedr”   Úcodebook_pixel_valuesrî   rÄ   r•   rÁ   r¢  r7  Ú
mlm_labelsÚ
mim_labelsÚ
itm_labelsrï   r4  r5  Úreturn_lossr%   c                 óº  — |�|n| j                   j                  }|�|n| j                   j                  }|
�|
n| j                  }
|€|�t        j                  d«       |}| j                  ||||||	|
||d¬«
      }| j                  |||||	|||d¬«	      }d}|j                  }|j                  }|j                  }|j                  }|j                  }dx}x}x}x}x}x} }!dx}"x}#x}$}%dx}&x}'}(|€|�C|€A|r?| j                  €t        d«      ‚|€t        d«      ‚| j                  j                  |«      }| j                  dkD  �r|��|�€|})|�ó| j                  |«      }| j                  |«      }| j                   ||j#                  d«      <   |)dd…|j%                  d	«       d…dd…f   })|j#                  | j                   «      }*||*   }+|)|*dd…f   })| j'                  |)«      }"|rjt(        j*                  j-                  |"j/                  d
| j0                  «      |+j/                  d
«      «      }|| j                  z  }n| j'                  |)«      }"| j2                  dkD  rÝ|�Û|€Ù|},|�Ä| j                  |«      }|,dd…|j%                  d	«       d…dd…f   },|j#                  | j                   «      }*||*   }-|,|*dd…f   },| j5                  |,«      }#|rjt(        j*                  j-                  |#j/                  d
| j6                  «      |-j/                  d
«      «      }|| j2                  z  }n| j5                  |,«      }#| j8                  dkD  r…|�ƒ| j;                  |«      }&|�p|j#                  d«      }.|.|.j=                  «        z  }|r/t(        j*                  j-                  |&|«      }!|!| j8                  z  }!|�||   }|�||   }|�
||   }||   }|��| j>                  dkD  �r|})|j%                  d	«      d	z
  }/|)dd…dd|/z   …dd…f   })|�Õ| j                  |«      }| j                  |«      }| j                   ||j#                  d«      <   |j#                  | j                   «      }*||*   }+|)|*dd…f   })| jA                  |)«      }%|rjt(        j*                  j-                  |%j/                  d
| j0                  «      |+j/                  d
«      «      }|| j>                  z  }n| jA                  |)«      }%|�è| jB                  dkD  rÙ|},|,dd…|j%                  d	«       d…dd…f   },|�¦| j                  |«      }|j#                  | j                   «      }*||*   }-|,|*dd…f   },| jE                  |,«      }$|rjt(        j*                  j-                  |$j/                  d
| j6                  «      |-j/                  d
«      «      }|| jB                  z  }n| jE                  |,«      }$|��x|��u| jF                  dkD  �re| j                  jI                  |dd…ddd…f   «      }0t(        j*                  jK                  |0d
¬«      }0| j                  jM                  |dd…ddd…f   «      }1t(        j*                  jK                  |1d
¬«      }1| jN                  r8| j                  jP                  jR                  jU                  tV        tX        «       | j[                  |1|0| j                  jP                  «      \  }'}(}2|�|'|   }'|(|   }(|2|   }2|rWt(        j*                  j-                  |'|2«      }3t(        j*                  j-                  |(|2«      }4|3|4z   dz  } | | jF                  z  } t]        |||!| ||¬«      }5|r0|5j_                  «       s ta        d„ |5jc                  «       D «       «      }|�s.||jd                  �|jd                  jg                  «       nd||jh                  �|jh                  jg                  «       nd|j                  |jj                  �|jj                  jg                  «       nd||jd                  �|jd                  jg                  «       nd||jh                  �|jh                  jg                  «       nd||jj                  �|jj                  jg                  «       nd|"|#|&|'|(|%|$f}6|r|5j_                  «       s||5f|6z   }6tm        d„ |6D «       «      S to        d%i d|“d|5“d|“d|jd                  “d|“d|jh                  “d|j                  “d|jj                  “d|“d|jd                  “d|“d|jh                  “d|“d|jj                  “d|"“d|#“d |&“d!|'“d"|(“d#|%“d$|$“ŽS )&aè  
        input_ids (`torch.LongTensor` of shape `(batch_size, text_seq_len)`):
            Indices of input sequence tokens in the vocabulary. Indices can be obtained using [`AutoTokenizer`]. See
            [`PreTrainedTokenizer.encode`] and [`PreTrainedTokenizer.__call__`] for details. [What are input
            IDs?](../glossary#input-ids)
        input_ids_masked (`torch.LongTensor` of shape `(batch_size, text_seq_len)`):
            Indices of input sequence tokens in the vocabulary. These ones are the masked version of the original task
            to be used with MLM. Indices can be obtained using [`AutoTokenizer`] along with
            [`DataCollatorForMaskedLanguageModeling`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details. [What are input IDs?](../glossary#input-ids)
        codebook_pixel_values (`torch.FloatTensor` of shape `(batch_size, num_image_patches, patch_size, patch_size, 3)`, *optional*):
            Pixel values for image patches that are used to compute the image codebook labels for masked image modeling.
        token_type_ids (`torch.LongTensor` of shape `(batch_size, text_seq_len)`, *optional*):
            Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0,
            1]`:
            - 0 corresponds to a *sentence A* token,
            - 1 corresponds to a *sentence B* token.
            [What are token type IDs?](../glossary#token-type-ids)
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, image_num_patches)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0).
        image_attention_mask (`torch.FloatTensor` of shape `(batch_size, image_num_patches)`, *optional*):
            Mask to avoid performing attention on padding token indices specifically for images. Mask values selected
            in `[0, 1]`:
            - 1 for tokens that are **not masked**,
            - 0 for tokens that are **masked**.
            [What are attention masks?](../glossary#attention-mask)
        skip_unmasked_multimodal_encoder (*bool*, *optional*):
            Skip any calculations for multimodal encoder for unmasked inputs. FLAVA pretraining doesn't need unmasked
            multimodal embeddings or outputs as of now.
        mlm_labels (`torch.LongTensor` of shape `(batch_size, text_seq_len)`, *optional*):
            Labels for computing the left-to-right language and multimodal masked modeling loss (next word prediction).
            Indices should be in `[-100, 0, ..., text_config.vocab_size - 1]` (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,
            ..., text_config.vocab_size - 1]`.
        mim_labels (`torch.LongTensor` of shape `(batch_size, image_num_patches)`, *optional*):
            Labels for computing the image and multimodal masked modeling loss. Indices should be in `[-100, 0, ...,
            image_config.vocab_size - 1]`. Tokens with indices set to `-100` are ignored (masked), the loss is only
            computed for the tokens with labels in `[0, ..., image_config.vocab_size - 1]`. If not passed, they are
            generated automatically using the image codebook assigned to the model. By default, it uses
            [`FlavaImageCodebook`]. See [`FlavaImageCodebook`] to understand how to generate mim_labels.
        itm_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 of MMM and global contrastive losses as well.
        return_loss (`bool`, *optional*, default to None):
            Whether to return calculated loss or not.

        Examples:
        ```python
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO
        >>> from transformers import FlavaForPreTraining, AutoProcessor

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

        >>> model = FlavaForPreTraining.from_pretrained("facebook/flava-full")
        >>> processor = AutoProcessor.from_pretrained("facebook/flava-full")

        >>> text = ["a photo of a cat"]

        >>> inputs = processor(
        ...     images=[image],
        ...     text=text,
        ...     return_masks=True,
        ...     return_codebook_pixels=True,
        ...     padding=True,
        ...     max_length=77,
        ...     return_tensors="pt",
        ... )


        >>> output = model(**inputs)
        ```
        Nzð`input_ids_masked` isn't passed which means MLM loss won't be calculated correctlySetting it to `input_ids` so that model can work. Please pass it if this is unintentional. This is usually OKAY if you are doing inference on unmasked text...T)
rÓ   r”   rî   rÄ   rÁ   r¢  r£  rï   r4  r5  )	rÓ   r”   rî   rÄ   r¢  r•   rï   r4  r5  zÊ`return_loss` is set to True but the image codebook is not initialized and no `mim_labels`  have been passed. Reinstantiate the model with `init_codebook` set to True or pass in your custom `mim_labels`z�`codebook_pixel_value` are required to generate `mim_labels` if loss is expected. Call `AutoProcessor` with `return_codebook_pixels` set to Truer   r   r|   r}   r‚   )r@   rA   rB   rC   rD   rE   c              3   ó(   K  — | ]
  }|�|nd–— Œ y ­wrG  r=   )r+   rM   s     r.   r/   z.FlavaForPreTraining.forward.<locals>.<genexpr>K  s   è ø€ Ò_À TÐ%5™T¸1Ó<Ñ_ùs   ‚c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr^   r=   )r+   r·   s     r.   r/   z.FlavaForPreTraining.forward.<locals>.<genexpr>l  s   è ø€ Ò<˜q¨a©mœÑ<ùr8  rM   rN   r   r    r!   r"   r#   r$   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r=   )8rb   r5  r?  r7  ÚloggerÚwarningrL  r   r!   r#   r$  ÚRuntimeErrorr´   rö  r1  r9  r3  Úner   r(  r   r‰   Úcross_entropyr‹   r.  r0  r)  r/  r4  r*  Úanyr5  r+  r6  r,  r2  r˜  Ú	normalizer—  ÚtrainingrZ  ÚdataÚclamp_ÚLOGIT_SCALE_CLAMP_MINÚLOGIT_SCALE_CLAMP_MAXr-  r?   rH   ÚsumrG   r    r*   r"   r$   r2   rL   )7r-   rÓ   r:  r”   r;  rî   rÄ   r•   rÁ   r¢  r7  r<  r=  r>  rï   r4  r5  r?  rv  Úflava_outputÚflava_masked_outputÚpos_maskr   r!   rO   rQ   rS   Ú
total_lossÚmim_lossÚmlm_lossÚmmm_text_lossÚmmm_image_lossÚgc_lossÚitm_lossrU   rV   r[   rZ   rW   r   r!  Úsequence_for_imageÚmasked_tokensÚmim_labels_filteredÚsequence_for_textÚmlm_labels_filteredÚ	pos_pairsÚ	end_indexÚtext_embeddingÚimage_embeddingÚ	gc_labelsÚgc_loss_imageÚgc_loss_textÚflava_lossesr  s7                                                          r.   r    zFlavaForPreTraining.forward  sz
  € ðD &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆØ%0Ð%<‘kÀ$Ç+Á+×BYÑBYˆð 0Ð;ñ -à×6Ñ6ð 	)ð Ð#¨	Ð(=Ü�N‰Nð?ôð
  )Ðà—z‘zØØ%Ø)Ø)Ø%Ø!5ð %EØ/Ø!5àð "ó 
ˆð  #Ÿj™jØ&Ø%Ø)Ø)Ø!5Ø+Ø/Ø!5Øð )ó 

Ðð ˆà'×8Ñ8ÐØ&×6Ñ6ˆØ"5×"FÑ"FÐØ!4×!DÑ!DÐØ':×'PÑ'PÐ$àaeÐeˆ
Ðe�XÐe Ðe¨=Ðe¸>ÐeÈGÐV^ØGKÐKˆ
ÐK�ZÐK /Ð4DØ:>Ð>ˆ
Ð>Ð%¨ð #Ð.Ð2NÐ2ZØÐ!¡kØ×&Ñ&Ð.Ü&ð;óð ð
 )Ð0Ü$ðYóð ð "×0Ñ0×EÑEÐF[Ó\�
ð �?‰?˜QÓÐ#:Ñ#FÐKgÑKoØ!8ÐàÐ%Ø!×/Ñ/°
Ó;�
Ø"&×"4Ñ"4°_Ó"E�Ø7;×7KÑ7K�
˜?×-Ñ-¨dÓ3Ñ4à%7º¸J¿O¹OÈAÓ<NÐ;NÑ;PÒRSÐ8SÑ%TÐ"Ø *§¡¨d×.BÑ.BÓ C�Ø&0°Ñ&?Ð#Ø%7¸ÂqÐ8HÑ%IÐ"Ø!Ÿ]™]Ð+=Ó>�
ÙÜ!Ÿ}™}×:Ñ:Ø"Ÿ™¨¨D×,AÑ,AÓBÐDW×D\ÑD\Ð]_ÓD`ó �Hð  §¡Ñ/‘Hà!Ÿ]™]Ð+=Ó>�
ð �?‰?˜QÒÐ#9Ð#EÐJfÐJnØ 6ÐØÐ%Ø!×/Ñ/°
Ó;�
Ø$5²a¸*¿/¹/È!Ó:LÐ9LÑ9NÒPQÐ6QÑ$RÐ!Ø *§¡¨d×.BÑ.BÓ C�Ø&0°Ñ&?Ð#Ø$5°mÂQÐ6FÑ$GÐ!Ø!Ÿ]™]Ð+<Ó=�
ÙÜ!Ÿ}™}×:Ñ:Ø"Ÿ™¨¨D×,@Ñ,@ÓAÐCV×C[ÑC[Ð\^ÓC_ó �Hð  §¡Ñ/‘Hà!Ÿ]™]Ð+<Ó=�
ð �?‰?˜QÒÐ#?Ð#KØŸ™Ð'CÓDˆJàÐ%Ø&ŸM™M¨!Ó,�	à$¨	¯©«Ð'7Ñ7�ÙÜ!Ÿ}™}×:Ñ:¸:ÀzÓR�HØ §¡Ñ/�Hà/Ð;Ø3OÐPXÑ3YÐ0àÐ)Ø!+¨HÑ!5�JàÐ)Ø!+¨HÑ!5�JØ&5°hÑ&?�Oð (Ñ3¸×8MÑ8MÐPQÓ8QØ!=ÐØ/×4Ñ4°QÓ7¸!Ñ;ˆIØ!3²A°q¸1¸y¹=Ð7HÊ!Ð4KÑ!LÐàÐ%Ø!×/Ñ/°
Ó;�
Ø"&×"4Ñ"4°_Ó"E�Ø7;×7KÑ7K�
˜?×-Ñ-¨dÓ3Ñ4à *§¡¨d×.BÑ.BÓ C�Ø&0°Ñ&?Ð#Ø%7¸ÂqÐ8HÑ%IÐ"Ø#'×#6Ñ#6Ð7IÓ#JÐ ÙÜ%'§]¡]×%@Ñ%@Ø(×-Ñ-¨b°$×2GÑ2GÓHÐJ]×JbÑJbÐceÓJfó&�Nð # d×&;Ñ&;Ñ;‘Nà#'×#6Ñ#6Ð7IÓ#JÐ ð (Ð3¸×8LÑ8LÈqÒ8PØ <ÐØ 1²!Ð6L×6QÑ6QÐRSÓ6TÐ5TÑ5VÒXYÐ2YÑ ZÐàÐ%Ø!×/Ñ/°
Ó;�
Ø *§¡¨d×.BÑ.BÓ C�Ø&0°Ñ&?Ð#Ø$5°mÂQÐ6FÑ$GÐ!Ø"&×"4Ñ"4Ð5FÓ"G�ÙÜ$&§M¡M×$?Ñ$?Ø'×,Ñ,¨R°×1EÑ1EÓFÐH[×H`ÑH`ÐacÓHdó%�Mð " T×%9Ñ%9Ñ9‘Mà"&×"4Ñ"4Ð5FÓ"G�ð Ñ'¨OÑ,GÈD×LjÑLjÐmnÓLnØ!ŸZ™Z×7Ñ7¸ÊÈ1ÊaÈÑ8PÓQˆNÜŸ]™]×4Ñ4°^ÈÐ4ÓLˆNà"Ÿj™j×9Ñ9Ð:JÊ1ÈaÒQRÈ7Ñ:SÓTˆOÜ Ÿm™m×5Ñ5°oÈ2Ð5ÓNˆOà�}Š}Ø—
‘
×&Ñ&×+Ñ+×2Ñ2Ô3HÔJ_Ô`à;?×;WÑ;WØ °·±×1GÑ1Gó<Ñ8Ð˜o¨yð
 Ð#Ø#3°HÑ#=Ð Ø"1°(Ñ";�Ø% hÑ/�	áÜ "§¡× ;Ñ ;Ð<LÈiÓ X�Ü!Ÿ}™}×:Ñ:¸?ÈIÓV�Ø(¨<Ñ7¸1Ñ<�Ø˜4×9Ñ9Ñ9�ä"ØØØØ&Ø$Ø"ô
ˆñ ˜|×4Ñ4Ô6ÜÑ_È×I\ÑI\ÓI^Ô_Ó_ˆJâà Ø8D×8QÑ8QÐ8]�×)Ñ)×2Ñ2Ô4ÐcgØØ7C×7OÑ7OÐ7[�×(Ñ(×1Ñ1Ô3ÐaeØ×2Ñ2Ø=I×=[Ñ=[Ð=g�×.Ñ.×7Ñ7Ô9ÐmqØ'Ø?R×?_Ñ?_Ð?kÐ#×0Ñ0×9Ñ9Ô;ÐquØ&Ø>Q×>]Ñ>]Ð>iÐ#×/Ñ/×8Ñ8Ô:ÐosØ,à&×8Ñ8ÐDð $×5Ñ5×>Ñ>Ô@àØØØØ ØØ Øð+ˆFñ.  <×#8Ñ#8Ô#:àØ ðð ñ�ô Ñ< FÔ<Ó<Ð<ä(ò 
Ùð
á"ð
ñ .ð
ð &×2Ò2ð	
ñ
 ,ð
ð %×0Ò0ð
ð #/×"DÒ"Dð
ð +×<Ò<ð
ñ %<ð
ð !4× @Ò @ð
ñ $:ð
ð  3×>Ò>ð
ñ *Fð
ð &9×%JÒ%Jð
ñ "ð
ñ  "ð!
ñ" "ð#
ñ$ *:ð%
ñ& )8ð'
ñ( .ð)
ñ* ,ð+
ð 	
r5   r^   )NNNNNNNNNNNNNNTNN)r6   r7   r8   Ú_tied_weights_keysr   r   r}  rj   r:   r£   r9  r   r®  r;   rJ   r2   rL   r    r¦   r§   s   @r.   r#  r#  Ý  sê  ø„ ð ;Ø0Ø0Ø<ñ	Ðñ!˜{ð !¸B¿I¹IÈÑ<Lõ !ðF˜uŸ|™|ó ð
 ð .2Ø48Ø15Ø:>Ø.2Ø.2Ø/3Ø04Ø48Ø8<Ø*.Ø*.Ø*.Ø)-Ø%)Ø#'Ø#'ñ%p
à×#Ñ# dÑ*ðp
ð  ×*Ñ*¨TÑ1ðp
ð ×'Ñ'¨$Ñ.ð	p
ð
  %×0Ñ0°4Ñ7ðp
ð Ÿ™ tÑ+ðp
ð Ÿ™ tÑ+ðp
ð Ÿ™¨Ñ,ðp
ð ×&Ñ&¨Ñ-ðp
ð $Ÿl™l¨TÑ1ðp
ð +/°©+ðp
ð —L‘L 4Ñ'ðp
ð —L‘L 4Ñ'ðp
ð —L‘L 4Ñ'ðp
ð   $™;ðp
ð  #ð!p
ð" ˜D‘[ð#p
ð$ ˜D‘[ð%p
ð( 
ˆu�|‰|Ñ	Ð8Ñ	8ò)p
ó ôp
r5   r#  )r#  rÛ  ra  rX  rV  rK  r  )Lr9   r­   ró   r   Údataclassesr   Útypingr   r:   r   Ú r   rS  Úactivationsr	   Úmasking_utilsr
   Úmodeling_layersr   Úmodeling_outputsr   r   Úmodeling_utilsr   Úprocessing_utilsr   Úutilsr   r   r   r   r   r   Úconfiguration_flavar   r   r   r   r   Ú
get_loggerr6   rC  rò  rM  rN  r  r   r?   rL   r}  ra   rp   r¼   rÞ   r  r  r  r  r"  r-  rB  rK  ra  r  rV  rX  r°  rÇ  rÐ  rÛ  rý  rR  r	  r  r#  Ú__all__r=   r5   r.   ú<module>ru     s2  ðñ ã Û Ý #Ý !Ý ã Ý å &Ý !Ý 6Ý 9ß KÝ -Ý &ß j× j÷õ ð 
ˆ×	Ñ	˜HÓ	%€à>Ð àÐ ØÐ à&Ð)9Ñ9Ð<QÑQÐ ñ ðôð ô
�{ó 
ó óð
ñ< ðôð
 ô�+ó ó óðñD ðôð ôWt ó Wtó óðWtôx_˜2Ÿ9™9ô _ôH!�b—i‘iô !ôH3˜"Ÿ)™)ô 3ôl6˜Ÿ™ô 6ôr�b—i‘iô ô$�R—Y‘Yô ô,˜Ÿ	™	ô ô"�"—)‘)ô ô )Ð+ô )ôX$
�2—9‘9ô $
ôN�"—)‘)ô ð ôS˜?ó Só ðSð6 ôN
Ð*ó N
ó ðN
ðb ô\
Ð)ó \
ó ð\
ð~ ôL
Ð/ó L
ó ðL
ð^ ô^
Ð%ó ^
ó ð^
ôB	 §	¡	ô ô*C˜bŸi™iô Cô" 2§9¡9ô ñ( ðôôw)Ð-ó w)óðw)ôt 2§9¡9ô ô" §	¡	ô ô 
�2—9‘9ô 
ô%9 §¡ô %9ñP ðôô
b
Ð.ó b
óð
b
òJ�r5   