


'''simple docstring'''



from typing import List

import jiwer
import jiwer.transforms as tr
from packaging import version

import datasets
from datasets.config import PY_VERSION


if PY_VERSION < version.parse("3.8"):
      import importlib_metadata
else:
      import importlib.metadata as importlib_metadata


__UpperCAmelCase      :Union[str, Any]			    =       ""


if version.parse(importlib_metadata.version("jiwer")) < version.parse("2.3.0"):



      class      a    (		tr.AbstractTransform	):


           """simple docstring"""






           def __init__(    self					:		Tuple							,			snake_case					:		str = " "      )						->							Optional[int]:
                __UpperCAmelCase     :			Optional[Any]  							=      sentence_delimiter

           def 			lowerCamelCase__			(    self					:		int							,			snake_case					:		str      )						->							Optional[int]:
                return list(snake_case      )






           def 			lowerCamelCase__			(    self					:		Any							,			snake_case					:		List[str]      )						->							Optional[Any]:
                __UpperCAmelCase     :			List[Any]  							=      []
                for sent_idx, sentence in enumerate(snake_case      ):
                     chars.extend(self.process_string(snake_case      )      )
                     if self.sentence_delimiter is not None and self.sentence_delimiter != "" and sent_idx < len(snake_case      ) - 1:
                          chars.append(self.sentence_delimiter      )
                return chars



      __UpperCAmelCase      :int			    =       tr.Compose(
          [tr.RemoveMultipleSpaces(), tr.Strip(), SentencesToListOfCharacters(SENTENCE_DELIMITER)]
      )
else:
      __UpperCAmelCase      :int			    =       tr.Compose(
          [
              tr.RemoveMultipleSpaces(),
              tr.Strip(),
              tr.ReduceToSingleSentence(SENTENCE_DELIMITER),
              tr.ReduceToListOfListOfChars(),
          ]
      )


__UpperCAmelCase      :List[Any]			    =       "\\n@inproceedings{inproceedings,\n    author = {Morris, Andrew and Maier, Viktoria and Green, Phil},\n    year = {2004},\n    month = {01},\n    pages = {},\n    title = {From WER and RIL to MER and WIL: improved evaluation measures for connected speech recognition.}\n}\n"

__UpperCAmelCase      :Union[str, Any]			    =       "\\nCharacter error rate (CER) is a common metric of the performance of an automatic speech recognition system.\n\nCER is similar to Word Error Rate (WER), but operates on character instead of word. Please refer to docs of WER for further information.\n\nCharacter error rate can be computed as:\n\nCER = (S + D + I) / N = (S + D + I) / (S + D + C)\n\nwhere\n\nS is the number of substitutions,\nD is the number of deletions,\nI is the number of insertions,\nC is the number of correct characters,\nN is the number of characters in the reference (N=S+D+C).\n\nCER's output is not always a number between 0 and 1, in particular when there is a high number of insertions. This value is often associated to the percentage of characters that were incorrectly predicted. The lower the value, the better the\nperformance of the ASR system with a CER of 0 being a perfect score.\n"

__UpperCAmelCase      :Union[str, Any]			    =       "\nComputes CER score of transcribed segments against references.\nArgs:\n    references: list of references for each speech input.\n    predictions: list of transcribtions to score.\n    concatenate_texts: Whether or not to concatenate sentences before evaluation, set to True for more accurate result.\nReturns:\n    (float): the character error rate\n\nExamples:\n\n    >>> predictions = [\"this is the prediction\", \"there is an other sample\"]\n    >>> references = [\"this is the reference\", \"there is another one\"]\n    >>> cer = datasets.load_metric(\"cer\")\n    >>> cer_score = cer.compute(predictions=predictions, references=references)\n    >>> print(cer_score)\n    0.34146341463414637\n"



