
import random
import unittest

import numpy as np

from diffusers import (
    DPMSolverMultistepScheduler,
    EulerAncestralDiscreteScheduler,
    EulerDiscreteScheduler,
    LMSDiscreteScheduler,
    OnnxStableDiffusionImgaImgPipeline,
    PNDMScheduler,
)
from diffusers.utils import floats_tensor
from diffusers.utils.testing_utils import (
    is_onnx_available,
    load_image,
    nightly,
    require_onnxruntime,
    require_torch_gpu,
)

from ..test_pipelines_onnx_common import OnnxPipelineTesterMixin


if is_onnx_available():
		import onnxruntime as ort





class       __A(				UpperCAmelCase     ,		unittest.TestCase       ):
					SCREAMING_SNAKE_CASE			    =    '''hf-internal-testing/tiny-random-OnnxStableDiffusionPipeline'''

					def    lowercase__      (	self					:     Tuple   ,					__UpperCamelCase					:     List[str]=0   ):
												lowerCamelCase_							  =					floats_tensor((1, 3, 1_2_8, 1_2_8)   ,					rng=random.Random(__UpperCamelCase   )   )
												lowerCamelCase_							  =					np.random.RandomState(__UpperCamelCase   )
												lowerCamelCase_							  =					{
												    """prompt""": """A painting of a squirrel eating a burger""",
												    """image""": image,
												    """generator""": generator,
												    """num_inference_steps""": 3,
												    """strength""": 0.75,
												    """guidance_scale""": 7.5,
												    """output_type""": """numpy""",
												}
												return inputs

					def    lowercase__      (	self					:     Optional[Any]   ):
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint   ,					provider="""CPUExecutionProvider"""   )
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												lowerCamelCase_							  =					self.get_dummy_inputs()
												lowerCamelCase_							  =					pipe(**__UpperCamelCase   ).images
												lowerCamelCase_							  =					image[0, -3:, -3:, -1].flatten()

												assert image.shape == (1, 1_2_8, 1_2_8, 3)
												lowerCamelCase_							  =					np.array([0.69643, 0.58484, 0.50314, 0.58760, 0.55368, 0.59643, 0.51529, 0.41217, 0.49087]   )
												assert np.abs(image_slice - expected_slice   ).max() < 1E-1

					def    lowercase__      (	self					:     Optional[Any]   ):
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint   ,					provider="""CPUExecutionProvider"""   )
												lowerCamelCase_							  =					PNDMScheduler.from_config(pipe.scheduler.config   ,					skip_prk_steps=__UpperCamelCase   )
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												lowerCamelCase_							  =					self.get_dummy_inputs()
												lowerCamelCase_							  =					pipe(**__UpperCamelCase   ).images
												lowerCamelCase_							  =					image[0, -3:, -3:, -1]

												assert image.shape == (1, 1_2_8, 1_2_8, 3)
												lowerCamelCase_							  =					np.array([0.61737, 0.54642, 0.53183, 0.54465, 0.52742, 0.60525, 0.49969, 0.40655, 0.48154]   )

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

					def    lowercase__      (	self					:     Dict   ):
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint   ,					provider="""CPUExecutionProvider"""   )
												lowerCamelCase_							  =					LMSDiscreteScheduler.from_config(pipe.scheduler.config   )
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												# warmup pass to apply optimizations
												lowerCamelCase_							  =					pipe(**self.get_dummy_inputs()   )

												lowerCamelCase_							  =					self.get_dummy_inputs()
												lowerCamelCase_							  =					pipe(**__UpperCamelCase   ).images
												lowerCamelCase_							  =					image[0, -3:, -3:, -1]

												assert image.shape == (1, 1_2_8, 1_2_8, 3)
												lowerCamelCase_							  =					np.array([0.52761, 0.59977, 0.49033, 0.49619, 0.54282, 0.50311, 0.47600, 0.40918, 0.45203]   )

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

					def    lowercase__      (	self					:     Any   ):
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint   ,					provider="""CPUExecutionProvider"""   )
												lowerCamelCase_							  =					EulerDiscreteScheduler.from_config(pipe.scheduler.config   )
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												lowerCamelCase_							  =					self.get_dummy_inputs()
												lowerCamelCase_							  =					pipe(**__UpperCamelCase   ).images
												lowerCamelCase_							  =					image[0, -3:, -3:, -1]

												assert image.shape == (1, 1_2_8, 1_2_8, 3)
												lowerCamelCase_							  =					np.array([0.52911, 0.60004, 0.49229, 0.49805, 0.54502, 0.50680, 0.47777, 0.41028, 0.45304]   )

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

					def    lowercase__      (	self					:     str   ):
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint   ,					provider="""CPUExecutionProvider"""   )
												lowerCamelCase_							  =					EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config   )
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												lowerCamelCase_							  =					self.get_dummy_inputs()
												lowerCamelCase_							  =					pipe(**__UpperCamelCase   ).images
												lowerCamelCase_							  =					image[0, -3:, -3:, -1]

												assert image.shape == (1, 1_2_8, 1_2_8, 3)
												lowerCamelCase_							  =					np.array([0.52911, 0.60004, 0.49229, 0.49805, 0.54502, 0.50680, 0.47777, 0.41028, 0.45304]   )

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



					def    lowercase__      (	self					:     Dict   ):
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint   ,					provider="""CPUExecutionProvider"""   )
												lowerCamelCase_							  =					DPMSolverMultistepScheduler.from_config(pipe.scheduler.config   )
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												lowerCamelCase_							  =					self.get_dummy_inputs()
												lowerCamelCase_							  =					pipe(**__UpperCamelCase   ).images
												lowerCamelCase_							  =					image[0, -3:, -3:, -1]

												assert image.shape == (1, 1_2_8, 1_2_8, 3)
												lowerCamelCase_							  =					np.array([0.65331, 0.58277, 0.48204, 0.56059, 0.53665, 0.56235, 0.50969, 0.40009, 0.46552]   )

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





