Ë
    ÜÓ^jBx  ã                   ób  — d Z ddlZddlmZ ddlmZ ddlmZ ddlZ	ddl
Z
ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZmZmZ ddlm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z& ddl'm(Z(  ejR                  e*«      Z+ ed¬«      e G d„ de«      «       «       Z, ed¬«      e G d„ de«      «       «       Z-d„ Z. G d„ dej^                  «      Z0 G d„ dej^                  «      Z1	 	 dDd ej^                  d!e
jd                  d"e
jd                  d#e
jd                  d$e
jd                  dz  d%e3dz  d&e3d'ee   fd(„Z4 G d)„ d*ej^                  «      Z5 G d+„ d,ej^                  «      Z6 G d-„ d.ej^                  «      Z7 G d/„ d0ej^                  «      Z8 G d1„ d2ej^                  «      Z9 G d3„ d4e«      Z: G d5„ d6ej^                  «      Z;e G d7„ d8e«      «       Z<e G d9„ d:e<«      «       Z= G d;„ d<ej^                  «      Z> ed=¬«       G d>„ d?e<«      «       Z? ed@¬«       G dA„ dBe<«      «       Z@g dC¢ZAy)Ez,PyTorch VideoMAE (masked autoencoder) model.é    N)ÚCallable)Údeepcopy)Ú	dataclass)Únn)ÚMSELossé   )ÚACT2FN)ÚGradientCheckpointingLayer)ÚBaseModelOutputÚImageClassifierOutput)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚlogging)ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Úcan_return_tupleÚmerge_with_config_defaults)Úcapture_outputsé   )ÚVideoMAEConfigz[
    Class for VideoMAEDecoder's outputs, with potential hidden states and attentions.
    )Úcustom_introc                   ó–   — e Zd ZU dZdZej                  dz  ed<   dZe	ej                     dz  ed<   dZ
e	ej                     dz  ed<   y)ÚVideoMAEDecoderOutputz„
    logits (`torch.FloatTensor` of shape `(batch_size, patch_size ** 2 * num_channels)`):
        Pixel reconstruction logits.
    NÚlogitsÚhidden_statesÚ
attentions)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__r   Útupler    © ó    úy/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/videomae/modeling_videomae.pyr   r   )   sR   … ñð
 (,€FˆE×Ñ Ñ$Ó+Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ô6r*   r   zb
    Class for VideoMAEForPreTraining's outputs, with potential hidden states and attentions.
    c                   ó¾   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
ej                     dz  ed<   dZe
ej                     dz  ed<   y)ÚVideoMAEForPreTrainingOutputz×
    loss (`torch.FloatTensor` of shape `(1,)`):
        Pixel reconstruction loss.
    logits (`torch.FloatTensor` of shape `(batch_size, patch_size ** 2 * num_channels)`):
        Pixel reconstruction logits.
    NÚlossr   r   r    )r!   r"   r#   r$   r.   r%   r&   r'   r   r   r(   r    r)   r*   r+   r-   r-   :   sg   … ñð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ô6r*   r-   c                 óh  ‡— ˆfd„}t        j                  t        | «      D �cg c]
  } ||«      ‘Œ c}«      }t        j                  |dd…ddd…f   «      |dd…ddd…f<   t        j                  |dd…ddd…f   «      |dd…ddd…f<   t        j                  |«      j                  d«      S c c}w )z Sinusoid position encoding tablec           
      ó€   •— t        ‰«      D �cg c]$  }| t        j                  dd|dz  z  ‰z  «      z  ‘Œ& c}S c c}w )Ni'  é   )ÚrangeÚnpÚpower)ÚpositionÚhid_jÚd_hids     €r+   Úget_position_angle_vecz;get_sinusoid_encoding_table.<locals>.get_position_angle_vecT   s;   ø€ ÜRWÐX]ÓR^Ö_È�œ2Ÿ8™8 E¨1°¸±
Ñ+;¸eÑ+CÓDÓDÒ_Ð_ùÒ_s   �);Nr   r1   r   )r3   Úarrayr2   ÚsinÚcosr%   r&   Ú	unsqueeze)Ú
n_positionr7   r8   Úpos_iÚsinusoid_tables    `   r+   Úget_sinusoid_encoding_tabler@   P   sª   ø€ ô`ô —X‘XÌ%ÐPZÓJ[Ö\ÀÑ5°eÕ<Ò\Ó]€NÜ Ÿf™f ^²A°q°t¸!°t°GÑ%<Ó=€N’1�a�d˜�d�7ÑÜ Ÿf™f ^²A°q°t¸!°t°GÑ%<Ó=€N’1�a�d˜�d�7Ñä×Ñ˜^Ó,×6Ñ6°qÓ9Ð9ùò	 ]s   £B/c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚVideoMAEEmbeddingsz7
    Construct the patch and position embeddings.

    c                 óÐ   •— t         ‰| �  «        t        |«      | _        | j                  j                  | _        t        | j                  |j                  «      | _        || _        y ©N)	ÚsuperÚ__init__ÚVideoMAEPatchEmbeddingsÚpatch_embeddingsÚnum_patchesr@   Úhidden_sizeÚposition_embeddingsÚconfig©ÚselfrL   Ú	__class__s     €r+   rF   zVideoMAEEmbeddings.__init__d   sR   ø€ Ü‰ÑÔä 7¸Ó ?ˆÔØ×0Ñ0×<Ñ<ˆÔä#>¸t×?OÑ?OÐQW×QcÑQcÓ#dˆÔ Øˆ�r*   c                 ó  — | j                  |«      }|| j                  j                  «       j                  |«      j	                  |j
                  d¬«      z   }|�)|j                  \  }}}||    }|j                  |d|«      }|S )NT©ÚdeviceÚcopyéÿÿÿÿ)rH   rK   ÚdetachÚtype_asÚtorR   ÚshapeÚreshape)rN   Úpixel_valuesÚbool_masked_posÚ
