import gc
import random
import tempfile
import unittest

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

from diffusers import (
    AutoencoderKL,
    ControlNetModel,
    DDIMScheduler,
    StableDiffusionControlNetImgaImgPipeline,
    UNetaDConditionModel,
)
from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_controlnet import MultiControlNetModel
from diffusers.utils import floats_tensor, load_image, load_numpy, randn_tensor, slow, torch_device
from diffusers.utils.import_utils import is_xformers_available
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu

from ..pipeline_params import (
    IMAGE_TO_IMAGE_IMAGE_PARAMS,
    TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS,
    TEXT_GUIDED_IMAGE_VARIATION_PARAMS,
)
from ..test_pipelines_common import (
    PipelineKarrasSchedulerTesterMixin,
    PipelineLatentTesterMixin,
    PipelineTesterMixin,
)


enable_full_determinism()



class       _snake_case   (	UpperCAmelCase_  ,						UpperCAmelCase_  ,						UpperCAmelCase_  ,						unittest.TestCase							):
 __lowerCAmelCase  :     str        =			StableDiffusionControlNetImgaImgPipeline
 __lowerCAmelCase  :     Union[str, Any]        =			TEXT_GUIDED_IMAGE_VARIATION_PARAMS - {'height', 'width'}
 __lowerCAmelCase  :     Tuple        =			TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
 __lowerCAmelCase  :     Optional[Any]        =			IMAGE_TO_IMAGE_IMAGE_PARAMS.union({'control_image'}							)
 __lowerCAmelCase  :     List[Any]        =			IMAGE_TO_IMAGE_IMAGE_PARAMS


 def      lowercase__     (					self):


   '''simple docstring'''




   torch.manual_seed(0)
   lowercase__  :   str    		=      UNetaDConditionModel(
       block_out_channels=(32, 64)					,  layers_per_block=2					,  sample_size=32					,  in_channels=4					,  out_channels=4					,  down_block_types=("""DownBlock2D""", """CrossAttnDownBlock2D""")					,  up_block_types=("""CrossAttnUpBlock2D""", """UpBlock2D""")					,  cross_attention_dim=32					,  )
   torch.manual_seed(0)
   lowercase__  :   Tuple    		=      ControlNetModel(
       block_out_channels=(32, 64)					,  layers_per_block=2					,  in_channels=4					,  down_block_types=("""DownBlock2D""", """CrossAttnDownBlock2D""")					,  cross_attention_dim=32					,  conditioning_embedding_out_channels=(16, 32)					,  )
   torch.manual_seed(0)
   lowercase__  :   Optional[int]    		=      DDIMScheduler(
       beta_start=0.0_0_0_8_5					,  beta_end=0.0_1_2					,  beta_schedule="""scaled_linear"""					,  clip_sample=UpperCAmelCase__					,  set_alpha_to_one=UpperCAmelCase__					,  )
   torch.manual_seed(0)
   lowercase__  :   int    		=      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					,  )
   torch.manual_seed(0)
   lowercase__  :   List[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=10_00					,  )
   lowercase__  :   Optional[int]    		=      CLIPTextModel(UpperCAmelCase__)
   lowercase__  :   Optional[Any]    		=      CLIPTokenizer.from_pretrained("""hf-internal-testing/tiny-random-clip""")

   lowercase__  :   Union[str, Any]    		=      {
       """unet""": unet,
       """controlnet""": controlnet,
       """scheduler""": scheduler,
       """vae""": vae,
       """text_encoder""": text_encoder,
       """tokenizer""": tokenizer,
       """safety_checker""": None,
       """feature_extractor""": None,
   }
   return components


 def      lowercase__     (					self					,  SCREAMING_SNAKE_CASE_					,  SCREAMING_SNAKE_CASE_=0):


   '''simple docstring'''




   if str(UpperCAmelCase__).startswith("""mps"""):
     lowercase__  :   int    		=      torch.manual_seed(UpperCAmelCase__)
   else:
     lowercase__  :   Tuple    		=      torch.Generator(device=UpperCAmelCase__).manual_seed(UpperCAmelCase__)

   lowercase__  :   List[Any]    		=      2
   lowercase__  :   Tuple    		=      randn_tensor(
       (1, 3, 32 * controlnet_embedder_scale_factor, 32 * controlnet_embedder_scale_factor)					,  generator=UpperCAmelCase__					,  device=torch.device(UpperCAmelCase__)					,  )
   lowercase__  :   Dict    		=      floats_tensor(control_image.shape					,  rng=random.Random(UpperCAmelCase__)).to(UpperCAmelCase__)
   lowercase__  :   Union[str, Any]    		=      image.cpu().permute(0					,  2					,  3					,  1)[0]
   lowercase__  :   Any    		=      Image.fromarray(np.uinta(UpperCAmelCase__)).convert("""RGB""").resize((64, 64))
   lowercase__  :   Tuple    		=      {
       """prompt""": """A painting of a squirrel eating a burger""",
       """generator""": generator,
       """num_inference_steps""": 2,
       """guidance_scale""": 6.0,
       """output_type""": """numpy""",
       """image""": image,
       """control_image""": control_image,
   }

   return inputs


 def      lowercase__     (					self):


   '''simple docstring'''




   return self._test_attention_slicing_forward_pass(expected_max_diff=2E-3)


 @unittest.skipIf(
     torch_device != """cuda""" or not is_xformers_available()					,  reason="""XFormers attention is only available with CUDA and `xformers` installed"""					,  )
 def      lowercase__     (					self):


   '''simple docstring'''




   self._test_xformers_attention_forwardGenerator_pass(expected_max_diff=2E-3)



 def      lowercase__     (					self):


   '''simple docstring'''




   self._test_inference_batch_single_identical(expected_max_diff=2E-3)



