






"""simple docstring"""

import os

from bleurt import score  # From: git+https://github.com/google-research/bleurt.git

import datasets


lowercase__          = datasets.logging.get_logger(__name__)


lowercase__          = "\\n@inproceedings{bleurt,\n  title={BLEURT: Learning Robust Metrics for Text Generation},\n  author={Thibault Sellam and Dipanjan Das and Ankur P. Parikh},\n  booktitle={ACL},\n  year={2020},\n  url={https://arxiv.org/abs/2004.04696}\n}\n"

lowercase__          = "\\nBLEURT a learnt evaluation metric for Natural Language Generation. It is built using multiple phases of transfer learning starting from a pretrained BERT model (Devlin et al. 2018)\nand then employing another pre-training phrase using synthetic data. Finally it is trained on WMT human annotations. You may run BLEURT out-of-the-box or fine-tune\nit for your specific application (the latter is expected to perform better).\n\nSee the project's README at https://github.com/google-research/bleurt#readme for more information.\n"

lowercase__          = "\nBLEURT score.\n\nArgs:\n    `predictions` (list of str): prediction/candidate sentences\n    `references` (list of str): reference sentences\n    `checkpoint` BLEURT checkpoint. Will default to BLEURT-tiny if None.\n\nReturns:\n    'scores': List of scores.\nExamples:\n\n    >>> predictions = [\"hello there\", \"general kenobi\"]\n    >>> references = [\"hello there\", \"general kenobi\"]\n    >>> bleurt = datasets.load_metric(\"bleurt\")\n    >>> results = bleurt.compute(predictions=predictions, references=references)\n    >>> print([round(v, 2) for v in results[\"scores\"]])\n    [1.03, 1.04]\n"

lowercase__          = {
    "bleurt-tiny-128": "https://storage.googleapis.com/bleurt-oss/bleurt-tiny-128.zip",
    "bleurt-tiny-512": "https://storage.googleapis.com/bleurt-oss/bleurt-tiny-512.zip",
    "bleurt-base-128": "https://storage.googleapis.com/bleurt-oss/bleurt-base-128.zip",
    "bleurt-base-512": "https://storage.googleapis.com/bleurt-oss/bleurt-base-512.zip",
    "bleurt-large-128": "https://storage.googleapis.com/bleurt-oss/bleurt-large-128.zip",
    "bleurt-large-512": "https://storage.googleapis.com/bleurt-oss/bleurt-large-512.zip",
    "BLEURT-20-D3": "https://storage.googleapis.com/bleurt-oss-21/BLEURT-20-D3.zip",
    "BLEURT-20-D6": "https://storage.googleapis.com/bleurt-oss-21/BLEURT-20-D6.zip",
    "BLEURT-20-D12": "https://storage.googleapis.com/bleurt-oss-21/BLEURT-20-D12.zip",
    "BLEURT-20": "https://storage.googleapis.com/bleurt-oss-21/BLEURT-20.zip",
}


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





		'''simple docstring'''






		def    lowerCamelCase       (   self							:	str	):
				return datasets.MetricInfo(
				    description=_DESCRIPTION						,			citation=_CITATION						,			homepage="https://github.com/google-research/bleurt"						,			inputs_description=_KWARGS_DESCRIPTION						,			features=datasets.Features(
				        {
				            "predictions": datasets.Value("string"						,			id="sequence"	),
				            "references": datasets.Value("string"						,			id="sequence"	),
				        }	)						,			codebase_urls=["https://github.com/google-research/bleurt"]						,			reference_urls=["https://github.com/google-research/bleurt", "https://arxiv.org/abs/2004.04696"]						,			)





		def    lowerCamelCase       (   self							:	Optional[Any]						,			a_							:	Dict	):


				if self.config_name == "default":
						logger.warning(
						    "Using default BLEURT-Base checkpoint for sequence maximum length 128. "
						    "You can use a bigger model for better results with e.g.: datasets.load_metric(\'bleurt\', \'bleurt-large-512\')."	)
						lowerCAmelCase_   :							int									=			"bleurt-base-128"

				if self.config_name.lower() in CHECKPOINT_URLS:
						lowerCAmelCase_   :							Union[str, Any]									=			self.config_name.lower()

				elif self.config_name.upper() in CHECKPOINT_URLS:
						lowerCAmelCase_   :							int									=			self.config_name.upper()

				else:
						raise KeyError(
						    f'''{self.config_name} model not found. You should supply the name of a model checkpoint for bleurt in {CHECKPOINT_URLS.keys()}'''	)

				# download the model checkpoint specified by self.config_name and set up the scorer
				lowerCAmelCase_   :							Dict									=			dl_manager.download_and_extract(CHECKPOINT_URLS[checkpoint_name]	)
				lowerCAmelCase_   :							Optional[Any]									=			score.BleurtScorer(os.path.join(_snake_case						,			_snake_case	)	)





		def    lowerCamelCase       (   self							:	Any						,			a_							:	int						,			a_							:	List[Any]	):
				lowerCAmelCase_   :							Tuple									=			self.scorer.score(references=_snake_case						,			candidates=_snake_case	)
				return {"scores": scores}






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


