

'''simple docstring'''



from collections import OrderedDict
from typing import Any, Mapping, Optional

from ... import PreTrainedTokenizer
from ...configuration_utils import PretrainedConfig
from ...file_utils import TensorType, is_torch_available
from ...onnx import OnnxConfig, OnnxConfigWithPast, OnnxSeqaSeqConfigWithPast
from ...onnx.utils import compute_effective_axis_dimension
from ...utils import logging


_UpperCamelCase						:  int							       =				logging.get_logger(__name__)

_UpperCamelCase						:  List[Any]							       =				{
    "facebook/blenderbot_small-90M": "https://huggingface.co/facebook/blenderbot_small-90M/resolve/main/config.json",
    # See all BlenderbotSmall models at https://huggingface.co/models?filter=blenderbot_small
}



class 				_snake_case					(   a_			):
  SCREAMING_SNAKE_CASE			:       Union[str, Any]				=     '''blenderbot-small'''
  SCREAMING_SNAKE_CASE			:       Optional[Any]				=     ['''past_key_values''']
  SCREAMING_SNAKE_CASE			:       List[Any]				=     {'''num_attention_heads''': '''encoder_attention_heads''', '''hidden_size''': '''d_model'''}

  def __init__(				self      , _SCREAMING_SNAKE_CASE=5_02_65      , _SCREAMING_SNAKE_CASE=5_12      , _SCREAMING_SNAKE_CASE=8      , _SCREAMING_SNAKE_CASE=20_48      , _SCREAMING_SNAKE_CASE=16      , _SCREAMING_SNAKE_CASE=8      , _SCREAMING_SNAKE_CASE=20_48      , _SCREAMING_SNAKE_CASE=16      , _SCREAMING_SNAKE_CASE=0.0      , _SCREAMING_SNAKE_CASE=0.0      , _SCREAMING_SNAKE_CASE=True      , _SCREAMING_SNAKE_CASE=True      , _SCREAMING_SNAKE_CASE="gelu"      , _SCREAMING_SNAKE_CASE=5_12      , _SCREAMING_SNAKE_CASE=0.1      , _SCREAMING_SNAKE_CASE=0.0      , _SCREAMING_SNAKE_CASE=0.0      , _SCREAMING_SNAKE_CASE=0.02      , _SCREAMING_SNAKE_CASE=1      , _SCREAMING_SNAKE_CASE=False      , _SCREAMING_SNAKE_CASE=0      , _SCREAMING_SNAKE_CASE=1      , _SCREAMING_SNAKE_CASE=2      , _SCREAMING_SNAKE_CASE=2      , **_SCREAMING_SNAKE_CASE      , ):





      '''simple docstring'''

      lowerCAmelCase 						=							vocab_size
      lowerCAmelCase 						=							max_position_embeddings
      lowerCAmelCase 						=							d_model
      lowerCAmelCase 						=							encoder_ffn_dim
      lowerCAmelCase 						=							encoder_layers
      lowerCAmelCase 						=							encoder_attention_heads
      lowerCAmelCase 						=							decoder_ffn_dim
      lowerCAmelCase 						=							decoder_layers
      lowerCAmelCase 						=							decoder_attention_heads
      lowerCAmelCase 						=							dropout
      lowerCAmelCase 						=							attention_dropout
      lowerCAmelCase 						=							activation_dropout
      lowerCAmelCase 						=							activation_function
      lowerCAmelCase 						=							init_std
      lowerCAmelCase 						=							encoder_layerdrop
      lowerCAmelCase 						=							decoder_layerdrop
      lowerCAmelCase 						=							use_cache
      lowerCAmelCase 						=							encoder_layers
      lowerCAmelCase 						=							scale_embedding  # scale factor will be sqrt(d_model) if True

      super().__init__(
          pad_token_id=_SCREAMING_SNAKE_CASE      , bos_token_id=_SCREAMING_SNAKE_CASE      , eos_token_id=_SCREAMING_SNAKE_CASE      , is_encoder_decoder=_SCREAMING_SNAKE_CASE      , decoder_start_token_id=_SCREAMING_SNAKE_CASE      , forced_eos_token_id=_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE      , )



