

"""simple docstring"""




import gc
import unittest

import numpy as np
import torch
from transformers import CLIPTextConfig, CLIPTextModel, CLIPTokenizer

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    StableDiffusionAttendAndExcitePipeline,
    UNetaDConditionModel,
)
from diffusers.utils import load_numpy, skip_mps, slow
from diffusers.utils.testing_utils import require_torch_gpu

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


__UpperCAmelCase =				False







@skip_mps
class      __lowercase			(    __lowerCamelCase	,			__lowerCamelCase	,			__lowerCamelCase	,			unittest.TestCase					):
  snake_case_				       =       StableDiffusionAttendAndExcitePipeline
  snake_case_				       =       False
  snake_case_				       =       TEXT_TO_IMAGE_PARAMS
  snake_case_				       =       TEXT_TO_IMAGE_BATCH_PARAMS.union({"""token_indices"""}					)
  snake_case_				       =       TEXT_TO_IMAGE_IMAGE_PARAMS
  snake_case_				       =       TEXT_TO_IMAGE_IMAGE_PARAMS

  @classmethod
  def    __lowercase       (  cls		:			Optional[int]    ):






   '''simple docstring'''
   super().setUpClass()
   torch.use_deterministic_algorithms(A    )

  @classmethod
  def    __lowercase       (  cls		:			Union[str, Any]    ):






   '''simple docstring'''
   super().tearDownClass()
   torch.use_deterministic_algorithms(A    )

  def    __lowercase       (  self		:			Any    ):






   '''simple docstring'''
   torch.manual_seed(0    )
   UpperCAmelCase__					:  str					   =					UNetaDConditionModel(
       block_out_channels=(32, 64)					,layers_per_block=1					,sample_size=32					,in_channels=4					,out_channels=4					,down_block_types=("""DownBlock2D""", """CrossAttnDownBlock2D""")					,up_block_types=("""CrossAttnUpBlock2D""", """UpBlock2D""")					,cross_attention_dim=32					,attention_head_dim=(2, 4)					,use_linear_projection=A					,)
   UpperCAmelCase__					:  Tuple					   =					DDIMScheduler(
       beta_start=0.0_0_0_8_5					,beta_end=0.0_1_2					,beta_schedule="""scaled_linear"""					,clip_sample=A					,set_alpha_to_one=A					,)
   torch.manual_seed(0    )
   UpperCAmelCase__					:  List[Any]					   =					AutoencoderKL(
       block_out_channels=[32, 64]					,in_channels=3					,out_channels=3					,down_block_types=["""DownEncoderBlock2D""", """DownEncoderBlock2D"""]					,up_block_types=["""UpDecoderBlock2D""", """UpDecoderBlock2D"""]					,latent_channels=4					,sample_size=128					,)
   torch.manual_seed(0    )
   UpperCAmelCase__					:  Any					   =					CLIPTextConfig(
       bos_token_id=0					,eos_token_id=2					,hidden_size=32					,intermediate_size=37					,layer_norm_eps=1e-05					,num_attention_heads=4					,num_hidden_layers=5					,pad_token_id=1					,vocab_size=1_000					,hidden_act="""gelu"""					,projection_dim=512					,)
   UpperCAmelCase__					:  str					   =					CLIPTextModel(A    )
   UpperCAmelCase__					:  int					   =					CLIPTokenizer.from_pretrained("""hf-internal-testing/tiny-random-clip"""    )

   UpperCAmelCase__					:  int					   =					{
       """unet""": unet,
       """scheduler""": scheduler,
       """vae""": vae,
       """text_encoder""": text_encoder,
       """tokenizer""": tokenizer,
       """safety_checker""": None,
       """feature_extractor""": None,
   }

   return components

  def    __lowercase       (  self		:			Dict					,A		:			List[Any]					,A		:			int=0    ):






   '''simple docstring'''
   if str(A    ).startswith("""mps"""    ):
    UpperCAmelCase__					:  List[Any]					   =					torch.manual_seed(A    )
   else:
    UpperCAmelCase__					:  str					   =					torch.Generator(device=A    ).manual_seed(A    )
   UpperCAmelCase__					:  Union[str, Any]					   =					{
       """prompt""": """a cat and a frog""",
       """token_indices""": [2, 5],
       """generator""": generator,
       """num_inference_steps""": 1,
       """guidance_scale""": 6.0,
       """output_type""": """numpy""",
       """max_iter_to_alter""": 2,
       """thresholds""": {0: 0.7},
   }
   return inputs

  def    __lowercase       (  self		:			List[str]    ):






   '''simple docstring'''
   UpperCAmelCase__					:  Tuple					   =					"""cpu"""

   UpperCAmelCase__					:  List[Any]					   =					self.get_dummy_components()
   UpperCAmelCase__					:  int					   =					self.pipeline_class(**A    )
   pipe.to(A    )
   pipe.set_progress_bar_config(disable=A    )

   UpperCAmelCase__					:  Union[str, Any]					   =					self.get_dummy_inputs(A    )
   UpperCAmelCase__					:  Any					   =					pipe(**A    ).images
   UpperCAmelCase__					:  str					   =					image[0, -3:, -3:, -1]

   self.assertEqual(image.shape					,(1, 64, 64, 3)    )
   UpperCAmelCase__					:  List[str]					   =					np.array(
       [0.6_3_9_0_5_3_6_4, 0.6_2_8_9_7_3_0_7, 0.4_8_5_9_9_0_1_7, 0.5_1_3_3_6_2_4, 0.5_5_5_0_0_4_8, 0.4_5_7_6_9_5_1_6, 0.5_0_3_2_6_9_7_3, 0.5_0_2_3_1_3_9, 0.4_5_3_8_4_4_9_6]    )
   UpperCAmelCase__					:  Optional[int]					   =					np.abs(image_slice.flatten() - expected_slice    ).max()
   self.assertLessEqual(A					,1e-3    )

  def    __lowercase       (  self		:			str    ):






   '''simple docstring'''
   super().test_cpu_offload_forward_pass(expected_max_diff=5e-4    )

  def    __lowercase       (  self		:			Union[str, Any]    ):






   '''simple docstring'''
   # NOTE: Larger batch sizes cause this test to timeout, only test on smaller batches
   self._test_inference_batch_consistent(batch_sizes=[1, 2]    )

  def    __lowercase       (  self		:			List[str]    ):






   '''simple docstring'''
   self._test_inference_batch_single_identical(batch_size=2					,expected_max_diff=7e-4    )

  def    __lowercase       (  self		:			List[Any]    ):






   '''simple docstring'''
   super().test_dict_tuple_outputs_equivalent(expected_max_difference=3e-3    )

  def    __lowercase       (  self		:			Optional[Any]    ):






   '''simple docstring'''
   super().test_pt_np_pil_outputs_equivalent(expected_max_diff=5e-4    )

  def    __lowercase       (  self		:			Optional[Any]    ):






   '''simple docstring'''
   super().test_save_load_local(expected_max_difference=5e-4    )




  def    __lowercase       (  self		:			Optional[int]    ):






   '''simple docstring'''
   super().test_save_load_optional_components(expected_max_difference=4e-4    )







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

  @classmethod
  def    __lowercase       (  cls		:			Any    ):






   '''simple docstring'''
   super().setUpClass()
   torch.use_deterministic_algorithms(A    )

  @classmethod
  def    __lowercase       (  cls		:			List[str]    ):






   '''simple docstring'''
   super().tearDownClass()
   torch.use_deterministic_algorithms(A    )

  def    __lowercase       (  self		:			List[Any]    ):






   '''simple docstring'''
   super().tearDown()
   gc.collect()
   torch.cuda.empty_cache()




  def    __lowercase       (  self		:			str    ):






   '''simple docstring'''
   UpperCAmelCase__					:  Optional[int]					   =					torch.manual_seed(51    )

   UpperCAmelCase__					:  List[str]					   =					StableDiffusionAttendAndExcitePipeline.from_pretrained(
       """CompVis/stable-diffusion-v1-4"""					,safety_checker=A					,torch_dtype=torch.floataa    )
   pipe.to("""cuda"""    )

   UpperCAmelCase__					:  Optional[int]					   =					"""a painting of an elephant with glasses"""
   UpperCAmelCase__					:  List[Any]					   =					[5, 7]

   UpperCAmelCase__					:  Any					   =					pipe(
       prompt=A					,token_indices=A					,guidance_scale=7.5					,generator=A					,num_inference_steps=5					,max_iter_to_alter=5					,output_type="""numpy"""					,).images[0]

   UpperCAmelCase__					:  List[Any]					   =					load_numpy(
       """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/attend-and-excite/elephant_glasses.npy"""    )
   assert np.abs((expected_image - image).max()    ) < 5e-1








