


import unittest

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

from diffusers import DDIMScheduler, LDMPipeline, UNetaDModel, VQModel
from diffusers.utils.testing_utils import enable_full_determinism, require_torch, slow, torch_device


enable_full_determinism()






class _lowerCamelCase(		unittest.TestCase     ):
       @property
       def     UpperCamelCase  (      self) ->     int:




           """simple docstring"""

           torch.manual_seed(0)
           _lowercase :							Union[str, Any]   	=	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
       @property
       def     UpperCamelCase  (      self) ->     List[str]:




           """simple docstring"""

           torch.manual_seed(0)
           _lowercase :							str   	=	VQModel(
               block_out_channels=[32, 64],   in_channels=3,   out_channels=3,   down_block_types=['DownEncoderBlock2D', 'DownEncoderBlock2D'],   up_block_types=['UpDecoderBlock2D', 'UpDecoderBlock2D'],   latent_channels=3,   )
           return model
       @property
       def     UpperCamelCase  (      self) ->     Optional[Any]:




           """simple docstring"""

           torch.manual_seed(0)
           _lowercase :							Optional[int]   	=	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,   )
           return CLIPTextModel(lowerCamelCase)




       def     UpperCamelCase  (      self) ->     int:




           """simple docstring"""

           _lowercase :							Optional[Any]   	=	self.dummy_uncond_unet
           _lowercase :							Optional[Any]   	=	DDIMScheduler()
           _lowercase :							Any   	=	self.dummy_vq_model

           _lowercase :							Optional[int]   	=	LDMPipeline(unet=lowerCamelCase,   vqvae=lowerCamelCase,   scheduler=lowerCamelCase)
           ldm.to(lowerCamelCase)
           ldm.set_progress_bar_config(disable=lowerCamelCase)

           _lowercase :							Tuple   	=	torch.manual_seed(0)
           _lowercase :							Dict   	=	ldm(generator=lowerCamelCase,   num_inference_steps=2,   output_type='numpy').images

           _lowercase :							str   	=	torch.manual_seed(0)
           _lowercase :							Optional[Any]   	=	ldm(generator=lowerCamelCase,   num_inference_steps=2,   output_type='numpy',   return_dict=lowerCamelCase)[0]

           _lowercase :							List[str]   	=	image[0, -3:, -3:, -1]
           _lowercase :							int   	=	image_from_tuple[0, -3:, -3:, -1]

           assert image.shape == (1, 64, 64, 3)
           _lowercase :							str   	=	np.array([0.8_5_1_2, 0.8_1_8, 0.6_4_1_1, 0.6_8_0_8, 0.4_4_6_5, 0.5_6_1_8, 0.4_6, 0.6_2_3_1, 0.5_1_7_2])
           _lowercase :							Any   	=	1E-2 if torch_device != 'mps' else 3E-2

           assert np.abs(image_slice.flatten() - expected_slice).max() < tolerance
           assert np.abs(image_from_tuple_slice.flatten() - expected_slice).max() < tolerance






@slow
@require_torch
class _lowerCamelCase(		unittest.TestCase     ):
       def     UpperCamelCase  (      self) ->     str:




           """simple docstring"""

           _lowercase :							List[str]   	=	LDMPipeline.from_pretrained('CompVis/ldm-celebahq-256')
           ldm.to(lowerCamelCase)
           ldm.set_progress_bar_config(disable=lowerCamelCase)

           _lowercase :							Optional[Any]   	=	torch.manual_seed(0)
           _lowercase :							int   	=	ldm(generator=lowerCamelCase,   num_inference_steps=5,   output_type='numpy').images

           _lowercase :							Optional[int]   	=	image[0, -3:, -3:, -1]

           assert image.shape == (1, 2_56, 2_56, 3)
           _lowercase :							Tuple   	=	np.array([0.4_3_9_9, 0.4_4_9_7_5, 0.4_6_8_2_5, 0.4_7_4, 0.4_3_5_9, 0.4_5_8_1, 0.4_5_0_9_5, 0.4_3_4_1, 0.4_4_4_7])
           _lowercase :							Optional[int]   	=	1E-2 if torch_device != 'mps' else 3E-2

           assert np.abs(image_slice.flatten() - expected_slice).max() < tolerance






def        UpperCamelCase_(   lowerCamelCase_				)					->		int:
    assert (
        isinstance(lowerCamelCase_							,				lowerCamelCase_				) and number_of_steps > 0
    ), F'''number_of_steps needs to be positive integer, your input {number_of_steps}'''
    if number_of_steps == 1:
        return 1
    _lowercase	,       _lowercase :							Dict   	=	1, 1
    for _ in range(number_of_steps - 1				):
        _lowercase	,       _lowercase :							Tuple   	=	current + previous, current
    return current


if __name__ == "__main__":
 import doctest

 doctest.testmod()