embeddingsÚ
batch_sizeÚ_Únum_channelss          r+   ÚforwardzVideoMAEEmbeddings.forwardm   s—   € à×*Ñ*¨<Ó8ˆ
ð   $×":Ñ":×"AÑ"AÓ"C×"KÑ"KÈJÓ"W×"ZÑ"ZØ×$Ñ$¨4ð #[ó #
ñ 
ˆ
ð
 Ð&Ø*4×*:Ñ*:Ñ'ˆJ˜˜<Ø# _Ð$4Ñ5ˆJØ#×+Ñ+¨J¸¸LÓIˆJàÐr*   ©r!   r"   r#   r$   rF   r`   Ú__classcell__©rO   s   @r+   rB   rB   ^   s   ø„ ñô
ör*   rB   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )rG   aw  
    Video to Patch Embedding. This module turns a batch of videos of shape (batch_size, num_frames, num_channels,
    height, width) into a tensor of shape (batch_size, seq_len, hidden_size) to be consumed by a Transformer encoder.

    The seq_len (the number of patches) equals (number of frames // tubelet_size) * (height // patch_size) * (width //
    patch_size).

    c           	      óˆ  •— t         ‰	| �  «        |j                  }|j                  }|j                  }|j
                  }|j                  }|j                  }t        |t        j                  j                  «      r|n||f}t        |t        j                  j                  «      r|n||f}|| _        || _        t        |«      | _        |d   |d   z  |d   |d   z  z  || j                  z  z  }|| _        || _        t        j                  ||| j                  |d   |d   f| j                  |d   |d   f¬«      | _        y )Nr   r   )Úin_channelsÚout_channelsÚkernel_sizeÚstride)rE   rF   Ú
image_sizeÚ
patch_sizer_   rJ   Ú
num_framesÚtubelet_sizeÚ
isinstanceÚcollectionsÚabcÚIterableÚintrI   r   ÚConv3dÚ
projection)
rN   rL   rj   rk   r_   rJ   rl   rm   rI   rO   s
            €r+   rF   z VideoMAEPatchEmbeddings.__init__‰   s>  ø€ Ü‰ÑÔà×&Ñ&ˆ
