



'''simple docstring'''



import contextlib
from multiprocessing import Pool, RLock

from tqdm.auto import tqdm

from ..utils import experimental, logging


lowerCamelCase	 =       logging.get_logger(__name__)





class _UpperCamelCase		:





				'''simple docstring'''





				lowerCAmelCase__					    =    None



@experimental
def   _A       (   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase					):



							"""simple docstring"""



							if ParallelBackendConfig.backend_name is None:
														return _map_with_multiprocessing_pool(
														    _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase					)

							return _map_with_joblib(_lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase					)



def   _A       (   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase					):



							"""simple docstring"""



							__lowercase       	=num_proc if num_proc <= len(_lowerCAmelCase					) else len(_lowerCAmelCase					)
							__lowercase       	=[]  # We organize the splits ourselve (contiguous splits)
							for index in range(_lowerCAmelCase					):
														__lowercase       	=len(_lowerCAmelCase					) // num_proc
														__lowercase       	=len(_lowerCAmelCase					) % num_proc
														__lowercase       	=div * index + min(_lowerCAmelCase  ,   _lowerCAmelCase					)
														__lowercase       	=start + div + (1 if index < mod else 0)
														split_kwds.append((function, iterable[start:end], types, index, disable_tqdm, desc)					)

							if len(_lowerCAmelCase					) != sum(len(i[1]					) for i in split_kwds					):
														raise ValueError(
														    f"""Error dividing inputs iterable among processes. """
														    f"""Total number of objects {len(_lowerCAmelCase					)}, """
														    f"""length: {sum(len(i[1]					) for i in split_kwds					)}"""					)

							logger.info(
							    f"""Spawning {num_proc} processes for {len(_lowerCAmelCase					)} objects in slices of {[len(i[1]					) for i in split_kwds]}"""					)
							__lowercase	,				__lowercase       	=None, None
							if not disable_tqdm:
														__lowercase	,				__lowercase       	=(RLock(),), tqdm.set_lock
							with Pool(_lowerCAmelCase  ,   initargs=_lowerCAmelCase  ,   initializer=_lowerCAmelCase					) as pool:
														__lowercase       	=pool.map(_lowerCAmelCase  ,   _lowerCAmelCase					)
							logger.info(f"""Finished {num_proc} processes"""					)
							__lowercase       	=[obj for proc_res in mapped for obj in proc_res]
							logger.info(f"""Unpacked {len(_lowerCAmelCase					)} objects"""					)

							return mapped



def   _A       (   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase  ,   _lowerCAmelCase					):



							"""simple docstring"""



							import joblib

							with joblib.parallel_backend(ParallelBackendConfig.backend_name  ,   n_jobs=_lowerCAmelCase					):
														return joblib.Parallel()(
														    joblib.delayed(_lowerCAmelCase					)((function, obj, types, None, True, None)					) for obj in iterable					)



@experimental
@contextlib.contextmanager
def   _A       (   _lowerCAmelCase					):



							"""simple docstring"""



							__lowercase       	=backend_name

							if backend_name == "spark":
														from joblibspark import register_spark

														register_spark()

														# TODO: call create_cache_and_write_probe if "download" in steps
														# TODO: raise NotImplementedError when Dataset.map etc is called

							try:
														yield
							finally:
														__lowercase       	=None








'''simple docstring'''



import json
from typing import List, Optional, Tuple

from tokenizers import pre_tokenizers, processors

from ...tokenization_utils_base import AddedToken, BatchEncoding
from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import logging
from .tokenization_bart import BartTokenizer


lowerCamelCase	 =       logging.get_logger(__name__)


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