class       _snake_case   (	UpperCAmelCase_  ,						UpperCAmelCase_  ,						unittest.TestCase							):
 __lowerCAmelCase  :     Optional[int]        =			StableDiffusionControlNetImgaImgPipeline
 __lowerCAmelCase  :     Any        =			TEXT_GUIDED_IMAGE_VARIATION_PARAMS - {'height', 'width'}
 __lowerCAmelCase  :     List[Any]        =			TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
 __lowerCAmelCase  :     str        =			frozenset([]							)  # TO_DO: add image_params once refactored VaeImageProcessor.preprocess


 def      lowercase__     (					self):


   '''simple docstring'''




   torch.manual_seed(0)
   lowercase__  :   Tuple    		=      UNetaDConditionModel(
       block_out_channels=(32, 64)					,  layers_per_block=2					,  sample_size=32					,  in_channels=4					,  out_channels=4					,  down_block_types=("""DownBlock2D""", """CrossAttnDownBlock2D""")					,  up_block_types=("""CrossAttnUpBlock2D""", """UpBlock2D""")					,  cross_attention_dim=32					,  )
   torch.manual_seed(0)

   def init_weights(SCREAMING_SNAKE_CASE_):
     if isinstance(UpperCAmelCase__					,  torch.nn.Convad):
       torch.nn.init.normal(m.weight)
       m.bias.data.fill_(1.0)

   lowercase__  :   List[Any]    		=      ControlNetModel(
       block_out_channels=(32, 64)					,  layers_per_block=2					,  in_channels=4					,  down_block_types=("""DownBlock2D""", """CrossAttnDownBlock2D""")					,  cross_attention_dim=32					,  conditioning_embedding_out_channels=(16, 32)					,  )
   controlneta.controlnet_down_blocks.apply(UpperCAmelCase__)

   torch.manual_seed(0)
   lowercase__  :   Optional[int]    		=      ControlNetModel(
       block_out_channels=(32, 64)					,  layers_per_block=2					,  in_channels=4					,  down_block_types=("""DownBlock2D""", """CrossAttnDownBlock2D""")					,  cross_attention_dim=32					,  conditioning_embedding_out_channels=(16, 32)					,  )
   controlneta.controlnet_down_blocks.apply(UpperCAmelCase__)

   torch.manual_seed(0)
   lowercase__  :   Dict    		=      DDIMScheduler(
       beta_start=0.0_0_0_8_5					,  beta_end=0.0_1_2					,  beta_schedule="""scaled_linear"""					,  clip_sample=UpperCAmelCase__					,  set_alpha_to_one=UpperCAmelCase__					,  )
   torch.manual_seed(0)
   lowercase__  :   Tuple    		=      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					,  )
   torch.manual_seed(0)
   lowercase__  :   Union[str, 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=10_00					,  )
   lowercase__  :   int    		=      CLIPTextModel(UpperCAmelCase__)
   lowercase__  :   List[Any]    		=      CLIPTokenizer.from_pretrained("""hf-internal-testing/tiny-random-clip""")

   lowercase__  :   Tuple    		=      MultiControlNetModel([controlneta, controlneta])

   lowercase__  :   str    		=      {
       """unet""": unet,
       """controlnet""": controlnet,
       """scheduler""": scheduler,
       """vae""": vae,
       """text_encoder""": text_encoder,
       """tokenizer""": tokenizer,
       """safety_checker""": None,
       """feature_extractor""": None,
   }
   return components


 def      lowercase__     (					self					,  SCREAMING_SNAKE_CASE_					,  SCREAMING_SNAKE_CASE_=0):


   '''simple docstring'''




   if str(UpperCAmelCase__).startswith("""mps"""):
     lowercase__  :   Dict    		=      torch.manual_seed(UpperCAmelCase__)
   else:
     lowercase__  :   Union[str, Any]    		=      torch.Generator(device=UpperCAmelCase__).manual_seed(UpperCAmelCase__)

   lowercase__  :   Optional[int]    		=      2

   lowercase__  :   Any    		=      [
       randn_tensor(
           (1, 3, 32 * controlnet_embedder_scale_factor, 32 * controlnet_embedder_scale_factor)					,  generator=UpperCAmelCase__					,  device=torch.device(UpperCAmelCase__)					,  ),
       randn_tensor(
           (1, 3, 32 * controlnet_embedder_scale_factor, 32 * controlnet_embedder_scale_factor)					,  generator=UpperCAmelCase__					,  device=torch.device(UpperCAmelCase__)					,  ),
   ]

   lowercase__  :   Dict    		=      floats_tensor(control_image[0].shape					,  rng=random.Random(UpperCAmelCase__)).to(UpperCAmelCase__)
   lowercase__  :   Union[str, Any]    		=      image.cpu().permute(0					,  2					,  3					,  1)[0]
   lowercase__  :   List[Any]    		=      Image.fromarray(np.uinta(UpperCAmelCase__)).convert("""RGB""").resize((64, 64))
   lowercase__  :   Union[str, Any]    		=      {
       """prompt""": """A painting of a squirrel eating a burger""",
       """generator""": generator,
       """num_inference_steps""": 2,
       """guidance_scale""": 6.0,
       """output_type""": """numpy""",
       """image""": image,
       """control_image""": control_image,
   }

   return inputs


 def      lowercase__     (					self):


   '''simple docstring'''




   lowercase__  :   Union[str, Any]    		=      self.get_dummy_components()
   lowercase__  :   Optional[Any]    		=      self.pipeline_class(**UpperCAmelCase__)
   pipe.to(UpperCAmelCase__)

   lowercase__  :   List[str]    		=      1_0.0
   lowercase__  :   Optional[Any]    		=      4

   lowercase__  :   Dict    		=      self.get_dummy_inputs(UpperCAmelCase__)
   lowercase__  :   Any    		=      steps
   lowercase__  :   Tuple    		=      scale
   lowercase__  :   Dict    		=      pipe(**UpperCAmelCase__)[0]

   lowercase__  :   Dict    		=      self.get_dummy_inputs(UpperCAmelCase__)
   lowercase__  :   int    		=      steps
   lowercase__  :   int    		=      scale
   lowercase__  :   List[Any]    		=      pipe(**UpperCAmelCase__					,  control_guidance_start=0.1					,  control_guidance_end=0.2)[0]

   lowercase__  :   Union[str, Any]    		=      self.get_dummy_inputs(UpperCAmelCase__)
   lowercase__  :   str    		=      steps
   lowercase__  :   Tuple    		=      scale
   lowercase__  :   List[Any]    		=      pipe(**UpperCAmelCase__					,  control_guidance_start=[0.1, 0.3]					,  control_guidance_end=[0.2, 0.7])[0]

   lowercase__  :   List[str]    		=      self.get_dummy_inputs(UpperCAmelCase__)
   lowercase__  :   Union[str, Any]    		=      steps
   lowercase__  :   List[str]    		=      scale
   lowercase__  :   str    		=      pipe(**UpperCAmelCase__					,  control_guidance_start=0.4					,  control_guidance_end=[0.5, 0.8])[0]

   # make sure that all outputs are different
   assert np.sum(np.abs(output_a - output_a)) > 1E-3
   assert np.sum(np.abs(output_a - output_a)) > 1E-3
   assert np.sum(np.abs(output_a - output_a)) > 1E-3


 def      lowercase__     (					self):


   '''simple docstring'''




   return self._test_attention_slicing_forward_pass(expected_max_diff=2E-3)


 @unittest.skipIf(
     torch_device != """cuda""" or not is_xformers_available()					,  reason="""XFormers attention is only available with CUDA and `xformers` installed"""					,  )
 def      lowercase__     (					self):


   '''simple docstring'''




   self._test_xformers_attention_forwardGenerator_pass(expected_max_diff=2E-3)


 def      lowercase__     (					self):


   '''simple docstring'''




   self._test_inference_batch_single_identical(expected_max_diff=2E-3)



 def      lowercase__     (					self):


   '''simple docstring'''




   lowercase__  :   Dict    		=      self.get_dummy_components()
   lowercase__  :   int    		=      self.pipeline_class(**UpperCAmelCase__)
   pipe.to(UpperCAmelCase__)
   pipe.set_progress_bar_config(disable=UpperCAmelCase__)
   with tempfile.TemporaryDirectory() as tmpdir:
     try:
       # save_pretrained is not implemented for Multi-ControlNet
       pipe.save_pretrained(UpperCAmelCase__)
     except NotImplementedError:
       pass



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


 def      lowercase__     (					self):


   '''simple docstring'''




   super().tearDown()
   gc.collect()
   torch.cuda.empty_cache()



 def      lowercase__     (					self):


   '''simple docstring'''




   lowercase__  :   Tuple    		=      ControlNetModel.from_pretrained("""lllyasviel/sd-controlnet-canny""")

   lowercase__  :   str    		=      StableDiffusionControlNetImgaImgPipeline.from_pretrained(
       """runwayml/stable-diffusion-v1-5"""					,  safety_checker=UpperCAmelCase__					,  controlnet=UpperCAmelCase__)
   pipe.enable_model_cpu_offload()
   pipe.set_progress_bar_config(disable=UpperCAmelCase__)

   lowercase__  :   Optional[int]    		=      torch.Generator(device="""cpu""").manual_seed(0)
   lowercase__  :   Union[str, Any]    		=      """evil space-punk bird"""
   lowercase__  :   List[Any]    		=      load_image(
       """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/sd_controlnet/bird_canny.png""").resize((5_12, 5_12))
   lowercase__  :   List[Any]    		=      load_image(
       """https://huggingface.co/lllyasviel/sd-controlnet-canny/resolve/main/images/bird.png""").resize((5_12, 5_12))

   lowercase__  :   Tuple    		=      pipe(
       UpperCAmelCase__					,  UpperCAmelCase__					,  control_image=UpperCAmelCase__					,  generator=UpperCAmelCase__					,  output_type="""np"""					,  num_inference_steps=50					,  strength=0.6					,  )

   lowercase__  :   Any    		=      output.images[0]

   assert image.shape == (5_12, 5_12, 3)

   lowercase__  :   Dict    		=      load_numpy(
       """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/sd_controlnet/img2img.npy""")

   assert np.abs(expected_image - image).max() < 9E-2








