




"""simple docstring"""





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

from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import is_sentencepiece_available, logging


if is_sentencepiece_available():
					from .tokenization_pegasus import PegasusTokenizer
else:
					A				=							None


A				=							logging.get_logger(__name__)


A				=							"""▁"""

A				=							{"""vocab_file""": """spiece.model""", """tokenizer_file""": """tokenizer.json"""}

A				=							{
    """vocab_file""": {"""google/pegasus-xsum""": """https://huggingface.co/google/pegasus-xsum/resolve/main/spiece.model"""},
    """tokenizer_file""": {
        """google/pegasus-xsum""": """https://huggingface.co/google/pegasus-xsum/resolve/main/tokenizer.json"""
    },
}

A				=							{
    """google/pegasus-xsum""": 512,
}



class   a__					(						__magic_name__ ):
			lowercase_		=						VOCAB_FILES_NAMES
			lowercase_		=						PRETRAINED_VOCAB_FILES_MAP
			lowercase_		=						PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
			lowercase_		=						PegasusTokenizer
			lowercase_		=						["input_ids", "attention_mask"]


			def __init__(   self   :     str   ,	UpperCamelCase_   :     str=None   ,	UpperCamelCase_   :     Optional[int]=None   ,	UpperCamelCase_   :     int="<pad>"   ,	UpperCamelCase_   :     Optional[Any]="</s>"   ,	UpperCamelCase_   :     Any="<unk>"   ,	UpperCamelCase_   :     Tuple="<mask_2>"   ,	UpperCamelCase_   :     Any="<mask_1>"   ,	UpperCamelCase_   :     Tuple=None   ,	UpperCamelCase_   :     str=103   ,	**UpperCamelCase_   :     Optional[Any]   ,	):


						"""simple docstring"""




						__UpperCAmelCase						:			Optional[int]												=       offset

						if additional_special_tokens is not None:
									if not isinstance(UpperCamelCase_   ,	UpperCamelCase_):
												raise TypeError(
												    F"additional_special_tokens should be of type {type(UpperCamelCase_)}, but is"
												    F" {type(UpperCamelCase_)}")

									__UpperCAmelCase						:			Any												=       (
									    ([mask_token_sent] + additional_special_tokens)
									    if mask_token_sent not in additional_special_tokens and mask_token_sent is not None
									    else additional_special_tokens
									)
									# fill additional tokens with ..., <unk_token_102> in case not all additional tokens are already taken
									additional_special_tokens_extended += [
									    F"<unk_{i}>" for i in range(len(UpperCamelCase_)   ,	self.offset - 1)
									]

									if len(set(UpperCamelCase_)) != len(UpperCamelCase_):
												raise ValueError(
												    "Please make sure that the provided additional_special_tokens do not contain an incorrectly"
												    F" shifted list of <unk_x> tokens. Found {additional_special_tokens_extended}.")
									__UpperCAmelCase						:			str												=       additional_special_tokens_extended
						else:
									__UpperCAmelCase						:			Tuple												=       [mask_token_sent] if mask_token_sent is not None else []
									additional_special_tokens += [F"<unk_{i}>" for i in range(2   ,	self.offset)]

						super().__init__(
						    UpperCamelCase_   ,	tokenizer_file=UpperCamelCase_   ,	pad_token=UpperCamelCase_   ,	eos_token=UpperCamelCase_   ,	unk_token=UpperCamelCase_   ,	mask_token=UpperCamelCase_   ,	mask_token_sent=UpperCamelCase_   ,	offset=UpperCamelCase_   ,	additional_special_tokens=UpperCamelCase_   ,	**UpperCamelCase_   ,	)
						__UpperCAmelCase						:			Optional[int]												=       vocab_file
						__UpperCAmelCase						:			List[str]												=       False if not self.vocab_file else True


			def    a_  (   self   :     Union[str, Any]   ,	UpperCamelCase_   :     Optional[int]):


						"""simple docstring"""




						__UpperCAmelCase						:			int												=       set(self.all_special_ids)  # call it once instead of inside list comp
						all_special_ids.remove(self.unk_token_id)  # <unk> is only sometimes special

						if all_special_ids != set(range(len(self.additional_special_tokens) + 3)):
									raise ValueError(
									    "There should be 3 special tokens: mask_token, pad_token, and eos_token +"
									    F" {len(self.additional_special_tokens)} additional_special_tokens, but got {all_special_ids}")

						return [1 if x in all_special_ids else 0 for x in seq]


			def    a_  (   self   :     Union[str, Any]   ,	UpperCamelCase_   :     List   ,	UpperCamelCase_   :     Optional[List] = None   ,	UpperCamelCase_   :     bool = False):


						"""simple docstring"""




						if already_has_special_tokens:
									return self._special_token_mask(UpperCamelCase_)
						elif token_ids_a is None:
									return self._special_token_mask(UpperCamelCase_) + [1]
						else:
									return self._special_token_mask(token_ids_a + token_ids_a) + [1]


			def    a_  (   self   :     int   ,	UpperCamelCase_   :     Union[str, Any]   ,	UpperCamelCase_   :     List[Any]=None):


						"""simple docstring"""




						if token_ids_a is None:
									return token_ids_a + [self.eos_token_id]
						# We don't expect to process pairs, but leave the pair logic for API consistency
						return token_ids_a + token_ids_a + [self.eos_token_id]


			def    a_  (   self   :     Union[str, Any]   ,	UpperCamelCase_   :     str   ,	UpperCamelCase_   :     Optional[str] = None):


						"""simple docstring"""




						if not self.can_save_slow_tokenizer:
									raise ValueError(
									    "Your fast tokenizer does not have the necessary information to save the vocabulary for a slow "
									    "tokenizer.")

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

						if os.path.abspath(self.vocab_file) != os.path.abspath(UpperCamelCase_):
									copyfile(self.vocab_file   ,	UpperCamelCase_)

						return (out_vocab_file,)









