Ë
    S^(hô
 ã                   óÜ  — d Z ddlZddlmZ ddlmZmZmZm	Z	 ddl
ZddlZddlZddlmZ ddlmZ ddlmZmZ dd	lmZmZ 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#  ejH                  e%«      Z&dZ'dejP                  dejP                  fd„Z)dejP                  dejP                  fd„Z*dejP                  de+fd„Z,dHdejP                  de-de.de+dejP                  f
d„Z/dId„Z0d„ Z1 G d„ dejd                  «      Z3 G d„ dejd                  «      Z4 G d„ d ejd                  «      Z5e G d!„ d"e«      «       Z6 G d#„ d$ejd                  «      Z7 G d%„ d&ejd                  «      Z8 G d'„ d(ejd                  «      Z9 G d)„ d*ejd                  «      Z: G d+„ d,ejd                  «      Z; G d-„ d.e;«      Z< G d/„ d0ejd                  «      Z= G d1„ d2ejd                  «      Z> G d3„ d4e«      Z?d5Z@d6ZAd7ZBd8ZC G d9„ d:ejd                  «      ZD G d;„ d<ejd                  «      ZE G d=„ d>ejd                  «      ZF G d?„ d@e?«      ZG G dA„ dBejd                  «      ZH G dC„ dDe?«      ZI ee@«       G dE„ dFe?«      «       ZJg dG¢ZKy)JzPyTorch GroupViT model.é    N)Ú	dataclass)ÚAnyÚOptionalÚTupleÚUnion)Únné   )ÚACT2FN)Ú _create_4d_causal_attention_maskÚ_prepare_4d_attention_mask)ÚBaseModelOutputÚBaseModelOutputWithPooling)ÚPreTrainedModel)ÚModelOutputÚadd_start_docstringsÚ%add_start_docstrings_to_model_forwardÚloggingÚreplace_return_docstringsÚ	torch_inté   )ÚGroupViTConfigÚGroupViTTextConfigÚGroupViTVisionConfigznvidia/groupvit-gcc-yfccÚlogitsÚreturnc                 ó’   — t         j                  j                  | t        j                  t        | «      | j                  ¬«      «      S )N©Údevice)r   Ú
functionalÚcross_entropyÚtorchÚarangeÚlenr   )r   s    úl/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/models/groupvit/modeling_groupvit.pyÚcontrastive_lossr%   0   s/   € Ü�=‰=×&Ñ& v¬u¯|©|¼CÀ»KÐPV×P]ÑP]Ô/^Ó_Ð_ó    Ú
similarityc                 óZ   — t        | «      }t        | j                  «       «      }||z   dz  S )Ng       @)r%   Út)r'   Úcaption_lossÚ
image_losss      r$   Úgroupvit_lossr,   5   s,   € Ü# JÓ/€LÜ! *§,¡,£.Ó1€JØ˜:Ñ%¨Ñ,Ð,r&   Údimc                 óì   — | j                  |«      }|j                  |d¬«      d   }t        j                  | t        j                  ¬«      j                  ||d«      }||j                  «       z
  |z   }|S )NT©Úkeepdimr   ©Úmemory_formatç      ð?)ÚsoftmaxÚmaxr!   Ú
zeros_likeÚlegacy_contiguous_formatÚscatter_Údetach)r   r-   Úy_softÚindexÚy_hardÚrets         r$   Úhard_softmaxr>   ;   sk   € Ø�^‰^˜CÓ €Fà�J‰J�s DˆJÓ)¨!Ñ,€EÜ×Ñ˜f´E×4RÑ4RÔS×\Ñ\Ð]`ÐbgÐilÓm€FØ
�6—=‘=“?Ñ
" VÑ
+€Cà€Jr&   ÚtauÚhardc                 ó:  — t         j                  j                  j                  t        j                  d| j
                  | j                  ¬«      t        j                  d| j
                  | j                  ¬«      «      }|j                  | j                  «      }| |z   |z  }|j                  |«      }|rd|j                  |d¬«      d   }t        j                  | t         j                  ¬«      j                  ||d«      }||j                  «       z
  |z   }	|	S |}	|	S )Nç        )r   Údtyper3   Tr/   r   r1   )r!   ÚdistributionsÚgumbelÚGumbelÚtensorr   rC   ÚsampleÚshaper4   r5   r6   r7   r8   r9   )
r   r?   r@   r-   Úgumbel_distÚgumbelsr:   r;   r<   r=   s
             r$   Úgumbel_softmaxrL   E   sí   € ä×%Ñ%×,Ñ,×3Ñ3Ü�‰�S §¡°f·l±lÔCÜ�‰�S §¡°f·l±lÔCó€Kð × Ñ  §¡Ó.€Gà˜Ñ 3Ñ&€GØ�_‰_˜SÓ!€Fáà—
‘
˜3¨�
Ó-¨aÑ0ˆÜ×!Ñ! &¼×8VÑ8VÔW×`Ñ`ÐadÐfkÐmpÓqˆØ�v—}‘}“Ñ&¨Ñ/ˆð €Jð ˆØ€Jr&   c                 ó¼  — ||z  | j                   d   z  dz  }||kD  r4t        t        j                  ||z  «      «      }| j                   d   |z  }n3t        t        j                  ||z  «      «      }| j                   d   |z  }| j                   d   }| j                   d   }| j	                  ||||«      } t
        j                  j                  | ||fd|¬«      } | S )a¾  
    Args:
        attentions (`torch.Tensor`): attention map of shape [batch_size, groups, feat_height*feat_width]
        height (`int`): height of the output attention map
        width (`int`): width of the output attention map
        align_corners (`bool`, *optional*): the `align_corner` argument for `nn.functional.interpolate`.

    Returns:
        `torch.Tensor`: resized attention map of shape [batch_size, groups, height, width]
    é   ç      à?r   r   Úbilinear©ÚsizeÚmodeÚalign_corners)rI   ÚintÚnpÚroundÚreshaper   r   Úinterpolate)	Ú
attentionsÚheightÚwidthrT   ÚscaleÚ
feat_widthÚfeat_heightÚ
batch_sizeÚgroupss	            r$   Úresize_attention_maprb   [   så   € ð �e‰^˜z×/Ñ/°Ñ2Ñ2°sÑ:€EØ�‚~ÜœŸ™ %¨%¡-Ó0Ó1ˆ
Ø ×&Ñ& qÑ)¨ZÑ7‰äœ"Ÿ(™( 6¨E¡>Ó2Ó3ˆØ×%Ñ% aÑ(¨KÑ7ˆ
à×!Ñ! !Ñ$€JØ×Ñ˜aÑ €Fà×#Ñ# J°¸ÀZÓP€JÜ—‘×*Ñ*Ø˜& %˜¨zÈð +ó €Jð Ðr&   c           	      óH  — g }t        j                  «       5  d}| D ]i  }|j                  ddd«      j                  «       }|€|}n||z  }t	        |j                  ddd«      j                  «       g|¢­Ž }|j                  |«       Œk 	 ddd«       |d   }|S # 1 sw Y   ŒxY w)a1  
    Args:
        attentions (`tuple(torch.FloatTensor)`: tuple of attention maps returned by `GroupViTVisionTransformer`
        hw_shape (`tuple(int)`): height and width of the output attention map
    Returns:
        `torch.Tensor`: the attention map of shape [batch_size, groups, height, width]
    Nr   rN   r   éÿÿÿÿ)r!   Úno_gradÚpermuteÚ
contiguousrb   Úappend)rZ   Úhw_shapeÚ	attn_mapsÚprev_attn_masksÚ
attn_masksÚcur_attn_mapÚfinal_groupings          r$   Úget_grouping_from_attentionsro   y   s´   € ð €IÜ	�‰‹ñ +ØˆØ$ò 		+ˆJà#×+Ñ+¨A¨q°!Ó4×?Ñ?ÓAˆJØÐ&Ø",‘à"1°JÑ">�ä/°×0GÑ0GÈÈ1ÈaÓ0P×0[Ñ0[Ó0]ÐiÐ`hÒiˆLØ×Ñ˜\Õ*ñ		+÷+ð ˜r‘]€NàÐ÷!+ð +ús   —A1BÂB!c                   ó*   ‡ — e Zd Zdefˆ fd„Zd„ Zˆ xZS )ÚGroupViTCrossAttentionLayerÚconfigc                 ó"  •— t         ‰| �  «        t        |«      | _        t	        j
                  |j                  |j                  ¬«      | _        t        |«      | _
        t	        j
                  |j                  |j                  ¬«      | _        y ©N©Úeps)ÚsuperÚ__init__ÚGroupViTAttentionÚattnr   Ú	LayerNormÚhidden_sizeÚlayer_norm_epsÚnorm2ÚGroupViTMLPÚmlpÚ	norm_post©Úselfrr   Ú	__class__s     €r$   rx   z$GroupViTCrossAttentionLayer.__init__—   sb   ø€ Ü‰ÑÔÜ% fÓ-ˆŒ	Ü—\‘\ &×"4Ñ"4¸&×:OÑ:OÔPˆŒ
Ü˜vÓ&ˆŒÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆ�r&   c                 ó¤   — |}|| j                  ||¬«      d   z   }|| j                  | j                  |«      «      z   }| j                  |«      }|S )N)Úencoder_hidden_statesr   )rz   r€   r~   r�   )rƒ   ÚqueryÚkeyÚxs       r$   Úforwardz#GroupViTCrossAttentionLayer.forwardž   sQ   € ØˆØ�—	‘	˜%°s�	Ó;¸AÑ>Ñ>ˆØ�—‘˜Ÿ™ A›Ó'Ñ'ˆØ�N‰N˜1ÓˆØˆr&   )Ú__name__Ú
__module__Ú__qualname__r   rx   rŠ   Ú__classcell__©r„   s   @r$   rq   rq   –   s   ø„ ðUÐ3õ Uör&   rq   c                   ó2   ‡ — e Zd Zdefˆ fd„Zdd„Zd„ Zˆ xZS )ÚGroupViTAssignAttentionrr   c                 óä  •— t         ‰| �  «        |j                  dz  | _        t	        j
                  |j                  |j                  «      | _        t	        j
                  |j                  |j                  «      | _        t	        j
                  |j                  |j                  «      | _        t	        j
                  |j                  |j                  «      | _	        |j                  | _
        y )Nç      à¿)rw   rx   r|   r]   r   ÚLinearÚq_projÚk_projÚv_projÚprojÚ
