§
    ‚ŠtjÞ]  ã                   ó¸  — d dl mZ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mZ dd
lmZmZ ddlmZ ddlmZmZmZ ddlmZmZ ddlmZ ddl m!Z!  G d„ dej"        ¦  «        Z# G d„ dej"        ¦  «        Z$	 	 d0dej"        dej%        dej%        dej%        dej%        dz  de&dz  de&dee         fd„Z' G d„ d ej"        ¦  «        Z( G d!„ d"ej"        ¦  «        Z) G d#„ d$e¦  «        Z* G d%„ d&ej"        ¦  «        Z+e G d'„ d(e¦  «        ¦   «         Z,e G d)„ d*e,¦  «        ¦   «         Z- ed+¬,¦  «         G d-„ d.e,¦  «        ¦   «         Z.g d/¢Z/dS )1é    )ÚCallableÚIterableN)Únné   )Úinitialization)ÚACT2FN)Úcreate_bidirectional_mask)ÚGradientCheckpointingLayer)ÚBaseModelOutputÚBaseModelOutputWithPoolingÚImageClassifierOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚ	torch_int)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputsé   )ÚVivitConfigc                   óL   ‡ — e Zd ZdZdefˆ fd„Zdej        dej        fd„Zˆ xZ	S )ÚVivitTubeletEmbeddingsay  
    This class turns `pixel_values` of shape `(batch_size, num_frames, num_channels, height, width)` into the initial
    `hidden_states` (tubelet embeddings) of shape `(batch_size, seq_length, hidden_size)` to be consumed by a
    Transformer encoder.

    The seq_length equals (num_frames // tubelet_size[0]) * (height // tubelet_size[1]) * (width // tubelet_size[2]).
    Úconfigc                 óh  •— t          ¦   «                              ¦   «          |j        }|j        }t	          |t
          ¦  «        r|n||f}|j        |d         z  |d         |d         z  z  |d         |d         z  z  | _        || _        t          j	        |j
        |j        ||¬¦  «        | _        d S )Nr   r   é   )Úkernel_sizeÚstride)ÚsuperÚ__init__Útubelet_sizeÚ
image_sizeÚ
isinstancer   Ú
num_framesÚnum_patchesr   ÚConv3dÚnum_channelsÚhidden_sizeÚ
projection)Úselfr   r"   r#   Ú	__class__s       €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/vivit/modeling_vivit.pyr!   zVivitTubeletEmbeddings.__init__0   s¿   ø€ Ý‰Œ×ÒÑÔÐØÔ*ˆØÔ&ˆ
Ý#-¨j½(Ñ#CÔ#CÐa�Z�ZÈ*ÐV`ÐIaˆ
ð Ô ,¨q¤/Ñ1Ø˜!Œ} ¨Q¤Ñ/ñ1à˜!Œ} ¨Q¤Ñ/ñ1ð 	Ôð
 %ˆŒÝœ)ØÔ Ô!3ÀÐVbð
ñ 
ô 
ˆŒˆˆó    Úpixel_valuesÚreturnc                 ó¦   — |                      dd¦  «        }|                      |¦  «                             d¦  «                              dd¦  «        S )Nr   r   )Ú	transposer*   Úflatten)r+   r/   s     r-   ÚforwardzVivitTubeletEmbeddings.forward@   sG   € à#×-Ò-¨a°Ñ3Ô3ˆØ�Š˜|Ñ,Ô,×4Ò4°QÑ7Ô7×AÒAÀ!ÀQÑGÔGÐGr.   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   ÚtorchÚTensorr4   Ú__classcell__©r,   s   @r-   r   r   '   s~   ø€ € € € € ðð ð
˜{ð 
ð 
ð 
ð 
ð 
ð 
ð H E¤Lð H°U´\ð Hð Hð Hð Hð Hð Hð Hð Hr.   r   c                   ó~   ‡ — e Zd 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 )ÚVivitEmbeddingszY
    Construct the CLS token, position and tubelet patch embeddings for video input.
    r   c                 óÜ  •— t          ¦   «                              ¦   «          t          j        t	          j        dd|j        ¦  «        ¦  «        | _        t          |¦  «        | _	        | j	        j
        }t          j        t	          j        d|dz   |j        ¦  «        ¦  «        | _        t          j        |j        ¦  «        | _        |j        dd …         | _        | j	        j        | _        d S )Nr   )r    r!   r   Ú	Parameterr9   Úzerosr)   Ú	cls_tokenr   Úpatch_embeddingsr&   Úposition_embeddingsÚDropoutÚhidden_dropout_probÚdropoutr"   Ú
