Ë
    ÛÓ^js`  ã                   ó  — d dl Z d dlmZ d dlmZmZmZ d dlZd dl	Z	ddl
mZ ddlmZmZ ddlmZmZmZmZ ddlmZmZmZ dd	lmZ dd
lmZ erddlmZ  G d„ ded¬«      Z ed¬«      e G d„ de«      «       «       ZdgZy)é    N)Ú
accumulate)ÚTYPE_CHECKINGÚOptionalÚUnioné   )ÚBatchFeature)Ú
ImageInputÚis_valid_image)ÚMultiModalDataÚProcessingKwargsÚProcessorMixinÚUnpack)Ú
AddedTokenÚBatchEncodingÚ	TextInput)Úauto_docstring)Úrequires)ÚPreTokenizedInputc                   ó(   — e Zd ZddiddddœddidœZy	)
ÚColModernVBertProcessorKwargsÚpaddingÚlongestTÚchannels_first)Úreturn_row_col_infoÚdata_formatÚdo_convert_rgbÚreturn_tensorsÚpt)Útext_kwargsÚimages_kwargsÚcommon_kwargsN)Ú__name__Ú
__module__Ú__qualname__Ú	_defaults© ó    ú‡/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/colmodernvbert/processing_colmodernvbert.pyr   r   (   s/   „ ð �yð
ð $(Ø+Ø"ñ
ð
 +¨DÐ1ñ
�Ir'   r   F)Útotal)Útorch)Úbackendsc                   ó"  ‡ — e Zd ZeZ	 	 	 	 	 d dededz  dedz  fˆ fd„Ze	 	 	 d!de	e
e	   z  e
e
e	      z  deede
e   e
d   f   dedz  d	ee   d
ef
d„«       Z	 	 d"de	dz  deede
e   e
d   f   d	ee   fd„Z	 	 d"de	dz  deede
e   e
d   f   d	ee   fˆ fd„Zdeded
efd„Zde
de
e   d
e
e
e      fd„Zd#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 )%ÚColModernVBertProcessorNÚimage_seq_lenÚvisual_prompt_prefixÚquery_prefixc                 ó¨  •— d}t        ddd¬«      j                  | _        t        ddd¬«      j                  | _        t        ddd¬«      j                  | _        d| _        || _        |j                  | j                  «      | _        |j                  | j                  «      | _	        |j                  | j
                  «      | _
        t        d	«      D ��	cg c]0  }t        d	«      D ]   }	|j                  d
|dz   › d|	dz   › d�«      ‘Œ" Œ2 c}	}| _        t        j                  d«      | _        d| j                  | j                  | j                  gi}
|j!                  |
«       |j                  | j                  «      | _        t#        ‰| �H  ||fd|i|¤Ž |xs d| j                  › d�| _        |xs d| _        | j                  | _        yc c}	}w )a‚  
        image_seq_len (`int`, *optional*, defaults to 64):
            The length of the image sequence i.e. the number of <image> tokens per image in the input.
        visual_prompt_prefix (`str`, *optional*):
            A string that gets tokenized and prepended to the image tokens.
        query_prefix (`str`, *optional*):
            A prefix to be used for the query.
        Nz<fake_token_around_image>FT)Ú
normalizedÚspecialz<image>z<end_of_utterance>z<global-img>é   ú<row_é   Ú_col_ú>z*(\n?<global-img>\n?|<row_\d+_col_\d+>\n?)+Úadditional_special_tokensÚchat_templatez<|begin_of_text|>User:z0Describe the image.<end_of_utterance>
Assistant:Ú )r   ÚcontentÚfake_image_tokenÚimage_tokenÚend_of_utterance_tokenÚglobal_image_tagr.   Úconvert_tokens_to_idsÚimage_token_idÚfake_image_token_idÚglobal_image_token_idÚrangeÚrow_col_idsÚreÚcompileÚ%_regex_to_remove_extra_special_tokensÚadd_special_tokensÚsuperÚ__init__r/   r0   Úquery_augmentation_token)ÚselfÚimage_processorÚ	tokenizerr:   r.   r/   r0   ÚkwargsÚiÚjÚtokens_to_addÚ	__class__s              €r(   rL   z ColModernVBertProcessor.__init__;   sÒ  ø€ ð$ ˆÜ *Ð+FÐSXÐbfÔ g× oÑ oˆÔÜ% i¸EÈ4ÔP×XÑXˆÔÜ&0Ð1EÐRWÐaeÔ&f×&nÑ&nˆÔ#Ø .ˆÔØ*ˆÔØ'×=Ñ=¸d×>NÑ>NÓOˆÔØ#,×#BÑ#BÀ4×CXÑCXÓ#YˆÔ Ø%.×%DÑ%DÀT×EZÑEZÓ%[ˆÔ"äSXÐYZÓS[÷
ØNOÔejÐklÓemò
Ø`aˆI×+Ñ+¨e°A¸±E°7¸%ÀÀAÁ¸wÀaÐ,HÕIð
ØIó
ˆÔô 68·Z±ZÐ@mÓ5nˆÔ2ð (Ø×%Ñ%Ø× Ñ Ø×+Ñ+ð*ð
ˆð 	×$Ñ$ ]Ô3Ø'×=Ñ=¸d×>NÑ>NÓOˆÔä‰Ñ˜¨)Ñ[À=Ð[ÐTZÒ[à$8ò %
Ø$ T×%5Ñ%5Ð$6Ð6gÐhð 	Ô!ð )Ò.¨BˆÔØ(,×(CÑ(CˆÕ%ùó1
s   Ã5GÚimagesÚtextr   rQ   Úreturnc                 óä  —  | j                   d||dœ|¤Ž\  }} | j                  d||dœ|¤Ž  | j                  t        fd| j                  j
                  i|¤Ž}|�|n| j                  }|d   j                  dd«      }|d   j                  dd«      }|d   j                  dd«      }i x}	}