# See all BART models at https://huggingface.co/models?filter=bart
lowerCamelCase	 =       {
    """vocab_file""": {
        """facebook/bart-base""": """https://huggingface.co/facebook/bart-base/resolve/main/vocab.json""",
        """facebook/bart-large""": """https://huggingface.co/facebook/bart-large/resolve/main/vocab.json""",
        """facebook/bart-large-mnli""": """https://huggingface.co/facebook/bart-large-mnli/resolve/main/vocab.json""",
        """facebook/bart-large-cnn""": """https://huggingface.co/facebook/bart-large-cnn/resolve/main/vocab.json""",
        """facebook/bart-large-xsum""": """https://huggingface.co/facebook/bart-large-xsum/resolve/main/vocab.json""",
        """yjernite/bart_eli5""": """https://huggingface.co/yjernite/bart_eli5/resolve/main/vocab.json""",
    },
    """merges_file""": {
        """facebook/bart-base""": """https://huggingface.co/facebook/bart-base/resolve/main/merges.txt""",
        """facebook/bart-large""": """https://huggingface.co/facebook/bart-large/resolve/main/merges.txt""",
        """facebook/bart-large-mnli""": """https://huggingface.co/facebook/bart-large-mnli/resolve/main/merges.txt""",
        """facebook/bart-large-cnn""": """https://huggingface.co/facebook/bart-large-cnn/resolve/main/merges.txt""",
        """facebook/bart-large-xsum""": """https://huggingface.co/facebook/bart-large-xsum/resolve/main/merges.txt""",
        """yjernite/bart_eli5""": """https://huggingface.co/yjernite/bart_eli5/resolve/main/merges.txt""",
    },
    """tokenizer_file""": {
        """facebook/bart-base""": """https://huggingface.co/facebook/bart-base/resolve/main/tokenizer.json""",
        """facebook/bart-large""": """https://huggingface.co/facebook/bart-large/resolve/main/tokenizer.json""",
        """facebook/bart-large-mnli""": """https://huggingface.co/facebook/bart-large-mnli/resolve/main/tokenizer.json""",
        """facebook/bart-large-cnn""": """https://huggingface.co/facebook/bart-large-cnn/resolve/main/tokenizer.json""",
        """facebook/bart-large-xsum""": """https://huggingface.co/facebook/bart-large-xsum/resolve/main/tokenizer.json""",
        """yjernite/bart_eli5""": """https://huggingface.co/yjernite/bart_eli5/resolve/main/tokenizer.json""",
    },
}

lowerCamelCase	 =       {
    """facebook/bart-base""": 1024,
    """facebook/bart-large""": 1024,
    """facebook/bart-large-mnli""": 1024,
    """facebook/bart-large-cnn""": 1024,
    """facebook/bart-large-xsum""": 1024,
    """yjernite/bart_eli5""": 1024,
}