Ø×&Ñ&ˆ
Ø×*Ñ*ˆØ×(Ñ(ˆØ×&Ñ&ˆ
Ø×*Ñ*ˆä#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ü#-¨j¼+¿/¹/×:RÑ:RÔ#S‘ZÐZdÐfpÐYqˆ
Ø$ˆŒØ$ˆŒÜ Ó-ˆÔà˜‰]˜j¨™mÑ+°
¸1±ÀÈAÁÑ0NÑOÐS]Ðae×arÑarÑSrÑsð 	ð )ˆÔØ&ˆÔÜŸ)™)Ø$Ø$Ø×*Ñ*¨J°q©M¸:Àa¹=ÐIØ×%Ñ% z°!¡}°jÀ±mÐDô	
ˆ�r*   c                 ó”  — |j                   \  }}}}}|| j                  k7  rt        d«      ‚|| j                  d   k7  s|| j                  d   k7  r2t        d|› d|› d| j                  d   › d| j                  d   › d�	«      ‚|j	                  dddd	d
«      }| j                  |«      j                  d«      j                  dd«      }|S )NzeMake sure that the channel dimension of the pixel values match with the one set in the configuration.r   r   zInput image size (Ú*z) doesn't match model (z).r1   r   é   )rX   r_   Ú
ValueErrorrj   Úpermutert   ÚflattenÚ	transpose)rN   rZ   r]   rl   r_   ÚheightÚwidthr\   s           r+   r`   zVideoMAEPatchEmbeddings.forward¤   sæ   € Ø>J×>PÑ>PÑ;ˆ
�J ¨f°eØ˜4×,Ñ,Ò,ÜØwóð ð �T—_‘_ QÑ'Ò'¨5°D·O±OÀAÑ4FÒ+FÜØ$ V H¨A¨e¨WÐ4KÈDÏOÉOÐ\]ÑL^ÐK_Ð_`Ðae×apÑapÐqrÑasÐ`tÐtvÐwóð ð $×+Ñ+¨A¨q°!°Q¸Ó:ˆØ—_‘_ \Ó2×:Ñ:¸1Ó=×GÑGÈÈ1ÓMˆ
ØÐr*   ra   rc   s   @r+   rG   rG      s   ø„ ñô
ö6r*   rG   ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingÚdropoutÚkwargsc                 óœ  — |€|j                  d«      dz  }t        j                  ||j                  dd«      «      |z  }|�||z   }t        j
                  j                  |d¬«      }t        j
                  j                  ||| j                  ¬«      }t        j                  ||«      }	|	j                  dd«      j                  «       }	|	|fS )NrT   ç      à¿r1   r   ©Údim)ÚpÚtrainingr   )
Úsizer%   Úmatmulr{   r   Ú
functionalÚsoftmaxr„   r‹   Ú
contiguous)
r~   r   r€   r�   r‚   rƒ   r„   r…   Úattn_weightsÚattn_outputs
             r+   Úeager_attention_forwardr“   µ   s»   € ð €Ø—*‘*˜R“. DÑ(ˆô —<‘<  s§}¡}°Q¸Ó':Ó;¸gÑE€LàÐ!Ø# nÑ4ˆä—=‘=×(Ñ(¨¸2Ð(Ó>€LÜ—=‘=×(Ñ(¨¸È6Ï?É?Ð(Ó[€Lä—,‘,˜|¨UÓ3€KØ×'Ñ'¨¨1Ó-×8Ñ8Ó:€Kà˜Ð$Ð$r*   c                   óˆ   ‡ — e Zd Zdeddfˆ fd„Z	 ddej                  dz  deej                  ej                  f   fd„Zˆ xZ	S )ÚVideoMAESelfAttentionrL   ÚreturnNc                 ó2  •— t         ‰| �  «        |j                  |j                  z  dk7  r2t	        |d«      s&t        d|j                  › d|j                  › d�«      ‚|| _        |j                  | _        t        |j                  |j                  z  «      | _        | j                  | j                  z  | _	        |j                  | _        | j                  dz  | _        d| _        t        j                  |j                  | j                  |j                   ¬«      | _        t        j                  |j                  | j                  |j                   ¬«      | _        t        j                  |j                  | j                  |j                   ¬«      | _        y )	Nr   Úembedding_sizezThe hidden size z4 is not a multiple of the number of attention heads ú.r‡   F©Úbias)rE   rF   rJ   Únum_attention_headsÚhasattrrx   rL   rr   Úattention_head_sizeÚall_head_sizeÚattention_probs_dropout_probÚdropout_probrƒ   Ú	is_causalr   ÚLinearÚqkv_biasr   r€   r�   rM   s     €r+   rF   zVideoMAESelfAttention.__init__Ò   sF  ø€ Ü‰ÑÔØ×Ñ × :Ñ :Ñ:¸aÒ?ÌÐPVÐXhÔHiÜØ" 6×#5Ñ#5Ð"6ð 7Ø×3Ñ3Ð4°Að7óð ð ˆŒØ#)×#=Ñ#=ˆÔ Ü#& v×'9Ñ'9¸F×<VÑ<VÑ'VÓ#WˆÔ Ø!×5Ñ5¸×8PÑ8PÑPˆÔØ"×?Ñ?ˆÔØ×/Ñ/°Ñ5ˆŒØˆŒä—Y‘Y˜v×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆŒ
Ü—9‘9˜V×/Ñ/°×1CÑ1CÈ&Ï/É/ÔZˆŒÜ—Y‘Y˜v×1Ñ1°4×3EÑ3EÈFÏOÉOÔ\ˆ�
r*   r   c           
      ó¬  — |j                   d d }g |¢d‘| j                  ‘­}| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }| j                  |«      j                  |«      j	                  dd«      }t        j                  | j                  j                  t        «      } || |||d | j                  | j                  | j                  sdn| j                  ¬«      \  }}	|j!                  «       d d | j"                  fz   }
|j%                  |
«      }||	fS )NrT   r   r1   ç        )r¢   rƒ   r„   éþÿÿÿ)rX   rž   r€   Úviewr{   r�   r   r   Úget_interfacerL   Ú_attn_implementationr“   r¢   rƒ   r‹   r¡   rŒ   rŸ   rY   )rN   r   Úinput_shapeÚhidden_shapeÚkeysÚvaluesÚqueriesÚattention_interfaceÚcontext_layerÚattention_probsÚnew_context_layer_shapes              r+   r`   zVideoMAESelfAttention.forwardå   sD  € ð $×)Ñ)¨#¨2Ð.ˆàC˜ÐC bÐC¨$×*BÑ*BÑCˆØ�x‰x˜Ó&×+Ñ+¨LÓ9×CÑCÀAÀqÓIˆØ—‘˜MÓ*×/Ñ/°Ó=×GÑGÈÈ1ÓMˆØ—*‘*˜]Ó+×0Ñ0°Ó>×HÑHÈÈAÓNˆä(?×(MÑ(MØ�K‰K×,Ñ,Ô.Eó)
Ðñ *=ØØØØØØ—n‘nØ—L‘LØ#Ÿ}š}‘C°$×2CÑ2Cô	*
Ñ&ˆ�ð #0×"4Ñ"4Ó"6°s¸Ð";¸t×?QÑ?QÐ>SÑ"SÐØ%×-Ñ-Ð.EÓFˆà˜oÐ-Ð-r*   rD   )
r!   r"   r#   r   rF   r%   ÚTensorr(   r`   rb   rc   s   @r+   r•   r•   Ñ   sN   ø„ ð]˜~ð ]°$õ ]ð( 48ñ.Ø"Ÿ\™\¨DÑ0ð.à	ˆu�|‰|˜UŸ\™\Ð)Ñ	*÷.r*   r•   c                   óx   ‡ — e Zd ZdZdefˆ fd„Zdej                  dej                  dej                  fd„Zˆ xZ	S )ÚVideoMAESelfOutputz¥
    The residual connection is defined in VideoMAELayer instead of here (as is the case with other models), due to the
    layernorm applied before each block.
    rL   c                 óÈ   •— t         ‰| �  «        t        j                  |j                  |j                  «      | _        t        j                  |j                  «      | _        y rD   )	rE   rF   r   r£   rJ   ÚdenseÚDropoutÚhidden_dropout_probr„   rM   s     €r+   rF   zVideoMAESelfOutput.__init__  sB   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3EÑ3EÓFˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r*   r   Úinput_tensorr–   c                 óJ   — | j                  |«      }| j                  |«      }|S rD   ©r¸   r„   ©rN   r   r»   s      r+   r`   zVideoMAESelfOutput.forward  s$   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØÐr*   )
r!   r"   r#   r$   r   rF   r%   r´   r`   rb   rc   s   @r+   r¶   r¶     s=   ø„ ñð
>˜~õ >ð
 U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r*   r¶   c                   óf   ‡ — e Zd Zdefˆ fd„Zdej                  dee   dej                  fd„Z	ˆ xZ