|�� | j                  |fi |d	   ¤Ž\  }	}|	j                  d
d«       |	j                  dd«       |�ñ| j                  ||¬«      \  }} | j                  |fi |d   ¤Ž}
|r||
d<   g }t        |«      D ]e  \  }}g }|D ]H  }|d   \  }}|
j                  ||«      }|
j                  ||dz
  «      }|j                  ||z
  dz   «       ŒJ |j                  |«       Œg |r| j                  |
d   |«      |
d<   | j                  ||
dg¬«       n|� | j                  dd|i|d   ¤Ž}
t        i |
¥|	¥|¬«      S )a  
        image_seq_len (`int`, *optional*):
            The length of the image sequence. If not provided, the default value of self.image_seq_len is used.
            image_seq_len should be equal to int(((image_size // patch_size) ** 2) / (scale_factor**2))
        )rV   rW   Útokenizer_init_kwargsNr   Úreturn_text_replacement_offsetsFÚreturn_mm_token_type_idsr   r    ÚrowsÚcols)Úimages_replacementsÚtext_replacement_offsetsÚnew_spanr6   Ú	input_idsÚmm_token_type_idsÚimage)Ú
modalitiesrW   )ÚdataÚtensor_typer&   )Úprepare_inputs_layoutÚvalidate_inputsÚ_merge_kwargsr   rP   Úinit_kwargsr.   ÚpopÚ_process_imagesÚget_text_with_replacementsÚ	enumerateÚchar_to_tokenÚappendÚcreate_mm_token_type_idsÚ_check_special_mm_tokensr   )rN   rV   rW   r.   rQ   Úoutput_kwargsr[   r\   r   Úimage_inputsÚtext_inputsr_   r`   Úbatch_image_seq_lengthsÚbatch_idÚtext_replacement_offsetÚimage_seq_lensrf   ÚstartÚendÚstart_id_posÚ
end_id_poss                         r(   Ú__call__z ColModernVBertProcessor.__call__p   s‡  € ð 2�t×1Ñ1ÐU¸ÀdÑUÈfÑU‰ˆ�Øˆ×ÑÐ@ F°Ñ@¸Ò@à*˜×*Ñ*Ü)ñ
à"&§.¡.×"<Ñ"<ð
ð ñ
ˆð *7Ð)B™È×HZÑHZˆØ*7¸Ñ*F×*JÑ*JÐKlÐnsÓ*tÐ'Ø#0°Ñ#?×#CÑ#CÐD^Ð`eÓ#fÐ Ø& }Ñ5×9Ñ9Ð:JÈDÓQˆà%'Ð'ˆ�{ØÑØ0D°×0DÑ0DÀVÑ0nÈ}Ð]lÑOmÑ0nÑ-ˆLÐ-ð ×Ñ˜V TÔ*Ø×Ñ˜V TÔ*àÐØ15×1PÑ1PØÐ.Að 2Qó 2Ñ.�Ð.ð -˜dŸn™n¨TÑR°]À=Ñ5QÑR�Ù2Ø>V�KÐ :Ñ;à*,Ð'Ü9BÐC[Ó9\ò CÑ5�HÐ5Ø%'�NØ 7ò M˜Ø%)¨*Ñ%5™
˜˜sØ'2×'@Ñ'@ÀÈ5Ó'Q˜Ø%0×%>Ñ%>¸xÈÈqÉÓ%Q˜
à&×-Ñ-¨j¸<Ñ.GÈ!Ñ.KÕLðMð ,×2Ñ2°>ÕBðCñ ,Ø7;×7TÑ7TØ# KÑ0Ð2Ió8�KÐ 3Ñ4ð ×-Ñ-¨d°KÈWÈIÐ-ÕVàÐØ(˜$Ÿ.™.ÑS¨dÐS°mÀMÑ6RÑSˆKäÐ!@ KÐ!@°<Ð!@ÈnÔ]Ð]r'   c                 óB  — |�#t        |t        «      r|g}|j                  «       }|�ë| j                  j	                  |«      }t        |«      r|gg}||fS t        |t        t        f«      r§t        |d   «      r™|�”|D �cg c]  }|j                  | j                  «      ‘Œ }}dgt        t        |«      «      z   }t        t        |«      «      D �cg c]  }|||   ||dz       ‘Œ }}t        |«      |d   kD  r|||d   d  gz   }||fS |}||fS |g}||fS c c}w c c}w )Nr   r6   éÿÿÿÿ)Ú
isinstanceÚstrÚcopyrO   Úfetch_imagesr
   ÚlistÚtupleÚcountr>   r   rE   Úlen)	rN   rV   rW   rQ   ÚsampleÚn_images_in_textÚcumsum_images_in_textrR   Úsplit_imagess	            r(   rh   z-ColModernVBertProcessor.prepare_inputs_layout±   sk  € ð ÐÜ˜$¤Ô$Ø�v�Ø—9‘9“;ˆDàÐØ×)Ñ)×6Ñ6°vÓ>ˆFÜ˜fÔ%Ø!˜(˜�ð$ �tˆ|Ðô# ˜F¤T¬5 MÔ2´~ÀfÈQÁiÔ7PØÐ#àUYÖ'ZÈ6¨¯©°T×5EÑ5EÕ(FÐ'ZÐ$Ð'ZØ-.¨C´$´zÐBRÓ7SÓ2TÑ,TÐ)ô "'¤sÐ+;Ó'<Ó!=ö$àð Ð4°QÑ7Ð:OÐPQÐTUÑPUÑ:VÒWð$�Lð $ô
 ˜6“{Ð%:¸2Ñ%>Ò>Ø!-°Ð8MÈbÑ8QÐ8SÐ1TÐ0UÑ!U˜ð �tˆ|Ðð	 ".˜ð �tˆ|Ðð %˜X�Fà�tˆ|Ðùò ([ùò$s   Â "DÃDc                 ó®  •— t        ‰| �  ||fi |¤Ž |€|€t        d«      ‚|�¨|D �cg c]  }|j                  | j                  «      ‘Œ }}|�J|D �cg c]  }t        |«      ‘Œ }}||k7  r,t        d| j                  › d|› d| j                  › d|› d�	«      ‚y |€1t        |«      r%t        dt        |«      › d| j                  › d�«      ‚y y y c c}w c c}w )	Nz+You must provide either `text` or `images`.zThe total number of zP tokens in the prompts should be the same as the number of images passed. Found ú z tokens and z images per sample.zFound z. tokens in the text but no images were passed.)rK   ri   Ú
