





import os

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

import datasets


lowerCAmelCase_    =    datasets.logging.get_logger(__name__)


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

lowerCAmelCase_    =    '''\
BLEURT 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)
and 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
it for your specific application (the latter is expected to perform better).

See the project\'s README at https://github.com/google-research/bleurt#readme for more information.
'''

lowerCAmelCase_    =    '''
BLEURT score.

Args:
    `predictions` (list of str): prediction/candidate sentences
    `references` (list of str): reference sentences
    `checkpoint` BLEURT checkpoint. Will default to BLEURT-tiny if None.

Returns:
    \'scores\': List of scores.
Examples:

    >>> predictions = ["hello there", "general kenobi"]
    >>> references = ["hello there", "general kenobi"]
    >>> bleurt = datasets.load_metric("bleurt")
    >>> results = bleurt.compute(predictions=predictions, references=references)
    >>> print([round(v, 2) for v in results["scores"]])
    [1.03, 1.04]
'''

lowerCAmelCase_    =    {
    '''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					):






   def       lowerCamelCase  (self   )					->       int:


       '''simple docstring'''



       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 ,							__magic_name__   )					->       int:


       '''simple docstring'''



       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\').'''   )
           snake_case_						:   List[Any]           =  '''bleurt-base-128'''

       if self.config_name.lower() in CHECKPOINT_URLS:
           snake_case_						:   str           =  self.config_name.lower()

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






   def       lowerCamelCase  (self ,							__magic_name__ ,							__magic_name__   )					->       Any:


       '''simple docstring'''



       snake_case_						:   str           =  self.scorer.score(references=__magic_name__ ,							candidates=__magic_name__   )
       return {"scores": scores}







import flax.linen as nn
import jax.numpy as jnp

from .attention_flax import FlaxTransformeraDModel
from .resnet_flax import FlaxDownsampleaD, FlaxResnetBlockaD, FlaxUpsampleaD