S )ÚVideoMAEAttentionrL   c                 ób   •— t         ‰| �  «        t        |«      | _        t	        |«      | _        y rD   )rE   rF   r•   Ú	attentionr¶   ÚoutputrM   s     €r+   rF   zVideoMAEAttention.__init__  s&   ø€ Ü‰ÑÔÜ.¨vÓ6ˆŒÜ(¨Ó0ˆ�r*   r   r…   r–   c                 óV   —  | j                   |fi |¤Ž\  }}| j                  ||«      }|S rD   )rÂ   rÃ   )rN   r   r…   Úself_attn_outputr^   rÃ   s         r+   r`   zVideoMAEAttention.forward  s5   € ð
 -˜dŸn™n¨]ÑE¸fÑEÑÐ˜!Ø—‘Ð-¨}Ó=ˆØˆr*   )r!   r"   r#   r   rF   r%   r´   r   r   r`   rb   rc   s   @r+   rÀ   rÀ     s>   ø„ ð1˜~õ 1ð
à—|‘|ðð Ð+Ñ,ðð 
�‰÷	r*   rÀ   c                   ó\   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚVideoMAEIntermediaterL   c                 ó  •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        |j                  t        «      rt        |j                     | _        y |j                  | _        y rD   )rE   rF   r   r£   rJ   Úintermediate_sizer¸   rn   Ú
hidden_actÚstrr	   Úintermediate_act_fnrM   s     €r+   rF   zVideoMAEIntermediate.__init__)  s]   ø€ Ü‰ÑÔÜ—Y‘Y˜v×1Ñ1°6×3KÑ3KÓLˆŒ
Ü�f×'Ñ'¬Ô-Ü'-¨f×.?Ñ.?Ñ'@ˆDÕ$à'-×'8Ñ'8ˆDÕ$r*   r   r–   c                 óJ   — | j                  |«      }| j                  |«      }|S rD   )r¸   rÌ   )rN   r   s     r+   r`   zVideoMAEIntermediate.forward1  s&   € ØŸ
™
 =Ó1ˆØ×0Ñ0°Ó?ˆØÐr*   ©	r!   r"   r#   r   rF   r%   r´   r`   rb   rc   s   @r+   rÇ   rÇ   (  s*   ø„ ð9˜~õ 9ð U§\¡\ð °e·l±l÷ r*   rÇ   c                   ót   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  dej                  fd„Zˆ xZS )ÚVideoMAEOutputrL   c                 óÈ   •— t         ‰| �  «        t        j                  |j                  |j
                  «      | _        t        j                  |j                  «      | _	        y rD   )
rE   rF   r   r£   rÉ   rJ   r¸   r¹   rº   r„   rM   s     €r+   rF   zVideoMAEOutput.__init__9  sB   ø€ Ü‰ÑÔÜ—Y‘Y˜v×7Ñ7¸×9KÑ9KÓLˆŒ
Ü—z‘z &×"<Ñ"<Ó=ˆ�r*   r   r»   r–   c                 óT   — | j                  |«      }| j                  |«      }||z   }|S rD   r½   r¾   s      r+   r`   zVideoMAEOutput.forward>  s.   € ØŸ
™
 =Ó1ˆØŸ™ ]Ó3ˆØ%¨Ñ4ˆØÐr*   rÎ   rc   s   @r+   rÐ   rÐ   8  s8   ø„ ð>˜~õ >ð
 U§\¡\ð ÀÇÁð ÐRW×R^ÑR^÷ r*   rÐ   c                   ój   ‡ — e Zd ZdZdefˆ fd„Zdej                  dee	   dej                  fd„Z
ˆ xZS )ÚVideoMAELayerz?This corresponds to the Block class in the timm implementation.rL   c                 ór  •— t         ‰| �  «        |j                  | _        d| _        t	        |«      | _        t        |«      | _        t        |«      | _	        t        j                  |j                  |j                  ¬«      | _        t        j                  |j                  |j                  ¬«      | _        y )Nr   ©Úeps)rE   rF   Úchunk_size_feed_forwardÚseq_len_dimrÀ   rÂ   rÇ   ÚintermediaterÐ   rÃ   r   Ú	LayerNormrJ   Úlayer_norm_epsÚlayernorm_beforeÚlayernorm_afterrM   s     €r+   rF   zVideoMAELayer.__init__I  s‡   ø€ Ü‰ÑÔØ'-×'EÑ'EˆÔ$ØˆÔÜ*¨6Ó2ˆŒÜ0°Ó8ˆÔÜ$ VÓ,ˆŒÜ "§¡¨V×-?Ñ-?ÀV×EZÑEZÔ [ˆÔÜ!Ÿ|™|¨F×,>Ñ,>ÀF×DYÑDYÔZˆÕr*   r   r…   r–   c                 óÀ   — | j                  |«      } | j                  |fi |¤Ž}||z   }| j                  |«      }| j                  |«      }| j	                  ||«      }|S rD   )rÝ   rÂ   rÞ   rÚ   rÃ   )rN   r   r…   Úhidden_states_normÚattention_outputÚlayer_outputs         r+   r`   zVideoMAELayer.forwardS  sr   € ð
 "×2Ñ2°=ÓAÐØ)˜4Ÿ>™>Ð*<ÑGÀÑGÐð )¨=Ñ8ˆð ×+Ñ+¨MÓ:ˆØ×(Ñ(¨Ó6ˆð —{‘{ <°Ó?ˆàÐr*   )r!   r"   r#   r$   r   rF   r%   r´   r   r   r`   rb   rc   s   @r+   rÔ   rÔ   F  sC   ø„ ÙIð[˜~õ [ðà—|‘|ðð Ð+Ñ,ðð 
