




import functools
from contextlib import contextmanager

import bert_score
from packaging import version

import datasets


@contextmanager
def   A		()  -> Dict:







     """simple docstring"""


     def filter_log(__A  :       str			):
          return False if "This IS expected if you are initializing" in record.msg else True

     UpperCAmelCase_		=				datasets.utils.logging.get_logger('''transformers.modeling_utils'''			)
     logger.addFilter(__A			)
     try:
          yield
     finally:
          logger.removeFilter(__A			)


snake_case_					:					Dict       						=			'\\n@inproceedings{bert-score,\n  title={BERTScore: Evaluating Text Generation with BERT},\n  author={Tianyi Zhang* and Varsha Kishore* and Felix Wu* and Kilian Q. Weinberger and Yoav Artzi},\n  booktitle={International Conference on Learning Representations},\n  year={2020},\n  url={https://openreview.net/forum?id=SkeHuCVFDr}\n}\n'

snake_case_					:					List[Any]       						=			'\\nBERTScore leverages the pre-trained contextual embeddings from BERT and matches words in candidate and reference\nsentences by cosine similarity.\nIt has been shown to correlate with human judgment on sentence-level and system-level evaluation.\nMoreover, BERTScore computes precision, recall, and F1 measure, which can be useful for evaluating different language\ngeneration tasks.\n\nSee the project\'s README at https://github.com/Tiiiger/bert_score#readme for more information.\n'