class 				_snake_case					(   a_			):

  @property
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      if self.task in ["default", "seq2seq-lm"]:
          lowerCAmelCase 						=							OrderedDict(
              [
                  ('input_ids', {0: 'batch', 1: 'encoder_sequence'}),
                  ('attention_mask', {0: 'batch', 1: 'encoder_sequence'}),
              ]	)

          if self.use_past:
              lowerCAmelCase 						=							{0: 'batch'}
              lowerCAmelCase 						=							{0: 'batch', 1: 'past_decoder_sequence + sequence'}
          else:
              lowerCAmelCase 						=							{0: 'batch', 1: 'decoder_sequence'}
              lowerCAmelCase 						=							{0: 'batch', 1: 'decoder_sequence'}

          if self.use_past:
              self.fill_with_past_key_values_(_SCREAMING_SNAKE_CASE      , direction='inputs'	)
      elif self.task == "causal-lm":
          # TODO: figure this case out.
          lowerCAmelCase 						=							OrderedDict(
              [
                  ('input_ids', {0: 'batch', 1: 'encoder_sequence'}),
                  ('attention_mask', {0: 'batch', 1: 'encoder_sequence'}),
              ]	)
          if self.use_past:
              lowerCAmelCase						,   lowerCAmelCase 						=							self.num_layers
              for i in range(_SCREAMING_SNAKE_CASE	):
                  lowerCAmelCase 						=							{0: 'batch', 2: 'past_sequence + sequence'}
                  lowerCAmelCase 						=							{0: 'batch', 2: 'past_sequence + sequence'}
      else:
          lowerCAmelCase 						=							OrderedDict(
              [
                  ('input_ids', {0: 'batch', 1: 'encoder_sequence'}),
                  ('attention_mask', {0: 'batch', 1: 'encoder_sequence'}),
                  ('decoder_input_ids', {0: 'batch', 1: 'decoder_sequence'}),
                  ('decoder_attention_mask', {0: 'batch', 1: 'decoder_sequence'}),
              ]	)

      return common_inputs

  @property
  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      if self.task in ["default", "seq2seq-lm"]:
          lowerCAmelCase 						=							super().outputs
      else:
          lowerCAmelCase 						=							super(_SCREAMING_SNAKE_CASE      , self	).outputs
          if self.use_past:
              lowerCAmelCase						,   lowerCAmelCase 						=							self.num_layers
              for i in range(_SCREAMING_SNAKE_CASE	):
                  lowerCAmelCase 						=							{0: 'batch', 2: 'past_sequence + sequence'}
                  lowerCAmelCase 						=							{0: 'batch', 2: 'past_sequence + sequence'}
      return common_outputs

  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = False      , _SCREAMING_SNAKE_CASE = None      , ):





      '''simple docstring'''

      lowerCAmelCase 						=							self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
          _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)

      # Generate decoder inputs
      lowerCAmelCase 						=							seq_length if not self.use_past else 1
      lowerCAmelCase 						=							self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
          _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)
      lowerCAmelCase 						=							{F'decoder_{name}': tensor for name, tensor in decoder_inputs.items()}
      lowerCAmelCase 						=							dict(**_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	)

      if self.use_past:
          if not is_torch_available():
              raise ValueError('Cannot generate dummy past_keys inputs without PyTorch installed.'	)
          else:
              import torch
          lowerCAmelCase						,   lowerCAmelCase 						=							common_inputs['input_ids'].shape
          lowerCAmelCase 						=							common_inputs['decoder_input_ids'].shape[1]
          lowerCAmelCase						,   lowerCAmelCase 						=							self.num_attention_heads
          lowerCAmelCase 						=							(
              batch,
              num_encoder_attention_heads,
              encoder_seq_length,
              self._config.hidden_size // num_encoder_attention_heads,
          )
          lowerCAmelCase 						=							decoder_seq_length + 3
          lowerCAmelCase 						=							(
              batch,
              num_decoder_attention_heads,
              decoder_past_length,
              self._config.hidden_size // num_decoder_attention_heads,
          )

          lowerCAmelCase 						=							torch.cat(
              [common_inputs['decoder_attention_mask'], torch.ones(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)]      , dim=1	)

          lowerCAmelCase 						=							[]
          # If the number of encoder and decoder layers are present in the model configuration, both are considered
          lowerCAmelCase						,   lowerCAmelCase 						=							self.num_layers
          lowerCAmelCase 						=							min(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)
          lowerCAmelCase 						=							max(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	) - min_num_layers
          lowerCAmelCase 						=							'encoder' if num_encoder_layers > num_decoder_layers else 'decoder'

          for _ in range(_SCREAMING_SNAKE_CASE	):
              common_inputs["past_key_values"].append(
                  (
                      torch.zeros(_SCREAMING_SNAKE_CASE	),
                      torch.zeros(_SCREAMING_SNAKE_CASE	),
                      torch.zeros(_SCREAMING_SNAKE_CASE	),
                      torch.zeros(_SCREAMING_SNAKE_CASE	),
                  )	)
          # TODO: test this.
          lowerCAmelCase 						=							encoder_shape if remaining_side_name == 'encoder' else decoder_shape
          for _ in range(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	):
              common_inputs["past_key_values"].append((torch.zeros(_SCREAMING_SNAKE_CASE	), torch.zeros(_SCREAMING_SNAKE_CASE	))	)
      return common_inputs

  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = False      , _SCREAMING_SNAKE_CASE = None      , ):





      '''simple docstring'''

      lowerCAmelCase 						=							self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
          _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)

      if self.use_past:
          if not is_torch_available():
              raise ValueError('Cannot generate dummy past_keys inputs without PyTorch installed.'	)
          else:
              import torch
          lowerCAmelCase						,   lowerCAmelCase 						=							common_inputs['input_ids'].shape
          # Not using the same length for past_key_values
          lowerCAmelCase 						=							seqlen + 2
          lowerCAmelCase						,   lowerCAmelCase 						=							self.num_layers
          lowerCAmelCase						,   lowerCAmelCase 						=							self.num_attention_heads
          lowerCAmelCase 						=							(
              batch,
              num_encoder_attention_heads,
              past_key_values_length,
              self._config.hidden_size // num_encoder_attention_heads,
          )

          lowerCAmelCase 						=							common_inputs['attention_mask'].dtype
          lowerCAmelCase 						=							torch.cat(
              [common_inputs['attention_mask'], torch.ones(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , dtype=_SCREAMING_SNAKE_CASE	)]      , dim=1	)
          lowerCAmelCase 						=							[
              (torch.zeros(_SCREAMING_SNAKE_CASE	), torch.zeros(_SCREAMING_SNAKE_CASE	)) for _ in range(_SCREAMING_SNAKE_CASE	)
          ]
      return common_inputs

  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = False      , _SCREAMING_SNAKE_CASE = None      , ):





      '''simple docstring'''

      lowerCAmelCase 						=							compute_effective_axis_dimension(
          _SCREAMING_SNAKE_CASE      , fixed_dimension=OnnxConfig.default_fixed_batch      , num_token_to_add=0	)

      # If dynamic axis (-1) we forward with a fixed dimension of 8 tokens to avoid optimizations made by ONNX
      lowerCAmelCase 						=							tokenizer.num_special_tokens_to_add(_SCREAMING_SNAKE_CASE	)
      lowerCAmelCase 						=							compute_effective_axis_dimension(
          _SCREAMING_SNAKE_CASE      , fixed_dimension=OnnxConfig.default_fixed_sequence      , num_token_to_add=_SCREAMING_SNAKE_CASE	)

      # Generate dummy inputs according to compute batch and sequence
      lowerCAmelCase 						=							[' '.join([tokenizer.unk_token]	) * seq_length] * batch_size
      lowerCAmelCase 						=							dict(tokenizer(_SCREAMING_SNAKE_CASE      , return_tensors=_SCREAMING_SNAKE_CASE	)	)
      return common_inputs

  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = -1      , _SCREAMING_SNAKE_CASE = False      , _SCREAMING_SNAKE_CASE = None      , ):





      '''simple docstring'''

      if self.task in ["default", "seq2seq-lm"]:
          lowerCAmelCase 						=							self._generate_dummy_inputs_for_default_and_seqaseq_lm(
              _SCREAMING_SNAKE_CASE      , batch_size=_SCREAMING_SNAKE_CASE      , seq_length=_SCREAMING_SNAKE_CASE      , is_pair=_SCREAMING_SNAKE_CASE      , framework=_SCREAMING_SNAKE_CASE	)

      elif self.task == "causal-lm":
          lowerCAmelCase 						=							self._generate_dummy_inputs_for_causal_lm(
              _SCREAMING_SNAKE_CASE      , batch_size=_SCREAMING_SNAKE_CASE      , seq_length=_SCREAMING_SNAKE_CASE      , is_pair=_SCREAMING_SNAKE_CASE      , framework=_SCREAMING_SNAKE_CASE	)
      else:
          lowerCAmelCase 						=							self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
              _SCREAMING_SNAKE_CASE      , batch_size=_SCREAMING_SNAKE_CASE      , seq_length=_SCREAMING_SNAKE_CASE      , is_pair=_SCREAMING_SNAKE_CASE      , framework=_SCREAMING_SNAKE_CASE	)

      return common_inputs


  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      if self.task in ["default", "seq2seq-lm"]:
          lowerCAmelCase 						=							super()._flatten_past_key_values_(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)
      else:
          lowerCAmelCase 						=							super(_SCREAMING_SNAKE_CASE      , self	)._flatten_past_key_values_(
              _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)








