
'''simple docstring'''







import torch
import torch.nn as nn
from transformers.modeling_utils import ModuleUtilsMixin
from transformers.models.ta.modeling_ta import TaBlock, TaConfig, TaLayerNorm

from ...configuration_utils import ConfigMixin, register_to_config
from ...models import ModelMixin


class 						__UpperCAmelCase      (					__snake_case						,   __snake_case						,   __snake_case						):


							@register_to_config
							def __init__(       self    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_    ,   lowerCAmelCase_ = False    ,   ):





								"""simple docstring"""






								super().__init__()

								_snake_case   						=		nn.Embedding(a_    ,   a_  )

								_snake_case   						=		nn.Embedding(a_    ,   a_  )
								_snake_case   						=		False

								_snake_case   						=		nn.Dropout(p=a_  )

								_snake_case   						=		TaConfig(
								    vocab_size=a_    ,   d_model=a_    ,   num_heads=a_    ,   d_kv=a_    ,   d_ff=a_    ,   dropout_rate=a_    ,   feed_forward_proj=a_    ,   is_decoder=a_    ,   is_encoder_decoder=a_    ,   )

								_snake_case   						=		nn.ModuleList()
								for lyr_num in range(a_  ):
									_snake_case   						=		TaBlock(a_  )
									self.encoders.append(a_  )

								_snake_case   						=		TaLayerNorm(a_  )
								_snake_case   						=		nn.Dropout(p=a_  )




							def  lowerCamelCase				(       self    ,   lowerCAmelCase_    ,   lowerCAmelCase_  ):





								"""simple docstring"""






								_snake_case   						=		self.token_embedder(a_  )

								_snake_case   						=		encoder_input_tokens.shape[1]
								_snake_case   						=		torch.arange(a_    ,   device=encoder_input_tokens.device  )
								x += self.position_encoding(a_  )

								_snake_case   						=		self.dropout_pre(a_  )

								# inverted the attention mask
								_snake_case   						=		encoder_input_tokens.size()
								_snake_case   						=		self.get_extended_attention_mask(a_    ,   a_  )

								for lyr in self.encoders:
									_snake_case   						=		lyr(a_    ,   a_  )[0]
								_snake_case   						=		self.layer_norm(a_  )

								return self.dropout_post(a_  ), encoder_inputs_mask





"""simple docstring"""
import gc
import unittest

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

from diffusers import HeunDiscreteScheduler, PriorTransformer, ShapEPipeline
from diffusers.pipelines.shap_e import ShapERenderer
from diffusers.utils import load_numpy, slow
from diffusers.utils.testing_utils import require_torch_gpu, torch_device

from ..test_pipelines_common import PipelineTesterMixin, assert_mean_pixel_difference



