





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


SCREAMING_SNAKE_CASE_						   =       pytest.mark.integration

@require_faiss
class 		UpperCamelCase__ (      lowerCAmelCase_   ):



     '''simple docstring'''

     def 				SCREAMING_SNAKE_CASE__  (							self						:    Dict       )     ->		List[Any]:




           '''simple docstring'''


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






     def 				SCREAMING_SNAKE_CASE__  (							self						:    Union[str, Any]       )     ->		int:




           '''simple docstring'''


           import faiss

           SCREAMING_SNAKE_CASE		=						self._create_dummy_dataset()
           SCREAMING_SNAKE_CASE		=						dset.map(
               lambda lowerCamelCase__						,lowerCamelCase__       : {"vecs": i * np.ones(5						,dtype=np.floataa       )}						,with_indices=lowerCamelCase__						,keep_in_memory=lowerCamelCase__       )
           SCREAMING_SNAKE_CASE		=						dset.add_faiss_index("""vecs"""						,batch_size=100						,metric_type=faiss.METRIC_INNER_PRODUCT       )
           SCREAMING_SNAKE_CASE,					SCREAMING_SNAKE_CASE		=						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 				SCREAMING_SNAKE_CASE__  (							self						:    Optional[int]       )     ->		Union[str, Any]:




           '''simple docstring'''


           import faiss

           SCREAMING_SNAKE_CASE		=						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						,)
           SCREAMING_SNAKE_CASE,					SCREAMING_SNAKE_CASE		=						dset.get_nearest_examples("""vecs"""						,np.ones(5						,dtype=np.floataa       )       )
           self.assertEqual(examples["""filename"""][0]						,"""my_name-train_29"""       )






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




           '''simple docstring'''


           import faiss

           SCREAMING_SNAKE_CASE		=						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=lowerCamelCase__       ) as tmp_file:
                 dset.save_faiss_index("""vecs"""						,tmp_file.name       )
                 dset.load_faiss_index("""vecs2"""						,tmp_file.name       )
           os.unlink(tmp_file.name       )

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






     def 				SCREAMING_SNAKE_CASE__  (							self						:    Optional[Any]       )     ->		Optional[Any]:




           '''simple docstring'''


           SCREAMING_SNAKE_CASE		=						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(lowerCamelCase__						,partial(dset.get_nearest_examples						,"""vecs2"""						,np.ones(5						,dtype=np.floataa       )       )       )






     def 				SCREAMING_SNAKE_CASE__  (							self						:    Dict       )     ->		List[str]:




           '''simple docstring'''


           from elasticsearch import Elasticsearch

           SCREAMING_SNAKE_CASE		=						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:
                 SCREAMING_SNAKE_CASE		=						{"""acknowledged""": True}
                 mocked_bulk.return_value([(True, None)] * 30       )
                 SCREAMING_SNAKE_CASE		=						{"""hits""": {"""hits""": [{"""_score""": 1, """_id""": 29}]}}
                 SCREAMING_SNAKE_CASE		=						Elasticsearch()

                 dset.add_elasticsearch_index("""filename"""						,es_client=lowerCamelCase__       )
                 SCREAMING_SNAKE_CASE,					SCREAMING_SNAKE_CASE		=						dset.get_nearest_examples("""filename"""						,"""my_name-train_29"""       )
                 self.assertEqual(examples["""filename"""][0]						,"""my_name-train_29"""       )

@require_faiss
class 		UpperCamelCase__ (      lowerCAmelCase_   ):



     '''simple docstring'''

     def 				SCREAMING_SNAKE_CASE__  (							self						:    List[str]       )     ->		Tuple:




           '''simple docstring'''


           import faiss

           SCREAMING_SNAKE_CASE		=						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
           SCREAMING_SNAKE_CASE		=						np.zeros(5						,dtype=np.floataa       )
           SCREAMING_SNAKE_CASE		=						1
           SCREAMING_SNAKE_CASE,					SCREAMING_SNAKE_CASE		=						index.search(lowerCamelCase__       )
           self.assertRaises(lowerCamelCase__						,index.search						,query.reshape(-1						,1       )       )
           self.assertGreater(scores[0]						,0       )
           self.assertEqual(indices[0]						,1       )

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






     def 				SCREAMING_SNAKE_CASE__  (							self						:    int       )     ->		str:




           '''simple docstring'''


           import faiss

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






     def 				SCREAMING_SNAKE_CASE__  (							self						:    Optional[int]       )     ->		Tuple:




           '''simple docstring'''


           import faiss

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






     def 				SCREAMING_SNAKE_CASE__  (							self						:    Any       )     ->		Union[str, Any]:




           '''simple docstring'''


           import faiss

           SCREAMING_SNAKE_CASE		=						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=lowerCamelCase__       ) as tmp_file:
                 index.save(tmp_file.name       )
                 SCREAMING_SNAKE_CASE		=						FaissIndex.load(tmp_file.name       )
           os.unlink(tmp_file.name       )

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