ValueErrorrˆ   r>   r‰   ÚanyÚsum)	rN   rV   rW   rQ   rŠ   r‹   ÚsublistÚn_images_in_imagesrU   s	           €r(   ri   z'ColModernVBertProcessor.validate_inputsÓ   s  ø€ ô 	‰Ñ ¨Ñ7°Ò7àˆ<˜F˜NÜÐJÓKÐKàÐØMQÖRÀ6 §¡¨T×-=Ñ-=Õ >ÐRÐÐRØÐ!ØBHÖ%I°w¤c¨'¥lÐ%IÐ"Ð%IØ#Ð'9Ò9Ü$Ø.¨t×/?Ñ/?Ð.@ð A"Ø"2Ð!3°1°T×5EÑ5EÐ4FÀlÐSeÐRfÐfyð{óð ð :ð
 �¤CÐ(8Ô$9Ü ØœSÐ!1Ó2Ð3°1°T×5EÑ5EÐ4FÐFtÐuóð ð %:�ð ùÚRùâ%Is   ¨"CÁCru   Ú	image_idxc           	      óŒ  — |d   D ��cg c]  }|D ]  }|‘Œ Œ c}}|   }|d   D ��cg c]  }|D ]  }|‘Œ Œ c}}|   }|dk(  rI|dk(  rD| j                   › | j                  › z   | j                  › | j                  z  z   | j                   › z   S d}	t	        |«      D ]R  }
t	        |«      D ]=  }|	| j                   › d|
dz   › d|dz   › d�z   | j                  › | j                  z  z   z  }	Œ? |	d	z  }	ŒT |	d	| j                   › �| j                  › z   | j                  › | j                  z  z   | j                   › z   z  }	|	S c c}}w c c}}w )
Nr]   r^   r   r;   r5   r6   r7   r8   ú
)r=   r@   r>   r.   rE   )rN   ru   r•   Úrow_listÚrowÚ
image_rowsÚcol_listÚcolÚ
image_colsÚtext_split_imagesÚn_hÚn_ws               r(   Úreplace_image_tokenz+ColModernVBertProcessor.replace_image_tokenì   s­  € Ø*6°vÑ*>×S˜hÈ(ÒSÀ3’cÐS�cÓSÐT]Ñ^ˆ
Ø*6°vÑ*>×S˜hÈ(ÒSÀ3’cÐS�cÓSÐT]Ñ^ˆ
Ø˜Š?˜z¨Qšà×(Ñ(Ð)Ø×*Ñ*Ð+ñ-à×%Ñ%Ð&¨$×*<Ñ*<Ñ<ñ=ð ×*Ñ*Ð+ñ-ðð !#ÐÜ˜ZÓ(ò *�Ü  Ó,ò �CØ%Ø×0Ñ0Ð1Ø! #¨¡' ¨%°°a±¨y¸Ð:ñ;à!×-Ñ-Ð.°$×2DÑ2DÑDñEñÑ%ðð " TÑ)Ñ!ð*ð Ø�T×*Ñ*Ð+Ð,Ø×*Ñ*Ð+ñ-à×%Ñ%Ð&¨$×*<Ñ*<Ñ<ñ=ð ×*Ñ*Ð+ñ-ñÐð %Ð$ùó5 TùÛSs
   ‰D:¨E rb   rw   c                 óŽ  — g }t        |«      D ]´  \  }}t        j                  ||   «      }t        j                  |«      }t        j                  || j
                  k(  «      d   }d}	|D ]7  }