�‰÷	r*   rÔ   c                   óR   ‡ — e Zd Zdefˆ fd„Zdej                  dee   de	fd„Z
ˆ xZS )ÚVideoMAEEncoderrL   c                 óÐ   •— t         ‰| �  «        || _        t        j                  t        |j                  «      D �cg c]  }t        |«      ‘Œ c}«      | _        d| _	        y c c}w )NF)
rE   rF   rL   r   Ú
ModuleListr2   Únum_hidden_layersrÔ   ÚlayerÚgradient_checkpointing)rN   rL   r^   rO   s      €r+   rF   zVideoMAEEncoder.__init__j  sN   ø€ Ü‰ÑÔØˆŒÜ—]‘]Ä5È×IaÑIaÓCbÖ#c¸a¤M°&Õ$9Ò#cÓdˆŒ
Ø&+ˆÕ#ùò $ds   ½A#r   r…   r–   c                 óN   — | j                   D ]  } ||fi |¤Ž}Œ t        |¬«      S )N©Úlast_hidden_state)rè   r   )rN   r   r…   Úlayer_modules       r+   r`   zVideoMAEEncoder.forwardp  s5   € ð
 !ŸJ™Jò 	BˆLÙ(¨ÑA¸&ÑA‰Mð	Bô °Ô?Ð?r*   )r!   r"   r#   r   rF   r%   r´   r   r   r   r`   rb   rc   s   @r+   rä   rä   i  s>   ø„ ð,˜~õ ,ð@à—|‘|ð@ð Ð+Ñ,ð@ð 
÷	@r*   rä   c                   óJ   — 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eedœZy	)
ÚVideoMAEPreTrainedModelrL   ÚvideomaerZ   ÚvideoTrB   rÔ   )r   r    N)r!   r"   r#   r   r'   Úbase_model_prefixÚmain_input_nameÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_supports_sdpaÚ_supports_flash_attnÚ_supports_flex_attnÚ_supports_attention_backendrÔ   r•   Ú_can_record_outputsr)   r*   r+   rï   rï   {  sO   … àÓØ"ÐØ$€OØÐØ&*Ð#Ø-¨Ð?ÐØ€NØÐØÐØ"&Ðà&Ø+ñÑr*   rï   c                   ó    ‡ — e Zd Zˆ fd„Zd„ Ze ed¬«      e	 ddej                  dej                  dz  dee   d	efd
„«       «       «       Zˆ xZS )ÚVideoMAEModelc                 ó  •— t         ‰| �  |«       || _        t        |«      | _        t        |«      | _        |j                  rd | _        n0t        j                  |j                  |j                  ¬«      | _        | j                  «        y )NrÖ   )rE   rF   rL   rB   r\   rä   ÚencoderÚuse_mean_poolingÚ	layernormr   rÛ   rJ   rÜ   Ú	post_initrM   s     €r+   rF   zVideoMAEModel.__init__�  si   ø€ Ü‰Ñ˜Ô ØˆŒä,¨VÓ4ˆŒÜ& vÓ.ˆŒà×"Ò"Ø!ˆD�NäŸ\™\¨&×*<Ñ*<À&×BWÑBWÔXˆDŒNð 	�‰Õr*   c                 ó.   — | j                   j                  S rD   )r\   rH   )rN   s    r+   Úget_input_embeddingsz"VideoMAEModel.get_input_embeddingsž  s   € Ø�‰×/Ñ/Ð/r*   F)Útie_last_hidden_statesNrZ   r[   r…   r–   c                 ó²   — | j                  ||«      }| j                  |«      }|j                  }| j                  �| j                  |«      }t	        |¬«      S )aB  
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0). Each video in the
            batch must have the same number of masked patches. If `None`, then all patches are considered. Sequence
            length is `(num_frames // tubelet_size) * (image_size // patch_size) ** 2`.

        Examples:

        ```python
        >>> import torch
        >>> from transformers import VideoMAEVideoProcessor, VideoMAEModel
        >>> from huggingface_hub import hf_hub_download

        >>> # replace this with your own video file
        >>> video_path = hf_hub_download(
        ...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
        ... )

        >>> video_processor = VideoMAEVideoProcessor.from_pretrained("MCG-NJU/videomae-base")
        >>> model = VideoMAEModel.from_pretrained("MCG-NJU/videomae-base")

        >>> # prepare video for the model
        >>> inputs = video_processor(video_path, return_tensors="pt")

        >>> # forward pass
        >>> with torch.no_grad():
        ...     outputs = model(**inputs)

        >>> last_hidden_states = outputs.last_hidden_state
        >>> list(last_hidden_states.shape)
        [1, 1568, 768]
        ```rë   )r\   rÿ   rì   r  r   )rN   rZ   r[   r…   Úembedding_outputÚencoder_outputsÚsequence_outputs          r+   r`   zVideoMAEModel.forward¡  sS   € ðT  Ÿ?™?¨<¸ÓIÐà+/¯<©<Ð8HÓ+IˆØ)×;Ñ;ˆØ�>‰>Ð%Ø"Ÿn™n¨_Ó=ˆOä°ÔAÐAr*   rD   )r!   r"   r#   rF   r  r   r   r   r%   r&   Ú
BoolTensorr   r   r   r`   rb   rc   s   @r+   rý   rý   �  s~   ø„ ôò0ð  Ù¨EÔ2Øð 48ñ.Bà×'Ñ'ð.Bð ×)Ñ)¨DÑ0ð.Bð Ð+Ñ,ð	.Bð
 
