§
    ‚ŠtjÎ7  ã                   ó  — d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
ZddlmZ ddlmZ erddlmZ dd	lmZmZ dd
lmZ  ej        e¦  «        ZddiZdZ ed¬¦  «         G d„ de¦  «        ¦   «         ZdgZdS )z$Tokenization class for SigLIP model.é    N)Úcopyfile)ÚTYPE_CHECKINGÚAnyé   )Ú
AddedToken)ÚSentencePieceBackend)Ú	TextInput)ÚloggingÚrequires_backends)ÚrequiresÚ
vocab_filezspiece.modelu   â–�)Úsentencepiece)Úbackendsc            
       ó  ‡ — e Zd ZdZeZddgZ	 	 	 	 	 	 	 d'd	eee	f         dz  d
dfˆ fd„Z
ed„ ¦   «         Zd„ Z	 d(dee         dee         dz  ded
ee         fˆ fd„Zdee         d
ee         fd„Z	 d)dee         dee         dz  d
ee         fd„Z	 d)dee         dee         dz  d
ee         fd„Zd„ Zd„ Zded
efd„Zddœd„Zd*ddd
ee         fˆ fd„Zed„ ¦   «         Zd „ Zd!„ Zd"„ Zd#„ Zd)d$ed%edz  d
ee         fd&„Z ˆ xZ!S )+ÚSiglipTokenizeraè  
    Construct a Siglip tokenizer. Based on [SentencePiece](https://github.com/google/sentencepiece).

    This tokenizer inherits from [`PreTrainedTokenizer`] which contains most of the main methods. Users should refer to
    this superclass for more information regarding those methods.

    Args:
        vocab_file (`str`):
            [SentencePiece](https://github.com/google/sentencepiece) file (generally has a *.spm* extension) that
            contains the vocabulary necessary to instantiate a tokenizer.
        eos_token (`str`, *optional*, defaults to `"</s>"`):
            The end of sequence token.
        unk_token (`str`, *optional*, defaults to `"<unk>"`):
            The unknown token. A token that is not in the vocabulary cannot be converted to an ID and is set to be this
            token instead.
        pad_token (`str`, *optional*, defaults to `"</s>"`):
            The token used for padding, for example when batching sequences of different lengths.
        additional_special_tokens (`list[str]`, *optional*):
            Additional special tokens used by the tokenizer.
        sp_model_kwargs (`dict`, *optional*):
            Will be passed to the `SentencePieceProcessor.__init__()` method. The [Python wrapper for
            SentencePiece](https://github.com/google/sentencepiece/tree/master/python) can be used, among other things,
            to set:

            - `enable_sampling`: Enable subword regularization.
            - `nbest_size`: Sampling parameters for unigram. Invalid for BPE-Dropout.

              - `nbest_size = {0,1}`: No sampling is performed.
              - `nbest_size > 1`: samples from the nbest_size results.
              - `nbest_size < 0`: assuming that nbest_size is infinite and samples from the all hypothesis (lattice)
                using forward-filtering-and-backward-sampling algorithm.

            - `alpha`: Smoothing parameter for unigram sampling, and dropout probability of merge operations for
              BPE-dropout.
        model_max_length (`int`, *optional*, defaults to 64):
            The maximum length (in number of tokens) for model inputs.
        do_lower_case (`bool`, *optional*, defaults to `True`):
            Whether or not to lowercase the input when tokenizing.
    Ú	input_idsÚattention_maskú</s>ú<unk>Né@   TÚsp_model_kwargsÚreturnc	                 óœ  •— t          | d¦  «         t          |t          ¦  «        rt          |dddd¬¦  «        n|}t          |t          ¦  «        rt          |dddd¬¦  «        n|}t          |t          ¦  «        rt          |dddd¬¦  «        n|}|€i n|| _        || _         t          ¦   «         j        d|||||| j        ||dœ|	¤Ž d S )NÚprotobufTF)ÚrstripÚlstripÚ