"""simple docstring"""




import argparse
import os
import re

import packaging.version


__UpperCAmelCase =				'examples/'
__UpperCAmelCase =				{
    'examples': (re.compile(r'^check_min_version\("[^"]+"\)\s*$', re.MULTILINE), 'check_min_version("VERSION")\n'),
    'init': (re.compile(r'^__version__\s+=\s+"([^"]+)"\s*$', re.MULTILINE), '__version__ = "VERSION"\n'),
    'setup': (re.compile(r'^(\s*)version\s*=\s*"[^"]+",', re.MULTILINE), r'\1version="VERSION",'),
    'doc': (re.compile(r'^(\s*)release\s*=\s*"[^"]+"$', re.MULTILINE), 'release = "VERSION"\n'),
}
__UpperCAmelCase =				{
    'init': 'src/transformers/__init__.py',
    'setup': 'setup.py',
}
__UpperCAmelCase =				'README.md'
def   lowerCAmelCase						(					__UpperCamelCase							,    __UpperCamelCase							,    __UpperCamelCase      ):
 '''simple docstring'''





 with open(__UpperCamelCase							,    """r"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  UpperCAmelCase__					:  Dict					   =					f.read()
 UpperCAmelCase__   ,      UpperCAmelCase__					:  Any					   =					REPLACE_PATTERNS[pattern]
 UpperCAmelCase__					:  List[str]					   =					replace.replace("""VERSION"""							,    __UpperCamelCase      )
 UpperCAmelCase__					:  Tuple					   =					re_pattern.sub(__UpperCamelCase							,    __UpperCamelCase      )
 with open(__UpperCamelCase							,    """w"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  f.write(__UpperCamelCase      )
def   lowerCAmelCase						(					__UpperCamelCase      ):
 '''simple docstring'''





 for folder, directories, fnames in os.walk(__UpperCamelCase      ):
  # Removing some of the folders with non-actively maintained examples from the walk
  if "research_projects" in directories:
   directories.remove("""research_projects"""      )
  if "legacy" in directories:
   directories.remove("""legacy"""      )
  for fname in fnames:
   if fname.endswith(""".py"""      ):
    update_version_in_file(os.path.join(__UpperCamelCase							,    __UpperCamelCase      )							,    __UpperCamelCase							,    pattern="""examples"""      )
def   lowerCAmelCase						(					__UpperCamelCase							,    __UpperCamelCase=False      ):
 '''simple docstring'''





 for pattern, fname in REPLACE_FILES.items():
  update_version_in_file(__UpperCamelCase							,    __UpperCamelCase							,    __UpperCamelCase      )
 if not patch:
  update_version_in_examples(__UpperCamelCase      )
def   lowerCAmelCase						(					):
 '''simple docstring'''





 UpperCAmelCase__					:  Dict					   =					"""🤗 Transformers currently provides the following architectures"""
 UpperCAmelCase__					:  Union[str, Any]					   =					"""1. Want to contribute a new model?"""
 with open(__UpperCamelCase							,    """r"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  UpperCAmelCase__					:  str					   =					f.readlines()

 # Find the start of the list.
 UpperCAmelCase__					:  List[Any]					   =					0
 while not lines[start_index].startswith(_start_prompt      ):
  start_index += 1
 start_index += 1

 UpperCAmelCase__					:  int					   =					start_index
 # Update the lines in the model list.
 while not lines[index].startswith(_end_prompt      ):
  if lines[index].startswith("""1."""      ):
   UpperCAmelCase__					:  List[Any]					   =					lines[index].replace(
       """https://huggingface.co/docs/transformers/main/model_doc"""							,    """https://huggingface.co/docs/transformers/model_doc"""							,    )
  index += 1

 with open(__UpperCamelCase							,    """w"""							,    encoding="""utf-8"""							,    newline="""\n"""      ) as f:
  f.writelines(__UpperCamelCase      )
def   lowerCAmelCase						(					):
 '''simple docstring'''





 with open(REPLACE_FILES["""init"""]							,    """r"""      ) as f:
  UpperCAmelCase__					:  Optional[Any]					   =					f.read()
 UpperCAmelCase__					:  int					   =					REPLACE_PATTERNS["""init"""][0].search(__UpperCamelCase      ).groups()[0]
 return packaging.version.parse(__UpperCamelCase      )
def   lowerCAmelCase						(					__UpperCamelCase=False      ):
 '''simple docstring'''





 UpperCAmelCase__					:  List[str]					   =					get_version()
 if patch and default_version.is_devrelease:
  raise ValueError("""Can't create a patch version from the dev branch, checkout a released version!"""      )
 if default_version.is_devrelease:
  UpperCAmelCase__					:  List[str]					   =					default_version.base_version
 elif patch:
  UpperCAmelCase__					:  Any					   =					F"{default_version.major}.{default_version.minor}.{default_version.micro + 1}"
 else:
  UpperCAmelCase__					:  Optional[Any]					   =					F"{default_version.major}.{default_version.minor + 1}.0"

 # Now let's ask nicely if that's the right one.
 UpperCAmelCase__					:  Optional[int]					   =					input(F"Which version are you releasing? [{default_version}]"      )
 if len(__UpperCamelCase      ) == 0:
  UpperCAmelCase__					:  Union[str, Any]					   =					default_version

 print(F"Updating version to {version}."      )
 global_version_update(__UpperCamelCase							,    patch=__UpperCamelCase      )
 if not patch:
  print("""Cleaning main README, don't forget to run `make fix-copies`."""      )
  clean_main_ref_in_model_list()
def   lowerCAmelCase						(					):
 '''simple docstring'''





 UpperCAmelCase__					:  Optional[Any]					   =					get_version()
 UpperCAmelCase__					:  Any					   =					F"{current_version.major}.{current_version.minor + 1}.0.dev0"
 UpperCAmelCase__					:  List[Any]					   =					current_version.base_version

 # Check with the user we got that right.
 UpperCAmelCase__					:  Dict					   =					input(F"Which version are we developing now? [{dev_version}]"      )
 if len(__UpperCamelCase      ) == 0:
  UpperCAmelCase__					:  List[Any]					   =					dev_version

 print(F"Updating version to {version}."      )
 global_version_update(__UpperCamelCase      )
 print("""Cleaning main README, don't forget to run `make fix-copies`."""      )
 clean_main_ref_in_model_list()


if __name__ == "__main__":
      __UpperCAmelCase =				argparse.ArgumentParser()
      parser.add_argument('--post_release', action='store_true', help='Whether this is pre or post release.')
      parser.add_argument('--patch', action='store_true', help='Whether or not this is a patch release.')
      __UpperCAmelCase =				parser.parse_args()
      if not args.post_release:
            pre_release_work(patch=args.patch)
      elif args.patch:
            print('Nothing to do after a patch :-)')
      else:
            post_release_work()