@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION     ,  _KWARGS_DESCRIPTION	)
class      a    (		datasets.Metric	):


     """simple docstring"""






     def 			lowerCamelCase__			(    self					:		Tuple      )						->							Dict:
          return datasets.MetricInfo(
              description=_DESCRIPTION							,			citation=_CITATION							,			inputs_description=_KWARGS_DESCRIPTION							,			features=datasets.Features(
                  {
                      '''predictions''': datasets.Value('''string'''							,			id='''sequence'''      ),
                      '''references''': datasets.Value('''string'''							,			id='''sequence'''      ),
                  }      )							,			codebase_urls=['''https://github.com/jitsi/jiwer/''']							,			reference_urls=[
                  '''https://en.wikipedia.org/wiki/Word_error_rate''',
                  '''https://sites.google.com/site/textdigitisation/qualitymeasures/computingerrorrates''',
              ]							,			)






     def 			lowerCamelCase__			(    self					:		Optional[Any]							,			snake_case					:		List[str]							,			snake_case					:		Dict							,			snake_case					:		str=False      )						->							str:
          if concatenate_texts:
               return jiwer.compute_measures(
                   snake_case							,			snake_case							,			truth_transform=snake_case							,			hypothesis_transform=snake_case							,			)["wer"]

          __UpperCAmelCase     :			Optional[int]  							=      0
          __UpperCAmelCase     :			Tuple  							=      0
          for prediction, reference in zip(snake_case							,			snake_case      ):
               __UpperCAmelCase     :			str  							=      jiwer.compute_measures(
                   snake_case							,			snake_case							,			truth_transform=snake_case							,			hypothesis_transform=snake_case							,			)
               incorrect += measures["substitutions"] + measures["deletions"] + measures["insertions"]
               total += measures["substitutions"] + measures["deletions"] + measures["hits"]

          return incorrect / total



'''simple docstring'''



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      a    (		_a	):


     """simple docstring"""






     SCREAMING_SNAKE_CASE	:			torch.FloatTensor



