code: def init_attn(
      attn_type,
      query_dim,
      embedding_dim,
      attention_dim,
      location_attention,
      attention_location_n_filters,
      attention_location_kernel_size,
      windowing,
      norm,
      forward_attn,
      trans_agent,
      forward_attn_mask,
      attn_K,
  ):
      if attn_type == "original":
          return OriginalAttention(
              query_dim,
              embedding_dim,
              attention_dim,
              location_attention,
              attention_location_n_filters,
              attention_location_kernel_size,
              windowing,
              norm,
              forward_attn,
              trans_agent,
              forward_attn_mask,
          )
      if attn_type == "graves":
          return GravesAttention(query_dim, attn_K)
      if attn_type == "dynamic_convolution":
          return MonotonicDynamicConvolutionAttention(
              query_dim,
              embedding_dim,
              attention_dim,
              static_filter_dim=8,
              static_kernel_size=21,
              dynamic_filter_dim=8,
              dynamic_kernel_size=21,
              prior_filter_len=11,
              alpha=0.1,
              beta=0.9,
          )
  
      raise RuntimeError(
          f" [!] Given Attention Type '{attn_type}' is not exist."
      )
  
imports: import torch
  from scipy.stats import betabinom
  from torch import nn
  from torch.nn import functional
  from TTS.tts.layers.tacotron.common_layers import Linear
label_desc: Use image node_id 1 for calling a global function with example usage: init_attn(attn_type, query_dim, embedding_dim, attention_dim, location_attention, attention_location_n_filters, attention_location_kernel_size, windowing, norm, forward_attn, trans_agent, forward_attn_mask, attn_K) and returns: OriginalAttention, GravesAttention, MonotonicDynamicConvolutionAttention