§
    ‚Štjs  ã                   ó6  — 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dS )é    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 )ÚIJepaEmbeddingsFÚconfigÚuse_mask_tokenÚreturnNc                 óÌ   •— t          ¦   «                              ||¦  «         | `| j        j        }t          j        t          j        d||j	        ¦  «        ¦  «        | _
        d S )Né   )ÚsuperÚ__init__Ú	cls_tokenÚpatch_embeddingsÚnum_patchesÚnnÚ	ParameterÚtorchÚrandnÚhidden_sizeÚposition_embeddings)Úselfr   r   r   Ú	__class__s       €úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/ijepa/modular_ijepa.pyr   zIJepaEmbeddings.__init__   sV   ø€ Ý‰Œ×Ò˜ Ñ0Ô0Ð0àˆNØÔ+Ô7ˆÝ#%¤<µ´¸A¸{ÈFÔL^Ñ0_Ô0_Ñ#`Ô#`ˆÔ Ð Ð ó    Ú
embeddingsÚheightÚwidthc                 ó  — |j         d         }| j        j         d         }t          j                             ¦   «         s||k    r||k    r| j        S | j        }|j         d         }|| j        z  }|| j        z  }	t          |dz  ¦  «        }
|                     d|
|
|¦  «        }|                     dddd¦  «        }t          j
                             |||	fdd¬	¦  «        }|                     dddd¦  «                             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Ô6°qÔ9ˆõ Œy×#Ò#Ñ%Ô%ð 	,¨+¸Ò*FÐ*FÈ6ÐUZÊ?È?ØÔ+Ð+àÔ2ˆàÔ˜rÔ"ˆà˜tœÑ.ˆ
Ø˜Tœ_Ñ,ˆ	å& }°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ˆàÐr'   Úpixel_valuesÚbool_masked_posr@   c                 ó*  — |j         \  }}}}|                      |¦  «        }|�_|j         d         }	| j                             ||	d¦  «        }
|                     d¦  «                             |
¦  «        }|d|z
  z  |
|z  z   }|r||                      |||¦  «        z   }n^|| j        d         k    s|| j        d         k    r2t          d|› d|› d| j        d         › d| j        d         › d�	¦  «        ‚|| j	        z   }|  
                    |¦  «        }|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=   sf  € ð (4Ô'9Ñ$ˆ
�A�v˜uØ×*Ò*¨<Ñ8Ô8ˆ
àÐ&Ø#Ô)¨!Ô,ˆJØœ/×0Ò0°¸ZÈÑLÔLˆKà"×,Ò,¨RÑ0Ô0×8Ò8¸ÑEÔEˆDØ# s¨T¡zÑ2°[À4Ñ5GÑGˆJð $ð 	?Ø# 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)NF)Ú__name__Ú
__module__Ú__qualname__r   Úboolr   r    ÚTensorÚintr@   Ú
BoolTensorrQ   Ú__classcell__©r%   s   @r&   r   r      sì   ø€ € € € € ðað a˜{ð a¸Dð aÈTð að að að að að að%°5´<ð %Èð %ÐUXð %Ð]bÔ]ið %ð %ð %ð %ðT 48Ø).ð	ð à”lðð Ô)¨DÑ0ðð #'ð	ð
 
Œðð ð ð ð ð ð ð r'   r   c                   ó>   — e Zd Z ej        ¦   «         d„ ¦   «         ZdS )ÚIJepaPreTrainedModelc                 óÎ  — t          j        | |¦  «         t          |t          j        t          j        f¦  «        rJt          j        |j        d| j	        j
        ¬¦  «         |j        �t          j        |j        ¦  «         dS dS t          |t          ¦  «        rHt          j        |j        d| j	        j
        ¬¦  «         |j        �t          j        |j        ¦  «         dS dS dS )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Ô3Ð3Ý�f�rœy­"¬)Ð4Ñ5Ô5ð 	/ÝÔ˜vœ}°3¸D¼KÔ<YÐZÑZÔZÐZØŒ{Ð&Ý”˜FœKÑ(Ô(Ð(Ð(Ð(ð 'Ð&å˜¥Ñ0Ô0ð 	/ÝÔ˜vÔ9ÀÈÌÔIfÐgÑgÔgÐgØÔ Ð,Ý”˜FÔ-Ñ.Ô.Ð.Ð.Ð.ð	/ð 	/à,Ð,r'   N)rR   rS   rT   r    Úno_gradr`   © r'   r&   r\   r\   ]   s5   € € € € € à€U„]�_„_ð
/ð 
/ñ „_ð
/ð 
/ð 
/r'   r\   c                   ó.   ‡ — e Zd Zddededefˆ fd„Zˆ xZS )Ú
IJepaModelFr   Úadd_pooling_layerr   c                 ó„   •— t          ¦   «                              |¦  «         || _        t          ||¬¦  «        | _        dS )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ÑPÔPˆŒˆˆr'   )FF)rR   rS   rT   r   rU   r   rY   rZ   s   @r&   rn   rn   m   sf   ø€ € € € € ð	Qð 	Q˜{ð 	Q¸tð 	QÐ]að 	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	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                   óz   ‡ — 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                 óž   •— t          ¦   «                              |¦  «         t          |d¬¦  «        | _        |                      ¦   «          d S )NF)ro   )r   r   rn   ÚijepaÚ	post_init)r$   r   r%   s     €r&   r   z$IJepaForImageClassification.__init__‰   sE   ø€ Ý‰Œ×Ò˜Ñ Ô Ð Ý ¸%Ð@Ñ@Ô@ˆŒ
Ø�ŠÑÔÐÐÐr'   NrA   Úlabelsr@   Úkwargsr   c                 óî   —  | j         |fd|i|¤Ž}|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Øð/
ð /
à%=ð/
ð ð/
ð /
ˆð
 "Ô3ˆØ—’ ×!5Ò!5¸!Ð!5Ñ!<Ô!<Ñ=Ô=ˆàˆØÐØ%�4Ô% f¨f°d´kÐLÐLÀVÐLÐLˆDå$ØØØ!Ô/ØÔ)ð	
ñ 
ô 
ð 	
r'   )NNN)rR   rS   rT   r   r   r    rV   rU   r	   r
   r   rQ   rY   rZ   s   @r&   rs   rs   z   s°   ø€ € € € € ð˜{ð ð ð ð ð ð ð -1Ø&*Ø04ð	
ð 
à”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Ð EÐ EÐ EÐ EÐ Eà &Ð &Ð &Ð &Ð &Ð &Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ -Ð -Ð -Ð -Ð -Ð -Ø &Ð &Ð &Ð &Ð &Ð &Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ eÐ eÐ eÐ eÐ eÐ eÐ eÐ eÐ eÐ eÐ eÐ eðLð Lð Lð Lð L�mñ Lô Lð Lð^ ð/ð /ð /ð /ð /Ð-ñ /ô /ñ „ð/ð
Qð 
Qð 
Qð 
Qð 
QÐ% xñ 
Qô 
Qð 
Qð €ððñ ô ð%
ð %
ð %
ð %
ð %
Ð"6Ð8Qñ %
ô %
ñô ð%
ðPð ð €€€r'   