patch_sizer#   )r+   r   r&   r,   s      €r-   r!   zVivitEmbeddings.__init__K   s¶   ø€ Ý‰Œ×ÒÑÔÐåœ¥e¤k°!°Q¸Ô8JÑ&KÔ&KÑLÔLˆŒÝ 6°vÑ >Ô >ˆÔØÔ+Ô7ˆÝ#%¤<µ´¸A¸{ÈQ¹ÐPVÔPbÑ0cÔ0cÑ#dÔ#dˆÔ Ý”z &Ô"<Ñ=Ô=ˆŒà Ô-¨a¨b¨bÔ1ˆŒØÔ/Ô:ˆŒˆˆr.   Ú
embeddingsÚheightÚwidthr0   c                 ó¤  — | j         j        }| j        j        d         dz
  }t          j                             ¦   «         s||k    r||k    r| j        S | j        dd…dd…f         }| j        dd…dd…f         }|j        d         }|| j        d         z  }	|| j        d         z  }
t          |dz  ¦  «        }| 	                    d|||¦  «        }| 
                    dddd¦  «        }t          j                             ||	|
fdd	¬
¦  «        }| 
                    dddd¦  «                             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éÿÿÿÿr   g      à?r   r   ÚbicubicF)ÚsizeÚmodeÚalign_corners©Údim)rC   r&   rD   Úshaper9   ÚjitÚ
is_tracingrH   r   ÚreshapeÚpermuter   Ú
functionalÚinterpolateÚviewÚcat)r+   rI   rJ   rK   r&   Únum_positionsÚclass_pos_embedÚpatch_pos_embedrS   Ú
new_heightÚ	new_widthÚsqrt_num_positionss               r-   Úinterpolate_pos_encodingz(VivitEmbeddings.interpolate_pos_encodingW   su  € ð Ô+Ô7ˆØÔ0Ô6°qÔ9¸AÑ=ˆõ Œy×#Ò#Ñ%Ô%ð 	,¨+¸Ò*FÐ*FÈ6ÐUZÊ?È?ØÔ+Ð+àÔ2°1°1°1°b°q°b°5Ô9ˆØÔ2°1°1°1°a°b°b°5Ô9ˆàÔ˜rÔ"ˆà˜tœ¨qÔ1Ñ1ˆ
Ø˜Tœ_¨QÔ/Ñ/ˆ	å& }°cÑ'9Ñ:Ô:ÐØ)×1Ò1°!Ð5GÐI[Ð]`ÑaÔaˆØ)×1Ò1°!°Q¸¸1Ñ=Ô=ˆåœ-×3Ò3ØØ˜iÐ(ØØð	 4ñ 
ô 
ˆð *×1Ò1°!°Q¸¸1Ñ=Ô=×BÒBÀ1ÀbÈ#ÑNÔNˆåŒy˜/¨?Ð;ÀÐCÑCÔCÐCr.   Fr/   rc   c                 óÒ  — |j         \  }}}}}|                      |¦  «        }| j                             |dd¦  «        }	t	          j        |	|fd¬¦  «        }|r||                      |||¦  «        z   }n^|| j        d         k    s|| j        d         k    r2t          d|› d|› d| j        d         › d| j        d         › d�	¦  «        ‚|| j	        z   }|  
                    |¦  «        }|S )	NrM   r   rR   r   zInput image size (Ú*z) doesn't match model (z).)rT   rC   rB   Úexpandr9   r\   rc   r#   Ú
ValueErrorrD   rG   )
r+   r/   rc   Ú
batch_sizer%   r(   rJ   rK   rI   Ú
cls_tokenss
             r-   r4   zVivitEmbeddings.forward~   s3  € Ø>JÔ>PÑ;ˆ
�J ¨f°eØ×*Ò*¨<Ñ8Ô8ˆ
ð ”^×*Ò*¨:°r¸2Ñ>Ô>ˆ
Ý”Y 
¨JÐ7¸QÐ?Ñ?Ô?ˆ
à#ð 	?Ø# d×&CÒ&CÀJÐPVÐX]Ñ&^Ô&^Ñ^ˆJˆJà˜œ¨Ô+Ò+Ð+¨u¸¼ÈÔ8JÒ/JÐ/JÝ ðE¨ð Eð E°%ð Eð EØœ¨Ô+ðEð EØ.2¬o¸aÔ.@ðEð Eð Eñô ð ð $ dÔ&>Ñ>ˆJà—\’\ *Ñ-Ô-ˆ
àÐr.   )F)r5   r6   r7   r8   r   r!   r9   r:   Úintrc   Úboolr4   r;   r<   s   @r-   r>   r>   F   sÂ   ø€ € € € € ðð ð
;˜{ð 
;ð 
;ð 
;ð 
;ð 
;ð 
;ð%D°5´<ð %DÈð %DÐUXð %DÐ]bÔ]ið %Dð %Dð %Dð %DðNð  E¤Lð ÈDð Ð]bÔ]ið ð ð ð ð ð ð ð r.   r>   ç        ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingrG   Úkwargsc                 óô  — |€|                      d¦  «        dz  }t          j        ||                     dd¦  «        ¦  «        |z  }|�||z   }t          j                             |dt          j        ¬¦  «                             |j	        ¦  «        }t          j         
                    ||| j        ¬¦  «        }t          j        ||¦  «        }	|	                     dd¦  «                             ¦   «         }	|	|fS )NrM   ç      à¿r   r   )rS   Údtype)ÚpÚtrainingr   )rO   r9   Úmatmulr2   r   rY   ÚsoftmaxÚfloat32Útorv   rG   rx   Ú
