




'''simple docstring'''


import json
from typing import TYPE_CHECKING, List, Optional, Tuple

from tokenizers import pre_tokenizers

from ...tokenization_utils_base import BatchEncoding
from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import logging
from .tokenization_gpta import GPTaTokenizer


if TYPE_CHECKING:
  from transformers.pipelines.conversational import Conversation


UpperCAmelCase_ 		=      logging.get_logger(__name__)

UpperCAmelCase_ 		=      {"vocab_file": "vocab.json", "merges_file": "merges.txt", "tokenizer_file": "tokenizer.json"}

UpperCAmelCase_ 		=      {
    "vocab_file": {
        "gpt2": "https://huggingface.co/gpt2/resolve/main/vocab.json",
        "gpt2-medium": "https://huggingface.co/gpt2-medium/resolve/main/vocab.json",
        "gpt2-large": "https://huggingface.co/gpt2-large/resolve/main/vocab.json",
        "gpt2-xl": "https://huggingface.co/gpt2-xl/resolve/main/vocab.json",
        "distilgpt2": "https://huggingface.co/distilgpt2/resolve/main/vocab.json",
    },
    "merges_file": {
        "gpt2": "https://huggingface.co/gpt2/resolve/main/merges.txt",
        "gpt2-medium": "https://huggingface.co/gpt2-medium/resolve/main/merges.txt",
        "gpt2-large": "https://huggingface.co/gpt2-large/resolve/main/merges.txt",
        "gpt2-xl": "https://huggingface.co/gpt2-xl/resolve/main/merges.txt",
        "distilgpt2": "https://huggingface.co/distilgpt2/resolve/main/merges.txt",
    },
    "tokenizer_file": {
        "gpt2": "https://huggingface.co/gpt2/resolve/main/tokenizer.json",
        "gpt2-medium": "https://huggingface.co/gpt2-medium/resolve/main/tokenizer.json",
        "gpt2-large": "https://huggingface.co/gpt2-large/resolve/main/tokenizer.json",
        "gpt2-xl": "https://huggingface.co/gpt2-xl/resolve/main/tokenizer.json",
        "distilgpt2": "https://huggingface.co/distilgpt2/resolve/main/tokenizer.json",
    },
}

UpperCAmelCase_ 		=      {
    "gpt2": 10_24,
    "gpt2-medium": 10_24,
    "gpt2-large": 10_24,
    "gpt2-xl": 10_24,
    "distilgpt2": 10_24,
}





class    __lowercase						(  __magic_name__ ):
   _a							=      VOCAB_FILES_NAMES
   _a							=      PRETRAINED_VOCAB_FILES_MAP
   _a							=      PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
   _a							=      ["""input_ids""", """attention_mask"""]
   _a							=      GPTaTokenizer







   def __init__(	self      ,							UpperCamelCase=None      ,							UpperCamelCase=None      ,							UpperCamelCase=None      ,							UpperCamelCase="<|endoftext|>"      ,							UpperCamelCase="<|endoftext|>"      ,							UpperCamelCase="<|endoftext|>"      ,							UpperCamelCase=False      ,							**UpperCamelCase      ,							)				->    Union[str, Any]:
     super().__init__(
         UpperCamelCase      ,							UpperCamelCase      ,							tokenizer_file=UpperCamelCase      ,							unk_token=UpperCamelCase      ,							bos_token=UpperCamelCase      ,							eos_token=UpperCamelCase      ,							add_prefix_space=UpperCamelCase      ,							**UpperCamelCase      ,							)

     __a			=					kwargs.pop('add_bos_token'      ,							UpperCamelCase      )

     __a			=					json.loads(self.backend_tokenizer.pre_tokenizer.__getstate__()      )
     if pre_tok_state.get('add_prefix_space'      ,							UpperCamelCase      ) != add_prefix_space:
       __a			=					getattr(UpperCamelCase      ,							pre_tok_state.pop('type'      )      )
       __a			=					add_prefix_space
       __a			=					pre_tok_class(**UpperCamelCase      )

     __a			=					add_prefix_space







   def 		UpperCamelCase__			(	self      ,							*UpperCamelCase      ,							**UpperCamelCase      )				->    BatchEncoding:
     __a			=					kwargs.get('is_split_into_words'      ,							UpperCamelCase      )
     assert self.add_prefix_space or not is_split_into_words, (
         f"You need to instantiate {self.__class__.__name__} with add_prefix_space=True "
         "to use it with pretokenized inputs."
     )

     return super()._batch_encode_plus(*UpperCamelCase      ,							**UpperCamelCase      )







   def 		UpperCamelCase__			(	self      ,							*UpperCamelCase      ,							**UpperCamelCase      )				->    BatchEncoding:
     __a			=					kwargs.get('is_split_into_words'      ,							UpperCamelCase      )

     assert self.add_prefix_space or not is_split_into_words, (
         f"You need to instantiate {self.__class__.__name__} with add_prefix_space=True "
         "to use it with pretokenized inputs."
     )

     return super()._encode_plus(*UpperCamelCase      ,							**UpperCamelCase      )







   def 		UpperCamelCase__			(	self      ,							UpperCamelCase      ,							UpperCamelCase = None      )				->    Tuple[str]:
     __a			=					self._tokenizer.model.save(UpperCamelCase      ,							name=UpperCamelCase      )
     return tuple(UpperCamelCase      )







   def 		UpperCamelCase__			(	self      ,							UpperCamelCase      )				->    List[int]:
     __a			=					[]
     for is_user, text in conversation.iter_texts():
       input_ids.extend(self.encode(UpperCamelCase      ,							add_special_tokens=UpperCamelCase      ) + [self.eos_token_id]      )

     if len(UpperCamelCase      ) > self.model_max_length:
       __a			=					input_ids[-self.model_max_length :]
     return input_ids