@require_faiss
def    __lowercase   (      _SCREAMING_SNAKE_CASE	) ->   int:


      '''simple docstring'''


      import faiss

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

      SCREAMING_SNAKE_CASE		=						"""index.faiss"""
      SCREAMING_SNAKE_CASE		=						F"""mock://{index_name}"""
      index.save(UpperCAmelCase_ ,						storage_options=mockfs.storage_options	)
      SCREAMING_SNAKE_CASE		=						FaissIndex.load(UpperCAmelCase_ ,						storage_options=mockfs.storage_options	)

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



@require_elasticsearch
class 		UpperCamelCase__ (      lowerCAmelCase_   ):



     '''simple docstring'''

     def 				SCREAMING_SNAKE_CASE__  (							self						:    Any       )     ->		Dict:




           '''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:
                 SCREAMING_SNAKE_CASE		=						Elasticsearch()
                 SCREAMING_SNAKE_CASE		=						{"""acknowledged""": True}
                 SCREAMING_SNAKE_CASE		=						ElasticSearchIndex(es_client=lowerCamelCase__       )
                 mocked_bulk.return_value([(True, None)] * 3       )
                 index.add_documents(["""foo""", """bar""", """foobar"""]       )

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

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

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

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






'''simple docstring'''

import gc
import unittest

import torch
from transformers import CLIPTextConfig, CLIPTextModel, CLIPTextModelWithProjection, CLIPTokenizer

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    DDPMScheduler,
    PriorTransformer,
    StableUnCLIPPipeline,
    UNetaDConditionModel,
)
from diffusers.pipelines.stable_diffusion.stable_unclip_image_normalizer import StableUnCLIPImageNormalizer
from diffusers.utils.testing_utils import enable_full_determinism, load_numpy, require_torch_gpu, slow, torch_device

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_IMAGE_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import (
    PipelineKarrasSchedulerTesterMixin,
    PipelineLatentTesterMixin,
    PipelineTesterMixin,
    assert_mean_pixel_difference,
)


enable_full_determinism()





class      snake_case    (    lowercase			,						lowercase			,						lowercase			,						unittest.TestCase			):





  """simple docstring"""




  _lowerCamelCase		    =  StableUnCLIPPipeline
  _lowerCamelCase		    =  TEXT_TO_IMAGE_PARAMS
  _lowerCamelCase		    =  TEXT_TO_IMAGE_BATCH_PARAMS
  _lowerCamelCase		    =  TEXT_TO_IMAGE_IMAGE_PARAMS
  _lowerCamelCase		    =  TEXT_TO_IMAGE_IMAGE_PARAMS

  # TODO(will) Expected attn_bias.stride(1) == 0 to be true, but got false
  _lowerCamelCase		    =  False






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  32
   lowerCamelCase_      =  embedder_hidden_size

   # prior components

   torch.manual_seed(0     )
   lowerCamelCase_      =  CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"     )

   torch.manual_seed(0     )
   lowerCamelCase_      =  CLIPTextModelWithProjection(
       CLIPTextConfig(
           bos_token_id=0			,  eos_token_id=2			,  hidden_size=UpperCamelCase			,  projection_dim=UpperCamelCase			,  intermediate_size=37			,  layer_norm_eps=1e-05			,  num_attention_heads=4			,  num_hidden_layers=5			,  pad_token_id=1			,  vocab_size=1000			,  )     )

   torch.manual_seed(0     )
   lowerCamelCase_      =  PriorTransformer(
       num_attention_heads=2			,  attention_head_dim=12			,  embedding_dim=UpperCamelCase			,  num_layers=1			,  )

   torch.manual_seed(0     )
   lowerCamelCase_      =  DDPMScheduler(
       variance_type="fixed_small_log"			,  prediction_type="sample"			,  num_train_timesteps=1000			,  clip_sample=UpperCamelCase			,  clip_sample_range=5.0			,  beta_schedule="squaredcos_cap_v2"			,  )

   # regular denoising components

   torch.manual_seed(0     )
   lowerCamelCase_      =  StableUnCLIPImageNormalizer(embedding_dim=UpperCamelCase     )
   lowerCamelCase_      =  DDPMScheduler(beta_schedule="squaredcos_cap_v2"     )

   torch.manual_seed(0     )
   lowerCamelCase_      =  CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip"     )

   torch.manual_seed(0     )
   lowerCamelCase_      =  CLIPTextModel(
       CLIPTextConfig(
           bos_token_id=0			,  eos_token_id=2			,  hidden_size=UpperCamelCase			,  projection_dim=32			,  intermediate_size=37			,  layer_norm_eps=1e-05			,  num_attention_heads=4			,  num_hidden_layers=5			,  pad_token_id=1			,  vocab_size=1000			,  )     )

   torch.manual_seed(0     )
   lowerCamelCase_      =  UNetaDConditionModel(
       sample_size=32			,  in_channels=4			,  out_channels=4			,  down_block_types=("CrossAttnDownBlock2D", "DownBlock2D")			,  up_block_types=("UpBlock2D", "CrossAttnUpBlock2D")			,  block_out_channels=(32, 64)			,  attention_head_dim=(2, 4)			,  class_embed_type="projection"			,  projection_class_embeddings_input_dim=embedder_projection_dim * 2			,  cross_attention_dim=UpperCamelCase			,  layers_per_block=1			,  upcast_attention=UpperCamelCase			,  use_linear_projection=UpperCamelCase			,  )

   torch.manual_seed(0     )
   lowerCamelCase_      =  DDIMScheduler(
       beta_schedule="scaled_linear"			,  beta_start=0.00_085			,  beta_end=0.012			,  prediction_type="v_prediction"			,  set_alpha_to_one=UpperCamelCase			,  steps_offset=1			,  )

   torch.manual_seed(0     )
   lowerCamelCase_      =  AutoencoderKL()

   lowerCamelCase_      =  {
       # prior components
       "prior_tokenizer": prior_tokenizer,
       "prior_text_encoder": prior_text_encoder,
       "prior": prior,
       "prior_scheduler": prior_scheduler,
       # image noising components
       "image_normalizer": image_normalizer,
       "image_noising_scheduler": image_noising_scheduler,
       # regular denoising components
       "tokenizer": tokenizer,
       "text_encoder": text_encoder,
       "unet": unet,
       "scheduler": scheduler,
       "vae": vae,
   }

   return components






  def   snake_case		(    self			,  UpperCamelCase			,  UpperCamelCase=0     ):







   """simple docstring"""
   if str(UpperCamelCase     ).startswith("mps"     ):
    lowerCamelCase_      =  torch.manual_seed(UpperCamelCase     )
   else:
    lowerCamelCase_      =  torch.Generator(device=UpperCamelCase     ).manual_seed(UpperCamelCase     )
   lowerCamelCase_      =  {
       "prompt": "A painting of a squirrel eating a burger",
       "generator": generator,
       "num_inference_steps": 2,
       "prior_num_inference_steps": 2,
       "output_type": "numpy",
   }
   return inputs






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  torch_device == "cpu"

   self._test_attention_slicing_forward_pass(test_max_difference=UpperCamelCase     )







  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  torch_device in ["cpu", "mps"]

   self._test_inference_batch_single_identical(test_max_difference=UpperCamelCase     )





@slow
@require_torch_gpu
class      snake_case    (    unittest.TestCase			):





  """simple docstring"""




  def   snake_case		(    self     ):







   """simple docstring"""
   # clean up the VRAM after each test
   super().tearDown()
   gc.collect()
   torch.cuda.empty_cache()






  def   snake_case		(    self     ):







   """simple docstring"""
   lowerCamelCase_      =  load_numpy(
       "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/stable_unclip_2_1_l_anime_turtle_fp16.npy"     )

   lowerCamelCase_      =  StableUnCLIPPipeline.from_pretrained("fusing/stable-unclip-2-1-l"			,  torch_dtype=torch.floataa     )
   pipe.to(UpperCamelCase     )
   pipe.set_progress_bar_config(disable=UpperCamelCase     )
   # stable unclip will oom when integration tests are run on a V100,
   # so turn on memory savings
   pipe.enable_attention_slicing()
   pipe.enable_sequential_cpu_offload()

   lowerCamelCase_      =  torch.Generator(device="cpu"     ).manual_seed(0     )
   lowerCamelCase_      =  pipe("anime turle"			,  generator=UpperCamelCase			,  output_type="np"     )

   lowerCamelCase_      =  output.images[0]

   assert image.shape == (768, 768, 3)

   assert_mean_pixel_difference(UpperCamelCase			,  UpperCamelCase     )







  def   snake_case		(    self     ):







   """simple docstring"""
   torch.cuda.empty_cache()
   torch.cuda.reset_max_memory_allocated()
   torch.cuda.reset_peak_memory_stats()

   lowerCamelCase_      =  StableUnCLIPPipeline.from_pretrained("fusing/stable-unclip-2-1-l"			,  torch_dtype=torch.floataa     )
   lowerCamelCase_      =  pipe.to(UpperCamelCase     )
   pipe.set_progress_bar_config(disable=UpperCamelCase     )
   pipe.enable_attention_slicing()
   pipe.enable_sequential_cpu_offload()

   lowerCamelCase_      =  pipe(
       "anime turtle"			,  prior_num_inference_steps=2			,  num_inference_steps=2			,  output_type="np"			,  )

   lowerCamelCase_      =  torch.cuda.max_memory_allocated()
   # make sure that less than 7 GB is allocated
   assert mem_bytes < 7 * 10**9