contiguous)
rm   rn   ro   rp   rq   rr   rG   rs   Úattn_weightsÚattn_outputs
             r-   Úeager_attention_forwardr€   •   sÞ   € ð €Ø—*’*˜R‘.”. DÑ(ˆõ ”<  s§}¢}°Q¸Ñ':Ô':Ñ;Ô;¸gÑE€LàÐ!Ø# nÑ4ˆå”=×(Ò(¨¸2ÅUÄ]Ð(ÑSÔS×VÒVÐW\ÔWbÑcÔc€LÝ”=×(Ò(¨¸È6Ì?Ð(Ñ[Ô[€Lå”,˜|¨UÑ3Ô3€KØ×'Ò'¨¨1Ñ-Ô-×8Ò8Ñ:Ô:€Kà˜Ð$Ð$r.   c                   óŠ   ‡ — e Zd Zdefˆ fd„Z	 d	dej        dej        dz  dee         de	ej        ej        f         fd„Z
ˆ xZS )
ÚVivitAttentionr   c                 ó†  •— t          ¦   «                              ¦   «          || _        |j        | _        t	          |d|j        |j        z  ¦  «        | _        |j        | _        | j        dz  | _	        d| _
        t          j        |j        |j        | j        z  |j        ¬¦  «        | _        t          j        |j        |j        | j        z  |j        ¬¦  «        | _        t          j        |j        |j        | j        z  |j        ¬¦  «        | _        t          j        |j        | j        z  |j        d¬¦  «        | _        d S )NÚhead_dimru   F)ÚbiasT)r    r!   r   Únum_attention_headsÚgetattrr)   r„   Úattention_probs_dropout_probÚattention_dropoutrr   Ú	is_causalr   ÚLinearÚqkv_biasÚq_projÚk_projÚv_projÚo_proj©r+   r   r,   s     €r-   r!   zVivitAttention.__init__²   s  ø€ Ý‰Œ×ÒÑÔÐØˆŒØ#)Ô#=ˆÔ Ý ¨