assign_epsr‚   s     €r$   rx   z GroupViTAssignAttention.__init__§   s¥   ø€ Ü‰ÑÔØ×'Ñ'¨Ñ-ˆŒ
ä—i‘i × 2Ñ 2°F×4FÑ4FÓGˆŒÜ—i‘i × 2Ñ 2°F×4FÑ4FÓGˆŒÜ—i‘i × 2Ñ 2°F×4FÑ4FÓGˆŒÜ—I‘I˜f×0Ñ0°&×2DÑ2DÓEˆŒ	Ø ×+Ñ+ˆ�r&   c                 ó¦   — |r| j                   rt        |d|¬«      }|S |rt        |d¬«      }|S t        j                  j                  |d¬«      }|S )Néþÿÿÿ)r-   r@   ©r-   )ÚtrainingrL   r>   r   r   r4   )rƒ   rz   rE   r@   s       r$   Úget_attnz GroupViTAssignAttention.get_attn±   sX   € Ù�d—m’mÜ! $¨B°TÔ:ˆDð ˆñ Ü# D¨bÔ1�ð ˆô —}‘}×,Ñ,¨T°rÐ,Ó:�àˆr&   c                 ót  — |}| j                  |«      }| j                  |«      }| j                  |«      }||j                  dd«      z  | j                  z  }| j                  |«      }| j                  |dd¬«      }||j                  dd¬«      | j                  z   z  }||z  }| j                  |«      }||fS )Nr›   rd   F)rE   r@   T©r-   r0   )	r•   r–   r—   Ú	transposer]   rž   Úsumr™   r˜   )rƒ   r‡   rˆ   ÚvalueÚraw_attnrz   Ú	soft_attnÚouts           r$   rŠ   zGroupViTAssignAttention.forward¼   s·   € Øˆà—‘˜EÓ"ˆð �k‰k˜#Óˆð —‘˜EÓ"ˆð ˜CŸM™M¨"¨bÓ1Ñ1°T·Z±ZÑ?ˆà�}‰}˜XÓ&ˆØ—M‘M (°5¸u�MÓEˆ	à�t—x‘x B°�xÓ5¸¿¹ÑGÑHˆà�U‰lˆà�i‰i˜‹nˆà�Iˆ~Ðr&   )TT)r‹   rŒ   r�   r   rx   rž   rŠ   rŽ   r�   s   @r$   r‘   r‘   ¦   s   ø„ ð,Ð3õ ,ó	ör&   r‘   c                   ó0   ‡ — e Zd Zdefˆ fd„Zd„ Zd„ Zˆ xZS )ÚGroupViTTokenAssignrr   c                 ód  •— t         ‰| �  «        || _        t        j                  |j
                  |j                  ¬«      | _        t        |j                  t        j                  j                  «      r|j                  n|j                  |j                  f}|D �cg c]  }t        ||j
                  z  «      ‘Œ c}\  }}t        ||||«      | _        t        j                  |j
                  |j                  ¬«      | _        t        j                  |j
                  |j                  ¬«      | _        t%        |«      | _        t)        |«      | _        t        j                  |j
                  |j                  ¬«      | _        t/        ||j
                  ||j
                  «      | _        y c c}w rt   )rw   rx   Únum_output_groupr   r{   r|   r}   Únorm_tokensÚ
isinstanceÚassign_mlp_ratioÚcollectionsÚabcÚIterablerU   ÚGroupViTMixerMLPÚ	mlp_interÚnorm_post_tokensÚnorm_xrq   Úpre_assign_attnr‘   ÚassignÚ
norm_new_xr   Úmlp_channels)	rƒ   rr   Únum_group_tokenrª   r­   r‰   Ú
tokens_dimÚchannels_dimr„   s	           €r$   rx   zGroupViTTokenAssign.__init__×   sK  ø€ Ü‰ÑÔØ 0ˆÔäŸ<™<¨×(:Ñ(:À×@UÑ@UÔVˆÔô ˜&×1Ñ1´;·?±?×3KÑ3KÔLð ×#Ò#à×)Ñ)¨6×+BÑ+BÐCð 	ð
 JZÖ#ZÀA¤C¨¨F×,>Ñ,>Ñ(>Õ$?Ò#ZÑ ˆ
�LÜ)¨&°/À:ÐO_Ó`ˆŒÜ "§¡¨V×-?Ñ-?ÀV×EZÑEZÔ [ˆÔä—l‘l 6×#5Ñ#5¸6×;PÑ;PÔQˆŒÜ:¸6ÓBˆÔä-¨fÓ5ˆŒÜŸ,™, v×'9Ñ'9¸v×?TÑ?TÔUˆŒÜ'¨°×0BÑ0BÀLÐRX×RdÑRdÓeˆÕùò $[s   ÂF-c                 óJ   — | j                  |«      }| j                  |«      }|S )zæ
        Args:
            group_tokens (torch.Tensor): group tokens, [batch_size, num_group_tokens, channels]

        Returns:
            projected_group_tokens (torch.Tensor): [batch_size, num_output_groups, channels]
        )r²   r³   )rƒ   Úgroup_tokensÚprojected_group_tokenss      r$   Úproject_group_tokenz'GroupViTTokenAssign.project_group_tokenì   s+   € ð "&§¡°Ó!=ÐØ!%×!6Ñ!6Ð7MÓ!NÐØ%Ð%r&   c                 ó  — | j                  |«      }| j                  |«      }| j                  |«      }| j                  ||«      }| j	                  ||«      \  }}||z  }|| j                  | j                  |«      «      z   }||fS )zà
        Args:
            image_tokens (`torch.Tensor`): image tokens, of shape [batch_size, input_length, channels]
            group_tokens (`torch.Tensor`): group tokens, [batch_size, num_group_tokens, channels]
        )r«   r´   r¿   rµ   r¶   r¸   r·   )rƒ   Úimage_tokensr½   r¾   Únew_image_tokensÚ	attentions         r$   rŠ   zGroupViTTokenAssign.forwardù   s•   € ð ×'Ñ'¨Ó5ˆØ—{‘{ <Ó0ˆà!%×!9Ñ!9¸,Ó!GÐØ!%×!5Ñ!5Ð6LÈlÓ![ÐØ&*§k¡kÐ2HÈ,Ó&WÑ#Ð˜)ØÐ2Ñ2Ðà+¨d×.?Ñ.?ÀÇÁÐP`Ó@aÓ.bÑbÐà Ð*Ð*r&   )r‹   rŒ   r�   r   rx   r¿   rŠ   rŽ   r�   s   @r$   r¨   r¨   Ö   s   ø„ ðfÐ3õ fò*&ö+r&   r¨   c                   ó0  — e Zd ZU dZdZeej                     ed<   dZ	eej                     ed<   dZ
eej                     ed<   dZeej                     ed<   dZeej                     ed<   dZeej                     ed<   dZeed	<   dZeed
<   dee   fd„Zy)ÚGroupViTModelOutputa\  
    Args:
        loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `return_loss` is `True`):
            Contrastive loss for image-text similarity.
        logits_per_image (`torch.FloatTensor` of shape `(image_batch_size, text_batch_size)`):
            The scaled dot product scores between `image_embeds` and `text_embeds`. This represents the image-text
            similarity scores.
        logits_per_text (`torch.FloatTensor` of shape `(text_batch_size, image_batch_size)`):
            The scaled dot product scores between `text_embeds` and `image_embeds`. This represents the text-image
            similarity scores.
        segmentation_logits (`torch.FloatTensor` of shape `(batch_size, config.num_labels, logits_height, logits_width)`):
            Classification scores for each pixel.

            <Tip warning={true}>

            The logits returned do not necessarily have the same size as the `pixel_values` passed as inputs. This is
            to avoid doing two interpolations and lose some quality when a user needs to resize the logits to the
            original image size as post-processing. You should always check your logits shape and resize as needed.

            </Tip>

        text_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim`):
            The text embeddings obtained by applying the projection layer to the pooled output of
            [`GroupViTTextModel`].
        image_embeds (`torch.FloatTensor` of shape `(batch_size, output_dim`):
            The image embeddings obtained by applying the projection layer to the pooled output of
            [`GroupViTVisionModel`].
        text_model_output (`BaseModelOutputWithPooling`):
            The output of the [`GroupViTTextModel`].
        vision_model_output (`BaseModelOutputWithPooling`):
            The output of the [`GroupViTVisionModel`].
    NÚlossÚlogits_per_imageÚlogits_per_textÚsegmentation_logitsÚtext_embedsÚimage_embedsÚtext_model_outputÚvision_model_outputr   c                 óH   ‡ — t        ˆ fd„‰ j                  «       D «       «      S )Nc              3   ód   •K  — | ]'  }|d vr‰|   nt        ‰|«      j                  «       –— Œ) y­w))rÌ   rÍ   N)ÚgetattrÚto_tuple)Ú.0Úkrƒ   s     €r$   ú	<genexpr>z/GroupViTModelOutput.to_tuple.<locals>.<genexpr>:  s=   øè ø€ ò 
àð Ð LÑLˆD�ŠGÔRYÐZ^Ð`aÓRb×RkÑRkÓRmÓmñ
ùs   ƒ-0)ÚtupleÚkeys©rƒ   s   `r$   rÑ   zGroupViTModelOutput.to_tuple9  s#   ø€ Üó 
à—Y‘Y“[ô
ó 
ð 	
r&   )r‹   rŒ   r�   Ú__doc__rÆ   r   r!   ÚFloatTensorÚ__annotations__rÇ   rÈ   rÉ   rÊ   rË   rÌ   r   rÍ   r   r   rÑ   © r&   r$   rÅ   rÅ     s²   … ñðB )-€Dˆ(�5×$Ñ$Ñ
%Ó,Ø48Ð�h˜u×0Ñ0Ñ1Ó8Ø37€O�X˜e×/Ñ/Ñ0Ó7Ø7;Ð˜ %×"3Ñ"3Ñ4Ó;Ø/3€K�˜%×+Ñ+Ñ,Ó3Ø04€L�(˜5×,Ñ,Ñ-Ó4Ø48ÐÐ1Ó8Ø6:ÐÐ3Ó:ð
˜% ™*ô 
r&   rÅ   c            	       ó�   ‡ — e Zd ZdZ	 	 	 	 ddedeeeeef   f   dedefˆ fd„Zddej                  de
d	ej                  fd
„Zˆ xZS )ÚGroupViTPatchEmbeddingsz#
    Image to Patch Embedding.
    Ú
image_sizeÚ
patch_sizeÚnum_channelsÚ	embed_dimc                 ó^  •— t         ‰| �  «        t        |t        j                  j
                  «      r|n||f}t        |t        j                  j
                  «      r|n||f}|d   |d   z  |d   |d   z  z  }|| _        || _        || _        t        j                  ||||¬«      | _        y )Nr   r   )Úkernel_sizeÚstride)rw   rx   r¬   r®   r¯   r°   rÞ   rß   Únum_patchesr   ÚConv2dÚ
projection)rƒ   rÞ   rß   rà   rá   rå   r„   s         €r$   rx   z GroupViTPatchEmbeddings.__init__E  s¤   ø€ ô 	‰ÑÔÜ#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ü#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ø! !‘}¨
°1©Ñ5¸*ÀQ¹-È:ÐVWÉ=Ñ:XÑYˆØ$ˆŒØ$ˆŒØ&ˆÔäŸ)™) L°)ÈÐ\fÔgˆ�r&   Úpixel_valuesÚinterpolate_pos_encodingr   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 (ú).rN   )rI   rÞ   Ú
ValueErrorrç   Úflattenr¡   )rƒ   rè   ré   r`   rà   r[   r\   r‰   s           r$   rŠ   zGroupViTPatchEmbeddings.forwardV  s­   € Ø2>×2DÑ2DÑ/ˆ
�L &¨%Ù'Ø˜Ÿ™¨Ñ+Ò+¨u¸¿¹ÈÑ8JÒ/JÜ Ø(¨¨°°%°ð 9ØŸ™¨Ñ+Ð,¨A¨d¯o©o¸aÑ.@Ð-AÀðEóð ð �O‰O˜LÓ)×1Ñ1°!Ó4×>Ñ>¸qÀ!ÓDˆØˆr&   )éà   é   r	   i   ©F)r‹   rŒ   r�   rØ   rU   r   r   rx   r!   ÚTensorÚboolrŠ   rŽ   r�   s   @r$   rÝ   rÝ   @  s}   ø„ ñð Ø24ØØñhàðhð ˜#˜u S¨# X™Ð.Ñ/ðhð ð	hð
 õhñ"	 E§L¡Lð 	ÈDð 	Ð]b×]iÑ]i÷ 	r&   rÝ   c                   ó¢   ‡ — e Zd Zdefˆ fd„Zdej                  dededej                  fd„Zddej                  d	e	dej                  fd
„Z
ˆ xZS )ÚGroupViTVisionEmbeddingsrr   c                 ó  •— t         ‰| �  «        t        |j                  |j                  |j
                  |j                  ¬«      | _        | j                  j                  }t        j                  t        j                  d||j                  «      «      | _        t        j                  |j                  «      | _        t        j                   |j                  |j"                  ¬«      | _        |j                  | _        || _        y )N)rÞ   rß   rà   rá   r   ru   )rw   rx   rÝ   rÞ   rß   rà   r|   Úpatch_embeddingsrå   r   Ú	Parameterr!   ÚzerosÚposition_embeddingsÚDropoutÚdropoutr{   r}   Ú	layernormrr   )rƒ   rr   rå   r„   s      €r$   rx   z!GroupViTVisionEmbeddings.__init__c  s¼   ø€ Ü‰ÑÔä 7Ø×(Ñ(Ø×(Ñ(Ø×,Ñ,Ø×(Ñ(ô	!
