





"""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 	lowerCAmelCase					(      snake_case			,	snake_case			,	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 							__A (   self     ):
              torch.manual_seed(0     )
              _UpperCAmelCase     =     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    ,  )
              _UpperCAmelCase     =     DDIMScheduler(
                  beta_start=0.00_085    ,  beta_end=0.012    ,  beta_schedule='scaled_linear'    ,  clip_sample=a__    ,  set_alpha_to_one=a__    ,  )
              torch.manual_seed(0     )
              _UpperCAmelCase     =     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     )
              _UpperCAmelCase     =     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=10_00    ,  )
              _UpperCAmelCase     =     CLIPTextModel(a__     )
              _UpperCAmelCase     =     CLIPTokenizer.from_pretrained('hf-internal-testing/tiny-random-clip'     )

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






       def 							__A (   self    ,  a__    ,  a__=0     ):
              if str(a__     ).startswith('mps'     ):
                     _UpperCAmelCase     =     torch.manual_seed(a__     )
              else:
                     _UpperCAmelCase     =     torch.Generator(device=a__     ).manual_seed(a__     )
              _UpperCAmelCase     =     {
                  'prompt': '.',
                  'generator': generator,
                  'num_inference_steps': 2,
                  'guidance_scale': 1.0,
                  'sag_scale': 1.0,
                  'output_type': 'numpy',
              }
              return inputs






       def 							__A (   self     ):
              super().test_inference_batch_single_identical(expected_max_diff=3E-3     )



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






       def 							__A (   self     ):
              # clean up the VRAM after each test
              super().tearDown()
              gc.collect()
              torch.cuda.empty_cache()






       def 							__A (   self     ):
              _UpperCAmelCase     =     StableDiffusionSAGPipeline.from_pretrained('CompVis/stable-diffusion-v1-4'     )
              _UpperCAmelCase     =     sag_pipe.to(a__     )
              sag_pipe.set_progress_bar_config(disable=a__     )

              _UpperCAmelCase     =     '.'
              _UpperCAmelCase     =     torch.manual_seed(0     )
              _UpperCAmelCase     =     sag_pipe(
                  [prompt]    ,  generator=a__    ,  guidance_scale=7.5    ,  sag_scale=1.0    ,  num_inference_steps=20    ,  output_type='np'     )

              _UpperCAmelCase     =     output.images

              _UpperCAmelCase     =     image[0, -3:, -3:, -1]

              assert image.shape == (1, 5_12, 5_12, 3)
              _UpperCAmelCase     =     np.array([0.1_568, 0.1_738, 0.1_695, 0.1_693, 0.1_507, 0.1_705, 0.1_547, 0.1_751, 0.1_949]     )

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






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

              _UpperCAmelCase     =     '.'
              _UpperCAmelCase     =     torch.manual_seed(0     )
              _UpperCAmelCase     =     sag_pipe(
                  [prompt]    ,  generator=a__    ,  guidance_scale=7.5    ,  sag_scale=1.0    ,  num_inference_steps=20    ,  output_type='np'     )

              _UpperCAmelCase     =     output.images

              _UpperCAmelCase     =     image[0, -3:, -3:, -1]

              assert image.shape == (1, 5_12, 5_12, 3)
              _UpperCAmelCase     =     np.array([0.3_459, 0.2_876, 0.2_537, 0.3_002, 0.2_671, 0.2_160, 0.3_026, 0.2_262, 0.2_371]     )

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






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

              _UpperCAmelCase     =     '.'
              _UpperCAmelCase     =     torch.manual_seed(0     )
              _UpperCAmelCase     =     sag_pipe(
                  [prompt]    ,  width=7_68    ,  height=5_12    ,  generator=a__    ,  guidance_scale=7.5    ,  sag_scale=1.0    ,  num_inference_steps=20    ,  output_type='np'    ,  )

              _UpperCAmelCase     =     output.images

              assert image.shape == (1, 5_12, 7_68, 3)













"""simple docstring"""






from collections import deque
from math import floor
from random import random
from time import time



class 	lowerCAmelCase					:






       def __init__(   self     ):
              _UpperCAmelCase     =     {}






       def 							__A (   self    ,  a__    ,  a__    ,  a__=1     ):
              if self.graph.get(a__     ):
                     if self.graph[u].count([w, v]     ) == 0:
                            self.graph[u].append([w, v]     )
              else:
                     _UpperCAmelCase     =     [[w, v]]
              if not self.graph.get(a__     ):
                     _UpperCAmelCase     =     []






       def 							__A (   self     ):
              return list(self.graph     )






       def 							__A (   self    ,  a__    ,  a__     ):
              if self.graph.get(a__     ):
                     for _ in self.graph[u]:
                            if _[1] == v:
                                   self.graph[u].remove(a__     )






       def 							__A (   self    ,  a__=-2    ,  a__=-1     ):
              if s == d:
                     return []
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     []
              if s == -2:
                     _UpperCAmelCase     =     list(self.graph     )[0]
              stack.append(a__     )
              visited.append(a__     )
              _UpperCAmelCase     =     s

              while True:
                     # check if there is any non isolated nodes
                     if len(self.graph[s]     ) != 0:
                            _UpperCAmelCase     =     s
                            for node in self.graph[s]:
                                   if visited.count(node[1]     ) < 1:
                                          if node[1] == d:
                                                 visited.append(a__     )
                                                 return visited
                                          else:
                                                 stack.append(node[1]     )
                                                 visited.append(node[1]     )
                                                 _UpperCAmelCase     =     node[1]
                                                 break

            # check if all the children are visited
                     if s == ss:
                            stack.pop()
                            if len(a__     ) != 0:
                                   _UpperCAmelCase     =     stack[len(a__     ) - 1]
                     else:
                            _UpperCAmelCase     =     ss

                     # check if se have reached the starting point
                     if len(a__     ) == 0:
                            return visited






       def 							__A (   self    ,  a__=-1     ):
              if c == -1:
                     _UpperCAmelCase     =     floor(random() * 1_00_00     ) + 10
              for i in range(a__     ):
                     # every vertex has max 100 edges
                     for _ in range(floor(random() * 1_02     ) + 1     ):
                            _UpperCAmelCase     =     floor(random() * c     ) + 1
                            if n != i:
                                   self.add_pair(a__    ,  a__    ,  1     )






       def 							__A (   self    ,  a__=-2     ):
              _UpperCAmelCase     =     deque()
              _UpperCAmelCase     =     []
              if s == -2:
                     _UpperCAmelCase     =     list(self.graph     )[0]
              d.append(a__     )
              visited.append(a__     )
              while d:
                     _UpperCAmelCase     =     d.popleft()
                     if len(self.graph[s]     ) != 0:
                            for node in self.graph[s]:
                                   if visited.count(node[1]     ) < 1:
                                          d.append(node[1]     )
                                          visited.append(node[1]     )
              return visited






       def 							__A (   self    ,  a__     ):
              _UpperCAmelCase     =     0
              for x in self.graph:
                     for y in self.graph[x]:
                            if y[1] == u:
                                   count += 1
              return count






       def 							__A (   self    ,  a__     ):
              return len(self.graph[u]     )






       def 							__A (   self    ,  a__=-2     ):
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     []
              if s == -2:
                     _UpperCAmelCase     =     list(self.graph     )[0]
              stack.append(a__     )
              visited.append(a__     )
              _UpperCAmelCase     =     s
              _UpperCAmelCase     =     []

              while True:
                     # check if there is any non isolated nodes
                     if len(self.graph[s]     ) != 0:
                            _UpperCAmelCase     =     s
                            for node in self.graph[s]:
                                   if visited.count(node[1]     ) < 1:
                                          stack.append(node[1]     )
                                          visited.append(node[1]     )
                                          _UpperCAmelCase     =     node[1]
                                          break

            # check if all the children are visited
                     if s == ss:
                            sorted_nodes.append(stack.pop()     )
                            if len(a__     ) != 0:
                                   _UpperCAmelCase     =     stack[len(a__     ) - 1]
                     else:
                            _UpperCAmelCase     =     ss

                     # check if se have reached the starting point
                     if len(a__     ) == 0:
                            return sorted_nodes






       def 							__A (   self     ):
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     list(self.graph     )[0]
              stack.append(a__     )
              visited.append(a__     )
              _UpperCAmelCase     =     -2
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     s
              _UpperCAmelCase     =     False
              _UpperCAmelCase     =     set()

              while True:
                     # check if there is any non isolated nodes
                     if len(self.graph[s]     ) != 0:
                            _UpperCAmelCase     =     s
                            for node in self.graph[s]:
                                   if (
                                       visited.count(node[1]     ) > 0
                                       and node[1] != parent
                                       and indirect_parents.count(node[1]     ) > 0
                                       and not on_the_way_back
                                   ):
                                          _UpperCAmelCase     =     len(a__     ) - 1
                                          while len_stack >= 0:
                                                 if stack[len_stack] == node[1]:
                                                        anticipating_nodes.add(node[1]     )
                                                        break
                                                 else:
                                                        anticipating_nodes.add(stack[len_stack]     )
                                                        len_stack -= 1
                                   if visited.count(node[1]     ) < 1:
                                          stack.append(node[1]     )
                                          visited.append(node[1]     )
                                          _UpperCAmelCase     =     node[1]
                                          break

            # check if all the children are visited
                     if s == ss:
                            stack.pop()
                            _UpperCAmelCase     =     True
                            if len(a__     ) != 0:
                                   _UpperCAmelCase     =     stack[len(a__     ) - 1]
                     else:
                            _UpperCAmelCase     =     False
                            indirect_parents.append(a__     )
                            _UpperCAmelCase     =     s
                            _UpperCAmelCase     =     ss

                     # check if se have reached the starting point
                     if len(a__     ) == 0:
                            return list(a__     )






       def 							__A (   self     ):
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     list(self.graph     )[0]
              stack.append(a__     )
              visited.append(a__     )
              _UpperCAmelCase     =     -2
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     s
              _UpperCAmelCase     =     False
              _UpperCAmelCase     =     set()

              while True:
                     # check if there is any non isolated nodes
                     if len(self.graph[s]     ) != 0:
                            _UpperCAmelCase     =     s
                            for node in self.graph[s]:
                                   if (
                                       visited.count(node[1]     ) > 0
                                       and node[1] != parent
                                       and indirect_parents.count(node[1]     ) > 0
                                       and not on_the_way_back
                                   ):
                                          _UpperCAmelCase     =     len(a__     ) - 1
                                          while len_stack_minus_one >= 0:
                                                 if stack[len_stack_minus_one] == node[1]:
                                                        anticipating_nodes.add(node[1]     )
                                                        break
                                                 else:
                                                        return True
                                   if visited.count(node[1]     ) < 1:
                                          stack.append(node[1]     )
                                          visited.append(node[1]     )
                                          _UpperCAmelCase     =     node[1]
                                          break

            # check if all the children are visited
                     if s == ss:
                            stack.pop()
                            _UpperCAmelCase     =     True
                            if len(a__     ) != 0:
                                   _UpperCAmelCase     =     stack[len(a__     ) - 1]
                     else:
                            _UpperCAmelCase     =     False
                            indirect_parents.append(a__     )
                            _UpperCAmelCase     =     s
                            _UpperCAmelCase     =     ss

                     # check if se have reached the starting point
                     if len(a__     ) == 0:
                            return False






       def 							__A (   self    ,  a__=-2    ,  a__=-1     ):
              _UpperCAmelCase     =     time()
              self.dfs(a__    ,  a__     )
              _UpperCAmelCase     =     time()
              return end - begin






       def 							__A (   self    ,  a__=-2     ):
              _UpperCAmelCase     =     time()
              self.bfs(a__     )
              _UpperCAmelCase     =     time()
              return end - begin



class 	lowerCAmelCase					:






       def __init__(   self     ):
              _UpperCAmelCase     =     {}






       def 							__A (   self    ,  a__    ,  a__    ,  a__=1     ):
              # check if the u exists
              if self.graph.get(a__     ):
                     # if there already is a edge
                     if self.graph[u].count([w, v]     ) == 0:
                            self.graph[u].append([w, v]     )
              else:
                     # if u does not exist
                     _UpperCAmelCase     =     [[w, v]]
              # add the other way
              if self.graph.get(a__     ):
                     # if there already is a edge
                     if self.graph[v].count([w, u]     ) == 0:
                            self.graph[v].append([w, u]     )
              else:
                     # if u does not exist
                     _UpperCAmelCase     =     [[w, u]]






       def 							__A (   self    ,  a__    ,  a__     ):
              if self.graph.get(a__     ):
                     for _ in self.graph[u]:
                            if _[1] == v:
                                   self.graph[u].remove(a__     )
        # the other way round
              if self.graph.get(a__     ):
                     for _ in self.graph[v]:
                            if _[1] == u:
                                   self.graph[v].remove(a__     )






       def 							__A (   self    ,  a__=-2    ,  a__=-1     ):
              if s == d:
                     return []
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     []
              if s == -2:
                     _UpperCAmelCase     =     list(self.graph     )[0]
              stack.append(a__     )
              visited.append(a__     )
              _UpperCAmelCase     =     s

              while True:
                     # check if there is any non isolated nodes
                     if len(self.graph[s]     ) != 0:
                            _UpperCAmelCase     =     s
                            for node in self.graph[s]:
                                   if visited.count(node[1]     ) < 1:
                                          if node[1] == d:
                                                 visited.append(a__     )
                                                 return visited
                                          else:
                                                 stack.append(node[1]     )
                                                 visited.append(node[1]     )
                                                 _UpperCAmelCase     =     node[1]
                                                 break

            # check if all the children are visited
                     if s == ss:
                            stack.pop()
                            if len(a__     ) != 0:
                                   _UpperCAmelCase     =     stack[len(a__     ) - 1]
                     else:
                            _UpperCAmelCase     =     ss

                     # check if se have reached the starting point
                     if len(a__     ) == 0:
                            return visited






       def 							__A (   self    ,  a__=-1     ):
              if c == -1:
                     _UpperCAmelCase     =     floor(random() * 1_00_00     ) + 10
              for i in range(a__     ):
                     # every vertex has max 100 edges
                     for _ in range(floor(random() * 1_02     ) + 1     ):
                            _UpperCAmelCase     =     floor(random() * c     ) + 1
                            if n != i:
                                   self.add_pair(a__    ,  a__    ,  1     )






       def 							__A (   self    ,  a__=-2     ):
              _UpperCAmelCase     =     deque()
              _UpperCAmelCase     =     []
              if s == -2:
                     _UpperCAmelCase     =     list(self.graph     )[0]
              d.append(a__     )
              visited.append(a__     )
              while d:
                     _UpperCAmelCase     =     d.popleft()
                     if len(self.graph[s]     ) != 0:
                            for node in self.graph[s]:
                                   if visited.count(node[1]     ) < 1:
                                          d.append(node[1]     )
                                          visited.append(node[1]     )
              return visited






       def 							__A (   self    ,  a__     ):
              return len(self.graph[u]     )






       def 							__A (   self     ):
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     list(self.graph     )[0]
              stack.append(a__     )
              visited.append(a__     )
              _UpperCAmelCase     =     -2
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     s
              _UpperCAmelCase     =     False
              _UpperCAmelCase     =     set()

              while True:
                     # check if there is any non isolated nodes
                     if len(self.graph[s]     ) != 0:
                            _UpperCAmelCase     =     s
                            for node in self.graph[s]:
                                   if (
                                       visited.count(node[1]     ) > 0
                                       and node[1] != parent
                                       and indirect_parents.count(node[1]     ) > 0
                                       and not on_the_way_back
                                   ):
                                          _UpperCAmelCase     =     len(a__     ) - 1
                                          while len_stack >= 0:
                                                 if stack[len_stack] == node[1]:
                                                        anticipating_nodes.add(node[1]     )
                                                        break
                                                 else:
                                                        anticipating_nodes.add(stack[len_stack]     )
                                                        len_stack -= 1
                                   if visited.count(node[1]     ) < 1:
                                          stack.append(node[1]     )
                                          visited.append(node[1]     )
                                          _UpperCAmelCase     =     node[1]
                                          break

            # check if all the children are visited
                     if s == ss:
                            stack.pop()
                            _UpperCAmelCase     =     True
                            if len(a__     ) != 0:
                                   _UpperCAmelCase     =     stack[len(a__     ) - 1]
                     else:
                            _UpperCAmelCase     =     False
                            indirect_parents.append(a__     )
                            _UpperCAmelCase     =     s
                            _UpperCAmelCase     =     ss

                     # check if se have reached the starting point
                     if len(a__     ) == 0:
                            return list(a__     )






       def 							__A (   self     ):
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     list(self.graph     )[0]
              stack.append(a__     )
              visited.append(a__     )
              _UpperCAmelCase     =     -2
              _UpperCAmelCase     =     []
              _UpperCAmelCase     =     s
              _UpperCAmelCase     =     False
              _UpperCAmelCase     =     set()

              while True:
                     # check if there is any non isolated nodes
                     if len(self.graph[s]     ) != 0:
                            _UpperCAmelCase     =     s
                            for node in self.graph[s]:
                                   if (
                                       visited.count(node[1]     ) > 0
                                       and node[1] != parent
                                       and indirect_parents.count(node[1]     ) > 0
                                       and not on_the_way_back
                                   ):
                                          _UpperCAmelCase     =     len(a__     ) - 1
                                          while len_stack_minus_one >= 0:
                                                 if stack[len_stack_minus_one] == node[1]:
                                                        anticipating_nodes.add(node[1]     )
                                                        break
                                                 else:
                                                        return True
                                   if visited.count(node[1]     ) < 1:
                                          stack.append(node[1]     )
                                          visited.append(node[1]     )
                                          _UpperCAmelCase     =     node[1]
                                          break

            # check if all the children are visited
                     if s == ss:
                            stack.pop()
                            _UpperCAmelCase     =     True
                            if len(a__     ) != 0:
                                   _UpperCAmelCase     =     stack[len(a__     ) - 1]
                     else:
                            _UpperCAmelCase     =     False
                            indirect_parents.append(a__     )
                            _UpperCAmelCase     =     s
                            _UpperCAmelCase     =     ss

                     # check if se have reached the starting point
                     if len(a__     ) == 0:
                            return False






       def 							__A (   self     ):
              return list(self.graph     )






       def 							__A (   self    ,  a__=-2    ,  a__=-1     ):
              _UpperCAmelCase     =     time()
              self.dfs(a__    ,  a__     )
              _UpperCAmelCase     =     time()
              return end - begin






       def 							__A (   self    ,  a__=-2     ):
              _UpperCAmelCase     =     time()
              self.bfs(a__     )
              _UpperCAmelCase     =     time()
              return end - begin