snake_case_					:					Optional[Any]       						=			'\nBERTScore Metrics with the hashcode from a source against one or more references.\n\nArgs:\n    predictions (list of str): Prediction/candidate sentences.\n    references (list of str or list of list of str): Reference sentences.\n    lang (str): Language of the sentences; required (e.g. \'en\').\n    model_type (str): Bert specification, default using the suggested\n        model for the target language; has to specify at least one of\n        `model_type` or `lang`.\n    num_layers (int): The layer of representation to use,\n        default using the number of layers tuned on WMT16 correlation data.\n    verbose (bool): Turn on intermediate status update.\n    idf (bool or dict): Use idf weighting; can also be a precomputed idf_dict.\n    device (str): On which the contextual embedding model will be allocated on.\n        If this argument is None, the model lives on cuda:0 if cuda is available.\n    nthreads (int): Number of threads.\n    batch_size (int): Bert score processing batch size,\n        at least one of `model_type` or `lang`. `lang` needs to be\n        specified when `rescale_with_baseline` is True.\n    rescale_with_baseline (bool): Rescale bertscore with pre-computed baseline.\n    baseline_path (str): Customized baseline file.\n    use_fast_tokenizer (bool): `use_fast` parameter passed to HF tokenizer. New in version 0.3.10.\n\nReturns:\n    precision: Precision.\n    recall: Recall.\n    f1: F1 score.\n    hashcode: Hashcode of the library.\n\nExamples:\n\n    >>> predictions = ["hello there", "general kenobi"]\n    >>> references = ["hello there", "general kenobi"]\n    >>> bertscore = datasets.load_metric("bertscore")\n    >>> results = bertscore.compute(predictions=predictions, references=references, lang="en")\n    >>> print([round(v, 2) for v in results["f1"]])\n    [1.0, 1.0]\n'







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







   def lowerCamelCase		( self						:		str):

        """simple docstring"""


        return datasets.MetricInfo(
            description=_DESCRIPTION   ,		citation=_CITATION   ,		homepage='''https://github.com/Tiiiger/bert_score'''   ,		inputs_description=_KWARGS_DESCRIPTION   ,		features=datasets.Features(
                {
                    '''predictions''': datasets.Value('''string'''   ,		id='''sequence'''),
                    '''references''': datasets.Sequence(datasets.Value('''string'''   ,		id='''sequence''')   ,		id='''references'''),
                })   ,		codebase_urls=['''https://github.com/Tiiiger/bert_score''']   ,		reference_urls=[
                '''https://github.com/Tiiiger/bert_score''',
                '''https://arxiv.org/abs/1904.09675''',
            ]   ,		)







   def lowerCamelCase		( self						:		Optional[int]   ,		_snake_case						:		List[Any]   ,		_snake_case						:		int   ,		_snake_case						:		Optional[int]=None   ,		_snake_case						:		str=None   ,		_snake_case						:		Dict=None   ,		_snake_case						:		Optional[Any]=False   ,		_snake_case						:		List[Any]=False   ,		_snake_case						:		Optional[int]=None   ,		_snake_case						:		Optional[Any]=64   ,		_snake_case						:		int=4   ,		_snake_case						:		Tuple=False   ,		_snake_case						:		List[Any]=False   ,		_snake_case						:		Optional[Any]=None   ,		_snake_case						:		str=False   ,		):

        """simple docstring"""


        UpperCAmelCase_		=				bert_score.utils.get_hash
        UpperCAmelCase_		=				bert_score.BERTScorer

        if version.parse(bert_score.__version__) >= version.parse('''0.3.10'''):
             UpperCAmelCase_		=				functools.partial(lowerCAmelCase_   ,		use_fast_tokenizer=lowerCAmelCase_)
             UpperCAmelCase_		=				functools.partial(lowerCAmelCase_   ,		use_fast_tokenizer=lowerCAmelCase_)
        elif use_fast_tokenizer:
             raise ImportWarning(
                 '''To use a fast tokenizer, the module `bert-score>=0.3.10` is required, and the current version of `bert-score` doesn\'t match this condition.\n'''
                 '''You can install it with `pip install "bert-score>=0.3.10"`.''')

        if model_type is None:
             assert lang is not None, "either lang or model_type should be specified"
             UpperCAmelCase_		=				bert_score.utils.langamodel[lang.lower()]

        if num_layers is None:
             UpperCAmelCase_		=				bert_score.utils.modelalayers[model_type]

        UpperCAmelCase_		=				get_hash(
            model=lowerCAmelCase_   ,		num_layers=lowerCAmelCase_   ,		idf=lowerCAmelCase_   ,		rescale_with_baseline=lowerCAmelCase_   ,		use_custom_baseline=baseline_path is not None   ,		)

        with filter_logging_context():
             if not hasattr(self   ,		'''cached_bertscorer''') or self.cached_bertscorer.hash != hashcode:
                  UpperCAmelCase_		=				scorer(
                      model_type=lowerCAmelCase_   ,		num_layers=lowerCAmelCase_   ,		batch_size=lowerCAmelCase_   ,		nthreads=lowerCAmelCase_   ,		all_layers=lowerCAmelCase_   ,		idf=lowerCAmelCase_   ,		device=lowerCAmelCase_   ,		lang=lowerCAmelCase_   ,		rescale_with_baseline=lowerCAmelCase_   ,		baseline_path=lowerCAmelCase_   ,		)

        (UpperCAmelCase_)		=				self.cached_bertscorer.score(
            cands=lowerCAmelCase_   ,		refs=lowerCAmelCase_   ,		verbose=lowerCAmelCase_   ,		batch_size=lowerCAmelCase_   ,		)
        UpperCAmelCase_		=				{
            '''precision''': P.tolist(),
            '''recall''': R.tolist(),
            '''f1''': F.tolist(),
            '''hashcode''': hashcode,
        }
        return output_dict







   def lowerCamelCase		( self						:		List[str]   ,		_snake_case						:		Optional[int]=None   ,		_snake_case						:		Any=None   ,		**_snake_case						:		List[Any]):

        """simple docstring"""


        if references is not None:
             UpperCAmelCase_		=				[[ref] if isinstance(lowerCAmelCase_   ,		lowerCAmelCase_) else ref for ref in references]
        super().add_batch(predictions=lowerCAmelCase_   ,		references=lowerCAmelCase_   ,		**lowerCAmelCase_)







   def lowerCamelCase		( self						:		Tuple   ,		_snake_case						:		Optional[int]=None   ,		_snake_case						:		List[str]=None   ,		**_snake_case						:		Optional[Any]):

        """simple docstring"""


        if isinstance(lowerCAmelCase_   ,		lowerCAmelCase_):
             UpperCAmelCase_		=				[reference]
        super().add(prediction=lowerCAmelCase_   ,		reference=lowerCAmelCase_   ,		**lowerCAmelCase_)








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__						:	Any	     = logging.get_logger(__name__)

UpperCAmelCase__						:	Optional[Any]	     = {
    'facebook/blenderbot-3B': 'https://huggingface.co/facebook/blenderbot-3B/resolve/main/config.json',
    # See all Blenderbot models at https://huggingface.co/models?filter=blenderbot
}