import sys

lowerCamelCase__    :		List[Any]          =   (
    """73167176531330624919225119674426574742355349194934"""
    """96983520312774506326239578318016984801869478851843"""
    """85861560789112949495459501737958331952853208805511"""
    """12540698747158523863050715693290963295227443043557"""
    """66896648950445244523161731856403098711121722383113"""
    """62229893423380308135336276614282806444486645238749"""
    """30358907296290491560440772390713810515859307960866"""
    """70172427121883998797908792274921901699720888093776"""
    """65727333001053367881220235421809751254540594752243"""
    """52584907711670556013604839586446706324415722155397"""
    """53697817977846174064955149290862569321978468622482"""
    """83972241375657056057490261407972968652414535100474"""
    """82166370484403199890008895243450658541227588666881"""
    """16427171479924442928230863465674813919123162824586"""
    """17866458359124566529476545682848912883142607690042"""
    """24219022671055626321111109370544217506941658960408"""
    """07198403850962455444362981230987879927244284909188"""
    """84580156166097919133875499200524063689912560717606"""
    """05886116467109405077541002256983155200055935729725"""
    """71636269561882670428252483600823257530420752963450"""
)

def 		UpperCamelCase	(      lowercase_ = N   )		->	int:


  '''simple docstring'''






  lowercase__  :   int    		=      -sys.maxsize - 1
  for i in range(len(lowercase_   ) - 12   ):
    lowercase__  :   Optional[int]    		=      1
    for j in range(13   ):
      product *= int(n[i + j]   )
    if product > largest_product:
      lowercase__  :   int    		=      product
  return largest_product


if __name__ == "__main__":
     print(f'''{solution() = }''')