class _UpperCamelCase		(     A		):





				'''simple docstring'''





				lowerCAmelCase__					    =    VOCAB_FILES_NAMES
				lowerCAmelCase__					    =    PRETRAINED_VOCAB_FILES_MAP
				lowerCAmelCase__					    =    PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
				lowerCAmelCase__					    =    ["""input_ids""", """attention_mask"""]
				lowerCAmelCase__					    =    BartTokenizer

				def __init__(							self  :  Optional[int]  ,       _lowerCAmelCase  :  Any=None  ,       _lowerCAmelCase  :  Tuple=None  ,       _lowerCAmelCase  :  Optional[int]=None  ,       _lowerCAmelCase  :  str="replace"  ,       _lowerCAmelCase  :  List[Any]="<s>"  ,       _lowerCAmelCase  :  int="</s>"  ,       _lowerCAmelCase  :  Dict="</s>"  ,       _lowerCAmelCase  :  Optional[int]="<s>"  ,       _lowerCAmelCase  :  str="<unk>"  ,       _lowerCAmelCase  :  List[str]="<pad>"  ,       _lowerCAmelCase  :  Dict="<mask>"  ,       _lowerCAmelCase  :  Tuple=False  ,       _lowerCAmelCase  :  str=True  ,       **_lowerCAmelCase  :  Tuple  ,       ):







											'''simple docstring'''

											super().__init__(
											    _lowerCAmelCase  ,       _lowerCAmelCase  ,       tokenizer_file=_lowerCAmelCase  ,       errors=_lowerCAmelCase  ,       bos_token=_lowerCAmelCase  ,       eos_token=_lowerCAmelCase  ,       sep_token=_lowerCAmelCase  ,       cls_token=_lowerCAmelCase  ,       unk_token=_lowerCAmelCase  ,       pad_token=_lowerCAmelCase  ,       mask_token=_lowerCAmelCase  ,       add_prefix_space=_lowerCAmelCase  ,       trim_offsets=_lowerCAmelCase  ,       **_lowerCAmelCase  ,       )

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

											__lowercase       	=add_prefix_space

											# the pre_tokenizer is already updated in the GPT2TokenizerFast `__init__`
											__lowercase       	='post_processor'
											__lowercase       	=getattr(self.backend_tokenizer  ,       _lowerCAmelCase  ,       _lowerCAmelCase)
											if tokenizer_component_instance:
																		__lowercase       	=json.loads(tokenizer_component_instance.__getstate__())

																		# The lists 'sep' and 'cls' must be cased in tuples for the object `post_processor_class`
																		if "sep" in state:
																									__lowercase       	=tuple(state['sep'])
																		if "cls" in state:
																									__lowercase       	=tuple(state['cls'])

																		__lowercase       	=False

																		if state.get('add_prefix_space'  ,       _lowerCAmelCase) != add_prefix_space:
																									__lowercase       	=add_prefix_space
																									__lowercase       	=True

																		if state.get('trim_offsets'  ,       _lowerCAmelCase) != trim_offsets:
																									__lowercase       	=trim_offsets
																									__lowercase       	=True

																		if changes_to_apply:
																									__lowercase       	=getattr(_lowerCAmelCase  ,       state.pop('type'))
																									__lowercase       	=component_class(**_lowerCAmelCase)
																									setattr(self.backend_tokenizer  ,       _lowerCAmelCase  ,       _lowerCAmelCase)

				@property
				def 				__lowerCamelCase     (							self  :  List[str]):







											'''simple docstring'''

											if self._mask_token is None:
																		if self.verbose:
																									logger.error('Using mask_token, but it is not set yet.')
																		return None
											return str(self._mask_token)

				@mask_token.setter
				def 				__lowerCamelCase     (							self  :  Union[str, Any]  ,       _lowerCAmelCase  :  Optional[int]):







											'''simple docstring'''

											__lowercase       	=AddedToken(_lowerCAmelCase  ,       lstrip=_lowerCAmelCase  ,       rstrip=_lowerCAmelCase) if isinstance(_lowerCAmelCase  ,       _lowerCAmelCase) else value
											__lowercase       	=value

				def 				__lowerCamelCase     (							self  :  List[Any]  ,       *_lowerCAmelCase  :  int  ,       **_lowerCAmelCase  :  str):







											'''simple docstring'''

											__lowercase       	=kwargs.get('is_split_into_words'  ,       _lowerCAmelCase)

											if is_split_into_words and not self.add_prefix_space:
																		raise ValueError(
																		    f"""You need to instantiate {self.__class__.__name__} with add_prefix_space=True """
																		    'to use it with pretokenized inputs.')

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

				def 				__lowerCamelCase     (							self  :  List[Any]  ,       *_lowerCAmelCase  :  List[str]  ,       **_lowerCAmelCase  :  Tuple):







											'''simple docstring'''

											__lowercase       	=kwargs.get('is_split_into_words'  ,       _lowerCAmelCase)

											if is_split_into_words and not self.add_prefix_space:
																		raise ValueError(
																		    f"""You need to instantiate {self.__class__.__name__} with add_prefix_space=True """
																		    'to use it with pretokenized inputs.')

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

				def 				__lowerCamelCase     (							self  :  int  ,       _lowerCAmelCase  :  str  ,       _lowerCAmelCase  :  Optional[str] = None):







											'''simple docstring'''

											__lowercase       	=self._tokenizer.model.save(_lowerCAmelCase  ,       name=_lowerCAmelCase)
											return tuple(_lowerCAmelCase)

				def 				__lowerCamelCase     (							self  :  str  ,       _lowerCAmelCase  :  Union[str, Any]  ,       _lowerCAmelCase  :  List[str]=None):







											'''simple docstring'''

											__lowercase       	=[self.bos_token_id] + token_ids_a + [self.eos_token_id]
											if token_ids_a is None:
																		return output

											return output + [self.eos_token_id] + token_ids_a + [self.eos_token_id]

				def 				__lowerCamelCase     (							self  :  List[str]  ,       _lowerCAmelCase  :  List[int]  ,       _lowerCAmelCase  :  Optional[List[int]] = None):







											'''simple docstring'''

											__lowercase       	=[self.sep_token_id]
											__lowercase       	=[self.cls_token_id]

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