ˆÔð ×+Ñ+×7Ñ7ˆÜ#%§<¡<´·±¸A¸{ÈF×L^ÑL^Ó0_Ó#`ˆÔ Ü—z‘z &§.¡.Ó1ˆŒÜŸ™ f×&8Ñ&8¸f×>SÑ>SÔTˆŒØ ×+Ñ+ˆŒØˆ�r&   Ú
embeddingsr[   r\   r   c                 ó0  — |j                   d   }| j                  j                   d   }t        j                  j	                  «       s||k(  r||k(  r| j                  S | j                  }|j                   d   }|| j
                  z  }|| j
                  z  }	t        |dz  «      }
|j                  d|
|
|«      }|j                  dddd«      }t        j                  j                  |||	fdd¬	«      }|j                  dddd«      j                  dd|«      }|S )
a  
        This method allows to interpolate the pre-trained position encodings, to be able to use the model on higher resolution
        images. This method is also adapted to support torch.jit tracing and no class embeddings.

        Adapted from:
        - https://github.com/facebookresearch/dino/blob/de9ee3df6cf39fac952ab558447af1fa1365362a/vision_transformer.py#L174-L194, and
        - https://github.com/facebookresearch/dinov2/blob/e1277af2ba9496fbadf7aec6eba56e8d882d1e35/dinov2/models/vision_transformer.py#L179-L211
        r   rd   rO   r   r	   rN   ÚbicubicFrQ   )rI   rú   r!   ÚjitÚ
is_tracingrß   r   rX   rf   r   r   rY   Úview)rƒ   rþ   r[   r\   rå   Únum_positionsÚpatch_pos_embedr-   Ú
new_heightÚ	new_widthÚsqrt_num_positionss              r$   ré   z1GroupViTVisionEmbeddings.interpolate_pos_encodings  s#  € ð !×&Ñ& qÑ)ˆØ×0Ñ0×6Ñ6°qÑ9ˆô �y‰y×#Ñ#Ô%¨+¸Ò*FÈ6ÐUZÊ?Ø×+Ñ+Ð+à×2Ñ2ˆà×Ñ˜rÑ"ˆà˜tŸ™Ñ.ˆ
Ø˜TŸ_™_Ñ,ˆ	ä& }°cÑ'9Ó:ÐØ)×1Ñ1°!Ð5GÐI[Ð]`ÓaˆØ)×1Ñ1°!°Q¸¸1Ó=ˆäŸ-™-×3Ñ3ØØ˜iÐ(ØØð	 4ó 
ˆð *×1Ñ1°!°Q¸¸1Ó=×BÑBÀ1ÀbÈ#ÓNˆØÐr&   rè   ré   c                 ó
  — |j                   \  }}}}| j                  ||¬«      }| j                  |«      }|j                  «       \  }}}	|r|| j	                  |||«      z   }n|| j
                  z   }| j                  |«      }|S )N)ré   )rI   r÷   rý   rR   ré   rú   rü   )
rƒ   rè   ré   r`   rà   r[   r\   rþ   Úseq_lenÚ_s
             r$   rŠ   z GroupViTVisionEmbeddings.forward™  s‘   € Ø2>×2DÑ2DÑ/ˆ
�L &¨%Ø×*Ñ*¨<ÐRjÐ*Ókˆ
à—^‘^ JÓ/ˆ
à!+§¡Ó!2Ñˆ
�G˜Qñ $Ø# d×&CÑ&CÀJÐPVÐX]Ó&^Ñ^‰Jà# d×&>Ñ&>Ñ>ˆJà—\‘\ *Ó-ˆ
àÐr&   rñ   )r‹   rŒ   r�   r   rx   r!   rò   rU   ré   ró   rŠ   rŽ   r�   s   @r$   rõ   rõ   b  sc   ø„ ðÐ3õ ð $°5·<±<ð $Èð $ÐUXð $Ð]b×]iÑ]ió $ñL E§L¡Lð ÈDð Ð]b×]iÑ]i÷ r&   rõ   c            	       ó¦   ‡ — e Zd Zdefˆ fd„Z	 	 	 ddeej                     deej                     deej                     dej                  fd„Z
ˆ xZS )	ÚGroupViTTextEmbeddingsrr   c                 óN  •— t         ‰| �  «        |j                  }t        j                  |j
                  |«      | _        t        j                  |j                  |«      | _        | j                  dt        j                  |j                  «      j                  d«      d¬«       y )NÚposition_ids)r   rd   F)Ú
persistent)rw   rx   r|   r   Ú	EmbeddingÚ
vocab_sizeÚtoken_embeddingÚmax_position_embeddingsÚposition_embeddingÚregister_bufferr!   r"   Úexpand©rƒ   rr   rá   r„   s      €r$   rx   zGroupViTTextEmbeddings.__init__®  sƒ   ø€ Ü‰ÑÔØ×&Ñ&ˆ	ä!Ÿ|™|¨F×,=Ñ,=¸yÓIˆÔÜ"$§,¡,¨v×/MÑ/MÈyÓ"YˆÔð 	×ÑØœEŸL™L¨×)GÑ)GÓH×OÑOÐPWÓXÐejð 	õ 	
r&   Ú	input_idsr  Úinputs_embedsr   c                 ó8  — |�|j                   d   n|j                   d   }| j                  j                  j                   d   }||kD  rt        d|› d|› �«      ‚|€| j                  d d …d |…f   }|€| j                  |«      }| j                  |«      }||z   }|S )Nrd   r›   r   zRSequence length must be less than max_position_embeddings (got `sequence length`: z and max_position_embeddings: )rI   r  Úweightrí   r  r  )rƒ   r  r  r  Ú
seq_lengthÚmax_position_embeddingrú   rþ   s           r$   rŠ   zGroupViTTextEmbeddings.forwardº  sÇ   € ð -6Ð,A�Y—_‘_ RÒ(À}×GZÑGZÐ[]ÑG^ˆ
Ø!%×!8Ñ!8×!?Ñ!?×!EÑ!EÀaÑ!HÐàÐ.Ò.ÜØdØ�,Ð<Ð=SÐ<TðVóð ð
 ÐØ×,Ñ,ªQ°°°¨^Ñ<ˆLàÐ Ø ×0Ñ0°Ó;ˆMà"×5Ñ5°lÓCÐØ"Ð%8Ñ8ˆ
àÐr&   ©NNN)r‹   rŒ   r�   r   rx   r   r!   Ú
LongTensorrÙ   rò   rŠ   rŽ   r�   s   @r$   r  r  ­  sk   ø„ ð

Ð1õ 

ð 15Ø37Ø59ñ	à˜E×,Ñ,Ñ-ðð ˜u×/Ñ/Ñ0ðð   × 1Ñ 1Ñ2ð	ð
 
�‰÷r&   r  c            
       ó  ‡ — e Zd ZdZdededededef
ˆ fd„Zed„ «       Zd	„ Z	dd
e
j                  dee
j                     de
j                  fd„Z	 	 dde
j                  dee
j                     dee   dee
j                      fd„Zˆ xZS )ÚGroupViTStagezMThis corresponds to the `GroupingLayer` class in the GroupViT implementation.rr   ÚdepthÚnum_prev_group_tokenr¹   rª   c           	      óf  •— t         ‰| �  «        || _        || _        |dkD  r:t	        j
                  t        j                  d||j                  «      «      | _	        nd | _	        t	        j                  t        |«      D �cg c]  }t        |«      ‘Œ c}«      | _        |dkD  rt        |||¬«      | _        nd | _        |dkD  rc|dkD  r^t	        j                   t	        j"                  |j                  |j$                  ¬«      t'        |||j                  dz  |«      «      | _        y d | _        y c c}w )Nr   r   )rr   r¹   rª   ru   rN   )rw   rx   r#  r¹   r   rø   r!   rù   r|   Úgroup_tokenÚ
ModuleListÚrangeÚGroupViTEncoderLayerÚlayersr¨   Ú
downsampleÚ
Sequentialr{   r}   r±   Úgroup_projector)rƒ   rr   r#  r$  r¹   rª   r  r„   s          €r$   rx   zGroupViTStage.__init__Ø  s  ø€ ô 	‰ÑÔØˆŒ
Ø.ˆÔØ˜QÒÜ!Ÿ|™|¬E¯K©K¸¸?ÈF×L^ÑL^Ó,_Ó`ˆDÕà#ˆDÔÜ—m‘mÌ5ÐQVË<Ö$XÀaÔ%9¸&Õ%AÒ$XÓYˆŒà˜QÒÜ1ØØ /Ø!1ôˆD�Oð #ˆDŒOà !Ò#¨¸!Ò(;Ü#%§=¡=Ü—‘˜V×/Ñ/°V×5JÑ5JÔKÜ  Ð)=¸v×?QÑ?QÐUVÑ?VÐXgÓhó$ˆDÕ ð
 $(ˆDÕ ùò# %Ys   Â D.c                 ó   — | j                   d uS ©N)r&  r×   s    r$   Úwith_group_tokenzGroupViTStage.with_group_tokenú  s   € à×Ñ tÐ+Ð+r&   c                 óz   — | j                   r,|d d …d | j                   …f   |d d …| j                   d …f   fS |d fS r/  )r0  r¹   )rƒ   r‰   s     r$   Úsplit_xzGroupViTStage.split_xþ  sN   € Ø× Ò Ø’QÐ/˜4×/Ñ/Ð/Ð/Ð/Ñ0°!²A¸×8LÑ8LÐ7LÑ7NÐ4NÑ2OÐOÐOà�d�7ˆNr&   r‰   r&  r   c                 ó<   — |€|S t        j                  ||gd¬«      S )Nr   rœ   )r!   Úcat)rƒ   r‰   r&  s      r$   Úconcat_xzGroupViTStage.concat_x  s#   € ØÐØˆHÜ�y‰y˜!˜[Ð)¨qÔ1Ð1r&   Úhidden_statesÚprev_group_tokenÚoutput_attentionsc                 ó¬  — | j                   rM| j                  j                  |j                  d«      dd«      }| j                  �|| j	                  |«      z   }nd}|}| j                  ||«      }| j                  D ]  } ||dd¬«      }|d   }Œ | j                  |«      \  }}d}	| j                  �| j                  ||«      \  }}	||f}
|r|
|	fz   }
|
S )aø  
        Args:
            hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)`
            attention_mask (`torch.FloatTensor`): attention mask of size
                `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
                `(config.encoder_attention_heads,)`.
            output_attentions (`bool`, *optional*):
                Whether or not to return the grouping tensors of Grouping block.
        r   rd   N)Úattention_maskÚcausal_attention_mask)	r0  r&  r  rR   r-  r5  r*  r2  r+  )rƒ   r6  r7  r8  r&  r‰   Úcat_xÚlayerÚ	layer_outrÃ   Úoutputss              r$   rŠ   zGroupViTStage.forward	  sî   € ð × Ò Ø×*Ñ*×1Ñ1°-×2DÑ2DÀQÓ2GÈÈRÓPˆKØ×#Ñ#Ð/Ø)¨D×,@Ñ,@ÐAQÓ,RÑR‘àˆKàˆà—‘˜a Ó-ˆØ—[‘[ò 	!ˆEÙ˜e°DÐPTÔUˆIØ˜a‘L‰Eð	!ð Ÿ™ eÓ,‰ˆˆ;àˆ	Ø�?‰?Ð&ØŸ?™?¨1¨kÓ:‰LˆAˆyà�kÐ"ˆÙØ  Ñ,ˆGàˆr&   r/  ©NF)r‹   rŒ   r�   rØ   r   rU   rx   Úpropertyr0  r2  r!   rò   r   r5  ró   r   rÙ   rŠ   rŽ   r�   s   @r$   r"  r"  Õ  sÒ   ø„ ÙWð (à$ð (ð ð (ð "ð	 (ð
 ð (ð õ (ðD ñ,ó ð,òñ2˜%Ÿ,™,ð 2°X¸e¿l¹lÑ5Kð 2ÐW\×WcÑWcó 2ð 48Ø,1ñ	'à—|‘|ð'ð # 5§<¡<Ñ0ð'ð $ D™>ð	'ð
 
ˆu× Ñ Ñ	!÷'r&   r"  c            
       ó‚   ‡ — e Zd Z	 	 	 d	dedee   dee   dee   fˆ fd„Zdej                  dej                  fd„Z	ˆ xZ
S )
r   rr   r|   Úintermediate_sizeÚoutput_sizec                 ó  •— t         ‰| �  «        || _        t        |j                     | _        |�|n|j                  }|�|n|j                  }|�|n|}t        j                  ||«      | _
        t        j                  ||«      | _        y r/  )rw   rx   rr   r
   Ú