'''simple docstring'''



from ..utils import DummyObject, requires_backends



class 				_snake_case					(   metaclass=a_			):
  SCREAMING_SNAKE_CASE			:       int				=     ['''torch''', '''transformers''', '''onnx''']

  def __init__(				self      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(self      , ['torch', 'transformers', 'onnx']	)

  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)


  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)



class 				_snake_case					(   metaclass=a_			):
  SCREAMING_SNAKE_CASE			:       List[Any]				=     ['''torch''', '''transformers''', '''onnx''']

  def __init__(				self      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(self      , ['torch', 'transformers', 'onnx']	)

  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)


  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)



class 				_snake_case					(   metaclass=a_			):
  SCREAMING_SNAKE_CASE			:       int				=     ['''torch''', '''transformers''', '''onnx''']

  def __init__(				self      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(self      , ['torch', 'transformers', 'onnx']	)

  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)


  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)



class 				_snake_case					(   metaclass=a_			):
  SCREAMING_SNAKE_CASE			:       Dict				=     ['''torch''', '''transformers''', '''onnx''']

  def __init__(				self      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(self      , ['torch', 'transformers', 'onnx']	)

  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)


  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)



class 				_snake_case					(   metaclass=a_			):
  SCREAMING_SNAKE_CASE			:       List[Any]				=     ['''torch''', '''transformers''', '''onnx''']

  def __init__(				self      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(self      , ['torch', 'transformers', 'onnx']	)

  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)


  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)



class 				_snake_case					(   metaclass=a_			):
  SCREAMING_SNAKE_CASE			:       Optional[Any]				=     ['''torch''', '''transformers''', '''onnx''']

  def __init__(				self      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(self      , ['torch', 'transformers', 'onnx']	)

  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)


  @classmethod
  def   _SCREAMING_SNAKE_CASE				(				cls      , *_SCREAMING_SNAKE_CASE      , **_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      requires_backends(cls      , ['torch', 'transformers', 'onnx']	)





