from ...configuration_utils import PretrainedConfig
from ...utils import logging


lowerCAmelCase_						   =    logging.get_logger(__name__)

lowerCAmelCase_						   =    {
    """edbeeching/decision-transformer-gym-hopper-medium""": (
        """https://huggingface.co/edbeeching/decision-transformer-gym-hopper-medium/resolve/main/config.json"""
    ),
    # See all DecisionTransformer models at https://huggingface.co/models?filter=decision_transformer
}



class        _lowerCAmelCase    (			UpperCAmelCase_							):


  '''simple docstring'''
  a_							:       Tuple      					="""decision_transformer"""
  a_							:       Dict      					=["""past_key_values"""]
  a_							:       Optional[int]      					={
      """max_position_embeddings""": """n_positions""",
      """num_attention_heads""": """n_head""",
      """num_hidden_layers""": """n_layer""",
  }







  def __init__(      self      :					Dict      ,				UpperCamelCase      :					Union[str, Any]=17      ,				UpperCamelCase      :					int=4      ,				UpperCamelCase      :					List[str]=1_28      ,				UpperCamelCase      :					List[Any]=40_96      ,				UpperCamelCase      :					Dict=True      ,				UpperCamelCase      :					Any=1      ,				UpperCamelCase      :					Optional[int]=10_24      ,				UpperCamelCase      :					Optional[Any]=3      ,				UpperCamelCase      :					Optional[Any]=1      ,				UpperCamelCase      :					List[str]=None      ,				UpperCamelCase      :					Any="relu"      ,				UpperCamelCase      :					Tuple=0.1      ,				UpperCamelCase      :					Union[str, Any]=0.1      ,				UpperCamelCase      :					Any=0.1      ,				UpperCamelCase      :					List[Any]=1e-5      ,				UpperCamelCase      :					Union[str, Any]=0.02      ,				UpperCamelCase      :					int=True      ,				UpperCamelCase      :					Optional[int]=True      ,				UpperCamelCase      :					List[Any]=5_02_56      ,				UpperCamelCase      :					List[Any]=5_02_56      ,				UpperCamelCase      :					Tuple=False      ,				UpperCamelCase      :					Any=False      ,				**UpperCamelCase      :					Union[str, Any]      ,				):


    '''simple docstring'''





    _snake_case   :				List[Any]														=	state_dim
    _snake_case   :				int														=	act_dim
    _snake_case   :				Optional[int]														=	hidden_size
    _snake_case   :				Dict														=	max_ep_len
    _snake_case   :				List[str]														=	action_tanh
    _snake_case   :				Any														=	vocab_size
    _snake_case   :				Tuple														=	n_positions
    _snake_case   :				List[str]														=	n_layer
    _snake_case   :				str														=	n_head
    _snake_case   :				str														=	n_inner
    _snake_case   :				int														=	activation_function
    _snake_case   :				Tuple														=	resid_pdrop
    _snake_case   :				List[Any]														=	embd_pdrop
    _snake_case   :				int														=	attn_pdrop
    _snake_case   :				Optional[Any]														=	layer_norm_epsilon
    _snake_case   :				str														=	initializer_range
    _snake_case   :				str														=	scale_attn_weights
    _snake_case   :				List[Any]														=	use_cache
    _snake_case   :				Optional[Any]														=	scale_attn_by_inverse_layer_idx
    _snake_case   :				int														=	reorder_and_upcast_attn

    _snake_case   :				Any														=	bos_token_id
    _snake_case   :				Union[str, Any]														=	eos_token_id

    super().__init__(bos_token_id=lowercase_      ,				eos_token_id=lowercase_      ,				**lowercase_							)











from dataclasses import dataclass
from typing import Dict, Optional, Union

import torch
import torch.nn.functional as F
from torch import nn

from ..configuration_utils import ConfigMixin, register_to_config
from ..utils import BaseOutput
from .attention import BasicTransformerBlock
from .attention_processor import AttentionProcessor, AttnProcessor
from .embeddings import TimestepEmbedding, Timesteps
from .modeling_utils import ModelMixin



@dataclass
class        _lowerCAmelCase    (			UpperCAmelCase_							):


  '''simple docstring'''
  a_							:       torch.FloatTensor




