

'''simple docstring'''
import unittest

from transformers import SPIECE_UNDERLINE, XLNetTokenizer, XLNetTokenizerFast
from transformers.testing_utils import get_tests_dir, require_sentencepiece, require_tokenizers, slow

from ...test_tokenization_common import TokenizerTesterMixin


_UpperCAmelCase  :		str  =		get_tests_dir('''fixtures/test_sentencepiece.model''')

@require_sentencepiece
@require_tokenizers
class 						__magic_name__   (							_UpperCamelCase ,				unittest.TestCase ):
 UpperCamelCase__     =       XLNetTokenizer
 UpperCamelCase__     =       XLNetTokenizerFast
 UpperCamelCase__     =       True
 UpperCamelCase__     =       True







 def 						_A(       self   ):
   super().setUp()

   # We have a SentencePiece fixture for testing
   lowercase									=XLNetTokenizer(snake_case_  , keep_accents=snake_case_   )
   tokenizer.sanitize_special_tokens()
   tokenizer.save_pretrained(self.tmpdirname   )







 def 						_A(       self   ):
   lowercase									="<s>"
   lowercase									=1

   self.assertEqual(self.get_tokenizer()._convert_token_to_id(snake_case_   )  , snake_case_   )
   self.assertEqual(self.get_tokenizer()._convert_id_to_token(snake_case_   )  , snake_case_   )







 def 						_A(       self   ):
   lowercase									=list(self.get_tokenizer().get_vocab().keys()   )

   self.assertEqual(vocab_keys[0]  , '''<unk>'''   )
   self.assertEqual(vocab_keys[1]  , '''<s>'''   )
   self.assertEqual(vocab_keys[-1]  , '''<eod>'''   )
   self.assertEqual(len(snake_case_   )  , 10_06   )







 def 						_A(       self   ):
   self.assertEqual(self.get_tokenizer().vocab_size  , 10_00   )







 def 						_A(       self   ):
   lowercase									=XLNetTokenizer(snake_case_  , keep_accents=snake_case_   )

   lowercase									=tokenizer.tokenize('''This is a test'''   )
   self.assertListEqual(snake_case_  , ['''▁This''', '''▁is''', '''▁a''', '''▁t''', '''est''']   )

   self.assertListEqual(tokenizer.convert_tokens_to_ids(snake_case_   )  , [2_85, 46, 10, 1_70, 3_82]   )

   lowercase									=tokenizer.tokenize('''I was born in 92000, and this is falsé.'''   )
   self.assertListEqual(
       snake_case_  , [
           SPIECE_UNDERLINE + '''I''',
           SPIECE_UNDERLINE + '''was''',
           SPIECE_UNDERLINE + '''b''',
           '''or''',
           '''n''',
           SPIECE_UNDERLINE + '''in''',
           SPIECE_UNDERLINE + '''''',
           '''9''',
           '''2''',
           '''0''',
           '''0''',
           '''0''',
           ''',''',
           SPIECE_UNDERLINE + '''and''',
           SPIECE_UNDERLINE + '''this''',
           SPIECE_UNDERLINE + '''is''',
           SPIECE_UNDERLINE + '''f''',
           '''al''',
           '''s''',
           '''é''',
           '''.''',
       ]  , )
   lowercase									=tokenizer.convert_tokens_to_ids(snake_case_   )
   self.assertListEqual(snake_case_  , [8, 21, 84, 55, 24, 19, 7, 0, 6_02, 3_47, 3_47, 3_47, 3, 12, 66, 46, 72, 80, 6, 0, 4]   )

   lowercase									=tokenizer.convert_ids_to_tokens(snake_case_   )
   self.assertListEqual(
       snake_case_  , [
           SPIECE_UNDERLINE + '''I''',
           SPIECE_UNDERLINE + '''was''',
           SPIECE_UNDERLINE + '''b''',
           '''or''',
           '''n''',
           SPIECE_UNDERLINE + '''in''',
           SPIECE_UNDERLINE + '''''',
           '''<unk>''',
           '''2''',
           '''0''',
           '''0''',
           '''0''',
           ''',''',
           SPIECE_UNDERLINE + '''and''',
           SPIECE_UNDERLINE + '''this''',
           SPIECE_UNDERLINE + '''is''',
           SPIECE_UNDERLINE + '''f''',
           '''al''',
           '''s''',
           '''<unk>''',
           '''.''',
       ]  , )







 def 						_A(       self   ):
   lowercase									=XLNetTokenizer(snake_case_  , do_lower_case=snake_case_   )
   lowercase									=tokenizer.tokenize('''I was born in 92000, and this is falsé.'''   )
   self.assertListEqual(
       snake_case_  , [
           SPIECE_UNDERLINE + '''''',
           '''i''',
           SPIECE_UNDERLINE + '''was''',
           SPIECE_UNDERLINE + '''b''',
           '''or''',
           '''n''',
           SPIECE_UNDERLINE + '''in''',
           SPIECE_UNDERLINE + '''''',
           '''9''',
           '''2''',
           '''0''',
           '''0''',
           '''0''',
           ''',''',
           SPIECE_UNDERLINE + '''and''',
           SPIECE_UNDERLINE + '''this''',
           SPIECE_UNDERLINE + '''is''',
           SPIECE_UNDERLINE + '''f''',
           '''al''',
           '''se''',
           '''.''',
       ]  , )
   self.assertListEqual(tokenizer.tokenize('''H\u00E9llo'''   )  , ['''▁he''', '''ll''', '''o''']   )







 def 						_A(       self   ):
   lowercase									=XLNetTokenizer(snake_case_  , do_lower_case=snake_case_   )
   lowercase									=tokenizer.tokenize('''I was born in 92000, and this is falsé.'''   )
   self.assertListEqual(
       snake_case_  , [
           SPIECE_UNDERLINE + '''I''',
           SPIECE_UNDERLINE + '''was''',
           SPIECE_UNDERLINE + '''b''',
           '''or''',
           '''n''',
           SPIECE_UNDERLINE + '''in''',
           SPIECE_UNDERLINE + '''''',
           '''9''',
           '''2''',
           '''0''',
           '''0''',
           '''0''',
           ''',''',
           SPIECE_UNDERLINE + '''and''',
           SPIECE_UNDERLINE + '''this''',
           SPIECE_UNDERLINE + '''is''',
           SPIECE_UNDERLINE + '''f''',
           '''al''',
           '''se''',
           '''.''',
       ]  , )







 @slow
 def 						_A(       self   ):
   lowercase									=XLNetTokenizer.from_pretrained('''xlnet-base-cased'''   )

   lowercase									=tokenizer.encode('''sequence builders'''  , add_special_tokens=snake_case_   )
   lowercase									=tokenizer.encode('''multi-sequence build'''  , add_special_tokens=snake_case_   )

   lowercase									=tokenizer.build_inputs_with_special_tokens(snake_case_   )
   lowercase									=tokenizer.build_inputs_with_special_tokens(snake_case_  , snake_case_   )

   assert encoded_sentence == text + [4, 3]
   assert encoded_pair == text + [4] + text_a + [4, 3]







 @slow
 def 						_A(       self   ):
   lowercase									={"input_ids": [[17, 2_14_42, 2_70, 17, 10, 1_46_45, 3_18, 34, 17, 45_46, 31_45, 7_87, 13, 77_52, 2_20_18, 23, 21, 17, 45_46, 31_45, 7_87, 13, 33_52, 1_44_31, 13, 55_00, 11, 11_76, 5_80, 13, 1_68_19, 47_97, 23, 17, 10, 1_71_35, 6_58, 19, 4_57, 79_32, 13, 1_84, 19, 31_54, 1_71_35, 64_68, 19, 14_04, 1_22_69, 19, 42_29, 53_56, 1_62_64, 46, 19, 17, 2_05_45, 1_03_95, 9, 9, 9, 11, 28, 64_21, 95_31, 2_07_29, 17, 10, 3_53, 1_70_22, 11, 21, 64_21, 95_31, 1_69_49, 17, 10, 1_15_09, 7_53, 11, 33, 95, 24_21, 73_85, 9_56, 1_44_31, 26_26, 25, 8_42, 73_85, 48_36, 21, 14_29, 22_72, 98_55, 31_20, 1_61, 2_47_38, 19, 1_32_03, 6_58, 2_18, 7_87, 21, 4_30, 1_84_82, 8_47, 26_37, 9, 4, 3], [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3_22, 2_21_78, 27, 10_64, 22, 9_56, 13, 1_11_01, 14_29, 58_54, 2_43_13, 1_89_53, 40, 4_22, 2_43_66, 68, 17_58, 37, 1_04_83, 1_42_57, 31, 2_07, 2_63, 21, 2_03, 37_73, 25, 71, 97_35, 9, 4, 3], [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 32, 20_49, 34_42, 17, 1_38_94, 33_80, 23, 95, 18, 1_76_34, 22_88, 9, 4, 3]], "token_type_ids": [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]], "attention_mask": [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]}  # noqa: E501
   # fmt: on

   self.tokenizer_integration_test_util(
       expected_encoding=snake_case_  , model_name='''xlnet-base-cased'''  , revision='''c841166438c31ec7ca9a106dee7bb312b73ae511'''  , )







