"""simple docstring"""







import random
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    UNetaDConditionModel,
    VideoToVideoSDPipeline,
)
from diffusers.utils import floats_tensor, is_xformers_available, skip_mps
from diffusers.utils.testing_utils import enable_full_determinism, slow, torch_device

from ..pipeline_params import (
    TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS,
    TEXT_GUIDED_IMAGE_VARIATION_PARAMS,
)
from ..test_pipelines_common import PipelineTesterMixin


enable_full_determinism()

@skip_mps
class 		UpperCamelCase      (   lowercase				,     unittest.TestCase						):
				UpperCAmelCase    :				int   =		VideoToVideoSDPipeline
				UpperCAmelCase    :				Tuple   =		TEXT_GUIDED_IMAGE_VARIATION_PARAMS.union({"""video"""}						) - {"""image""", """width""", """height"""}
				UpperCAmelCase    :				Optional[int]   =		TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS.union({"""video"""}						) - {"""image"""}
				UpperCAmelCase    :				Union[str, Any]   =		PipelineTesterMixin.required_optional_params - {"""latents"""}
				UpperCAmelCase    :				int   =		False

				# No `output_type`.
				UpperCAmelCase    :				List[str]   =		frozenset(
				    [
				        """num_inference_steps""",
				        """generator""",
				        """latents""",
				        """return_dict""",
				        """callback""",
				        """callback_steps""",
				    ]						)



				def  _lowercase					(self    :				int)   ->     Tuple:
					torch.manual_seed(0)
					__snake_case      :							Optional[Any]						=			UNetaDConditionModel(
					    block_out_channels=(32, 64, 64, 64)     ,  layers_per_block=2     ,  sample_size=32     ,  in_channels=4     ,  out_channels=4     ,  down_block_types=('CrossAttnDownBlock3D', 'CrossAttnDownBlock3D', 'CrossAttnDownBlock3D', 'DownBlock3D')     ,  up_block_types=('UpBlock3D', 'CrossAttnUpBlock3D', 'CrossAttnUpBlock3D', 'CrossAttnUpBlock3D')     ,  cross_attention_dim=32     ,  attention_head_dim=4     ,  )
					__snake_case      :							Optional[Any]						=			DDIMScheduler(
					    beta_start=0.00_085     ,  beta_end=0.012     ,  beta_schedule='scaled_linear'     ,  clip_sample=_A     ,  set_alpha_to_one=_A     ,  )
					torch.manual_seed(0)
					__snake_case      :							Dict						=			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=1_28     ,  )
					torch.manual_seed(0)
					__snake_case      :							Dict						=			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     ,  hidden_act='gelu'     ,  projection_dim=5_12     ,  )
					__snake_case      :							Any						=			CLIPTextModel(_A)
					__snake_case      :							List[str]						=			CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip')

					__snake_case      :							str						=			{
					    'unet': unet,
					    'scheduler': scheduler,
					    'vae': vae,
					    'text_encoder': text_encoder,
					    'tokenizer': tokenizer,
					}
					return components



				def  _lowercase					(self    :				Optional[int]     ,  _A    :				Union[str, Any]     ,  _A    :				Tuple=0)   ->     str:
					# 3 frames
					__snake_case      :							int						=			floats_tensor((1, 3, 3, 32, 32)     ,  rng=random.Random(_A)).to(_A)

					if str(_A).startswith('mps'):
						__snake_case      :							Union[str, Any]						=			torch.manual_seed(_A)
					else:
						__snake_case      :							str						=			torch.Generator(device=_A).manual_seed(_A)
					__snake_case      :							Union[str, Any]						=			{
					    'prompt': 'A painting of a squirrel eating a burger',
					    'video': video,
					    'generator': generator,
					    'num_inference_steps': 2,
					    'guidance_scale': 6.0,
					    'output_type': 'pt',
					}
					return inputs



				def  _lowercase					(self    :				str)   ->     Tuple:
					__snake_case      :							str						=			'cpu'  # ensure determinism for the device-dependent torch.Generator
					__snake_case      :							Any						=			self.get_dummy_components()
					__snake_case      :							List[str]						=			VideoToVideoSDPipeline(**_A)
					__snake_case      :							List[str]						=			sd_pipe.to(_A)
					sd_pipe.set_progress_bar_config(disable=_A)

					__snake_case      :							Optional[Any]						=			self.get_dummy_inputs(_A)
					__snake_case      :							Optional[Any]						=			'np'
					__snake_case      :							int						=			sd_pipe(**_A).frames
					__snake_case      :							List[Any]						=			frames[0][-3:, -3:, -1]

					assert frames[0].shape == (32, 32, 3)
					__snake_case      :							str						=			np.array([1_06, 1_17, 1_13, 1_74, 1_37, 1_12, 1_48, 1_51, 1_31])

					assert np.abs(image_slice.flatten() - expected_slice).max() < 1E-2



				@unittest.skipIf(
				    torch_device != 'cuda' or not is_xformers_available()     ,  reason='XFormers attention is only available with CUDA and `xformers` installed'     ,  )
				def  _lowercase					(self    :				List[str])   ->     List[Any]:
					self._test_xformers_attention_forwardGenerator_pass(test_mean_pixel_difference=_A     ,  expected_max_diff=5E-3)



				@unittest.skip(reason='Batching needs to be properly figured out first for this pipeline.')
				def  _lowercase					(self    :				Dict)   ->     int:
					pass



				@unittest.skip(reason='Batching needs to be properly figured out first for this pipeline.')
				def  _lowercase					(self    :				List[str])   ->     Union[str, Any]:
					pass



				@unittest.skip(reason='`num_images_per_prompt` argument is not supported for this pipeline.')
				def  _lowercase					(self    :				int)   ->     Any:
					pass






				def  _lowercase					(self    :				Optional[Any])   ->     int:
					return super().test_progress_bar()







