
    #;7j                       U d dl mZ d dlm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mZmZmZmZmZmZ 	 d dlmZ n# e$ r
 dZded<   Y nw xY w	 d d	lmZ d d
lmZ d dlmZ d dlmZ dZn)# e$ r! dZdZded<   dZded<   dZded<   dZded<   Y nw xY w	 d dlm Z  n# e$ r
 dZ ded<   Y nw xY wd dl!Z!ddl"m#Z#  ej$        e%          Z& G d d          Z'e G d de                      Z(e G d de(e                      Z) G d de(          Z* G d d e)          Z+ G d! d"e)          Z, G d# d$e)          Z- G d% d&e.e          Z/d,d)Z0 G d* d+e)          Z1dS )-    )annotations)EnumN)Path)AnyCallableSequenceMappingIterableProtocolClassVarruntime_checkable)SentencePieceProcessorr   r   )MistralTokenizer)
Tekkenizer)_filter_valid_tokenizer_files)SentencePieceTokenizerTFr   r   r   r   )get_one_valid_tokenizer_filer      )
GGUFWriterc                      e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   d	ed<   	 	 	 d+d,dZd-dZd.d/dZd0d Zd1d!Zd2d%Z	d3d(Z
d1d)Zd1d*ZdS )4SpecialVocab	list[str]mergeszdict[str, bool]add_special_tokendict[str, int]special_token_idsz(str | Sequence[Mapping[str, str]] | Nonechat_templatezbool | Nonenormalizer_lowercasenormalizer_strip_accentsFNpathstr | os.PathLike[str]load_mergesboolspecial_token_typesIterable[str] | Nonen_vocab
int | Nonec                    i | _         i | _        || _        || _        g | _        d | _        d | _        d | _        ||| _        nd| _        | 	                    t          |                     d S )N)boseosunkseppadclsmask)r   r   r&   r"   r   r   r   r   r$   _loadr   )selfr    r"   r$   r&   s        8/home/rurouni/src/llama.cpp-master/gguf-py/gguf/vocab.py__init__zSpecialVocab.__init__:   sy    
 "$!#&!$(!(,%*':D$$'YD$

4::    returnstrc                p    d                     t          | j                  | j        pd| j        pd          S )NzG<SpecialVocab with {} merges, special tokens {}, add special tokens {}>unset)formatlenr   r   r   r1   s    r2   __repr__zSpecialVocab.__repr__M   s<    X__d4?AWAb[b
 
 	
r4   gwr   quietNonec                   | j         rM|s0t                              dt          | j                    d           |                    | j                    n!| j        rt                              d           | j                                        D ]k\  }}t          |d| dd           }|"t                              d| d| d           >|s t                              d	| d
|             ||           l| j
                                        D ]k\  }}t          |d| dd           }|"t                              d| d| d           >|s t                              d| d|             ||           l| j        >|s"t                              d| j                    |                    | j                   | j        >|s"t                              d| j                    |                    | j                   | j        @|s"t                              d| j                    |                    | j                   d S d S )NzAdding z
 merge(s).zJAdding merges requested but no merges found, output may be non-functional.add_	_token_idz"No handler for special token type z	 with id  - skippingzSetting special token type z to add_add__tokenzNo handler for add_z_token with value zSetting add_z
_token to zSetting chat_template to z Setting normalizer_lowercase to z$Setting normalizer_strip_accents to )r   loggerinfor:   add_token_mergesr"   warningr   itemsgetattrr   r   add_chat_templater   add_normalizer_lowercaser   add_normalizer_strip_accents)r1   r=   r>   typtokid
id_handlervalueadd_handlers           r2   add_to_ggufzSpecialVocab.add_to_ggufR   s   ; 	i DBc$+&6&6BBBCCC,,,, 	iNNghhh06688 	 	JC7>rCX#CXCXCXZ^7_7_J!dCddRWdddeee LJ#JJ5JJKKKJu06688 	 	JC9@E[PSE[E[E[]a9b9bK"^S^^E^^^___ CA3AA%AABBBK) NL8JLLMMM  !3444$0 \Zt?XZZ[[[''(ABBB(4 db4C`bbccc++D,IJJJJJ 54r4   r   c                    |                      |           |                     |           | j        r| j        s|                     |           d S d S d S N)_try_load_from_tokenizer_json_try_load_from_config_jsonr"   r   _try_load_merges_txt)r1   r    s     r2   r0   zSpecialVocab._loadv   sl    **4000''--- 	,DK 	,%%d+++++	, 	, 	, 	,r4   c                r   |dz  }|                                 sdS t          |dd          5 }t          |d                                          }|                    d          s|                    d           d}nd	}g }|D ]}|d	z  }|                                }|s|                    d d
          }t          |          dk    r&t          	                    |j
         d| d           m|                    |d          d|d	                     	 d d d            n# 1 swxY w Y   || _        dS )Nz
merges.txtFrutf-8encoding #r   r         z: Line z: Entry malformed, ignoring T)is_fileopennextstrip
startswithseeksplitr:   rF   rI   nameappendr   )	r1   r    merges_filefp
first_lineline_numr   linepartss	            r2   rY   z!SpecialVocab._try_load_merges_txt|   s   \)""$$ 	5+sw777 	82b"++--J((-- 


F 	8 	8Azz|| 

4++u::??NNk&6#d#dx#d#d#deeeq66E!H667777	8	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8$ ts   C*D%%D),D)rO   tidr   c           	        t          |t                    sd S |dk     rt          d| d|           | j        || j        k     r|| j        v rd S || j        |<   d S t
                              d| d| d| j         d           d S )Nr   z%invalid value for special token type : zSpecial token type z, id z out of range, must be under rC   )