import os
from shutil import copyfile
from typing import Any, Dict, List, Optional, Tuple

import sentencepiece as spm

from ...tokenization_utils import PreTrainedTokenizer
from ...utils import logging


SCREAMING_SNAKE_CASE__							:      Tuple         =    logging.get_logger(__name__)


SCREAMING_SNAKE_CASE__							:      int         =    """▁"""

SCREAMING_SNAKE_CASE__							:      Union[str, Any]         =    {"""vocab_file""": """spiece.model"""}

SCREAMING_SNAKE_CASE__							:      Optional[int]         =    {
    """vocab_file""": {
        """google/reformer-crime-and-punishment""": (
            """https://huggingface.co/google/reformer-crime-and-punishment/resolve/main/spiece.model"""
        )
    }
}

SCREAMING_SNAKE_CASE__							:      Optional[Any]         =    {
    """google/reformer-crime-and-punishment""": 5_2_4_2_8_8,
}







class 	__lowerCAmelCase      (       _UpperCamelCase	):
   _UpperCamelCase			:    List[Any]  		=					VOCAB_FILES_NAMES
   _UpperCamelCase			:    Any  		=					PRETRAINED_VOCAB_FILES_MAP
   _UpperCamelCase			:    Any  		=					PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
   _UpperCamelCase			:    Tuple  		=					["""input_ids""", """attention_mask"""]





   def __init__(			self       ,      snake_case       ,      snake_case="</s>"       ,      snake_case="<unk>"       ,      snake_case=[]       ,      snake_case = None       ,      **snake_case       ,      )					->	None:
      """simple docstring"""





      a__						:    Optional[Any]   		=	{} if sp_model_kwargs is None else sp_model_kwargs

      super().__init__(
          eos_token=snake_case       ,      unk_token=snake_case       ,      additional_special_tokens=snake_case       ,      sp_model_kwargs=self.sp_model_kwargs       ,      **snake_case       ,      )

      a__						:    Union[str, Any]   		=	vocab_file
      a__						:    Optional[Any]   		=	spm.SentencePieceProcessor(**self.sp_model_kwargs   )
      self.sp_model.Load(snake_case   )





   @property
   def 						_snake_case			(			self   )					->	str:
      """simple docstring"""





      return self.sp_model.get_piece_size()





   def 						_snake_case			(			self   )					->	Dict[str, int]:
      """simple docstring"""





      a__						:    Dict   		=	{self.convert_ids_to_tokens(snake_case   ): i for i in range(self.vocab_size   )}
      vocab.update(self.added_tokens_encoder   )
      return vocab





   def __getstate__(			self   )					->	Any:
      """simple docstring"""





      a__						:    Tuple   		=	self.__dict__.copy()
      a__						:    Optional[int]   		=	None
      return state





   def __setstate__(			self       ,      snake_case   )					->	Union[str, Any]:
      """simple docstring"""





      a__						:    List[Any]   		=	d

      # for backward compatibility
      if not hasattr(self       ,      "sp_model_kwargs"   ):
         a__						:    List[Any]   		=	{}

      a__						:    int   		=	spm.SentencePieceProcessor(**self.sp_model_kwargs   )
      self.sp_model.Load(self.vocab_file   )





   def 						_snake_case			(			self       ,      snake_case   )					->	List[str]:
      """simple docstring"""





      return self.sp_model.encode(snake_case       ,      out_type=snake_case   )





   def 						_snake_case			(			self       ,      snake_case   )					->	Union[str, Any]:
      """simple docstring"""





      return self.sp_model.piece_to_id(snake_case   )





   def 						_snake_case			(			self       ,      snake_case   )					->	Any:
      """simple docstring"""





      if index < self.sp_model.get_piece_size():
         a__						:    Optional[Any]   		=	self.sp_model.IdToPiece(snake_case   )
      return token





   def 						_snake_case			(			self       ,      snake_case   )					->	Any:
      """simple docstring"""





      a__						:    int   		=	[]
      a__						:    Dict   		=	""
      for token in tokens:
         # make sure that special tokens are not decoded using sentencepiece model
         if token in self.all_special_tokens:
            out_string += self.sp_model.decode(snake_case   ) + token
            a__						:    Dict   		=	[]
         else:
            current_sub_tokens.append(snake_case   )
      out_string += self.sp_model.decode(snake_case   )
      return out_string.strip()





   def 						_snake_case			(			self       ,      snake_case       ,      snake_case = None   )					->	Tuple[str]:
      """simple docstring"""





      if not os.path.isdir(snake_case   ):
         logger.error(F"""Vocabulary path ({save_directory}) should be a directory"""   )
         return
      a__						:    Tuple   		=	os.path.join(
          snake_case       ,      (filename_prefix + "-" if filename_prefix else "") + VOCAB_FILES_NAMES["vocab_file"]   )

      if os.path.abspath(self.vocab_file   ) != os.path.abspath(snake_case   ) and os.path.isfile(self.vocab_file   ):
         copyfile(self.vocab_file       ,      snake_case   )
      elif not os.path.isfile(self.vocab_file   ):
         with open(snake_case       ,      "wb"   ) as fi:
            a__						:    str   		=	self.sp_model.serialized_model_proto()
            fi.write(snake_case   )

      return (out_vocab_file,)