@slow
@skip_mps
class 		UpperCamelCase      (   unittest.TestCase						):



				def  _lowercase					(self    :				List[Any])   ->     int:
					__snake_case      :							Optional[Any]						=			VideoToVideoSDPipeline.from_pretrained('cerspense/zeroscope_v2_XL'     ,  torch_dtype=torch.floataa)
					pipe.enable_model_cpu_offload()

					# 10 frames
					__snake_case      :							Optional[int]						=			torch.Generator(device='cpu').manual_seed(0)
					__snake_case      :							int						=			torch.randn((1, 10, 3, 10_24, 5_76)     ,  generator=_A)
					__snake_case      :							List[str]						=			video.to('cuda')

					__snake_case      :							Any						=			'Spiderman is surfing'

					__snake_case      :							int						=			pipe(_A     ,  video=_A     ,  generator=_A     ,  num_inference_steps=3     ,  output_type='pt').frames

					__snake_case      :							Optional[Any]						=			np.array([-1.0_458_984, -1.1_279_297, -0.9_663_086, -0.91_503_906, -0.75_097_656])
					assert np.abs(video_frames.cpu().numpy()[0, 0, 0, 0, -5:] - expected_array).sum() < 1E-2






"""simple docstring"""







import gc
import unittest

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

from diffusers import TransformeraDModel, VQDiffusionPipeline, VQDiffusionScheduler, VQModel
from diffusers.pipelines.vq_diffusion.pipeline_vq_diffusion import LearnedClassifierFreeSamplingEmbeddings
from diffusers.utils import load_numpy, slow, torch_device
from diffusers.utils.testing_utils import require_torch_gpu


_a					:					List[str]=			False

