





"""simple docstring"""





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    _lowerCAmelCase  (	a    ,  unittest.TestCase			):
       """simple docstring"""




       __magic_name__	:int						    =   """hf-internal-testing/tiny-random-OnnxStableDiffusionPipeline"""






       def 	snake_case		(       self       ,					__UpperCAmelCase=0 ):



         '''simple docstring'''

         lowerCAmelCase__     :List[str]											=				floats_tensor((1, 3, 1_2_8, 1_2_8)       ,					rng=random.Random(__UpperCAmelCase ) )
         lowerCAmelCase__     :List[str]											=				np.random.RandomState(__UpperCAmelCase )
         lowerCAmelCase__     :List[str]											=				{
             '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 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :Optional[Any]											=				OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint       ,					provider='CPUExecutionProvider' )
         pipe.set_progress_bar_config(disable=__UpperCAmelCase )

         lowerCAmelCase__     :Union[str, Any]											=				self.get_dummy_inputs()
         lowerCAmelCase__     :Optional[int]											=				pipe(**__UpperCAmelCase ).images
         lowerCAmelCase__     :Union[str, Any]											=				image[0, -3:, -3:, -1].flatten()

         assert image.shape == (1, 1_2_8, 1_2_8, 3)
         lowerCAmelCase__     :Union[str, Any]											=				np.array([0.6_96_43, 0.5_84_84, 0.5_03_14, 0.5_87_60, 0.5_53_68, 0.5_96_43, 0.5_15_29, 0.4_12_17, 0.4_90_87] )
         assert np.abs(image_slice - expected_slice ).max() < 1E-1






       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :Optional[int]											=				OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint       ,					provider='CPUExecutionProvider' )
         lowerCAmelCase__     :str											=				PNDMScheduler.from_config(pipe.scheduler.config       ,					skip_prk_steps=__UpperCAmelCase )
         pipe.set_progress_bar_config(disable=__UpperCAmelCase )

         lowerCAmelCase__     :Tuple											=				self.get_dummy_inputs()
         lowerCAmelCase__     :Optional[Any]											=				pipe(**__UpperCAmelCase ).images
         lowerCAmelCase__     :Any											=				image[0, -3:, -3:, -1]

         assert image.shape == (1, 1_2_8, 1_2_8, 3)
         lowerCAmelCase__     :int											=				np.array([0.6_17_37, 0.5_46_42, 0.5_31_83, 0.5_44_65, 0.5_27_42, 0.6_05_25, 0.4_99_69, 0.4_06_55, 0.4_81_54] )

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






       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :Optional[int]											=				OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint       ,					provider='CPUExecutionProvider' )
         lowerCAmelCase__     :List[str]											=				LMSDiscreteScheduler.from_config(pipe.scheduler.config )
         pipe.set_progress_bar_config(disable=__UpperCAmelCase )

         # warmup pass to apply optimizations
         lowerCAmelCase__     :List[Any]											=				pipe(**self.get_dummy_inputs() )

         lowerCAmelCase__     :Tuple											=				self.get_dummy_inputs()
         lowerCAmelCase__     :int											=				pipe(**__UpperCAmelCase ).images
         lowerCAmelCase__     :Any											=				image[0, -3:, -3:, -1]

         assert image.shape == (1, 1_2_8, 1_2_8, 3)
         lowerCAmelCase__     :Union[str, Any]											=				np.array([0.5_27_61, 0.5_99_77, 0.4_90_33, 0.4_96_19, 0.5_42_82, 0.5_03_11, 0.4_76_00, 0.4_09_18, 0.4_52_03] )

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






       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :Optional[Any]											=				OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint       ,					provider='CPUExecutionProvider' )
         lowerCAmelCase__     :Dict											=				EulerDiscreteScheduler.from_config(pipe.scheduler.config )
         pipe.set_progress_bar_config(disable=__UpperCAmelCase )

         lowerCAmelCase__     :Any											=				self.get_dummy_inputs()
         lowerCAmelCase__     :List[str]											=				pipe(**__UpperCAmelCase ).images
         lowerCAmelCase__     :List[str]											=				image[0, -3:, -3:, -1]

         assert image.shape == (1, 1_2_8, 1_2_8, 3)
         lowerCAmelCase__     :Optional[int]											=				np.array([0.5_29_11, 0.6_00_04, 0.4_92_29, 0.4_98_05, 0.5_45_02, 0.5_06_80, 0.4_77_77, 0.4_10_28, 0.4_53_04] )

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






       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :str											=				OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint       ,					provider='CPUExecutionProvider' )
         lowerCAmelCase__     :str											=				EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config )
         pipe.set_progress_bar_config(disable=__UpperCAmelCase )

         lowerCAmelCase__     :Tuple											=				self.get_dummy_inputs()
         lowerCAmelCase__     :Any											=				pipe(**__UpperCAmelCase ).images
         lowerCAmelCase__     :Optional[int]											=				image[0, -3:, -3:, -1]

         assert image.shape == (1, 1_2_8, 1_2_8, 3)
         lowerCAmelCase__     :int											=				np.array([0.5_29_11, 0.6_00_04, 0.4_92_29, 0.4_98_05, 0.5_45_02, 0.5_06_80, 0.4_77_77, 0.4_10_28, 0.4_53_04] )

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






       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :List[Any]											=				OnnxStableDiffusionImgaImgPipeline.from_pretrained(self.hub_checkpoint       ,					provider='CPUExecutionProvider' )
         lowerCAmelCase__     :List[Any]											=				DPMSolverMultistepScheduler.from_config(pipe.scheduler.config )
         pipe.set_progress_bar_config(disable=__UpperCAmelCase )

         lowerCAmelCase__     :Any											=				self.get_dummy_inputs()
         lowerCAmelCase__     :List[Any]											=				pipe(**__UpperCAmelCase ).images
         lowerCAmelCase__     :int											=				image[0, -3:, -3:, -1]

         assert image.shape == (1, 1_2_8, 1_2_8, 3)
         lowerCAmelCase__     :Optional[Any]											=				np.array([0.6_53_31, 0.5_82_77, 0.4_82_04, 0.5_60_59, 0.5_36_65, 0.5_62_35, 0.5_09_69, 0.4_00_09, 0.4_65_52] )

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