@nightly
@require_onnxruntime
@require_torch_gpu
class       __A(				unittest.TestCase       ):

					@property
					def    lowercase__      (	self					:     Tuple   ):
												return (
												    "CUDAExecutionProvider",
												    {
												        "gpu_mem_limit": "15000000000",  # 15GB
												        "arena_extend_strategy": "kSameAsRequested",
												    },
												)

					@property
					def    lowercase__      (	self					:     int   ):
												lowerCamelCase_							  =					ort.SessionOptions()
												lowerCamelCase_							  =					False
												return options

					def    lowercase__      (	self					:     str   ):
												lowerCamelCase_							  =					load_image(
												    """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"""
												    """/img2img/sketch-mountains-input.jpg"""   )
												lowerCamelCase_							  =					init_image.resize((7_6_8, 5_1_2)   )
												# using the PNDM scheduler by default
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(
												    """CompVis/stable-diffusion-v1-4"""   ,					revision="""onnx"""   ,					safety_checker=__UpperCamelCase   ,					feature_extractor=__UpperCamelCase   ,					provider=self.gpu_provider   ,					sess_options=self.gpu_options   ,					)
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												lowerCamelCase_							  =					"""A fantasy landscape, trending on artstation"""

												lowerCamelCase_							  =					np.random.RandomState(0   )
												lowerCamelCase_							  =					pipe(
												    prompt=__UpperCamelCase   ,					image=__UpperCamelCase   ,					strength=0.75   ,					guidance_scale=7.5   ,					num_inference_steps=1_0   ,					generator=__UpperCamelCase   ,					output_type="""np"""   ,					)
												lowerCamelCase_							  =					output.images
												lowerCamelCase_							  =					images[0, 2_5_5:2_5_8, 3_8_3:3_8_6, -1]

												assert images.shape == (1, 5_1_2, 7_6_8, 3)
												lowerCamelCase_							  =					np.array([0.4909, 0.5059, 0.5372, 0.4623, 0.4876, 0.5049, 0.4820, 0.4956, 0.5019]   )
												# TODO: lower the tolerance after finding the cause of onnxruntime reproducibility issues

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



					def    lowercase__      (	self					:     Union[str, Any]   ):
												lowerCamelCase_							  =					load_image(
												    """https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main"""
												    """/img2img/sketch-mountains-input.jpg"""   )
												lowerCamelCase_							  =					init_image.resize((7_6_8, 5_1_2)   )
												lowerCamelCase_							  =					LMSDiscreteScheduler.from_pretrained(
												    """runwayml/stable-diffusion-v1-5"""   ,					subfolder="""scheduler"""   ,					revision="""onnx"""   )
												lowerCamelCase_							  =					OnnxStableDiffusionImgaImgPipeline.from_pretrained(
												    """runwayml/stable-diffusion-v1-5"""   ,					revision="""onnx"""   ,					scheduler=__UpperCamelCase   ,					safety_checker=__UpperCamelCase   ,					feature_extractor=__UpperCamelCase   ,					provider=self.gpu_provider   ,					sess_options=self.gpu_options   ,					)
												pipe.set_progress_bar_config(disable=__UpperCamelCase   )

												lowerCamelCase_							  =					"""A fantasy landscape, trending on artstation"""

												lowerCamelCase_							  =					np.random.RandomState(0   )
												lowerCamelCase_							  =					pipe(
												    prompt=__UpperCamelCase   ,					image=__UpperCamelCase   ,					strength=0.75   ,					guidance_scale=7.5   ,					num_inference_steps=2_0   ,					generator=__UpperCamelCase   ,					output_type="""np"""   ,					)
												lowerCamelCase_							  =					output.images
												lowerCamelCase_							  =					images[0, 2_5_5:2_5_8, 3_8_3:3_8_6, -1]

												assert images.shape == (1, 5_1_2, 7_6_8, 3)
												lowerCamelCase_							  =					np.array([0.8043, 0.926, 0.9581, 0.8119, 0.8954, 0.913, 0.7209, 0.7463, 0.7431]   )
												# TODO: lower the tolerance after finding the cause of onnxruntime reproducibility issues

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







from typing import List, Optional, Union