°FÔ4FÈ&ÔJdÑ4dÑeÔeˆŒØ!'Ô!DˆÔØ”} dÑ*ˆŒØˆŒå”i Ô 2°FÔ4NÐQUÔQ^Ñ4^ÐekÔetÐuÑuÔuˆŒÝ”i Ô 2°FÔ4NÐQUÔQ^Ñ4^ÐekÔetÐuÑuÔuˆŒÝ”i Ô 2°FÔ4NÐQUÔQ^Ñ4^ÐekÔetÐuÑuÔuˆŒÝ”i Ô :¸T¼]Ñ JÈFÔL^ÐeiÐjÑjÔjˆŒˆˆr.   NÚhidden_statesrq   rs   r0   c                 ó¬  — |j         d d…         }g |¢d‘| j        ‘R }|                      |¦  «                             |¦  «                             dd¦  «        }|                      |¦  «                             |¦  «                             dd¦  «        }|                      |¦  «                             |¦  «                             dd¦  «        }t          j        | j	        j
        t          ¦  «        }	 |	| ||||f| j        sdn| j        | j        dœ|¤Ž\  }
} |
j        g |¢d‘R Ž                      ¦   «         }
|                      |
¦  «        }
|
|fS )NrM   r   r   rl   )rG   rr   )rT   r„   r�   r[   r2   rŽ   r�   r   Úget_interfacer   Ú_attn_implementationr€   rx   r‰   rr   rW   r}   r�   )r+   r’   rq   rs   Úinput_shapeÚhidden_shapeÚquery_statesÚ
key_statesÚvalue_statesÚattention_interfacer   r~   s               r-   r4   zVivitAttention.forwardÀ   sw  € ð $Ô)¨#¨2¨#Ô.ˆØ8˜Ð8 bÐ8¨$¬-Ð8Ð8ˆà—{’{ =Ñ1Ô1×6Ò6°|ÑDÔD×NÒNÈqÐRSÑTÔTˆØ—[’[ Ñ/Ô/×4Ò4°\ÑBÔB×LÒLÈQÐPQÑRÔRˆ
Ø—{’{ =Ñ1Ô1×6Ò6°|ÑDÔD×NÒNÈqÐRSÑTÔTˆå(?Ô(MØŒKÔ,Õ.Eñ)
ô )
Ðð %8Ð$7ØØØØØð	%
ð  $œ}ÐH�C�C°$Ô2HØ”Lð	%
ð 	%
ð ð	%
ð 	%
Ñ!ˆ�\ð *�kÔ)Ð;¨;Ð;¸Ð;Ð;Ð;×FÒFÑHÔHˆØ—k’k +Ñ.Ô.ˆà˜LÐ(Ð(r.   ©N)r5   r6   r7   r   r!   r9   r:   r   r   Útupler4   r;   r<   s   @r-   r‚   r‚   ±   s¬   ø€ € € € € ðk˜{ð kð kð kð kð kð kð" /3ð)ð )à”|ð)ð œ tÑ+ð)ð Ð+Ô,ð	)ð
 
ˆuŒ|˜Uœ\Ð)Ô	*ð)ð )ð )ð )ð )ð )ð )ð )r.   r‚   c                   óH   ‡ — e Zd Zdefˆ fd„Zdej        dej        fd„Zˆ xZS )ÚVivitMLPr   c                 ó  •— t          ¦   «                              ¦   «          || _        t          |j                 | _        t          j        |j        |j	        ¦  «        | _
        t          j        |j	        |j        ¦  «        | _        d S rœ   )r    r!   r   r   Ú
hidden_actÚactivation_fnr   r‹   r)   Úintermediate_sizeÚfc1Úfc2r‘   s     €r-   r!   zVivitMLP.__init__ã   sf   ø€ Ý‰Œ×ÒÑÔÐØˆŒÝ# FÔ$5Ô6ˆÔÝ”9˜VÔ/°Ô1IÑJÔJˆŒÝ”9˜VÔ5°vÔ7IÑJÔJˆŒˆˆr.   r’   r0   c                 ó„   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|S rœ   )r¤   r¢   r¥   )r+   r’   s     r-   r4   zVivitMLP.forwardê   s=   € ØŸš Ñ/Ô/ˆØ×*Ò*¨=Ñ9Ô9ˆØŸš Ñ/Ô/ˆàÐr.   ©	r5   r6   r7   r   r!   r9   r:   r4   r;   r<   s   @r-   rŸ   rŸ   â   sq   ø€ € € € € ðK˜{ð Kð Kð Kð Kð Kð Kð U¤\ð °e´lð ð ð ð ð ð ð ð r.   rŸ   c            	       óp   ‡ — e Zd Zdefˆ fd„Z	 d	dej        dej        dz  dee         dej        fd„Z	ˆ xZ
S )
Ú
VivitLayerr   c                 óh  •— t          ¦   «                              ¦   «          t          |¦  «        | _        t	          j        |j        |j        ¬¦  «        | _        t	          j        |j        |j        ¬¦  «        | _	        t          |¦  «        | _        t	          j        |j        ¦  «        | _        d S )N©Úeps)r    r!   r‚   Ú	attentionr   Ú	LayerNormr)   Úlayer_norm_epsÚlayernorm_beforeÚlayernorm_afterrŸ   ÚmlprE   rF   rG   r‘   s     €r-   r!   zVivitLayer.__init__ó   s‰   ø€ Ý‰Œ×ÒÑÔÐÝ'¨Ñ/Ô/ˆŒÝ "¤¨VÔ-?ÀVÔEZÐ [Ñ [Ô [ˆÔÝ!œ|¨FÔ,>ÀFÔDYÐZÑZÔZˆÔÝ˜FÑ#Ô#ˆŒÝ”z &Ô"<Ñ=Ô=ˆŒˆˆr.   Nr’   rq   rs   r0   c                 ó  — |}|                       |¦  «        } | j        ||fi |¤Ž\  }}|                      |¦  «        }||z   }|}|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }||z   }|S rœ   )r°   r­   rG   r±   r²   )r+   r’   rq   rs   ÚresidualÚ_s         r-   r4   zVivitLayer.forwardû   s£   € ð !ˆØ×-Ò-¨mÑ<Ô<ˆØ)˜4œ>¨-¸ÐRÐRÈ6ÐRÐRÑˆ�qØŸš ]Ñ3Ô3ˆØ%¨Ñ0ˆð !ˆØ×,Ò,¨]Ñ;Ô;ˆØŸš Ñ/Ô/ˆØŸš ]Ñ3Ô3ˆØ%¨Ñ0ˆàÐr.   rœ   )r5   r6   r7   r   r!   r9   r:   r   r   r4   r;   r<   s   @r-   r©   r©   ò   s™   ø€ € € € € ð>˜{ð >ð >ð >ð >ð >ð >ð /3ðð à”|ðð œ tÑ+ðð Ð+Ô,ð	ð
 