snake_case_ : List[str]    		=       logging.get_logger(__name__)


snake_case_ : Tuple    		=       {
    "Salesforce/codegen-350M-nl": "https://huggingface.co/Salesforce/codegen-350M-nl/resolve/main/config.json",
    "Salesforce/codegen-350M-multi": "https://huggingface.co/Salesforce/codegen-350M-multi/resolve/main/config.json",
    "Salesforce/codegen-350M-mono": "https://huggingface.co/Salesforce/codegen-350M-mono/resolve/main/config.json",
    "Salesforce/codegen-2B-nl": "https://huggingface.co/Salesforce/codegen-2B-nl/resolve/main/config.json",
    "Salesforce/codegen-2B-multi": "https://huggingface.co/Salesforce/codegen-2B-multi/resolve/main/config.json",
    "Salesforce/codegen-2B-mono": "https://huggingface.co/Salesforce/codegen-2B-mono/resolve/main/config.json",
    "Salesforce/codegen-6B-nl": "https://huggingface.co/Salesforce/codegen-6B-nl/resolve/main/config.json",
    "Salesforce/codegen-6B-multi": "https://huggingface.co/Salesforce/codegen-6B-multi/resolve/main/config.json",
    "Salesforce/codegen-6B-mono": "https://huggingface.co/Salesforce/codegen-6B-mono/resolve/main/config.json",
    "Salesforce/codegen-16B-nl": "https://huggingface.co/Salesforce/codegen-16B-nl/resolve/main/config.json",
    "Salesforce/codegen-16B-multi": "https://huggingface.co/Salesforce/codegen-16B-multi/resolve/main/config.json",
    "Salesforce/codegen-16B-mono": "https://huggingface.co/Salesforce/codegen-16B-mono/resolve/main/config.json",
}







