






import numpy as np
from nltk.translate import meteor_score

import datasets
from datasets.config import importlib_metadata, version


__A      =				version.parse(importlib_metadata.version('nltk'))
if NLTK_VERSION >= version.Version('3.6.4'):
				from nltk import word_tokenize


__A      =				'\\n@inproceedings{banarjee2005,\n  title     = {{METEOR}: An Automatic Metric for {MT} Evaluation with Improved Correlation with Human Judgments},\n  author    = {Banerjee, Satanjeev  and Lavie, Alon},\n  booktitle = {Proceedings of the {ACL} Workshop on Intrinsic and Extrinsic Evaluation Measures for Machine Translation and/or Summarization},\n  month     = jun,\n  year      = {2005},\n  address   = {Ann Arbor, Michigan},\n  publisher = {Association for Computational Linguistics},\n  url       = {https://www.aclweb.org/anthology/W05-0909},\n  pages     = {65--72},\n}\n'

__A      =				'\\nMETEOR, an automatic metric for machine translation evaluation\nthat is based on a generalized concept of unigram matching between the\nmachine-produced translation and human-produced reference translations.\nUnigrams can be matched based on their surface forms, stemmed forms,\nand meanings; furthermore, METEOR can be easily extended to include more\nadvanced matching strategies. Once all generalized unigram matches\nbetween the two strings have been found, METEOR computes a score for\nthis matching using a combination of unigram-precision, unigram-recall, and\na measure of fragmentation that is designed to directly capture how\nwell-ordered the matched words in the machine translation are in relation\nto the reference.\n\nMETEOR gets an R correlation value of 0.347 with human evaluation on the Arabic\ndata and 0.331 on the Chinese data. This is shown to be an improvement on\nusing simply unigram-precision, unigram-recall and their harmonic F1\ncombination.\n'

__A      =				'\nComputes METEOR score of translated segments against one or more references.\nArgs:\n    predictions: list of predictions to score. Each prediction\n        should be a string with tokens separated by spaces.\n    references: list of reference for each prediction. Each\n        reference should be a string with tokens separated by spaces.\n    alpha: Parameter for controlling relative weights of precision and recall. default: 0.9\n    beta: Parameter for controlling shape of penalty as a function of fragmentation. default: 3\n    gamma: Relative weight assigned to fragmentation penalty. default: 0.5\nReturns:\n    \'meteor\': meteor score.\nExamples:\n\n    >>> meteor = datasets.load_metric(\'meteor\')\n    >>> predictions = ["It is a guide to action which ensures that the military always obeys the commands of the party"]\n    >>> references = ["It is a guide to action that ensures that the military will forever heed Party commands"]\n    >>> results = meteor.compute(predictions=predictions, references=references)\n    >>> print(round(results["meteor"], 4))\n    0.6944\n'





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





							"""simple docstring"""

							def       __A (  self:   List[str]   )    ->				Dict:
												return datasets.MetricInfo(
												    description=_DESCRIPTION		,     citation=_CITATION		,     inputs_description=_KWARGS_DESCRIPTION		,     features=datasets.Features(
												        {
												            '''predictions''': datasets.Value('''string'''		,     id='''sequence'''   ),
												            '''references''': datasets.Value('''string'''		,     id='''sequence'''   ),
												        }   )		,     codebase_urls=['''https://github.com/nltk/nltk/blob/develop/nltk/translate/meteor_score.py''']		,     reference_urls=[
												        '''https://www.nltk.org/api/nltk.translate.html#module-nltk.translate.meteor_score''',
												        '''https://en.wikipedia.org/wiki/METEOR''',
												    ]		,     )

							def       __A (  self:   int		,     __A:   Optional[Any]   )    ->				Optional[Any]:
												import nltk

												nltk.download('''wordnet'''   )
												if NLTK_VERSION >= version.Version('''3.6.5'''   ):
																	nltk.download('''punkt'''   )
												if NLTK_VERSION >= version.Version('''3.6.6'''   ):
																	nltk.download('''omw-1.4'''   )



							def       __A (  self:   str		,     __A:   Any		,     __A:   Dict		,     __A:   Optional[Any]=0.9		,     __A:   Dict=3		,     __A:   Union[str, Any]=0.5   )    ->				Optional[Any]:
												if NLTK_VERSION >= version.Version('''3.6.5'''   ):
																	_A								= [
																	    meteor_score.single_meteor_score(
																	        word_tokenize(__A   )		,     word_tokenize(__A   )		,     alpha=__A		,     beta=__A		,     gamma=__A   )
																	    for ref, pred in zip(__A		,     __A   )
																	]
												else:
																	_A								= [
																	    meteor_score.single_meteor_score(__A		,     __A		,     alpha=__A		,     beta=__A		,     gamma=__A   )
																	    for ref, pred in zip(__A		,     __A   )
																	]

												return {"meteor": np.mean(__A   )}