class  __lowerCAmelCase	(      nn.Module					):
			lowerCamelCase_					:					int
			lowerCamelCase_					:					int
			lowerCamelCase_					:					float	      =				0.0
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					bool	      =				True
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					jnp.dtype	      =				jnp.floataa






			def       lowerCamelCase  (self   )					->       Tuple:


							'''simple docstring'''



							snake_case_						:   Tuple           =  []
							snake_case_						:   List[str]           =  []

							for i in range(self.num_layers   ):
											snake_case_						:   Tuple           =  self.in_channels if i == 0 else self.out_channels

											snake_case_						:   Dict           =  FlaxResnetBlockaD(
											    in_channels=__magic_name__ ,							out_channels=self.out_channels ,							dropout_prob=self.dropout ,							dtype=self.dtype ,							)
											resnets.append(__magic_name__   )

											snake_case_						:   str           =  FlaxTransformeraDModel(
											    in_channels=self.out_channels ,							n_heads=self.num_attention_heads ,							d_head=self.out_channels // self.num_attention_heads ,							depth=1 ,							use_linear_projection=self.use_linear_projection ,							only_cross_attention=self.only_cross_attention ,							use_memory_efficient_attention=self.use_memory_efficient_attention ,							dtype=self.dtype ,							)
											attentions.append(__magic_name__   )

							snake_case_						:   Union[str, Any]           =  resnets
							snake_case_						:   Union[str, Any]           =  attentions

							if self.add_downsample:
											snake_case_						:   List[str]           =  FlaxDownsampleaD(self.out_channels ,							dtype=self.dtype   )






			def __call__(self ,							__magic_name__ ,							__magic_name__ ,							__magic_name__ ,							__magic_name__=True   )					->       List[Any]:


							'''simple docstring'''



							snake_case_						:   str           =  ()

							for resnet, attn in zip(self.resnets ,							self.attentions   ):
											snake_case_						:   Optional[Any]           =  resnet(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )
											snake_case_						:   List[str]           =  attn(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )
											output_states += (hidden_states,)

							if self.add_downsample:
											snake_case_						:   Union[str, Any]           =  self.downsamplers_a(__magic_name__   )
											output_states += (hidden_states,)

							return hidden_states, output_states




class  __lowerCAmelCase	(      nn.Module					):
			lowerCamelCase_					:					int
			lowerCamelCase_					:					int
			lowerCamelCase_					:					float	      =				0.0
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					bool	      =				True
			lowerCamelCase_					:					jnp.dtype	      =				jnp.floataa






			def       lowerCamelCase  (self   )					->       Dict:


							'''simple docstring'''



							snake_case_						:   Optional[Any]           =  []

							for i in range(self.num_layers   ):
											snake_case_						:   List[Any]           =  self.in_channels if i == 0 else self.out_channels

											snake_case_						:   Tuple           =  FlaxResnetBlockaD(
											    in_channels=__magic_name__ ,							out_channels=self.out_channels ,							dropout_prob=self.dropout ,							dtype=self.dtype ,							)
											resnets.append(__magic_name__   )
							snake_case_						:   Dict           =  resnets

							if self.add_downsample:
											snake_case_						:   Optional[int]           =  FlaxDownsampleaD(self.out_channels ,							dtype=self.dtype   )






			def __call__(self ,							__magic_name__ ,							__magic_name__ ,							__magic_name__=True   )					->       Optional[Any]:


							'''simple docstring'''



							snake_case_						:   Any           =  ()

							for resnet in self.resnets:
											snake_case_						:   List[Any]           =  resnet(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )
											output_states += (hidden_states,)

							if self.add_downsample:
											snake_case_						:   str           =  self.downsamplers_a(__magic_name__   )
											output_states += (hidden_states,)

							return hidden_states, output_states




class  __lowerCAmelCase	(      nn.Module					):
			lowerCamelCase_					:					int
			lowerCamelCase_					:					int
			lowerCamelCase_					:					int
			lowerCamelCase_					:					float	      =				0.0
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					bool	      =				True
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					jnp.dtype	      =				jnp.floataa






			def       lowerCamelCase  (self   )					->       str:


							'''simple docstring'''



							snake_case_						:   Optional[Any]           =  []
							snake_case_						:   Optional[Any]           =  []

							for i in range(self.num_layers   ):
											snake_case_						:   List[Any]           =  self.in_channels if (i == self.num_layers - 1) else self.out_channels
											snake_case_						:   Optional[int]           =  self.prev_output_channel if i == 0 else self.out_channels

											snake_case_						:   Dict           =  FlaxResnetBlockaD(
											    in_channels=resnet_in_channels + res_skip_channels ,							out_channels=self.out_channels ,							dropout_prob=self.dropout ,							dtype=self.dtype ,							)
											resnets.append(__magic_name__   )

											snake_case_						:   List[str]           =  FlaxTransformeraDModel(
											    in_channels=self.out_channels ,							n_heads=self.num_attention_heads ,							d_head=self.out_channels // self.num_attention_heads ,							depth=1 ,							use_linear_projection=self.use_linear_projection ,							only_cross_attention=self.only_cross_attention ,							use_memory_efficient_attention=self.use_memory_efficient_attention ,							dtype=self.dtype ,							)
											attentions.append(__magic_name__   )

							snake_case_						:   List[Any]           =  resnets
							snake_case_						:   Tuple           =  attentions

							if self.add_upsample:
											snake_case_						:   List[Any]           =  FlaxUpsampleaD(self.out_channels ,							dtype=self.dtype   )






			def __call__(self ,							__magic_name__ ,							__magic_name__ ,							__magic_name__ ,							__magic_name__ ,							__magic_name__=True   )					->       Union[str, Any]:


							'''simple docstring'''



							for resnet, attn in zip(self.resnets ,							self.attentions   ):
											# pop res hidden states
											snake_case_						:   Dict           =  res_hidden_states_tuple[-1]
											snake_case_						:   List[Any]           =  res_hidden_states_tuple[:-1]
											snake_case_						:   Optional[int]           =  jnp.concatenate((hidden_states, res_hidden_states) ,							axis=-1   )

											snake_case_						:   Tuple           =  resnet(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )
											snake_case_						:   Tuple           =  attn(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )

							if self.add_upsample:
											snake_case_						:   Optional[Any]           =  self.upsamplers_a(__magic_name__   )

							return hidden_states




class  __lowerCAmelCase	(      nn.Module					):
			lowerCamelCase_					:					int
			lowerCamelCase_					:					int
			lowerCamelCase_					:					int
			lowerCamelCase_					:					float	      =				0.0
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					bool	      =				True
			lowerCamelCase_					:					jnp.dtype	      =				jnp.floataa






			def       lowerCamelCase  (self   )					->       int:


							'''simple docstring'''



							snake_case_						:   Union[str, Any]           =  []

							for i in range(self.num_layers   ):
											snake_case_						:   Tuple           =  self.in_channels if (i == self.num_layers - 1) else self.out_channels
											snake_case_						:   Optional[Any]           =  self.prev_output_channel if i == 0 else self.out_channels

											snake_case_						:   int           =  FlaxResnetBlockaD(
											    in_channels=resnet_in_channels + res_skip_channels ,							out_channels=self.out_channels ,							dropout_prob=self.dropout ,							dtype=self.dtype ,							)
											resnets.append(__magic_name__   )

							snake_case_						:   Tuple           =  resnets

							if self.add_upsample:
											snake_case_						:   List[str]           =  FlaxUpsampleaD(self.out_channels ,							dtype=self.dtype   )






			def __call__(self ,							__magic_name__ ,							__magic_name__ ,							__magic_name__ ,							__magic_name__=True   )					->       List[Any]:


							'''simple docstring'''



							for resnet in self.resnets:
											# pop res hidden states
											snake_case_						:   Tuple           =  res_hidden_states_tuple[-1]
											snake_case_						:   List[Any]           =  res_hidden_states_tuple[:-1]
											snake_case_						:   Dict           =  jnp.concatenate((hidden_states, res_hidden_states) ,							axis=-1   )

											snake_case_						:   Optional[Any]           =  resnet(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )

							if self.add_upsample:
											snake_case_						:   Optional[int]           =  self.upsamplers_a(__magic_name__   )

							return hidden_states




class  __lowerCAmelCase	(      nn.Module					):
			lowerCamelCase_					:					int
			lowerCamelCase_					:					float	      =				0.0
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					int	      =				1
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					bool	      =				False
			lowerCamelCase_					:					jnp.dtype	      =				jnp.floataa






			def       lowerCamelCase  (self   )					->       str:


							'''simple docstring'''



							snake_case_						:   Dict           =  [
							    FlaxResnetBlockaD(
							        in_channels=self.in_channels ,							out_channels=self.in_channels ,							dropout_prob=self.dropout ,							dtype=self.dtype ,							)
							]

							snake_case_						:   int           =  []

							for _ in range(self.num_layers   ):
											snake_case_						:   str           =  FlaxTransformeraDModel(
											    in_channels=self.in_channels ,							n_heads=self.num_attention_heads ,							d_head=self.in_channels // self.num_attention_heads ,							depth=1 ,							use_linear_projection=self.use_linear_projection ,							use_memory_efficient_attention=self.use_memory_efficient_attention ,							dtype=self.dtype ,							)
											attentions.append(__magic_name__   )

											snake_case_						:   Dict           =  FlaxResnetBlockaD(
											    in_channels=self.in_channels ,							out_channels=self.in_channels ,							dropout_prob=self.dropout ,							dtype=self.dtype ,							)
											resnets.append(__magic_name__   )

							snake_case_						:   Optional[Any]           =  resnets
							snake_case_						:   Optional[int]           =  attentions






			def __call__(self ,							__magic_name__ ,							__magic_name__ ,							__magic_name__ ,							__magic_name__=True   )					->       Optional[int]:


							'''simple docstring'''



							snake_case_						:   List[Any]           =  self.resnets[0](__magic_name__ ,							__magic_name__   )
							for attn, resnet in zip(self.attentions ,							self.resnets[1:]   ):
											snake_case_						:   Tuple           =  attn(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )
											snake_case_						:   Union[str, Any]           =  resnet(__magic_name__ ,							__magic_name__ ,							deterministic=__magic_name__   )

							return hidden_states
