





'''simple docstring'''







# Copyright 2023 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import TYPE_CHECKING

# rely on isort to merge the imports
from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available, is_vision_available


lowerCAmelCase_					:    Optional[int]      	=			{
    'configuration_efficientnet': [
        'EFFICIENTNET_PRETRAINED_CONFIG_ARCHIVE_MAP',
        'EfficientNetConfig',
        'EfficientNetOnnxConfig',
    ]
}

try:
					if not is_vision_available():
										raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
					pass
else:
					lowerCAmelCase_					:    Any      	=			['EfficientNetImageProcessor']

try:
					if not is_torch_available():
										raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
					pass
else:
					lowerCAmelCase_					:    Optional[Any]      	=			[
					    'EFFICIENTNET_PRETRAINED_MODEL_ARCHIVE_LIST',
					    'EfficientNetForImageClassification',
					    'EfficientNetModel',
					    'EfficientNetPreTrainedModel',
					]

if TYPE_CHECKING:
					from .configuration_efficientnet import (
					    EFFICIENTNET_PRETRAINED_CONFIG_ARCHIVE_MAP,
					    EfficientNetConfig,
					    EfficientNetOnnxConfig,
					)

					try:
										if not is_vision_available():
															raise OptionalDependencyNotAvailable()
					except OptionalDependencyNotAvailable:
										pass
					else:
										from .image_processing_efficientnet import EfficientNetImageProcessor

					try:
										if not is_torch_available():
															raise OptionalDependencyNotAvailable()
					except OptionalDependencyNotAvailable:
										pass
					else:
										from .modeling_efficientnet import (
										    EFFICIENTNET_PRETRAINED_MODEL_ARCHIVE_LIST,
										    EfficientNetForImageClassification,
										    EfficientNetModel,
										    EfficientNetPreTrainedModel,
										)

else:
					import sys

					lowerCAmelCase_					:    List[str]      	=			_LazyModule(__name__, globals()['__file__'], _import_structure)







"""simple docstring"""




import torch
from torch import nn

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


class        __UpperCamelCase				(						a__		,       a__						):






							@register_to_config
							def __init__(   self      ,					*,
							    lowerCAmelCase__ = 4      ,					lowerCAmelCase__ = 768      ,					lowerCAmelCase__      ,					lowerCAmelCase__      ,					)	-> Optional[Any]:
								super().__init__()

								a      :		Tuple	=				nn.Parameter(torch.zeros(lowerCAmelCase__      )      )

								# parameters for additional clip time embeddings
								a      :		str	=				nn.Linear(lowerCAmelCase__      ,					lowerCAmelCase__      )
								a      :		Any	=				nn.Linear(lowerCAmelCase__      ,					lowerCAmelCase__      )

								# parameters for encoder hidden states
								a      :		int	=				clip_extra_context_tokens
								a      :		int	=				nn.Linear(
								    lowerCAmelCase__      ,					self.clip_extra_context_tokens * cross_attention_dim      )
								a      :		Any	=				nn.Linear(lowerCAmelCase__      ,					lowerCAmelCase__      )
								a      :		str	=				nn.LayerNorm(lowerCAmelCase__      )






							def     __a   (   self      ,					*, lowerCAmelCase__      ,					lowerCAmelCase__      ,					lowerCAmelCase__      ,					lowerCAmelCase__      )	-> Union[str, Any]:
								if do_classifier_free_guidance:
									# Add the classifier free guidance embeddings to the image embeddings
									a      :		str	=				image_embeddings.shape[0]
									a      :		Optional[int]	=				self.learned_classifier_free_guidance_embeddings.unsqueeze(0      )
									a      :		Any	=				classifier_free_guidance_embeddings.expand(
									    lowerCAmelCase__      ,					-1      )
									a      :		Any	=				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]

								a      :		List[str]	=				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, ...
								a      :		Dict	=				self.embedding_proj(lowerCAmelCase__      )
								a      :		List[str]	=				self.clip_image_embeddings_project_to_time_embeddings(lowerCAmelCase__      )
								a      :		Dict	=				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"
								a      :		Union[str, Any]	=				self.clip_extra_context_tokens_proj(lowerCAmelCase__      )
								a      :		List[str]	=				clip_extra_context_tokens.reshape(lowerCAmelCase__      ,					-1      ,					self.clip_extra_context_tokens      )
								a      :		Optional[Any]	=				clip_extra_context_tokens.permute(0      ,					2      ,					1      )

								a      :		Optional[int]	=				self.encoder_hidden_states_proj(lowerCAmelCase__      )
								a      :		str	=				self.text_encoder_hidden_states_norm(lowerCAmelCase__      )
								a      :		List[str]	=				torch.cat([clip_extra_context_tokens, text_encoder_hidden_states]      ,					dim=1      )

								return text_encoder_hidden_states, additive_clip_time_embeddings