class UpperCAmelCase  (		SCREAMING_SNAKE_CASE__  ):





   '''simple docstring'''
   __UpperCamelCase						:       Optional[Any]												=       '''blenderbot'''
   __UpperCamelCase						:       Optional[int]												=       ['''past_key_values''']
   __UpperCamelCase						:       Union[str, Any]												=       {'''num_attention_heads''': '''encoder_attention_heads''', '''hidden_size''': '''d_model'''}


   def __init__(   self	:				Any     ,     lowerCAmelCase_	:				List[str]=8_0_0_8     ,     lowerCAmelCase_	:				Any=1_2_8     ,     lowerCAmelCase_	:				List[str]=2     ,     lowerCAmelCase_	:				Dict=1_0_2_4_0     ,     lowerCAmelCase_	:				Dict=3_2     ,     lowerCAmelCase_	:				Union[str, Any]=2_4     ,     lowerCAmelCase_	:				Union[str, Any]=1_0_2_4_0     ,     lowerCAmelCase_	:				Union[str, Any]=3_2     ,     lowerCAmelCase_	:				Optional[Any]=0.0     ,     lowerCAmelCase_	:				Optional[int]=0.0     ,     lowerCAmelCase_	:				Optional[int]=True     ,     lowerCAmelCase_	:				Optional[Any]=True     ,     lowerCAmelCase_	:				Union[str, Any]="gelu"     ,     lowerCAmelCase_	:				Optional[int]=2_5_6_0     ,     lowerCAmelCase_	:				List[str]=0.1     ,     lowerCAmelCase_	:				Any=0.0     ,     lowerCAmelCase_	:				Union[str, Any]=0.0     ,     lowerCAmelCase_	:				Any=0.02     ,     lowerCAmelCase_	:				List[Any]=1     ,     lowerCAmelCase_	:				List[str]=False     ,     lowerCAmelCase_	:				str=0     ,     lowerCAmelCase_	:				str=1     ,     lowerCAmelCase_	:				List[Any]=2     ,     lowerCAmelCase_	:				List[str]=3     ,     lowerCAmelCase_	:				int=2     ,     **lowerCAmelCase_	:				Tuple     ,     ):

      """simple docstring"""
      _A:    Any						     =			vocab_size
      _A:    Optional[int]						     =			max_position_embeddings
      _A:    int						     =			d_model
      _A:    Optional[int]						     =			encoder_ffn_dim
      _A:    Optional[int]						     =			encoder_layers
      _A:    int						     =			encoder_attention_heads
      _A:    Optional[Any]						     =			decoder_ffn_dim
      _A:    Dict						     =			decoder_layers
      _A:    int						     =			decoder_attention_heads
      _A:    List[str]						     =			dropout
      _A:    Union[str, Any]						     =			attention_dropout
      _A:    Tuple						     =			activation_dropout
      _A:    Dict						     =			activation_function
      _A:    Optional[Any]						     =			init_std
      _A:    Optional[int]						     =			encoder_layerdrop
      _A:    Any						     =			decoder_layerdrop
      _A:    List[str]						     =			use_cache
      _A:    Dict						     =			encoder_layers
      _A:    int						     =			scale_embedding  # scale factor will be sqrt(d_model) if True

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