class        _lowerCAmelCase    (			UpperCAmelCase_							,    UpperCAmelCase_							):


  '''simple docstring'''







  @register_to_config
  def __init__(      self      :					str      ,				UpperCamelCase      :					int = 32      ,				UpperCamelCase      :					int = 64      ,				UpperCamelCase      :					int = 20      ,				UpperCamelCase      :					int = 7_68      ,				UpperCamelCase      :					Optional[int]=77      ,				UpperCamelCase      :					int=4      ,				UpperCamelCase      :					float = 0.0      ,				UpperCamelCase      :					str = "silu"      ,				UpperCamelCase      :					Optional[str] = None      ,				UpperCamelCase      :					Optional[str] = None      ,				UpperCamelCase      :					Optional[str] = "linear"      ,				UpperCamelCase      :					Optional[str] = "prd"      ,				UpperCamelCase      :					Optional[int] = None      ,				UpperCamelCase      :					Optional[int] = None      ,				UpperCamelCase      :					Optional[int] = None      ,				):


    '''simple docstring'''





    super().__init__()
    _snake_case   :				str														=	num_attention_heads
    _snake_case   :				Optional[int]														=	attention_head_dim
    _snake_case   :				Any														=	num_attention_heads * attention_head_dim
    _snake_case   :				List[Any]														=	additional_embeddings

    _snake_case   :				List[str]														=	time_embed_dim or inner_dim
    _snake_case   :				int														=	embedding_proj_dim or embedding_dim
    _snake_case   :				List[Any]														=	clip_embed_dim or embedding_dim

    _snake_case   :				Optional[Any]														=	Timesteps(UpperCamelCase      ,				UpperCamelCase      ,				0							)
    _snake_case   :				List[Any]														=	TimestepEmbedding(UpperCamelCase      ,				UpperCamelCase      ,				out_dim=UpperCamelCase      ,				act_fn=UpperCamelCase							)

    _snake_case   :				Optional[int]														=	nn.Linear(UpperCamelCase      ,				UpperCamelCase							)

    if embedding_proj_norm_type is None:
      _snake_case   :				str														=	None
    elif embedding_proj_norm_type == "layer":
      _snake_case   :				List[Any]														=	nn.LayerNorm(UpperCamelCase							)
    else:
      raise ValueError(f"""unsupported embedding_proj_norm_type: {embedding_proj_norm_type}"""							)

    _snake_case   :				str														=	nn.Linear(UpperCamelCase      ,				UpperCamelCase							)

    if encoder_hid_proj_type is None:
      _snake_case   :				Any														=	None
    elif encoder_hid_proj_type == "linear":
      _snake_case   :				Optional[int]														=	nn.Linear(UpperCamelCase      ,				UpperCamelCase							)
    else:
      raise ValueError(f"""unsupported encoder_hid_proj_type: {encoder_hid_proj_type}"""							)

    _snake_case   :				List[str]														=	nn.Parameter(torch.zeros(1      ,				num_embeddings + additional_embeddings      ,				UpperCamelCase							)							)

    if added_emb_type == "prd":
      _snake_case   :				str														=	nn.Parameter(torch.zeros(1      ,				1      ,				UpperCamelCase							)							)
    elif added_emb_type is None:
      _snake_case   :				Dict														=	None
    else:
      raise ValueError(
          f"""`added_emb_type`: {added_emb_type} is not supported. Make sure to choose one of `'prd'` or `None`."""							)

    _snake_case   :				Optional[int]														=	nn.ModuleList(
        [
            BasicTransformerBlock(
                UpperCamelCase      ,				UpperCamelCase      ,				UpperCamelCase      ,				dropout=UpperCamelCase      ,				activation_fn='gelu'      ,				attention_bias=UpperCamelCase      ,				)
            for d in range(UpperCamelCase							)
        ]							)

    if norm_in_type == "layer":
      _snake_case   :				Optional[int]														=	nn.LayerNorm(UpperCamelCase							)
    elif norm_in_type is None:
      _snake_case   :				Optional[Any]														=	None
    else:
      raise ValueError(f"""Unsupported norm_in_type: {norm_in_type}."""							)

    _snake_case   :				Optional[Any]														=	nn.LayerNorm(UpperCamelCase							)

    _snake_case   :				Union[str, Any]														=	nn.Linear(UpperCamelCase      ,				UpperCamelCase							)

    _snake_case   :				List[Any]														=	torch.full(
        [num_embeddings + additional_embeddings, num_embeddings + additional_embeddings]      ,				-1_00_00.0							)
    causal_attention_mask.triu_(1							)
    _snake_case   :				Optional[Any]														=	causal_attention_mask[None, ...]
    self.register_buffer('causal_attention_mask'      ,				UpperCamelCase      ,				persistent=UpperCamelCase							)

    _snake_case   :				str														=	nn.Parameter(torch.zeros(1      ,				UpperCamelCase							)							)
    _snake_case   :				List[str]														=	nn.Parameter(torch.zeros(1      ,				UpperCamelCase							)							)







  @property
  # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.attn_processors
  def UpperCamelCase_ (      self      :					Optional[Any]							):


    '''simple docstring'''





    _snake_case   :				Optional[Any]														=	{}

    def fn_recursive_add_processors(UpperCamelCase      :					str      ,				UpperCamelCase      :					torch.nn.Module      ,				UpperCamelCase      :					Dict[str, AttentionProcessor]							):
      if hasattr(UpperCamelCase      ,				'set_processor'							):
        _snake_case   :				Tuple														=	module.processor

      for sub_name, child in module.named_children():
        fn_recursive_add_processors(f"""{name}.{sub_name}"""      ,				UpperCamelCase      ,				UpperCamelCase							)

      return processors

    for name, module in self.named_children():
      fn_recursive_add_processors(UpperCamelCase      ,				UpperCamelCase      ,				UpperCamelCase							)

    return processors







  def UpperCamelCase_ (      self      :					List[Any]      ,				UpperCamelCase      :					Union[AttentionProcessor, Dict[str, AttentionProcessor]]							):


    '''simple docstring'''





    _snake_case   :				Optional[int]														=	len(self.attn_processors.keys()							)

    if isinstance(UpperCamelCase      ,				UpperCamelCase							) and len(UpperCamelCase							) != count:
      raise ValueError(
          f"""A dict of processors was passed, but the number of processors {len(UpperCamelCase							)} does not match the"""
          f""" number of attention layers: {count}. Please make sure to pass {count} processor classes."""							)

    def fn_recursive_attn_processor(UpperCamelCase      :					str      ,				UpperCamelCase      :					torch.nn.Module      ,				UpperCamelCase      :					Union[str, Any]							):
      if hasattr(UpperCamelCase      ,				'set_processor'							):
        if not isinstance(UpperCamelCase      ,				UpperCamelCase							):
          module.set_processor(UpperCamelCase							)
        else:
          module.set_processor(processor.pop(f"""{name}.processor"""							)							)

      for sub_name, child in module.named_children():
        fn_recursive_attn_processor(f"""{name}.{sub_name}"""      ,				UpperCamelCase      ,				UpperCamelCase							)

    for name, module in self.named_children():
      fn_recursive_attn_processor(UpperCamelCase      ,				UpperCamelCase      ,				UpperCamelCase							)







  def UpperCamelCase_ (      self      :					Optional[Any]							):


    '''simple docstring'''





    self.set_attn_processor(AttnProcessor()							)







  def UpperCamelCase_ (      self      :					Optional[Any]      ,				UpperCamelCase      :					Any      ,				UpperCamelCase      :					Union[torch.Tensor, float, int]      ,				UpperCamelCase      :					torch.FloatTensor      ,				UpperCamelCase      :					Optional[torch.FloatTensor] = None      ,				UpperCamelCase      :					Optional[torch.BoolTensor] = None      ,				UpperCamelCase      :					bool = True      ,				):


    '''simple docstring'''





    _snake_case   :				Dict														=	hidden_states.shape[0]

    _snake_case   :				str														=	timestep
    if not torch.is_tensor(UpperCamelCase							):
      _snake_case   :				Dict														=	torch.tensor([timesteps]      ,				dtype=torch.long      ,				device=hidden_states.device							)
    elif torch.is_tensor(UpperCamelCase							) and len(timesteps.shape							) == 0:
      _snake_case   :				Tuple														=	timesteps[None].to(hidden_states.device							)

    # broadcast to batch dimension in a way that's compatible with ONNX/Core ML
    _snake_case   :				Optional[int]														=	timesteps * torch.ones(UpperCamelCase      ,				dtype=timesteps.dtype      ,				device=timesteps.device							)

    _snake_case   :				Union[str, Any]														=	self.time_proj(UpperCamelCase							)

    # timesteps does not contain any weights and will always return f32 tensors
    # but time_embedding might be fp16, so we need to cast here.
    _snake_case   :				Tuple														=	timesteps_projected.to(dtype=self.dtype							)
    _snake_case   :				List[Any]														=	self.time_embedding(UpperCamelCase							)

    if self.embedding_proj_norm is not None:
      _snake_case   :				Optional[Any]														=	self.embedding_proj_norm(UpperCamelCase							)

    _snake_case   :				Union[str, Any]														=	self.embedding_proj(UpperCamelCase							)
    if self.encoder_hidden_states_proj is not None and encoder_hidden_states is not None:
      _snake_case   :				Dict														=	self.encoder_hidden_states_proj(UpperCamelCase							)
    elif self.encoder_hidden_states_proj is not None and encoder_hidden_states is None:
      raise ValueError('`encoder_hidden_states_proj` requires `encoder_hidden_states` to be set'							)

    _snake_case   :				str														=	self.proj_in(UpperCamelCase							)

    _snake_case   :				int														=	self.positional_embedding.to(hidden_states.dtype							)

    _snake_case   :				Optional[int]														=	[]
    _snake_case   :				List[Any]														=	0

    if encoder_hidden_states is not None:
      additional_embeds.append(UpperCamelCase							)
      additional_embeddings_len += encoder_hidden_states.shape[1]

    if len(proj_embeddings.shape							) == 2:
      _snake_case   :				str														=	proj_embeddings[:, None, :]

    if len(hidden_states.shape							) == 2:
      _snake_case   :				str														=	hidden_states[:, None, :]

    _snake_case   :				str														=	additional_embeds + [
        proj_embeddings,
        time_embeddings[:, None, :],
        hidden_states,
    ]

    if self.prd_embedding is not None:
      _snake_case   :				int														=	self.prd_embedding.to(hidden_states.dtype							).expand(UpperCamelCase      ,				-1      ,				-1							)
      additional_embeds.append(UpperCamelCase							)

    _snake_case   :				Optional[int]														=	torch.cat(
        UpperCamelCase      ,				dim=1      ,				)

    # Allow positional_embedding to not include the `addtional_embeddings` and instead pad it with zeros for these additional tokens
    _snake_case   :				Tuple														=	additional_embeddings_len + proj_embeddings.shape[1] + 1
    if positional_embeddings.shape[1] < hidden_states.shape[1]:
      _snake_case   :				Optional[Any]														=	F.pad(
          UpperCamelCase      ,				(
              0,
              0,
              additional_embeddings_len,
              self.prd_embedding.shape[1] if self.prd_embedding is not None else 0,
          )      ,				value=0.0      ,				)

    _snake_case   :				Optional[Any]														=	hidden_states + positional_embeddings

    if attention_mask is not None:
      _snake_case   :				Any														=	(1 - attention_mask.to(hidden_states.dtype							)) * -1_00_00.0
      _snake_case   :				Tuple														=	F.pad(UpperCamelCase      ,				(0, self.additional_embeddings)      ,				value=0.0							)
      _snake_case   :				int														=	(attention_mask[:, None, :] + self.causal_attention_mask).to(hidden_states.dtype							)
      _snake_case   :				str														=	attention_mask.repeat_interleave(self.config.num_attention_heads      ,				dim=0							)

    if self.norm_in is not None:
      _snake_case   :				Tuple														=	self.norm_in(UpperCamelCase							)

    for block in self.transformer_blocks:
      _snake_case   :				Any														=	block(UpperCamelCase      ,				attention_mask=UpperCamelCase							)

    _snake_case   :				Dict														=	self.norm_out(UpperCamelCase							)

    if self.prd_embedding is not None:
      _snake_case   :				str														=	hidden_states[:, -1]
    else:
      _snake_case   :				Any														=	hidden_states[:, additional_embeddings_len:]

    _snake_case   :				List[Any]														=	self.proj_to_clip_embeddings(UpperCamelCase							)

    if not return_dict:
      return (predicted_image_embedding,)

    return PriorTransformerOutput(predicted_image_embedding=UpperCamelCase							)







  def UpperCamelCase_ (      self      :					Tuple      ,				UpperCamelCase      :					Union[str, Any]							):


    '''simple docstring'''





    _snake_case   :				List[Any]														=	(prior_latents * self.clip_std) + self.clip_mean
    return prior_latents




