



import torch

from diffusers import DiffusionPipeline

class 	lowerCamelCase_    ( _A						):






						'''simple docstring'''







						def __init__(	self      :			int	,	__lowerCamelCase      :			str	,	__lowerCamelCase      :			List[str] )      ->				Tuple:
									super().__init__()

									self.register_modules(unet=__lowerCamelCase	,	scheduler=__lowerCamelCase )







						def __call__(	self      :			int )      ->				List[Any]:
									A							:					Dict              =						torch.randn(
									    (1, self.unet.config.in_channels, self.unet.config.sample_size, self.unet.config.sample_size)	,	)
									A							:					Optional[Any]              =						1

									A							:					Tuple              =						self.unet(__lowerCamelCase	,	__lowerCamelCase ).sample
									A							:					Any              =						self.scheduler.step(__lowerCamelCase	,	__lowerCamelCase	,	__lowerCamelCase ).prev_sample

									A							:					List[str]              =						scheduler_output - scheduler_output + torch.ones_like(__lowerCamelCase )

									return result




import unittest
from typing import Tuple

import torch

from diffusers.utils import floats_tensor, randn_tensor, torch_all_close, torch_device
from diffusers.utils.testing_utils import require_torch

@require_torch
class 	lowerCamelCase_    :






						'''simple docstring'''







						@property
						def 			SCREAMING_SNAKE_CASE__		(	self      :			Optional[int] )      ->				str:
									return self.get_dummy_input()







						@property
						def 			SCREAMING_SNAKE_CASE__		(	self      :			int )      ->				Optional[Any]:
									if self.block_type == "down":
												return (4, 32, 16, 16)
									elif self.block_type == "mid":
												return (4, 32, 32, 32)
									elif self.block_type == "up":
												return (4, 32, 64, 64)

									raise ValueError(F"""'{self.block_type}' is not a supported block_type. Set it to 'up', 'mid', or 'down'.""" )







						def 			SCREAMING_SNAKE_CASE__		(	self      :			Dict	,	__lowerCamelCase      :			Union[str, Any]=True	,	__lowerCamelCase      :			int=False	,	__lowerCamelCase      :			int=False	,	__lowerCamelCase      :			Optional[int]=False	,	)      ->				Dict:
									A							:					Optional[Any]              =						4
									A							:					List[str]              =						32
									A							:					Any              =						(32, 32)

									A							:					str              =						torch.manual_seed(0 )
									A							:					int              =						torch.device(__lowerCamelCase )
									A							:					List[str]              =						(batch_size, num_channels) + sizes
									A							:					Dict              =						randn_tensor(__lowerCamelCase	,	generator=__lowerCamelCase	,	device=__lowerCamelCase )
									A							:					int              =						{"hidden_states": hidden_states}

									if include_temb:
												A							:					Any              =						1_28
												A							:					List[str]              =						randn_tensor((batch_size, temb_channels)	,	generator=__lowerCamelCase	,	device=__lowerCamelCase )

									if include_res_hidden_states_tuple:
												A							:					str              =						torch.manual_seed(1 )
												A							:					Tuple              =						(randn_tensor(__lowerCamelCase	,	generator=__lowerCamelCase	,	device=__lowerCamelCase ),)

									if include_encoder_hidden_states:
												A							:					Dict              =						floats_tensor((batch_size, 32, 32) ).to(__lowerCamelCase )

									if include_skip_sample:
												A							:					Optional[int]              =						randn_tensor(((batch_size, 3) + sizes)	,	generator=__lowerCamelCase	,	device=__lowerCamelCase )

									return dummy_input







						def 			SCREAMING_SNAKE_CASE__		(	self      :			List[Any] )      ->				Union[str, Any]:
									A							:					Dict              =						{
									    "in_channels": 32,
									    "out_channels": 32,
									    "temb_channels": 1_28,
									}
									if self.block_type == "up":
												A							:					Dict              =						32

									if self.block_type == "mid":
												init_dict.pop("out_channels" )

									A							:					str              =						self.dummy_input
									return init_dict, inputs_dict







						def 			SCREAMING_SNAKE_CASE__		(	self      :			str	,	__lowerCamelCase      :			Optional[int] )      ->				Union[str, Any]:
									A       , A							:					str              =						self.prepare_init_args_and_inputs_for_common()
									A							:					List[Any]              =						self.block_class(**__lowerCamelCase )
									unet_block.to(__lowerCamelCase )
									unet_block.eval()

									with torch.no_grad():
												A							:					int              =						unet_block(**__lowerCamelCase )

									if isinstance(__lowerCamelCase	,	__lowerCamelCase ):
												A							:					Union[str, Any]              =						output[0]

									self.assertEqual(output.shape	,	self.output_shape )

									A							:					Any              =						output[0, -1, -3:, -3:]
									A							:					Union[str, Any]              =						torch.tensor(__lowerCamelCase ).to(__lowerCamelCase )
									assert torch_all_close(output_slice.flatten()	,	__lowerCamelCase	,	atol=5e-3 )







						@unittest.skipIf(torch_device == "mps"	,	"Training is not supported in mps" )
						def 			SCREAMING_SNAKE_CASE__		(	self      :			Any )      ->				Dict:
									A       , A							:					Tuple              =						self.prepare_init_args_and_inputs_for_common()
									A							:					str              =						self.block_class(**__lowerCamelCase )
									model.to(__lowerCamelCase )
									model.train()
									A							:					Optional[int]              =						model(**__lowerCamelCase )

									if isinstance(__lowerCamelCase	,	__lowerCamelCase ):
												A							:					Optional[Any]              =						output[0]

									A							:					List[str]              =						torch.device(__lowerCamelCase )
									A							:					List[str]              =						randn_tensor(output.shape	,	device=__lowerCamelCase )
									A							:					Dict              =						torch.nn.functional.mse_loss(__lowerCamelCase	,	__lowerCamelCase )
									loss.backward()