|	t        |«      k\  r n'||	   }||
z   }d||| t        j                  ||«      }	Œ9 |j                  |j                  «       «       Œ¶ |S )Nr   r6   )
ro   ÚnpÚarrayÚ
zeros_likeÚwhererC   r‰   Úsearchsortedrq   Útolist)rN   rb   rw   rc   rR   Úseq_lengthsÚ	array_idsÚmm_token_typesÚimage_start_positionsrS   Úseq_lenr{   r|   s                r(   rr   z0ColModernVBertProcessor.create_mm_token_type_ids	  sÛ   € ð ÐÜ'Ð(?Ó@ò 	>‰NˆAˆ{ÜŸ™ ¨1¡Ó.ˆIÜŸ]™]¨9Ó5ˆNÜ$&§H¡H¨Y¸$×:RÑ:RÑ-RÓ$SÐTUÑ$VÐ!ØˆAØ&ò @�ØœÐ1Ó2Ò2ÙØ-¨aÑ0�Ø˜g‘o�Ø,-�˜u SÐ)Ü—O‘OÐ$9¸3Ó?‘ð@ð ×$Ñ$ ^×%:Ñ%:Ó%<Õ=ð	>ð !Ð r'   c                 ó   — i }|�ût         j                  j                  di «      }|j                  |«       |D �cg c]   } | j                  j
                  g |¢|‘­Ž ‘Œ" }}| j                  dz   }| j                  dz   }t        | j                  dd¬«      d   «      dz
  }	g }
