





import unittest

import torch
from torch import nn

from accelerate.test_utils import require_cuda
from accelerate.utils.memory import find_executable_batch_size, release_memory




def  lowerCAmelCase_ (							)     ->		Dict:
       raise RuntimeError("CUDA out of memory."  )



class 							_UpperCamelCase					(	nn.Module     ):

       def __init__(		self: int		)       -> List[Any]:




              """simple docstring"""


              super().__init__()
              UpperCamelCase_          =  nn.Linear(3					,   4		)
              UpperCamelCase_          =  nn.BatchNormad(4		)
              UpperCamelCase_          =  nn.Linear(4					,   5		)



       def lowercase (		self: Any					,   _SCREAMING_SNAKE_CASE: Optional[int]		)       -> Optional[Any]:




              """simple docstring"""


              return self.lineara(self.batchnorm(self.lineara(_SCREAMING_SNAKE_CASE		)		)		)



class 							_UpperCamelCase					(	unittest.TestCase     ):

       def lowercase (		self: List[Any]		)       -> Any:




              """simple docstring"""


              UpperCamelCase_          =  []

              @find_executable_batch_size(starting_batch_size=128		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: str		):
                     nonlocal batch_sizes
                     batch_sizes.append(_SCREAMING_SNAKE_CASE		)
                     if batch_size != 8:
                            raise_fake_out_of_memory()

              mock_training_loop_function()
              self.assertListEqual(_SCREAMING_SNAKE_CASE					,   [128, 64, 32, 16, 8]		)

       def lowercase (		self: Optional[int]		)       -> List[Any]:




              """simple docstring"""


              UpperCamelCase_          =  []

              @find_executable_batch_size(starting_batch_size=128		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: List[str]					,   _SCREAMING_SNAKE_CASE: Optional[Any]		):
                     nonlocal batch_sizes
                     batch_sizes.append(_SCREAMING_SNAKE_CASE		)
                     if batch_size != 8:
                            raise_fake_out_of_memory()
                     return batch_size, arga

              UpperCamelCase_       , UpperCamelCase_          =  mock_training_loop_function("hello"		)
              self.assertListEqual(_SCREAMING_SNAKE_CASE					,   [128, 64, 32, 16, 8]		)
              self.assertListEqual([bs, arga]					,   [8, "hello"]		)

       def lowercase (		self: Any		)       -> Optional[int]:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=0		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: Union[str, Any]		):
                     pass

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function()
                     self.assertIn("No executable batch size found, reached zero."					,   cm.exception.args[0]		)

       def lowercase (		self: Dict		)       -> Optional[int]:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=16		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: Optional[int]		):
                     if batch_size > 0:
                            raise_fake_out_of_memory()
                     pass

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function()
                     self.assertIn("No executable batch size found, reached zero."					,   cm.exception.args[0]		)

       def lowercase (		self: Optional[int]		)       -> Dict:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=128		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: Any					,   _SCREAMING_SNAKE_CASE: int					,   _SCREAMING_SNAKE_CASE: Tuple		):
                     if batch_size != 8:
                            raise raise_fake_out_of_memory()

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function(128					,   "hello"					,   "world"		)
                     self.assertIn("Batch size was passed into `f`"					,   cm.exception.args[0]		)
                     self.assertIn("`f(arg1='hello', arg2='world')"					,   cm.exception.args[0]		)

       def lowercase (		self: List[str]		)       -> Optional[Any]:




              """simple docstring"""


              @find_executable_batch_size(starting_batch_size=16		)
              def mock_training_loop_function(_SCREAMING_SNAKE_CASE: List[Any]		):
                     raise ValueError("Oops, we had an error!"		)

              with self.assertRaises(_SCREAMING_SNAKE_CASE		) as cm:
                     mock_training_loop_function()
                     self.assertIn("Oops, we had an error!"					,   cm.exception.args[0]		)



       @require_cuda
       def lowercase (		self: Optional[int]		)       -> Union[str, Any]:




              """simple docstring"""


              UpperCamelCase_          =  torch.cuda.memory_allocated()
              UpperCamelCase_          =  ModelForTest()
              model.cuda()
              self.assertGreater(torch.cuda.memory_allocated()					,   _SCREAMING_SNAKE_CASE		)
              UpperCamelCase_          =  release_memory(_SCREAMING_SNAKE_CASE		)
              self.assertEqual(torch.cuda.memory_allocated()					,   _SCREAMING_SNAKE_CASE		)








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