Œðð ð ð ð ð ð ð r.   r©   c                   óH   ‡ — e Zd Zdefˆ fd„Zdej        dej        fd„Zˆ xZS )ÚVivitPoolerr   c                 ó¾   •— t          ¦   «                              ¦   «          t          j        |j        |j        ¦  «        | _        t          |j                 | _	        d S rœ   )
r    r!   r   r‹   r)   Úpooler_output_sizeÚdenser   Ú
pooler_actÚ
activationr‘   s     €r-   r!   zVivitPooler.__init__  sE   ø€ Ý‰Œ×ÒÑÔÐÝ”Y˜vÔ1°6Ô3LÑMÔMˆŒ
Ý  Ô!2Ô3ˆŒˆˆr.   r’   r0   c                 ór   — |d d …df         }|                       |¦  «        }|                      |¦  «        }|S )Nr   )rº   r¼   )r+   r’   Úfirst_token_tensorÚpooled_outputs       r-   r4   zVivitPooler.forward  s@   € ð +¨1¨1¨1¨a¨4Ô0ÐØŸ
š
Ð#5Ñ6Ô6ˆØŸš¨Ñ6Ô6ˆØÐr.   r§   r<   s   @r-   r·   r·     sj   ø€ € € € € ð4˜{ð 4ð 4ð 4ð 4ð 4ð 4ð
 U¤\ð °e´lð ð ð ð ð ð ð ð r.   r·   c                   óŽ   ‡ — e Zd ZU eed<   dZdZdZdZddgZ	dZ
dZdZdZdZeedœZd	Z ej        ¦   «         ˆ fd
„¦   «         Zˆ xZS )ÚVivitPreTrainedModelr   Úvivitr/   )ÚvideoTr>   r©   )r’   Ú
attentionsrC   c                 óÜ   •— t          ¦   «                              |¦  «         t          |t          ¦  «        r4t	          j        |j        ¦  «         t	          j        |j        ¦  «         dS dS )zInitialize the weightsN)r    Ú_init_weightsr$   r>   ÚinitÚzeros_rB   rD   )r+   rm   r,   s     €r-   rÆ   z"VivitPreTrainedModel._init_weights4  se   ø€ õ 	‰Œ×Ò˜fÑ%Ô%Ð%Ý�f�oÑ.Ô.ð 	4ÝŒK˜Ô(Ñ)Ô)Ð)ÝŒK˜Ô2Ñ3Ô3Ð3Ð3Ð3ð	4ð 	4r.   )r5   r6   r7   r   Ú__annotations__Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_supports_sdpaÚ_supports_flash_attnÚ_supports_flex_attnÚ_supports_attention_backendÚ_can_compile_fullgraphr©   r‚   Ú_can_record_outputsÚ_input_embed_layerr9   Úno_gradrÆ   r;   r<   s   @r-   rÁ   rÁ   !  s²   ø€ € € € € € àÐÐÑØÐØ$€OØ!ÐØ&*Ð#Ø*¨LÐ9ÐØ€NØÐØÐØ"&ÐØ!Ðà#Ø$ðð Ðð ,Ðà€U„]�_„_ð4ð 4ð 4ð 4ñ „_ð4ð 4ð 4ð 4ð 4r.   rÁ   c                   ó¾   ‡ — e Zd Zddedefˆ fd„Ze ed¬¦  «        e	 	 	 dde	j
        dz  d	ed
