





from typing import Dict, Iterable, Optional, Union

import numpy as np

from ...image_processing_utils import BaseImageProcessor, BatchFeature, get_size_dict
from ...image_transforms import normalize, rescale, resize, to_channel_dimension_format, to_pil_image
from ...image_utils import (
    IMAGENET_STANDARD_MEAN,
    IMAGENET_STANDARD_STD,
    ChannelDimension,
    ImageInput,
    PILImageResampling,
    make_list_of_images,
    to_numpy_array,
    valid_images,
)
from ...utils import TensorType, is_pytesseract_available, is_vision_available, logging, requires_backends


if is_vision_available():
	import PIL

# soft dependency
if is_pytesseract_available():
	import pytesseract

A_ :				str						 =    logging.get_logger(__name__)

def 		UpperCamelCase      (lowercase_:				Dict					,   lowercase_:				Any					,   lowercase_:				Optional[Any]      )  ->   Optional[Any]:
	return [
	    int(1000 * (box[0] / width)      ),
	    int(1000 * (box[1] / height)      ),
	    int(1000 * (box[2] / width)      ),
	    int(1000 * (box[3] / height)      ),
	]

def 		UpperCamelCase      (lowercase_:				np.ndarray					,   lowercase_:				Optional[str]					,   lowercase_:				Optional[str]      )  ->   List[Any]:
	A__							:					Tuple       =	to_pil_image(lowercase_      )
	A__							:					int       =	pil_image.size
	A__							:					Dict       =	pytesseract.image_to_data(lowercase_					,   lang=lowercase_					,   output_type="""dict"""					,   config=lowercase_      )
	A__							:					Dict       =	data["""text"""], data["""left"""], data["""top"""], data["""width"""], data["""height"""]

	# filter empty words and corresponding coordinates
	A__							:					List[Any]       =	[idx for idx, word in enumerate(lowercase_      ) if not word.strip()]
	A__							:					Union[str, Any]       =	[word for idx, word in enumerate(lowercase_      ) if idx not in irrelevant_indices]
	A__							:					Union[str, Any]       =	[coord for idx, coord in enumerate(lowercase_      ) if idx not in irrelevant_indices]
	A__							:					Dict       =	[coord for idx, coord in enumerate(lowercase_      ) if idx not in irrelevant_indices]
	A__							:					Any       =	[coord for idx, coord in enumerate(lowercase_      ) if idx not in irrelevant_indices]
	A__							:					List[str]       =	[coord for idx, coord in enumerate(lowercase_      ) if idx not in irrelevant_indices]

	# turn coordinates into (left, top, left+width, top+height) format
	A__							:					int       =	[]
	for x, y, w, h in zip(lowercase_					,   lowercase_					,   lowercase_					,   lowercase_      ):
		A__							:					Optional[Any]       =	[x, y, x + w, y + h]
		actual_boxes.append(lowercase_      )

	# finally, normalize the bounding boxes
	A__							:					Union[str, Any]       =	[]
	for box in actual_boxes:
		normalized_boxes.append(normalize_box(lowercase_					,   lowercase_					,   lowercase_      )      )

	assert len(lowercase_      ) == len(lowercase_      ), "Not as many words as there are bounding boxes"

	return words, normalized_boxes



