



# Lint as: python3
import sys
from collections.abc import Mapping
from typing import TYPE_CHECKING, Dict, Optional

import numpy as np
import pyarrow as pa

from .. import config
from ..utils.logging import get_logger
from ..utils.py_utils import map_nested
from .formatting import TensorFormatter


if TYPE_CHECKING:
	import jax
	import jaxlib

UpperCAmelCase							 =					get_logger()

UpperCAmelCase							 =					None

class 						__snake_case      (   TensorFormatter[Mapping, """jax.Array""", Mapping]):







							'''simple docstring'''






							def __init__(							self  ,  a_=None  ,  a_=None  ,  **a_		):
											super().__init__(features=a_		)
											import jax
											from jaxlib.xla_client import Device

											if isinstance(a_  ,  a_		):
															raise ValueError(
															    F'''Expected {device} to be a `str` not {type(a_		)}, as `jaxlib.xla_extension.Device` '''
															    """is not serializable neither with `pickle` nor with `dill`. Instead you can surround """
															    """the device with `str()` to get its string identifier that will be internally mapped """
															    """to the actual `jaxlib.xla_extension.Device`."""		)
											a__				      =		device if isinstance(a_  ,  a_		) else str(jax.devices()[0]		)
											# using global variable since `jaxlib.xla_extension.Device` is not serializable neither
											# with `pickle` nor with `dill`, so we need to use a global variable instead
											global DEVICE_MAPPING
											if DEVICE_MAPPING is None:
															a__				      =		self._map_devices_to_str()
											if self.device not in list(DEVICE_MAPPING.keys()		):
															logger.warning(
															    F'''Device with string identifier {self.device} not listed among the available '''
															    F'''devices: {list(DEVICE_MAPPING.keys()		)}, so falling back to the default '''
															    F'''device: {str(jax.devices()[0]		)}.'''		)
															a__				      =		str(jax.devices()[0]		)
											a__				      =		jnp_array_kwargs


							@staticmethod
							def _a      (							):
											import jax

											return {str(a_		): device for device in jax.devices()}


							def _a      (							self  ,  a_		):
											import jax
											import jax.numpy as jnp

											if isinstance(a_  ,  a_		) and column:
															if all(
															    isinstance(a_  ,  jax.Array		) and x.shape == column[0].shape and x.dtype == column[0].dtype for x in column		):
																			return jnp.stack(a_  ,  axis=0		)
											return column


							def _a      (							self  ,  a_		):
											import jax
											import jax.numpy as jnp

											if isinstance(a_  ,  (str, bytes, type(a_		))		):
															return value
											elif isinstance(a_  ,  (np.character, np.ndarray)		) and np.issubdtype(value.dtype  ,  np.character		):
															return value.tolist()

											a__				      =		{}

											if isinstance(a_  ,  (np.number, np.ndarray)		) and np.issubdtype(value.dtype  ,  np.integer		):
															# the default int precision depends on the jax config
															# see https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html#double-64bit-precision
															if jax.config.jax_enable_xaa:
																			a__				      =		{"""dtype""": jnp.intaa}
															else:
																			a__				      =		{"""dtype""": jnp.intaa}
											elif isinstance(a_  ,  (np.number, np.ndarray)		) and np.issubdtype(value.dtype  ,  np.floating		):
															a__				      =		{"""dtype""": jnp.floataa}
											elif config.PIL_AVAILABLE and "PIL" in sys.modules:
															import PIL.Image

															if isinstance(a_  ,  PIL.Image.Image		):
																			a__				      =		np.asarray(a_		)

        # using global variable since `jaxlib.xla_extension.Device` is not serializable neither
        # with `pickle` nor with `dill`, so we need to use a global variable instead
											global DEVICE_MAPPING
											if DEVICE_MAPPING is None:
															a__				      =		self._map_devices_to_str()

											with jax.default_device(DEVICE_MAPPING[self.device]		):
															# calling jnp.array on a np.ndarray does copy the data
															# see https://github.com/google/jax/issues/4486
															return jnp.array(a_  ,  **{**default_dtype, **self.jnp_array_kwargs}		)


							def _a      (							self  ,  a_		):
											import jax

											# support for torch, tf, jax etc.
											if config.TORCH_AVAILABLE and "torch" in sys.modules:
															import torch

															if isinstance(a_  ,  torch.Tensor		):
																			return self._tensorize(data_struct.detach().cpu().numpy()[()]		)
											if hasattr(a_  ,  """__array__"""		) and not isinstance(a_  ,  jax.Array		):
															a__				      =		data_struct.__array__()
											# support for nested types like struct of list of struct
											if isinstance(a_  ,  np.ndarray		):
															if data_struct.dtype == object:  # jax arrays cannot be instantied from an array of objects
																			return self._consolidate([self.recursive_tensorize(a_		) for substruct in data_struct]		)
											elif isinstance(a_  ,  (list, tuple)		):
															return self._consolidate([self.recursive_tensorize(a_		) for substruct in data_struct]		)
											return self._tensorize(a_		)


							def _a      (							self  ,  a_		):
											return map_nested(self._recursive_tensorize  ,  a_  ,  map_list=a_		)


							def _a      (							self  ,  a_		):
											a__				      =		self.numpy_arrow_extractor().extract_row(a_		)
											a__				      =		self.python_features_decoder.decode_row(a_		)
											return self.recursive_tensorize(a_		)


							def _a      (							self  ,  a_		):
											a__				      =		self.numpy_arrow_extractor().extract_column(a_		)
											a__				      =		self.python_features_decoder.decode_column(a_  ,  pa_table.column_names[0]		)
											a__				      =		self.recursive_tensorize(a_		)
											a__				      =		self._consolidate(a_		)
											return column







							def _a      (							self  ,  a_		):
											a__				      =		self.numpy_arrow_extractor().extract_batch(a_		)
											a__				      =		self.python_features_decoder.decode_batch(a_		)
											a__				      =		self.recursive_tensorize(a_		)
											for column_name in batch:
															a__				      =		self._consolidate(batch[column_name]		)
											return batch