ò.Bó ó 3ó  ô.Br*   rý   c                   óH   ‡ — e Zd Zdefˆ fd„Zdej                  defd„Zˆ xZ	S )ÚVideoMAEDecoderrL   c                 ó„  •— t         ‰| �  «        |j                  |j                  z  |j                  dz  z  }t        |«      }|j                  |_        |j                  |_	        |j                  |_        |j                  |_        t        j                  t!        |j                  «      D �cg c]  }t#        |«      ‘Œ c}«      | _        t        j&                  |j                  «      | _        |dkD  r t        j*                  |j                  |«      nt        j,                  «       | _        d| _        || _        y c c}w )Nr1   r   F)rE   rF   r_   rm   rk   r   Údecoder_hidden_sizerJ   Údecoder_num_hidden_layersrç   Údecoder_num_attention_headsrœ   Údecoder_intermediate_sizerÉ   r   ræ   r2   rÔ   Údecoder_layersrÛ   Únormr£   ÚIdentityÚheadré   rL   )rN   rL   Údecoder_num_labelsÚdecoder_configr^   rO   s        €r+   rF   zVideoMAEDecoder.__init__Ö  s  ø€ Ü‰ÑÔà#×0Ñ0°6×3FÑ3FÑFÈ×IZÑIZÐ\]ÑI]Ñ]Ðä! &Ó)ˆØ%+×%?Ñ%?ˆÔ"Ø+1×+KÑ+KˆÔ(Ø-3×-OÑ-OˆÔ*Ø+1×+KÑ+KˆÔ(Ü Ÿm™mÜ49¸&×:ZÑ:ZÓ4[Ö\¨qŒ]˜>Õ*Ò\ó
ˆÔô —L‘L ×!;Ñ!;Ó<ˆŒ	àI[Ð^_ÒI_ŒB�I‰I�f×0Ñ0Ð2DÔEÔeg×epÑepÓerð 	Œ	ð ',ˆÔ#Ø$ˆ�ùò ]s   Â.D=r   Úreturn_token_numc                 ó¨   — | j                   D ]
  } ||«      }Œ |d d …| d …f   }| j                  |«      }| j                  |«      }t        |¬«      S )N)r   )r  r  r  r   )rN   r   r  rí   r   s        r+   r`   zVideoMAEDecoder.forwardì  sb   € à ×/Ñ/ò 	8ˆLÙ(¨Ó7‰Mð	8ð &¢aÐ*:Ð):Ñ);Ð&;Ñ<ˆð Ÿ	™	 -Ó0ˆØ—‘˜=Ó)ˆä$¨FÔ3Ð3r*   )
r!   r"   r#   r   rF   r%   r´   rr   r`   rb   rc   s   @r+   r  r  Õ  s&   ø„ ð%˜~õ %ð,4 U§\¡\ð 4ÀS÷ 4r*   r  zb
    The VideoMAE Model transformer with the decoder on top for self-supervised pre-training.
    c            
       óx   ‡ — e Zd Zˆ fd„Zeedej                  dej                  de	e
   defd„«       «       Zˆ xZS )ÚVideoMAEForPreTrainingc                 óØ  •— t         ‰| �  |«       || _        t        |«      | _        t        j                  |j                  |j                  d¬«      | _	        t        j                  t        j                  dd|j                  «      «      | _        t        | j                  j                  j                   |j                  «      | _        t%        |«      | _        | j)                  «        y )NFrš   r   )rE   rF   rL   rý   rð   r   r£   rJ   r  Úencoder_to_decoderÚ	Parameterr%   ÚzerosÚ
mask_tokenr@   r\   rI   rK   r  Údecoderr  rM   s     €r+   rF   zVideoMAEForPreTraining.__init__   sª   ø€ Ü‰Ñ˜Ô ØˆŒä% fÓ-ˆŒä"$§)¡)¨F×,>Ñ,>À×@ZÑ@ZÐafÔ"gˆÔÜŸ,™,¤u§{¡{°1°a¸×9SÑ9SÓ'TÓUˆŒÜ#>Ø�M‰M×$Ñ$×0Ñ0°&×2LÑ2Ló$
ˆÔ ô ' vÓ.ˆŒð 	�‰Õr*   rZ   r[   r…   r–   c                 ó*  —  | j                   |fd|i|¤Ž}|j                  }| j                  |«      }|j                  \  }}}|€t	        d«      ‚| j
                  j                  |dd«      j                  |«      }	|	j                  «       j                  |j                  d¬«      }	|	|    j                  |d|«      }