isinstanceint
ValueErrorr&   r   rF   rI   )r1   rO   rs   s      r2   _set_special_tokenzSpecialVocab._set_special_token   s    #s## 	F77QSQQCQQRRR<3#5#5d,,,*-D"3'FrSrrsrrY]Yerrrsssssr4   
normalizerdictc                0   |                     d          }|dk    r	d| _        d S |dk    r	d| _        d S |dk    r&d|v r|d         | _        d|v r|d         | _        d S d S |dk    r.|                     d	g           D ]}|                     |           d S d S )
Ntype	LowercaseTStripAccentsBertNormalizer	lowercasestrip_accentsr   normalizers)getr   r   _parse_normalizer)r1   rz   normalizer_typenorms       r2   r   zSpecialVocab._parse_normalizer   s     %..00k))(,D%%%..,0D))) 000j((,6{,C)*,,0:?0K--- -,
**"}b99 - -&&t,,,, +*- -r4   c                  & d }|dz  }|                                 rt          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   | j        r,|                    di                               d          }t          |t                    r|rt          |d         t                    r|| _	        nt          |d         t                    rt          |d                   dk    rt          |d         d         t                    ret          d |D                       r:t                              d	t          t          d
          dz                        d |D             | _	        nt!          d          |                    d          x}r|                     |           |                    di           }ni }d }|dz  }	|	                                 r=t          |	d          5 }t          j        |          }d d d            n# 1 swxY w Y   |r|pi                     d          }
