Ë
    ÛÓ^js  ã                   ó
  — d dl Z d dlmZ d dlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZmZ d	d
lmZmZmZmZ  G d„ de«      Ze G d„ de«      «       Z G d„ dee«      Z ed¬«       G d„ dee«      «       Zg d¢Zy)é    N)ÚIJepaConfigé   )Úinitialization)ÚBaseModelOutputWithPoolingÚImageClassifierOutput)ÚPreTrainedModel)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚ	torch_inté   )ÚViTEmbeddingsÚViTForImageClassificationÚViTModelÚViTPreTrainedModelc            	       óÎ   ‡ — e Zd Zddededdfˆ fd„Zdej                  dededej                  fd	„Z		 	 dd
ej                  dej                  dz  dedej                  fd„Zˆ xZS )ÚIJepaEmbeddingsÚconfigÚuse_mask_tokenÚreturnNc                 óÈ   •— t         ‰| �  ||«       | `| j                  j                  }t        j                  t        j                  d||j                  «      «      | _
        y )Né   )ÚsuperÚ__init__Ú	cls_tokenÚpatch_embeddingsÚnum_patchesÚnnÚ	ParameterÚtorchÚrandnÚhidden_sizeÚposition_embeddings)Úselfr   r   r   Ú	__class__s       €úr/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/ijepa/modular_ijepa.pyr   zIJepaEmbeddings.__init__   sL   ø€ Ü‰Ñ˜ Ô0àˆNØ×+Ñ+×7Ñ7ˆÜ#%§<¡<´·±¸A¸{ÈF×L^ÑL^Ó0_Ó#`ˆÕ ó    Ú
embeddingsÚheightÚwidthc                 ó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.

        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_encodingz(IJepaEmbeddings.interpolate_pos_encoding   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'   Úpixel_valuesÚbool_masked_posr@   c                 ó   — |j                   \  }}}}| j                  |«      }|�Z|j                   d   }	| j                  j                  ||	d«      }
|j	                  d«      j                  |
«      }|d|z
  z  |
|z  z   }|r|| j                  |||«      z   }ne|| j                  d   k7  s|| j                  d   k7  r2t        d|› d|› d| j                  d   › d| j                  d   › d�	«      ‚|| j                  z   }| j                  |«      }|S )	Nr   r,   g      ð?r   zInput image size (Ú*z) doesn't match model (z).)r1   r   Ú
mask_tokenÚexpandÚ	unsqueezeÚtype_asr@   Ú
image_sizeÚ
ValueErrorr#   Údropout)r$   rA   rB   r@   Ú
batch_sizeÚ_r)   r*   r(   Ú
seq_lengthÚmask_tokensÚmasks               r&   ÚforwardzIJepaEmbeddings.forward=   s6  € ð (4×'9Ñ'9Ñ$ˆ
�A�v˜uØ×*Ñ*¨<Ó8ˆ
àÐ&Ø#×)Ñ)¨!Ñ,ˆJØŸ/™/×0Ñ0°¸ZÈÓLˆKà"×,Ñ,¨RÓ0×8Ñ8¸ÓEˆDØ# s¨T¡zÑ2°[À4Ñ5GÑGˆJñ $Ø# d×&CÑ&CÀJÐPVÐX]Ó&^Ñ^‰Jà˜Ÿ™¨Ñ+Ò+¨u¸¿¹ÈÑ8JÒ/JÜ Ø(¨¨°°%°ð 9ØŸ™¨Ñ+Ð,¨A¨d¯o©o¸aÑ.@Ð-AÀðEóð ð $ d×&>Ñ&>Ñ>ˆJà—\‘\ *Ó-ˆ
àÐr'   )F)NF)Ú__name__Ú
__module__Ú__qualname__r   Úboolr   r    ÚTensorÚintr@   Ú
BoolTensorrQ   Ú__classcell__©r%   s   @r&   r   r      s•   ø„ ña˜{ð a¸Dð aÈTõ að%°5·<±<ð %Èð %ÐUXð %Ð]b×]iÑ]ió %ðT 48Ø).ñ	à—l‘lðð ×)Ñ)¨DÑ0ðð #'ð	ð
 
�‰÷r'   r   c                   ó:   — e Zd Z ej                  «       d„ «       Zy)ÚIJepaPreTrainedModelc                 ó0  — t        j                  | |«       t        |t        j                  t        j
                  f«      rct        j                  |j                  d| j                  j                  ¬«       |j                  � t        j                  |j                  «       yyt        |t        «      rct        j                  |j                  d| j                  j                  ¬«       |j                  � t        j                  |j                  «       yyy)zInitialize the weightsg        )ÚmeanÚstdN)r   Ú_init_weightsÚ