normalizedÚspecial)r   Ú	eos_tokenÚ	unk_tokenÚ	pad_tokenÚadditional_special_tokensr   Úmodel_max_lengthÚdo_lower_case© )r   Ú
isinstanceÚstrr   r   r$   ÚsuperÚ__init__)Úselfr   r   r    r!   r"   r   r#   r$   ÚkwargsÚ	__class__s             €úl/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/siglip/tokenization_siglip.pyr)   zSiglipTokenizer.__init__X   s#  ø€ õ 	˜$ 
Ñ+Ô+Ð+õ ˜)¥SÑ)Ô)ð�J�y¨°dÀuÐVZÐ[Ñ[Ô[Ð[àð 	õ ˜)¥SÑ)Ô)ð�J�y¨°dÀuÐVZÐ[Ñ[Ô[Ð[àð 	õ ˜)¥SÑ)Ô)ð�J�y¨°dÀuÐVZÐ[Ñ[Ô[Ð[àð 	ð &5Ð%<˜r˜rÀ/ˆÔØ*ˆÔà�‰ŒÔð 
	
Ø!ØØØØ&?Ø Ô0Ø-Ø'ð
	
ð 
	
ð ð
	
ð 
	
ð 
	
ð 
	
ð 
	
ó    c                 ó4   — | j                              ¦   «         S ©N)Úsp_modelÚget_piece_size©r*   s    r-   Ú
vocab_sizezSiglipTokenizer.vocab_size…   s   € àŒ}×+Ò+Ñ-Ô-Ð-r.   c                 ó|   ‡ — ˆ fd„t          ‰ j        ¦  «        D ¦   «         }|                     ‰ j        ¦  «         |S )Nc                 ó<   •— i | ]}‰                      |¦  «        |“ŒS r%   )Úconvert_ids_to_tokens)Ú.0Úir*   s     €r-   ú
<dictcomp>z-SiglipTokenizer.get_vocab.<locals>.<dictcomp>Š   s)   ø€ ÐRÐRÐR°a�×+Ò+¨AÑ.Ô.°ÐRÐRÐRr.   )Úranger4   ÚupdateÚadded_tokens_encoder)r*   Úvocabs   ` r-   Ú	get_vocabzSiglipTokenizer.get_vocab‰   s@   ø€ ØRÐRÐRÐR½5ÀÄÑ;QÔ;QÐRÑRÔRˆØ�Š�TÔ.Ñ/Ô/Ð/Øˆr.   FÚtoken_ids_0Útoken_ids_1Úalready_has_special_tokensc                 óà   •— |r$t          ¦   «                              ||d¬¦  «        S |€dgt          |¦  «        z  dgz   S dgt          |¦  «        z  dgz   dgt          |¦  «        z  z   dgz   S )aÄ  
        Retrieve sequence ids from a token list that has no special tokens added. This method is called when adding
        special tokens using the tokenizer `prepare_for_model` method.

        Args:
            token_ids_0 (`list[int]`):
                List of IDs.
            token_ids_1 (`list[int]`, *optional*):
                Optional second list of IDs for sequence pairs.
            already_has_special_tokens (`bool`, *optional*, defaults to `False`):
                Whether or not the token list is already formatted with special tokens for the model.

        Returns:
            `list[int]`: A list of integers in the range [0, 1]: 1 for a special token, 0 for a sequence token.
        T)r@   rA   rB   Nr   é   )r(   Úget_special_tokens_maskÚlen)r*   r@   rA   rB   r,   s       €r-   rE   z'SiglipTokenizer.get_special_tokens_maskŽ   s‘   ø€ ð$ &ð 	Ý‘7”7×2Ò2Ø'°[Ð]að 3ñ ô ð ð
 ÐØ�C�#˜kÑ*Ô*Ñ*¨q¨cÑ1Ð1Ø�•c˜+Ñ&Ô&Ñ&¨1¨#Ñ-°!°µs¸;Ñ7GÔ7GÑ1GÑHÈAÈ3ÑNÐNr.   Ú	token_idsc                 óž   — t          |¦  «        dk    r0|d         | j        k    rt          j        d| j        › d�¦  «         |S || j        gz   S )z.Do not add eos again if user already added it.r   éÿÿÿÿzThis sequence already has zQ. In future versions this behavior may lead to duplicated eos tokens being added.)rF   Úeos_token_idÚwarningsÚwarnr   )r*   rG   s     r-   Ú_add_eos_if_not_presentz'SiglipTokenizer._add_eos_if_not_presentª   si   € åˆy‰>Œ>˜AÒÐ )¨B¤-°4Ô3DÒ"DÐ"DÝŒMð+¨T¬^ð +ð +ð +ñô ð ð Ðà Ô 1Ð2Ñ2Ð2r.   c                 óz   — | j         g}|€t          ||z   ¦  «        dgz  S t          ||z   |z   |z   ¦  «        dgz  S )aÇ  
        Create a mask from the two sequences passed to be used in a sequence-pair classification task. T5 does not make
        use of token type ids, therefore a list of zeros is returned.

        Args:
            token_ids_0 (`list[int]`):
                List of IDs.
            token_ids_1 (`list[int]`, *optional*):
                Optional second list of IDs for sequence pairs.

        Returns:
            `list[int]`: List of zeros.
        Nr   )rJ   rF   )r*   r@   rA   Úeoss       r-   Ú$create_token_type_ids_from_sequencesz4SiglipTokenizer.create_token_type_ids_from_sequencesµ   sS   € ð  Ô Ð!ˆàÐÝ�{ SÑ(Ñ)Ô)¨Q¨CÑ/Ð/Ý�; Ñ$ {Ñ2°SÑ8Ñ9Ô9¸Q¸CÑ?Ð?r.   c                 óh   — |                       |¦  «        }|€|S |                       |¦  «        }||z   S )a‚  
        Build model inputs from a sequence or a pair of sequence for sequence classification tasks by concatenating and
        adding special tokens. A sequence has the following format:

        - single sequence: `X </s>`
        - pair of sequences: `A </s> B </s>`

        Args:
            token_ids_0 (`list[int]`):
                List of IDs to which the special tokens will be added.
            token_ids_1 (`list[int]`, *optional*):
                Optional second list of IDs for sequence pairs.

        Returns:
            `list[int]`: List of [input IDs](../glossary#input-ids) with the appropriate special tokens.
        )rM   )r*   r@   rA   s      r-   Ú build_inputs_with_special_tokensz0SiglipTokenizer.build_inputs_with_special_tokensË   sA   € ð& ×2Ò2°;Ñ?Ô?ˆØÐØÐà×6Ò6°{ÑCÔCˆKØ Ñ,Ð,r.   c                 óB   — | j                              ¦   «         }d |d<   |S )Nr1   )Ú__dict__Úcopy)r*   Ústates     r-   Ú__getstate__zSiglipTokenizer.__getstate__å   s$   € Ø”×"Ò"Ñ$Ô$ˆØ ˆˆjÑØˆr.   c                 ó¶   — || _         t          | d¦  «        si | _        t          j        di | j        ¤Ž| _        | j                             | j        ¦  «         d S )Nr   r%   )rT   Úhasattrr   ÚspmÚSentencePieceProcessorr1   ÚLoadr   )r*   Úds     r-   Ú__setstate__zSiglipTokenizer.__setstate__ê   s_   € ØˆŒõ �tÐ.Ñ/Ô/ð 	&Ø#%ˆDÔ åÔ2ÐJÐJ°TÔ5IÐJÐJˆŒØŒ×Ò˜4œ?Ñ+Ô+Ð+Ð+Ð+r.   Útextc                 ót   — |                      t                               ddt          j        ¦  «        ¦  «        S )NÚ )Ú	translater'   Ú	maketransÚstringÚpunctuation)r*   r_   s     r-   Úremove_punctuationz"SiglipTokenizer.remove_punctuationô   s'   € Ø�~Š~�cŸmšm¨B°µFÔ4FÑGÔGÑHÔHÐHr.   ©Úkeep_punctuation_exact_stringc                ó*  ‡ — ‰ j         r|                     ¦   «         }|r5|                     ˆ fd„|                     |¦  «        D ¦   «         ¦  «        }n‰                      |¦  «        }t          j        dd|¦  «        }|                     ¦   «         }|S )a•  Returns canonicalized `text` (puncuation removed).

        Args:
            text (`str`):
                String to be canonicalized.
            keep_punctuation_exact_string (`str`, *optional*):
                If provided, then this exact string is kept. For example providing '{}' will keep any occurrences of '{}'
                (but will still remove '{' and '}' that appear separately).
        c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r0   )rf   )r8   Úpartr*   s     €r-   ú	<genexpr>z4SiglipTokenizer.canonicalize_text.<locals>.<genexpr>  sB   øè è € ð 6ð 6Ø26�×'Ò'¨Ñ-Ô-ð6ð 6ð 6ð 6ð 6ð 6r.   z\s+ú )r$   ÚlowerÚjoinÚsplitrf   ÚreÚsubÚstrip)r*   r_   rh   s   `  r-   Úcanonicalize_textz!SiglipTokenizer.canonicalize_textø   s©   ø€ ð Ôð 	 Ø—:’:‘<”<ˆDà(ð 	1Ø0×5Ò5ð 6ð 6ð 6ð 6Ø:>¿*º*ÐEbÑ:cÔ:cð6ñ 6ô 6ñ ô ˆDˆDð ×*Ò*¨4Ñ0Ô0ˆDÝŒv�f˜c 4Ñ(Ô(ˆØ�zŠz‰|Œ|ˆàˆr.   r	   c                 óø   •—  t          ¦   «         j        t          |                     t          d¦  «        z   fi |¤Ž}t	          |¦  «        dk    r*|d         t          k    r|d         | j        v r
|dd…         }|S )z8
        Converts a string to a list of tokens.
        rm   rD   r   N)r(   ÚtokenizeÚSPIECE_UNDERLINEÚreplacerF   Úall_special_tokens)r*   r_   Úadd_special_tokensr+   Útokensr,   s        €r-   rv   zSiglipTokenizer.tokenize  s{   ø€ ð "•‘”Ô!Õ"2°T·\²\ÕBRÐTWÑ5XÔ5XÑ"XÐcÐcÐ\bÐcÐcˆåˆv‰;Œ;˜Š?ˆ?˜v aœyÕ,<Ò<Ð<ÀÈÄÈdÔNeÐAeÐAeØ˜A˜B˜B”ZˆFØˆr.   c                 ót   — t          | j                             t          | j        ¦  «        ¦  «        ¦  «        S r0   )rF   r1   Úencoder'   r    r3   s    r-   Úunk_token_lengthz SiglipTokenizer.unk_token_length  s*   € å�4”=×'Ò'­¨D¬NÑ(;Ô(;Ñ<Ô<Ñ=Ô=Ð=r.   c                 ó  — |                       |d¬¦  «        }| j                             |t          ¬¦  «        }| j                             | j        |z   t          ¬¦  «        }t          |¦  «        | j        k    r|| j        d…         n|S )u*  
        Returns a tokenized string.

        We de-activated the `add_dummy_prefix` option, thus the sentencepiece internals will always strip any
        SPIECE_UNDERLINE.

        For example: `self.sp_model.encode(f"{SPIECE_UNDERLINE}Hey", out_type = str)` will give `['H', 'e', 'y']` instead of `['â–�He', 'y']`.

        Thus we always encode `f"{unk_token}text"` and strip the `unk_token`. Here is an example with `unk_token = "<unk>"` and `unk_token_length = 4`.
        `self.tokenizer.sp_model.encode("<unk> Hey", out_type = str)[4:]`.
        Nrg   )Úout_type)rt   r1   r}   r'   r    rF   r~   )r*   r_   r+   r{   s       r-   Ú	_tokenizezSiglipTokenizer._tokenize  s†   € ð ×%Ò% dÈ$Ð%ÑOÔOˆØ”×%Ò% dµSÐ%Ñ9Ô9ˆð ”×%Ò% d¤n°tÑ&;ÅcÐ%ÑJÔJˆå25°f±+´+ÀÔAVÒ2VÐ2Vˆv�dÔ+Ð-Ð-Ô.Ð.Ð\bÐbr.   c                 ó6   — | j                              |¦  «        S )z0Converts a token (str) in an id using the vocab.)r1   Úpiece_to_id)r*   Útokens     r-   Ú_convert_token_to_idz$SiglipTokenizer._convert_token_to_id2  s   € àŒ}×(Ò(¨Ñ/Ô/Ð/r.   c                 ó:   — | j                              |¦  «        }|S )z=Converts an index (integer) in a token (str) using the vocab.)r1   Ú	IdToPiece)r*   Úindexr„   s      r-   Ú_convert_id_to_tokenz$SiglipTokenizer._convert_id_to_token6  s   € à”×'Ò'¨Ñ.Ô.ˆØˆr.   c                 ó  — g }d}d}|D ]N}|| j         v r,|s|dz  }|| j                             |¦  «        |z   z  }d}g }Œ7|                     |¦  «         d}ŒO|| j                             |¦  «        z  }|                     ¦   «         S )z:Converts a sequence of tokens (string) in a single string.ra   Frm   T)ry   r1   ÚdecodeÚappendrs   )r*   r{   Úcurrent_sub_tokensÚ
