ó
    ˆŽ¡js  ã                   ó  • S SK r S SKJr  S SKJr  SSKJr  SSKJ	r	J
r
  SSKJr  SSKJr  SSKJrJrJr  S	S
KJrJrJrJr   " S S\5      r\ " S S\5      5       r " S S\\5      r\" SS9 " S S\\5      5       r/ SQrg)é    N)ÚIJepaConfigé   )Úinitialization)ÚBaseModelOutputWithPoolingÚImageClassifierOutput)ÚPreTrainedModel)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚ	torch_inté   )ÚViTEmbeddingsÚViTForImageClassificationÚViTModelÚViTPreTrainedModelc            	       óâ   ^ • \ rS rSrSS\S\SS4U 4S jjjrS\R                  S\	S	\	S\R                  4S
 jr
  SS\R                  S\R                  S-  S\S\R                  4S jjrSrU =r$ )ÚIJepaEmbeddingsé   ÚconfigÚuse_mask_tokenÚreturnNc                 óÈ   >• [         TU ]  X5        U ?U R                  R                  n[
        R                  " [        R                  " SX1R                  5      5      U l
        g )Né   )ÚsuperÚ__init__Ú	cls_tokenÚpatch_embeddingsÚnum_patchesÚnnÚ	ParameterÚtorchÚrandnÚhidden_sizeÚposition_embeddings)Úselfr   r   r   Ú	__class__s       €ÚµC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/models/ijepa/modular_ijepa.pyr   ÚIJepaEmbeddings.__init__   sH   ø€ Ü‰Ñ˜Ô0àˆNØ×+Ñ+×7Ñ7ˆÜ#%§<¢<´·²¸A¸{×L^ÑL^Ó0_Ó#`ˆÕ ó    Ú
embeddingsÚheightÚwidthc                 ó,  • UR                   S   nU R                  R                   S   n[        R                  R	                  5       (       d  XE:X  a  X#:X  a  U R                  $ U R                  nUR                   S   nX R
                  -  nX0R
                  -  n	[        US-  5      n
UR                  SXªU5      nUR                  SSSS5      n[        R                  R                  UX‰4SSS	9nUR                  SSSS5      R                  SSU5      nU$ )
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   éÿÿÿÿg      à?r   r   r   ÚbicubicF)ÚsizeÚmodeÚalign_corners)Úshaper$   r!   ÚjitÚ
is_tracingÚ
patch_sizer   ÚreshapeÚpermuter   Ú
functionalÚinterpolateÚview)r%   r*   r+   r,   r   Únum_positionsÚpatch_pos_embedÚdimÚ
new_heightÚ	new_widthÚsqrt_num_positionss              r'   Úinterpolate_pos_encodingÚ(IJepaEmbeddings.interpolate_pos_encoding   s  € ð !×&Ñ& qÑ)ˆØ×0Ñ0×6Ñ6°qÑ9ˆô �y‰y×#Ñ#×%Ñ%¨+Ó*FÈ6Ë?Ø×+Ñ+Ð+à×2Ñ2ˆà×Ñ˜rÑ"ˆàŸ™Ñ.ˆ
ØŸ_™_Ñ,ˆ	ä& }°cÑ'9Ó:ÐØ)×1Ñ1°!Ð5GÐ]`ÓaˆØ)×1Ñ1°!°Q¸¸1Ó=ˆäŸ-™-×3Ñ3ØØÐ(ØØð	 4ð 
ˆð *×1Ñ1°!°Q¸¸1Ó=×BÑBÀ1ÀbÈ#ÓNˆàÐr)   Úpixel_valuesÚbool_masked_posrB   c                 ó  • UR                   u  pEpgU R                  U5      nUbX  UR                   S   n	U R                  R                  XIS5      n
UR	                  S5      R                  U
5      nUSU-
  -  X«-  -   nU(       a  X€R                  X†U5      -   nOdX`R                  S   :w  d  XpR                  S   :w  a2  [        SU SU SU R                  S    SU R                  S    S3	5      eX€R                  -   nU R                  U5      nU$ )	Nr   r.   g      ð?r   zInput image size (Ú*z) doesn't match model (z).)r3   r   Ú
mask_tokenÚexpandÚ	unsqueezeÚtype_asrB   Ú
image_sizeÚ
ValueErrorr$   Údropout)r%   rD   rE   rB   Ú
batch_sizeÚ_r+   r,   r*   Ú
seq_lengthÚmask_tokensÚmasks               r'   ÚforwardÚIJepaEmbeddings.forward=   s#  € ð (4×'9Ñ'9Ñ$ˆ
�vØ×*Ñ*¨<Ó8ˆ
àÑ&Ø#×)Ñ)¨!Ñ,ˆJØŸ/™/×0Ñ0°ÈÓLˆKà"×,Ñ,¨RÓ0×8Ñ8¸ÓEˆDØ# s¨T¡zÑ2°[Ñ5GÑGˆJö $Ø#×&CÑ&CÀJÐX]Ó&^Ñ^‰JàŸ™¨Ñ+Ó+¨u¿¹ÈÑ8JÓ/JÜ Ø(¨¨°°%°ð 9ØŸ™¨Ñ+Ð,¨A¨d¯o©o¸aÑ.@Ð-AÀðEóð ð $×&>Ñ&>Ñ>ˆJà—\‘\ *Ó-ˆ
àÐr)   )r$   )F)NF)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Úboolr   r!   ÚTensorÚintrB   Ú
BoolTensorrT   Ú__static_attributes__Ú__classcell__©r&   s   @r'   r   r      s    ø† ña˜{ð a¸Dð aÈT÷ að að%°5·<±<ð %Èð %ÐUXð %Ð]b×]iÑ]iô %ðT 48Ø).ñ	à—l‘lðð ×)Ñ)¨DÑ0ðð #'ð	ð
 
�‰÷ó r)   r   c                   óB   • \ rS rSr\R
                  " 5       S 5       rSrg)ÚIJepaPreTrainedModelé]   c                 óD  • [         R                  " X5        [        U[        R                  [        R
                  45      (       ac  [        R                  " UR                  SU R                  R                  S9  UR                  b!  [        R                  " UR                  5        gg[        U[        5      (       ac  [        R                  " UR                  SU R                  R                  S9  UR                  b!  [        R                  " UR                  5        ggg)zInitialize the weightsg        )ÚmeanÚstdN)r   Ú_init_weightsÚ
isinstancer   ÚLinearÚConv2dÚinitÚtrunc_normal_Úweightr   Úinitializer_rangeÚbiasÚzeros_r   r$   rH   )r%   Úmodules     r'   rg   Ú"IJepaPreTrainedModel._init_weights_   sÂ   € ô 	×%Ò% dÔ3Ü�fœrŸy™y¬"¯)©)Ð4×5Ñ5Ü×Ò˜vŸ}™}°3¸D¿K¹K×<YÑ<YÒZØ�{‰{Ñ&Ü—’˜FŸK™KÕ(ð 'ä˜¤×0Ñ0Ü×Ò˜v×9Ñ9ÀÈÏÉ×IfÑIfÒgØ× Ñ Ñ,Ü—’˜F×-Ñ-Õ.ð -ð 1r)   © N)rV   rW   rX   rY   r!   Úno_gradrg   r^   rs   r)   r'   rb   rb   ]   s   † à
‡]‚]ƒ_ñ
/ó ó
/r)   rb   c                   ó<   ^ • \ rS rSrSS\S\S\4U 4S jjjrSrU =r$ )Ú
IJepaModelém   r   Úadd_pooling_layerr   c                 óL   >• [         TU ]  U5        Xl        [        XS9U l        g)zÓ
add_pooling_layer (bool, *optional*, defaults to `True`):
    Whether to add a pooling layer
use_mask_token (`bool`, *optional*, defaults to `False`):
    Whether to use a mask token for masked image modeling.
)r   N)r   r   r   r   r*   )r%   r   rx   r   r&   s       €r'   r   ÚIJepaModel.__init__n   s#   ø€ ô 	‰Ñ˜Ô ØŒÜ)¨&ÑPˆ�r)   )r   r*   )FF)	rV   rW   rX   rY   r   rZ   r   r^   r_   r`   s   @r'   rv   rv   m   s(   ø† ñ	Q˜{ð 	Q¸tð 	QÐ]a÷ 	Qö 	Qr)   rv   aÒ  
    IJepa Model transformer with an image classification head on top (a linear layer on top of the final hidden states)
    e.g. for ImageNet.

    <Tip>

        Note that it's possible to fine-tune IJepa 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                   ó˜   ^ • \ rS rSrS\4U 4S jjr   SS\R                  S-  S\R                  S-  S\S-  S\	\
   S	\4
S
 jjrSrU =r$ )ÚIJepaForImageClassificationéz   r   c                 ób   >• [         TU ]  U5        [        USS9U l        U R	                  5         g )NF)rx   )r   r   rv   ÚijepaÚ	post_init)r%   r   r&   s     €r'   r   Ú$IJepaForImageClassification.__init__‰   s(   ø€ Ü‰Ñ˜Ô Ü ¸%Ñ@ˆŒ