import math

import torch
from torch import nn

from ..configuration_utils import ConfigMixin, register_to_config
from .attention_processor import Attention
from .embeddings import get_timestep_embedding
from .modeling_utils import ModelMixin

class  __snake_case      (   SCREAMING_SNAKE_CASE			,SCREAMING_SNAKE_CASE):







							'''simple docstring'''






							@register_to_config
							def __init__(							self  ,  a_ = 128  ,  a_ = 256  ,  a_ = 2_000.0  ,  a_ = 768  ,  a_ = 12  ,  a_ = 12  ,  a_ = 64  ,  a_ = 2_048  ,  a_ = 0.1  ,  ):
											super().__init__()

											a__				      =		nn.Sequential(
											    nn.Linear(a_  ,  d_model * 4  ,  bias=a_		)  ,  nn.SiLU()  ,  nn.Linear(d_model * 4  ,  d_model * 4  ,  bias=a_		)  ,  nn.SiLU()  ,  )

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

											a__				      =		nn.Linear(a_  ,  a_  ,  bias=a_		)

											a__				      =		nn.Dropout(p=a_		)

											a__				      =		nn.ModuleList()
											for lyr_num in range(a_		):
															# FiLM conditional T5 decoder
															a__				      =		DecoderLayer(d_model=a_  ,  d_kv=a_  ,  num_heads=a_  ,  d_ff=a_  ,  dropout_rate=a_		)
															self.decoders.append(a_		)

											a__				      =		TaLayerNorm(a_		)

											a__				      =		nn.Dropout(p=a_		)
											a__				      =		nn.Linear(a_  ,  a_  ,  bias=a_		)


							def _a      (							self  ,  a_  ,  a_		):
											a__				      =		torch.mul(query_input.unsqueeze(-1		)  ,  key_input.unsqueeze(-2		)		)
											return mask.unsqueeze(-3		)







							def _a      (							self  ,  a_  ,  a_  ,  a_		):
											a__      ,			a__      ,			a__				      =		decoder_input_tokens.shape
											assert decoder_noise_time.shape == (batch,)

											# decoder_noise_time is in [0, 1), so rescale to expected timing range.
											a__				      =		get_timestep_embedding(
											    decoder_noise_time * self.config.max_decoder_noise_time  ,  embedding_dim=self.config.d_model  ,  max_period=self.config.max_decoder_noise_time  ,  ).to(dtype=self.dtype		)

											a__				      =		self.conditioning_emb(a_		).unsqueeze(1		)

											assert conditioning_emb.shape == (batch, 1, self.config.d_model * 4)

											a__				      =		decoder_input_tokens.shape[1]

											# If we want to use relative positions for audio context, we can just offset
											# this sequence by the length of encodings_and_masks.
											a__				      =		torch.broadcast_to(
											    torch.arange(a_  ,  device=decoder_input_tokens.device		)  ,  (batch, seq_length)  ,  )

											a__				      =		self.position_encoding(a_		)

											a__				      =		self.continuous_inputs_projection(a_		)
											inputs += position_encodings
											a__				      =		self.dropout(a_		)

											# decoder: No padding present.
											a__				      =		torch.ones(
											    decoder_input_tokens.shape[:2]  ,  device=decoder_input_tokens.device  ,  dtype=inputs.dtype		)

											# Translate encoding masks to encoder-decoder masks.
											a__				      =		[(x, self.encoder_decoder_mask(a_  ,  a_		)) for x, y in encodings_and_masks]

											# cross attend style: concat encodings
											a__				      =		torch.cat([x[0] for x in encodings_and_encdec_masks]  ,  dim=1		)
											a__				      =		torch.cat([x[1] for x in encodings_and_encdec_masks]  ,  dim=-1		)

											for lyr in self.decoders:
															a__				      =		lyr(
															    a_  ,  conditioning_emb=a_  ,  encoder_hidden_states=a_  ,  encoder_attention_mask=a_  ,  )[0]

											a__				      =		self.decoder_norm(a_		)
											a__				      =		self.post_dropout(a_		)

											a__				      =		self.spec_out(a_		)
											return spec_out




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def __init__(							self  ,  a_  ,  a_  ,  a_  ,  a_  ,  a_  ,  a_=1E-6		):
											super().__init__()
											a__				      =		nn.ModuleList()

											# cond self attention: layer 0
											self.layer.append(
											    TaLayerSelfAttentionCond(d_model=a_  ,  d_kv=a_  ,  num_heads=a_  ,  dropout_rate=a_		)		)

											# cross attention: layer 1
											self.layer.append(
											    TaLayerCrossAttention(
											        d_model=a_  ,  d_kv=a_  ,  num_heads=a_  ,  dropout_rate=a_  ,  layer_norm_epsilon=a_  ,  )		)

											# Film Cond MLP + dropout: last layer
											self.layer.append(
											    TaLayerFFCond(d_model=a_  ,  d_ff=a_  ,  dropout_rate=a_  ,  layer_norm_epsilon=a_		)		)







							def _a      (							self  ,  a_  ,  a_=None  ,  a_=None  ,  a_=None  ,  a_=None  ,  a_=None  ,  ):
											a__				      =		self.layer[0](
											    a_  ,  conditioning_emb=a_  ,  attention_mask=a_  ,  )

											if encoder_hidden_states is not None:
															a__				      =		torch.where(encoder_attention_mask > 0  ,  0  ,  -1E1_0		).to(
															    encoder_hidden_states.dtype		)

															a__				      =		self.layer[1](
															    a_  ,  key_value_states=a_  ,  attention_mask=a_  ,  )

											# Apply Film Conditional Feed Forward layer
											a__				      =		self.layer[-1](a_  ,  a_		)

											return (hidden_states,)




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def __init__(							self  ,  a_  ,  a_  ,  a_  ,  a_		):
											super().__init__()
											a__				      =		TaLayerNorm(a_		)
											a__				      =		TaFiLMLayer(in_features=d_model * 4  ,  out_features=a_		)
											a__				      =		Attention(query_dim=a_  ,  heads=a_  ,  dim_head=a_  ,  out_bias=a_  ,  scale_qk=a_		)
											a__				      =		nn.Dropout(a_		)







							def _a      (							self  ,  a_  ,  a_=None  ,  a_=None  ,  ):
											# pre_self_attention_layer_norm
											a__				      =		self.layer_norm(a_		)

											if conditioning_emb is not None:
															a__				      =		self.FiLMLayer(a_  ,  a_		)

											# Self-attention block
											a__				      =		self.attention(a_		)

											a__				      =		hidden_states + self.dropout(a_		)

											return hidden_states




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def __init__(							self  ,  a_  ,  a_  ,  a_  ,  a_  ,  a_		):
											super().__init__()
											a__				      =		Attention(query_dim=a_  ,  heads=a_  ,  dim_head=a_  ,  out_bias=a_  ,  scale_qk=a_		)
											a__				      =		TaLayerNorm(a_  ,  eps=a_		)
											a__				      =		nn.Dropout(a_		)







							def _a      (							self  ,  a_  ,  a_=None  ,  a_=None  ,  ):
											a__				      =		self.layer_norm(a_		)
											a__				      =		self.attention(
											    a_  ,  encoder_hidden_states=a_  ,  attention_mask=attention_mask.squeeze(1		)  ,  )
											a__				      =		hidden_states + self.dropout(a_		)
											return layer_output




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def __init__(							self  ,  a_  ,  a_  ,  a_  ,  a_		):
											super().__init__()
											a__				      =		TaDenseGatedActDense(d_model=a_  ,  d_ff=a_  ,  dropout_rate=a_		)
											a__				      =		TaFiLMLayer(in_features=d_model * 4  ,  out_features=a_		)
											a__				      =		TaLayerNorm(a_  ,  eps=a_		)
											a__				      =		nn.Dropout(a_		)







							def _a      (							self  ,  a_  ,  a_=None		):
											a__				      =		self.layer_norm(a_		)
											if conditioning_emb is not None:
															a__				      =		self.film(a_  ,  a_		)

											a__				      =		self.DenseReluDense(a_		)
											a__				      =		hidden_states + self.dropout(a_		)
											return hidden_states




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def __init__(							self  ,  a_  ,  a_  ,  a_		):
											super().__init__()
											a__				      =		nn.Linear(a_  ,  a_  ,  bias=a_		)
											a__				      =		nn.Linear(a_  ,  a_  ,  bias=a_		)
											a__				      =		nn.Linear(a_  ,  a_  ,  bias=a_		)
											a__				      =		nn.Dropout(a_		)
											a__				      =		NewGELUActivation()







							def _a      (							self  ,  a_		):
											a__				      =		self.act(self.wi_a(a_		)		)
											a__				      =		self.wi_a(a_		)
											a__				      =		hidden_gelu * hidden_linear
											a__				      =		self.dropout(a_		)

											a__				      =		self.wo(a_		)
											return hidden_states




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def __init__(							self  ,  a_  ,  a_=1E-6		):
											super().__init__()
											a__				      =		nn.Parameter(torch.ones(a_		)		)
											a__				      =		eps







							def _a      (							self  ,  a_		):
											# T5 uses a layer_norm which only scales and doesn't shift, which is also known as Root Mean
											# Square Layer Normalization https://arxiv.org/abs/1910.07467 thus variance is calculated
											# w/o mean and there is no bias. Additionally we want to make sure that the accumulation for
											# half-precision inputs is done in fp32

											a__				      =		hidden_states.to(torch.floataa		).pow(2		).mean(-1  ,  keepdim=a_		)
											a__				      =		hidden_states * torch.rsqrt(variance + self.variance_epsilon		)

											# convert into half-precision if necessary
											if self.weight.dtype in [torch.floataa, torch.bfloataa]:
															a__				      =		hidden_states.to(self.weight.dtype		)

											return self.weight * hidden_states




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def _a      (							self  ,  a_		):
											return 0.5 * input * (1.0 + torch.tanh(math.sqrt(2.0 / math.pi		) * (input + 0.044_715 * torch.pow(a_  ,  3.0		))		))




class  __snake_case      (   nn.Module):







							'''simple docstring'''






							def __init__(							self  ,  a_  ,  a_		):
											super().__init__()
											a__				      =		nn.Linear(a_  ,  out_features * 2  ,  bias=a_		)







							def _a      (							self  ,  a_  ,  a_		):
											a__				      =		self.scale_bias(a_		)
											a__      ,			a__				      =		torch.chunk(a_  ,  2  ,  -1		)
											a__				      =		x * (1 + scale) + shift
											return x

