


"""simple docstring"""






import gc
import unittest

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

from diffusers import (
    AutoencoderKL,
    DDIMScheduler,
    EulerAncestralDiscreteScheduler,
    PNDMScheduler,
    StableDiffusionModelEditingPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu, skip_mps

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


enable_full_determinism()


@skip_mps
class      __lowerCamelCase	(       a__	,       a__	,       a__	,       unittest.TestCase					):

     '''simple docstring'''
     A_							:						Dict     =		StableDiffusionModelEditingPipeline
     A_							:						Optional[Any]     =		TEXT_TO_IMAGE_PARAMS
     A_							:						Dict     =		TEXT_TO_IMAGE_BATCH_PARAMS
     A_							:						int     =		TEXT_TO_IMAGE_IMAGE_PARAMS
     A_							:						Dict     =		TEXT_TO_IMAGE_IMAGE_PARAMS


     def 				_UpperCAmelCase   (   self				)							->				Optional[Any]:
          torch.manual_seed(0				)
          _a     						=					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     						=					DDIMScheduler()
          torch.manual_seed(0				)
          _a     						=					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     						=					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     						=					CLIPTextModel(__UpperCAmelCase				)
          _a     						=					CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''				)

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


     def 				_UpperCAmelCase   (   self     ,					__UpperCAmelCase     ,					__UpperCAmelCase=0				)							->				str:
          _a     						=					torch.manual_seed(__UpperCAmelCase				)
          _a     						=					{
              '''prompt''': '''A field of roses''',
              '''generator''': generator,
              # Setting height and width to None to prevent OOMs on CPU.
              '''height''': None,
              '''width''': None,
              '''num_inference_steps''': 2,
              '''guidance_scale''': 6.0,
              '''output_type''': '''numpy''',
          }
          return inputs


     def 				_UpperCAmelCase   (   self				)							->				Optional[int]:
          _a     						=					'''cpu'''  # ensure determinism for the device-dependent torch.Generator
          _a     						=					self.get_dummy_components()
          _a     						=					StableDiffusionModelEditingPipeline(**__UpperCAmelCase				)
          _a     						=					sd_pipe.to(__UpperCAmelCase				)
          sd_pipe.set_progress_bar_config(disable=__UpperCAmelCase				)

          _a     						=					self.get_dummy_inputs(__UpperCAmelCase				)
          _a     						=					sd_pipe(**__UpperCAmelCase				).images
          _a     						=					image[0, -3:, -3:, -1]
          assert image.shape == (1, 64, 64, 3)

          _a     						=					np.array([0.4755, 0.5132, 0.4976, 0.3904, 0.3554, 0.4765, 0.5139, 0.5158, 0.4889]				)

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


     def 				_UpperCAmelCase   (   self				)							->				Any:
          _a     						=					'''cpu'''  # ensure determinism for the device-dependent torch.Generator
          _a     						=					self.get_dummy_components()
          _a     						=					StableDiffusionModelEditingPipeline(**__UpperCAmelCase				)
          _a     						=					sd_pipe.to(__UpperCAmelCase				)
          sd_pipe.set_progress_bar_config(disable=__UpperCAmelCase				)

          _a     						=					self.get_dummy_inputs(__UpperCAmelCase				)
          _a     						=					'''french fries'''
          _a     						=					sd_pipe(**__UpperCAmelCase     ,					negative_prompt=__UpperCAmelCase				)
          _a     						=					output.images
          _a     						=					image[0, -3:, -3:, -1]

          assert image.shape == (1, 64, 64, 3)

          _a     						=					np.array([0.4992, 0.5101, 0.5004, 0.3949, 0.3604, 0.4735, 0.5216, 0.5204, 0.4913]				)

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


     def 				_UpperCAmelCase   (   self				)							->				List[Any]:
          _a     						=					'''cpu'''  # ensure determinism for the device-dependent torch.Generator
          _a     						=					self.get_dummy_components()
          _a     						=					EulerAncestralDiscreteScheduler(
              beta_start=0.00085     ,					beta_end=0.012     ,					beta_schedule='''scaled_linear'''				)
          _a     						=					StableDiffusionModelEditingPipeline(**__UpperCAmelCase				)
          _a     						=					sd_pipe.to(__UpperCAmelCase				)
          sd_pipe.set_progress_bar_config(disable=__UpperCAmelCase				)

          _a     						=					self.get_dummy_inputs(__UpperCAmelCase				)
          _a     						=					sd_pipe(**__UpperCAmelCase				).images
          _a     						=					image[0, -3:, -3:, -1]

          assert image.shape == (1, 64, 64, 3)

          _a     						=					np.array([0.4747, 0.5372, 0.4779, 0.4982, 0.5543, 0.4816, 0.5238, 0.4904, 0.5027]				)

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


     def 				_UpperCAmelCase   (   self				)							->				str:
          _a     						=					'''cpu'''  # ensure determinism for the device-dependent torch.Generator
          _a     						=					self.get_dummy_components()
          _a     						=					PNDMScheduler()
          _a     						=					StableDiffusionModelEditingPipeline(**__UpperCAmelCase				)
          _a     						=					sd_pipe.to(__UpperCAmelCase				)
          sd_pipe.set_progress_bar_config(disable=__UpperCAmelCase				)

          _a     						=					self.get_dummy_inputs(__UpperCAmelCase				)
          # the pipeline does not expect pndm so test if it raises error.
          with self.assertRaises(__UpperCAmelCase				):
               _a     						=					sd_pipe(**__UpperCAmelCase				).images


     def 				_UpperCAmelCase   (   self				)							->				Tuple:
          super().test_inference_batch_single_identical(expected_max_diff=5e-3				)





     def 				_UpperCAmelCase   (   self				)							->				Optional[Any]:
          super().test_attention_slicing_forward_pass(expected_max_diff=5e-3				)







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

     '''simple docstring'''


     def 				_UpperCAmelCase   (   self				)							->				Union[str, Any]:
          super().tearDown()
          gc.collect()
          torch.cuda.empty_cache()


     def 				_UpperCAmelCase   (   self     ,					__UpperCAmelCase=0				)							->				Any:
          _a     						=					torch.manual_seed(__UpperCAmelCase				)
          _a     						=					{
              '''prompt''': '''A field of roses''',
              '''generator''': generator,
              '''num_inference_steps''': 3,
              '''guidance_scale''': 7.5,
              '''output_type''': '''numpy''',
          }
          return inputs


     def 				_UpperCAmelCase   (   self				)							->				int:
          _a     						=					'''CompVis/stable-diffusion-v1-4'''
          _a     						=					StableDiffusionModelEditingPipeline.from_pretrained(__UpperCAmelCase     ,					safety_checker=__UpperCAmelCase				)
          pipe.to(__UpperCAmelCase				)
          pipe.set_progress_bar_config(disable=__UpperCAmelCase				)
          pipe.enable_attention_slicing()

          _a     						=					self.get_inputs()
          _a     						=					pipe(**__UpperCAmelCase				).images
          _a     						=					image[0, -3:, -3:, -1].flatten()

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

          _a     						=					np.array(
              [0.6749496, 0.6386453, 0.51443267, 0.66094905, 0.61921215, 0.5491332, 0.5744417, 0.58075106, 0.5174658]				)

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

          # make sure image changes after editing
          pipe.edit_model('''A pack of roses'''     ,					'''A pack of blue roses'''				)

          _a     						=					pipe(**__UpperCAmelCase				).images
          _a     						=					image[0, -3:, -3:, -1].flatten()

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

          assert np.abs(expected_slice - image_slice				).max() > 1e-1





     def 				_UpperCAmelCase   (   self				)							->				List[Any]:
          torch.cuda.empty_cache()
          torch.cuda.reset_max_memory_allocated()
          torch.cuda.reset_peak_memory_stats()

          _a     						=					'''CompVis/stable-diffusion-v1-4'''
          _a     						=					DDIMScheduler.from_pretrained(__UpperCAmelCase     ,					subfolder='''scheduler'''				)
          _a     						=					StableDiffusionModelEditingPipeline.from_pretrained(
              __UpperCAmelCase     ,					scheduler=__UpperCAmelCase     ,					safety_checker=__UpperCAmelCase				)
          _a     						=					pipe.to(__UpperCAmelCase				)
          pipe.set_progress_bar_config(disable=__UpperCAmelCase				)
          pipe.enable_attention_slicing(1				)
          pipe.enable_sequential_cpu_offload()

          _a     						=					self.get_inputs()
          _a     						=					pipe(**__UpperCAmelCase				)

          _a     						=					torch.cuda.max_memory_allocated()
          # make sure that less than 4.4 GB is allocated
          assert mem_bytes < 4.4 * 10**9