Ø�‰Õr)   NrD   ÚlabelsrB   Úkwargsr   c                 ó  • U R                   " U4SU0UD6nUR                  nU R                  UR                  SS95      nSnUb  U R                  " X'U R
                  40 UD6n[        UUUR                  UR                  S9$ )ab  
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).
rB   r   )r>   N)ÚlossÚlogitsÚhidden_statesÚ
attentions)	r€   Úlast_hidden_stateÚ
classifierre   Úloss_functionr   r   rˆ   r‰   )	r%   rD   rƒ   rB   r„   ÚoutputsÚsequence_outputr‡   r†   s	            r'   rT   Ú#IJepaForImageClassification.forwardŽ   s›   € ð /3¯jªjØñ/
à%=ð/
ð ñ/
ˆð
 "×3Ñ3ˆØ—‘ ×!5Ñ!5¸!Ð!5Ð!<Ó=ˆàˆØÑØ×%Ò% f°d·k±kÑLÀVÑLˆDä$ØØØ!×/Ñ/Ø×)Ñ)ñ	
ð 	
r)   )r€   )NNN)rV   rW   rX   rY   r   r   r!   r[   rZ   r	   r
   r   rT   r^   r_   r`   s   @r'   r}   r}   z   sp   ø† ð˜{÷ ð -1Ø&*Ø04ñ	
à—l‘l TÑ)ð
ð —‘˜tÑ#ð
ð #'¨¡+ð	
ð
 Ð+Ñ,ð
ð 
÷
ó 
r)   r}   )rb   rv   r}   )r!   Útorch.nnr   Ú-transformers.models.ijepa.configuration_ijepar   Ú r   rk   Úmodeling_outputsr   r   Úmodeling_utilsr   Úprocessing_utilsr	   Úutilsr
   r   r   Úvit.modeling_vitr   r   r   r   r   rb   rv   r}   Ú__all__rs   r)   r'   Ú<module>r™      s“   ðÛ Ý å Eå &ß QÝ -Ý &ß BÑ Bß eÓ eôL�mô Lð^ ô/Ð-ó /ó ð/ô
QÐ% xô 
Qñ ðñô%
Ð"6Ð8Qó %
óð%
òP�r)   