import sentencepiece as spm

from ...tokenization_utils import AddedToken, PreTrainedTokenizer
from ...utils import SPIECE_UNDERLINE, logging


_UpperCAmelCase        =				logging.get_logger(__name__)

_UpperCAmelCase        =				{'vocab_file': 'spiece.model'}

_UpperCAmelCase        =				{
    'vocab_file': {
        'xlnet-base-cased': 'https://huggingface.co/xlnet-base-cased/resolve/main/spiece.model',
        'xlnet-large-cased': 'https://huggingface.co/xlnet-large-cased/resolve/main/spiece.model',
    }
}

_UpperCAmelCase        =				{
    'xlnet-base-cased': None,
    'xlnet-large-cased': None,
}

# Segments (not really needed)
_UpperCAmelCase        =				0
_UpperCAmelCase        =				1
_UpperCAmelCase        =				2
_UpperCAmelCase        =				3
_UpperCAmelCase        =				4



class 							_UpperCamelCase					(	lowerCAmelCase_     ):
       _UpperCamelCase				:					List[str]         =   VOCAB_FILES_NAMES
       _UpperCamelCase				:					int         =   PRETRAINED_VOCAB_FILES_MAP
       _UpperCamelCase				:					Any         =   PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
       _UpperCamelCase				:					Dict         =   '''left'''

       def __init__(		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: Dict					,   _SCREAMING_SNAKE_CASE: Optional[int]=False					,   _SCREAMING_SNAKE_CASE: List[Any]=True					,   _SCREAMING_SNAKE_CASE: List[str]=False					,   _SCREAMING_SNAKE_CASE: Any="<s>"					,   _SCREAMING_SNAKE_CASE: Dict="</s>"					,   _SCREAMING_SNAKE_CASE: List[str]="<unk>"					,   _SCREAMING_SNAKE_CASE: Tuple="<sep>"					,   _SCREAMING_SNAKE_CASE: Optional[int]="<pad>"					,   _SCREAMING_SNAKE_CASE: int="<cls>"					,   _SCREAMING_SNAKE_CASE: Optional[Any]="<mask>"					,   _SCREAMING_SNAKE_CASE: List[str]=["<eop>", "<eod>"]					,   _SCREAMING_SNAKE_CASE: Optional[Dict[str, Any]] = None					,   **_SCREAMING_SNAKE_CASE: Optional[Any]					,   )       -> None:




              """simple docstring"""


              UpperCamelCase_          =  AddedToken(_SCREAMING_SNAKE_CASE					,   lstrip=_SCREAMING_SNAKE_CASE					,   rstrip=_SCREAMING_SNAKE_CASE		) if isinstance(_SCREAMING_SNAKE_CASE					,   _SCREAMING_SNAKE_CASE		) else mask_token

              UpperCamelCase_          =  {} if sp_model_kwargs is None else sp_model_kwargs

              super().__init__(
                  do_lower_case=_SCREAMING_SNAKE_CASE					,   remove_space=_SCREAMING_SNAKE_CASE					,   keep_accents=_SCREAMING_SNAKE_CASE					,   bos_token=_SCREAMING_SNAKE_CASE					,   eos_token=_SCREAMING_SNAKE_CASE					,   unk_token=_SCREAMING_SNAKE_CASE					,   sep_token=_SCREAMING_SNAKE_CASE					,   pad_token=_SCREAMING_SNAKE_CASE					,   cls_token=_SCREAMING_SNAKE_CASE					,   mask_token=_SCREAMING_SNAKE_CASE					,   additional_special_tokens=_SCREAMING_SNAKE_CASE					,   sp_model_kwargs=self.sp_model_kwargs					,   **_SCREAMING_SNAKE_CASE					,   )

              UpperCamelCase_          =  3

              UpperCamelCase_          =  do_lower_case
              UpperCamelCase_          =  remove_space
              UpperCamelCase_          =  keep_accents
              UpperCamelCase_          =  vocab_file

              UpperCamelCase_          =  spm.SentencePieceProcessor(**self.sp_model_kwargs		)
              self.sp_model.Load(_SCREAMING_SNAKE_CASE		)

       @property
       def lowercase (		self: List[Any]		)       -> Dict:




              """simple docstring"""


              return len(self.sp_model		)

       def lowercase (		self: List[Any]		)       -> int:




              """simple docstring"""


              UpperCamelCase_          =  {self.convert_ids_to_tokens(_SCREAMING_SNAKE_CASE		): i for i in range(self.vocab_size		)}
              vocab.update(self.added_tokens_encoder		)
              return vocab

       def __getstate__(		self: int		)       -> Optional[int]:




              """simple docstring"""


              UpperCamelCase_          =  self.__dict__.copy()
              UpperCamelCase_          =  None
              return state

       def __setstate__(		self: Union[str, Any]					,   _SCREAMING_SNAKE_CASE: Optional[int]		)       -> Optional[int]:




              """simple docstring"""


              UpperCamelCase_          =  d

              # for backward compatibility
              if not hasattr(self					,   "sp_model_kwargs"		):
                     UpperCamelCase_          =  {}

              UpperCamelCase_          =  spm.SentencePieceProcessor(**self.sp_model_kwargs		)
              self.sp_model.Load(self.vocab_file		)

       def lowercase (		self: Any					,   _SCREAMING_SNAKE_CASE: List[str]		)       -> int:




              """simple docstring"""


              if self.remove_space:
                     UpperCamelCase_          =  " ".join(inputs.strip().split()		)
              else:
                     UpperCamelCase_          =  inputs
              UpperCamelCase_          =  outputs.replace("``"					,   "\""		).replace("''"					,   "\""		)

              if not self.keep_accents:
                     UpperCamelCase_          =  unicodedata.normalize("NFKD"					,   _SCREAMING_SNAKE_CASE		)
                     UpperCamelCase_          =  "".join([c for c in outputs if not unicodedata.combining(_SCREAMING_SNAKE_CASE		)]		)
              if self.do_lower_case:
                     UpperCamelCase_          =  outputs.lower()

              return outputs

       def lowercase (		self: Optional[Any]					,   _SCREAMING_SNAKE_CASE: str		)       -> List[str]:




              """simple docstring"""


              UpperCamelCase_          =  self.preprocess_text(_SCREAMING_SNAKE_CASE		)
              UpperCamelCase_          =  self.sp_model.encode(_SCREAMING_SNAKE_CASE					,   out_type=_SCREAMING_SNAKE_CASE		)
              UpperCamelCase_          =  []
              for piece in pieces:
                     if len(_SCREAMING_SNAKE_CASE		) > 1 and piece[-1] == str(","		) and piece[-2].isdigit():
                            UpperCamelCase_          =  self.sp_model.EncodeAsPieces(piece[:-1].replace(_SCREAMING_SNAKE_CASE					,   ""		)		)
                            if piece[0] != SPIECE_UNDERLINE and cur_pieces[0][0] == SPIECE_UNDERLINE:
                                   if len(cur_pieces[0]		) == 1:
                                          UpperCamelCase_          =  cur_pieces[1:]
                                   else:
                                          UpperCamelCase_          =  cur_pieces[0][1:]
                            cur_pieces.append(piece[-1]		)
                            new_pieces.extend(_SCREAMING_SNAKE_CASE		)
                     else:
                            new_pieces.append(_SCREAMING_SNAKE_CASE		)

              return new_pieces

       def lowercase (		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: str		)       -> Any:




              """simple docstring"""


              return self.sp_model.PieceToId(_SCREAMING_SNAKE_CASE		)

       def lowercase (		self: List[Any]					,   _SCREAMING_SNAKE_CASE: Optional[Any]		)       -> str:




              """simple docstring"""


              return self.sp_model.IdToPiece(_SCREAMING_SNAKE_CASE		)

       def lowercase (		self: List[Any]					,   _SCREAMING_SNAKE_CASE: Tuple		)       -> Any:




              """simple docstring"""


              UpperCamelCase_          =  "".join(_SCREAMING_SNAKE_CASE		).replace(_SCREAMING_SNAKE_CASE					,   " "		).strip()
              return out_string

       def lowercase (		self: int					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: bool = False					,   _SCREAMING_SNAKE_CASE: bool = None					,   _SCREAMING_SNAKE_CASE: bool = True					,   **_SCREAMING_SNAKE_CASE: Dict					,   )       -> str:




              """simple docstring"""


              UpperCamelCase_          =  kwargs.pop("use_source_tokenizer"					,   _SCREAMING_SNAKE_CASE		)

              UpperCamelCase_          =  self.convert_ids_to_tokens(_SCREAMING_SNAKE_CASE					,   skip_special_tokens=_SCREAMING_SNAKE_CASE		)

              # To avoid mixing byte-level and unicode for byte-level BPT
              # we need to build string separately for added tokens and byte-level tokens
              # cf. https://github.com/huggingface/transformers/issues/1133
              UpperCamelCase_          =  []
              UpperCamelCase_          =  []
              for token in filtered_tokens:
                     if skip_special_tokens and token in self.all_special_ids:
                            continue
                     if token in self.added_tokens_encoder:
                            if current_sub_text:
                                   sub_texts.append(self.convert_tokens_to_string(_SCREAMING_SNAKE_CASE		)		)
                                   UpperCamelCase_          =  []
                            sub_texts.append(_SCREAMING_SNAKE_CASE		)
                     else:
                            current_sub_text.append(_SCREAMING_SNAKE_CASE		)
              if current_sub_text:
                     sub_texts.append(self.convert_tokens_to_string(_SCREAMING_SNAKE_CASE		)		)

              # Mimic the behavior of the Rust tokenizer:
              # By default, there are no spaces between special tokens
              UpperCamelCase_          =  "".join(_SCREAMING_SNAKE_CASE		)

              UpperCamelCase_          =  (
                  clean_up_tokenization_spaces
                  if clean_up_tokenization_spaces is not None
                  else self.clean_up_tokenization_spaces
              )
              if clean_up_tokenization_spaces:
                     UpperCamelCase_          =  self.clean_up_tokenization(_SCREAMING_SNAKE_CASE		)
                     return clean_text
              else:
                     return text

       def lowercase (		self: List[Any]					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: Optional[List[int]] = None		)       -> List[int]:




              """simple docstring"""


              UpperCamelCase_          =  [self.sep_token_id]
              UpperCamelCase_          =  [self.cls_token_id]
              if token_ids_a is None:
                     return token_ids_a + sep + cls
              return token_ids_a + sep + token_ids_a + sep + cls

       def lowercase (		self: Dict					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: Optional[List[int]] = None					,   _SCREAMING_SNAKE_CASE: bool = False		)       -> List[int]:




              """simple docstring"""


              if already_has_special_tokens:
                     return super().get_special_tokens_mask(
                         token_ids_a=_SCREAMING_SNAKE_CASE					,   token_ids_a=_SCREAMING_SNAKE_CASE					,   already_has_special_tokens=_SCREAMING_SNAKE_CASE		)

              if token_ids_a is not None:
                     return ([0] * len(_SCREAMING_SNAKE_CASE		)) + [1] + ([0] * len(_SCREAMING_SNAKE_CASE		)) + [1, 1]
              return ([0] * len(_SCREAMING_SNAKE_CASE		)) + [1, 1]

       def lowercase (		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: List[int]					,   _SCREAMING_SNAKE_CASE: Optional[List[int]] = None		)       -> List[int]:




              """simple docstring"""


              UpperCamelCase_          =  [self.sep_token_id]
              UpperCamelCase_          =  [2]

              if token_ids_a is None:
                     return len(token_ids_a + sep		) * [0] + cls_segment_id
              return len(token_ids_a + sep		) * [0] + len(token_ids_a + sep		) * [1] + cls_segment_id



       def lowercase (		self: Optional[int]					,   _SCREAMING_SNAKE_CASE: str					,   _SCREAMING_SNAKE_CASE: Optional[str] = None		)       -> Tuple[str]:




              """simple docstring"""


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

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

              return (out_vocab_file,)

