





'''simple docstring'''




import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    StableDiffusionSAGPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu

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


enable_full_determinism()


class 			SCREAMING_SNAKE_CASE   (a__ ,		a__ ,		unittest.TestCase							):
     lowerCAmelCase		      =	StableDiffusionSAGPipeline
     lowerCAmelCase		      =	TEXT_TO_IMAGE_PARAMS
     lowerCAmelCase		      =	TEXT_TO_IMAGE_BATCH_PARAMS
     lowerCAmelCase		      =	TEXT_TO_IMAGE_IMAGE_PARAMS
     lowerCAmelCase		      =	TEXT_TO_IMAGE_IMAGE_PARAMS
     lowerCAmelCase		      =	False


     def 							SCREAMING_SNAKE_CASE  (						self):

          '''simple docstring'''






          torch.manual_seed(0)
          __A						:			Tuple								=	UNetaDConditionModel(
              block_out_channels=(32, 64)						,     layers_per_block=2						,     sample_size=32						,     in_channels=4						,     out_channels=4						,     down_block_types=('DownBlock2D', 'CrossAttnDownBlock2D')						,     up_block_types=('CrossAttnUpBlock2D', 'UpBlock2D')						,     cross_attention_dim=32						,     )
          __A						:			Dict								=	DDIMScheduler(
              beta_start=0.00085						,     beta_end=0.012						,     beta_schedule='scaled_linear'						,     clip_sample=_UpperCAmelCase						,     set_alpha_to_one=_UpperCAmelCase						,     )
          torch.manual_seed(0)
          __A						:			int								=	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						,     )
          torch.manual_seed(0)
          __A						:			Dict								=	CLIPTextConfig(
              bos_token_id=0						,     eos_token_id=2						,     hidden_size=32						,     intermediate_size=37						,     layer_norm_eps=1e-0_5						,     num_attention_heads=4						,     num_hidden_layers=5						,     pad_token_id=1						,     vocab_size=1000						,     )
          __A						:			Any								=	CLIPTextModel(_UpperCAmelCase)
          __A						:			str								=	CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip')

          __A						:			Tuple								=	{
              'unet': unet,
              'scheduler': scheduler,
              'vae': vae,
              'text_encoder': text_encoder,
              'tokenizer': tokenizer,
              'safety_checker': None,
              'feature_extractor': None,
          }
          return components


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase						,     _UpperCAmelCase=0):

          '''simple docstring'''






          if str(_UpperCAmelCase).startswith('mps'):
               __A						:			int								=	torch.manual_seed(_UpperCAmelCase)
          else:
               __A						:			List[Any]								=	torch.Generator(device=_UpperCAmelCase).manual_seed(_UpperCAmelCase)
          __A						:			str								=	{
              'prompt': '.',
              'generator': generator,
              'num_inference_steps': 2,
              'guidance_scale': 1.0,
              'sag_scale': 1.0,
              'output_type': 'numpy',
          }
          return inputs


     def 							SCREAMING_SNAKE_CASE  (						self):

          '''simple docstring'''






          super().test_inference_batch_single_identical(expected_max_diff=3e-3)




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


     def 							SCREAMING_SNAKE_CASE  (						self):

          '''simple docstring'''






          super().tearDown()
          gc.collect()
          torch.cuda.empty_cache()


     def 							SCREAMING_SNAKE_CASE  (						self):

          '''simple docstring'''






          __A						:			Optional[int]								=	StableDiffusionSAGPipeline.from_pretrained('CompVis/stable-diffusion-v1-4')
          __A						:			Dict								=	sag_pipe.to(_UpperCAmelCase)
          sag_pipe.set_progress_bar_config(disable=_UpperCAmelCase)

          __A						:			Union[str, Any]								=	'.'
          __A						:			Any								=	torch.manual_seed(0)
          __A						:			List[Any]								=	sag_pipe(
              [prompt]						,     generator=_UpperCAmelCase						,     guidance_scale=7.5						,     sag_scale=1.0						,     num_inference_steps=20						,     output_type='np')

          __A						:			List[str]								=	output.images

          __A						:			int								=	image[0, -3:, -3:, -1]

          assert image.shape == (1, 512, 512, 3)
          __A						:			str								=	np.array([0.1568, 0.1738, 0.1695, 0.1693, 0.1507, 0.1705, 0.1547, 0.1751, 0.1949])

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


     def 							SCREAMING_SNAKE_CASE  (						self):

          '''simple docstring'''






          __A						:			int								=	StableDiffusionSAGPipeline.from_pretrained('stabilityai/stable-diffusion-2-1-base')
          __A						:			int								=	sag_pipe.to(_UpperCAmelCase)
          sag_pipe.set_progress_bar_config(disable=_UpperCAmelCase)

          __A						:			Union[str, Any]								=	'.'
          __A						:			Optional[int]								=	torch.manual_seed(0)
          __A						:			Tuple								=	sag_pipe(
              [prompt]						,     generator=_UpperCAmelCase						,     guidance_scale=7.5						,     sag_scale=1.0						,     num_inference_steps=20						,     output_type='np')

          __A						:			Dict								=	output.images

          __A						:			Dict								=	image[0, -3:, -3:, -1]

          assert image.shape == (1, 512, 512, 3)
          __A						:			Optional[int]								=	np.array([0.3459, 0.2876, 0.2537, 0.3002, 0.2671, 0.2160, 0.3026, 0.2262, 0.2371])

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


     def 							SCREAMING_SNAKE_CASE  (						self):

          '''simple docstring'''






          __A						:			Optional[Any]								=	StableDiffusionSAGPipeline.from_pretrained('stabilityai/stable-diffusion-2-1-base')
          __A						:			List[str]								=	sag_pipe.to(_UpperCAmelCase)
          sag_pipe.set_progress_bar_config(disable=_UpperCAmelCase)

          __A						:			Any								=	'.'
          __A						:			List[str]								=	torch.manual_seed(0)
          __A						:			Optional[Any]								=	sag_pipe(
              [prompt]						,     width=768						,     height=512						,     generator=_UpperCAmelCase						,     guidance_scale=7.5						,     sag_scale=1.0						,     num_inference_steps=20						,     output_type='np'						,     )

          __A						:			List[Any]								=	output.images

          assert image.shape == (1, 512, 768, 3)