out_stringÚprev_is_specialr„   s         r-   Úconvert_tokens_to_stringz(SiglipTokenizer.convert_tokens_to_string;  s·   € àÐØˆ
ØˆØð 
	(ð 
	(ˆEà˜Ô/Ð/Ð/Ø&ð &Ø #Ñ%�JØ˜dœm×2Ò2Ð3EÑFÔFÈÑNÑN�
Ø"&�Ø%'Ð"Ð"à"×)Ò)¨%Ñ0Ô0Ð0Ø"'��Ø�d”m×*Ò*Ð+=Ñ>Ô>Ñ>ˆ
Ø×ÒÑ!Ô!Ð!r.   Úsave_directoryÚfilename_prefixc                 óâ  — t           j                             |¦  «        s t                               d|› d�¦  «         d S t           j                             ||r|dz   ndt          d         z   ¦  «        }t           j                             | j        ¦  «        t           j                             |¦  «        k    r:t           j         	                    | j        ¦  «        rt          | j        |¦  «         nzt           j         	                    | j        ¦  «        sVt          |d¦  «        5 }| j                             ¦   «         }|                     |¦  «         d d d ¦  «         n# 1 swxY w Y   |fS )NzVocabulary path (z) should be a directoryú-ra   r   Úwb)ÚosÚpathÚisdirÚloggerÚerrorro   ÚVOCAB_FILES_NAMESÚabspathr   Úisfiler   Úopenr1   Úserialized_model_protoÚwrite)r*   r‘   r’   Úout_vocab_fileÚfiÚcontent_spiece_models         r-   Úsave_vocabularyzSiglipTokenizer.save_vocabularyN  sw  € ÝŒw�}Š}˜^Ñ,Ô,ð 	Ý�LŠLÐT¨^ÐTÐTÐTÑUÔUÐUØˆFÝœŸšØ°oÐM˜_¨sÑ2Ð2È2ÕQbÐcoÔQpÑpñ
ô 
ˆõ Œ7�?Š?˜4œ?Ñ+Ô+­r¬w¯ª¸~Ñ/NÔ/NÒNÐNÕSUÔSZ×SaÒSaÐbfÔbqÑSrÔSrÐNÝ�T”_ nÑ5Ô5Ð5Ð5Ý”—’ ¤Ñ0Ô0ð 	/Ý�n dÑ+Ô+ð /¨rØ'+¤}×'KÒ'KÑ'MÔ'MÐ$Ø—’Ð-Ñ.Ô.Ð.ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /ð Ð Ð s   Ä(/E#Å#E'Å*E')r   r   r   NNr   T)NFr0   )F)"Ú__name__Ú
__module__Ú__qualname__Ú__doc__r›   Úvocab_files_namesÚmodel_input_namesÚdictr'   r   r)   Úpropertyr4   r?   ÚlistÚintÚboolrE   rM   rP   rR   rW   r^   rf   rt   rv   r~   r�   r…   r‰   r�   Útupler¤   Ú__classcell__)r,   s   @r-   r   r   +   s  ø€ € € € € ð&ð &ðP *ÐØ$Ð&6Ð7Ðð
 ØØØ"&Ø15ØØð+