|pi                     d          }|pi                     d          }|pi                     d          }|
s|r	|r|x|d<   }
|s|r	|r|x|d<   }|                    d          x}r|                    d|g          D ]}|                    d          dk    rkd| j        d<   d| j        d<   d| j        d<   |s$|r"|                    d|
g          d         }||d<   |s$|r"|                    d|g          d         }||d<   |                    d          dk    rD|                    dg           }|                    d g           }d }d }t          |          d!k    rt|d                             d"i                               d#          x}rS|s|}
n||
|fvr|
s|x|d<   }
|s|x|d<   }||
|fv rdnd$| j        d<   ||
|fvrt                              d%|d&           |d'                             d"i                               d#          x}r|s|}n||k    r~d(| j        vr"t)          | j                  d)z   | _        ||d*<   nLd+| j        vr"t)          | j                  d,z   | _        ||d-<   n!t                              d.|d/|d0           |x|d<   }||k    rdnd$| j        d<   ||k    rt                              d1|d&           |r|r5|d                             d"i                               d#          |k    rd!nd}|r5|d'                             d"i                               d#          |k    rd'nd }|r|dk    s|r|t                              d2           |t+          ||                   x}r|d                             d3i                               d#          }|d'                             d3i                               d#          }|d4k    s|d5k    r!t                              d6| d7| d8           |d4k    rD|d5k    r=|d!d'         x}r0d$}|d                             d"i                               d#          x}r/|||fv r|sd}|||fvrt                              d9|d8           n$t                              d:|d         d8           t          |          dk    r|d!                             d"i                               d#          x}r-|||fv rd}|||fvrt                              d;|d8           n$t                              d<|d!         d8           || j        d<   |r	|s|r||d<   |sdS d }|d=z  }|d>z  }|                                 rt          |d          5 }|                                }d d d            n# 1 swxY w Y   t          |d?z                      d@                    x}rcdA|dBg}|D ]Z}t          |d          5 }|                    |j        |                                dB           d d d            n# 1 swxY w Y   [nd|                                 rPt          |d          5 }t          j        |                              dC          }d d d            n# 1 swxY w Y   |                    dC|          } | t          | t          t          f          r| | _        nt                              dD|	dE           | j        D ]}!|                    dF|! dG          }"t          |"t6                    r
|"| j        |!<   |                    |! dG          }#t          |#t                    r|#&nDt          |#t8                    r.|#                    dH          }$t          |$t                    s|$&nt;          &fdI|D             d           }%|                     |!|%           dS )JNtokenizer.jsonr\   r]   modelr   r   rb   c              3  (   K   | ]}|D ]}d |v V  	dS )rc   N ).0pairss      r2   	<genexpr>z=SpecialVocab._try_load_from_tokenizer_json.<locals>.<genexpr>   s3      IIDDIIqsaxIIIIIIIr4   z'Spaces in merges detected, encoding as rc      c                L    g | ]!}d                      d |D                       "S )rc   c                L    g | ]!}d                      d |D                       "S )r_   c              3  d   K   | ]+}|d k    rt          t          |          dz             n|V  ,dS rc   r   Nchrordr   cs     r2   r   zSSpecialVocab._try_load_from_tokenizer_json.<locals>.<listcomp>.<listcomp>.<genexpr>   sU       ,& ,&,- >?#XXCFFSL(9(9(91,& ,& ,& ,& ,& ,&r4   joinr   parts     r2   
<listcomp>zISpecialVocab._try_load_from_tokenizer_json.<locals>.<listcomp>.<listcomp>   sT     !" !" !" )-	 %'GG ,& ,&15,& ,& ,& %& %&!" !" !"r4   r   r   r   s     r2   r   z>SpecialVocab._try_load_from_tokenizer_json.<locals>.<listcomp>   sV     ' ' ' !%  HH!" !" 15!" !" !"	 	' ' 'r4   zUnknown tokenizer merges formatrz   added_tokensztokenizer_config.json	bos_token	cls_token	eos_token	sep_tokenpost_processor
processorsr}   RobertaProcessingTr)   r*   r,   r.   TemplateProcessingsingler   r   SpecialTokenidFzUnknown leading special token z in TemplateProcessing<single>eot)r   	eot_tokeneom)r   	eom_tokenzOverriding EOS token z with z without EOT/EOM fallback!zUnknown trailing special token z`TemplateProcessing<single> leading/trailing special tokens do not match TemplateProcessing<pair>r   ABzUnknown sequence z...z in TemplateProcessing<pair>zUnknown separator token zUnknown middle sequence zUnknown second separator token zUnknown second middle sequence zchat_template.jsonzchat_template.jinjaadditional_chat_templatesz*.jinjadefault)rk   templater   z$Bad type for chat_template field in z - ignoringrA   rE   contentc              3  t   K   | ]2}|                     d           k    |                     d          V  3dS )r   r   N)r   )r   atok
tc_contents     r2   r   z=SpecialVocab._try_load_from_tokenizer_json.<locals>.<genexpr>`  sD      ^^DDHHY<O<OS]<]<]$<]<]<]<]^^r4   )rd   re   jsonloadr"   r   rv   listr6   r   r:   anyrF   rI   r   r   rx   r   r   r$   tupleslicereadglobrl   stemr   r#   r{   rf   ry   )'r1   r    	tokenizertokenizer_filefr   rz   r   tokenizer_configtokenizer_config_filespecial_bosspecial_clsspecial_eosspecial_sepr   	processortmpl_single	tmpl_pairspecial_firstspecial_last	seq_startseq_stoptmpl_atmpl_badd_sepspecial_entrychat_template_altchat_template_jsonchat_template_jinjaadditional_templatestemplate_pathrn   r   rO   	add_entryentryentry_contentmaybe_token_idr   s'                                         @r2   rW   z*SpecialVocab._try_load_from_tokenizer_json   s2   	 00!!## "	n999 )Q IaLL	) ) ) ) ) ) ) ) ) ) ) ) ) ) ) L"w3377AAfd++ L L!&)S11 L&,#F1It44 LVAY19L9LQ[\bcd\efg\hjmQnQn9L IIFIIIII n"NN+lUXY\]`YaYadgYgUhUh+l+lmmm' ' )/' ' ' ))JKKK&]]<888z 3&&z222$==<<LLL $'> > ((** 	0+@@@ 0A#'9Q<< 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X	!+1r66{CCK+1r66{CCK+1r66{CCK+1r66{CCK J; J3C J>II - J; J3C J>II -!*/?!@!@@~ O!!/!3!3L>BR!S!S N! N!I }}V,,0CCC8<.u58<.u58<.u5* H/? H*3--}*M*Ma*PK<G,[9* H/? H*3--}*M*Ma*PK<G,[9  !}}V,,0DDD&/mmHb&A&A$-MM&"$=$=	(,'+{++a//0;A0B0B>SU0V0V0Z0Z[_0`0``} 
E'7 !d2?KK%2;:T%T%T+6 %dVc(c(8(E+6 %dVc(c(8(EHUZegrYsHsHsy~ 6u =#0k8R#R#R$*NN  4DTa  4D  4D  4D  %E  %E  %E/:2/B/B>SU/V/V/Z/Z[_/`/``| E'7 !_2>KK%1[%@%@',D4L'L'LCHIaCbCbenCn(@HS(8(E(E).d6N)N)NCHIaCbCbenCn(@HS(8(E(E(.  8O{  8O  8Odp  8O  8O  8O  )P  )P  )PR^$^$4[$AKHTXcHcHcin 6u =#/;#>#>$*NN  4DUa  4D  4D  4D  %E  %E  %E$ T-:  )Fy|?O?OP^`b?c?c?g?ghl?m?mq~?~?~  EFI-9  (Him>O>OP^`b>c>c>g>ghl>m>mq}>}>}rr  DHH - S)q..l.W_Wg &  0R  !S  !S  !S,5eIx6P6P,QQy T)21)9)9*b)I)I)M)Md)S)S)22):)::r)J)J)N)Nt)T)T#)S==FcMM$*NN3vv3v3vRX3v3v3v$w$w$w#)S==Vs]]U^_`ac_cUdHd	].3G8A!8H8HY[8\8\8`8`ae8f8f'f} %@+8[+<V+V+V_k+V6:G+8k@Z+Z+Z,2NN  <DVc  <D  <D  <D  -E  -E  -E(.7~R[\]R^7~7~7~((('*9~~':':<EaL<L<L^]_<`<`<d<dei<j<j+j= )K/<k@Z/Z/Z:>/<[R]D^/^/^06  @Oan  @O  @O  @O  1P  1P  1P,2NN  <J]fgh]i  <J  <J  <J  -K  -K  -KDKD$:5$A'. %T{ %TGW %THS(8(E A EB   	4 !$88"%::&&(( 
	F)g>>> -!$%FFHH!- - - - - - - - - - - - - - -'+T4O-O,U,UV_,`,`'a'aa# f.7EV%W%W$X!%9 f fMm@@@ fB)00-:LZ\ZaZaZcZc1d1deeef f f f f f f f f f f f f f f'')) 	F(W=== F$(IaLL$4$4_$E$E!F F F F F F F F F F F F F F F(,,_>OPP J}sDk$J$J !.DNNfBWfffggg+ 	9 	9C(,,-?C-?-?-?@@I)T** 8.7&s+$((C88E%%% "

E4((  %		) 4 4!-55 *

!^^^^L^^^ N ##C8888tsY   AAA H!!H%(H%0```0bb	!b	(d  ddc                n   |dz  }|                                 sdS t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   | j        D ]T}|                    | d          }|"d|v r|d                             | d          }|                     ||           UdS )Nzconfig.jsonFr\   r]   rB   text_configT)rd   re   r   r   r$   r   ry   )r1   r    config_filer   configrO   token_ids          r2   rX   z'SpecialVocab._try_load_from_config_jsonf  s   ]*""$$ 	5+'222 	"aYq\\F	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"+ 	3 	3CzzS"3"3"344HMV$;$;!-0445F5F5FGG##C2222ts   AAA)FNN)r    r!   r"   r#   r$   r%   r&   r'   r5   r6   )F)r=   r   r>   r#   r5   r?   )r    r   r5   r?   )r    r   r5   r#   )rO   r6   rs   r   r5   r?   )rz   r{   r5   r?   )__name__
__module____qualname____annotations__r3   r<   rT   r0   rY   ry   r   rW   rX   r   r4   r2   r   r   2   s8        &&&&%%%%;;;;%%%%)))) AF48"    &
 
 
 

"K "K "K "K "KH, , , ,   2
t 
t 
t 
t- - - -,m m m m^     r4   r   c                  $    e Zd ZU ded<   ded<   dS )	BaseVocabzClassVar[str]tokenizer_modelrk   N)r   r   r   r   r   r4   r2   r   r   u  s*         """"r4   r   c                  H    e Zd ZU ded<   ded<   ded<   ded<   dd
ZddZdS )Vocabrw   
vocab_sizer   added_tokens_dictr   added_tokens_listr   fname_tokenizer	base_pathc                    d S rV   r   )r1   r   s     r2   r3   zVocab.__init__        r4   r5   -Iterable[tuple[bytes, float, gguf.TokenType]]c                    d S rV   r   r;   s    r2   
all_tokenszVocab.all_tokens  r   r4   Nr   r   r5   r   )r   r   r   r   r3   r   r   r4   r2   r   r   {  sW         OOO%%%%    ,,,,NNNNNNr4   r   c                      e Zd ZdZdZddZdS )NoVocabno_vocabr5   r6   c                    dS )Nz3<NoVocab for a model without integrated vocabulary>r   r;   s    r2   r<   zNoVocab.__repr__  s    DDr4   Nr   )r   r   r   r   rk   r<   r   r4   r2   r   r     s8         ODE E E E E Er4   r   c                  >    e Zd ZdZdZddZddZdd	Zdd
ZddZ	dS )BpeVocabgpt2bper   r   c           
         i }|dz  x}                                 rt          |d          5 }t          j        |           _        d d d            n# 1 swxY w Y   	 t          |dz  d          5 }t          j        |          }d d d            n# 1 swxY w Y   n# t
          $ r Y nw xY w|dz  }t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   |d         }|d         dk    s(|                    d	d
          s|d         d         dk    rt          d          |d          _        |                    d          x} fd|D             }t           j                  }t          t          ||t          |          z                       }	t          |                                          }
|	|
k    r=|t          |
          z   dz
  }t          dt          |
           d| d| d|
           t          |                                d           }| _        d |D              _        | _         j        t           j                  z    _        | _        d S )Nz
vocab.jsonr\   r]   added_tokens.jsonr   r   r}   BPEbyte_fallbackFdecoder	ByteLevelzCannot find GPT-2 BPE tokenizervocabr   c                L    i | ] }|d          j         v|d          |d         !S )r   r   )r
  )r   itemr1   s     r2   
<dictcomp>z%BpeVocab.__init__.<locals>.<dictcomp>  sA      F  F  F$(#'	?$*#D#D !%Yd#D#D#Dr4   r   zExpected the z1 added token ID(s) to be sequential in the range z - z; got c                    | d         S Nr   r   )text_idxs    r2   <lambda>z#BpeVocab.__init__.<locals>.<lambda>  s
    (1+ r4   keyc                    g | ]\  }}|S r   r   )r   textidxs      r2   r   z%BpeVocab.__init__.<locals>.<listcomp>  s    $C$C$CktST$C$C$Cr4   )existsre   r   r   r
  FileNotFoundErrorr   r:   r   rangesortedvaluesrx   rJ   r   r   vocab_size_baser   r   )r1   r   r   r   r   tokenizer_jsonr   addedr   expected_ids
actual_idsexpected_end_idrJ   s   `            r2   r3   zBpeVocab.__init__  s   ')(<77O??AA  	Fo888 *A!Yq\\
* * * * * * * * * * * * * * *)&99GLLL 0PQ#'9Q<<L0 0 0 0 0 0 0 0 0 0 0 0 0 0 0$    (*::O o888 .A!%1. . . . . . . . . . . . . . . /=W.EO'500O4G4GY^4_4_0!),V4CC'(IJJJ(1DJ'++N;;;H F  F  F  F,1 F  F  F 4:
E*j3|;L;L.LMMNNl113344
:%%(3z??:Q>O SS__ S S *S S/>S SFPS S T T T |))++1M1MNNN$0$C$CU$C$C$C$.$($83t?U;V;V$V$3sY   AAA B! 4B	B! BB! BB! !
B.-B.C((C,/C,r5   r   c              #     K   d | j                                         D             }t          | j                   D ]!\  }}||         dt          j        j        fV  "d S )Nc                    i | ]\  }}||	S r   r   r   encoded_tokr   s      r2   r  z'BpeVocab.bpe_tokens.<locals>.<dictcomp>  s    SSS_["[SSSr4   g        )r
  rJ   	enumerategguf	TokenTypeNORMAL)r1   reverse_vocabi_s       r2   
bpe_tokenszBpeVocab.bpe_tokens  sn      SS
@P@P@R@RSSSdj)) 	? 	?DAq"C)>>>>>>	? 	?r4   c              #  t   K   | j         D ]-}d}|                    d          |t          j        j        fV  .d S N     @r\   )r   encoder'  r(  CONTROLr1   r  scores      r2   r   zBpeVocab.added_tokens  sR      * 	F 	FDE++g&&t~/EEEEEE	F 	Fr4   c              #  r   K   |                                  E d {V  |                                 E d {V  d S rV   )r-  r   r;   s    r2   r   zBpeVocab.all_tokens  sR      ??$$$$$$$$$$$&&&&&&&&&&&r4   r6   c                B    d| j          dt          | j                   dS )Nz<BpeVocab with  base tokens and  added tokens>r  r:   r   r;   s    r2   r<   zBpeVocab.__repr__  s)    s!5ssDLbHcHcssssr4   Nr   r   r   )
r   r   r   r   rk   r3   r-  r   r   r<   r   r4   r2   r  r    s        OD24 24 24 24h? ? ? ?F F F F
' ' ' 't t t t t tr4   r  c                  >    e Zd ZdZdZddZddZdd	Zdd
ZddZ	dS )SentencePieceVocabllamaspmr   r   c           	        t           t          d          i }|dz  x}                                rR	 t          |dz  d          5 }t	          j        |          }d d d            n# 1 swxY w Y   n=# t          $ r Y n1w xY w|j        dz  x}                                st          d          t                      | _        | j        	                    t          |                     | j                                        fd|                                D             t          t          t                    z                       }t!                                                    }||k    rt%          d| d	|           || _        fd
|D             | _        | _        | j        t          | j                  z   | _        || _        d S )Nzsentencepiece is not installedztokenizer.modelr  r\   r]   zCannot find tokenizer.modelc                (    i | ]\  }}|k    ||S r   r   )r   piecer   r   s      r2   r  z/SentencePieceVocab.__init__.<locals>.<dictcomp>  s*    ```)%rU_O_O_BO_O_O_r4   zExpected new token IDs z to be sequential; got c                     g | ]
}|         S r   r   )r   r   
new_tokenss     r2   r   z/SentencePieceVocab.__init__.<locals>.<listcomp>  s    "K"K"Kb:b>"K"K"Kr4   )r   RuntimeErrorr  re   r   r   r  parentsentencepiece_tokenizerLoadFromFiler6   r   rJ   r   r  r:   r  keysrx   r   r   r  r   )	r1   r   r   r   r   expected_new_idsactual_new_idsrB  r   s	          @@r2   r3   zSentencePieceVocab.__init__  s1   !)?@@@')(+<<<ODDFF 		C)&99GLLL 0PQ#'9Q<<L0 0 0 0 0 0 0 0 0 0 0 0 0 0 0$   %.%58I%II/QQSS 	C#$ABBB'='?'?$$11#o2F2FGGG1<<>>
````|7I7I7K7K```
j*s:2N O OPP!*//"3"344~--p7Gpp`nppqqq #/"K"K"K"KN"K"K"K","&"6T=S9T9T"T"1s5   A6 	A*A6 *A..A6 1A.2A6 6
BBr5   r   c              #  >  K   | j         }t          |                                          D ]}|                    |          }|                    d          }|                    |          }t          j        j        }|	                    |          rt          j        j
        }|                    |          rt          j        j        }|                    |          rt          j        j        }|                    |          rt          j        j        }|||fV  d S )Nr\   )rE  r  r   	IdToPiecer1  GetScorer'  r(  r)  	IsUnknownUNKNOWN	IsControlr2  IsUnusedUNUSEDIsByteBYTE)r1   r   r+  r@  r  r4  toktypes          r2   sentencepiece_tokensz'SentencePieceVocab.sentencepiece_tokens  s     0	y++--.. 	' 	'A''**E <<00D$--a00En+G""1%% 1.0""1%% 1.0 !!!$$ 0./"" ..-w&&&&&)	' 	'r4   c              #  t   K   | j         D ]-}d}|                    d          |t          j        j        fV  .d S r/  )r   r1  r'  r(  USER_DEFINEDr3  s      r2   r   zSentencePieceVocab.added_tokens  sR      * 	K 	KDE++g&&t~/JJJJJJ	K 	Kr4   c              #  r   K   |                                  E d {V  |                                 E d {V  d S rV   )rU  r   r;   s    r2   r   zSentencePieceVocab.all_tokens  sT      ,,.........$$&&&&&&&&&&&r4   r6   c                B    d| j          dt          | j                   dS )Nz<SentencePieceVocab with r7  r8  r9  r;   s    r2   r<   zSentencePieceVocab.__repr__   s+    }4+?}}RUVZVlRmRm}}}}r4   Nr   r   r   )
r   r   r   r   rk   r3   rU  r   r   r<   r   r4   r2   r;  r;    s        OD 2  2  2  2D' ' ' '0K K K K
' ' ' '~ ~ ~ ~ ~ ~r4   r;  c                  T    e Zd ZdZdZddZddZddZddZddZ	d Z
ddZddZdS )LlamaHfVocabr<  hfftr   r   c                    |dz  }t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   |d         }|d         dk    o,|                    dd          o|                    d	d
           }|rt	          d          |sC|d         dk    s(|                    d	d          r|d         d         dk    rt          d          	 ddlm} n"# t          $ r}t          d          |d }~ww xY w|	                    ||d
           _
         j
        j        sJ g  _        t                       _        t                       _        t#           j
                                                                        d           D ]S\  }	}
|
 j
        j        k    r> j                            |	           |
 j        |	<    j                            |
           T fd j
        j        D              _        t           j
        j                   _         j
        j         _         j        t9           j                  z    _        | _        d S )Nr   r\   r]   r   r}   r  ignore_mergesFr  Tz'Llama 3 must be converted with BpeVocabr  r   zCannot find Llama BPE tokenizerr   )AutoTokenizerzsTo use LlamaHfVocab, please install the `transformers` package. You can install it with `pip install transformers`.)	cache_dirlocal_files_onlyc                    | d         S r  r   )xs    r2   r  z'LlamaHfVocab.__init__.<locals>.<lambda>U  s
    AaD r4   r  c                P    i | ]"}|j                                         |         #S r   )r   	get_vocab)r   tokr1   s     r2   r  z)LlamaHfVocab.__init__.<locals>.<dictcomp>^  s>     
 
 
 ))++C0
 
 
r4   )re   r   r   r   	TypeErrorr  transformersr_  ImportErrorfrom_pretrainedr   is_fastr   r{   r   setadded_tokens_idsr  get_added_vocabrJ   r   rl   addall_special_tokensspecialsall_special_idsspecial_idsr  r:   r   )r1   r   r   r   r  r   	is_llama3r_  erf  tokidxs   `          r2   r3   zLlamaHfVocab.__init__(  s    #&66/G444 	*!Yq\\N	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* +9*AF#u, ?1D1D_V[1\1\ ?#''>>> 	  	GEFFF 	GF#u,,O4G4GY^4_4_,i(0J>>#$EFFF	2222222 	 	 	F  	 '66! 7 
 

 ~%%%% "$!%!$ "N**,,2244..
 
 
 	2 	2KC 222&--c222.4&s+%))&111
 
 
 
~8
 
 
 t~=>>  $~8#3c$:P6Q6QQ.s%   9= =C# #
D-C==Dr5   r   c              #  T  K   d | j                                                                         D             }t          | j                  D ][}|| j        v r||                             d          }||                     |          |                     ||| j	                  fV  \d S )Nc                    i | ]\  }}||	S r   r   r$  s      r2   r  z*LlamaHfVocab.hf_tokens.<locals>.<dictcomp>k  s+     
 
 
 /RB
 
 
r4   r\   )
r   re  rJ   r  r  rm  r1  get_token_scoreget_token_typers  )r1   r*  r   
token_texts       r2   	hf_tokenszLlamaHfVocab.hf_tokensj  s      
 
37>3K3K3M3M3S3S3U3U
 
 
 d233 	 	H4000 'x077@@J d228<<d>Q>Q*d&6? ?     	 	r4   r   rw   r{  bytesrs  set[int]gguf.TokenTypec                    t          j        d|          rt          j        j        S ||v rt          j        j        nt          j        j        S )Ns   <0x[0-9A-Fa-f]{2}>)re	fullmatchr'  r(  rS  r2  r)  )r1   r   r{  rs  s       r2   rz  zLlamaHfVocab.get_token_type|  sC    <.
;; 	'>&& *2[)@)@t~%%dnF[[r4   floatc                    dS )Nr0  r   )r1   r   s     r2   ry  zLlamaHfVocab.get_token_score  s	     wr4   c              #    K   | j         D ]}|| j        v rH|                     | j        |         d| j                  }|                     | j        |                   }nt
          j        j        }d}|                    d          ||fV  d S )Nr4   r0  r\   )	r   rq  rz  rs  ry  r'  r(  rW  r1  )r1   r  rT  r4  s       r2   r   zLlamaHfVocab.added_tokens  s      * 	7 	7Dt}$$--dmD.A3HXYY,,T]4-@AA.5++g&&w66666	7 	7r4   c                :    d| j         j        v pd| j         j        v S )Nz<0x0A>
)r   r
  r;   s    r2   has_newline_tokenzLlamaHfVocab.has_newline_token  s!    4>//O44>;O3OOr4   c              #  r   K   |                                  E d {V  |                                 E d {V  d S rV   )r|  r   r;   s    r2   r   zLlamaHfVocab.all_tokens  sR      >>#########$$&&&&&&&&&&&r4   r6   c                B    d| j          dt          | j                   dS )Nz<LlamaHfVocab with r7  r8  r9  r;   s    r2   r<   zLlamaHfVocab.__repr__  s*    wT%9wwCPTPfLgLgwwwwr4   Nr   r   )r   rw   r{  r}  rs  r~  r5   r  )r   rw   r5   r  r   )r   r   r   r   rk   r3   r|  rz  ry  r   r  r   r<   r   r4   r2   r[  r[  $  s        OD@/ @/ @/ @/D   $\ \ \ \   
	7 	7 	7 	7P P P' ' ' 'x x x x x xr4   r[  c                      e Zd ZdZdZdS )MistralTokenizerTyper=  tekkenN)r   r   r   r=  r  r   r4   r2   r  r    s        
CFFFr4   r  r5   dict[int, str]c            	     \   t          t          t          d          t          d          dz                       t          t          t          d          t          d          dz                       z   t          t          t          d          t          d          dz                       z   } | dd         }d	}t          d
          D ]8}|| vr2|                     |           |                    d
|z              |dz  }9d |D             }t	          t          | |                    S )a8  
    Returns list of utf-8 byte and a mapping to unicode strings. We specifically avoids mapping to whitespace/control
    characters the bpe code barfs on.

    The reversible bpe codes work on unicode strings. This means you need a large # of unicode characters in your vocab
    if you want to avoid UNKs. When you're at something like a 10B token dataset you end up needing around 5K for
    decent coverage. This is a significant percentage of your normal, say, 32K bpe vocab. To avoid that, we want lookup
    tables between utf-8 bytes and unicode strings.
    !~r      ¡   ¬   ®   ÿNr   r   c                ,    g | ]}t          |          S r   )r   )r   ns     r2   r   z$bytes_to_unicode.<locals>.<listcomp>  s    !!!c!ff!!!r4   )r   r  r   rl   r{   zip)bscsr  bcs_strs        r2   bytes_to_unicoder    s    	U3s88SXX\**++
uSYYD		A..
/
/	0
uSYYD		A..
/
/	0 
 
AAAB	A4[[  B;;IIaLLLIIdQhFA!!b!!!FB   r4   c                  h   e Zd ZU dZdZi Zded<   g Zded<   ddZe	d d            Z
e	d d            Zd!dZd!dZd"dZe	d#d            Ze	d#d            Ze	d#d            Ze	d#d            Ze	d d            Ze	d d            Ze	d d            Ze	d d            Zd!dZed             Zd ZdS )$MistralVocabmistralr   r   r   r   r   r   c                   t           st          d          t          
J d            t          
J d            t          
J d            t
                              d|            d |                    d          D             }t          t          |          }nt          |          }t          |          dk    rt          d|           t          |          dk    r=d	|v rd	}nt          |          d
         }t
                              d| d|            n|d         }||z  }t          j        |          j        j        | _        t!          | j        t                    rt"          j        nt"          j        | _        | j        j        | _        || _        d| j        j        z   dz   | j        j        z   | _        d S )NzwTo use MistralVocab, please install the `mistral-common` package. You can install it with `pip install mistral-common`.mistral_common is not installedzLoading Mistral tokenizer from c                ^    g | ]*}|                                 |                                +S r   )rd   as_posix)r   r   s     r2   r   z)MistralVocab.__init__.<locals>.<listcomp>  s-    QQQaQYY[[QQZZ\\QQQr4   z**/*r   z*No tokenizer file found in the directory: r   ztekken.jsonr   z"Multiple tokenizer files found in z. Using zmistral--)_mistral_common_installedri  r   r   r   rF   rG   r   r   r:   rx   r  rI   	from_fileinstruct_tokenizerr   rv   r  r  r=  tokenizer_typen_wordsr   r   rR   version_name)r1   r   	all_filestokenizer_file_pathvalid_tokenizer_filesr   s         r2   r3   zMistralVocab.__init__  s   ( 	H   -88:[888++-N+++%%'H%%%AiAABBB RQ9>>&+A+AQQQ	'3">y"I"I$A)$L$L!())Q.. !Yi!Y!YZZZ())A-- $999%2NN%+,A%B%B2%FN\\\N\\    "7q!9"+n"<.8
 

Y 	
 $.*55* ''%) 	
 .02,22S84>;QQ 	


r4   r5   r6   c                    | j         S rV   )r  r;   s    r2   tokenizer_namezMistralVocab.tokenizer_name  s
    zr4   c                4    | j         t          j        k    rdndS )Nr<  r  )r  r  r=  r;   s    r2   gguf_tokenizer_modelz!MistralVocab.gguf_tokenizer_model  s    -1E1IIIwwvUr4   r   c              #  T  K   t           
J d            t          | j        t                     sJ dt          | j                               t	          | j        j                                                  D ].}| j        j                            |          }|                    d          }| j        j        	                    |          }t          j        j        }| j        j                            |          rt          j        j        }| j        j                            |          rt          j        j        }| j        j                            |          rt          j        j        }| j        j                            |          rt          j        j        }|||fV  0d S )Nr  z%Expected SentencePieceTokenizer, got r\   )r   rv   r   r}   r  _modelr   rK  r1  rL  r'  r(  r)  rM  rN  rO  r2  rP  rQ  rR  rS  )r1   r+  r@  r  r4  rT  s         r2   _sentencepiece_tokensz"MistralVocab._sentencepiece_tokens  s     %113T111$.*@AA 	
 	
JD4H4HJJ	
 	
A t~,7799:: 	' 	'AN)33A66E<<((D>099!<<En+G~$..q11 1.0~$..q11 1.0~$--a00 0./~$++A.. ..-w&&&&&!	' 	'r4   c              #    K   t           
J d            t          | j        t                     sJ dt          | j                               t	                      }t          | j        j                  D ]C}| j                            |                              d          dt          j
        j        fV  D| j        j        D ]?}|                     ||                              d          dt          j
        j        fV  @d S )Nr  Expected Tekkenizer, got r\   r   )r   rv   r   r}   r  r  num_special_tokensid_to_piecer1  r'  r(  r2  _tekken_token2id_nospecialtoken_bytes_to_stringr)  )r1   byte_encoderr   tokens       r2   _tekken_tokenszMistralVocab._tekken_tokens  s)     %%'H%%%$.*55 	
 	
>T^(<(<>>	
 	
5 ())dn?@@ 	 	H**844;;GDD&    
 ^> 	 	E**5,??FFwOO%    	 	r4   r  rw   c                   t           t          
J d            | j        t          j        k    r;t          | j        t                     sJ | j        j                            |          S | j        t          j	        k    rHt          | j        t                    sJ | j        j                            |          | j        j
        z   S t          d| j                   )Nr  Unknown tokenizer type: )r   r   r  r  r=  rv   r   _vocabindexr  r  rx   )r1   r  s     r2   get_token_idzMistralVocab.get_token_id.  s    %1j6L6LNo6L6LL"6":::dn.DEEEEE>(..u555 $8$???dnj99999%++E22T^5VV M8KMMNNNr4   c                    | j         j        S rV   )r   bos_idr;   s    r2   r  zMistralVocab.bos_id;      ~$$r4   c                    | j         j        S rV   )r   eos_idr;   s    r2   r  zMistralVocab.eos_id?  r  r4   c                H    | j         j        dk    r| j        S | j         j        S )Nr   )r   pad_idr  r;   s    r2   r  zMistralVocab.pad_idC  s%    > B&&;~$$r4   c                    | j         j        S rV   )r   unk_idr;   s    r2   r  zMistralVocab.unk_idI  r  r4   c                J    | j                             | j         j                  S rV   )r   r  r  r;   s    r2   r   zMistralVocab.bos_tokenM      ~))$.*?@@@r4   c                J    | j                             | j         j                  S rV   )r   r  r  r;   s    r2   r   zMistralVocab.eos_tokenQ  r  r4   c                J    | j                             | j         j                  S rV   )r   r  r  r;   s    r2   	pad_tokenzMistralVocab.pad_tokenU  r  r4   c                J    | j                             | j         j                  S rV   )r   r  r  r;   s    r2   	unk_tokenzMistralVocab.unk_tokenY  r  r4   c              #     K   | j         t          j        k    r|                                 E d {V  d S | j         t          j        k    r|                                 E d {V  d S t          d| j                    )Nr  )r  r  r=  r  r  r  rx   r;   s    r2   r   zMistralVocab.all_tokens]  s      "6":::1133333333333 $8$???**,,,,,,,,,,, M8KMMNNNr4   c                l    d                     fd|                     d          D                       S )Nr_   c                :    g | ]}t          |                   S r   )r   )r   charr  s     r2   r   z6MistralVocab.token_bytes_to_string.<locals>.<listcomp>i  s$    PPPDSYY/PPPr4   latin-1)r   decode)r  r  s    `r2   r  z"MistralVocab.token_bytes_to_stringg  s6    wwPPPPAHHY<O<OPPPQQQr4   c           	     "    t           t           j        t                     sJ dt           j                                j        j        j        d                                 D             }g }t          d j         j        j	        z
            D ]}||         }g }t          dt          |                    D ]=}|d |         }||d          }|v r#|v r||z   v r|                    |||f           >|s(t          d| d|                    d                     t          |fdd	
          }|                    |           t          |d d	
          }t!                       fd|D             }	d |	D             }
|
S )Nr  c                    i | ]\  }}||	S r   r   )r   token_bytesranks      r2   r  z@MistralVocab.extract_vocab_merges_from_model.<locals>.<dictcomp>r  s+     
 
 
"3+tD+
 
 
r4   r   r   z-Could not find valid merge for token at rank ru   r  c                <    | d                  | d                  fS )Nr   r   r   )rc  mergeable_rankss    r2   r  z>MistralVocab.extract_vocab_merges_from_model.<locals>.<lambda>  s    qt4oad6KL r4   F)r  reversec                    | d         S )Nrb   r   )vals    r2   r  z>MistralVocab.extract_vocab_merges_from_model.<locals>.<lambda>  s
    #a& r4   c                    g | ]:}                     |d                                         |d                   g;S )r   r   )r  )r   r  r  r1   s     r2   r   z@MistralVocab.extract_vocab_merges_from_model.<locals>.<listcomp>  s[     
 
 

  **3q6<@@**3q6<@@
 
 
r4   c                L    g | ]!}d                      d |D                       "S )rc   c                L    g | ]!}d                      d |D                       "S )r_   c              3  d   K   | ]+}|d k    rt          t          |          dz             n|V  ,dS r   r   r   s     r2   r   zUMistralVocab.extract_vocab_merges_from_model.<locals>.<listcomp>.<listcomp>.<genexpr>  sA      OOQcCA---qOOOOOOr4   r   r   s     r2   r   zKMistralVocab.extract_vocab_merges_from_model.<locals>.<listcomp>.<listcomp>  sE         GGOO$OOOOO  r4   r   r   s     r2   r   z@MistralVocab.extract_vocab_merges_from_model.<locals>.<listcomp>  sV     	
 	
 	
  HH  !%   	
 	
 	
r4   )r   rv   r   r}   r  _mergeable_ranksrJ   r  r   r  r:   rl   rx   r  r  extendr  )r1   token_bytes_mapmerge_pairsr+  merged_tokenlocaljleftrightdecoded_merge_pairsr   r  r  s   `          @@r2   extract_vocab_merges_from_modelz,MistralVocab.extract_vocab_merges_from_modelk  s*    %*T^Z*P*P%%>T^(<(<>> &%P ./@
 
7F7L7L7N7N
 
 
  sDOdn.OOPP 	& 	&A*1-LE1c,//00 3 3#BQB'$QRR(O++00/99LL$q!1222  iAiiI\I\]fIgIgii   LLLL  E
 u%%%%[.@.@%PPP'))
 
 
 
 

 #
 
 
	
 	
 ,	
 	
 	
 r4   Nr   r   r   )r  r6   r5   rw   )r5   rw   )r   r   r   r   rk   r   r   r   r3   propertyr  r  r  r  r  r  r  r  r  r   r   r  r  r   staticmethodr  r  r   r4   r2   r  r    s2        OD(*****#%%%%%0
 0
 0
 0
d    X V V V XV' ' ' '0   (O O O O % % % X% % % % X% % % % X%
 % % % X% A A A XA A A A XA A A A XA A A A XAO O O O R R \R: : : : :r4   r  )r5   r  )2
__future__r   enumr   r  loggingr   ospathlibr   typingr   r   r   r	   r
   r   r   r   sentencepiecer   ri  r   (mistral_common.tokens.tokenizers.mistralr   'mistral_common.tokens.tokenizers.tekkenr   &mistral_common.tokens.tokenizers.utilsr   .mistral_common.tokens.tokenizers.sentencepiecer   r  r   r'  gguf_writerr   	getLoggerr   rF   r   r   r   r   r  r;  r[  r6   r  r  r  r   r4   r2   <module>r     sa   " " " " " " "       				   				       d d d d d d d d d d d d d d d d d d d d'4444444 ' ' '"&&&&&&&'%IIIIIIBBBBBB           !%  . . . %     J"&&&&&)-!------.-        - - -(, ,,,,,,-
  # # # # # #		8	$	$@ @ @ @ @ @ @ @F
        
 O O O O OIx O O OE E E E Ei E E EHt Ht Ht Ht Htu Ht Ht HtVH~ H~ H~ H~ H~ H~ H~ H~Vxx xx xx xx xx5 xx xx xxv    3   ! ! ! !4d d d d d5 d d d d ds5   A   AAA. .#BBB B.-B.