class UpperCAmelCase  (		SCREAMING_SNAKE_CASE__  ):





   '''simple docstring'''


   @property
   def 					__magic_name__							(   self	:				Any	):

      """simple docstring"""
      if self.task in ["default", "seq2seq-lm"]:
         _A:    Union[str, Any]						     =			OrderedDict(
             [
                 ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
                 ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
             ]	)
         if self.use_past:
            _A:    int						     =			{0: '''batch'''}
            _A:    Optional[int]						     =			{0: '''batch''', 1: '''past_decoder_sequence + sequence'''}
         else:
            _A:    List[Any]						     =			{0: '''batch''', 1: '''decoder_sequence'''}
            _A:    Tuple						     =			{0: '''batch''', 1: '''decoder_sequence'''}
         if self.use_past:
            self.fill_with_past_key_values_(lowerCAmelCase_     ,     direction='''inputs'''	)
      elif self.task == "causal-lm":
         _A:    str						     =			OrderedDict(
             [
                 ('''input_ids''', {0: '''batch''', 1: '''encoder_sequence'''}),
                 ('''attention_mask''', {0: '''batch''', 1: '''encoder_sequence'''}),
             ]	)
         if self.use_past:
            _A     ,    _A:    Tuple						     =			self.num_layers
            for i in range(lowerCAmelCase_	):
               _A:    str						     =			{0: '''batch''', 2: '''past_sequence + sequence'''}
               _A:    List[str]						     =			{0: '''batch''', 2: '''past_sequence + sequence'''}
      else:
         _A:    List[Any]						     =			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
   # Copied from transformers.models.bart.configuration_bart.BartOnnxConfig.outputs
   def 					__magic_name__							(   self	:				Tuple	):

      """simple docstring"""
      if self.task in ["default", "seq2seq-lm"]:
         _A:    List[str]						     =			super().outputs
      else:
         _A:    Tuple						     =			super(lowerCAmelCase_     ,     self	).outputs
         if self.use_past:
            _A     ,    _A:    Optional[int]						     =			self.num_layers
            for i in range(lowerCAmelCase_	):
               _A:    Union[str, Any]						     =			{0: '''batch''', 2: '''past_sequence + sequence'''}
               _A:    Optional[int]						     =			{0: '''batch''', 2: '''past_sequence + sequence'''}
      return common_outputs


   def 					__magic_name__							(   self	:				Tuple     ,     lowerCAmelCase_	:				PreTrainedTokenizer     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				bool = False     ,     lowerCAmelCase_	:				Optional[TensorType] = None     ,     ):

      """simple docstring"""
      _A:    Optional[Any]						     =			self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
          lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_	)
      # Generate decoder inputs
      _A:    int						     =			seq_length if not self.use_past else 1
      _A:    Any						     =			self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
          lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_	)
      _A:    Optional[int]						     =			{F"""decoder_{name}""": tensor for name, tensor in decoder_inputs.items()}
      _A:    Union[str, Any]						     =			dict(**lowerCAmelCase_     ,     **lowerCAmelCase_	)

      if self.use_past:
         if not is_torch_available():
            raise ValueError('''Cannot generate dummy past_keys inputs without PyTorch installed.'''	)
         else:
            import torch
         _A     ,    _A:    str						     =			common_inputs['''input_ids'''].shape
         _A:    Optional[Any]						     =			common_inputs['''decoder_input_ids'''].shape[1]
         _A     ,    _A:    Optional[Any]						     =			self.num_attention_heads
         _A:    List[str]						     =			(
             batch,
             num_encoder_attention_heads,
             encoder_seq_length,
             self._config.hidden_size // num_encoder_attention_heads,
         )
         _A:    Union[str, Any]						     =			decoder_seq_length
         _A:    Tuple						     =			(
             batch,
             num_decoder_attention_heads,
             decoder_past_length,
             self._config.hidden_size // num_decoder_attention_heads,
         )
         _A:    Union[str, Any]						     =			torch.cat(
             [common_inputs['''decoder_attention_mask'''], torch.ones(lowerCAmelCase_     ,     lowerCAmelCase_	)]     ,     dim=1	)
         _A:    List[Any]						     =			[]
         _A     ,    _A:    Union[str, Any]						     =			self.num_layers

         for _ in range(lowerCAmelCase_	):
            common_inputs["past_key_values"].append(
                (
                    torch.zeros(lowerCAmelCase_	),
                    torch.zeros(lowerCAmelCase_	),
                    torch.zeros(lowerCAmelCase_	),
                    torch.zeros(lowerCAmelCase_	),
                )	)
      return common_inputs


   def 					__magic_name__							(   self	:				Union[str, Any]     ,     lowerCAmelCase_	:				PreTrainedTokenizer     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				bool = False     ,     lowerCAmelCase_	:				Optional[TensorType] = None     ,     ):

      """simple docstring"""
      _A:    Tuple						     =			self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
          lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_	)

      if self.use_past:
         if not is_torch_available():
            raise ValueError('''Cannot generate dummy past_keys inputs without PyTorch installed.'''	)
         else:
            import torch
         _A     ,    _A:    Optional[int]						     =			common_inputs['''input_ids'''].shape
         _A:    Union[str, Any]						     =			seqlen
         _A     ,    _A:    Tuple						     =			self.num_layers
         _A     ,    _A:    Dict						     =			self.num_attention_heads
         _A:    Tuple						     =			(
             batch,
             num_encoder_attention_heads,
             past_key_values_length,
             self._config.hidden_size // num_encoder_attention_heads,
         )
         _A:    List[Any]						     =			common_inputs['''attention_mask'''].dtype
         _A:    Optional[int]						     =			torch.cat(
             [common_inputs['''attention_mask'''], torch.ones(lowerCAmelCase_     ,     lowerCAmelCase_     ,     dtype=lowerCAmelCase_	)]     ,     dim=1	)
         _A:    Tuple						     =			[
             (torch.zeros(lowerCAmelCase_	), torch.zeros(lowerCAmelCase_	)) for _ in range(lowerCAmelCase_	)
         ]
      return common_inputs


   def 					__magic_name__							(   self	:				Any     ,     lowerCAmelCase_	:				PreTrainedTokenizer     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				bool = False     ,     lowerCAmelCase_	:				Optional[TensorType] = None     ,     ):

      """simple docstring"""
      # Copied from OnnxConfig.generate_dummy_inputs
      # Did not use super(OnnxConfigWithPast, self).generate_dummy_inputs for code clarity.
      # If dynamic axis (-1) we forward with a fixed dimension of 2 samples to avoid optimizations made by ONNX
      _A:    Optional[int]						     =			compute_effective_axis_dimension(
          lowerCAmelCase_     ,     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
      _A:    int						     =			tokenizer.num_special_tokens_to_add(lowerCAmelCase_	)
      _A:    Any						     =			compute_effective_axis_dimension(
          lowerCAmelCase_     ,     fixed_dimension=OnnxConfig.default_fixed_sequence     ,     num_token_to_add=lowerCAmelCase_	)

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


   def 					__magic_name__							(   self	:				Dict     ,     lowerCAmelCase_	:				PreTrainedTokenizer     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				int = -1     ,     lowerCAmelCase_	:				bool = False     ,     lowerCAmelCase_	:				Optional[TensorType] = None     ,     ):

      """simple docstring"""
      if self.task in ["default", "seq2seq-lm"]:
         _A:    Union[str, Any]						     =			self._generate_dummy_inputs_for_default_and_seqaseq_lm(
             lowerCAmelCase_     ,     batch_size=lowerCAmelCase_     ,     seq_length=lowerCAmelCase_     ,     is_pair=lowerCAmelCase_     ,     framework=lowerCAmelCase_	)

      elif self.task == "causal-lm":
         _A:    Optional[Any]						     =			self._generate_dummy_inputs_for_causal_lm(
             lowerCAmelCase_     ,     batch_size=lowerCAmelCase_     ,     seq_length=lowerCAmelCase_     ,     is_pair=lowerCAmelCase_     ,     framework=lowerCAmelCase_	)
      else:
         _A:    Tuple						     =			self._generate_dummy_inputs_for_sequence_classification_and_question_answering(
             lowerCAmelCase_     ,     batch_size=lowerCAmelCase_     ,     seq_length=lowerCAmelCase_     ,     is_pair=lowerCAmelCase_     ,     framework=lowerCAmelCase_	)

      return common_inputs


   def 					__magic_name__							(   self	:				int     ,     lowerCAmelCase_	:				Tuple     ,     lowerCAmelCase_	:				Any     ,     lowerCAmelCase_	:				str     ,     lowerCAmelCase_	:				List[str]	):

      """simple docstring"""
      if self.task in ["default", "seq2seq-lm"]:
         _A:    int						     =			super()._flatten_past_key_values_(lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_	)
      else:
         _A:    Optional[int]						     =			super(lowerCAmelCase_     ,     self	)._flatten_past_key_values_(
             lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_     ,     lowerCAmelCase_	)


   def 					__magic_name__							(   self	:				Dict     ,     lowerCAmelCase_	:				Mapping[str, Mapping[int, str]]     ,     lowerCAmelCase_	:				str	):

      """simple docstring"""
      if direction not in ["inputs", "outputs"]:
         raise ValueError(F"""direction must either be \"inputs\" or \"outputs\", but {direction} was given"""	)

      _A:    Tuple						     =			'''past_key_values''' if direction == '''inputs''' else '''present'''
      _A     ,    _A:    int						     =			self.num_layers

      _A:    int						     =			'''past_encoder_sequence'''
      _A:    int						     =			'''past_decoder_sequence''' if direction == '''inputs''' else '''past_decoder_sequence + sequence'''

      for i in range(lowerCAmelCase_	):
         _A:    Optional[int]						     =			{0: '''batch''', 2: decoder_sequence}
         _A:    Dict						     =			{0: '''batch''', 2: decoder_sequence}
         _A:    int						     =			{0: '''batch''', 2: encoder_sequence}
         _A:    Optional[int]						     =			{0: '''batch''', 2: encoder_sequence}