"""simple docstring"""






def    A_ ( _lowerCAmelCase  :       list[list[int]]							):






     """simple docstring"""

     _a     						=					[list(_lowerCAmelCase							) for row in matrix]
     if matrix and isinstance(_lowerCAmelCase,  _lowerCAmelCase							):
          if isinstance(matrix[0],  _lowerCAmelCase							):
               _a     						=					0
               for row in matrix:
                    if prev_len == 0:
                         _a     						=					len(_lowerCAmelCase							)
                         _a     						=					True
                    else:
                         _a     						=					prev_len == len(_lowerCAmelCase							)
          else:
               _a     						=					True
     else:
          _a     						=					False

     return result
def    A_ ( _lowerCAmelCase  :       list[list[int]]							):






     """simple docstring"""

     if check_matrix(_lowerCAmelCase							) and len(_lowerCAmelCase							) > 0:
          _a     						=					[list(_lowerCAmelCase							) for row in a]
          _a     						=					len(_lowerCAmelCase							)
          if isinstance(a[0],  _lowerCAmelCase							):
               _a     						=					len(a[0]							)
          else:
               for dat in a:
                    print(_lowerCAmelCase							)
               return

          # horizotal printing increasing
          for i in range(0,  _lowerCAmelCase							):
               print(a[0][i]							)
          # vertical printing down
          for i in range(1,  _lowerCAmelCase							):
               print(a[i][mat_col - 1]							)
          # horizotal printing decreasing
          if mat_row > 1:
               for i in range(mat_col - 2,  -1,  -1							):
                    print(a[mat_row - 1][i]							)
        # vertical printing up
          for i in range(mat_row - 2,  0,  -1							):
               print(a[i][0]							)
          _a     						=					[row[1 : mat_col - 1] for row in a[1 : mat_row - 1]]
          if len(_lowerCAmelCase							) > 0:
               spiral_print_clockwise(_lowerCAmelCase							)
          else:
               return
     else:
          print('''Not a valid matrix'''							)
          return
def    A_ ( _lowerCAmelCase  :       list[list]							):






     """simple docstring"""

     if matrix:
          return list(matrix.pop(0							)							) + spiral_traversal(list(zip(*_lowerCAmelCase							)							)[::-1]							)
     else:
          return []


# driver code
if __name__ == "__main__":
   import doctest

   doctest.testmod()

   __snake_case												=							[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
   spiral_print_clockwise(a)