


import torch
from torch import nn

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







class lowerCAmelCase_						(			lowerCamelCase__ ,						lowerCamelCase__	):

 '''simple docstring'''

 @register_to_config
 def __init__(     self		,				*,
     _UpperCAmelCase = 4		,				_UpperCAmelCase = 7_68		,				_UpperCAmelCase		,				_UpperCAmelCase		,				):
       super().__init__()

       snake_case_	=				nn.Parameter(torch.zeros(_UpperCAmelCase ) )

       # parameters for additional clip time embeddings
       snake_case_	=				nn.Linear(_UpperCAmelCase		,				_UpperCAmelCase )
       snake_case_	=				nn.Linear(_UpperCAmelCase		,				_UpperCAmelCase )

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





 def 						UpperCamelCase__					(     self		,				*, _UpperCAmelCase		,				_UpperCAmelCase		,				_UpperCAmelCase		,				_UpperCAmelCase ):
       if do_classifier_free_guidance:
             # Add the classifier free guidance embeddings to the image embeddings
             snake_case_	=				image_embeddings.shape[0]
             snake_case_	=				self.learned_classifier_free_guidance_embeddings.unsqueeze(0 )
             snake_case_	=				classifier_free_guidance_embeddings.expand(
                 _UpperCAmelCase		,				-1 )
             snake_case_	=				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]

       snake_case_	=				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, ...
       snake_case_	=				self.embedding_proj(_UpperCAmelCase )
       snake_case_	=				self.clip_image_embeddings_project_to_time_embeddings(_UpperCAmelCase )
       snake_case_	=				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"
       snake_case_	=				self.clip_extra_context_tokens_proj(_UpperCAmelCase )
       snake_case_	=				clip_extra_context_tokens.reshape(_UpperCAmelCase		,				-1		,				self.clip_extra_context_tokens )
       snake_case_	=				clip_extra_context_tokens.permute(0		,				2		,				1 )

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

       return text_encoder_hidden_states, additive_clip_time_embeddings



def 	__lowerCAmelCase   (SCREAMING_SNAKE_CASE )->  int:




      """simple docstring"""

      if not isinstance(SCREAMING_SNAKE_CASE , SCREAMING_SNAKE_CASE ):
            snake_case_	=				f'''Input value of [number={number}] must be an integer'''
            raise TypeError(SCREAMING_SNAKE_CASE )

      if number < 1:
            snake_case_	=				f'''Input value of [number={number}] must be > 0'''
            raise ValueError(SCREAMING_SNAKE_CASE )

      snake_case_	=				1

      for i in range(1 , SCREAMING_SNAKE_CASE ):
            current_number *= 4 * i - 2
            current_number //= i + 1

      return current_number


if __name__ == "__main__":
   import doctest

   doctest.testmod()