






import tempfile
import unittest
from pathlib import Path
from shutil import copyfile

from transformers import MaMaaaTokenizer, is_torch_available
from transformers.testing_utils import (
    get_tests_dir,
    nested_simplify,
    require_sentencepiece,
    require_tokenizers,
    require_torch,
    slow,
)
from transformers.utils import is_sentencepiece_available


if is_sentencepiece_available():
 from transformers.models.mam_aaa.tokenization_mam_aaa import VOCAB_FILES_NAMES, save_json

from ...test_tokenization_common import TokenizerTesterMixin


if is_sentencepiece_available():
 lowerCamelCase			:					Any					      =	get_tests_dir('''fixtures/test_sentencepiece.model''')


if is_torch_available():
 from transformers.models.mam_aaa.modeling_mam_aaa import shift_tokens_right

lowerCamelCase			:					List[str]					      =	128022
lowerCamelCase			:					Any					      =	128028



@require_sentencepiece
class 							_UpperCamelCase			(a_							,		unittest.TestCase			):
      snake_case_  =							MaMaaaTokenizer
      snake_case_  =							False
      snake_case_  =							False
      snake_case_  =							True


      def  __UpperCAmelCase		(	self	)->	List[Any]:
           super().setUp()

           __lowerCAmelCase								=					["</s>", "<unk>", "▁This", "▁is", "▁a", "▁t", "est", "\u0120", "<pad>"]
           __lowerCAmelCase								=					dict(zip(__UpperCamelCase					,						range(len(__UpperCamelCase	)	)	)	)
           __lowerCAmelCase								=					Path(self.tmpdirname	)
           save_json(__UpperCamelCase					,						save_dir / VOCAB_FILES_NAMES["vocab_file"]	)
           if not (save_dir / VOCAB_FILES_NAMES["spm_file"]).exists():
                copyfile(__UpperCamelCase					,						save_dir / VOCAB_FILES_NAMES["spm_file"]	)

           __lowerCAmelCase								=					MaMaaaTokenizer.from_pretrained(self.tmpdirname	)
           tokenizer.save_pretrained(self.tmpdirname	)


      def  __UpperCAmelCase		(	self					,						**__UpperCamelCase	)->	Tuple:
           return MaMaaaTokenizer.from_pretrained(self.tmpdirname					,						**__UpperCamelCase	)


      def  __UpperCAmelCase		(	self					,						__UpperCamelCase	)->	Dict:
           return (
               "This is a test",
               "This is a test",
           )


      def  __UpperCAmelCase		(	self	)->	Union[str, Any]:
           __lowerCAmelCase								=					"</s>"
           __lowerCAmelCase								=					0

           self.assertEqual(self.get_tokenizer()._convert_token_to_id(__UpperCamelCase	)					,						__UpperCamelCase	)
           self.assertEqual(self.get_tokenizer()._convert_id_to_token(__UpperCamelCase	)					,						__UpperCamelCase	)


      def  __UpperCAmelCase		(	self	)->	Union[str, Any]:
           __lowerCAmelCase								=					self.get_tokenizer()
           __lowerCAmelCase								=					list(tokenizer.get_vocab().keys()	)

           self.assertEqual(vocab_keys[0]					,						"</s>"	)
           self.assertEqual(vocab_keys[1]					,						"<unk>"	)
           self.assertEqual(vocab_keys[-1]					,						"<s>"	)
           self.assertEqual(len(__UpperCamelCase	)					,						tokenizer.vocab_size + len(tokenizer.get_added_vocab()	)	)


      @unittest.skip("Skip this test while all models are still to be uploaded."	)
      def  __UpperCAmelCase		(	self	)->	Union[str, Any]:
           pass


      def  __UpperCAmelCase		(	self	)->	Optional[int]:
           __lowerCAmelCase								=					self.get_tokenizer()

           __lowerCAmelCase								=					tokenizer.tokenize("This is a test"	)
           self.assertListEqual(__UpperCamelCase					,						["▁This", "▁is", "▁a", "▁t", "est"]	)

           self.assertListEqual(
               tokenizer.convert_tokens_to_ids(__UpperCamelCase	)					,						[2, 3, 4, 5, 6]					,						)

           __lowerCAmelCase								=					tokenizer.convert_ids_to_tokens([2, 3, 4, 5, 6]	)
           self.assertListEqual(__UpperCamelCase					,						["▁This", "▁is", "▁a", "▁t", "est"]	)

           __lowerCAmelCase								=					tokenizer.convert_tokens_to_string(__UpperCamelCase	)
           self.assertEqual(__UpperCamelCase					,						"This is a test"	)


      @slow
      def  __UpperCAmelCase		(	self	)->	List[Any]:
           # fmt: off
           __lowerCAmelCase								=					{"input_ids": [[1_2_8_0_2_2, 1_1_0_1_0_8, 3_9_7, 1_1, 3_8_2_7_2, 2_2_4_7, 1_2_4_8_1_1, 2_8_5, 1_8_1_0_5, 1_5_8_6, 2_0_7, 7, 3_9_5_3_4, 4_4_2_8, 3_9_7, 1_0_1_9, 1_8_1_0_5, 1_5_8_6, 2_0_7, 7, 4_1_3_3_7, 1_6_7_8_6, 2_4_1, 7, 2_0_2_1_4, 1_7, 1_2_5_6_9_0, 1_0_3_9_8, 7, 4_4_3_7_8, 5_8_0_6_9, 6_8_3_4_2, 7_7_9_8, 7_3_4_3, 1_1, 2_9_9, 3_3_3_1_0, 4, 1_5_8, 3_7_3_5_0, 9_4_0_7_7, 4_5_6_9, 2_9_9, 3_3_3_1_0, 9_0, 4, 5_2_8_4_0, 2_9_0, 4, 3_1_2_7_0, 1_1_2, 2_9_9, 6_8_2, 4, 5_2_8_4_0, 3_9_9_5_3, 1_4_0_7_9, 1_9_3, 5_2_5_1_9, 9_0_8_9_4, 1_7_8_9_4, 1_2_0_6_9_7, 1_1, 4_0_4_4_5, 5_5_1, 1_7, 1_0_1_9, 5_2_5_1_9, 9_0_8_9_4, 1_7_7_5_6, 9_6_3, 1_1, 4_0_4_4_5, 4_8_0, 1_7, 9_7_9_2, 1_1_2_0, 5_1_7_3, 1_3_9_3, 6_2_4_0, 1_6_7_8_6, 2_4_1, 1_2_0_9_9_6, 2_8, 1_2_4_5, 1_3_9_3, 1_1_8_2_4_0, 1_1_1_2_3, 1_0_1_9, 9_3_6_1_2, 2_6_9_1, 1_0_6_1_8, 9_8_0_5_8, 1_2_0_4_0_9, 1_9_2_8, 2_7_9, 4, 4_0_6_8_3, 3_6_7, 1_7_8, 2_0_7, 1_0_1_9, 1_0_3, 1_0_3_1_2_1, 5_0_6, 6_5_2_9_6, 5, 2], [1_2_8_0_2_2, 2_1_2_1_7, 3_6_7, 1_1_7, 1_2_5_4_5_0, 1_2_8, 7_1_9, 7, 7_3_0_8, 4_0, 9_3_6_1_2, 1_2_6_6_9, 1_1_1_6, 1_6_7_0_4, 7_1, 1_7_7_8_5, 3_6_9_9, 1_5_5_9_2, 3_5, 1_4_4, 9_5_8_4, 2_4_1, 1_1_9_4_3, 7_1_3, 9_5_0, 7_9_9, 2_2_4_7, 8_8_4_2_7, 1_5_0, 1_4_9, 1_1_8_8_1_3, 1_2_0_7_0_6, 1_0_1_9, 1_0_6_9_0_6, 8_1_5_1_8, 2_8, 1_2_2_4, 2_2_7_9_9, 3_9_7, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1_2_8_0_2_2, 1_6_5_8, 1_2_3_3_1_1, 5_1_5_5, 5_5_7_8, 4_7_2_2, 2_7_9, 1_4_9_4_7, 2_3_6_6, 1_1_2_0, 1_1_9_7, 1_4, 1_3_4_8, 9_2_3_2, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], "attention_mask": [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]}  # noqa: E501
           # fmt: on

           self.tokenizer_integration_test_util(
               expected_encoding=__UpperCamelCase					,						model_name="facebook/m2m100_418M"					,						revision="c168bae485c864188cf9aa0e4108b0b6934dc91e"					,						)



@require_torch
@require_sentencepiece
@require_tokenizers
class 							_UpperCamelCase			(unittest.TestCase			):
      snake_case_  =							"""facebook/m2m100_418M"""
      snake_case_  =							[
          """In my opinion, there are two levels of response from the French government.""",
          """NSA Affair Emphasizes Complete Lack of Debate on Intelligence""",
      ]
      snake_case_  =							[
          """Selon moi, il y a deux niveaux de réponse de la part du gouvernement français.""",
          """L'affaire NSA souligne l'absence totale de débat sur le renseignement""",
      ]

      # fmt: off
      snake_case_  =							[EN_CODE, 593, 1949, 115781, 4, 71586, 4234, 60633, 126233, 432, 123808, 15592, 1197, 117132, 120618, 5, 2]


      @classmethod
      def  __UpperCAmelCase		(	cls	)->	Dict:
           __lowerCAmelCase								=					MaMaaaTokenizer.from_pretrained(
               cls.checkpoint_name					,						src_lang="en"					,						tgt_lang="fr"	)
           __lowerCAmelCase								=					1
           return cls


      def  __UpperCAmelCase		(	self	)->	List[str]:
           self.assertEqual(self.tokenizer.get_lang_id("ar"	)					,						1_2_8_0_0_6	)
           self.assertEqual(self.tokenizer.get_lang_id("en"	)					,						1_2_8_0_2_2	)
           self.assertEqual(self.tokenizer.get_lang_id("ro"	)					,						1_2_8_0_7_6	)
           self.assertEqual(self.tokenizer.get_lang_id("mr"	)					,						1_2_8_0_6_3	)


      def  __UpperCAmelCase		(	self	)->	Tuple:
           __lowerCAmelCase								=					self.tokenizer.get_vocab()
           self.assertEqual(len(__UpperCamelCase	)					,						self.tokenizer.vocab_size	)
           self.assertEqual(vocab["<unk>"]					,						3	)
           self.assertIn(self.tokenizer.get_lang_token("en"	)					,						__UpperCamelCase	)


      def  __UpperCAmelCase		(	self	)->	Optional[Any]:
           __lowerCAmelCase								=					"en"
           __lowerCAmelCase								=					self.tokenizer.batch_encode_plus(self.src_text	).input_ids[0]
           self.assertListEqual(self.expected_src_tokens					,						__UpperCamelCase	)


      def  __UpperCAmelCase		(	self	)->	int:
           self.assertIn(__UpperCamelCase					,						self.tokenizer.all_special_ids	)
           # fmt: off
           __lowerCAmelCase								=					[FR_CODE, 5_3_6_4, 8_2, 8_6_4_2, 4, 2_9_4, 4_7, 8, 1_4_0_2_8, 1_3_6, 3_2_8_6, 9_7_0_6, 6, 9_0_7_9_7, 6, 1_4_4_0_1_2, 1_6_2, 8_8_1_2_8, 3_0_0_6_1, 5, 2]
           # fmt: on
           __lowerCAmelCase								=					self.tokenizer.decode(__UpperCamelCase					,						skip_special_tokens=__UpperCamelCase	)
           __lowerCAmelCase								=					self.tokenizer.decode(generated_ids[1:]					,						skip_special_tokens=__UpperCamelCase	)
           self.assertEqual(__UpperCamelCase					,						__UpperCamelCase	)
           self.assertNotIn(self.tokenizer.eos_token					,						__UpperCamelCase	)


      def  __UpperCAmelCase		(	self	)->	Optional[int]:
           __lowerCAmelCase								=					tempfile.mkdtemp()
           __lowerCAmelCase								=					self.tokenizer.lang_token_to_id
           self.tokenizer.save_pretrained(__UpperCamelCase	)
           __lowerCAmelCase								=					MaMaaaTokenizer.from_pretrained(__UpperCamelCase	)
           self.assertDictEqual(new_tok.lang_token_to_id					,						__UpperCamelCase	)


      @require_torch
      def  __UpperCAmelCase		(	self	)->	List[Any]:
           __lowerCAmelCase								=					"en"
           __lowerCAmelCase								=					"fr"

           __lowerCAmelCase								=					self.tokenizer(self.src_text					,						text_target=self.tgt_text					,						padding=__UpperCamelCase					,						return_tensors="pt"	)

           __lowerCAmelCase								=					shift_tokens_right(
               batch["labels"]					,						self.tokenizer.pad_token_id					,						self.tokenizer.eos_token_id	)

           for k in batch:
                __lowerCAmelCase								=					batch[k].tolist()
           # batch = {k: v.tolist() for k,v in batch.items()}
           # fairseq batch: https://gist.github.com/sshleifer/cba08bc2109361a74ac3760a7e30e4f4
           # batch.decoder_inputs_ids[0][0] ==
           assert batch.input_ids[1][0] == EN_CODE
           assert batch.input_ids[1][-1] == 2
           assert batch.labels[1][0] == FR_CODE
           assert batch.labels[1][-1] == 2
           assert batch.decoder_input_ids[1][:2] == [2, FR_CODE]


      @require_torch
      def  __UpperCAmelCase		(	self	)->	List[str]:
           __lowerCAmelCase								=					"mr"
           self.assertListEqual(self.tokenizer.prefix_tokens					,						[self.tokenizer.get_lang_id("mr"	)]	)
           self.assertListEqual(self.tokenizer.suffix_tokens					,						[self.tokenizer.eos_token_id]	)

           __lowerCAmelCase								=					"zh"
           self.assertListEqual(self.tokenizer.prefix_tokens					,						[self.tokenizer.get_lang_id("zh"	)]	)
           self.assertListEqual(self.tokenizer.suffix_tokens					,						[self.tokenizer.eos_token_id]	)


      @require_torch
      def  __UpperCAmelCase		(	self	)->	Union[str, Any]:
           __lowerCAmelCase								=					"mr"
           self.tokenizer._switch_to_target_mode()
           self.assertListEqual(self.tokenizer.prefix_tokens					,						[self.tokenizer.get_lang_id("mr"	)]	)
           self.assertListEqual(self.tokenizer.suffix_tokens					,						[self.tokenizer.eos_token_id]	)
           self.tokenizer._switch_to_input_mode()
           self.assertListEqual(self.tokenizer.prefix_tokens					,						[self.tokenizer.get_lang_id(self.tokenizer.src_lang	)]	)

           __lowerCAmelCase								=					"zh"
           self.tokenizer._switch_to_target_mode()
           self.assertListEqual(self.tokenizer.prefix_tokens					,						[self.tokenizer.get_lang_id("zh"	)]	)
           self.assertListEqual(self.tokenizer.suffix_tokens					,						[self.tokenizer.eos_token_id]	)
           self.tokenizer._switch_to_input_mode()
           self.assertListEqual(self.tokenizer.prefix_tokens					,						[self.tokenizer.get_lang_id(self.tokenizer.src_lang	)]	)


      @require_torch
      def  __UpperCAmelCase		(	self	)->	Tuple:
           __lowerCAmelCase								=					self.tokenizer._build_translation_inputs("A test"					,						return_tensors="pt"					,						src_lang="en"					,						tgt_lang="ar"	)

           self.assertEqual(
               nested_simplify(__UpperCamelCase	)					,						{
                   # en_XX, A, test, EOS
                   "input_ids": [[1_2_8_0_2_2, 5_8, 4_1_8_3, 2]],
                   "attention_mask": [[1, 1, 1, 1]],
                   # ar_AR
                   "forced_bos_token_id": 1_2_8_0_0_6,
               }					,						)














from typing import Dict, List

from nltk.translate import gleu_score

import datasets
from datasets import MetricInfo


lowerCamelCase			:					Tuple         =	'''\
@misc{wu2016googles,
      title={Google\'s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation},
      author={Yonghui Wu and Mike Schuster and Zhifeng Chen and Quoc V. Le and Mohammad Norouzi and Wolfgang Macherey
              and Maxim Krikun and Yuan Cao and Qin Gao and Klaus Macherey and Jeff Klingner and Apurva Shah and Melvin
              Johnson and Xiaobing Liu and Łukasz Kaiser and Stephan Gouws and Yoshikiyo Kato and Taku Kudo and Hideto
              Kazawa and Keith Stevens and George Kurian and Nishant Patil and Wei Wang and Cliff Young and
              Jason Smith and Jason Riesa and Alex Rudnick and Oriol Vinyals and Greg Corrado and Macduff Hughes
              and Jeffrey Dean},
      year={2016},
      eprint={1609.08144},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}
'''

lowerCamelCase			:					int         =	'''\
The BLEU score has some undesirable properties when used for single
sentences, as it was designed to be a corpus measure. We therefore
use a slightly different score for our RL experiments which we call
the \'GLEU score\'. For the GLEU score, we record all sub-sequences of
1, 2, 3 or 4 tokens in output and target sequence (n-grams). We then
compute a recall, which is the ratio of the number of matching n-grams
to the number of total n-grams in the target (ground truth) sequence,
and a precision, which is the ratio of the number of matching n-grams
to the number of total n-grams in the generated output sequence. Then
GLEU score is simply the minimum of recall and precision. This GLEU
score\'s range is always between 0 (no matches) and 1 (all match) and
it is symmetrical when switching output and target. According to
our experiments, GLEU score correlates quite well with the BLEU
metric on a corpus level but does not have its drawbacks for our per
sentence reward objective.
'''

lowerCamelCase			:					List[str]         =	'''\
Computes corpus-level Google BLEU (GLEU) score of translated segments against one or more references.
Instead of averaging the sentence level GLEU scores (i.e. macro-average precision), Wu et al. (2016) sum up the matching
tokens and the max of hypothesis and reference tokens for each sentence, then compute using the aggregate values.

Args:
    predictions (list of str): list of translations to score.
        Each translation should be tokenized into a list of tokens.
    references (list of list of str): list of lists of references for each translation.
        Each reference should be tokenized into a list of tokens.
    min_len (int): The minimum order of n-gram this function should extract. Defaults to 1.
    max_len (int): The maximum order of n-gram this function should extract. Defaults to 4.

Returns:
    \'google_bleu\': google_bleu score

Examples:
    Example 1:
        >>> hyp1 = [\'It\', \'is\', \'a\', \'guide\', \'to\', \'action\', \'which\',
        ...         \'ensures\', \'that\', \'the\', \'rubber\', \'duck\', \'always\',
        ...         \'disobeys\', \'the\', \'commands\', \'of\', \'the\', \'cat\']
        >>> ref1a = [\'It\', \'is\', \'the\', \'guiding\', \'principle\', \'which\',
        ...          \'guarantees\', \'the\', \'rubber\', \'duck\', \'forces\', \'never\',
        ...          \'being\', \'under\', \'the\', \'command\', \'of\', \'the\', \'cat\']

        >>> hyp2 = [\'he\', \'read\', \'the\', \'book\', \'because\', \'he\', \'was\',
        ...         \'interested\', \'in\', \'world\', \'history\']
        >>> ref2a = [\'he\', \'was\', \'interested\', \'in\', \'world\', \'history\',
        ...          \'because\', \'he\', \'read\', \'the\', \'book\']

        >>> list_of_references = [[ref1a], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric("google_bleu")
        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references)
        >>> print(round(results["google_bleu"], 2))
        0.44

    Example 2:
        >>> hyp1 = [\'It\', \'is\', \'a\', \'guide\', \'to\', \'action\', \'which\',
        ...         \'ensures\', \'that\', \'the\', \'rubber\', \'duck\', \'always\',
        ...         \'disobeys\', \'the\', \'commands\', \'of\', \'the\', \'cat\']
        >>> ref1a = [\'It\', \'is\', \'the\', \'guiding\', \'principle\', \'which\',
        ...          \'guarantees\', \'the\', \'rubber\', \'duck\', \'forces\', \'never\',
        ...          \'being\', \'under\', \'the\', \'command\', \'of\', \'the\', \'cat\']
        >>> ref1b = [\'It\', \'is\', \'a\', \'guide\', \'to\', \'action\', \'that\',
        ...          \'ensures\', \'that\', \'the\', \'rubber\', \'duck\', \'will\', \'never\',
        ...          \'heed\', \'the\', \'cat\', \'commands\']
        >>> ref1c = [\'It\', \'is\', \'the\', \'practical\', \'guide\', \'for\', \'the\',
        ...          \'rubber\', \'duck\', \'army\', \'never\', \'to\', \'heed\', \'the\', \'directions\',
        ...          \'of\', \'the\', \'cat\']

        >>> hyp2 = [\'he\', \'read\', \'the\', \'book\', \'because\', \'he\', \'was\',
        ...         \'interested\', \'in\', \'world\', \'history\']
        >>> ref2a = [\'he\', \'was\', \'interested\', \'in\', \'world\', \'history\',
        ...          \'because\', \'he\', \'read\', \'the\', \'book\']

        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric("google_bleu")
        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references)
        >>> print(round(results["google_bleu"], 2))
        0.61

    Example 3:
        >>> hyp1 = [\'It\', \'is\', \'a\', \'guide\', \'to\', \'action\', \'which\',
        ...         \'ensures\', \'that\', \'the\', \'rubber\', \'duck\', \'always\',
        ...         \'disobeys\', \'the\', \'commands\', \'of\', \'the\', \'cat\']
        >>> ref1a = [\'It\', \'is\', \'the\', \'guiding\', \'principle\', \'which\',
        ...          \'guarantees\', \'the\', \'rubber\', \'duck\', \'forces\', \'never\',
        ...          \'being\', \'under\', \'the\', \'command\', \'of\', \'the\', \'cat\']
        >>> ref1b = [\'It\', \'is\', \'a\', \'guide\', \'to\', \'action\', \'that\',
        ...          \'ensures\', \'that\', \'the\', \'rubber\', \'duck\', \'will\', \'never\',
        ...          \'heed\', \'the\', \'cat\', \'commands\']
        >>> ref1c = [\'It\', \'is\', \'the\', \'practical\', \'guide\', \'for\', \'the\',
        ...          \'rubber\', \'duck\', \'army\', \'never\', \'to\', \'heed\', \'the\', \'directions\',
        ...          \'of\', \'the\', \'cat\']

        >>> hyp2 = [\'he\', \'read\', \'the\', \'book\', \'because\', \'he\', \'was\',
        ...         \'interested\', \'in\', \'world\', \'history\']
        >>> ref2a = [\'he\', \'was\', \'interested\', \'in\', \'world\', \'history\',
        ...          \'because\', \'he\', \'read\', \'the\', \'book\']

        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric("google_bleu")
        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references, min_len=2)
        >>> print(round(results["google_bleu"], 2))
        0.53

    Example 4:
        >>> hyp1 = [\'It\', \'is\', \'a\', \'guide\', \'to\', \'action\', \'which\',
        ...         \'ensures\', \'that\', \'the\', \'rubber\', \'duck\', \'always\',
        ...         \'disobeys\', \'the\', \'commands\', \'of\', \'the\', \'cat\']
        >>> ref1a = [\'It\', \'is\', \'the\', \'guiding\', \'principle\', \'which\',
        ...          \'guarantees\', \'the\', \'rubber\', \'duck\', \'forces\', \'never\',
        ...          \'being\', \'under\', \'the\', \'command\', \'of\', \'the\', \'cat\']
        >>> ref1b = [\'It\', \'is\', \'a\', \'guide\', \'to\', \'action\', \'that\',
        ...          \'ensures\', \'that\', \'the\', \'rubber\', \'duck\', \'will\', \'never\',
        ...          \'heed\', \'the\', \'cat\', \'commands\']
        >>> ref1c = [\'It\', \'is\', \'the\', \'practical\', \'guide\', \'for\', \'the\',
        ...          \'rubber\', \'duck\', \'army\', \'never\', \'to\', \'heed\', \'the\', \'directions\',
        ...          \'of\', \'the\', \'cat\']

        >>> hyp2 = [\'he\', \'read\', \'the\', \'book\', \'because\', \'he\', \'was\',
        ...         \'interested\', \'in\', \'world\', \'history\']
        >>> ref2a = [\'he\', \'was\', \'interested\', \'in\', \'world\', \'history\',
        ...          \'because\', \'he\', \'read\', \'the\', \'book\']

        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric("google_bleu")
        >>> results = google_bleu.compute(predictions=hypotheses,references=list_of_references, min_len=2, max_len=6)
        >>> print(round(results["google_bleu"], 2))
        0.4
'''



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


      def  __UpperCAmelCase		(	self	)->	MetricInfo:
           return datasets.MetricInfo(
               description=_DESCRIPTION					,						citation=_CITATION					,						inputs_description=_KWARGS_DESCRIPTION					,						features=datasets.Features(
                   {
                       "predictions": datasets.Sequence(datasets.Value("string"					,						id="token"	)					,						id="sequence"	),
                       "references": datasets.Sequence(
                           datasets.Sequence(datasets.Value("string"					,						id="token"	)					,						id="sequence"	)					,						id="references"	),
                   }	)					,						)


      def  __UpperCAmelCase		(	self					,						__UpperCamelCase					,						__UpperCamelCase					,						__UpperCamelCase = 1					,						__UpperCamelCase = 4					,						)->	Dict[str, float]:
           return {
               "google_bleu": gleu_score.corpus_gleu(
                   list_of_references=__UpperCamelCase					,						hypotheses=__UpperCamelCase					,						min_len=__UpperCamelCase					,						max_len=__UpperCamelCase	)
           }