class      a    (		_a     ,  _a	):


     """simple docstring"""






     @register_to_config
     def __init__(    self					:		str							,			snake_case					:		int = 32							,			snake_case					:		int = 64							,			snake_case					:		int = 20							,			snake_case					:		int = 768							,			snake_case					:		Tuple=77							,			snake_case					:		List[Any]=4							,			snake_case					:		float = 0.0							,			snake_case					:		str = "silu"							,			snake_case					:		Optional[str] = None							,			snake_case					:		Optional[str] = None							,			snake_case					:		Optional[str] = "linear"							,			snake_case					:		Optional[str] = "prd"							,			snake_case					:		Optional[int] = None							,			snake_case					:		Optional[int] = None							,			snake_case					:		Optional[int] = None							,			)						->							List[str]:
          super().__init__()
          __UpperCAmelCase     :			List[Any]  							=      num_attention_heads
          __UpperCAmelCase     :			List[str]  							=      attention_head_dim
          __UpperCAmelCase     :			int  							=      num_attention_heads * attention_head_dim
          __UpperCAmelCase     :			List[Any]  							=      additional_embeddings

          __UpperCAmelCase     :			Any  							=      time_embed_dim or inner_dim
          __UpperCAmelCase     :			Any  							=      embedding_proj_dim or embedding_dim
          __UpperCAmelCase     :			Union[str, Any]  							=      clip_embed_dim or embedding_dim

          __UpperCAmelCase     :			List[Any]  							=      Timesteps(snake_case							,			snake_case							,			0      )
          __UpperCAmelCase     :			Optional[Any]  							=      TimestepEmbedding(snake_case							,			snake_case							,			out_dim=snake_case							,			act_fn=snake_case      )

          __UpperCAmelCase     :			str  							=      nn.Linear(snake_case							,			snake_case      )

          if embedding_proj_norm_type is None:
               __UpperCAmelCase     :			str  							=      None
          elif embedding_proj_norm_type == "layer":
               __UpperCAmelCase     :			str  							=      nn.LayerNorm(snake_case      )
          else:
               raise ValueError(f'unsupported embedding_proj_norm_type: {embedding_proj_norm_type}'      )

          __UpperCAmelCase     :			List[Any]  							=      nn.Linear(snake_case							,			snake_case      )

          if encoder_hid_proj_type is None:
               __UpperCAmelCase     :			Union[str, Any]  							=      None
          elif encoder_hid_proj_type == "linear":
               __UpperCAmelCase     :			Any  							=      nn.Linear(snake_case							,			snake_case      )
          else:
               raise ValueError(f'unsupported encoder_hid_proj_type: {encoder_hid_proj_type}'      )

          __UpperCAmelCase     :			Dict  							=      nn.Parameter(torch.zeros(1							,			num_embeddings + additional_embeddings							,			snake_case      )      )

          if added_emb_type == "prd":
               __UpperCAmelCase     :			Any  							=      nn.Parameter(torch.zeros(1							,			1							,			snake_case      )      )
          elif added_emb_type is None:
               __UpperCAmelCase     :			List[Any]  							=      None
          else:
               raise ValueError(
                   f'`added_emb_type`: {added_emb_type} is not supported. Make sure to choose one of `\'prd\'` or `None`.'      )

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

          if norm_in_type == "layer":
               __UpperCAmelCase     :			Tuple  							=      nn.LayerNorm(snake_case      )
          elif norm_in_type is None:
               __UpperCAmelCase     :			List[Any]  							=      None
          else:
               raise ValueError(f'Unsupported norm_in_type: {norm_in_type}.'      )

          __UpperCAmelCase     :			Dict  							=      nn.LayerNorm(snake_case      )

          __UpperCAmelCase     :			Any  							=      nn.Linear(snake_case							,			snake_case      )

          __UpperCAmelCase     :			Any  							=      torch.full(
              [num_embeddings + additional_embeddings, num_embeddings + additional_embeddings]							,			-10_000.0      )
          causal_attention_mask.triu_(1      )
          __UpperCAmelCase     :			str  							=      causal_attention_mask[None, ...]
          self.register_buffer('''causal_attention_mask'''							,			snake_case							,			persistent=snake_case      )

          __UpperCAmelCase     :			Tuple  							=      nn.Parameter(torch.zeros(1							,			snake_case      )      )
          __UpperCAmelCase     :			List[str]  							=      nn.Parameter(torch.zeros(1							,			snake_case      )      )

     @property
     # Copied from diffusers.models.unet_2d_condition.UNet2DConditionModel.attn_processors
     def 			lowerCamelCase__			(    self					:		int      )						->							Dict[str, AttentionProcessor]:
          __UpperCAmelCase     :			Optional[Any]  							=      {}

          def fn_recursive_add_processors(snake_case					:		str							,			snake_case					:		torch.nn.Module							,			snake_case					:		Dict[str, AttentionProcessor]      ):
               if hasattr(snake_case							,			'''set_processor'''      ):
                    __UpperCAmelCase     :			Union[str, Any]  							=      module.processor

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

               return processors

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

          return processors

     def 			lowerCamelCase__			(    self					:		Optional[Any]							,			snake_case					:		Union[AttentionProcessor, Dict[str, AttentionProcessor]]      )						->							Union[str, Any]:
          __UpperCAmelCase     :			Union[str, Any]  							=      len(self.attn_processors.keys()      )

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

          def fn_recursive_attn_processor(snake_case					:		str							,			snake_case					:		torch.nn.Module							,			snake_case					:		int      ):
               if hasattr(snake_case							,			'''set_processor'''      ):
                    if not isinstance(snake_case							,			snake_case      ):
                         module.set_processor(snake_case      )
                    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}'							,			snake_case							,			snake_case      )

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

     def 			lowerCamelCase__			(    self					:		str      )						->							Tuple:
          self.set_attn_processor(AttnProcessor()      )

     def 			lowerCamelCase__			(    self					:		Optional[Any]							,			snake_case					:		List[Any]							,			snake_case					:		Union[torch.Tensor, float, int]							,			snake_case					:		torch.FloatTensor							,			snake_case					:		Optional[torch.FloatTensor] = None							,			snake_case					:		Optional[torch.BoolTensor] = None							,			snake_case					:		bool = True							,			)						->							List[Any]:
          __UpperCAmelCase     :			Any  							=      hidden_states.shape[0]

          __UpperCAmelCase     :			Optional[int]  							=      timestep
          if not torch.is_tensor(snake_case      ):
               __UpperCAmelCase     :			str  							=      torch.tensor([timesteps]							,			dtype=torch.long							,			device=hidden_states.device      )
          elif torch.is_tensor(snake_case      ) and len(timesteps.shape      ) == 0:
               __UpperCAmelCase     :			Any  							=      timesteps[None].to(hidden_states.device      )

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

          __UpperCAmelCase     :			Tuple  							=      self.time_proj(snake_case      )

          # timesteps does not contain any weights and will always return f32 tensors
          # but time_embedding might be fp16, so we need to cast here.
          __UpperCAmelCase     :			int  							=      timesteps_projected.to(dtype=self.dtype      )
          __UpperCAmelCase     :			Optional[int]  							=      self.time_embedding(snake_case      )

          if self.embedding_proj_norm is not None:
               __UpperCAmelCase     :			Optional[Any]  							=      self.embedding_proj_norm(snake_case      )

          __UpperCAmelCase     :			str  							=      self.embedding_proj(snake_case      )
          if self.encoder_hidden_states_proj is not None and encoder_hidden_states is not None:
               __UpperCAmelCase     :			Dict  							=      self.encoder_hidden_states_proj(snake_case      )
          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'''      )

          __UpperCAmelCase     :			Optional[int]  							=      self.proj_in(snake_case      )

          __UpperCAmelCase     :			Optional[Any]  							=      self.positional_embedding.to(hidden_states.dtype      )

          __UpperCAmelCase     :			Union[str, Any]  							=      []
          __UpperCAmelCase     :			Optional[Any]  							=      0

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

          if len(proj_embeddings.shape      ) == 2:
               __UpperCAmelCase     :			Optional[int]  							=      proj_embeddings[:, None, :]

          if len(hidden_states.shape      ) == 2:
               __UpperCAmelCase     :			Union[str, Any]  							=      hidden_states[:, None, :]

          __UpperCAmelCase     :			Union[str, Any]  							=      additional_embeds + [
              proj_embeddings,
              time_embeddings[:, None, :],
              hidden_states,
          ]

          if self.prd_embedding is not None:
               __UpperCAmelCase     :			Any  							=      self.prd_embedding.to(hidden_states.dtype      ).expand(snake_case							,			-1							,			-1      )
               additional_embeds.append(snake_case      )

          __UpperCAmelCase     :			Dict  							=      torch.cat(
              snake_case							,			dim=1							,			)

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

          __UpperCAmelCase     :			Optional[int]  							=      hidden_states + positional_embeddings

          if attention_mask is not None:
               __UpperCAmelCase     :			List[Any]  							=      (1 - attention_mask.to(hidden_states.dtype      )) * -10_000.0
               __UpperCAmelCase     :			str  							=      F.pad(snake_case							,			(0, self.additional_embeddings)							,			value=0.0      )
               __UpperCAmelCase     :			Optional[int]  							=      (attention_mask[:, None, :] + self.causal_attention_mask).to(hidden_states.dtype      )
               __UpperCAmelCase     :			Optional[int]  							=      attention_mask.repeat_interleave(self.config.num_attention_heads							,			dim=0      )

          if self.norm_in is not None:
               __UpperCAmelCase     :			str  							=      self.norm_in(snake_case      )

          for block in self.transformer_blocks:
               __UpperCAmelCase     :			Optional[int]  							=      block(snake_case							,			attention_mask=snake_case      )

          __UpperCAmelCase     :			int  							=      self.norm_out(snake_case      )

          if self.prd_embedding is not None:
               __UpperCAmelCase     :			Optional[int]  							=      hidden_states[:, -1]
          else:
               __UpperCAmelCase     :			List[Any]  							=      hidden_states[:, additional_embeddings_len:]

          __UpperCAmelCase     :			Dict  							=      self.proj_to_clip_embeddings(snake_case      )

          if not return_dict:
               return (predicted_image_embedding,)

          return PriorTransformerOutput(predicted_image_embedding=snake_case      )






     def 			lowerCamelCase__			(    self					:		Optional[int]							,			snake_case					:		List[str]      )						->							str:
          __UpperCAmelCase     :			Dict  							=      (prior_latents * self.clip_std) + self.clip_mean
          return prior_latents