'''simple docstring'''




import unittest

import numpy as np
import torch

from diffusers import PNDMPipeline, PNDMScheduler, UNetaDModel
from diffusers.utils.testing_utils import enable_full_determinism, require_torch, slow, torch_device


enable_full_determinism()






class 							a__(   unittest.TestCase      ):


			'''simple docstring'''






			@property
			def 				a_			(  self):




					"""simple docstring"""


					torch.manual_seed(0)
					lowerCAmelCase     =    UNetaDModel(
					    block_out_channels=(32, 64)			,       layers_per_block=2			,       sample_size=32			,       in_channels=3			,       out_channels=3			,       down_block_types=("""DownBlock2D""", """AttnDownBlock2D""")			,       up_block_types=("""AttnUpBlock2D""", """UpBlock2D""")			,       )
					return model







			def 				a_			(  self):




					"""simple docstring"""


					lowerCAmelCase     =    self.dummy_uncond_unet
					lowerCAmelCase     =    PNDMScheduler()

					lowerCAmelCase     =    PNDMPipeline(unet=__lowerCAmelCase			,       scheduler=__lowerCAmelCase)
					pndm.to(__lowerCAmelCase)
					pndm.set_progress_bar_config(disable=__lowerCAmelCase)

					lowerCAmelCase     =    torch.manual_seed(0)
					lowerCAmelCase     =    pndm(generator=__lowerCAmelCase			,       num_inference_steps=20			,       output_type="""numpy""").images

					lowerCAmelCase     =    torch.manual_seed(0)
					lowerCAmelCase     =    pndm(generator=__lowerCAmelCase			,       num_inference_steps=20			,       output_type="""numpy"""			,       return_dict=__lowerCAmelCase)[0]

					lowerCAmelCase     =    image[0, -3:, -3:, -1]
					lowerCAmelCase     =    image_from_tuple[0, -3:, -3:, -1]

					assert image.shape == (1, 32, 32, 3)
					lowerCAmelCase     =    np.array([1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0])

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







@slow
@require_torch
class 							a__(   unittest.TestCase      ):


			'''simple docstring'''






			def 				a_			(  self):




					"""simple docstring"""


					lowerCAmelCase     =    """google/ddpm-cifar10-32"""

					lowerCAmelCase     =    UNetaDModel.from_pretrained(__lowerCAmelCase)
					lowerCAmelCase     =    PNDMScheduler()

					lowerCAmelCase     =    PNDMPipeline(unet=__lowerCAmelCase			,       scheduler=__lowerCAmelCase)
					pndm.to(__lowerCAmelCase)
					pndm.set_progress_bar_config(disable=__lowerCAmelCase)
					lowerCAmelCase     =    torch.manual_seed(0)
					lowerCAmelCase     =    pndm(generator=__lowerCAmelCase			,       output_type="""numpy""").images

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

					assert image.shape == (1, 32, 32, 3)
					lowerCAmelCase     =    np.array([0.1564, 0.14645, 0.1406, 0.14715, 0.12425, 0.14045, 0.13115, 0.12175, 0.125])

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





'''simple docstring'''




from functools import lru_cache






@lru_cache
def 							snake_case__				(     _A:   int					)       ->      int:

		'''simple docstring'''


		if num < 0:
				raise ValueError("""Number should not be negative."""					)

		return 1 if num in (0, 1) else num * factorial(num - 1					)


if __name__ == "__main__":
						import doctest

						doctest.testmod()




