§
    ‚ŠtjR2  ã                   óô   — d dl mZmZ d dlmZmZ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mZ ddlmZmZ  e¦   «         rd d	lZ ej        e¦  «        Z G d
„ ded¬¦  «        Z G d„ de¦  «        ZdgZd	S )é    )ÚOptionalÚUnion)ÚIMAGE_TOKENÚPaliGemmaProcessorÚbuild_string_from_inputé   )ÚBatchFeature)Ú
ImageInputÚmake_flat_list_of_images)ÚProcessingKwargsÚUnpack)ÚPreTokenizedInputÚ	TextInput)Úis_torch_availableÚloggingNc                   ó(   — e Zd ZddidddœddidœZd	S )
ÚColPaliProcessorKwargsÚpaddingÚlongestÚchannels_firstT)Údata_formatÚdo_convert_rgbÚreturn_tensorsÚpt)Útext_kwargsÚimages_kwargsÚcommon_kwargsN)Ú__name__Ú
__module__Ú__qualname__Ú	_defaults© ó    úi/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/colpali/modular_colpali.pyr   r   !   sB   € € € € € ð �yð
ð ,Ø"ð
ð 
ð +¨DÐ1ð	ð 	€I€I€Ir#   r   F)Útotalc                   ó‚  ‡ — e Zd Z	 	 	 	 	 ddedefˆ fd„Zedefd„¦   «         Z	 	 dd	edz  d
ee	z  e
e         z  e
e	         z  dee         defd„Z	 dd	edz  dee         defd„Zd
ee
e         z  dee         defd„Z	 	 	 ddede
d         f         dede
d         f         deded         dedef         ddfd„Zˆ xZS )ÚColPaliProcessorNúDescribe the image.ú
Question: Úvisual_prompt_prefixÚquery_prefixc                 ól   •— || _         || _        t          ¦   «                              |||¬¦  «         dS )a!  
        visual_prompt_prefix (`str`, *optional*, defaults to `"Describe the image."`):
            A string that gets tokenized and prepended to the image tokens.
        query_prefix (`str`, *optional*, defaults to `"Question: "`):
            A prefix to be used for the query.
        )Úimage_processorÚ	tokenizerÚchat_templateN)r*   r+   ÚsuperÚ__init__)Úselfr-   r.   r/   r*   r+   Ú	__class__s         €r$   r1   zColPaliProcessor.__init__/   s;   ø€ ð %9ˆÔ!Ø(ˆÔÝ‰Œ×Ò¨ÀIÐ]jÐÑkÔkÐkÐkÐkr#   Úreturnc                 ó   — | j         j        S )zŠ
        Return the query augmentation token.

        Query augmentation buffers are used as reasoning buffers during inference.
        )r.   Ú	pad_token)r2   s    r$   Úquery_augmentation_tokenz)ColPaliProcessor.query_augmentation_tokenA   s   € ð Œ~Ô'Ð'r#   ÚimagesÚtextÚkwargsc                 óÞ  ‡ —  ‰ j         t          fd‰ j        j        i|¤Ž}|d                              dd¦  «        }d}|€|€t          d¦  «        ‚|�|�t          d¦  «        ‚|��)‰ j                             |¦  «        }t          |¦  «        }‰ j	        gt          |¦  «        z  }ˆ fd„|D ¦   «         }ˆ fd	„t          ||¦  «        D ¦   «         } ‰ j        |fi |d
         ¤Žd         }	|d                              dd¦  «        �|d         dxx         ‰ j        z  cc<    ‰ j        |fd|i|d         ¤Ž}
i |
¥d|	i¥}|r=|
d                              |
d         dk    d¦  «        }|                     d|i¦  «         t!          |¬¦  «        S |�Út#          |t$          ¦  «        r|g}n?t#          |t&          ¦  «        rt#          |d         t$          ¦  «        st          d¦  «        ‚|€
‰ j        dz  }g }|D ]4}‰ j        j        ‰ j        z   |z   |z   dz   }|                     |¦  «         Œ5|d                              dd¦  «        |d         d<    ‰ j        |fd|i|d         ¤Ž}|S dS )a  
        Returns:
            [`BatchFeature`]: A [`BatchFeature`] with the following fields:

            - **input_ids** -- List of token ids to be fed to a model.
            - **attention_mask** -- List of indices specifying which tokens should be attended to by the model (when
              `return_attention_mask=True` or if *"attention_mask"* is in `self.model_input_names` and if `text` is not
              `None`).
            - **pixel_values** -- Pixel values to be fed to a model. Returned when `images` is not `None`.
        Útokenizer_init_kwargsr   ÚsuffixNTz&Either text or images must be providedz5Only one of text or images can be processed at a timec                 óD   •— g | ]}‰j                              |¦  «        ‘ŒS r"   )r-   Úprocess_image)Ú.0Úimager2   s     €r$   ú
