
"""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


A_    							=					pytest.mark.integration




@require_faiss
class  __lowerCamelCase  ( lowerCAmelCase			):




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




				def        UpperCAmelCase__						(				self   ):
							import faiss

							lowerCamelCase_					=  self._create_dummy_dataset()
							lowerCamelCase_					=  dset.map(
							    lambda UpperCAmelCase							,						UpperCAmelCase   : {"vecs": i * np.ones(5							,						dtype=np.floataa   )}							,						with_indices=UpperCAmelCase							,						keep_in_memory=UpperCAmelCase   )
							lowerCamelCase_					=  dset.add_faiss_index('''vecs'''							,						batch_size=100							,						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   ):
							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=100							,						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   ):
							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=UpperCAmelCase   ) 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   ):
							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(UpperCAmelCase							,						partial(dset.get_nearest_examples							,						'''vecs2'''							,						np.ones(5							,						dtype=np.floataa   )   )   )





				def        UpperCAmelCase__						(				self   ):
							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=UpperCAmelCase   )
										lowerCamelCase_		, lowerCamelCase_					=  dset.get_nearest_examples('''filename'''							,						'''my_name-train_29'''   )
										self.assertEqual(examples['''filename'''][0]							,						'''my_name-train_29'''   )




@require_faiss
class  __lowerCamelCase  ( lowerCAmelCase			):




				def        UpperCAmelCase__						(				self   ):
							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(UpperCAmelCase   )
							self.assertRaises(UpperCAmelCase							,						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(UpperCAmelCase   )
							self.assertRaises(UpperCAmelCase							,						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(UpperCAmelCase   )							,						0   )
							self.assertListEqual([4, 3, 2, 1, 0]							,						UpperCAmelCase   )




				def        UpperCAmelCase__						(				self   ):
							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(UpperCAmelCase   ):
										lowerCamelCase_					=  FaissIndex(string_factory='''Flat'''							,						custom_index=faiss.IndexFlat(5   )   )




				def        UpperCAmelCase__						(				self   ):
							import faiss

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





				def        UpperCAmelCase__						(				self   ):
							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=UpperCAmelCase   ) 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(UpperCAmelCase   )
							self.assertGreater(scores[0]							,						0   )
							self.assertEqual(indices[0]							,						1   )






@require_faiss
def  lowercase						(	lowerCAmelCase__						):
			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(lowerCAmelCase__	,storage_options=mockfs.storage_options						)
			lowerCamelCase_					=  FaissIndex.load(lowerCAmelCase__	,storage_options=mockfs.storage_options						)

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




@require_elasticsearch
class  __lowerCamelCase  ( lowerCAmelCase			):




				def        UpperCAmelCase__						(				self   ):
							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=UpperCAmelCase   )
										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(UpperCAmelCase   )
										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(UpperCAmelCase							,						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(UpperCAmelCase   )
										lowerCamelCase_					=  [scores[0] for scores in total_scores]
										lowerCamelCase_					=  [indices[0] for indices in total_indices]
										self.assertGreater(np.min(UpperCAmelCase   )							,						0   )
										self.assertListEqual([1, 1, 1]							,						UpperCAmelCase   )

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







'''simple docstring'''
def       _lowercase							(					UpperCamelCase__							:       int,					UpperCamelCase__							:       int      ):
 return 1 if input_a == input_a else 0


def       _lowercase							(					):
 assert xnor_gate(0,					0      ) == 1
 assert xnor_gate(0,					1      ) == 0
 assert xnor_gate(1,					0      ) == 0
 assert xnor_gate(1,					1      ) == 1


if __name__ == "__main__":
 print(xnor_gate(0, 0))
 print(xnor_gate(0, 1))
 print(xnor_gate(1, 0))
 print(xnor_gate(1, 1))