|	|   j                  |d|«      }t        j                  ||
z   | j                  |z   gd¬«      }| j                  ||j                  d   «      }|j                   }d}t        j"                  «       5  | j$                  j&                  d	k7  r|}nˆ|j                  }|j(                  }t        j*                  t,        «      j                  ||¬
«      dddd…ddf   }t        j*                  t.        «      j                  ||¬
«      dddd…ddf   }||z  |z   }|j                  \  }}}}}| j$                  j0                  | j$                  j2                  }}| j$                  j4                  rØ|j7                  |||z  ||||z  |||z  |«      }|j9                  dddddddd	«      j;                  «       }|j7                  |||z  |z  |z  |z  |z  ||z  |z  |«      }||j=                  dd¬«      z
  |j?                  ddd¬«      jA                  «       dz   z  }|j7                  |||z  |z  |z  |z  |z  ||z  |z  |z  «      }n–| j$                  j&                  d	k7  rt	        d«      ‚|j7                  |||z  ||||z  |||z  |«      }|j9                  dddddddd	«      j;                  «       }|j7                  |||z  |z  |z  |z  |z  ||z  |z  |z  «      }|j                  \  }}}||   j                  |d|«      }ddd«       tC        «       } ||«      }tE        |||jF                  |jH                  ¬«      S # 1 sw Y   Œ?xY w)a  
        bool_masked_pos (`torch.BoolTensor` of shape `(batch_size, sequence_length)`):
            Boolean masked positions. Indicates which patches are masked (1) and which aren't (0). Each video in the
            batch must have the same number of masked patches. Sequence length is `(num_frames // tubelet_size) *
            (image_size // patch_size) ** 2`.

        Examples:
        ```python
        >>> from transformers import AutoImageProcessor, VideoMAEForPreTraining
        >>> import numpy as np
        >>> import torch

        >>> num_frames = 16
        >>> video = list(np.random.randint(0, 256, (num_frames, 3, 224, 224)))

        >>> image_processor = AutoImageProcessor.from_pretrained("MCG-NJU/videomae-base")
        >>> model = VideoMAEForPreTraining.from_pretrained("MCG-NJU/videomae-base")

        >>> pixel_values = image_processor(video, return_tensors="pt").pixel_values

        >>> num_patches_per_frame = (model.config.image_size // model.config.patch_size) ** 2
        >>> seq_length = (num_frames // model.config.tubelet_size) * num_patches_per_frame
        >>> bool_masked_pos = torch.randint(0, 2, (1, seq_length)).bool()

        >>> outputs = model(pixel_values, bool_masked_pos=bool_masked_pos)
        >>> loss = outputs.loss
        ```r[   Nz!One must provided a boolean mask rT   TrQ   r   rˆ   r   )rR   Údtyper   rw   é   r1   é   é   r§   )r‰   Úkeepdim)r‰   Úunbiasedr'  g�íµ ÷Æ°>zQCan't unnormalize non-RGB images. Consider setting config.norm_pix_loss to False.©r.   r   r   r    )%rð   rì   r  rX   rx   rK   ÚexpandrV   rU   rW   rR   rY   r%   Úcatr   r!  r   Úno_gradrL   r_   r#  Ú	as_tensorr   r   rm   rk   Únorm_pix_lossr¨   ry   r�   ÚmeanÚvarÚsqrtr   r-   r   r    )rN   rZ   r[   r…   Úoutputsr	  r]   r^   r_   Úexpanded_position_embeddingsÚpos_emb_visibleÚpos_emb_maskÚx_fullÚdecoder_outputsr   r.   ÚframesrR   r#  r/  ÚstdÚtimer|   r}   rm   rk   Úframes_normÚvideos_patchÚlabelsÚloss_fcts                                 r+   r`   zVideoMAEForPreTraining.forward  s“  € ðF $1 4§=¡=°Ñ#iÈÐ#iÐbhÑ#iˆà!×3Ñ3ˆØ×1Ñ1°/ÓBˆð '6×&;Ñ&;Ñ#ˆ