class __snake_case			(			a		):
   UpperCAmelCase__  :    str          =  '''codegen'''
   UpperCAmelCase__  :    int          =  {
       '''max_position_embeddings''': '''n_positions''',
       '''hidden_size''': '''n_embd''',
       '''num_attention_heads''': '''n_head''',
       '''num_hidden_layers''': '''n_layer''',
   }







   def __init__(      self		:						Union[str, Any]					,						_snake_case		:						Union[str, Any]=50400					,						_snake_case		:						Optional[int]=2048					,						_snake_case		:						Union[str, Any]=2048					,						_snake_case		:						List[str]=4096					,						_snake_case		:						Any=28					,						_snake_case		:						List[str]=16					,						_snake_case		:						int=64					,						_snake_case		:						Tuple=None					,						_snake_case		:						Dict="gelu_new"					,						_snake_case		:						Union[str, Any]=0.0					,						_snake_case		:						Optional[Any]=0.0					,						_snake_case		:						List[Any]=0.0					,						_snake_case		:						List[Any]=1e-5					,						_snake_case		:						List[str]=0.0_2					,						_snake_case		:						Optional[Any]=True					,						_snake_case		:						int=50256					,						_snake_case		:						Tuple=50256					,						_snake_case		:						int=False					,						**_snake_case		:						Any					,						):

        """simple docstring"""


        UpperCAmelCase_          =							vocab_size
        UpperCAmelCase_          =							n_ctx
        UpperCAmelCase_          =							n_positions
        UpperCAmelCase_          =							n_embd
        UpperCAmelCase_          =							n_layer
        UpperCAmelCase_          =							n_head
        UpperCAmelCase_          =							n_inner
        UpperCAmelCase_          =							rotary_dim
        UpperCAmelCase_          =							activation_function
        UpperCAmelCase_          =							resid_pdrop
        UpperCAmelCase_          =							embd_pdrop
        UpperCAmelCase_          =							attn_pdrop
        UpperCAmelCase_          =							layer_norm_epsilon
        UpperCAmelCase_          =							initializer_range
        UpperCAmelCase_          =							use_cache

        UpperCAmelCase_          =							bos_token_id
        UpperCAmelCase_          =							eos_token_id

        super().__init__(
            bos_token_id=_snake_case					,						eos_token_id=_snake_case					,						tie_word_embeddings=_snake_case					,						**_snake_case)







class __snake_case			(			a		):







   def __init__(      self		:						Tuple					,						_snake_case		:						PretrainedConfig					,						_snake_case		:						str = "default"					,						_snake_case		:						List[PatchingSpec] = None					,						_snake_case		:						bool = False					,						):

        """simple docstring"""


        super().__init__(_snake_case					,						task=_snake_case					,						patching_specs=_snake_case					,						use_past=_snake_case)
        if not getattr(self._config					,						'''pad_token_id'''					,						_snake_case):
             # TODO: how to do that better?
             UpperCAmelCase_          =							0







   @property
   def lowerCamelCase						(      self		:						Optional[Any]):

        """simple docstring"""


        UpperCAmelCase_          =							OrderedDict({'''input_ids''': {0: '''batch''', 1: '''sequence'''}})
        if self.use_past:
             self.fill_with_past_key_values_(_snake_case					,						direction='''inputs''')
             UpperCAmelCase_          =							{0: '''batch''', 1: '''past_sequence + sequence'''}
        else:
             UpperCAmelCase_          =							{0: '''batch''', 1: '''sequence'''}

        return common_inputs







   @property
   def lowerCamelCase						(      self		:						List[str]):

        """simple docstring"""


        return self._config.n_layer







   @property
   def lowerCamelCase						(      self		:						int):

        """simple docstring"""


        return self._config.n_head







   def lowerCamelCase						(      self		:						Optional[int]					,						_snake_case		:						PreTrainedTokenizer					,						_snake_case		:						int = -1					,						_snake_case		:						int = -1					,						_snake_case		:						bool = False					,						_snake_case		:						Optional[TensorType] = None					,						):

        """simple docstring"""


        UpperCAmelCase_          =							super(_snake_case					,						self).generate_dummy_inputs(
            _snake_case					,						batch_size=_snake_case					,						seq_length=_snake_case					,						is_pair=_snake_case					,						framework=_snake_case)

        # We need to order the input in the way they appears in the forward()
        UpperCAmelCase_          =							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

                  UpperCAmelCase_     ,       UpperCAmelCase_          =							common_inputs['''input_ids'''].shape
                  # Not using the same length for past_key_values
                  UpperCAmelCase_          =							seqlen + 2
                  UpperCAmelCase_          =							(
                      batch,
                      self.num_attention_heads,
                      past_key_values_length,
                      self._config.hidden_size // self.num_attention_heads,
                  )
                  UpperCAmelCase_          =							[
                      (torch.zeros(_snake_case), torch.zeros(_snake_case)) for _ in range(self.num_layers)
                  ]

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

        return ordered_inputs







   @property
   def lowerCamelCase						(      self		:						Union[str, Any]):

        """simple docstring"""


        return 13