class 		UpperCamelCase      (   unittest.TestCase						):



				def  _lowercase					(self    :				List[str])   ->     List[Any]:
					# clean up the VRAM after each test
					super().tearDown()
					gc.collect()
					torch.cuda.empty_cache()



				@property
				def  _lowercase					(self    :				Optional[Any])   ->     Union[str, Any]:
					return 12



				@property
				def  _lowercase					(self    :				Dict)   ->     Union[str, Any]:
					return 12



				@property
				def  _lowercase					(self    :				int)   ->     Tuple:
					return 32



				@property
				def  _lowercase					(self    :				Optional[int])   ->     Dict:
					torch.manual_seed(0)
					__snake_case      :							Any						=			VQModel(
					    block_out_channels=[32, 64]     ,  in_channels=3     ,  out_channels=3     ,  down_block_types=['DownEncoderBlock2D', 'DownEncoderBlock2D']     ,  up_block_types=['UpDecoderBlock2D', 'UpDecoderBlock2D']     ,  latent_channels=3     ,  num_vq_embeddings=self.num_embed     ,  vq_embed_dim=3     ,  )
					return model



				@property
				def  _lowercase					(self    :				List[Any])   ->     Optional[int]:
					__snake_case      :							Dict						=			CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip')
					return tokenizer



				@property
				def  _lowercase					(self    :				Union[str, Any])   ->     Optional[int]:
					torch.manual_seed(0)
					__snake_case      :							Any						=			CLIPTextConfig(
					    bos_token_id=0     ,  eos_token_id=2     ,  hidden_size=self.text_embedder_hidden_size     ,  intermediate_size=37     ,  layer_norm_eps=1E-05     ,  num_attention_heads=4     ,  num_hidden_layers=5     ,  pad_token_id=1     ,  vocab_size=10_00     ,  )
					return CLIPTextModel(_A)



				@property
				def  _lowercase					(self    :				Union[str, Any])   ->     Dict:
					torch.manual_seed(0)

					__snake_case      :							Any						=			12
					__snake_case      :							int						=			12

					__snake_case      :							List[Any]						=			{
					    'attention_bias': True,
					    'cross_attention_dim': 32,
					    'attention_head_dim': height * width,
					    'num_attention_heads': 1,
					    'num_vector_embeds': self.num_embed,
					    'num_embeds_ada_norm': self.num_embeds_ada_norm,
					    'norm_num_groups': 32,
					    'sample_size': width,
					    'activation_fn': 'geglu-approximate',
					}

					__snake_case      :							Union[str, Any]						=			TransformeraDModel(**_A)
					return model



				def  _lowercase					(self    :				Union[str, Any])   ->     Dict:
					__snake_case      :							Tuple						=			'cpu'

					__snake_case      :							List[str]						=			self.dummy_vqvae
					__snake_case      :							str						=			self.dummy_text_encoder
					__snake_case      :							Optional[Any]						=			self.dummy_tokenizer
					__snake_case      :							Dict						=			self.dummy_transformer
					__snake_case      :							Optional[int]						=			VQDiffusionScheduler(self.num_embed)
					__snake_case      :							List[Any]						=			LearnedClassifierFreeSamplingEmbeddings(learnable=_A)

					__snake_case      :							List[Any]						=			VQDiffusionPipeline(
					    vqvae=_A     ,  text_encoder=_A     ,  tokenizer=_A     ,  transformer=_A     ,  scheduler=_A     ,  learned_classifier_free_sampling_embeddings=_A     ,  )
					__snake_case      :							List[Any]						=			pipe.to(_A)
					pipe.set_progress_bar_config(disable=_A)

					__snake_case      :							Optional[Any]						=			'teddy bear playing in the pool'

					__snake_case      :							str						=			torch.Generator(device=_A).manual_seed(0)
					__snake_case      :							Union[str, Any]						=			pipe([prompt]     ,  generator=_A     ,  num_inference_steps=2     ,  output_type='np')
					__snake_case      :							Optional[int]						=			output.images

					__snake_case      :							int						=			torch.Generator(device=_A).manual_seed(0)
					__snake_case      :							Tuple						=			pipe(
					    [prompt]     ,  generator=_A     ,  output_type='np'     ,  return_dict=_A     ,  num_inference_steps=2)[0]

					__snake_case      :							str						=			image[0, -3:, -3:, -1]
					__snake_case      :							Union[str, Any]						=			image_from_tuple[0, -3:, -3:, -1]

					assert image.shape == (1, 24, 24, 3)

					__snake_case      :							str						=			np.array([0.6_551, 0.6_168, 0.5_008, 0.5_676, 0.5_659, 0.4_295, 0.6_073, 0.5_599, 0.4_992])

					assert np.abs(image_slice.flatten() - expected_slice).max() < 1E-2
					assert np.abs(image_from_tuple_slice.flatten() - expected_slice).max() < 1E-2






				def  _lowercase					(self    :				Tuple)   ->     Optional[int]:
					__snake_case      :							Optional[Any]						=			'cpu'

					__snake_case      :							Optional[int]						=			self.dummy_vqvae
					__snake_case      :							List[str]						=			self.dummy_text_encoder
					__snake_case      :							Optional[int]						=			self.dummy_tokenizer
					__snake_case      :							Optional[Any]						=			self.dummy_transformer
					__snake_case      :							Union[str, Any]						=			VQDiffusionScheduler(self.num_embed)
					__snake_case      :							Optional[int]						=			LearnedClassifierFreeSamplingEmbeddings(
					    learnable=_A     ,  hidden_size=self.text_embedder_hidden_size     ,  length=tokenizer.model_max_length)

					__snake_case      :							Union[str, Any]						=			VQDiffusionPipeline(
					    vqvae=_A     ,  text_encoder=_A     ,  tokenizer=_A     ,  transformer=_A     ,  scheduler=_A     ,  learned_classifier_free_sampling_embeddings=_A     ,  )
					__snake_case      :							Union[str, Any]						=			pipe.to(_A)
					pipe.set_progress_bar_config(disable=_A)

					__snake_case      :							Union[str, Any]						=			'teddy bear playing in the pool'

					__snake_case      :							Optional[int]						=			torch.Generator(device=_A).manual_seed(0)
					__snake_case      :							Tuple						=			pipe([prompt]     ,  generator=_A     ,  num_inference_steps=2     ,  output_type='np')
					__snake_case      :							Optional[Any]						=			output.images

					__snake_case      :							str						=			torch.Generator(device=_A).manual_seed(0)
					__snake_case      :							Dict						=			pipe(
					    [prompt]     ,  generator=_A     ,  output_type='np'     ,  return_dict=_A     ,  num_inference_steps=2)[0]

					__snake_case      :							int						=			image[0, -3:, -3:, -1]
					__snake_case      :							Tuple						=			image_from_tuple[0, -3:, -3:, -1]

					assert image.shape == (1, 24, 24, 3)

					__snake_case      :							Optional[Any]						=			np.array([0.6_693, 0.6_075, 0.4_959, 0.5_701, 0.5_583, 0.4_333, 0.6_171, 0.5_684, 0.4_988])

					assert np.abs(image_slice.flatten() - expected_slice).max() < 2.0
					assert np.abs(image_from_tuple_slice.flatten() - expected_slice).max() < 1E-2







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



				def  _lowercase					(self    :				Any)   ->     Union[str, Any]:
					# clean up the VRAM after each test
					super().tearDown()
					gc.collect()
					torch.cuda.empty_cache()






				def  _lowercase					(self    :				Tuple)   ->     Optional[int]:
					__snake_case      :							List[Any]						=			load_numpy(
					    'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'
					    '/vq_diffusion/teddy_bear_pool_classifier_free_sampling.npy')

					__snake_case      :							Union[str, Any]						=			VQDiffusionPipeline.from_pretrained('microsoft/vq-diffusion-ithq')
					__snake_case      :							Tuple						=			pipeline.to(_A)
					pipeline.set_progress_bar_config(disable=_A)

					# requires GPU generator for gumbel softmax
					# don't use GPU generator in tests though
					__snake_case      :							Optional[int]						=			torch.Generator(device=_A).manual_seed(0)
					__snake_case      :							int						=			pipeline(
					    'teddy bear playing in the pool'     ,  num_images_per_prompt=1     ,  generator=_A     ,  output_type='np'     ,  )

					__snake_case      :							int						=			output.images[0]

					assert image.shape == (2_56, 2_56, 3)
					assert np.abs(expected_image - image).max() < 2.0