hidden_actÚactivation_fnr|   rC  r   r”   Úfc1Úfc2)rƒ   rr   r|   rC  rD  r„   s        €r$   rx   zGroupViTMLP.__init__4  sƒ   ø€ ô 	‰ÑÔØˆŒÜ# F×$5Ñ$5Ñ6ˆÔØ%0Ð%<‘kÀ&×BTÑBTˆØ1BÐ1NÑ-ÐTZ×TlÑTlÐØ%0Ð%<‘kÀ+ˆÜ—9‘9˜[Ð*;Ó<ˆŒÜ—9‘9Ð.°Ó<ˆ�r&   r6  r   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S r/  )rH  rG  rI  )rƒ   r6  s     r$   rŠ   zGroupViTMLP.forwardD  s4   € ØŸ™ Ó/ˆØ×*Ñ*¨=Ó9ˆØŸ™ Ó/ˆØÐr&   r  )r‹   rŒ   r�   r   r   rU   rx   r!   rò   rŠ   rŽ   r�   s   @r$   r   r   3  s`   ø„ ð &*Ø+/Ø%)ñ=à$ð=ð ˜c‘]ð=ð $ C™=ð	=ð
 ˜c‘]õ=ð  U§\¡\ð °e·l±l÷ r&   r   c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )r±   c                 óf   •— t         ‰| �  |j                  dd«      «      }|j                  dd«      S ©Nr   rN   )rw   rŠ   r¡   )rƒ   r‰   r„   s     €r$   rŠ   zGroupViTMixerMLP.forwardL  s-   ø€ Ü‰G‰O˜AŸK™K¨¨1Ó-Ó.ˆØ�{‰{˜1˜aÓ Ð r&   )r‹   rŒ   r�   rŠ   rŽ   r�   s   @r$   r±   r±   K  s   ø„ ÷!ð !r&   r±   c                   ó6  ‡ — e Zd ZdZˆ fd„Zdej                  dedefd„Z	 	 	 	 ddej                  de	ej                     d	e	ej                     d
e	ej                     de	e   deej                  e	ej                     e	eej                        f   fd„Zˆ xZS )ry   z=Multi-headed attention from 'Attention Is All You Need' paperc                 ó
  •— t         ‰| �  «        || _        |j                  | _        |j
                  | _        | j                  | j                  z  | _        | j                  | j                  z  | j                  k7  r&t        d| j                  › d| j                  › d�«      ‚| j                  dz  | _	        |j                  | _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        y )Nz;embed_dim must be divisible by num_heads (got `embed_dim`: z and `num_heads`: rì   r“   )rw   rx   rr   r|   rá   Únum_attention_headsÚ	num_headsÚhead_dimrí   r]   Úattention_dropoutrü   r   r”   r–   r—   r•   Úout_projr‚   s     €r$   rx   zGroupViTAttention.__init__T  s  ø€ Ü‰ÑÔØˆŒØ×+Ñ+ˆŒØ×3Ñ3ˆŒØŸ™¨$¯.©.Ñ8ˆŒØ�=‰=˜4Ÿ>™>Ñ)¨T¯^©^Ò;ÜØMÈdÏnÉnÐM]ð ^Ø—N‘NÐ# 2ð'óð ð —]‘] DÑ(ˆŒ
Ø×/Ñ/ˆŒä—i‘i §¡°·±Ó?ˆŒÜ—i‘i §¡°·±Ó?ˆŒÜ—i‘i §¡°·±Ó?ˆŒÜŸ	™	 $§.¡.°$·.±.ÓAˆ�r&   rG   r
  Úbszc                 óŽ   — |j                  ||| j                  | j                  «      j                  dd«      j	                  «       S rM  )r  rQ  rR  r¡   rg   )rƒ   rG   r
  rU  s       r$   Ú_shapezGroupViTAttention._shapeg  s7   € Ø�{‰{˜3 ¨¯©¸¿¹ÓG×QÑQÐRSÐUVÓW×bÑbÓdÐdr&   r6  r:  r;  r†   r8  r   c                 ó*  — |j                  «       \  }}}|du}	| j                  |«      | j                  z  }
|	rE| j                  | j	                  |«      d|«      }| j                  | j                  |«      d|«      }nD| j                  | j	                  |«      d|«      }| j                  | j                  |«      d|«      }|| j                  z  d| j                  f} | j                  |
||«      j                  |Ž }
 |j                  |Ž } |j                  |Ž }|j                  d«      }t        j                  |