import os
import warnings
from typing import List, Optional

from ...tokenization_utils_base import BatchEncoding
from ...utils import logging
from .configuration_rag import RagConfig


__A      =				logging.get_logger(__name__)





class 						SCREAMING_SNAKE_CASE				:





							"""simple docstring"""

							def __init__(  self:   int		,     __A:   Optional[int]		,     __A:   Optional[Any]   )    ->				str:
												_A								= question_encoder
												_A								= generator
												_A								= self.question_encoder

							def       __A (  self:   Optional[int]		,     __A:   Union[str, Any]   )    ->				Dict:
												if os.path.isfile(__A   ):
																	raise ValueError(f"""Provided path ({save_directory}) should be a directory, not a file"""   )
												os.makedirs(__A		,     exist_ok=__A   )
												_A								= os.path.join(__A		,     '''question_encoder_tokenizer'''   )
												_A								= os.path.join(__A		,     '''generator_tokenizer'''   )
												self.question_encoder.save_pretrained(__A   )
												self.generator.save_pretrained(__A   )

							@classmethod
							def       __A (  cls:   Optional[Any]		,     __A:   List[str]		,     **__A:   int   )    ->				Any:
												# dynamically import AutoTokenizer
												from ..auto.tokenization_auto import AutoTokenizer

												_A								= kwargs.pop('''config'''		,     __A   )

												if config is None:
																	_A								= RagConfig.from_pretrained(__A   )

												_A								= AutoTokenizer.from_pretrained(
												    __A		,     config=config.question_encoder		,     subfolder='''question_encoder_tokenizer'''   )
												_A								= AutoTokenizer.from_pretrained(
												    __A		,     config=config.generator		,     subfolder='''generator_tokenizer'''   )
												return cls(question_encoder=__A		,     generator=__A   )

							def __call__(  self:   int		,     *__A:   Optional[int]		,     **__A:   List[str]   )    ->				int:
												return self.current_tokenizer(*__A		,     **__A   )

							def       __A (  self:   Dict		,     *__A:   List[str]		,     **__A:   List[str]   )    ->				Dict:
												return self.generator.batch_decode(*__A		,     **__A   )

							def       __A (  self:   Union[str, Any]		,     *__A:   Tuple		,     **__A:   List[str]   )    ->				Tuple:
												return self.generator.decode(*__A		,     **__A   )

							def       __A (  self:   Dict   )    ->				List[str]:
												_A								= self.question_encoder

							def       __A (  self:   Union[str, Any]   )    ->				int:
												_A								= self.generator



							def       __A (  self:   Dict		,     __A:   List[str]		,     __A:   Optional[List[str]] = None		,     __A:   Optional[int] = None		,     __A:   Optional[int] = None		,     __A:   str = "longest"		,     __A:   str = None		,     __A:   bool = True		,     **__A:   Tuple		,     )    ->				BatchEncoding:
												warnings.warn(
												    '''`prepare_seq2seq_batch` is deprecated and will be removed in version 5 of 🤗 Transformers. Use the '''
												    '''regular `__call__` method to prepare your inputs and the tokenizer under the `with_target_tokenizer` '''
												    '''context manager to prepare your targets. See the documentation of your specific tokenizer for more '''
												    '''details'''		,     __A		,     )
												if max_length is None:
																	_A								= self.current_tokenizer.model_max_length
												_A								= self(
												    __A		,     add_special_tokens=__A		,     return_tensors=__A		,     max_length=__A		,     padding=__A		,     truncation=__A		,     **__A		,     )
												if tgt_texts is None:
																	return model_inputs
												# Process tgt_texts
												if max_target_length is None:
																	_A								= self.current_tokenizer.model_max_length
												_A								= self(
												    text_target=__A		,     add_special_tokens=__A		,     return_tensors=__A		,     padding=__A		,     max_length=__A		,     truncation=__A		,     **__A		,     )
												_A								= labels['''input_ids''']
												return model_inputs