�A�|ð Ð"ÜÐ@ÓAÐAà'+×'?Ñ'?×'FÑ'FÀzÐSUÐWYÓ'Z×'bÑ'bÐcoÓ'pÐ$Ø'C×'JÑ'JÓ'L×'OÑ'OÐWc×WjÑWjÐquÐ'OÓ'vÐ$Ø6¸Ð7GÑH×PÑPÐQ[Ð]_ÐamÓnˆØ3°OÑD×LÑLÈZÐY[Ð]iÓjˆô —‘˜O¨oÑ=¸t¿¹ÐQ]Ñ?]Ð^ÐdeÔfˆð 26·±¸fÀl×FXÑFXÐYZÑF[Ó1\ˆØ ×'Ñ'ˆàˆÜ�]‰]‹_ñ H	Yà�{‰{×'Ñ'¨1Ò,à%‘ð &×,Ñ,�Ø$×*Ñ*�Ü—‘Ô'<Ó=×@Ñ@ÈÐV[Ð@Ó\Ð]aÐcgÒijÐlpÐrvÐ]vÑw�Ü—o‘oÔ&:Ó;×>Ñ>ÀfÐTYÐ>ÓZÐ[_ÐaeÒghÐjnÐptÐ[tÑu�Ø%¨Ñ+¨dÑ2�à<B¿L¹LÑ9ˆJ˜˜l¨F°EØ'+§{¡{×'?Ñ'?ÀÇÁ×AWÑAW˜*ˆLØ�{‰{×(Ò(àŸ™ØØ˜LÑ(Ø Ø Ø˜jÑ(ØØ˜ZÑ'Øó	�ð  Ÿ™¨¨1¨a°°A°q¸!¸QÓ?×JÑJÓL�àŸ™ØØ˜LÑ(¨6Ñ1°ZÑ?À%ÑGÈ:ÑUØ  :Ñ-°
Ñ:Ø ó	�ð  &¨¯©¸ÀD¨Ó(IÑIØ—J‘J 2°¸d�JÓC×HÑHÓJÈTÑQñ�ð  +×/Ñ/ØØ˜LÑ(¨6Ñ1°ZÑ?À%ÑGÈ:ÑUØ  :Ñ-°
Ñ:¸\ÑIó ‘ð —;‘;×+Ñ+¨qÒ0Ü$Økóð ð  Ÿ™ØØ˜LÑ(Ø Ø Ø˜jÑ(ØØ˜ZÑ'Øó	�ð  Ÿ™¨¨1¨a°°A°q¸!¸QÓ?×JÑJÓL�à%Ÿ{™{ØØ˜LÑ(¨6Ñ1°ZÑ?À%ÑGÈ:ÑUØ  :Ñ-°
Ñ:¸\ÑIó �ð +7×*<Ñ*<Ñ'ˆJ˜˜<Ø! /Ñ2×:Ñ:¸:ÀrÈ<ÓXˆF÷QH	YôT “9ˆÙ˜ Ó'ˆä+ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
÷[H	Yð H	Yús   Ä>JP	Ð	P)r!   r"   r#   rF   r   r   r%   r&   r
  r   r   r-   r`   rb   rc   s   @r+   r  r  ú  sb   ø„ ôð" ØðL
à×'Ñ'ðL
ð ×)Ñ)ðL
ð Ð+Ñ,ð	L
ð
 
&òL
ó ó ôL
r*   r  z­
    VideoMAE Model transformer with a video classification head on top (a linear layer on top of the average pooled hidden
    states of all tokens) e.g. for ImageNet.
    c                   óŠ   ‡ — e Zd Zˆ fd„Zee	 	 ddej                  dz  dej                  dz  dee	   de
fd„«       «       Zˆ xZS )	ÚVideoMAEForVideoClassificationc                 óŽ  •— t         ‰| �  |«       |j                  | _        t        |«      | _        |j
                  rt        j                  |j                  «      nd | _	        |j                  dkD  r*t        j                  |j                  |j                  «      nt        j                  «       | _        | j                  «        y )Nr   )rE   rF   Ú
num_labelsrý   rð   r   r   rÛ   rJ   Úfc_normr£   r  Ú
classifierr  rM   s     €r+   rF   z'VideoMAEForVideoClassification.__init__©  s‘   ø€ Ü‰Ñ˜Ô à ×+Ñ+ˆŒÜ% fÓ-ˆŒð <B×;RÒ;R”r—|‘| F×$6Ñ$6Ô7ÐX\ˆŒØNT×N_ÑN_ÐbcÒNcœ"Ÿ)™) F×$6Ñ$6¸×8IÑ8IÔJÔik×itÑitÓivˆŒð 	�‰Õr*   NrZ   r=  r…   r–   c                 ó^  —  | j                   |fi |¤Ž}|j                  }| j                  �#|j                  d«      }| j                  |«      }n	|dd…df   }| j	                  |«      }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 torch
        >>> from transformers import VideoMAEVideoProcessor, VideoMAEForVideoClassification
        >>> from huggingface_hub import hf_hub_download

        >>> # replace this with your own video file
        >>> video_path = hf_hub_download(
        ...     repo_id="nielsr/video-demo", filename="eating_spaghetti.mp4", repo_type="dataset"
        ... )

        >>> video_processor = VideoMAEVideoProcessor.from_pretrained("MCG-NJU/videomae-base-finetuned-kinetics")
        >>> model = VideoMAEForVideoClassification.from_pretrained("MCG-NJU/videomae-base-finetuned-kinetics")

        >>> inputs = video_processor(video_path, 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])
        eating spaghetti
        ```Nr   r   r)  )
rð   rì   rC  r/  rD  Úloss_functionrL   r   r   r    )	rN   rZ   r=  r…   r2  r	  rÃ   r   r.   s	            r+   r`   z&VideoMAEForVideoClassification.forward¶  s¸   € ðR $1 4§=¡=°Ñ#HÀÑ#HˆØ!×3Ñ3ˆà�<‰<Ð#Ø$×)Ñ)¨!Ó,ˆFØ—\‘\ &Ó)‰Fà$¢Q¨ TÑ*ˆFà—‘ Ó(ˆàˆØÐØ%�4×%Ñ% f¨f°d·k±kÑLÀVÑLˆDä$ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r*   )NN)r!   r"   r#   rF   r   r   r%   r´   r   r   r   r`   rb   rc   s   @r+   r@  r@  ¢  sj   ø„ ôð Øð -1Ø&*ñ;
à—l‘l TÑ)ð;
ð —‘˜tÑ#ð;
ð Ð+Ñ,ð	;
ð
 
ò;
ó ó ô;
r*   r@  )r  rý   rï   r@  )Nr¦   )Br$   Úcollections.abcro   r   rS   r   Údataclassesr   Únumpyr3   r%   r   Útorch.nnr   Úactivationsr	   Úmodeling_layersr
   Úmodeling_outputsr   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.constantsr   r   Úutils.genericr   r   Úutils.output_capturingr   Úconfiguration_videomaer   Ú
get_loggerr!   Úloggerr   r-   r@   ÚModulerB   rG   r´   Úfloatr“   r•   r¶   rÀ   rÇ   rÐ   rÔ   rä   rï   rý   r  r  r@  Ú__all__r)   r*   r+   ú<module>rZ     st  ðñ 3ã Ý $Ý Ý !ã Û Ý Ý å !Ý 9ß Fß FÝ &ß MÓ Mß Jß IÝ 5Ý 2ð 
ˆ×	Ñ	˜HÓ	%€ñ ðôð
 ô7˜Kó 7ó óð7ñ ðôð
 ô7 ;ó 7ó óð7ò :ô˜Ÿ™ô ôB2˜bŸi™iô 2ðx !Øñ%Ø�I‰Ið%à�<‰<ð%ð 
�‰ð%ð �<‰<ð	%ð
 —L‘L 4Ñ'ð%ð �T‰\ð%ð ð%ð Ð'Ñ(ó%ô80.˜BŸI™Iô 0.ôh˜Ÿ™ô ô$˜Ÿ	™	ô ô"˜2Ÿ9™9ô ô 
�R—Y‘Yô 
ôÐ.ô ôF@�b—i‘iô @ð$ ô˜oó ó ðð" ôDBÐ+ó DBó ðDBôN"4�b—i‘iô "4ñJ ðôô
`
Ð4ó `
óð
`
ñF ðôôK
Ð%<ó K
óðK
ò\ s�r*   