|j                  dd«      «      }|j                  «       || j                  z  ||fk7  r/t        d|| j                  z  ||f› d|j                  «       › �«      ‚|�{|j                  «       |d||fk7  r#t        d|d||f› d|j                  «       › �«      ‚|j                  || j                  ||«      |z   }|j                  || j                  z  ||«      }|�{|j                  «       |d||fk7  r#t        d|d||f› d|j                  «       › �«      ‚|j                  || j                  ||«      |z   }|j                  || j                  z  ||«      }t        j                  j                  |d¬«      }|r?|j                  || j                  ||«      }|j                  || j                  z  ||«      }nd}t        j                  j!                  || j                   | j"                  ¬	«      }t        j                  ||«      }|j                  «       || j                  z  || j                  fk7  r7t        d
|| j                  || j                  f› d|j                  «       › �«      ‚|j                  || j                  || j                  «      }|j                  dd«      }|j%                  |||«      }| j'                  |«      }||fS )z#Input shape: Batch x Time x ChannelNrd   r   rN   z$Attention weights should be of size z	, but is z!Attention mask should be of size rœ   )Úpr�   z `attn_output` should be of size )rR   r•   r]   rW  r–   r—   rQ  rR  r  r!   Úbmmr¡   rí   r   r   r4   rü   r�   rX   rT  )rƒ   r6  r:  r;  r†   r8  rU  Útgt_lenrá   Úis_cross_attentionÚquery_statesÚ
key_statesÚvalue_statesÚ
proj_shapeÚsrc_lenÚattn_weightsÚattn_weights_reshapedÚ
attn_probsÚattn_outputs                      r$   rŠ   zGroupViTAttention.forwardj  s  € ð #0×"4Ñ"4Ó"6ÑˆˆW�iØ2¸$Ð>Ðð —{‘{ =Ó1°D·J±JÑ>ˆÙØŸ™ T§[¡[Ð1FÓ%GÈÈSÓQˆJØŸ;™; t§{¡{Ð3HÓ'IÈ2ÈsÓS‰LàŸ™ T§[¡[°Ó%?ÀÀSÓIˆJØŸ;™; t§{¡{°=Ó'AÀ2ÀsÓKˆLà˜DŸN™NÑ*¨B°·±Ð>ˆ
ØC�t—{‘{ <°¸#Ó>×CÑCÀZÐPˆØ$�Z—_‘_ jÐ1ˆ
Ø(�|×(Ñ(¨*Ð5ˆà—/‘/ !Ó$ˆÜ—y‘y ¨z×/CÑ/CÀAÀqÓ/IÓJˆà×ÑÓ 3¨¯©Ñ#7¸À'Ð"JÒJÜØ6¸¸d¿n¹nÑ8LÈgÐW^Ð7_Ð6`ð aØ ×%Ñ%Ó'Ð(ð*óð ð !Ð,Ø$×)Ñ)Ó+°°Q¸ÀÐ/IÒIÜ Ø7¸¸aÀÈ'Ð8RÐ7Sð TØ-×2Ñ2Ó4Ð5ð7óð ð (×,Ñ,¨S°$·.±.À'È7ÓSÐVkÑkˆLØ'×,Ñ,¨S°4·>±>Ñ-AÀ7ÈGÓTˆLàÐ%Ø×"Ñ"Ó$¨¨a°¸'Ð(BÒBÜ Ø7¸¸aÀÈ'Ð8RÐ7SÐS\Ð]k×]pÑ]pÓ]rÐ\sÐtóð ð (×,Ñ,¨S°$·.±.À'È7ÓSÐVdÑdˆLØ'×,Ñ,¨S°4·>±>Ñ-AÀ7ÈGÓTˆLä—}‘}×,Ñ,¨\¸rÐ,ÓBˆáð
 %1×$5Ñ$5°c¸4¿>¹>È7ÐT[Ó$\Ð!Ø0×5Ñ5°c¸D¿N¹NÑ6JÈGÐU\Ó]‰Là$(Ð!ä—]‘]×*Ñ*¨<¸4¿<¹<ÐRV×R_ÑR_Ð*Ó`ˆ
ä—i‘i 
¨LÓ9ˆà×ÑÓ #¨¯©Ñ"6¸ÀÇÁÐ!OÒOÜØ2°C¸¿¹ÈÐRV×R_ÑR_Ð3`Ð2að bØ×$Ñ$Ó&Ð'ð)óð ð
 "×&Ñ& s¨D¯N©N¸GÀTÇ]Á]ÓSˆØ!×+Ñ+¨A¨qÓ1ˆØ!×)Ñ)¨#¨w¸	ÓBˆà—m‘m KÓ0ˆàÐ1Ð1Ð1r&   )NNNF)r‹   rŒ   r�   rØ   rx   r!   rò   rU   rW  r   rÙ   ró   r   rŠ   rŽ   r�   s   @r$   ry   ry   Q  sÎ   ø„ ÙGôBð&e˜UŸ\™\ð e°Cð e¸có eð 26Ø8<Ø=AØ,1ñR2à—|‘|ðR2ð ! §¡Ñ.ðR2ð  (¨¯©Ñ5ð	R2ð
  (¨×(9Ñ(9Ñ:ðR2ð $ D™>ðR2ð 
ˆu�|‰|˜X e§l¡lÑ3°X¸eÀEÇLÁLÑ>QÑ5RÐRÑ	S÷R2r&   ry   c                   ó    ‡ — e Zd Zdefˆ fd„Z	 d	dej                  dej                  dej                  dee   de	ej                     f
d„Zˆ xZS )
r)  rr   c                 óD  •— t         ‰| �  «        |j                  | _        t	        |«      | _        t        j                  | j                  |j                  ¬«      | _	        t        |«      | _        t        j                  | j                  |j                  ¬«      | _        y rt   )rw   rx   r|   rá   ry   Ú	self_attnr   r{   r}   Úlayer_norm1r   r€   Úlayer_norm2r‚   s     €r$   rx   zGroupViTEncoderLayer.__init__Á  sm   ø€ Ü‰ÑÔØ×+Ñ+ˆŒÜ*¨6Ó2ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÔÜ˜vÓ&ˆŒÜŸ<™<¨¯©¸F×<QÑ<QÔRˆÕr&   r6  r:  r;  r8  r   c                 óÎ   — |}| j                  |«      }| j                  ||||¬«      \  }}||z   }|}| j                  |«      }| j                  |«      }||z   }|f}|r||fz  }|S )aI  
        Args:
            hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)`
            attention_mask (`torch.FloatTensor`): attention mask of size
                `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
                `(config.encoder_attention_heads,)`.
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
        )r6  r:  r;  r8  )ri  rh  rj  r€   )rƒ   r6  r:  r;  r8  Úresidualrb  r?  s           r$   rŠ   zGroupViTEncoderLayer.forwardÉ  s’   € ð" !ˆà×(Ñ(¨Ó7ˆØ&*§n¡nØ'Ø)Ø"7Ø/ð	 '5ó '
Ñ#ˆ�|ð ! =Ñ0ˆà ˆØ×(Ñ(¨Ó7ˆØŸ™ Ó/ˆØ  =Ñ0ˆà Ð"ˆáØ˜�Ñ&ˆGàˆr&   rñ   )r‹   rŒ   r�   r   rx   r!   rò   r   ró   r   rÙ   rŠ   rŽ   r�   s   @r$   r)  r)  À  sf   ø„ ðS˜~õ Sð -2ñ&à—|‘|ð&ð Ÿ™ð&ð  %Ÿ|™|ð	&ð
 $ D™>ð&ð 
ˆu× Ñ Ñ	!÷&r&   r)  c                   ó"   — e Zd ZdZeZdZdZd„ Zy)ÚGroupViTPreTrainedModelz†
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    ÚgroupvitTc                 ód  — | j                   j                  }t        |t        j                  t        j
                  f«      rX|j                  j                  j                  d|¬«       |j                  �ˆ|j                  j                  j                  «        nct        |t        j                  «      rI|j                  j                  j                  «        |j                  j                  j                  d«       | j                   j                  }t        |t        «      ri|j                  j                  j                  j                  d|dz  ¬«       |j                   j                  j                  j                  d|dz  ¬«       yt        |t"        «      �r,| j                   j                  }|j$                  dz  d|j                   j&                  z  dz  z  |z  }|j$                  dz  |z  }t        j(                  j                  |j*                  j                  |¬«       t        j(                  j                  |j,                  j                  |¬«       t        j(                  j                  |j.                  j                  |¬«       t        j(                  j                  |j0                  j                  |¬«       yt        |t2        «      rÙ| j                   j                  }|j                   j4                  dz  d|j                   j&                  z  dz  z  |z  }d|j                   j4                  z  dz  |z  }t        j(                  j                  |j6                  j                  |¬«       t        j(                  j                  |j8                  j                  |¬«       yy)	zInitialize the weightsrB   )ÚmeanÚstdNr3   g{®Gáz”?r“   rN   )rr  )rr   Úinitializer_ranger¬   r   r”   ræ   r  ÚdataÚnormal_ÚbiasÚzero_r{   Úfill_Úinitializer_factorr  r  r  ry   rá   Únum_hidden_layersÚinitr•   r–   r—   rT  r   r|   rH  rI  )rƒ   ÚmoduleÚ
init_rangeÚfactorÚin_proj_stdÚout_proj_stdÚfc_stds          r$   Ú_init_weightsz%GroupViTPreTrainedModel._init_weightsü  s•  € ð —[‘[×2Ñ2ˆ
Ü�fœrŸy™y¬"¯)©)Ð4Ô5ð �M‰M×Ñ×&Ñ&¨C°ZÐ&Ô@Ø�{‰{Ð&Ø—‘× Ñ ×&Ñ&Õ(Ü˜¤§¡Ô-Ø�K‰K×Ñ×"Ñ"Ô$Ø�M‰M×Ñ×$Ñ$ SÔ)à—‘×/Ñ/ˆÜ�fÔ4Ô5Ø×"Ñ"×)Ñ)×.Ñ.×6Ñ6¸CÀVÈdÁ]Ð6ÔSØ×%Ñ%×,Ñ,×1Ñ1×9Ñ9¸sÈÐQUÉÐ9ÕVÜ˜Ô 1Õ2Ø—[‘[×3Ñ3ˆFØ!×+Ñ+¨TÑ1°q¸6¿=¹=×;ZÑ;ZÑ7ZÐ_cÑ6cÑdÐgmÑmˆKØ"×,Ñ,¨dÑ2°fÑ<ˆLÜ�G‰G�O‰O˜FŸM™M×0Ñ0°kˆOÔBÜ�G‰G�O‰O˜FŸM™M×0Ñ0°kˆOÔBÜ�G‰G�O‰O˜FŸM™M×0Ñ0°kˆOÔBÜ�G‰G�O‰O˜FŸO™O×2Ñ2¸ˆOÕEÜ˜¤Ô,Ø—[‘[×3Ñ3ˆFØ!Ÿ=™=×4Ñ4°dÑ:ÀÀFÇMÁM×DcÑDcÑ@cÐhlÑ?lÑmÐpvÑvˆKØ˜&Ÿ-™-×3Ñ3Ñ3¸Ñ<¸vÑEˆFÜ�G‰G�O‰O˜FŸJ™J×-Ñ-°6ˆOÔ:Ü�G‰G�O‰O˜FŸJ™J×-Ñ-°;ˆOÕ?ð -r&   N)	r‹   rŒ   r�   rØ   r   Úconfig_classÚbase_model_prefixÚsupports_gradient_checkpointingr‚  rÛ   r&   r$   rn  rn  ò  s    „ ñð
 "€LØ"ÐØ&*Ð#ó@r&   rn  aJ  
    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. Use it
    as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and
    behavior.

    Parameters:
        config ([`GroupViTConfig`]): Model configuration class with all the parameters of the model.
            Initializing with a config file does not load the weights associated with the model, only the
            configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
aƒ  
    Args:
        input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
            Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide
            it.

            Indices can be obtained using [`CLIPTokenizer`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details.

            [What are input IDs?](../glossary#input-ids)
        attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
            Mask to avoid performing attention on padding token indices. 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)
        position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
            config.max_position_embeddings - 1]`.

            [What are position IDs?](../glossary#position-ids)
        output_attentions (`bool`, *optional*):
            Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
            tensors for more detail.
        output_hidden_states (`bool`, *optional*):
            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
            more detail.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
aE  
    Args:
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Padding will be ignored by default should you provide it. Pixel values can be obtained using
            [`AutoImageProcessor`]. See [`CLIPImageProcessor.__call__`] for details.
        output_attentions (`bool`, *optional*):
            Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
            tensors for more detail.
        output_hidden_states (`bool`, *optional*):
            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
            more detail.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
aÛ  
    Args:
        input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
            Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide
            it.

            Indices can be obtained using [`CLIPTokenizer`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details.

            [What are input IDs?](../glossary#input-ids)
        attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
            Mask to avoid performing attention on padding token indices. 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)
        position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
            config.max_position_embeddings - 1]`.

            [What are position IDs?](../glossary#position-ids)
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See
            [`CLIPImageProcessor.__call__`] for details.
        return_loss (`bool`, *optional*):
            Whether or not to return the contrastive loss.
        output_attentions (`bool`, *optional*):
            Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
            tensors for more detail.
        output_hidden_states (`bool`, *optional*):
            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
            more detail.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
c                   ó|   ‡ — e Zd Zdeddfˆ fd„Z	 	 	 d
dej                  dee   dee   dee   de	e
ef   f
d	„Zˆ xZS )ÚGroupViTVisionEncoderrr   r   Nc                 óh  •— t         ‰| �  «        || _        t        j                  t        t        |j                  «      «      D �cg c]P  }t        ||j                  |   |j                  |   |j                  |   |dkD  r|j                  |dz
     nd¬«      ‘ŒR c}«      | _        d| _        y c c}w )Nr   r   )rr   r#  r¹   rª   r$  F)rw   rx   rr   r   r'  r(  r#   Údepthsr"  Únum_group_tokensÚnum_output_groupsÚstagesÚgradient_checkpointing)rƒ   rr   Úir„   s      €r$   rx   zGroupViTVisionEncoder.__init__  s¨   ø€ Ü‰ÑÔØˆŒÜ—m‘mô œs 6§=¡=Ó1Ó2ö	ð ô Ø!Ø Ÿ-™-¨Ñ*Ø$*×$;Ñ$;¸AÑ$>Ø%+×%=Ñ%=¸aÑ%@ØLMÐPQÊE¨×)AÑ)AÀ!ÀaÁ%Ò)HÐWXöò	ó