"""simple docstring"""
import os
import tempfile
from functools import partial
from unittest import TestCase
from unittest.mock import patch

import numpy as np
import pytest

from datasets.arrow_dataset import Dataset
from datasets.search import ElasticSearchIndex, FaissIndex, MissingIndex

from .utils import require_elasticsearch, require_faiss


__UpperCamelCase     :						Optional[int]						       =  pytest.mark.integration







@require_faiss
class       a							(   a__  ):



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= Dataset.from_dict({'filename': ['my_name-train' + '_' + str(_snake_case     ) for x in np.arange(30     ).tolist()]}     )
  return dset



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  import faiss

  lowerCAmelCase    				= self._create_dummy_dataset()
  lowerCAmelCase    				= dset.map(
      lambda _snake_case				,       _snake_case     : {"vecs": i * np.ones(5				,       dtype=np.floataa     )}				,       with_indices=_snake_case				,       keep_in_memory=_snake_case     )
  lowerCAmelCase    				= dset.add_faiss_index('vecs'				,       batch_size=1_00				,       metric_type=faiss.METRIC_INNER_PRODUCT     )
  lowerCAmelCase				,lowerCAmelCase    				= dset.get_nearest_examples('vecs'				,       np.ones(5				,       dtype=np.floataa     )     )
  self.assertEqual(examples['filename'][0]				,       'my_name-train_29'     )
  dset.drop_index('vecs'     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  import faiss

  lowerCAmelCase    				= self._create_dummy_dataset()
  dset.add_faiss_index_from_external_arrays(
      external_arrays=np.ones((30, 5)     ) * np.arange(30     ).reshape(-1				,       1     )				,       index_name='vecs'				,       batch_size=1_00				,       metric_type=faiss.METRIC_INNER_PRODUCT				,       )
  lowerCAmelCase				,lowerCAmelCase    				= dset.get_nearest_examples('vecs'				,       np.ones(5				,       dtype=np.floataa     )     )
  self.assertEqual(examples['filename'][0]				,       'my_name-train_29'     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  import faiss

  lowerCAmelCase    				= self._create_dummy_dataset()
  dset.add_faiss_index_from_external_arrays(
      external_arrays=np.ones((30, 5)     ) * np.arange(30     ).reshape(-1				,       1     )				,       index_name='vecs'				,       metric_type=faiss.METRIC_INNER_PRODUCT				,       )

  # Setting delete=False and unlinking manually is not pretty... but it is required on Windows to
  # ensure somewhat stable behaviour. If we don't, we get PermissionErrors. This is an age-old issue.
  # see https://bugs.python.org/issue14243 and
  # https://stackoverflow.com/questions/23212435/permission-denied-to-write-to-my-temporary-file/23212515
  with tempfile.NamedTemporaryFile(delete=_snake_case     ) as tmp_file:
   dset.save_faiss_index('vecs'				,       tmp_file.name     )
   dset.load_faiss_index('vecs2'				,       tmp_file.name     )
  os.unlink(tmp_file.name     )

  lowerCAmelCase				,lowerCAmelCase    				= dset.get_nearest_examples('vecs2'				,       np.ones(5				,       dtype=np.floataa     )     )
  self.assertEqual(examples['filename'][0]				,       'my_name-train_29'     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  lowerCAmelCase    				= self._create_dummy_dataset()
  dset.add_faiss_index_from_external_arrays(
      external_arrays=np.ones((30, 5)     ) * np.arange(30     ).reshape(-1				,       1     )				,       index_name='vecs'     )
  dset.drop_index('vecs'     )
  self.assertRaises(_snake_case				,       partial(dset.get_nearest_examples				,       'vecs2'				,       np.ones(5				,       dtype=np.floataa     )     )     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  from elasticsearch import Elasticsearch

  lowerCAmelCase    				= self._create_dummy_dataset()
  with patch('elasticsearch.Elasticsearch.search'     ) as mocked_search, patch(
      'elasticsearch.client.IndicesClient.create'     ) as mocked_index_create, patch('elasticsearch.helpers.streaming_bulk'     ) as mocked_bulk:
   lowerCAmelCase    				= {'acknowledged': True}
   mocked_bulk.return_value([(True, None)] * 30     )
   lowerCAmelCase    				= {'hits': {'hits': [{'_score': 1, '_id': 29}]}}
   lowerCAmelCase    				= Elasticsearch()

   dset.add_elasticsearch_index('filename'				,       es_client=_snake_case     )
   lowerCAmelCase				,lowerCAmelCase    				= dset.get_nearest_examples('filename'				,       'my_name-train_29'     )
   self.assertEqual(examples['filename'][0]				,       'my_name-train_29'     )







@require_faiss
class       a							(   a__  ):



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  import faiss

  lowerCAmelCase    				= FaissIndex(metric_type=faiss.METRIC_INNER_PRODUCT     )

  # add vectors
  index.add_vectors(np.eye(5				,       dtype=np.floataa     )     )
  self.assertIsNotNone(index.faiss_index     )
  self.assertEqual(index.faiss_index.ntotal				,       5     )
  index.add_vectors(np.zeros((5, 5)				,       dtype=np.floataa     )     )
  self.assertEqual(index.faiss_index.ntotal				,       10     )

  # single query
  lowerCAmelCase    				= np.zeros(5				,       dtype=np.floataa     )
  lowerCAmelCase    				= 1
  lowerCAmelCase				,lowerCAmelCase    				= index.search(_snake_case     )
  self.assertRaises(_snake_case				,       index.search				,       query.reshape(-1				,       1     )     )
  self.assertGreater(scores[0]				,       0     )
  self.assertEqual(indices[0]				,       1     )

  # batched queries
  lowerCAmelCase    				= np.eye(5				,       dtype=np.floataa     )[::-1]
  lowerCAmelCase				,lowerCAmelCase    				= index.search_batch(_snake_case     )
  self.assertRaises(_snake_case				,       index.search_batch				,       queries[0]     )
  lowerCAmelCase    				= [scores[0] for scores in total_scores]
  lowerCAmelCase    				= [indices[0] for indices in total_indices]
  self.assertGreater(np.min(_snake_case     )				,       0     )
  self.assertListEqual([4, 3, 2, 1, 0]				,       _snake_case     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  import faiss

  lowerCAmelCase    				= FaissIndex(string_factory='Flat'     )
  index.add_vectors(np.eye(5				,       dtype=np.floataa     )     )
  self.assertIsInstance(index.faiss_index				,       faiss.IndexFlat     )
  lowerCAmelCase    				= FaissIndex(string_factory='LSH'     )
  index.add_vectors(np.eye(5				,       dtype=np.floataa     )     )
  self.assertIsInstance(index.faiss_index				,       faiss.IndexLSH     )
  with self.assertRaises(_snake_case     ):
   lowerCAmelCase    				= FaissIndex(string_factory='Flat'				,       custom_index=faiss.IndexFlat(5     )     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  import faiss

  lowerCAmelCase    				= faiss.IndexFlat(5     )
  lowerCAmelCase    				= FaissIndex(custom_index=_snake_case     )
  index.add_vectors(np.eye(5				,       dtype=np.floataa     )     )
  self.assertIsInstance(index.faiss_index				,       faiss.IndexFlat     )



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  import faiss

  lowerCAmelCase    				= FaissIndex(metric_type=faiss.METRIC_INNER_PRODUCT     )
  index.add_vectors(np.eye(5				,       dtype=np.floataa     )     )

  # Setting delete=False and unlinking manually is not pretty... but it is required on Windows to
  # ensure somewhat stable behaviour. If we don't, we get PermissionErrors. This is an age-old issue.
  # see https://bugs.python.org/issue14243 and
  # https://stackoverflow.com/questions/23212435/permission-denied-to-write-to-my-temporary-file/23212515
  with tempfile.NamedTemporaryFile(delete=_snake_case     ) as tmp_file:
   index.save(tmp_file.name     )
   lowerCAmelCase    				= FaissIndex.load(tmp_file.name     )
  os.unlink(tmp_file.name     )

  lowerCAmelCase    				= np.zeros(5				,       dtype=np.floataa     )
  lowerCAmelCase    				= 1
  lowerCAmelCase				,lowerCAmelCase    				= index.search(_snake_case     )
  self.assertGreater(scores[0]				,       0     )
  self.assertEqual(indices[0]				,       1     )


@require_faiss
def 		_SCREAMING_SNAKE_CASE			(_UpperCAmelCase					:    Dict			):
 import faiss

 lowerCAmelCase    				= FaissIndex(metric_type=faiss.METRIC_INNER_PRODUCT			)
 index.add_vectors(np.eye(5  ,     dtype=np.floataa			)			)

 lowerCAmelCase    				= 'index.faiss'
 lowerCAmelCase    				= F'mock://{index_name}'
 index.save(_UpperCAmelCase  ,     storage_options=mockfs.storage_options			)
 lowerCAmelCase    				= FaissIndex.load(_UpperCAmelCase  ,     storage_options=mockfs.storage_options			)

 lowerCAmelCase    				= np.zeros(5  ,     dtype=np.floataa			)
 lowerCAmelCase    				= 1
 lowerCAmelCase				,lowerCAmelCase    				= index.search(_UpperCAmelCase			)
 assert scores[0] > 0
 assert indices[0] == 1







@require_elasticsearch
class       a							(   a__  ):



 def    UpperCamelCase__  (     self     ):







  """simple docstring"""






  from elasticsearch import Elasticsearch

  with patch('elasticsearch.Elasticsearch.search'     ) as mocked_search, patch(
      'elasticsearch.client.IndicesClient.create'     ) as mocked_index_create, patch('elasticsearch.helpers.streaming_bulk'     ) as mocked_bulk:
   lowerCAmelCase    				= Elasticsearch()
   lowerCAmelCase    				= {'acknowledged': True}
   lowerCAmelCase    				= ElasticSearchIndex(es_client=_snake_case     )
   mocked_bulk.return_value([(True, None)] * 3     )
   index.add_documents(['foo', 'bar', 'foobar']     )

   # single query
   lowerCAmelCase    				= 'foo'
   lowerCAmelCase    				= {'hits': {'hits': [{'_score': 1, '_id': 0}]}}
   lowerCAmelCase				,lowerCAmelCase    				= index.search(_snake_case     )
   self.assertEqual(scores[0]				,       1     )
   self.assertEqual(indices[0]				,       0     )

   # single query with timeout
   lowerCAmelCase    				= 'foo'
   lowerCAmelCase    				= {'hits': {'hits': [{'_score': 1, '_id': 0}]}}
   lowerCAmelCase				,lowerCAmelCase    				= index.search(_snake_case				,       request_timeout=30     )
   self.assertEqual(scores[0]				,       1     )
   self.assertEqual(indices[0]				,       0     )

   # batched queries
   lowerCAmelCase    				= ['foo', 'bar', 'foobar']
   lowerCAmelCase    				= {'hits': {'hits': [{'_score': 1, '_id': 1}]}}
   lowerCAmelCase				,lowerCAmelCase    				= index.search_batch(_snake_case     )
   lowerCAmelCase    				= [scores[0] for scores in total_scores]
   lowerCAmelCase    				= [indices[0] for indices in total_indices]
   self.assertGreater(np.min(_snake_case     )				,       0     )
   self.assertListEqual([1, 1, 1]				,       _snake_case     )

   # batched queries with timeout
   lowerCAmelCase    				= ['foo', 'bar', 'foobar']
   lowerCAmelCase    				= {'hits': {'hits': [{'_score': 1, '_id': 1}]}}
   lowerCAmelCase				,lowerCAmelCase    				= index.search_batch(_snake_case				,       request_timeout=30     )
   lowerCAmelCase    				= [scores[0] for scores in total_scores]
   lowerCAmelCase    				= [indices[0] for indices in total_indices]
   self.assertGreater(np.min(_snake_case     )				,       0     )
   self.assertListEqual([1, 1, 1]				,       _snake_case     )





