

import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    DPMSolverMultistepScheduler,
    TextToVideoSDPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import is_xformers_available, load_numpy, skip_mps, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism

from ..pipeline_params import TEXT_TO_IMAGE_BATCH_PARAMS, TEXT_TO_IMAGE_PARAMS
from ..test_pipelines_common import PipelineTesterMixin


enable_full_determinism()
@skip_mps
class        snake_case_		(			UpperCAmelCase_						,					unittest.TestCase):
		lowerCamelCase    :Union[str, Any]						=     TextToVideoSDPipeline
		lowerCamelCase    :str						=     TEXT_TO_IMAGE_PARAMS
		lowerCamelCase    :str						=     TEXT_TO_IMAGE_BATCH_PARAMS
		# No `output_type`.
		lowerCamelCase    :Tuple						=     frozenset(
		    [
		        "num_inference_steps",
		        "generator",
		        "latents",
		        "return_dict",
		        "callback",
		        "callback_steps",
		    ])







		def 			__lowercase   (		self   )				->   List[str]:
				torch.manual_seed(0   )
				lowerCamelCase   : List[Any]								=UNetaDConditionModel(
				    block_out_channels=(3_2, 6_4, 6_4, 6_4)			,     layers_per_block=2			,     sample_size=3_2			,     in_channels=4			,     out_channels=4			,     down_block_types=('''CrossAttnDownBlock3D''', '''CrossAttnDownBlock3D''', '''CrossAttnDownBlock3D''', '''DownBlock3D''')			,     up_block_types=('''UpBlock3D''', '''CrossAttnUpBlock3D''', '''CrossAttnUpBlock3D''', '''CrossAttnUpBlock3D''')			,     cross_attention_dim=3_2			,     attention_head_dim=4			,     )
				lowerCamelCase   : Union[str, Any]								=DDIMScheduler(
				    beta_start=0.0_0_0_8_5			,     beta_end=0.0_1_2			,     beta_schedule='''scaled_linear'''			,     clip_sample=_lowercase			,     set_alpha_to_one=_lowercase			,     )
				torch.manual_seed(0   )
				lowerCamelCase   : List[str]								=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			,     sample_size=1_2_8			,     )
				torch.manual_seed(0   )
				lowerCamelCase   : Dict								=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			,     hidden_act='''gelu'''			,     projection_dim=5_1_2			,     )
				lowerCamelCase   : Dict								=CLIPTextModel(_lowercase   )
				lowerCamelCase   : str								=CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''   )

				lowerCamelCase   : Optional[Any]								={
				    'unet': unet,
				    'scheduler': scheduler,
				    'vae': vae,
				    'text_encoder': text_encoder,
				    'tokenizer': tokenizer,
				}
				return components







		def 			__lowercase   (		self			,     __lowercase			,     __lowercase=0   )				->   int:
				if str(_lowercase   ).startswith('''mps'''   ):
						lowerCamelCase   : Tuple								=torch.manual_seed(_lowercase   )
				else:
						lowerCamelCase   : List[str]								=torch.Generator(device=_lowercase   ).manual_seed(_lowercase   )
				lowerCamelCase   : Union[str, Any]								={
				    'prompt': 'A painting of a squirrel eating a burger',
				    'generator': generator,
				    'num_inference_steps': 2,
				    'guidance_scale': 6.0,
				    'output_type': 'pt',
				}
				return inputs







		def 			__lowercase   (		self   )				->   Optional[Any]:
				lowerCamelCase   : Dict								='cpu'  # ensure determinism for the device-dependent torch.Generator
				lowerCamelCase   : List[str]								=self.get_dummy_components()
				lowerCamelCase   : int								=TextToVideoSDPipeline(**_lowercase   )
				lowerCamelCase   : Dict								=sd_pipe.to(_lowercase   )
				sd_pipe.set_progress_bar_config(disable=_lowercase   )

				lowerCamelCase   : Optional[Any]								=self.get_dummy_inputs(_lowercase   )
				lowerCamelCase   : Any								='np'
				lowerCamelCase   : Union[str, Any]								=sd_pipe(**_lowercase   ).frames
				lowerCamelCase   : int								=frames[0][-3:, -3:, -1]

				assert frames[0].shape == (6_4, 6_4, 3)
				lowerCamelCase   : List[str]								=np.array([1_5_8.0, 1_6_0.0, 1_5_3.0, 1_2_5.0, 1_0_0.0, 1_2_1.0, 1_1_1.0, 9_3.0, 1_1_3.0]   )

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







		def 			__lowercase   (		self   )				->   Optional[int]:
				self._test_attention_slicing_forward_pass(test_mean_pixel_difference=_lowercase			,     expected_max_diff=3e-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   )				->   Any:
				self._test_xformers_attention_forwardGenerator_pass(test_mean_pixel_difference=_lowercase			,     expected_max_diff=1e-2   )







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







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







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







		def 			__lowercase   (		self   )				->   Union[str, Any]:
				return super().test_progress_bar()

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







		def 			__lowercase   (		self   )				->   int:
				lowerCamelCase   : str								=load_numpy(
				    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/text_to_video/video.npy'''   )

				lowerCamelCase   : List[str]								=TextToVideoSDPipeline.from_pretrained('''damo-vilab/text-to-video-ms-1.7b'''   )
				lowerCamelCase   : Any								=DPMSolverMultistepScheduler.from_config(pipe.scheduler.config   )
				lowerCamelCase   : int								=pipe.to('''cuda'''   )

				lowerCamelCase   : int								='Spiderman is surfing'
				lowerCamelCase   : Tuple								=torch.Generator(device='''cpu'''   ).manual_seed(0   )

				lowerCamelCase   : int								=pipe(_lowercase			,     generator=_lowercase			,     num_inference_steps=2_5			,     output_type='''pt'''   ).frames
				lowerCamelCase   : Tuple								=video_frames.cpu().numpy()

				assert np.abs(expected_video - video   ).mean() < 5e-2







		def 			__lowercase   (		self   )				->   int:
				lowerCamelCase   : List[Any]								=load_numpy(
				    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/text_to_video/video_2step.npy'''   )

				lowerCamelCase   : Union[str, Any]								=TextToVideoSDPipeline.from_pretrained('''damo-vilab/text-to-video-ms-1.7b'''   )
				lowerCamelCase   : List[str]								=pipe.to('''cuda'''   )

				lowerCamelCase   : str								='Spiderman is surfing'
				lowerCamelCase   : Any								=torch.Generator(device='''cpu'''   ).manual_seed(0   )

				lowerCamelCase   : List[str]								=pipe(_lowercase			,     generator=_lowercase			,     num_inference_steps=2			,     output_type='''pt'''   ).frames
				lowerCamelCase   : Any								=video_frames.cpu().numpy()

				assert np.abs(expected_video - video   ).mean() < 5e-2








# coding=utf-8
# Copyright 2020 The HuggingFace Inc. team.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# this script dumps information about the environment

import os
import sys

import transformers


snake_case_							=			'''3'''

print('''Python version:''', sys.version)
print('''transformers version:''', transformers.__version__)

try:
				import torch

				print('''Torch version:''', torch.__version__)
				print('''Cuda available:''', torch.cuda.is_available())
				print('''Cuda version:''', torch.version.cuda)
				print('''CuDNN version:''', torch.backends.cudnn.version())
				print('''Number of GPUs available:''', torch.cuda.device_count())
				print('''NCCL version:''', torch.cuda.nccl.version())
except ImportError:
				print('''Torch version:''', None)

try:
				import deepspeed

				print('''DeepSpeed version:''', deepspeed.__version__)
except ImportError:
				print('''DeepSpeed version:''', None)

try:
				import tensorflow as tf

				print('''TensorFlow version:''', tf.__version__)
				print('''TF GPUs available:''', bool(tf.config.list_physical_devices('''GPU''')))
				print('''Number of TF GPUs available:''', len(tf.config.list_physical_devices('''GPU''')))
except ImportError:
				print('''TensorFlow version:''', None)