<listcomp>z-ColPaliProcessor.__call__.<locals>.<listcomp>l   s*   ø€ ÐTÐTÐTÀE�dÔ*×8Ò8¸Ñ?Ô?ÐTÐTÐTr#   c                 ó®   •— g | ]Q\  }}t          |‰j        j        ‰j        t          t          |t          ¦  «        rt          |¦  «        nd ¬¦  «        ‘ŒRS )é   )ÚpromptÚ	bos_tokenÚimage_seq_lenÚimage_tokenÚ
num_images)r   r.   rF   Úimage_seq_lengthr   Ú
isinstanceÚlistÚlen)r@   rE   Ú
image_listr2   s      €r$   rB   z-ColPaliProcessor.__call__.<locals>.<listcomp>n   so   ø€ ð 	ð 	ð 	ñ '�F˜Jõ (Ø!Ø"œnÔ6Ø"&Ô"7Ý +Ý2<¸ZÍÑ2NÔ2NÐU�s :™œ˜ÐTUðñ ô ð	ð 	ð 	r#   r   Úpixel_valuesÚ
max_lengthÚreturn_token_type_idsÚ	input_idsÚtoken_type_idsr   iœÿÿÿÚlabels)Údataz*Text must be a string or a list of stringsé
   ú
é2   )Ú_merge_kwargsr   r.   Úinit_kwargsÚpopÚ
ValueErrorr-   Úfetch_imagesr   r*   rM   ÚzipÚgetrJ   Úmasked_fillÚupdater	   rK   ÚstrrL   r7   rF   r+   Úappend)r2   r8   r9   r:   Úoutput_kwargsr=   rQ   Ú	texts_docÚinput_stringsrO   ÚinputsÚreturn_datarT   Útexts_queryÚqueryÚbatch_querys   `               r$   Ú__call__zColPaliProcessor.__call__J   sC  ø€ ð  +˜Ô*Ý"ð
ð 
à"&¤.Ô"<ð
ð ð
ð 
ˆð
 ˜}Ô-×1Ò1°(¸DÑAÔAˆà $Ðàˆ<˜F˜NÝÐEÑFÔFÐFØÐ Ð 2ÝÐTÑUÔUÐUàÑØÔ)×6Ò6°vÑ>Ô>ˆFÝ-¨fÑ5Ô5ˆFØÔ2Ð3µc¸&±k´kÑAˆIØTÐTÐTÐTÈVÐTÑTÔTˆFð	ð 	ð 	ð 	õ +.¨i¸Ñ*@Ô*@ð	ñ 	ô 	ˆMð 0˜4Ô/°ÐYÐY¸-ÈÔ:XÐYÐYÐZhÔiˆLð ˜]Ô+×/Ò/°¸dÑCÔCÐOØ˜mÔ,¨\Ð:Ð:Ô:¸dÔ>SÑSÐ:Ð:Ñ:à#�T”^Øðð à&;ðð   Ô.ðð ˆFð C˜VÐB ^°\ÐBÐBˆKà$ð 7Ø Ô,×8Ò8¸Ð@PÔ9QÐUVÒ9VÐX\Ñ]Ô]�Ø×"Ò" H¨fÐ#5Ñ6Ô6Ð6å [Ð1Ñ1Ô1Ð1àÐÝ˜$¥Ñ$Ô$ð OØ�v��Ý  ¥tÑ,Ô,ð Oµ¸DÀ¼GÅSÑ1IÔ1Ið OÝ Ð!MÑNÔNÐNàˆ~ØÔ6¸Ñ;�à%'ˆKØð *ð *�ØœÔ0°4Ô3DÑDÀuÑLÈvÑUÐX\Ñ\�Ø×"Ò" 5Ñ)Ô)Ð)Ð)à9FÀ}Ô9U×9YÒ9YÐZfÐhjÑ9kÔ9kˆM˜-Ô(¨Ñ6à(˜$œ.Øðð à&;ðð   Ô.ðð ˆKð Ðð- Ðr#   c                 ó    —  | j         dd|i|¤ŽS )a  
        Prepare for the model one or several image(s). This method is a wrapper around the `__call__` method of the ColPaliProcessor's
        [`ColPaliProcessor.__call__`].

        This method forwards the `images` and `kwargs` arguments to the image processor.

        Args:
            images (`PIL.Image.Image`, `np.ndarray`, `torch.Tensor`, `list[PIL.Image.Image]`, `list[np.ndarray]`, `list[torch.Tensor]`):
                The image or batch of images to be prepared. Each image can be a PIL image, NumPy array or PyTorch
                tensor. In case of a NumPy array/PyTorch tensor, each image should be of shape (C, H, W), where C is a
                number of channels, H and W are image height and width.
            return_tensors (`str` or [`~utils.TensorType`], *optional*):
                If set, will return tensors of a particular framework. Acceptable values are:

                - `'pt'`: Return PyTorch `torch.Tensor` objects.
                - `'np'`: Return NumPy `np.ndarray` objects.

        Returns:
            [`BatchFeature`]: A [`BatchFeature`] with the following fields:

            - **input_ids** -- List of token ids to be fed to a model.
            - **attention_mask** -- List of indices specifying which tokens should be attended to by the model (when
              `return_attention_mask=True` or if *"attention_mask"* is in `self.model_input_names` and if `text` is not
              `None`).
            - **pixel_values** -- Pixel values to be fed to a model. Returned when `images` is not `None`.
        r8   r"   ©rl   )r2   r8   r:   s      r$   Úprocess_imageszColPaliProcessor.process_images¤   s!   € ð> ˆtŒ}Ð5Ð5 FÐ5¨fÐ5Ð5Ð5r#   c                 ó    —  | j         dd|i|¤ŽS )ag  
        Prepare for the model one or several texts. This method is a wrapper around the `__call__` method of the ColPaliProcessor's
        [`ColPaliProcessor.__call__`].

        This method forwards the `text` and `kwargs` arguments to the tokenizer.

        Args:
            text (`str`, `list[str]`, `list[list[str]]`):
                The sequence or batch of sequences to be encoded. Each sequence can be a string or a list of strings
                (pretokenized string). If the sequences are provided as list of strings (pretokenized), you must set
                `is_split_into_words=True` (to lift the ambiguity with a batch of sequences).
            return_tensors (`str` or [`~utils.TensorType`], *optional*):
                If set, will return tensors of a particular framework. Acceptable values are:

                - `'pt'`: Return PyTorch `torch.Tensor` objects.
                - `'np'`: Return NumPy `np.ndarray` objects.

        Returns:
            [`BatchFeature`]: A [`BatchFeature`] with the following fields:

            - **input_ids** -- List of token ids to be fed to a model.
            - **attention_mask** -- List of indices specifying which tokens should be attended to by the model (when
              `return_attention_mask=True` or if *"attention_mask"* is in `self.model_input_names` and if `text` is not
              `None`).
        r9   r"   rn   )r2   r9   r:   s      r$   Úprocess_queriesz ColPaliProcessor.process_queriesÅ   s!   € ð< ˆtŒ}Ð1Ð1 $Ð1¨&Ð1Ð1Ð1r#   é€   ÚcpuÚquery_embeddingsztorch.TensorÚpassage_embeddingsÚ
batch_sizeÚoutput_dtypeztorch.dtypeÚoutput_deviceztorch.devicec           	      ó8  — t          |¦  «        dk    rt          d¦  «        ‚t          |¦  «        dk    rt          d¦  «        ‚|d         j        |d         j        k    rt          d¦  «        ‚|d         j        |d         j        k    rt          d¦  «        ‚|€|d         j        }g }t	          dt          |¦  «        |¦  «        D �]:}g }t
          j        j        j         	                    ||||z   …         dd¬¦  «        }	t	          dt          |¦  «        |¦  «        D ]�}
t
          j        j        j         	                    ||
|
|z   …         dd¬¦  «        }| 
                    t          j        d	|	|¦  «                             d
¬¦  «        d                              d¬¦  «        ¦  «         Œ‘| 
                    t          j        |d¬¦  «                             |¦  «                             |¦  «        ¦  «         �Œ<t          j        |d¬¦  «        S )aZ  
        Compute the late-interaction/MaxSim score (ColBERT-like) for the given multi-vector
        query embeddings (`qs`) and passage embeddings (`ps`). For ColPali, a passage is the
        image of a document page.

        Because the embedding tensors are multi-vector and can thus have different shapes, they
        should be fed as:
        (1) a list of tensors, where the i-th tensor is of shape (sequence_length_i, embedding_dim)
        (2) a single tensor of shape (n_passages, max_sequence_length, embedding_dim) -> usually
            obtained by padding the list of tensors.

        Args:
            query_embeddings (`Union[torch.Tensor, list[torch.Tensor]`): Query embeddings.
            passage_embeddings (`Union[torch.Tensor, list[torch.Tensor]`): Passage embeddings.
            batch_size (`int`, *optional*, defaults to 128): Batch size for computing scores.
            output_dtype (`torch.dtype`, *optional*, defaults to `torch.float32`): The dtype of the output tensor.
                If `None`, the dtype of the input embeddings is used.
            output_device (`torch.device` or `str`, *optional*, defaults to "cpu"): The device of the output tensor.

        Returns:
            `torch.Tensor`: A tensor of shape `(n_queries, n_passages)` containing the scores. The score
            tensor is saved on the "cpu" device.
        r   zNo queries providedzNo passages providedz/Queries and passages must be on the same devicez-Queries and passages must have the same dtypeNT)Úbatch_firstÚpadding_valuezbnd,csd->bcnsr   )Údimé   rD   )rM   r\   ÚdeviceÚdtypeÚrangeÚtorchÚnnÚutilsÚrnnÚpad_sequencerc   ÚeinsumÚmaxÚsumÚcatÚto)r2   rt   ru   rv   rw   rx   ÚscoresÚiÚbatch_scoresÚbatch_queriesÚjÚbatch_passagess               r$   Úscore_retrievalz ColPaliProcessor.score_retrievalå   s*  € õ@ ÐÑ Ô  AÒ%Ð%ÝÐ2Ñ3Ô3Ð3ÝÐ!Ñ"Ô" aÒ'Ð'ÝÐ3Ñ4Ô4Ð4à˜AÔÔ%Ð);¸AÔ)>Ô)EÒEÐEÝÐNÑOÔOÐOà˜AÔÔ$Ð(:¸1Ô(=Ô(CÒCÐCÝÐLÑMÔMÐMàÐØ+¨AÔ.Ô4ˆLà%'ˆå�q�#Ð.Ñ/Ô/°Ñ<Ô<ð 	]ñ 	]ˆAØ/1ˆLÝ!œHœNÔ.×;Ò;Ø   Q¨¡^Ð!3Ô4À$ÐVWð <ñ ô ˆMõ ˜1�cÐ"4Ñ5Ô5°zÑBÔBð ð �Ý!&¤¤Ô!3×!@Ò!@Ø& q¨1¨z©>Ð'9Ô:ÈÐ\]ð "Añ "ô "�ð ×#Ò#Ý”L °-ÀÑPÔP×TÒTÐYZÐTÑ[Ô[Ð\]Ô^×bÒbÐghÐbÑiÔiñô ð ð ð �MŠM�%œ) L°aÐ8Ñ8Ô8×;Ò;¸LÑIÔI×LÒLÈ]Ñ[Ô[Ñ\Ô\Ð\Ñ\åŒy˜ QÐ'Ñ'Ô'Ð'r#   )NNNr(   r)   )NN)N)rr   Nrs   )r   r   r    rb   r1   Úpropertyr7   r
   r   r   rL   r   r   r	   rl   ro   rq   r   Úintr   r‘   Ú__classcell__)r3   s   @r$   r'   r'   .   s  ø€ € € € € ð ØØØ$9Ø(ðlð lð
 "ðlð ðlð lð lð lð lð lð$ ð(¨#ð (ð (ð (ñ „Xð(ð %)ØZ^ðXð Xà˜TÑ!ðXð Ð+Ñ+¨d°9¬oÑ=ÀÐEVÔ@WÑWðXð Ð/Ô0ð	Xð
 
ðXð Xð Xð Xðx %)ð6ð 6à˜TÑ!ð6ð Ð/Ô0ð6ð 
ð	6ð 6ð 6ð 6ðB2à˜$˜yœ/Ñ)ð2ð Ð/Ô0ð2ð 
ð	2ð 2ð 2ð 2ðH Ø04Ø49ð>(ð >(à °°^Ô0DÐ DÔEð>(ð " .°$°~Ô2FÐ"FÔGð>(ð ð	>(ð
 ˜}Ô-ð>(ð ˜^¨SÐ0Ô1ð>(ð 
ð>(ð >(ð >(ð >(ð >(ð >(ð >(ð >(r#   r'   )Útypingr   r   Ú2transformers.models.paligemma.processing_paligemmar   r   r   Úfeature_extraction_utilsr	   Úimage_utilsr
   r   Úprocessing_utilsr   r   Útokenization_utils_baser   r   rƒ   r   r   r�   Ú
get_loggerr   Úloggerr   r'   Ú__all__r"   r#   r$   ú<module>rž      sS  ðð  #Ð "Ð "Ð "Ð "Ð "Ð "Ð "à wÐ wÐ wÐ wÐ wÐ wÐ wÐ wÐ wÐ wà 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0ð ÐÑÔð Ø€L€L€Là	ˆÔ	˜HÑ	%Ô	%€ð
ð 
ð 
ð 
ð 
Ð-°Uð 
ñ 
ô 
ð 
ðu(ð u(ð u(ð u(ð u(Ð)ñ u(ô u(ð u(ðr ð€€€r#   