class 					_a		(__magic_name__       ):


					'''simple docstring'''






					UpperCAmelCase__:     List[Any]													= ['''pixel_values''']






					def __init__(				self					, A__ = True					, A__ = None					, A__ = PILImageResampling.BILINEAR					, A__ = True					, A__ = 1 / 255					, A__ = True					, A__ = None					, A__ = None					, A__ = True					, A__ = None					, A__ = ""					, **A__					, ):
						super().__init__(**A__    )
						A__							:					Union[str, Any]       =	size if size is not None else {"""height""": 224, """width""": 224}
						A__							:					Tuple       =	get_size_dict(A__    )

						A__							:					int       =	do_resize
						A__							:					Union[str, Any]       =	size
						A__							:					List[str]       =	resample
						A__							:					List[str]       =	do_rescale
						A__							:					Optional[int]       =	rescale_value
						A__							:					Union[str, Any]       =	do_normalize
						A__							:					List[Any]       =	image_mean if image_mean is not None else IMAGENET_STANDARD_MEAN
						A__							:					Dict       =	image_std if image_std is not None else IMAGENET_STANDARD_STD
						A__							:					List[str]       =	apply_ocr
						A__							:					Optional[int]       =	ocr_lang
						A__							:					int       =	tesseract_config






					def 						__A    (				self					, A__					, A__					, A__ = PILImageResampling.BILINEAR					, A__ = None					, **A__					, ):
						A__							:					Dict       =	get_size_dict(A__    )
						if "height" not in size or "width" not in size:
							raise ValueError(F"""The size dictionary must contain the keys 'height' and 'width'. Got {size.keys()}"""    )
						A__							:					Tuple       =	(size["""height"""], size["""width"""])
						return resize(A__					, size=A__					, resample=A__					, data_format=A__					, **A__    )






					def 						__A    (				self					, A__					, A__					, A__ = None					, **A__					, ):
						return rescale(A__					, scale=A__					, data_format=A__					, **A__    )






					def 						__A    (				self					, A__					, A__					, A__					, A__ = None					, **A__					, ):
						return normalize(A__					, mean=A__					, std=A__					, data_format=A__					, **A__    )






					def 						__A    (				self					, A__					, A__ = None					, A__ = None					, A__=None					, A__ = None					, A__ = None					, A__ = None					, A__ = None					, A__ = None					, A__ = None					, A__ = None					, A__ = None					, A__ = None					, A__ = ChannelDimension.FIRST					, **A__					, ):
						A__							:					Tuple       =	do_resize if do_resize is not None else self.do_resize
						A__							:					Any       =	size if size is not None else self.size
						A__							:					Tuple       =	get_size_dict(A__    )
						A__							:					str       =	resample if resample is not None else self.resample
						A__							:					Union[str, Any]       =	do_rescale if do_rescale is not None else self.do_rescale
						A__							:					Optional[int]       =	rescale_factor if rescale_factor is not None else self.rescale_factor
						A__							:					int       =	do_normalize if do_normalize is not None else self.do_normalize
						A__							:					str       =	image_mean if image_mean is not None else self.image_mean
						A__							:					List[Any]       =	image_std if image_std is not None else self.image_std
						A__							:					Tuple       =	apply_ocr if apply_ocr is not None else self.apply_ocr
						A__							:					List[str]       =	ocr_lang if ocr_lang is not None else self.ocr_lang
						A__							:					Union[str, Any]       =	tesseract_config if tesseract_config is not None else self.tesseract_config

						A__							:					Optional[int]       =	make_list_of_images(A__    )

						if not valid_images(A__    ):
							raise ValueError(
							    """Invalid image type. Must be of type PIL.Image.Image, numpy.ndarray, """
							    """torch.Tensor, tf.Tensor or jax.ndarray."""    )

						if do_resize and size is None:
							raise ValueError("""Size must be specified if do_resize is True."""    )

						if do_rescale and rescale_factor is None:
							raise ValueError("""Rescale factor must be specified if do_rescale is True."""    )

						if do_normalize and (image_mean is None or image_std is None):
							raise ValueError("""If do_normalize is True, image_mean and image_std must be specified."""    )

						# All transformations expect numpy arrays.
						A__							:					List[Any]       =	[to_numpy_array(A__    ) for image in images]

						# Tesseract OCR to get words + normalized bounding boxes
						if apply_ocr:
							requires_backends(self					, """pytesseract"""    )
							A__							:					List[Any]       =	[]
							A__							:					int       =	[]
							for image in images:
								A__							:					List[Any]       =	apply_tesseract(A__					, A__					, A__    )
								words_batch.append(A__    )
								boxes_batch.append(A__    )

						if do_resize:
							A__							:					int       =	[self.resize(image=A__					, size=A__					, resample=A__    ) for image in images]

						if do_rescale:
							A__							:					Dict       =	[self.rescale(image=A__					, scale=A__    ) for image in images]

						if do_normalize:
							A__							:					List[Any]       =	[self.normalize(image=A__					, mean=A__					, std=A__    ) for image in images]

						A__							:					str       =	[to_channel_dimension_format(A__					, A__    ) for image in images]

						A__							:					Optional[int]       =	BatchFeature(data={"""pixel_values""": images}					, tensor_type=A__    )

						if apply_ocr:
							A__							:					str       =	words_batch
							A__							:					Any       =	boxes_batch
						return data






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 					_a		(__magic_name__	,     unittest.TestCase       ):


					'''simple docstring'''






					UpperCAmelCase__:     Any													= TextToVideoSDPipeline
					UpperCAmelCase__:     Any													= TEXT_TO_IMAGE_PARAMS
					UpperCAmelCase__:     Optional[Any]													= TEXT_TO_IMAGE_BATCH_PARAMS
					# No `output_type`.
					UpperCAmelCase__:     Optional[int]													= frozenset(
					    [
					        '''num_inference_steps''',
					        '''generator''',
					        '''latents''',
					        '''return_dict''',
					        '''callback''',
					        '''callback_steps''',
					    ]       )






					def 						__A    (				self    ):
						torch.manual_seed(0    )
						A__							:					Optional[int]       =	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					, )
						A__							:					Optional[int]       =	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    )
						A__							:					Union[str, 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    )
						A__							:					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=1000					, hidden_act="""gelu"""					, projection_dim=512					, )
						A__							:					Union[str, Any]       =	CLIPTextModel(A__    )
						A__							:					Tuple       =	CLIPTokenizer.from_pretrained("""hf-internal-testing/tiny-random-clip"""    )

						A__							:					Dict       =	{
						    """unet""": unet,
						    """scheduler""": scheduler,
						    """vae""": vae,
						    """text_encoder""": text_encoder,
						    """tokenizer""": tokenizer,
						}
						return components






					def 						__A    (				self					, A__					, A__=0    ):
						if str(A__    ).startswith("""mps"""    ):
							A__							:					Tuple       =	torch.manual_seed(A__    )
						else:
							A__							:					List[str]       =	torch.Generator(device=A__    ).manual_seed(A__    )
						A__							:					List[str]       =	{
						    """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 						__A    (				self    ):
						A__							:					List[str]       =	"""cpu"""  # ensure determinism for the device-dependent torch.Generator
						A__							:					Union[str, Any]       =	self.get_dummy_components()
						A__							:					Union[str, Any]       =	TextToVideoSDPipeline(**A__    )
						A__							:					int       =	sd_pipe.to(A__    )
						sd_pipe.set_progress_bar_config(disable=A__    )

						A__							:					int       =	self.get_dummy_inputs(A__    )
						A__							:					int       =	"""np"""
						A__							:					Any       =	sd_pipe(**A__    ).frames
						A__							:					Dict       =	frames[0][-3:, -3:, -1]

						assert frames[0].shape == (64, 64, 3)
						A__							:					Optional[Any]       =	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 						__A    (				self    ):
						self._test_attention_slicing_forward_pass(test_mean_pixel_difference=A__					, 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 						__A    (				self    ):
						self._test_xformers_attention_forwardGenerator_pass(test_mean_pixel_difference=A__					, expected_max_diff=1e-2    )






					@unittest.skip(reason="""Batching needs to be properly figured out first for this pipeline."""    )
					def 						__A    (				self    ):
						pass






					@unittest.skip(reason="""Batching needs to be properly figured out first for this pipeline."""    )
					def 						__A    (				self    ):
						pass






					@unittest.skip(reason="""`num_images_per_prompt` argument is not supported for this pipeline."""    )
					def 						__A    (				self    ):
						pass






					def 						__A    (				self    ):
						return super().test_progress_bar()



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


					'''simple docstring'''






					def 						__A    (				self    ):
						A__							:					Union[str, Any]       =	load_numpy(
						    """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/text_to_video/video.npy"""    )

						A__							:					Tuple       =	TextToVideoSDPipeline.from_pretrained("""damo-vilab/text-to-video-ms-1.7b"""    )
						A__							:					Any       =	DPMSolverMultistepScheduler.from_config(pipe.scheduler.config    )
						A__							:					int       =	pipe.to("""cuda"""    )

						A__							:					Optional[Any]       =	"""Spiderman is surfing"""
						A__							:					List[str]       =	torch.Generator(device="""cpu"""    ).manual_seed(0    )

						A__							:					Optional[Any]       =	pipe(A__					, generator=A__					, num_inference_steps=25					, output_type="""pt"""    ).frames
						A__							:					Dict       =	video_frames.cpu().numpy()

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






					def 						__A    (				self    ):
						A__							:					List[Any]       =	load_numpy(
						    """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/text_to_video/video_2step.npy"""    )

						A__							:					Optional[int]       =	TextToVideoSDPipeline.from_pretrained("""damo-vilab/text-to-video-ms-1.7b"""    )
						A__							:					List[str]       =	pipe.to("""cuda"""    )

						A__							:					Dict       =	"""Spiderman is surfing"""
						A__							:					Union[str, Any]       =	torch.Generator(device="""cpu"""    ).manual_seed(0    )

						A__							:					Optional[int]       =	pipe(A__					, generator=A__					, num_inference_steps=2					, output_type="""pt"""    ).frames
						A__							:					Optional[int]       =	video_frames.cpu().numpy()

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