ˆŒð ',ˆÕ#ùò	s   ÁAB/r6  Úoutput_hidden_statesr8  Úreturn_dictc                 óª  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|rdnd }|rdnd }d }t	        | j
                  «      D ]3  \  }}	|r||fz   } |	|||«      }
|
d   }|
d   }|sŒ%|
d   €Œ+||
d   fz   }Œ5 |r||fz   }|st        d„ |||fD «       «      S t        |||¬«      S )NrÛ   r   r   rN   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr/  rÛ   ©rÒ   Úvs     r$   rÔ   z0GroupViTVisionEncoder.forward.<locals>.<genexpr>²  s   è ø€ Òg˜qÐYZÑYfœÑgùó   ‚Š©Úlast_hidden_stater6  rZ   )rr   r8  r�  Úuse_return_dictÚ	enumeraterŒ  rÕ   r   )rƒ   r6  r�  r8  r�  Úall_hidden_statesÚall_groupingsr½   rŽ  ÚstageÚlayer_outputss              r$   rŠ   zGroupViTVisionEncoder.forward�  s   € ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆá"6™B¸DÐÙ/™°Tˆàˆä! $§+¡+Ó.ò 
	D‰HˆAˆuÙ#Ø$5¸Ð8HÑ$HÐ!á! -°Ð?PÓQˆMà)¨!Ñ,ˆMØ(¨Ñ+ˆLâ  ]°1Ñ%5Ñ%AØ -°¸qÑ1AÐ0CÑ C‘ð
	Dñ  Ø 1°]Ð4DÑ DÐáÜÑg ]Ð4EÀ}Ð$UÔgÓgÐgÜØ+Ð;LÐYfô
ð 	
r&   r  )r‹   rŒ   r�   r   rx   r!   rò   r   ró   r   rÕ   r   rŠ   rŽ   r�   s   @r$   r‡  r‡  ~  sq   ø„ ð,Ð3ð ,¸õ ,ð( 04Ø,0Ø&*ñ%
à—|‘|ð%
ð ' t™nð%
ð $ D™>ð	%
ð
 ˜d‘^ð%
ð 
ˆu�oÐ%Ñ	&÷%
r&   r‡  c                   ó¤   ‡ — e Zd ZdZdefˆ fd„Z	 	 	 	 	 ddeej                     deej                     dee	   dee	   dee	   d	e
eef   fd
„Zˆ xZS )ÚGroupViTTextEncoderz¹
    Transformer encoder consisting of `config.num_hidden_layers` self-attention layers. Each layer is a
    [`GroupViTEncoderLayer`].

    Args:
        config: GroupViTTextConfig
    rr   c                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w r@  )
