





import os

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

import datasets


UpperCamelCase__  			=datasets.logging.get_logger(__name__)


UpperCamelCase__  			='\\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'

UpperCamelCase__  			='\\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'

UpperCamelCase__  			='\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'

UpperCamelCase__  			={
    '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      UpperCamelCase_      (   self				)      ->  Any:
            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      UpperCamelCase_      (   self     ,    __lowerCamelCase				)      ->  str:
            # check that config name specifies a valid BLEURT model
            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')."				)
                 _SCREAMING_SNAKE_CASE							:						str         =				"bleurt-base-128"

            if self.config_name.lower() in CHECKPOINT_URLS:
                 _SCREAMING_SNAKE_CASE							:						List[Any]         =				self.config_name.lower()

            elif self.config_name.upper() in CHECKPOINT_URLS:
                 _SCREAMING_SNAKE_CASE							:						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
            _SCREAMING_SNAKE_CASE							:						str         =				dl_manager.download_and_extract(CHECKPOINT_URLS[checkpoint_name]				)
            _SCREAMING_SNAKE_CASE							:						Union[str, Any]         =				score.BleurtScorer(os.path.join(__lowerCAmelCase     ,    __lowerCAmelCase				)				)







       def      UpperCamelCase_      (   self     ,    __lowerCamelCase     ,    __lowerCamelCase				)      ->  int:
            _SCREAMING_SNAKE_CASE							:						List[Any]         =				self.scorer.score(references=__lowerCAmelCase     ,    candidates=__lowerCAmelCase				)
            return {"scores": scores}
"""simple docstring"""


import copy
import json
import os
import tempfile

from transformers import is_torch_available

from .test_configuration_utils import config_common_kwargs


class 							a					(		lowerCAmelCase_ ):


    def __init__(       self						:	Union[str, Any] ,					__lowerCAmelCase						:	Union[str, Any] ,					__lowerCAmelCase						:	str=None ,					__lowerCAmelCase						:	List[Any]=True ,					__lowerCAmelCase						:	Union[str, Any]=None ,					**__lowerCAmelCase						:	Dict       ):
      _UpperCAmelCase    			=   parent
      _UpperCAmelCase    			=   config_class
      _UpperCAmelCase    			=   has_text_modality
      _UpperCAmelCase    			=   kwargs
      _UpperCAmelCase    			=   common_properties


    def   lowerCAmelCase_	(       self						:	Dict       ):
      _UpperCAmelCase    			=   self.config_class(**self.inputs_dict       )
      _UpperCAmelCase    			=   (
          ["""hidden_size""", """num_attention_heads""", """num_hidden_layers"""]
          if self.common_properties is None
          else self.common_properties
      )

      # Add common fields for text models
      if self.has_text_modality:
        common_properties.extend(["""vocab_size"""]       )

      # Test that config has the common properties as getters
      for prop in common_properties:
        self.parent.assertTrue(hasattr(__lowerCAmelCase ,					__lowerCAmelCase       ) ,					msg=f'''`{prop}` does not exist'''       )

      # Test that config has the common properties as setter
      for idx, name in enumerate(__lowerCAmelCase       ):
        try:
          setattr(__lowerCAmelCase ,					__lowerCAmelCase ,					__lowerCAmelCase       )
          self.parent.assertEqual(
              getattr(__lowerCAmelCase ,					__lowerCAmelCase       ) ,					__lowerCAmelCase ,					msg=f'''`{name} value {idx} expected, but was {getattr(__lowerCAmelCase ,					__lowerCAmelCase       )}'''       )
        except NotImplementedError:
          # Some models might not be able to implement setters for common_properties
          # In that case, a NotImplementedError is raised
          pass

        # Test if config class can be called with Config(prop_name=..)
      for idx, name in enumerate(__lowerCAmelCase       ):
        try:
          _UpperCAmelCase    			=   self.config_class(**{name: idx}       )
          self.parent.assertEqual(
              getattr(__lowerCAmelCase ,					__lowerCAmelCase       ) ,					__lowerCAmelCase ,					msg=f'''`{name} value {idx} expected, but was {getattr(__lowerCAmelCase ,					__lowerCAmelCase       )}'''       )
        except NotImplementedError:
          # Some models might not be able to implement setters for common_properties
          # In that case, a NotImplementedError is raised
          pass


    def   lowerCAmelCase_	(       self						:	Optional[Any]       ):
      _UpperCAmelCase    			=   self.config_class(**self.inputs_dict       )
      _UpperCAmelCase    			=   json.loads(config.to_json_string()       )
      for key, value in self.inputs_dict.items():
        self.parent.assertEqual(obj[key] ,					__lowerCAmelCase       )


    def   lowerCAmelCase_	(       self						:	Union[str, Any]       ):
      _UpperCAmelCase    			=   self.config_class(**self.inputs_dict       )

      with tempfile.TemporaryDirectory() as tmpdirname:
        _UpperCAmelCase    			=   os.path.join(__lowerCAmelCase ,					"""config.json"""       )
        config_first.to_json_file(__lowerCAmelCase       )
        _UpperCAmelCase    			=   self.config_class.from_json_file(__lowerCAmelCase       )

      self.parent.assertEqual(config_second.to_dict() ,					config_first.to_dict()       )


    def   lowerCAmelCase_	(       self						:	List[str]       ):
      _UpperCAmelCase    			=   self.config_class(**self.inputs_dict       )

      with tempfile.TemporaryDirectory() as tmpdirname:
        config_first.save_pretrained(__lowerCAmelCase       )
        _UpperCAmelCase    			=   self.config_class.from_pretrained(__lowerCAmelCase       )

      self.parent.assertEqual(config_second.to_dict() ,					config_first.to_dict()       )


    def   lowerCAmelCase_	(       self						:	Optional[Any]       ):
      _UpperCAmelCase    			=   self.config_class(**self.inputs_dict       )

      _UpperCAmelCase    			=   """test"""
      with tempfile.TemporaryDirectory() as tmpdirname:
        _UpperCAmelCase    			=   os.path.join(__lowerCAmelCase ,					__lowerCAmelCase       )
        config_first.save_pretrained(__lowerCAmelCase       )
        _UpperCAmelCase    			=   self.config_class.from_pretrained(__lowerCAmelCase ,					subfolder=__lowerCAmelCase       )

      self.parent.assertEqual(config_second.to_dict() ,					config_first.to_dict()       )


    def   lowerCAmelCase_	(       self						:	List[str]       ):
      _UpperCAmelCase    			=   self.config_class(**self.inputs_dict ,					num_labels=5       )
      self.parent.assertEqual(len(config.idalabel       ) ,					5       )
      self.parent.assertEqual(len(config.labelaid       ) ,					5       )

      _UpperCAmelCase    			=   3
      self.parent.assertEqual(len(config.idalabel       ) ,					3       )
      self.parent.assertEqual(len(config.labelaid       ) ,					3       )


    def   lowerCAmelCase_	(       self						:	List[str]       ):
      if self.config_class.is_composition:
        return
      _UpperCAmelCase    			=   self.config_class()
      self.parent.assertIsNotNone(__lowerCAmelCase       )


    def   lowerCAmelCase_	(       self						:	Any       ):
      _UpperCAmelCase    			=   copy.deepcopy(__lowerCAmelCase       )
      _UpperCAmelCase    			=   self.config_class(**__lowerCAmelCase       )
      _UpperCAmelCase    			=   []
      for key, value in config_common_kwargs.items():
        if key == "torch_dtype":
          if not is_torch_available():
            continue
          else:
            import torch

            if config.torch_dtype != torch.floataa:
              wrong_values.append(("""torch_dtype""", config.torch_dtype, torch.floataa)       )
        elif getattr(__lowerCAmelCase ,					__lowerCAmelCase       ) != value:
          wrong_values.append((key, getattr(__lowerCAmelCase ,					__lowerCAmelCase       ), value)       )

      if len(__lowerCAmelCase       ) > 0:
        _UpperCAmelCase    			=   """\n""".join([f'''- {v[0]}: got {v[1]} instead of {v[2]}''' for v in wrong_values]       )
        raise ValueError(f'''The following keys were not properly set in the config:\n{errors}'''       )


    def   lowerCAmelCase_	(       self						:	Optional[Any]       ):
      self.create_and_test_config_common_properties()
      self.create_and_test_config_to_json_string()
      self.create_and_test_config_to_json_file()
      self.create_and_test_config_from_and_save_pretrained()
      self.create_and_test_config_from_and_save_pretrained_subfolder()
      self.create_and_test_config_with_num_labels()
      self.check_config_can_be_init_without_params()
      self.check_config_arguments_init()
