
class 		__magic_name__				:


  """simple docstring"""





  class 		__magic_name__				:


    """simple docstring"""





    _UpperCamelCase						 = "_prev", "_data", "_next"


    def __init__(					self	,		a__	,		a__	,		a__		):
      _lowerCamelCase      =						link_p
      _lowerCamelCase      =						element
      _lowerCamelCase      =						link_n


    def     _UpperCAmelCase  (					self		):
      return (
          f''' Prev -> {self._prev is not None}, Next -> {self._next is not None}'''
      )







  def __init__(					self		):
    _lowerCamelCase      =						self._Node(a__	,		a__	,		a__		)
    _lowerCamelCase      =						self._Node(a__	,		a__	,		a__		)
    _lowerCamelCase      =						self._trailer
    _lowerCamelCase      =						self._header
    _lowerCamelCase      =						0


  def __len__(					self		):
    return self._size


  def     _UpperCAmelCase  (					self		):
    return self.__len__() == 0


  def     _UpperCAmelCase  (					self	,		a__	,		a__	,		a__		):
    # Create new_node by setting it's prev.link -> header
    # setting it's next.link -> trailer
    _lowerCamelCase      =						self._Node(a__	,		a__	,		a__		)
    _lowerCamelCase      =						new_node
    _lowerCamelCase      =						new_node
    self._size += 1
    return self


  def     _UpperCAmelCase  (					self	,		a__		):
    _lowerCamelCase      =						node._prev
    _lowerCamelCase      =						node._next

    _lowerCamelCase      =						successor
    _lowerCamelCase      =						predecessor
    self._size -= 1
    _lowerCamelCase      =						node._data
    _lowerCamelCase      =						_lowerCamelCase      =						_lowerCamelCase      =						None
    del node
    return temp







class 		__magic_name__				( _DoublyLinkedBase					):


  """simple docstring"""





  def     _UpperCAmelCase  (					self		):
    if self.is_empty():
      raise Exception('''List is empty'''		)
    return self._header._next._data


  def     _UpperCAmelCase  (					self		):
    if self.is_empty():
      raise Exception('''List is empty'''		)
    return self._trailer._prev._data


  def     _UpperCAmelCase  (					self	,		a__		):
    return self._insert(self._header	,		a__	,		self._header._next		)


  def     _UpperCAmelCase  (					self	,		a__		):
    return self._insert(self._trailer._prev	,		a__	,		self._trailer		)


  def     _UpperCAmelCase  (					self		):
    if self.is_empty():
      raise IndexError('''remove_first from empty list'''		)
    return self._delete(self._header._next		)


  def     _UpperCAmelCase  (					self		):
    if self.is_empty():
      raise IndexError('''remove_first from empty list'''		)
    return self._delete(self._trailer._prev		)






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

from ... import PreTrainedTokenizer, TensorType, is_torch_available
from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfigWithPast, PatchingSpec
from ...utils import logging


_UpperCAmelCase    			=					logging.get_logger(__name__)

_UpperCAmelCase    			=					{
    "gpt2": "https://huggingface.co/gpt2/resolve/main/config.json",
    "gpt2-medium": "https://huggingface.co/gpt2-medium/resolve/main/config.json",
    "gpt2-large": "https://huggingface.co/gpt2-large/resolve/main/config.json",
    "gpt2-xl": "https://huggingface.co/gpt2-xl/resolve/main/config.json",
    "distilgpt2": "https://huggingface.co/distilgpt2/resolve/main/config.json",
}