@nightly
@require_onnxruntime
@require_torch_gpu
class    _lowerCAmelCase  (	unittest.TestCase			):
       """simple docstring"""




       @property
       def 	snake_case		(       self ):



         '''simple docstring'''

         return (
             "CUDAExecutionProvider",
             {
                 "gpu_mem_limit": "15000000000",  # 15GB
                 "arena_extend_strategy": "kSameAsRequested",
             },
         )






       @property
       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :Tuple											=				ort.SessionOptions()
         lowerCAmelCase__     :Optional[int]											=				False
         return options






       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :Any											=				load_image(
             'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'
             '/img2img/sketch-mountains-input.jpg' )
         lowerCAmelCase__     :Any											=				init_image.resize((7_6_8, 5_1_2) )
         # using the PNDM scheduler by default
         lowerCAmelCase__     :Optional[int]											=				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__     :List[Any]											=				'A fantasy landscape, trending on artstation'

         lowerCAmelCase__     :Optional[Any]											=				np.random.RandomState(0 )
         lowerCAmelCase__     :List[str]											=				pipe(
             prompt=__UpperCAmelCase       ,					image=__UpperCAmelCase       ,					strength=0.75       ,					guidance_scale=7.5       ,					num_inference_steps=1_0       ,					generator=__UpperCAmelCase       ,					output_type='np'       ,					)
         lowerCAmelCase__     :Any											=				output.images
         lowerCAmelCase__     :List[str]											=				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__     :List[Any]											=				np.array([0.49_09, 0.50_59, 0.53_72, 0.46_23, 0.48_76, 0.50_49, 0.48_20, 0.49_56, 0.50_19] )
         # TODO: lower the tolerance after finding the cause of onnxruntime reproducibility issues

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






       def 	snake_case		(       self ):



         '''simple docstring'''

         lowerCAmelCase__     :Union[str, Any]											=				load_image(
             'https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'
             '/img2img/sketch-mountains-input.jpg' )
         lowerCAmelCase__     :Optional[Any]											=				init_image.resize((7_6_8, 5_1_2) )
         lowerCAmelCase__     :List[Any]											=				LMSDiscreteScheduler.from_pretrained(
             'runwayml/stable-diffusion-v1-5'       ,					subfolder='scheduler'       ,					revision='onnx' )
         lowerCAmelCase__     :Optional[Any]											=				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__     :List[Any]											=				'A fantasy landscape, trending on artstation'

         lowerCAmelCase__     :List[Any]											=				np.random.RandomState(0 )
         lowerCAmelCase__     :List[Any]											=				pipe(
             prompt=__UpperCAmelCase       ,					image=__UpperCAmelCase       ,					strength=0.75       ,					guidance_scale=7.5       ,					num_inference_steps=2_0       ,					generator=__UpperCAmelCase       ,					output_type='np'       ,					)
         lowerCAmelCase__     :Optional[Any]											=				output.images
         lowerCAmelCase__     :int											=				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__     :List[Any]											=				np.array([0.80_43, 0.9_26, 0.95_81, 0.81_19, 0.89_54, 0.9_13, 0.72_09, 0.74_63, 0.74_31] )
         # TODO: lower the tolerance after finding the cause of onnxruntime reproducibility issues

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