g }|D ]B  \  }}}||z  dz   }|d	kD  r|	nd	}|
j                  ||z   ||z  z   «       |j                  |«       ŒD |j                  |
|d
œ«       t        di |¤ŽS c c}w )a»  
        Computes the number of placeholder tokens needed for multimodal inputs with the given sizes.

        Args:
            image_sizes (`list[list[int]]`, *optional*):
                The input sizes formatted as (height, width) per each image.

        Returns:
            `MultiModalData`: A `MultiModalData` object holding number of tokens per each of the provided
            input modalities, along with other useful data.
        r    r   é   z

F)rJ   rb   r6   r   )Únum_image_tokensÚnum_image_patchesr&   )r   r%   ÚgetÚupdaterO   Úget_number_of_image_patchesr.   r‰   rP   rq   r   )rN   Úimage_sizesrQ   Úvision_datar    Ú
image_sizeÚnum_image_row_colsÚbase_image_lengthÚ
col_lengthÚextra_split_newliner°   r±   Únum_patchesÚnum_rowsÚnum_colsÚ
row_lengthÚsplit_extras                    r(   Ú_get_num_multimodal_tokensz2ColModernVBertProcessor._get_num_multimodal_tokens  sR  € ð ˆØÐ"Ü9×CÑC×GÑGÈÐY[Ó\ˆMØ× Ñ  Ô(ð #.ö"àð A�×$Ñ$×@Ñ@Ð\À*Ð\ÈmÔ\ð"Ðð "ð
 !%× 2Ñ 2°QÑ 6ÐØ×+Ñ+¨aÑ/ˆJô
 #& d§n¡n°VÐPU nÓ&VÐWbÑ&cÓ"dÐghÑ"hÐØ!ÐØ "Ðà3Eò 6Ñ/�˜X xØ'¨(Ñ2°QÑ6�
Ø5=À²\Ñ1Àq�Ø ×'Ñ'Ð(9¸KÑ(GÈ:ÐX`ÑK`Ñ(aÔbØ!×(Ñ(¨Õ5ð	6ð ×ÑÐ4DÐ[lÑmÔnäÑ, Ñ,Ð,ùò/"s   º%Dc                 óv  —  | j                   t        fd| j                  j                  i|¤Ž}|d   j	                  dd«      }|du}t        |«      r|g}n^t        |t        «      rt        |d   «      rn?t        |t        «      r$t        |d   t        «      rt        |d   d   «      st        d«      ‚|D �cg c]  }|j                  d«      ‘Œ }}| j                  | j                  gt        |«      z  ||d   |d   ¬	«      }|r.|d
   j                  |d   dk(  d«      }|j                  d|i«       |S c c}w )a  
        Prepare for the model one or several image(s). Handles input validation, RGB conversion,
        and prepends the `visual_prompt_prefix` to each image. Optionally computes labels from
        `token_type_ids` when a `suffix` is provided in `text_kwargs`.

        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`.
        rZ   r   ÚsuffixNr   zAimages must be an image, list of images or list of list of imagesÚRGBr    )rW   rV   r    r   rb   Útoken_type_idsiœÿÿÿÚlabels)rj   r   rP   rk   rl   r
   r‚   r†   r�   Úconvertr   r/   r‰   Úmasked_fillr³   )	rN   rV   rQ   rt   rÃ   Úreturn_token_type_idsrd   Ú	batch_docrÆ   s	            r(   Úprocess_imagesz&ColModernVBertProcessor.process_imagesI  s[  € ð< +˜×*Ñ*Ü)ñ
à"&§.¡.×"<Ñ"<ð
ð ñ
ˆð ˜}Ñ-×1Ñ1°(¸DÓAˆà &¨dÐ 2Ðô ˜&Ô!Ø�X‰FÜ˜¤Ô%¬.¸À¹Ô*CØÜ˜V¤TÔ*¬z¸&À¹)ÄTÔ/JÌ~Ð^dÐefÑ^gÐhiÑ^jÔOkÜÐ`ÓaÐað 5;Ö;¨5�%—-‘- Õ&Ð;ˆÐ;ð —M‘MØ×+Ñ+Ð,¬s°6«{Ñ:ØØ'¨Ñ8Ø% mÑ4ð	 "ó 
ˆ	ñ !Ø˜{Ñ+×7Ñ7¸	ÐBRÑ8SÐWXÑ8XÐZ^Ó_ˆFØ×Ñ˜h¨Ð/Ô0àÐùò <s   Â8D6c                 ó¦  —  | j                   t        fd| j                  j                  i|¤Ž}|d   j	                  dd«      }t        |t        «      r|g}n.t        |t        «      rt        |d   t        «      st        d«      ‚|€| j                  dz  }|D �cg c]  }| j                  |z   |z   ‘Œ }}| j                  |d|d   ¬	«      }|S c c}w )
ad  
        Prepare for the model one or several text queries. Handles input validation, prepends the
        `query_prefix`, and appends query augmentation tokens (used to pad query embeddings for
        better late-interaction retrieval performance).

        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`).
        rZ   r   rÃ   Nr   z*Text must be a string or a list of stringsé
   F)rW   rÉ   r   )rj   r   rP   rk   rl   r‚   rƒ   r†   r�   rM   r0   r   )rN   rW   rQ   rt   rÃ   ÚqueryÚtexts_queryÚbatch_querys           r(   Úprocess_queriesz'ColModernVBertProcessor.process_queries‹  sï   € ð: +˜×*Ñ*Ü)ñ
à"&§.¡.×"<Ñ"<ð
ð ñ
ˆð ˜}Ñ-×1Ñ1°(¸DÓAˆä�dœCÔ Ø�6‰DÜ˜T¤4Ô(¬Z¸¸Q¹ÄÔ-EÜÐIÓJÐJð ˆ>Ø×2Ñ2°RÑ7ˆFð SWÖ!WÈ $×"3Ñ"3°eÑ";¸fÓ"DÐ!WˆÐ!Wà—m‘mØØ"'Ø% mÑ4ð $ó 
ˆð Ðùò "Xs   ÂCÚquery_embeddingsztorch.TensorÚpassage_embeddingsÚ
batch_sizeÚoutput_dtypeztorch.dtypeÚoutput_deviceztorch.devicec           	      óà  — t        |«      dk(  rt        d«      ‚t        |«      dk(  rt        d«      ‚|d   j                  |d   j                  k7  rt        d«      ‚|d   j                  |d   j                  k7  rt        d«      ‚|€|d   j                  }g }t	        dt        |«      |«      D �]%  }g }t
        j                  j                  j                  j                  ||||z    dd¬«      }	t	        dt        |«      |«      D ]‡  }
t
        j                  j                  j                  j                  ||
|
|z    dd¬«      }|j                  t        j                  d|	|«      j                  d	¬
«      d   j                  d¬
«      «       Œ‰ |j                  t        j                  |d¬
«      j                  |«      j                  |«      «       �Œ( t        j                  |d¬
«      S )a[  
        Compute the late-interaction/MaxSim score (ColBERT-like) for the given multi-vector
        query embeddings (`qs`) and passage embeddings (`ps`). For ColQwen2, 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 dtypeT)Úbatch_firstÚpadding_valuezbnd,csd->bcnsr   )Údimr¯   r6   )r‰   r�   ÚdeviceÚdtyperE   r*   ÚnnÚutilsÚrnnÚpad_sequencerq   ÚeinsumÚmaxr’   ÚcatÚto)rN   rÒ   rÓ   rÔ   rÕ   rÖ   ÚscoresrR   Úbatch_scoresÚbatch_queriesrS   Úbatch_passagess               r(   Úscore_retrievalz'ColModernVBertProcessor.score_retrievalÄ  sâ  € ô@ ÐÓ  AÒ%ÜÐ2Ó3Ð3ÜÐ!Ó" aÒ'ÜÐ3Ó4Ð4à˜AÑ×%Ñ%Ð);¸AÑ)>×)EÑ)EÒEÜÐNÓOÐOà˜AÑ×$Ñ$Ð(:¸1Ñ(=×(CÑ(CÒCÜÐLÓMÐMàÐØ+¨AÑ.×4Ñ4ˆLà%'ˆä�qœ#Ð.Ó/°Ó<ó 	]ˆAØ/1ˆLÜ!ŸH™HŸN™N×.Ñ.×;Ñ;Ø   Q¨¡^Ð4À$ÐVWð <ó ˆMô ˜1œcÐ"4Ó5°zÓBò �Ü!&§¡§¡×!3Ñ!3×!@Ñ!@Ø& q¨1¨z©>Ð:ÈÐ\]ð "Aó "�ð ×#Ñ#Ü—L‘L °-ÀÓP×TÑTÐYZÐTÓ[Ð\]Ñ^×bÑbÐghÐbÓiõð	ð �M‰Mœ%Ÿ)™) L°aÔ8×;Ñ;¸LÓI×LÑLÈ]Ó[Ö\ð	]ô �y‰y˜ QÔ'Ð'r'   )NNé@   NN)NNN)NN)N)é€   NÚcpu)r"   r#   r$   r   Úvalid_processor_kwargsÚintrƒ   rL   r   r	   r†   r   r   r   r   r   rh   r   ri   Údictr¡   rr   rÁ   r   rË   rÑ   r   ré   Ú__classcell__)rU   s   @r(   r-   r-   6   s¨  ø„ ð ;Ðð
 ØØØ+/Ø#'ñ3Dð
 ð3Dð " D™jð3Dð ˜D‘jõ3Dðj ð JNØbfØ$(ñ	>^à˜T *Ñ-Ñ-°°T¸*Ñ5EÑ0FÑFð>^ð �IÐ2°D¸±OÀTÐJ]ÑE^Ð^Ñ_ð>^ð ˜T‘zð	>^ð
 Ð6Ñ7ð>^ð 
ò>^ó ð>^ðD %)Øbfñ à˜TÑ!ð ð �IÐ2°D¸±OÀTÐJ]ÑE^Ð^Ñ_ð ð Ð6Ñ7ó	 ðH %)Øbfñà˜TÑ!ðð �IÐ2°D¸±OÀTÐJ]ÑE^Ð^Ñ_ðð Ð)Ñ*õ	ð2%°ð %Àð %Èó %ð:!°$ð !ÐQUÐVYÑQZð !Ð_cÐdhÐilÑdmÑ_nó !ó*)-ðZ %)ñ@à˜TÑ!ð@ð Ð6Ñ7ð@ð 
ó	@ðD7à˜$˜y™/Ñ)ð7ð Ð6Ñ7ð7ð 
ó	7ðz Ø04Ø49ñ>(à °°^Ñ0DÐ DÑEð>(ð " .°$°~Ñ2FÐ"FÑGð>(ð ð	>(ð
 ˜}Ñ-ð>(ð ˜^¨SÐ0Ñ1ð>(ð 
÷>(r'   r-   ) rG   Ú	itertoolsr   Útypingr   r   r   Únumpyr£   r*   Úfeature_extraction_utilsr   Úimage_utilsr	   r
   Úprocessing_utilsr   r   r   r   Útokenization_utils_baser   r   r   rÞ   r   Úutils.import_utilsr   r   r   r-   Ú__all__r&   r'   r(   ú<module>rú      s~   ðó* 
Ý  ß 1Ñ 1ã Û å 4ß 5ß XÓ Xß KÑ KÝ #Ý *ñ Ý<ôÐ$4¸Eõ ñ 
�:ÔØôJ(˜nó J(ó ó ðJ(ðZ %Ð
%�r'   