e	j        dz  dee         def
d„¦   «         ¦   «         ¦   «         Zˆ xZS )Ú
VivitModelTr   Úadd_pooling_layerc                 ó’  •‡— t          ¦   «                              ‰¦  «         ‰| _        t          ‰¦  «        | _        t          j        ˆfd„t          ‰j        ¦  «        D ¦   «         ¦  «        | _	        t          j
        ‰j        ‰j        ¬¦  «        | _        |rt          ‰¦  «        nd| _        |                      ¦   «          dS )zv
        add_pooling_layer (bool, *optional*, defaults to `True`):
            Whether to add a pooling layer
        c                 ó.   •— g | ]}t          ‰¦  «        ‘ŒS © )r©   )Ú.0rµ   r   s     €r-   ú
<listcomp>z'VivitModel.__init__.<locals>.<listcomp>G  s!   ø€ Ð$aÐ$aÐ$a¸A¥Z°Ñ%7Ô%7Ð$aÐ$aÐ$ar.   r«   N)r    r!   r   r>   rI   r   Ú
ModuleListÚrangeÚnum_hidden_layersÚlayersr®   r)   r¯   Ú	layernormr·   ÚpoolerÚ	post_init)r+   r   rÙ   r,   s    ` €r-   r!   zVivitModel.__init__?  s°   øø€ õ
 	‰Œ×Ò˜Ñ Ô Ð ØˆŒÝ)¨&Ñ1Ô1ˆŒÝ”mÐ$aÐ$aÐ$aÐ$aÅÀvÔG_ÑA`ÔA`Ð$aÑ$aÔ$aÑbÔbˆŒÝœ fÔ&8¸fÔ>SÐTÑTÔTˆŒØ->ÐH•k &Ñ)Ô)Ð)ÀDˆŒà�ŠÑÔÐÐÐr.   F)Útie_last_hidden_statesNr/   rc   rq   rs   r0   c                 ó  — |                       ||¬¦  «        }t          | j        ||¬¦  «        }|}| j        D ]} |||fi |¤Ž}Œ|                      |¦  «        }| j        �|                      |¦  «        nd}	t          ||	¬¦  «        S )a  
        Examples:

        ```python
        >>> import av
        >>> import numpy as np

        >>> from transformers import VivitImageProcessor, VivitModel
        >>> from huggingface_hub import hf_hub_download

        >>> np.random.seed(0)


        >>> def read_video_pyav(container, indices):
        ...     '''
        ...     Decode the video with PyAV decoder.
        ...     Args:
        ...         container (`av.container.input.InputContainer`): PyAV container.
        ...         indices (`list[int]`): List of frame indices to decode.
        ...     Returns:
        ...         result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3).
        ...     '''
        ...     frames = []
        ...     container.seek(0)
        ...     start_index = indices[0]
        ...     end_index = indices[-1]
        ...     for i, frame in enumerate(container.decode(video=0)):
        ...         if i > end_index:
        ...             break
        ...         if i >= start_index and i in indices:
        ...             frames.append(frame)
        ...     return np.stack([x.to_ndarray(format="rgb24") for x in frames])


        >>> def sample_frame_indices(clip_len, frame_sample_rate, seg_len):
        ...     '''
        ...     Sample a given number of frame indices from the video.
        ...     Args:
        ...         clip_len (`int`): Total number of frames to sample.
        ...         frame_sample_rate (`int`): Sample every n-th frame.
        ...         seg_len (`int`): Maximum allowed index of sample's last frame.
        ...     Returns:
        ...         indices (`list[int]`): List of sampled frame indices
        ...     '''
        ...     converted_len = int(clip_len * frame_sample_rate)
        ...     end_idx = np.random.randint(converted_len, seg_len)
        ...     start_idx = end_idx - converted_len
        ...     indices = np.linspace(start_idx, end_idx, num=clip_len)
        ...     indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64)
        ...     return indices


        >>> # video clip consists of 300 frames (10 seconds at 30 FPS)
        >>> file_path = hf_hub_download(
        ...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
        ... )
        >>> container = av.open(file_path)

        >>> # sample 32 frames
        >>> indices = sample_frame_indices(clip_len=32, frame_sample_rate=1, seg_len=container.streams.video[0].frames)
        >>> video = read_video_pyav(container=container, indices=indices)

        >>> image_processor = VivitImageProcessor.from_pretrained("google/vivit-b-16x2-kinetics400")
        >>> model = VivitModel.from_pretrained("google/vivit-b-16x2-kinetics400")

        >>> # prepare video for the model
        >>> inputs = image_processor(list(video), return_tensors="pt")

        >>> # forward pass
        >>> outputs = model(**inputs)
        >>> last_hidden_states = outputs.last_hidden_state
        >>> list(last_hidden_states.shape)
        [1, 3137, 768]
        ```)rc   )r   Úinputs_embedsrq   N)Úlast_hidden_stateÚpooler_output)rI   r	   r   râ   rã   rä   r   )
r+   r/   rc   rq   rs   Úembedding_outputr’   ÚlayerÚsequence_outputr¿   s
             r-   r4   zVivitModel.forwardM  s³   € ðj  Ÿ?š?¨<ÐRj˜?ÑkÔkÐÝ2Ø”;Ø*Ø)ð
ñ 
ô 
ˆð
 )ˆØ”[ð 	Kð 	KˆEØ!˜E -°ÐJÐJÀ6ÐJÐJˆMˆMØŸ.š.¨Ñ7Ô7ˆØ8<¼Ð8O˜Ÿš OÑ4Ô4Ð4ÐUYˆå)¸OÐ[hÐiÑiÔiÐir.   )T)NFN)r5   r6   r7   r   rk   r!   r   r   r   r9   ÚFloatTensorr:   r   r   r   r4   r;   r<   s   @r-   rØ   rØ   =  s  ø€ € € € € ðð ˜{ð ¸tð ð ð ð ð ð ð  Ø€_¨EÐ2Ñ2Ô2Øð 26Ø).Ø.2ð	^jð ^jàÔ'¨$Ñ.ð^jð #'ð^jð œ tÑ+ð	^jð
 Ð+Ô,ð^jð 
$ð^jð ^jð ^jñ „^ñ 3Ô2ñ  Ôð^jð ^jð ^jð ^jð ^jr.   rØ   aý  
        ViViT Transformer model with a video classification head on top (a linear layer on top of the final hidden state of the
    [CLS] token) e.g. for Kinetics-400.

        <Tip>

            Note that it's possible to fine-tune ViT on higher resolution images than the ones it has been trained on, by
            setting `interpolate_pos_encoding` to `True` in the forward of the model. This will interpolate the pre-trained
            position embeddings to the higher resolution.

        </Tip>
    )Úcustom_introc                   ó”   ‡ — e Zd Zdefˆ fd„Zee	 	 	 ddej        dz  dej	        dz  de
dee         d	ef
d
„¦   «         ¦   «         Zˆ xZS )ÚVivitForVideoClassificationr   c                 ó:  •— t          ¦   «                              |¦  «         |j        | _        t          |d¬¦  «        | _        |j        dk    rt          j        |j        |j        ¦  «        nt          j        ¦   «         | _	        |  
                    ¦   «          d S )NF)rÙ   r   )r    r!   Ú
num_labelsrØ   rÂ   r   r‹   r)   ÚIdentityÚ
classifierrå   r‘   s     €r-   r!   z$VivitForVideoClassification.__init__À  s‹   ø€ Ý‰Œ×Ò˜Ñ Ô Ð à Ô+ˆŒÝ ¸%Ð@Ñ@Ô@ˆŒ
ð OUÔN_ÐbcÒNcÐNc�"œ) FÔ$6¸Ô8IÑJÔJÐJÕikÔitÑivÔivˆŒð 	�ŠÑÔÐÐÐr.   NFr/   Úlabelsrc   rs   r0   c                 óà   —  | j         |fd|i|¤Ž}|j        }|                      |dd…ddd…f         ¦  «        }d}|� | j        ||| j        fi |¤Ž}t          |||j        |j        ¬¦  «        S )a  
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the image classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).

        Examples:

        ```python
        >>> import av
        >>> import numpy as np
        >>> import torch

        >>> from transformers import VivitImageProcessor, VivitForVideoClassification
        >>> from huggingface_hub import hf_hub_download

        >>> np.random.seed(0)


        >>> def read_video_pyav(container, indices):
        ...     '''
        ...     Decode the video with PyAV decoder.
        ...     Args:
        ...         container (`av.container.input.InputContainer`): PyAV container.
        ...         indices (`list[int]`): List of frame indices to decode.
        ...     Returns:
        ...         result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3).
        ...     '''
        ...     frames = []
        ...     container.seek(0)
        ...     start_index = indices[0]
        ...     end_index = indices[-1]
        ...     for i, frame in enumerate(container.decode(video=0)):
        ...         if i > end_index:
        ...             break
        ...         if i >= start_index and i in indices:
        ...             frames.append(frame)
        ...     return np.stack([x.to_ndarray(format="rgb24") for x in frames])


        >>> def sample_frame_indices(clip_len, frame_sample_rate, seg_len):
        ...     '''
        ...     Sample a given number of frame indices from the video.
        ...     Args:
        ...         clip_len (`int`): Total number of frames to sample.
        ...         frame_sample_rate (`int`): Sample every n-th frame.
        ...         seg_len (`int`): Maximum allowed index of sample's last frame.
        ...     Returns:
        ...         indices (`list[int]`): List of sampled frame indices
        ...     '''
        ...     converted_len = int(clip_len * frame_sample_rate)
        ...     end_idx = np.random.randint(converted_len, seg_len)
        ...     start_idx = end_idx - converted_len
        ...     indices = np.linspace(start_idx, end_idx, num=clip_len)
        ...     indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64)
        ...     return indices


        >>> # video clip consists of 300 frames (10 seconds at 30 FPS)
        >>> file_path = hf_hub_download(
        ...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
        ... )
        >>> container = av.open(file_path)

        >>> # sample 32 frames
        >>> indices = sample_frame_indices(clip_len=32, frame_sample_rate=4, seg_len=container.streams.video[0].frames)
        >>> video = read_video_pyav(container=container, indices=indices)

        >>> image_processor = VivitImageProcessor.from_pretrained("google/vivit-b-16x2-kinetics400")
        >>> model = VivitForVideoClassification.from_pretrained("google/vivit-b-16x2-kinetics400")

        >>> inputs = image_processor(list(video), return_tensors="pt")

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

        >>> # model predicts one of the 400 Kinetics-400 classes
        >>> predicted_label = logits.argmax(-1).item()
        >>> print(model.config.id2label[predicted_label])
        LABEL_116
        ```rc   Nr   )ÚlossÚlogitsr’   rÄ   )rÂ   ré   rõ   Úloss_functionr   r   r’   rÄ   )	r+   r/   rö   rc   rs   Úoutputsrí   rù   rø   s	            r-   r4   z#VivitForVideoClassification.forwardÌ  s²   € ðx $. 4¤:Øð$
ð $
Ø3Kð$
ØOUð$
ð $
ˆð "Ô3ˆØ—’ °°°°A°q°q°q°Ô!9Ñ:Ô:ˆàˆØÐØ%�4Ô% f¨f°d´kÐLÐLÀVÐLÐLˆDå$ØØØ!Ô/ØÔ)ð	
ñ 
ô 
ð 	
r.   )NNF)r5   r6   r7   r   r!   r   r   r9   rî   Ú
LongTensorrk   r   r   r   r4   r;   r<   s   @r-   rñ   rñ   ±  sÓ   ø€ € € € € ð
˜{ð 
ð 
ð 
ð 
ð 
ð 
ð Øð 26Ø*.Ø).ð	i
ð i
àÔ'¨$Ñ.ði
ð Ô  4Ñ'ði
ð #'ð	i
ð
 Ð+Ô,ði
ð 
ði
ð i
ð i
ñ „^ñ Ôði
ð i
ð i
ð i
ð i
r.   rñ   )rØ   rÁ   rñ   )Nrl   )0Úcollections.abcr   r   r9   r   Ú r   rÇ   Úactivationsr   Úmasking_utilsr	   Úmodeling_layersr
   Úmodeling_outputsr   r   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   Úutils.genericr   r   Úutils.output_capturingr   Úconfiguration_vivitr   ÚModuler   r>   r:   Úfloatr€   r‚   rŸ   r©   r·   rÁ   rØ   rñ   Ú__all__rÜ   r.   r-   ú<module>r     s­  ðð* /Ð .Ð .Ð .Ð .Ð .Ð .Ð .à €€€Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &Ø !Ð !Ð !Ð !Ð !Ð !Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bØ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ &Ð &Ð &Ð &Ð &Ð &Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,ðHð Hð Hð Hð H˜RœYñ Hô Hð Hð>Lð Lð Lð Lð L�b”iñ Lô Lð Lðj !Øð%ð %ØŒIð%àŒ<ð%ð 
Œð%ð Œ<ð	%ð
 ”L 4Ñ'ð%ð �T‰\ð%ð ð%ð Ð'Ô(ð%ð %ð %ð %ð8.)ð .)ð .)ð .)ð .)�R”Yñ .)ô .)ð .)ðbð ð ð ð ˆrŒyñ ô ð ð ð ð ð ð Ð+ñ ô ð ð@ð ð ð ð �"”)ñ ô ð ð ð4ð 4ð 4ð 4ð 4˜?ñ 4ô 4ñ „ð4ð6 ðpjð pjð pjð pjð pjÐ%ñ pjô pjñ „ðpjðf €ððñ ô ðx
ð x
ð x
ð x
ð x
Ð"6ñ x
ô x
ñô ðx
ðv PÐ
OÐ
O€€€r.   