'''simple docstring'''




from collections.abc import Iterable
from typing import Any


class 			SCREAMING_SNAKE_CASE   :


     def __init__(						self						,     _UpperCAmelCase = None):

          '''simple docstring'''






          __A						:			str								=	value
          __A						:			Node | None								=	None  # Added in order to delete a node easier
          __A						:			Node | None								=	None
          __A						:			Node | None								=	None


     def __repr__(						self):

          '''simple docstring'''






          from pprint import pformat

          if self.left is None and self.right is None:
               return str(self.value)
          return pformat({F'{self.value}': (self.left, self.right)}						,     indent=1)




class 			SCREAMING_SNAKE_CASE   :


     def __init__(						self						,     _UpperCAmelCase = None):

          '''simple docstring'''






          __A						:			int								=	root


     def __str__(						self):

          '''simple docstring'''






          return str(self.root)


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase						,     _UpperCAmelCase):

          '''simple docstring'''






          if new_children is not None:  # reset its kids
               __A						:			Optional[int]								=	node.parent
          if node.parent is not None:  # reset its parent
               if self.is_right(_UpperCAmelCase):  # If it is the right children
                    __A						:			int								=	new_children
               else:
                    __A						:			Union[str, Any]								=	new_children
          else:
               __A						:			Tuple								=	new_children


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase):

          '''simple docstring'''






          if node.parent and node.parent.right:
               return node == node.parent.right
          return False


     def 							SCREAMING_SNAKE_CASE  (						self):

          '''simple docstring'''






          return self.root is None


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase):

          '''simple docstring'''






          __A						:			Dict								=	Node(_UpperCAmelCase)  # create a new Node
          if self.empty():  # if Tree is empty
               __A						:			Union[str, Any]								=	new_node  # set its root
          else:  # Tree is not empty
               __A						:			Dict								=	self.root  # from root
               if parent_node is None:
                    return
               while True:  # While we don't get to a leaf
                    if value < parent_node.value:  # We go left
                         if parent_node.left is None:
                              __A						:			Tuple								=	new_node  # We insert the new node in a leaf
                              break
                         else:
                              __A						:			str								=	parent_node.left
                    else:
                         if parent_node.right is None:
                              __A						:			List[str]								=	new_node
                              break
                         else:
                              __A						:			int								=	parent_node.right
               __A						:			int								=	parent_node


     def 							SCREAMING_SNAKE_CASE  (						self						,     *_UpperCAmelCase):

          '''simple docstring'''






          for value in values:
               self.__insert(_UpperCAmelCase)


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase):

          '''simple docstring'''






          if self.empty():
               raise IndexError('Warning: Tree is empty! please use another.')
          else:
               __A						:			Any								=	self.root
               # use lazy evaluation here to avoid NoneType Attribute error
               while node is not None and node.value is not value:
                    __A						:			List[Any]								=	node.left if value < node.value else node.right
               return node


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase = None):

          '''simple docstring'''






          if node is None:
               if self.root is None:
                    return None
               __A						:			str								=	self.root

          if not self.empty():
               while node.right is not None:
                    __A						:			Dict								=	node.right
          return node


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase = None):

          '''simple docstring'''






          if node is None:
               __A						:			Optional[Any]								=	self.root
          if self.root is None:
               return None
          if not self.empty():
               __A						:			Optional[int]								=	self.root
               while node.left is not None:
                    __A						:			Tuple								=	node.left
          return node


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase):

          '''simple docstring'''






          __A						:			Optional[Any]								=	self.search(_UpperCAmelCase)  # Look for the node with that label
          if node is not None:
               if node.left is None and node.right is None:  # If it has no children
                    self.__reassign_nodes(_UpperCAmelCase						,     _UpperCAmelCase)
               elif node.left is None:  # Has only right children
                    self.__reassign_nodes(_UpperCAmelCase						,     node.right)
               elif node.right is None:  # Has only left children
                    self.__reassign_nodes(_UpperCAmelCase						,     node.left)
               else:
                    __A						:			str								=	self.get_max(
                        node.left)  # Gets the max value of the left branch
                    self.remove(tmp_node.value)  # type: ignore
                    __A						:			List[Any]								=	(
                        tmp_node.value  # type: ignore
                    )  # Assigns the value to the node to delete and keep tree structure


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase):

          '''simple docstring'''






          if node is not None:
               yield node  # Preorder Traversal
               yield from self.preorder_traverse(node.left)
               yield from self.preorder_traverse(node.right)


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase=None):

          '''simple docstring'''






          if traversal_function is None:
               return self.preorder_traverse(self.root)
          else:
               return traversal_function(self.root)


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase						,     _UpperCAmelCase):

          '''simple docstring'''






          if node:
               self.inorder(_UpperCAmelCase						,     node.left)
               arr.append(node.value)
               self.inorder(_UpperCAmelCase						,     node.right)


     def 							SCREAMING_SNAKE_CASE  (						self						,     _UpperCAmelCase						,     _UpperCAmelCase):

          '''simple docstring'''






          __A						:			list[int]								=	[]
          self.inorder(_UpperCAmelCase						,     _UpperCAmelCase)  # append all values to list using inorder traversal
          return arr[k - 1]






def 	_lowerCAmelCase      (  __snake_case  :			Node | None      )					->					list[Node]:
     __A						:			Tuple								=	[]
     if curr_node is not None:
          __A						:			Optional[Any]								=	postorder(curr_node.left      ) + postorder(curr_node.right      ) + [curr_node]
     return node_list






def 	_lowerCAmelCase      (  )					->					None:
     __A						:			Optional[int]								=	(8, 3, 6, 1, 10, 14, 13, 4, 7)
     __A						:			str								=	BinarySearchTree()
     for i in testlist:
          t.insert(__snake_case      )

     # Prints all the elements of the list in order traversal
     print(__snake_case      )

     if t.search(6      ) is not None:
          print('The value 6 exists'      )
     else:
          print('The value 6 doesn\'t exist'      )

     if t.search(-1      ) is not None:
          print('The value -1 exists'      )
     else:
          print('The value -1 doesn\'t exist'      )

     if not t.empty():
          print('Max Value: '			,							t.get_max().value      )  # type: ignore
          print('Min Value: '			,							t.get_min().value      )  # type: ignore

     for i in testlist:
          t.remove(__snake_case      )
          print(__snake_case      )


if __name__ == "__main__":
  import doctest

  doctest.testmod(verbose=True)