from ...image_utils import ImageInput
from ...processing_utils import ProcessorMixin
from ...tokenization_utils_base import BatchEncoding, PaddingStrategy, PreTokenizedInput, TextInput, TruncationStrategy
from ...utils import TensorType





class       __A(				UpperCAmelCase       ):
					SCREAMING_SNAKE_CASE			    =    ['''image_processor''', '''tokenizer''']
					SCREAMING_SNAKE_CASE			    =    '''BlipImageProcessor'''
					SCREAMING_SNAKE_CASE			    =    '''AutoTokenizer'''

					def __init__(	self					:     Union[str, Any]   ,					__UpperCamelCase					:     List[Any]   ,					__UpperCamelCase					:     List[str]   ):
												lowerCamelCase_							  =					False
												super().__init__(__UpperCamelCase   ,					__UpperCamelCase   )
												lowerCamelCase_							  =					self.image_processor

					def __call__(	self					:     Any   ,					__UpperCamelCase					:     ImageInput = None   ,					__UpperCamelCase					:     Union[TextInput, PreTokenizedInput, List[TextInput], List[PreTokenizedInput]] = None   ,					__UpperCamelCase					:     bool = True   ,					__UpperCamelCase					:     Union[bool, str, PaddingStrategy] = False   ,					__UpperCamelCase					:     Union[bool, str, TruncationStrategy] = None   ,					__UpperCamelCase					:     Optional[int] = None   ,					__UpperCamelCase					:     int = 0   ,					__UpperCamelCase					:     Optional[int] = None   ,					__UpperCamelCase					:     Optional[bool] = None   ,					__UpperCamelCase					:     bool = False   ,					__UpperCamelCase					:     bool = False   ,					__UpperCamelCase					:     bool = False   ,					__UpperCamelCase					:     bool = False   ,					__UpperCamelCase					:     bool = False   ,					__UpperCamelCase					:     bool = True   ,					__UpperCamelCase					:     Optional[Union[str, TensorType]] = None   ,					**__UpperCamelCase					:     Optional[Any]   ,					):
												if images is None and text is None:
																			raise ValueError("""You have to specify either images or text."""   )

												# Get only text
												if images is None:
																			lowerCamelCase_							  =					self.tokenizer
																			lowerCamelCase_							  =					self.tokenizer(
																			    text=__UpperCamelCase   ,					add_special_tokens=__UpperCamelCase   ,					padding=__UpperCamelCase   ,					truncation=__UpperCamelCase   ,					max_length=__UpperCamelCase   ,					stride=__UpperCamelCase   ,					pad_to_multiple_of=__UpperCamelCase   ,					return_attention_mask=__UpperCamelCase   ,					return_overflowing_tokens=__UpperCamelCase   ,					return_special_tokens_mask=__UpperCamelCase   ,					return_offsets_mapping=__UpperCamelCase   ,					return_token_type_ids=__UpperCamelCase   ,					return_length=__UpperCamelCase   ,					verbose=__UpperCamelCase   ,					return_tensors=__UpperCamelCase   ,					**__UpperCamelCase   ,					)
																			return text_encoding

												# add pixel_values
												lowerCamelCase_							  =					self.image_processor(__UpperCamelCase   ,					return_tensors=__UpperCamelCase   )

												if text is not None:
																			lowerCamelCase_							  =					self.tokenizer(
																			    text=__UpperCamelCase   ,					add_special_tokens=__UpperCamelCase   ,					padding=__UpperCamelCase   ,					truncation=__UpperCamelCase   ,					max_length=__UpperCamelCase   ,					stride=__UpperCamelCase   ,					pad_to_multiple_of=__UpperCamelCase   ,					return_attention_mask=__UpperCamelCase   ,					return_overflowing_tokens=__UpperCamelCase   ,					return_special_tokens_mask=__UpperCamelCase   ,					return_offsets_mapping=__UpperCamelCase   ,					return_token_type_ids=__UpperCamelCase   ,					return_length=__UpperCamelCase   ,					verbose=__UpperCamelCase   ,					return_tensors=__UpperCamelCase   ,					**__UpperCamelCase   ,					)
												else:
																			lowerCamelCase_							  =					None

												if text_encoding is not None:
																			encoding_image_processor.update(__UpperCamelCase   )

												return encoding_image_processor

					def    lowercase__      (	self					:     Any   ,					*__UpperCamelCase					:     Union[str, Any]   ,					**__UpperCamelCase					:     List[Any]   ):
												return self.tokenizer.batch_decode(*__UpperCamelCase   ,					**__UpperCamelCase   )

					def    lowercase__      (	self					:     List[str]   ,					*__UpperCamelCase					:     List[Any]   ,					**__UpperCamelCase					:     int   ):
												return self.tokenizer.decode(*__UpperCamelCase   ,					**__UpperCamelCase   )



					@property
					# Copied from transformers.models.blip.processing_blip.BlipProcessor.model_input_names
					def    lowercase__      (	self					:     Optional[int]   ):
												lowerCamelCase_							  =					self.tokenizer.model_input_names
												lowerCamelCase_							  =					self.image_processor.model_input_names
												return list(dict.fromkeys(tokenizer_input_names + image_processor_input_names   )   )