class 			_UpperCAmelCase (							__snake_case,				unittest.TestCase				):






		'''simple docstring'''

		lowerCamelCase__				=ShapEPipeline
		lowerCamelCase__				=['prompt']
		lowerCamelCase__				=['prompt']
		lowerCamelCase__				=[
		    'num_images_per_prompt',
		    'num_inference_steps',
		    'generator',
		    'latents',
		    'guidance_scale',
		    'frame_size',
		    'output_type',
		    'return_dict',
		]
		lowerCamelCase__				=False



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return 32



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return 32



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return self.time_input_dim * 4



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			return 8



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Optional[Any]						=				CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''					)
			return tokenizer



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			torch.manual_seed(0					)
			__snake_case	:						Optional[int]						=				CLIPTextConfig(
			    bos_token_id=0				,       eos_token_id=2				,       hidden_size=self.text_embedder_hidden_size				,       projection_dim=self.text_embedder_hidden_size				,       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 CLIPTextModelWithProjection(a_					)



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			torch.manual_seed(0					)

			__snake_case	:						Optional[int]						=				{
			    '''num_attention_heads''': 2,
			    '''attention_head_dim''': 16,
			    '''embedding_dim''': self.time_input_dim,
			    '''num_embeddings''': 32,
			    '''embedding_proj_dim''': self.text_embedder_hidden_size,
			    '''time_embed_dim''': self.time_embed_dim,
			    '''num_layers''': 1,
			    '''clip_embed_dim''': self.time_input_dim * 2,
			    '''additional_embeddings''': 0,
			    '''time_embed_act_fn''': '''gelu''',
			    '''norm_in_type''': '''layer''',
			    '''encoder_hid_proj_type''': None,
			    '''added_emb_type''': None,
			}

			__snake_case	:						Optional[int]						=				PriorTransformer(**a_					)
			return model



		@property
		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			torch.manual_seed(0					)

			__snake_case	:						Optional[int]						=				{
			    '''param_shapes''': (
			        (self.renderer_dim, 93),
			        (self.renderer_dim, 8),
			        (self.renderer_dim, 8),
			        (self.renderer_dim, 8),
			    ),
			    '''d_latent''': self.time_input_dim,
			    '''d_hidden''': self.renderer_dim,
			    '''n_output''': 12,
			    '''background''': (
			        0.1,
			        0.1,
			        0.1,
			    ),
			}
			__snake_case	:						List[Any]						=				ShapERenderer(**a_					)
			return model



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						int						=				self.dummy_prior
			__snake_case	:						str						=				self.dummy_text_encoder
			__snake_case	:						str						=				self.dummy_tokenizer
			__snake_case	:						Tuple						=				self.dummy_renderer

			__snake_case	:						int						=				HeunDiscreteScheduler(
			    beta_schedule='''exp'''				,       num_train_timesteps=10_24				,       prediction_type='''sample'''				,       use_karras_sigmas=a_				,       clip_sample=a_				,       clip_sample_range=1.0				,       )
			__snake_case	:						Union[str, Any]						=				{
			    '''prior''': prior,
			    '''text_encoder''': text_encoder,
			    '''tokenizer''': tokenizer,
			    '''renderer''': renderer,
			    '''scheduler''': scheduler,
			}

			return components



		def 				SCREAMING_SNAKE_CASE  (self				,       a_				,       a_=0					):





			'''simple docstring'''

			if str(a_					).startswith('''mps'''					):
				__snake_case	:						Tuple						=				torch.manual_seed(a_					)
			else:
				__snake_case	:						Union[str, Any]						=				torch.Generator(device=a_					).manual_seed(a_					)
			__snake_case	:						Optional[int]						=				{
			    '''prompt''': '''horse''',
			    '''generator''': generator,
			    '''num_inference_steps''': 1,
			    '''frame_size''': 32,
			    '''output_type''': '''np''',
			}
			return inputs



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Optional[int]						=				'''cpu'''

			__snake_case	:						str						=				self.get_dummy_components()

			__snake_case	:						List[Any]						=				self.pipeline_class(**a_					)
			__snake_case	:						str						=				pipe.to(a_					)

			pipe.set_progress_bar_config(disable=a_					)

			__snake_case	:						Optional[Any]						=				pipe(**self.get_dummy_inputs(a_					)					)
			__snake_case	:						List[str]						=				output.images[0]
			__snake_case	:						List[str]						=				image[0, -3:, -3:, -1]

			assert image.shape == (20, 32, 32, 3)

			__snake_case	:						List[Any]						=				np.array(
			    [
			        0.0003_9216,
			        0.0003_9216,
			        0.0003_9216,
			        0.0003_9216,
			        0.0003_9216,
			        0.0003_9216,
			        0.0003_9216,
			        0.0003_9216,
			        0.0003_9216,
			    ]					)

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



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			self._test_inference_batch_consistent(batch_sizes=[1, 2]					)



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						Any						=				torch_device == '''cpu'''
			__snake_case	:						Tuple						=				True

			self._test_inference_batch_single_identical(
			    batch_size=2				,       test_max_difference=a_				,       relax_max_difference=a_				,       )



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						int						=				self.get_dummy_components()
			__snake_case	:						int						=				self.pipeline_class(**a_					)
			__snake_case	:						int						=				pipe.to(a_					)
			pipe.set_progress_bar_config(disable=a_					)

			__snake_case	:						Optional[Any]						=				1
			__snake_case	:						List[Any]						=				2

			__snake_case	:						int						=				self.get_dummy_inputs(a_					)

			for key in inputs.keys():
				if key in self.batch_params:
					__snake_case	:						Dict						=				batch_size * [inputs[key]]

			__snake_case	:						Union[str, Any]						=				pipe(**a_				,       num_images_per_prompt=a_					)[0]

			assert images.shape[0] == batch_size * num_images_per_prompt



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






		'''simple docstring'''

		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			super().tearDown()
			gc.collect()
			torch.cuda.empty_cache()



		def 				SCREAMING_SNAKE_CASE  (self					):





			'''simple docstring'''

			__snake_case	:						List[str]						=				load_numpy(
			    '''https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main'''
			    '''/shap_e/test_shap_e_np_out.npy'''					)
			__snake_case	:						Optional[Any]						=				ShapEPipeline.from_pretrained('''openai/shap-e'''					)
			__snake_case	:						Optional[int]						=				pipe.to(a_					)
			pipe.set_progress_bar_config(disable=a_					)

			__snake_case	:						Optional[Any]						=				torch.Generator(device=a_					).manual_seed(0					)

			__snake_case	:						str						=				pipe(
			    '''a shark'''				,       generator=a_				,       guidance_scale=15.0				,       num_inference_steps=64				,       frame_size=64				,       output_type='''np'''				,       ).images[0]

			assert images.shape == (20, 64, 64, 3)

			assert_mean_pixel_difference(a_				,       a_					)





