



'''simple docstring'''



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 _UpperCamelCase		(     A      ,       A      ,       A      ,       unittest.TestCase		):





				'''simple docstring'''





				lowerCAmelCase__					    =    StableDiffusionControlNetImgaImgPipeline
				lowerCAmelCase__					    =    TEXT_GUIDED_IMAGE_VARIATION_PARAMS - {"""height""", """width"""}
				lowerCAmelCase__					    =    TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
				lowerCAmelCase__					    =    IMAGE_TO_IMAGE_IMAGE_PARAMS.union({"""control_image"""}		)
				lowerCAmelCase__					    =    IMAGE_TO_IMAGE_IMAGE_PARAMS

				def 				__lowerCamelCase     (							self  :  Optional[int]):







											'''simple docstring'''

											torch.manual_seed(0)
											__lowercase       	=UNetaDConditionModel(
											    block_out_channels=(3_2, 6_4)  ,       layers_per_block=2  ,       sample_size=3_2  ,       in_channels=4  ,       out_channels=4  ,       down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D')  ,       up_block_types=('CrossAttnUpBlock2D', 'UpBlock2D')  ,       cross_attention_dim=3_2  ,       )
											torch.manual_seed(0)
											__lowercase       	=ControlNetModel(
											    block_out_channels=(3_2, 6_4)  ,       layers_per_block=2  ,       in_channels=4  ,       down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D')  ,       cross_attention_dim=3_2  ,       conditioning_embedding_out_channels=(1_6, 3_2)  ,       )
											torch.manual_seed(0)
											__lowercase       	=DDIMScheduler(
											    beta_start=0.0_0085  ,       beta_end=0.012  ,       beta_schedule='scaled_linear'  ,       clip_sample=_lowerCAmelCase  ,       set_alpha_to_one=_lowerCAmelCase  ,       )
											torch.manual_seed(0)
											__lowercase       	=AutoencoderKL(
											    block_out_channels=[3_2, 6_4]  ,       in_channels=3  ,       out_channels=3  ,       down_block_types=['DownEncoderBlock2D', 'DownEncoderBlock2D']  ,       up_block_types=['UpDecoderBlock2D', 'UpDecoderBlock2D']  ,       latent_channels=4  ,       )
											torch.manual_seed(0)
											__lowercase       	=CLIPTextConfig(
											    bos_token_id=0  ,       eos_token_id=2  ,       hidden_size=3_2  ,       intermediate_size=3_7  ,       layer_norm_eps=1e-05  ,       num_attention_heads=4  ,       num_hidden_layers=5  ,       pad_token_id=1  ,       vocab_size=1_0_0_0  ,       )
											__lowercase       	=CLIPTextModel(_lowerCAmelCase)
											__lowercase       	=CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip')

											__lowercase       	={
											    'unet': unet,
											    'controlnet': controlnet,
											    'scheduler': scheduler,
											    'vae': vae,
											    'text_encoder': text_encoder,
											    'tokenizer': tokenizer,
											    'safety_checker': None,
											    'feature_extractor': None,
											}
											return components

				def 				__lowerCamelCase     (							self  :  Tuple  ,       _lowerCAmelCase  :  Tuple  ,       _lowerCAmelCase  :  List[str]=0):







											'''simple docstring'''

											if str(_lowerCAmelCase).startswith('mps'):
																		__lowercase       	=torch.manual_seed(_lowerCAmelCase)
											else:
																		__lowercase       	=torch.Generator(device=_lowerCAmelCase).manual_seed(_lowerCAmelCase)

											__lowercase       	=2
											__lowercase       	=randn_tensor(
											    (1, 3, 3_2 * controlnet_embedder_scale_factor, 3_2 * controlnet_embedder_scale_factor)  ,       generator=_lowerCAmelCase  ,       device=torch.device(_lowerCAmelCase)  ,       )
											__lowercase       	=floats_tensor(control_image.shape  ,       rng=random.Random(_lowerCAmelCase)).to(_lowerCAmelCase)
											__lowercase       	=image.cpu().permute(0  ,       2  ,       3  ,       1)[0]
											__lowercase       	=Image.fromarray(np.uinta(_lowerCAmelCase)).convert('RGB').resize((6_4, 6_4))
											__lowercase       	={
											    '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 				__lowerCamelCase     (							self  :  str):







											'''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 				__lowerCamelCase     (							self  :  Union[str, Any]):







											'''simple docstring'''

											self._test_xformers_attention_forwardGenerator_pass(expected_max_diff=2e-3)

				def 				__lowerCamelCase     (							self  :  List[Any]):







											'''simple docstring'''

											self._test_inference_batch_single_identical(expected_max_diff=2e-3)





class _UpperCamelCase		(     A      ,       A      ,       unittest.TestCase		):





				'''simple docstring'''





				lowerCAmelCase__					    =    StableDiffusionControlNetImgaImgPipeline
				lowerCAmelCase__					    =    TEXT_GUIDED_IMAGE_VARIATION_PARAMS - {"""height""", """width"""}
				lowerCAmelCase__					    =    TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
				lowerCAmelCase__					    =    frozenset([]		)  # TO_DO: add image_params once refactored VaeImageProcessor.preprocess

				def 				__lowerCamelCase     (							self  :  Tuple):







											'''simple docstring'''

											torch.manual_seed(0)
											__lowercase       	=UNetaDConditionModel(
											    block_out_channels=(3_2, 6_4)  ,       layers_per_block=2  ,       sample_size=3_2  ,       in_channels=4  ,       out_channels=4  ,       down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D')  ,       up_block_types=('CrossAttnUpBlock2D', 'UpBlock2D')  ,       cross_attention_dim=3_2  ,       )
											torch.manual_seed(0)

											def init_weights(_lowerCAmelCase  :  Optional[int]):
																		if isinstance(_lowerCAmelCase  ,       torch.nn.Convad):
																									torch.nn.init.normal(m.weight)
																									m.bias.data.fill_(1.0)

											__lowercase       	=ControlNetModel(
											    block_out_channels=(3_2, 6_4)  ,       layers_per_block=2  ,       in_channels=4  ,       down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D')  ,       cross_attention_dim=3_2  ,       conditioning_embedding_out_channels=(1_6, 3_2)  ,       )
											controlneta.controlnet_down_blocks.apply(_lowerCAmelCase)

											torch.manual_seed(0)
											__lowercase       	=ControlNetModel(
											    block_out_channels=(3_2, 6_4)  ,       layers_per_block=2  ,       in_channels=4  ,       down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D')  ,       cross_attention_dim=3_2  ,       conditioning_embedding_out_channels=(1_6, 3_2)  ,       )
											controlneta.controlnet_down_blocks.apply(_lowerCAmelCase)

											torch.manual_seed(0)
											__lowercase       	=DDIMScheduler(
											    beta_start=0.0_0085  ,       beta_end=0.012  ,       beta_schedule='scaled_linear'  ,       clip_sample=_lowerCAmelCase  ,       set_alpha_to_one=_lowerCAmelCase  ,       )
											torch.manual_seed(0)
											__lowercase       	=AutoencoderKL(
											    block_out_channels=[3_2, 6_4]  ,       in_channels=3  ,       out_channels=3  ,       down_block_types=['DownEncoderBlock2D', 'DownEncoderBlock2D']  ,       up_block_types=['UpDecoderBlock2D', 'UpDecoderBlock2D']  ,       latent_channels=4  ,       )
											torch.manual_seed(0)
											__lowercase       	=CLIPTextConfig(
											    bos_token_id=0  ,       eos_token_id=2  ,       hidden_size=3_2  ,       intermediate_size=3_7  ,       layer_norm_eps=1e-05  ,       num_attention_heads=4  ,       num_hidden_layers=5  ,       pad_token_id=1  ,       vocab_size=1_0_0_0  ,       )
											__lowercase       	=CLIPTextModel(_lowerCAmelCase)
											__lowercase       	=CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip')

											__lowercase       	=MultiControlNetModel([controlneta, controlneta])

											__lowercase       	={
											    'unet': unet,
											    'controlnet': controlnet,
											    'scheduler': scheduler,
											    'vae': vae,
											    'text_encoder': text_encoder,
											    'tokenizer': tokenizer,
											    'safety_checker': None,
											    'feature_extractor': None,
											}
											return components

				def 				__lowerCamelCase     (							self  :  Optional[Any]  ,       _lowerCAmelCase  :  int  ,       _lowerCAmelCase  :  int=0):







											'''simple docstring'''

											if str(_lowerCAmelCase).startswith('mps'):
																		__lowercase       	=torch.manual_seed(_lowerCAmelCase)
											else:
																		__lowercase       	=torch.Generator(device=_lowerCAmelCase).manual_seed(_lowerCAmelCase)

											__lowercase       	=2

											__lowercase       	=[
											    randn_tensor(
											        (1, 3, 3_2 * controlnet_embedder_scale_factor, 3_2 * controlnet_embedder_scale_factor)  ,       generator=_lowerCAmelCase  ,       device=torch.device(_lowerCAmelCase)  ,       ),
											    randn_tensor(
											        (1, 3, 3_2 * controlnet_embedder_scale_factor, 3_2 * controlnet_embedder_scale_factor)  ,       generator=_lowerCAmelCase  ,       device=torch.device(_lowerCAmelCase)  ,       ),
											]

											__lowercase       	=floats_tensor(control_image[0].shape  ,       rng=random.Random(_lowerCAmelCase)).to(_lowerCAmelCase)
											__lowercase       	=image.cpu().permute(0  ,       2  ,       3  ,       1)[0]
											__lowercase       	=Image.fromarray(np.uinta(_lowerCAmelCase)).convert('RGB').resize((6_4, 6_4))
											__lowercase       	={
											    '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 				__lowerCamelCase     (							self  :  int):







											'''simple docstring'''

											__lowercase       	=self.get_dummy_components()
											__lowercase       	=self.pipeline_class(**_lowerCAmelCase)
											pipe.to(_lowerCAmelCase)

											__lowercase       	=10.0
											__lowercase       	=4

											__lowercase       	=self.get_dummy_inputs(_lowerCAmelCase)
											__lowercase       	=steps
											__lowercase       	=scale
											__lowercase       	=pipe(**_lowerCAmelCase)[0]

											__lowercase       	=self.get_dummy_inputs(_lowerCAmelCase)
											__lowercase       	=steps
											__lowercase       	=scale
											__lowercase       	=pipe(**_lowerCAmelCase  ,       control_guidance_start=0.1  ,       control_guidance_end=0.2)[0]

											__lowercase       	=self.get_dummy_inputs(_lowerCAmelCase)
											__lowercase       	=steps
											__lowercase       	=scale
											__lowercase       	=pipe(**_lowerCAmelCase  ,       control_guidance_start=[0.1, 0.3]  ,       control_guidance_end=[0.2, 0.7])[0]

											__lowercase       	=self.get_dummy_inputs(_lowerCAmelCase)
											__lowercase       	=steps
											__lowercase       	=scale
											__lowercase       	=pipe(**_lowerCAmelCase  ,       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 				__lowerCamelCase     (							self  :  Optional[int]):







											'''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 				__lowerCamelCase     (							self  :  Optional[int]):







											'''simple docstring'''

											self._test_xformers_attention_forwardGenerator_pass(expected_max_diff=2e-3)

				def 				__lowerCamelCase     (							self  :  Optional[int]):







											'''simple docstring'''

											self._test_inference_batch_single_identical(expected_max_diff=2e-3)

				def 				__lowerCamelCase     (							self  :  Any):







											'''simple docstring'''

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





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





				'''simple docstring'''





				def 				__lowerCamelCase     (							self  :  List[Any]):







											'''simple docstring'''

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

				def 				__lowerCamelCase     (							self  :  str):







											'''simple docstring'''

											__lowercase       	=ControlNetModel.from_pretrained('lllyasviel/sd-controlnet-canny')

											__lowercase       	=StableDiffusionControlNetImgaImgPipeline.from_pretrained(
											    'runwayml/stable-diffusion-v1-5'  ,       safety_checker=_lowerCAmelCase  ,       controlnet=_lowerCAmelCase)
											pipe.enable_model_cpu_offload()
											pipe.set_progress_bar_config(disable=_lowerCAmelCase)

											__lowercase       	=torch.Generator(device='cpu').manual_seed(0)
											__lowercase       	='evil space-punk bird'
											__lowercase       	=load_image(
											    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/sd_controlnet/bird_canny.png').resize((5_1_2, 5_1_2))
											__lowercase       	=load_image(
											    'https://huggingface.co/lllyasviel/sd-controlnet-canny/resolve/main/images/bird.png').resize((5_1_2, 5_1_2))

											__lowercase       	=pipe(
											    _lowerCAmelCase  ,       _lowerCAmelCase  ,       control_image=_lowerCAmelCase  ,       generator=_lowerCAmelCase  ,       output_type='np'  ,       num_inference_steps=5_0  ,       strength=0.6  ,       )

											__lowercase       	=output.images[0]

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

											__lowercase       	=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








'''simple docstring'''



def   _A       (   _lowerCAmelCase					):



							"""simple docstring"""



							if number > 0:
														raise ValueError('input must be a negative integer'					)
							__lowercase       	=len(bin(_lowerCAmelCase					)[3:]					)
							__lowercase       	=bin(abs(_lowerCAmelCase					) - (1 << binary_number_length)					)[3:]
							__lowercase       	=(
							    (
							        '1'
							        + '0' * (binary_number_length - len(_lowerCAmelCase					))
							        + twos_complement_number
							    )
							    if number < 0
							    else '0'
							)
							return "0b" + twos_complement_number


if __name__ == "__main__":
		import doctest

		doctest.testmod()