ð +
ð ˜c 3˜hœ¨$Ñ.ð+
ð 
ð+
ð +
ð +
ð +
ð +
ð +
ðZ ð.ð .ñ „Xð.ðð ð ð puðOð OØ œ9ðOØ37¸´9¸tÑ3CðOØhlðOà	ˆcŒðOð Oð Oð Oð Oð Oð8	3°°c´ð 	3¸tÀC¼yð 	3ð 	3ð 	3ð 	3ð GKð@ð @Ø œ9ð@Ø37¸´9¸tÑ3Cð@à	ˆcŒð@ð @ð @ð @ð. GKð-ð -Ø œ9ð-Ø37¸´9¸tÑ3Cð-à	ˆcŒð-ð -ð -ð -ð4ð ð ð
,ð ,ð ,ðI sð I¨sð Ið Ið Ið Ið HLð ð ð ð ð ð0ð ˜[ð ÐQUÐVYÔQZð ð ð ð ð ð ð ð>ð >ñ „Xð>ðcð cð cð(0ð 0ð 0ðð ð ð
"ð "ð "ð&!ð !¨cð !ÀCÈ$ÁJð !ÐZ_Ð`cÔZdð !ð !ð !ð !ð !ð !ð !ð !r.   r   )r¨   r–   rq   rd   rK   Úshutilr   Útypingr   r   r   rZ   Útokenization_utils_baser   Ú tokenization_utils_sentencepiecer   r	   Úutilsr
   r   Úutils.import_utilsr   Ú
get_loggerr¥   r™   r›   rw   r   Ú__all__r%   r.   r-   ú<module>rº      sU  ðð +Ð *à 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à Ð Ð Ð à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø DÐ DÐ DÐ DÐ DÐ Dð ð 5Ø4Ð4Ð4Ð4Ð4Ð4Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø *Ð *Ð *Ð *Ð *Ð *ð 
ˆÔ	˜HÑ	%Ô	%€à! >Ð2Ð ð Ð ð 
€Ð%Ð&Ñ&Ô&ðq!ð q!ð q!ð q!ð q!Ð*ñ q!ô q!ñ 'Ô&ðq!ðh	 Ð
€€€r.   