isinstancer   ÚLinearÚConv2dÚinitÚtrunc_normal_Úweightr   Úinitializer_rangeÚbiasÚzeros_r   r#   rE   )r$   Úmodules     r&   r`   z"IJepaPreTrainedModel._init_weights_   s¾   € ô 	×%Ñ% d¨FÔ3Ü�fœrŸy™y¬"¯)©)Ð4Ô5Ü×Ñ˜vŸ}™}°3¸D¿K¹K×<YÑ<YÕZØ�{‰{Ð&Ü—‘˜FŸK™KÕ(ð 'ä˜¤Ô0Ü×Ñ˜v×9Ñ9ÀÈÏÉ×IfÑIfÕgØ× Ñ Ð,Ü—‘˜F×-Ñ-Õ.ð -ð 1r'   N)rR   rS   rT   r    Úno_gradr`   © r'   r&   r\   r\   ]   s   „ à€U‡]�]ƒ_ñ
/ó ñ
/r'   r\   c                   ó.   ‡ — e Zd Zddededefˆ fd„Zˆ xZS )Ú
IJepaModelr   Úadd_pooling_layerr   c                 óV   •— t         ‰| �  |«       || _        t        ||¬«      | _        y)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   ro   r   r%   s       €r&   r   zIJepaModel.__init__n   s'   ø€ ô 	‰Ñ˜Ô ØˆŒÜ)¨&ÀÔPˆ�r'   )FF)rR   rS   rT   r   rU   r   rY   rZ   s   @r&   rn   rn   m   s(   ø„ ñ	Q˜{ð 	Q¸tð 	QÐ]a÷ 	Qñ 	Qr'   rn   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                   óˆ   ‡ — e Zd Zdefˆ fd„Z	 	 	 d
dej                  dz  dej                  dz  dedz  dee	   de
f
d	„Zˆ xZS )ÚIJepaForImageClassificationr   c                 óh   •— t         ‰| �  |«       t        |d¬«      | _        | j	                  «        y )NF)ro   )r   r   rn   ÚijepaÚ	post_init)r$   r   r%   s     €r&   r   z$IJepaForImageClassification.__init__‰   s(   ø€ Ü‰Ñ˜Ô Ü ¸%Ô@ˆŒ
Ø�‰Õr'   NrA   Úlabelsr@   Úkwargsr   c                 ó  —  | j                   |fd|i|¤Ž}|j                  }| j                  |j                  d¬«      «      }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).
        r@   r   )r<   N)ÚlossÚlogitsÚhidden_statesÚ
attentions)	ru   Úlast_hidden_stateÚ
classifierr^   Úloss_functionr   r   r|   r}   )	r$   rA   rw   r@   rx   ÚoutputsÚsequence_outputr{   rz   s	            r&   rQ   z#IJepaForImageClassification.forwardŽ   s¡   € ð /9¨d¯j©jØñ/
à%=ð/
ð ñ/
ˆð
 "×3Ñ3ˆØ—‘ ×!5Ñ!5¸!Ð!5Ó!<Ó=ˆàˆØÐØ%�4×%Ñ% f¨f°d·k±kÑLÀVÑLˆDä$ØØØ!×/Ñ/Ø×)Ñ)ô	
ð 	
r'   )NNN)rR   rS   rT   r   r   r    rV   rU   r	   r
   r   rQ   rY   rZ   s   @r&   rs   rs   z   sk   ø„ ð˜{õ ð -1Ø&*Ø04ñ	
à—l‘l TÑ)ð
ð —‘˜tÑ#ð
ð #'¨¡+ð	
ð
 Ð+Ñ,ð
ð 
÷
r'   rs   )r\   rn   rs   )r    Útorch.nnr   Ú-transformers.models.ijepa.configuration_ijepar   Ú r   rd   Úmodeling_outputsr   r   Úmodeling_utilsr   Úprocessing_utilsr	   Úutilsr
   r   r   Úvit.modeling_vitr   r   r   r   r   r\   rn   rs   Ú__all__rl   r'   r&   ú<module>rŒ      s“   ðÛ Ý å Eå &ß QÝ -Ý &ß BÑ Bß eÓ eôL�mô Lð^ ô/Ð-ó /ó ð/ô
QÐ% xô 
Qñ ðôô%
Ð"6Ð8Qó %
óð%
òP�r'   