rw   rx   rr   r   r'  r(  rz  r)  r*  r�  )rƒ   rr   r  r„   s      €r$   rx   zGroupViTTextEncoder.__init__Á  sP   ø€ Ü‰ÑÔØˆŒÜ—m‘mÌ5ÐQW×QiÑQiÓKjÖ$kÀaÔ%9¸&Õ%AÒ$kÓlˆŒØ&+ˆÕ#ùò %ls   ½A#r:  r;  r8  r�  r�  r   c                 ó  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|rdnd}|rdnd}|}	t	        | j
                  «      D ]b  \  }
}|r||	fz   }| j                  r,| j                  r | j                  |j                  |	|||«      }n ||	|||¬«      }|d   }	|sŒZ||d   fz   }Œd |r||	fz   }|st        d„ |	||fD «       «      S t        |	||¬«      S )aÕ  
        Args:
            inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`):
                Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation.
                This is useful if you want more control over how to convert `input_ids` indices into associated vectors
                than the model's internal embedding lookup matrix.
            attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
                Mask to avoid performing attention on padding token indices. 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)
            causal_attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
                Causal mask for the text model. 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)
            output_attentions (`bool`, *optional*):
                Whether or not to return the attentions tensors of all attention layers. See `attentions` under
                returned tensors for more detail.
            output_hidden_states (`bool`, *optional*):
                Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors
                for more detail.
            return_dict (`bool`, *optional*):
                Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
        NrÛ   )r8  r   r   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr/  rÛ   r“  s     r$   rÔ   z.GroupViTTextEncoder.forward.<locals>.<genexpr>  s   è ø€ Òe˜qÐWXÑWdœÑeùr•  r–  )rr   r8  r�  r˜  r™  r*  r�  r�   Ú_gradient_checkpointing_funcÚ__call__rÕ   r   )rƒ   r  r:  r;  r8  r�  r�  Úencoder_statesÚall_attentionsr6  ÚidxÚencoder_layerr�  s                r$   rŠ   zGroupViTTextEncoder.forwardÇ  sH  € ðL 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆá3™¸ˆÙ0™°dˆà%ˆÜ"+¨D¯K©KÓ"8ò 	FÑˆC�Ù#Ø!/°=Ð2BÑ!B�Ø×*Ò*¨t¯}ª}Ø $× AÑ AØ!×*Ñ*Ø!Ø"Ø)Ø%ó!‘ñ !.Ø!Ø"Ø)Ø&7ô	!�ð *¨!Ñ,ˆMâ Ø!/°=ÀÑ3CÐ2EÑ!E‘ð-	Fñ0  Ø+¨}Ð.>Ñ>ˆNáÜÑe ]°NÀNÐ$SÔeÓeÐeÜØ+¸>ÐVdô
ð 	
r&   )NNNNN)r‹   rŒ   r�   rØ   r   rx   r   r!   rò   ró   r   r   r   rŠ   rŽ   r�   s   @r$   rŸ  rŸ  ¸  s–   ø„ ñð,Ð1õ ,ð 26Ø8<Ø,0Ø/3Ø&*ñO
ð ! §¡Ñ.ðO
ð  (¨¯©Ñ5ð	O
ð
 $ D™>ðO
ð ' t™nðO
ð ˜d‘^ðO
ð 
ˆu�oÐ%Ñ	&÷O
r&   rŸ  c                   óð   ‡ — e Zd Zdefˆ fd„Z ee«       eee¬«      	 	 	 	 	 	 dde	e
j                     de	e
j                     de	e
j                     de	e   de	e   d	e	e   d
eeef   fd„«       «       Zˆ xZS )ÚGroupViTTextTransformerrr   c                 óö   •— t         ‰| �  «        || _        |j                  }t	        |«      | _        t        |«      | _        t        j                  ||j                  ¬«      | _        |j                  | _        y rt   )rw   rx   rr   r|   r  rþ   rŸ  Úencoderr   r{   r}   Úfinal_layer_normÚeos_token_idr  s      €r$   rx   z GroupViTTextTransformer.__init__  sa   ø€ Ü‰ÑÔØˆŒØ×&Ñ&ˆ	Ü0°Ó8ˆŒÜ*¨6Ó2ˆŒÜ "§¡¨Y¸F×<QÑ<QÔ RˆÔð #×/Ñ/ˆÕr&   ©Úoutput_typerƒ  r  r:  r  r8  r�  r�  r   c                 óZ  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|€t	        d«      ‚|j                  «       }|j                  d|d   «      }| j                  ||¬«      }t        ||j                  |j                  ¬«      }	|�t        ||j                  «      }| j                  |||	|||¬«      }
|
d   }| j                  |«      }| j                  dk(  rm|t        j                   |j"                  d   |j                  ¬«      |j%                  t        j&                  |j                  ¬	«      j)                  d¬
«      f   }n‡|t        j                   |j"                  d   |j                  ¬«      |j%                  t        j&                  |j                  ¬	«      | j                  k(  j'                  «       j)                  d¬
«      f   }|s
||f|
dd z   S t+        |||
j,                  |
j.                  ¬«      S )ú
        Returns:

        NzYou have to specify input_idsrd   )r  r  r   )r  r:  r;  r8  r�  r�  r   rN   )rC   r   rœ   r   ©r—  Úpooler_outputr6  rZ   )rr   r8  r�  r˜  rí   rR   r  rþ   r   rC   r   r   r¬  r­  r®  r!   r"   rI   ÚtorU   Úargmaxr   r6  rZ   )rƒ   r  r:  r  r8  r�  r�  Úinput_shaper6  r;  Úencoder_outputsr—  Úpooled_outputs                r$   rŠ   zGroupViTTextTransformer.forward%  s.  € ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆàÐÜÐ<Ó=Ð=à—n‘nÓ&ˆØ—N‘N 2 {°2¡Ó7ˆ	àŸ™°)È,˜ÓWˆô !AØ˜×,Ñ,°]×5IÑ5Iô!
Ðð
 Ð%ä7¸È×H[ÑH[Ó\ˆNàŸ,™,Ø'Ø)Ø"7Ø/Ø!5Ø#ð 'ó 
ˆð ,¨AÑ.ÐØ ×1Ñ1Ð2CÓDÐà×Ñ Ò!ð .Ü—‘Ð.×4Ñ4°QÑ7Ð@Q×@XÑ@XÔYØ—‘¤5§9¡9Ð5F×5MÑ5M�ÓN×UÑUÐZ\ÐUÓ]ð_ñ‰Mð .Ü—‘Ð.×4Ñ4°QÑ7Ð@Q×@XÑ@XÔYð —‘¤E§I¡IÐ6G×6NÑ6N�ÓOÐSW×SdÑSdÑdß‘“ß‘˜B�“ð!ñˆMñ Ø% }Ð5¸ÈÈÐ8KÑKÐKä)Ø/Ø'Ø)×7Ñ7Ø&×1Ñ1ô	
ð 	
r&   ©NNNNNN)r‹   rŒ   r�   r   rx   r   ÚGROUPVIT_TEXT_INPUTS_DOCSTRINGr   r   r   r!   rò   ró   r   r   rŠ   rŽ   r�   s   @r$   rª  rª    sÐ   ø„ ð	0Ð1õ 	0ñ +Ð+IÓJÙÐ+EÐTfÔgð -1Ø15Ø/3Ø,0Ø/3Ø&*ñP
à˜EŸL™LÑ)ðP
ð ! §¡Ñ.ðP
ð ˜uŸ|™|Ñ,ð	P
ð
 $ D™>ðP
ð ' t™nðP
ð ˜d‘^ðP
ð 
ˆuÐ0Ð0Ñ	1òP
ó hó KôP
r&   rª  c                   ó  ‡ — e Zd ZeZdefˆ fd„Zdej                  fd„Zd„ Z	 e
e«       eee¬«      	 	 	 	 	 	 ddeej                      deej                      d	eej                      d
ee   dee   dee   deeef   fd„«       «       Zˆ xZS )ÚGroupViTTextModelrr   c                 ód   •— t         ‰| �  |«       t        |«      | _        | j	                  «        y r/  )rw   rx   rª  Ú
text_modelÚ	post_initr‚   s     €r$   rx   zGroupViTTextModel.__init__}  s&   ø€ Ü‰Ñ˜Ô Ü1°&Ó9ˆŒà�‰Õr&   r   c                 óB   — | j                   j                  j                  S r/  ©r¿  rþ   r  r×   s    r$   Úget_input_embeddingsz&GroupViTTextModel.get_input_embeddingsƒ  s   € Ø�‰×)Ñ)×9Ñ9Ð9r&   c                 ó:   — || j                   j                  _        y r/  rÂ  )rƒ   r£   s     r$   Úset_input_embeddingsz&GroupViTTextModel.set_input_embeddings†  s   € Ø5:ˆ�‰×"Ñ"Õ2r&   r¯  r  r:  r  r8  r�  r�  c                 ó0   — | j                  ||||||¬«      S )aK  
        Returns:

        Examples:

        ```python
        >>> from transformers import CLIPTokenizer, GroupViTTextModel

        >>> tokenizer = CLIPTokenizer.from_pretrained("nvidia/groupvit-gcc-yfcc")
        >>> model = GroupViTTextModel.from_pretrained("nvidia/groupvit-gcc-yfcc")

        >>> inputs = tokenizer(["a photo of a cat", "a photo of a dog"], padding=True, return_tensors="pt")

        >>> outputs = model(**inputs)
        >>> last_hidden_state = outputs.last_hidden_state
        >>> pooled_output = outputs.pooler_output  # pooled (EOS token) states
        ```©r  r:  r  r8  r�  r�  )r¿  )rƒ   r  r:  r  r8  r�  r�  s          r$   rŠ   zGroupViTTextModel.forward‰  s,   € ð8 �‰ØØ)Ø%Ø/Ø!5Ø#ð ó 
ð 	
r&   rº  )r‹   rŒ   r�   r   rƒ  rx   r   ÚModulerÃ  rÅ  r   r»  r   r   r   r!   rò   ró   r   r   rŠ   rŽ   r�   s   @r$   r½  r½  z  sá   ø„ Ø%€LðÐ1õ ð: b§i¡ió :ò;ñ +Ð+IÓJÙÐ+EÐTfÔgð -1Ø15Ø/3Ø,0Ø/3Ø&*ñ!
à˜EŸL™LÑ)ð!
ð ! §¡Ñ.ð!
ð ˜uŸ|™|Ñ,ð	!
ð
 $ D™>ð!
ð ' t™nð!
ð ˜d‘^ð!
ð 
ˆuÐ0Ð0Ñ	1ò!
ó hó Kô!
r&   r½  c                   ó°   ‡ — e Zd Zdefˆ fd„Z ee«       eee¬«      	 	 	 	 d
de	e
j                     de	e   de	e   de	e   deeef   f
d	„«       «       Zˆ xZS )ÚGroupViTVisionTransformerrr   c                 óÔ   •— t         ‰| �  «        || _        |j                  }t	        |«      | _        t        |«      | _        t        j                  ||j                  ¬«      | _        y rt   )rw   rx   rr   r|   rõ   rþ   r‡  r¬  r   r{   r}   rý   r  s      €r$   rx   z"GroupViTVisionTransformer.__init__°  sP   ø€ Ü‰ÑÔØˆŒØ×&Ñ&ˆ	ä2°6Ó:ˆŒÜ,¨VÓ4ˆŒÜŸ™ i°V×5JÑ5JÔKˆ�r&   r¯  rè   r�  r8  r�  r   c                 ó²  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|€t	        d«      ‚| j                  |«      }| j                  ||||¬«      }|d   }| j                  |«      }|j                  d¬«      }|s
||f|dd z   S t        |||j                  |j                  ¬«      S )r²  Nz You have to specify pixel_values)r6  r�  r8  r�  r   r   rœ   r³  )rr   r8  r�  r˜  rí   rþ   r¬  rý   rq  r   r6  rZ   )	rƒ   rè   r�  r8  r�  r6  r¸  r—  r¹  s	            r$   rŠ   z!GroupViTVisionTransformer.forward¹  s  € ð 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆàÐÜÐ?Ó@Ð@àŸ™¨Ó5ˆàŸ,™,Ø'Ø!5Ø/Ø#ð	 'ó 
ˆð ,¨AÑ.Ðð !ŸN™NÐ+<Ó=ÐØ)×.Ñ.°1Ð.Ó5ˆáØ% }Ð5¸ÈÈÐ8KÑKÐKä)Ø/Ø'Ø)×7Ñ7Ø&×1Ñ1ô	
ð 	
r&   ©NNNN)r‹   rŒ   r�   r   rx   r   Ú GROUPVIT_VISION_INPUTS_DOCSTRINGr   r   r   r!   rÙ   ró   r   r   rŠ   rŽ   r�   s   @r$   rÊ  rÊ  ¯  sŸ   ø„ ðLÐ3õ Lñ +Ð+KÓLÙÐ+EÐThÔið 59Ø/3Ø,0Ø&*ñ+
à˜u×0Ñ0Ñ1ð+
ð ' t™nð+
ð $ D™>ð	+
ð
 ˜d‘^ð+
ð 
ˆuÐ0Ð0Ñ	1ò+
ó jó Mô+
r&   rÊ  c                   óÄ   ‡ — e Zd ZeZdZdefˆ fd„Zdefd„Z e	e
«       eee¬«      	 	 	 	 ddeej                     dee   dee   d	ee   deeef   f
d
„«       «       Zˆ xZS )ÚGroupViTVisionModelrè   rr   c                 ód   •— t         ‰| �  |«       t        |«      | _        | j	                  «        y r/  )rw   rx   rÊ  Úvision_modelrÀ  r‚   s     €r$   rx   zGroupViTVisionModel.__init__í  s'   ø€ Ü‰Ñ˜Ô Ü5°fÓ=ˆÔà�‰Õr&   r   c                 óB   — | j                   j                  j                  S r/  )rÒ  rþ   r÷   r×   s    r$   rÃ  z(GroupViTVisionModel.get_input_embeddingsó  s   € Ø× Ñ ×+Ñ+×<Ñ<Ð<r&   r¯  r8  r�  r�  c                 ó,   — | j                  ||||¬«      S )aê  
        Returns:

        Examples:

        ```python
        >>> from PIL import Image
        >>> import requests
        >>> from transformers import AutoProcessor, GroupViTVisionModel

        >>> processor = AutoProcessor.from_pretrained("nvidia/groupvit-gcc-yfcc")
        >>> model = GroupViTVisionModel.from_pretrained("nvidia/groupvit-gcc-yfcc")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

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

        >>> outputs = model(**inputs)
        >>> last_hidden_state = outputs.last_hidden_state
        >>> pooled_output = outputs.pooler_output  # pooled CLS states
        ```©rè   r8  r�  r�  )rÒ  )rƒ   rè   r8  r�  r�  s        r$   rŠ   zGroupViTVisionModel.forwardö  s(   € ð> × Ñ Ø%Ø/Ø!5Ø#ð	 !ó 
ð 	
r&   rÍ  )r‹   rŒ   r�   r   rƒ  Úmain_input_namerx   rÝ   rÃ  r   rÎ  r   r   r   r!   rÙ   ró   r   r   rŠ   rŽ   r�   s   @r$   rÐ  rÐ  é  s´   ø„ Ø'€LØ$€OðÐ3õ ð=Ð&=ó =ñ +Ð+KÓLÙÐ+EÐThÔið 59Ø,0Ø/3Ø&*ñ"
à˜u×0Ñ0Ñ1ð"
ð $ D™>ð"
ð ' t™nð	"
ð
 ˜d‘^ð"
ð 
ˆuÐ0Ð0Ñ	1ò"
ó jó Mô"
r&   rÐ  c                   ód  ‡ — e Zd ZeZdefˆ fd„Z ee«      	 	 	 	 	 	 ddee	j                     dee	j                     dee	j                     dee   dee   dee   d	e	j                  fd
„«       Z ee«      	 	 	 	 ddee	j                     dee   dee   dee   d	e	j                  f
d„«       Z ee«       eee¬«      	 	 	 	 	 	 	 	 	 ddee	j&                     dee	j                     dee	j                     dee	j&                     dee   dee   dee   dee   dee   d	eeef   fd„«       «       Zˆ xZS )ÚGroupViTModelrr   c           
      ó6  •— t         ‰| �  |«       t        |j                  t        «      s"t        dt        |j                  «      › d�«      ‚t        |j                  t        «      s"t        dt        |j                  «      › d�«      ‚|j                  }|j                  }|j                  | _	        |j                  | _
        |j                  | _        |j                  | _        t        |«      | _        t!        |«      | _        t%        j&                  t%        j(                  | j                  | j                  d¬«      t%        j*                  | j                  «      t%        j,                  d¬«      t%        j(                  | j                  | j                  d¬«      «      | _        t%        j&                  t%        j(                  | j                  | j                  d¬«      t%        j*                  | j                  «      t%        j,                  d¬«      t%        j(                  | j                  | j                  d¬«      «      | _        t%        j2                  t5        j6                  | j8                  j:                  «      «      | _        | j?                  «        y )NzOconfig.text_config is expected to be of type GroupViTTextConfig but is of type ú.zSconfig.vision_config is expected to be of type GroupViTVisionConfig but is of type T)rv  )Úinplace) rw   rx   r¬   Útext_configr   Ú	TypeErrorÚtypeÚvision_configr   Úprojection_dimÚprojection_intermediate_dimr|   Útext_embed_dimÚvision_embed_dimrª  r¿  rÊ  rÒ  r   r,  r”   ÚBatchNorm1dÚReLUÚvisual_projectionÚtext_projectionrø   r!   rG   rr   Úlogit_scale_init_valueÚlogit_scalerÀ  )rƒ   rr   rÜ  rß  r„   s       €r$   rx   zGroupViTModel.__init__!  s÷  ø€ Ü‰Ñ˜Ô ä˜&×,Ñ,Ô.@ÔAÜðÜ˜×+Ñ+Ó,Ð-¨Qð0óð ô
 ˜&×.Ñ.Ô0DÔEÜðÜ˜×-Ñ-Ó.Ð/¨qð2óð ð
 ×(Ñ(ˆØ×,Ñ,ˆà$×3Ñ3ˆÔØ+1×+MÑ+MˆÔ(Ø)×5Ñ5ˆÔØ -× 9Ñ 9ˆÔä1°+Ó>ˆŒÜ5°mÓDˆÔä!#§¡Ü�I‰I�d×+Ñ+¨T×-MÑ-MÐTXÔYÜ�N‰N˜4×;Ñ;Ó<Ü�G‰G˜DÔ!Ü�I‰I�d×6Ñ6¸×8KÑ8KÐRVÔWó	"
ˆÔô  "Ÿ}™}Ü�I‰I�d×)Ñ)¨4×+KÑ+KÐRVÔWÜ�N‰N˜4×;Ñ;Ó<Ü�G‰G˜DÔ!Ü�I‰I�d×6Ñ6¸×8KÑ8KÐRVÔWó	 
ˆÔô Ÿ<™<¬¯©°T·[±[×5WÑ5WÓ(XÓYˆÔð 	�‰Õr&   r  r:  r  r8  r�  r�  r   c                 óü   — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }| j	                  ||||||¬«      }|d   }| j                  |«      }	|	S )až  
        Returns:
            text_features (`torch.FloatTensor` of shape `(batch_size, output_dim`): The text embeddings obtained by
            applying the projection layer to the pooled output of [`GroupViTTextModel`].

        Examples:

        ```python
        >>> from transformers import CLIPTokenizer, GroupViTModel

        >>> model = GroupViTModel.from_pretrained("nvidia/groupvit-gcc-yfcc")
        >>> tokenizer = CLIPTokenizer.from_pretrained("nvidia/groupvit-gcc-yfcc")

        >>> inputs = tokenizer(["a photo of a cat", "a photo of a dog"], padding=True, return_tensors="pt")
        >>> text_features = model.get_text_features(**inputs)
        ```rÇ  r   )rr   r8  r�  r˜  r¿  rç  )
rƒ   r  r:  r  r8  r�  r�  Útext_outputsr¹  Útext_featuress
             r$   Úget_text_featureszGroupViTModel.get_text_featuresL  s˜   € ð6 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆà—‘ØØ)Ø%Ø/Ø!5Ø#ð 'ó 
ˆð % Q™ˆØ×,Ñ,¨]Ó;ˆàÐr&   rè   c                 óø   — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }| j	                  ||||¬«      }|d   }| j                  |«      }|S )aH  
        Returns:
            image_features (`torch.FloatTensor` of shape `(batch_size, output_dim`): The image embeddings obtained by
            applying the projection layer to the pooled output of [`GroupViTVisionModel`].

        Examples:

        ```python
        >>> from PIL import Image
        >>> import requests
        >>> from transformers import AutoProcessor, GroupViTModel

        >>> model = GroupViTModel.from_pretrained("nvidia/groupvit-gcc-yfcc")
        >>> processor = AutoProcessor.from_pretrained("nvidia/groupvit-gcc-yfcc")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

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

        >>> image_features = model.get_image_features(**inputs)
        ```rÕ  r   )rr   r8  r�  r˜  rÒ  ræ  )rƒ   rè   r8  r�  r�  Úvision_outputsr¹  Úimage_featuress           r$   Úget_image_featuresz GroupViTModel.get_image_features{  s•   € ð> 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆà×*Ñ*Ø%Ø/Ø!5Ø#ð	 +ó 
ˆð ' qÑ)ˆØ×/Ñ/°Ó>ˆàÐr&   r¯  Úreturn_lossÚoutput_segmentationc
           
      óÖ  — |�|n| j                   j                  }|�|n| j                   j                  }|rd}|�|n| j                   j                  }|	�|	n| j                   j                  }	| j                  ||||	¬«      }
| j                  ||||||	¬«      }|
d   }| j                  |«      }|d   }| j                  |«      }||j                  dd¬«      z  }||j                  dd¬«      z  }| j                  j                  «       }t        j                  ||j                  «       «      |z  }|j                  «       }d}|�rb|
d   }| j                  |j                  d|j                   d   «      «      }|r|
d	   }n|
d
   }t#        ||j                   d
d «      }||j                  dd¬«      z  }t        j                  ||j                  «       «      |z  }|j                  |j                   d   d|j                   d   «      j%                  dd
d«      }|j                  |j                   d   |j                   d   d«      }t        j                  ||«      |z  }|j                  |j                   d   |j                   d   |j                   d
   |j                   d	   «      }d}|rt'        |«      }|	s|�
|||||||
f}n||||||
f}|�|f|z   S |S t)        ||||||||
¬«      S )a‰  
        Returns:

        Examples:

        ```python
        >>> from PIL import Image
        >>> import requests
        >>> from transformers import AutoProcessor, GroupViTModel

        >>> model = GroupViTModel.from_pretrained("nvidia/groupvit-gcc-yfcc")
        >>> processor = AutoProcessor.from_pretrained("nvidia/groupvit-gcc-yfcc")

        >>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
        >>> image = Image.open(requests.get(url, stream=True).raw)

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

        >>> outputs = model(**inputs)
        >>> logits_per_image = outputs.logits_per_image  # this is the image-text similarity score
        >>> probs = logits_per_image.softmax(dim=1)  # we can take the softmax to get the label probabilities
        ```NTrÕ  rÇ  r   rd   r    r   r	   rN   )rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÌ   rÍ   )rr   r8  ró  r�  r˜  rÒ  r¿  ræ  rç  Únormré  Úexpr!   Úmatmulr)   rX   rI   ro   rf   r,   rÅ   )rƒ   r  rè   r:  r  rò  r8  r�  ró  r�  rï  rë  rË   rÊ   ré  rÈ   rÇ   Ú
seg_logitsÚimage_group_embedsrZ   ÚgroupingÚlogits_per_image_groupÚflatten_groupingrÆ   Úoutputs                            r$   rŠ   zGroupViTModel.forward¬  sn  € ðN 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà#6Ð#BÑÈÏÉ×HgÑHgð 	ñ Ø $Ðà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð &1Ð%<‘kÀ$Ç+Á+×B]ÑB]ˆà×*Ñ*Ø%Ø/Ø!5Ø#ð	 +ó 
ˆð —‘ØØ)Ø%Ø/Ø!5Ø#ð 'ó 
ˆð & aÑ(ˆØ×-Ñ-¨lÓ;ˆà" 1‘oˆØ×*Ñ*¨;Ó7ˆð $ l×&7Ñ&7¸BÈÐ&7Ó&MÑMˆØ! K×$4Ñ$4¸ÀTÐ$4Ó$JÑJˆð ×&Ñ&×*Ñ*Ó,ˆÜŸ,™, {°L·N±NÓ4DÓEÈÑSˆØ*×,Ñ,Ó.Ðàˆ
Úð "0°Ñ!2Ðà!%×!7Ñ!7Ð8J×8RÑ8RÐSUÐWi×WoÑWoÐprÑWsÓ8tÓ!uÐÙ#Ø+¨AÑ.‘
à+¨AÑ.�
ä3°JÀ×@RÑ@RÐSTÐSUÐ@VÓWˆHð "4Ð6H×6MÑ6MÐRTÐ^bÐ6MÓ6cÑ!cÐä%*§\¡\Ð2DÀkÇmÁmÃoÓ%VÐYdÑ%dÐ"à%;×%CÑ%CØ×"Ñ" 1Ñ% r¨;×+<Ñ+<¸QÑ+?ó&ç‰g�a˜˜AÓð #ð
  (×/Ñ/°·±¸qÑ0AÀ8Ç>Á>ÐRSÑCTÐVXÓYÐô Ÿ™Ð&<Ð>NÓOÐR]Ñ]ˆJØ#×+Ñ+Ø× Ñ  Ñ# Z×%5Ñ%5°aÑ%8¸(¿.¹.ÈÑ:KÈXÏ^É^Ð\]ÑM^óˆJð ˆÙÜ  Ó1ˆDáØÐ%à$Ø#ØØØ Ø Ø"ð‘ð +¨O¸[È,ÐXdÐftÐu�Ø)-Ð)9�T�G˜fÑ$ÐE¸vÐEä"ØØ-Ø+Ø *Ø#Ø%Ø*Ø .ô	
ð 		
r&   rº  rÍ  )	NNNNNNNNN)r‹   rŒ   r�   r   rƒ  rx   r   r»  r   r!   rò   ró   rÙ   rí  rÎ  rñ  ÚGROUPVIT_INPUTS_DOCSTRINGr   rÅ   r   r   r   rŠ   rŽ   r�   s   @r$   rØ  rØ    s-  ø„ à!€Lð)˜~õ )ñV +Ð+IÓJð -1Ø15Ø/3Ø,0Ø/3Ø&*ñ,à˜EŸL™LÑ)ð,ð ! §¡Ñ.ð,ð ˜uŸ|™|Ñ,ð	,ð
 $ D™>ð,ð ' t™nð,ð ˜d‘^ð,ð 
×	Ñ	ò,ó Kð,ñ\ +Ð+KÓLð 59Ø,0Ø/3Ø&*ñ.à˜u×0Ñ0Ñ1ð.ð $ D™>ð.ð ' t™nð	.ð
 ˜d‘^ð.ð 
×	Ñ	ò.ó Mð.ñ` +Ð+DÓEÙÐ+>È^Ô\ð 15Ø48Ø15Ø37Ø&*Ø,0Ø/3Ø.2Ø&*ñK
à˜E×,Ñ,Ñ-ðK
ð ˜u×0Ñ0Ñ1ðK
ð ! §¡Ñ.ð	K
ð
 ˜u×/Ñ/Ñ0ðK
ð ˜d‘^ðK
ð $ D™>ðK
ð ' t™nðK
ð & d™^ðK
ð ˜d‘^ðK
ð 
ˆuÐ)Ð)Ñ	*òK
ó ]ó FôK
r&   rØ  )rØ  rn  r½  rÐ  )r   Frd   rñ   )LrØ   Úcollections.abcr®   Údataclassesr   Útypingr   r   r   r   ÚnumpyrV   r!   Útorch.utils.checkpointr   Úactivationsr
   Úmodeling_attn_mask_utilsr   r   Úmodeling_outputsr   r   Úmodeling_utilsr   Úutilsr   r   r   r   r   r   Úconfiguration_groupvitr   r   r   Ú