class 		__magic_name__				( lowercase_					):


  """simple docstring"""





  _UpperCamelCase						 = "gpt2"
  _UpperCamelCase						 = ["past_key_values"]
  _UpperCamelCase						 = {
      "hidden_size": "n_embd",
      "max_position_embeddings": "n_positions",
      "num_attention_heads": "n_head",
      "num_hidden_layers": "n_layer",
  }


  def __init__(					self	,		a__=5_02_57	,		a__=10_24	,		a__=7_68	,		a__=12	,		a__=12	,		a__=None	,		a__="gelu_new"	,		a__=0.1	,		a__=0.1	,		a__=0.1	,		a__=1E-5	,		a__=0.02	,		a__="cls_index"	,		a__=True	,		a__=None	,		a__=True	,		a__=0.1	,		a__=True	,		a__=True	,		a__=5_02_56	,		a__=5_02_56	,		a__=False	,		a__=False	,		**a__	,		):
    _lowerCamelCase      =						vocab_size
    _lowerCamelCase      =						n_positions
    _lowerCamelCase      =						n_embd
    _lowerCamelCase      =						n_layer
    _lowerCamelCase      =						n_head
    _lowerCamelCase      =						n_inner
    _lowerCamelCase      =						activation_function
    _lowerCamelCase      =						resid_pdrop
    _lowerCamelCase      =						embd_pdrop
    _lowerCamelCase      =						attn_pdrop
    _lowerCamelCase      =						layer_norm_epsilon
    _lowerCamelCase      =						initializer_range
    _lowerCamelCase      =						summary_type
    _lowerCamelCase      =						summary_use_proj
    _lowerCamelCase      =						summary_activation
    _lowerCamelCase      =						summary_first_dropout
    _lowerCamelCase      =						summary_proj_to_labels
    _lowerCamelCase      =						scale_attn_weights
    _lowerCamelCase      =						use_cache
    _lowerCamelCase      =						scale_attn_by_inverse_layer_idx
    _lowerCamelCase      =						reorder_and_upcast_attn

    _lowerCamelCase      =						bos_token_id
    _lowerCamelCase      =						eos_token_id

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







class 		__magic_name__				( lowercase_					):


  """simple docstring"""





  def __init__(					self	,		a__	,		a__ = "default"	,		a__ = None	,		a__ = False	,		):
    super().__init__(a__	,		task=a__	,		patching_specs=a__	,		use_past=a__		)
    if not getattr(self._config	,		'''pad_token_id'''	,		a__		):
      # TODO: how to do that better?
      _lowerCamelCase      =						0


  @property
  def     _UpperCAmelCase  (					self		):
    _lowerCamelCase      =						OrderedDict({'''input_ids''': {0: '''batch''', 1: '''sequence'''}}		)
    if self.use_past:
      self.fill_with_past_key_values_(a__	,		direction='''inputs'''		)
      _lowerCamelCase      =						{0: '''batch''', 1: '''past_sequence + sequence'''}
    else:
      _lowerCamelCase      =						{0: '''batch''', 1: '''sequence'''}

    return common_inputs


  @property
  def     _UpperCAmelCase  (					self		):
    return self._config.n_layer


  @property
  def     _UpperCAmelCase  (					self		):
    return self._config.n_head


  def     _UpperCAmelCase  (					self	,		a__	,		a__ = -1	,		a__ = -1	,		a__ = False	,		a__ = None	,		):
    _lowerCamelCase      =						super(a__	,		self		).generate_dummy_inputs(
        a__	,		batch_size=a__	,		seq_length=a__	,		is_pair=a__	,		framework=a__		)

    # We need to order the input in the way they appears in the forward()
    _lowerCamelCase      =						OrderedDict({'''input_ids''': common_inputs['''input_ids''']}		)

    # Need to add the past_keys
    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      =						(
            batch,
            self.num_attention_heads,
            past_key_values_length,
            self._config.hidden_size // self.num_attention_heads,
        )
        _lowerCamelCase      =						[
            (torch.zeros(a__		), torch.zeros(a__		)) for _ in range(self.num_layers		)
        ]

    _lowerCamelCase      =						common_inputs['''attention_mask''']
    if self.use_past:
      _lowerCamelCase      =						ordered_inputs['''attention_mask'''].dtype
      _lowerCamelCase      =						torch.cat(
          [ordered_inputs['''attention_mask'''], torch.ones(a__	,		a__	,		dtype=a__		)]	,		dim=1		)

    return ordered_inputs


  @property
  def     _UpperCAmelCase  (					self		):
    return 13