'''simple docstring'''


from typing import List, Optional, TypeVar

from .arrow_dataset import Dataset, _concatenate_map_style_datasets, _interleave_map_style_datasets
from .dataset_dict import DatasetDict, IterableDatasetDict
from .info import DatasetInfo
from .iterable_dataset import IterableDataset, _concatenate_iterable_datasets, _interleave_iterable_datasets
from .splits import NamedSplit
from .utils import logging
from .utils.py_utils import Literal


UpperCAmelCase_ 		=      logging.get_logger(__name__)


UpperCAmelCase_ 		=      TypeVar("DatasetType", Dataset, IterableDataset)


def 						SCREAMING_SNAKE_CASE       (      a_	:							List[DatasetType]				,					a_	:							Optional[List[float]] = None				,					a_	:							Optional[int] = None				,					a_	:							Optional[DatasetInfo] = None				,					a_	:							Optional[NamedSplit] = None				,					a_	:							Literal["first_exhausted", "all_exhausted"] = "first_exhausted"				,					):
  from .arrow_dataset import Dataset
  from .iterable_dataset import IterableDataset

  if not datasets:
    raise ValueError('Unable to interleave an empty list of datasets.'			)
  for i, dataset in enumerate(a_			):
    if not isinstance(a_				,					(Dataset, IterableDataset)			):
      if isinstance(a_				,					(DatasetDict, IterableDatasetDict)			):
        if not dataset:
          raise ValueError(
              f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} "
              'is an empty dataset dictionary.'			)
        raise ValueError(
            f"Dataset at position {i} has at least one split: {list(a_			)}\n"
            f"Please pick one to interleave with the other datasets, for example: dataset['{next(iter(a_			)			)}']"			)
      raise ValueError(
          f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} is a {type(a_			).__name__}."			)
    if i == 0:
      __a	,       __a			=					(
          (Dataset, IterableDataset) if isinstance(a_				,					a_			) else (IterableDataset, Dataset)
      )
    elif not isinstance(a_				,					a_			):
      raise ValueError(
          f"Unable to interleave a {dataset_type.__name__} (at position 0) with a {other_type.__name__} (at position {i}). Expected a list of Dataset objects or a list of IterableDataset objects."			)
  if stopping_strategy not in ["first_exhausted", "all_exhausted"]:
    raise ValueError(f"{stopping_strategy} is not supported. Please enter a valid stopping_strategy."			)
  if dataset_type is Dataset:
    return _interleave_map_style_datasets(
        a_				,					a_				,					a_				,					info=a_				,					split=a_				,					stopping_strategy=a_			)
  else:
    return _interleave_iterable_datasets(
        a_				,					a_				,					a_				,					info=a_				,					split=a_				,					stopping_strategy=a_			)


def 						SCREAMING_SNAKE_CASE       (      a_	:							List[DatasetType]				,					a_	:							Optional[DatasetInfo] = None				,					a_	:							Optional[NamedSplit] = None				,					a_	:							int = 0				,					):

  if not dsets:
    raise ValueError('Unable to concatenate an empty list of datasets.'			)
  for i, dataset in enumerate(a_			):
    if not isinstance(a_				,					(Dataset, IterableDataset)			):
      if isinstance(a_				,					(DatasetDict, IterableDatasetDict)			):
        if not dataset:
          raise ValueError(
              f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} "
              'is an empty dataset dictionary.'			)
        raise ValueError(
            f"Dataset at position {i} has at least one split: {list(a_			)}\n"
            f"Please pick one to interleave with the other datasets, for example: dataset['{next(iter(a_			)			)}']"			)
      raise ValueError(
          f"Expected a list of Dataset objects or a list of IterableDataset objects, but element at position {i} is a {type(a_			).__name__}."			)
    if i == 0:
      __a	,       __a			=					(
          (Dataset, IterableDataset) if isinstance(a_				,					a_			) else (IterableDataset, Dataset)
      )
    elif not isinstance(a_				,					a_			):
      raise ValueError(
          f"Unable to interleave a {dataset_type.__name__} (at position 0) with a {other_type.__name__} (at position {i}). Expected a list of Dataset objects or a list of IterableDataset objects."			)
  if dataset_type is Dataset:
    return _concatenate_map_style_datasets(a_				,					info=a_				,					split=a_				,					axis=a_			)
  else:
    return _concatenate_iterable_datasets(a_				,					info=a_				,					split=a_				,					axis=a_			)



