





import torch
from torch import nn

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






class       __A					(					UpperCAmelCase__    ,       UpperCAmelCase__				):

			'''simple docstring'''







			@register_to_config
			def __init__(					self ,						*,
			    __lowerCAmelCase = 4 ,						__lowerCAmelCase = 7_6_8 ,						__lowerCAmelCase ,						__lowerCAmelCase ,						):



				'''simple docstring'''







				super().__init__()

				lowerCamelCase__              =	nn.Parameter(torch.zeros(__lowerCAmelCase							)							)

				# parameters for additional clip time embeddings
				lowerCamelCase__              =	nn.Linear(__lowerCAmelCase ,						__lowerCAmelCase							)
				lowerCamelCase__              =	nn.Linear(__lowerCAmelCase ,						__lowerCAmelCase							)

				# parameters for encoder hidden states
				lowerCamelCase__              =	clip_extra_context_tokens
				lowerCamelCase__              =	nn.Linear(
				    __lowerCAmelCase ,						self.clip_extra_context_tokens * cross_attention_dim							)
				lowerCamelCase__              =	nn.Linear(__lowerCAmelCase ,						__lowerCAmelCase							)
				lowerCamelCase__              =	nn.LayerNorm(__lowerCAmelCase							)





			def 	__lowerCamelCase       (					self ,						*, __lowerCAmelCase ,						__lowerCAmelCase ,						__lowerCAmelCase ,						__lowerCAmelCase							):



				'''simple docstring'''







				if do_classifier_free_guidance:
					# Add the classifier free guidance embeddings to the image embeddings
					lowerCamelCase__              =	image_embeddings.shape[0]
					lowerCamelCase__              =	self.learned_classifier_free_guidance_embeddings.unsqueeze(0							)
					lowerCamelCase__              =	classifier_free_guidance_embeddings.expand(
					    __lowerCAmelCase ,						-1							)
					lowerCamelCase__              =	torch.cat([classifier_free_guidance_embeddings, image_embeddings] ,						dim=0							)

				# The image embeddings batch size and the text embeddings batch size are equal
				assert image_embeddings.shape[0] == prompt_embeds.shape[0]

				lowerCamelCase__              =	prompt_embeds.shape[0]

				# "Specifically, we modify the architecture described in Nichol et al. (2021) by projecting and
				# adding CLIP embeddings to the existing timestep embedding, ...
				lowerCamelCase__              =	self.embedding_proj(__lowerCAmelCase							)
				lowerCamelCase__              =	self.clip_image_embeddings_project_to_time_embeddings(__lowerCAmelCase							)
				lowerCamelCase__              =	time_projected_image_embeddings + time_projected_prompt_embeds

				# ... and by projecting CLIP embeddings into four
				# extra tokens of context that are concatenated to the sequence of outputs from the GLIDE text encoder"
				lowerCamelCase__              =	self.clip_extra_context_tokens_proj(__lowerCAmelCase							)
				lowerCamelCase__              =	clip_extra_context_tokens.reshape(__lowerCAmelCase ,						-1 ,						self.clip_extra_context_tokens							)
				lowerCamelCase__              =	clip_extra_context_tokens.permute(0 ,						2 ,						1							)

				lowerCamelCase__              =	self.encoder_hidden_states_proj(__lowerCAmelCase							)
				lowerCamelCase__              =	self.text_encoder_hidden_states_norm(__lowerCAmelCase							)
				lowerCamelCase__              =	torch.cat([clip_extra_context_tokens, text_encoder_hidden_states] ,						dim=1							)

				return text_encoder_hidden_states, additive_clip_time_embeddings







# This is the module that test_patching.py uses to test patch_submodule()

import os  # noqa: this is just for tests
import os as renamed_os  # noqa: this is just for tests
from os import path  # noqa: this is just for tests
from os import path as renamed_path  # noqa: this is just for tests
from os.path import join  # noqa: this is just for tests
from os.path import join as renamed_join  # noqa: this is just for tests


_a						=   open  # noqa: we just need to have a builtin inside this module to test it properly