get_loggerr‹   ÚloggerÚ_CHECKPOINT_FOR_DOCrò   r%   r,   rU   r>   Úfloatró   rL   rb   ro   rÈ  rq   r‘   r¨   rÅ   rÝ   rõ   r  r"  r   r±   ry   r)  rn  ÚGROUPVIT_START_DOCSTRINGr»  rÎ  rþ  r‡  rŸ  rª  r½  rÊ  rÐ  rØ  Ú__all__rÛ   r&   r$   ú<module>r     s‚  ðñ ã Ý !ß .Ó .ã Û Û Ý å !ß dß KÝ -÷÷ ÷ ]Ñ \ð 
ˆ×	Ñ	˜HÓ	%€à0Ð ð
`˜UŸ\™\ð `¨e¯l©ló `ð
-˜eŸl™lð -¨u¯|©|ó -ð˜Ÿ™ð ¨Có ñ˜5Ÿ<™<ð ¨eð ¸tð ÐRUð Ð_d×_kÑ_kó ó,ò<ô: "§)¡)ô ô -˜bŸi™iô -ô`4+˜"Ÿ)™)ô 4+ðn ô/
˜+ó /
ó ð/
ôd˜bŸi™iô ôDG˜rŸy™yô GôV%˜RŸY™Yô %ôP[�B—I‘Iô [ô|�"—)‘)ô ô0!�{ô !ôk2˜Ÿ	™	ô k2ô^/˜2Ÿ9™9ô /ôd)@˜oô )@ðX	Ð ð"Ð ð@$Ð  ð#Ð ôL7
˜BŸI™Iô 7
ôt^
˜"Ÿ)™)ô ^
ôB^
˜bŸi™iô ^
ôB2
Ð/ô 2
ôj7
 §	¡	ô 7
ôt1
Ð1ô 1
ñh Ð.Ó/ô[
Ð+ó [
ó 0ð[
ò| c�r&   