from timeit import timeit

_lowerCAmelCase				:   Tuple						       =						{
    '''MALAYALAM''': True,
    '''String''': False,
    '''rotor''': True,
    '''level''': True,
    '''A''': True,
    '''BB''': True,
    '''ABC''': False,
    '''amanaplanacanalpanama''': True,  # "a man a plan a canal panama"
}
# Ensure our test data is valid
assert all((key == key[::-1]) is value for key, value in test_data.items())

def   __snake_case    (       _lowerCAmelCase			:			str						)			->    bool:
   A_       :					List[str]        =      0
   A_       :					str        =      len(_lowerCAmelCase						) - 1
   while start_i < end_i:
      if s[start_i] == s[end_i]:
         start_i += 1
         end_i -= 1
      else:
         return False
   return True

def   __snake_case    (       _lowerCAmelCase			:			str						)			->    bool:
   A_       :					int        =      len(_lowerCAmelCase						) // 2
   A_       :					Union[str, Any]        =      len(_lowerCAmelCase						)

   # We need to traverse till half of the length of string
   # as we can get access of the i'th last element from
   # i'th index.
   # eg: [0,1,2,3,4,5] => 4th index can be accessed
   # with the help of 1st index (i==n-i-1)
   # where n is length of string
   return all(s[i] == s[n - i - 1] for i in range(_lowerCAmelCase						)						)

def   __snake_case    (       _lowerCAmelCase			:			str						)			->    bool:
   if len(_lowerCAmelCase						) <= 2:
      return True
   if s[0] == s[len(_lowerCAmelCase						) - 1]:
      return is_palindrome_recursive(s[1:-1]						)
   else:
      return False

def   __snake_case    (       _lowerCAmelCase			:			str						)			->    bool:
   return s == s[::-1]

def   __snake_case    (       _lowerCAmelCase			:			str						)			->    None:
   A_       :					int        =      f"all({name}(key) is value for key, value in test_data.items())"
   A_       :					List[str]        =      f"from __main__ import test_data, {name}"
   A_       :					str        =      500000
   A_       :					List[str]        =      timeit(stmt=_lowerCAmelCase					,					setup=_lowerCAmelCase					,					number=_lowerCAmelCase						)
   print(f"{name:<35} finished {number:,} runs in {result:.5f} seconds"						)


if __name__ == "__main__":
 for key, value in test_data.items():
  assert is_palindrome(key) is is_palindrome_recursive(key)
  assert is_palindrome(key) is is_palindrome_slice(key)
  print(F'''{key:21} {value}''')
 print('''a man a plan a canal panama''')

 # finished 500,000 runs in 0.46793 seconds
 benchmark_function('''is_palindrome_slice''')
 # finished 500,000 runs in 0.85234 seconds
 benchmark_function('''is_palindrome''')
 # finished 500,000 runs in 1.32028 seconds
 benchmark_function('''is_palindrome_recursive''')
 # finished 500,000 runs in 2.08679 seconds
 benchmark_function('''is_palindrome_traversal''')
