



import argparse
import json
from collections import OrderedDict
from pathlib import Path

import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import (
    SegformerConfig,
    SegformerForImageClassification,
    SegformerForSemanticSegmentation,
    SegformerImageProcessor,
)
from transformers.utils import logging


logging.set_verbosity_info()
UpperCAmelCase__   =       logging.get_logger(__name__)





def 							A	(     _UpperCAmelCase				:   Optional[Any]							,   _UpperCAmelCase				:   Any=False    )				-> str:







			'''simple docstring'''
			_UpperCAmelCase		       =   OrderedDict()
			for key, value in state_dict.items():
						if encoder_only and not key.startswith('head'    ):
									_UpperCAmelCase		       =   'segformer.encoder.' + key
						if key.startswith('backbone'    ):
									_UpperCAmelCase		       =   key.replace('backbone'							,   'segformer.encoder'    )
						if "patch_embed" in key:
									# replace for example patch_embed1 by patch_embeddings.0
									_UpperCAmelCase		       =   key[key.find('patch_embed'    ) + len('patch_embed'    )]
									_UpperCAmelCase		       =   key.replace(F"patch_embed{idx}"							,   F"patch_embeddings.{int(_UpperCAmelCase    )-1}"    )
						if "norm" in key:
									_UpperCAmelCase		       =   key.replace('norm'							,   'layer_norm'    )
						if "segformer.encoder.layer_norm" in key:
									# replace for example layer_norm1 by layer_norm.0
									_UpperCAmelCase		       =   key[key.find('segformer.encoder.layer_norm'    ) + len('segformer.encoder.layer_norm'    )]
									_UpperCAmelCase		       =   key.replace(F"layer_norm{idx}"							,   F"layer_norm.{int(_UpperCAmelCase    )-1}"    )
						if "layer_norm1" in key:
									_UpperCAmelCase		       =   key.replace('layer_norm1'							,   'layer_norm_1'    )
						if "layer_norm2" in key:
									_UpperCAmelCase		       =   key.replace('layer_norm2'							,   'layer_norm_2'    )
						if "block" in key:
									# replace for example block1 by block.0
									_UpperCAmelCase		       =   key[key.find('block'    ) + len('block'    )]
									_UpperCAmelCase		       =   key.replace(F"block{idx}"							,   F"block.{int(_UpperCAmelCase    )-1}"    )
						if "attn.q" in key:
									_UpperCAmelCase		       =   key.replace('attn.q'							,   'attention.self.query'    )
						if "attn.proj" in key:
									_UpperCAmelCase		       =   key.replace('attn.proj'							,   'attention.output.dense'    )
						if "attn" in key:
									_UpperCAmelCase		       =   key.replace('attn'							,   'attention.self'    )
						if "fc1" in key:
									_UpperCAmelCase		       =   key.replace('fc1'							,   'dense1'    )
						if "fc2" in key:
									_UpperCAmelCase		       =   key.replace('fc2'							,   'dense2'    )
						if "linear_pred" in key:
									_UpperCAmelCase		       =   key.replace('linear_pred'							,   'classifier'    )
						if "linear_fuse" in key:
									_UpperCAmelCase		       =   key.replace('linear_fuse.conv'							,   'linear_fuse'    )
									_UpperCAmelCase		       =   key.replace('linear_fuse.bn'							,   'batch_norm'    )
						if "linear_c" in key:
									# replace for example linear_c4 by linear_c.3
									_UpperCAmelCase		       =   key[key.find('linear_c'    ) + len('linear_c'    )]
									_UpperCAmelCase		       =   key.replace(F"linear_c{idx}"							,   F"linear_c.{int(_UpperCAmelCase    )-1}"    )
						if key.startswith('head'    ):
									_UpperCAmelCase		       =   key.replace('head'							,   'classifier'    )
						_UpperCAmelCase		       =   value

			return new_state_dict





def 							A	(     _UpperCAmelCase				:   Tuple							,   _UpperCAmelCase				:   Optional[int]    )				-> Optional[Any]:







			'''simple docstring'''
			# for each of the encoder blocks:
			for i in range(config.num_encoder_blocks    ):
						for j in range(config.depths[i]    ):
									# read in weights + bias of keys and values (which is a single matrix in the original implementation)
									_UpperCAmelCase		       =   state_dict.pop(F"segformer.encoder.block.{i}.{j}.attention.self.kv.weight"    )
									_UpperCAmelCase		       =   state_dict.pop(F"segformer.encoder.block.{i}.{j}.attention.self.kv.bias"    )
									# next, add keys and values (in that order) to the state dict
									_UpperCAmelCase		       =   kv_weight[
									    : config.hidden_sizes[i], :
									]
									_UpperCAmelCase		       =   kv_bias[: config.hidden_sizes[i]]
									_UpperCAmelCase		       =   kv_weight[
									    config.hidden_sizes[i] :, :
									]
									_UpperCAmelCase		       =   kv_bias[
									    config.hidden_sizes[i] :
									]





def 							A	(     )				-> Tuple:







			'''simple docstring'''
			_UpperCAmelCase		       =   'http://images.cocodataset.org/val2017/000000039769.jpg'
			_UpperCAmelCase		       =   Image.open(requests.get(_UpperCAmelCase							,   stream=_UpperCAmelCase    ).raw    )

			return image





@torch.no_grad()
def 							A	(     _UpperCAmelCase				:   Any							,   _UpperCAmelCase				:   Union[str, Any]							,   _UpperCAmelCase				:   Optional[Any]    )				-> int:







			'''simple docstring'''
			_UpperCAmelCase		       =   SegformerConfig()
			_UpperCAmelCase		       =   False

			# set attributes based on model_name
			_UpperCAmelCase		       =   'huggingface/label-files'
			if "segformer" in model_name:
						_UpperCAmelCase		       =   model_name[len('segformer.'    ) : len('segformer.'    ) + 2]
						if "ade" in model_name:
									_UpperCAmelCase		       =   150
									_UpperCAmelCase		       =   'ade20k-id2label.json'
									_UpperCAmelCase		       =   (1, 150, 128, 128)
						elif "city" in model_name:
									_UpperCAmelCase		       =   19
									_UpperCAmelCase		       =   'cityscapes-id2label.json'
									_UpperCAmelCase		       =   (1, 19, 128, 128)
						else:
									raise ValueError(F"Model {model_name} not supported"    )
			elif "mit" in model_name:
						_UpperCAmelCase		       =   True
						_UpperCAmelCase		       =   model_name[4:6]
						_UpperCAmelCase		       =   1_000
						_UpperCAmelCase		       =   'imagenet-1k-id2label.json'
						_UpperCAmelCase		       =   (1, 1_000)
			else:
						raise ValueError(F"Model {model_name} not supported"    )

			# set config attributes
			_UpperCAmelCase		       =   json.load(open(hf_hub_download(_UpperCAmelCase							,   _UpperCAmelCase							,   repo_type='dataset'    )							,   'r'    )    )
			_UpperCAmelCase		       =   {int(_UpperCAmelCase    ): v for k, v in idalabel.items()}
			_UpperCAmelCase		       =   idalabel
			_UpperCAmelCase		       =   {v: k for k, v in idalabel.items()}
			if size == "b0":
						pass
			elif size == "b1":
						_UpperCAmelCase		       =   [64, 128, 320, 512]
						_UpperCAmelCase		       =   256
			elif size == "b2":
						_UpperCAmelCase		       =   [64, 128, 320, 512]
						_UpperCAmelCase		       =   768
						_UpperCAmelCase		       =   [3, 4, 6, 3]
			elif size == "b3":
						_UpperCAmelCase		       =   [64, 128, 320, 512]
						_UpperCAmelCase		       =   768
						_UpperCAmelCase		       =   [3, 4, 18, 3]
			elif size == "b4":
						_UpperCAmelCase		       =   [64, 128, 320, 512]
						_UpperCAmelCase		       =   768
						_UpperCAmelCase		       =   [3, 8, 27, 3]
			elif size == "b5":
						_UpperCAmelCase		       =   [64, 128, 320, 512]
						_UpperCAmelCase		       =   768
						_UpperCAmelCase		       =   [3, 6, 40, 3]
			else:
						raise ValueError(F"Size {size} not supported"    )

			# load image processor (only resize + normalize)
			_UpperCAmelCase		       =   SegformerImageProcessor(
			    image_scale=(512, 512)							,   keep_ratio=_UpperCAmelCase							,   align=_UpperCAmelCase							,   do_random_crop=_UpperCAmelCase    )

			# prepare image
			_UpperCAmelCase		       =   prepare_img()
			_UpperCAmelCase		       =   image_processor(images=_UpperCAmelCase							,   return_tensors='pt'    ).pixel_values

			logger.info(F"Converting model {model_name}..."    )

			# load original state dict
			if encoder_only:
						_UpperCAmelCase		       =   torch.load(_UpperCAmelCase							,   map_location=torch.device('cpu'    )    )
			else:
						_UpperCAmelCase		       =   torch.load(_UpperCAmelCase							,   map_location=torch.device('cpu'    )    )['state_dict']

			# rename keys
			_UpperCAmelCase		       =   rename_keys(_UpperCAmelCase							,   encoder_only=_UpperCAmelCase    )
			if not encoder_only:
						del state_dict["decode_head.conv_seg.weight"]
						del state_dict["decode_head.conv_seg.bias"]

			# key and value matrices need special treatment
			read_in_k_v(_UpperCAmelCase							,   _UpperCAmelCase    )

			# create HuggingFace model and load state dict
			if encoder_only:
						_UpperCAmelCase		       =   False
						_UpperCAmelCase		       =   SegformerForImageClassification(_UpperCAmelCase    )
			else:
						_UpperCAmelCase		       =   SegformerForSemanticSegmentation(_UpperCAmelCase    )
			model.load_state_dict(_UpperCAmelCase    )
			model.eval()

			# forward pass
			_UpperCAmelCase		       =   model(_UpperCAmelCase    )
			_UpperCAmelCase		       =   outputs.logits

			# set expected_slice based on model name
			# ADE20k checkpoints
			if model_name == "segformer.b0.512x512.ade.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-4.6310, -5.5232, -6.2356], [-5.1921, -6.1444, -6.5996], [-5.4424, -6.2790, -6.7574]],
						        [[-12.1391, -13.3122, -13.9554], [-12.8732, -13.9352, -14.3563], [-12.9438, -13.8226, -14.2513]],
						        [[-12.5134, -13.4686, -14.4915], [-12.8669, -14.4343, -14.7758], [-13.2523, -14.5819, -15.0694]],
						    ]    )
			elif model_name == "segformer.b1.512x512.ade.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-7.5820, -8.7231, -8.3215], [-8.0600, -10.3529, -10.0304], [-7.5208, -9.4103, -9.6239]],
						        [[-12.6918, -13.8994, -13.7137], [-13.3196, -15.7523, -15.4789], [-12.9343, -14.8757, -14.9689]],
						        [[-11.1911, -11.9421, -11.3243], [-11.3342, -13.6839, -13.3581], [-10.3909, -12.1832, -12.4858]],
						    ]    )
			elif model_name == "segformer.b2.512x512.ade.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-11.8173, -14.3850, -16.3128], [-14.5648, -16.5804, -18.6568], [-14.7223, -15.7387, -18.4218]],
						        [[-15.7290, -17.9171, -19.4423], [-18.3105, -19.9448, -21.4661], [-17.9296, -18.6497, -20.7910]],
						        [[-15.0783, -17.0336, -18.2789], [-16.8771, -18.6870, -20.1612], [-16.2454, -17.1426, -19.5055]],
						    ]    )
			elif model_name == "segformer.b3.512x512.ade.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-9.0878, -10.2081, -10.1891], [-9.3144, -10.7941, -10.9843], [-9.2294, -10.3855, -10.5704]],
						        [[-12.2316, -13.9068, -13.6102], [-12.9161, -14.3702, -14.3235], [-12.5233, -13.7174, -13.7932]],
						        [[-14.6275, -15.2490, -14.9727], [-14.3400, -15.9687, -16.2827], [-14.1484, -15.4033, -15.8937]],
						    ]    )
			elif model_name == "segformer.b4.512x512.ade.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-12.3144, -13.2447, -14.0802], [-13.3614, -14.5816, -15.6117], [-13.3340, -14.4433, -16.2219]],
						        [[-19.2781, -20.4128, -20.7506], [-20.6153, -21.6566, -22.0998], [-19.9800, -21.0430, -22.1494]],
						        [[-18.8739, -19.7804, -21.1834], [-20.1233, -21.6765, -23.2944], [-20.0315, -21.2641, -23.6944]],
						    ]    )
			elif model_name == "segformer.b5.640x640.ade.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-9.5524, -12.0835, -11.7348], [-10.5229, -13.6446, -14.5662], [-9.5842, -12.8851, -13.9414]],
						        [[-15.3432, -17.5323, -17.0818], [-16.3330, -18.9255, -19.2101], [-15.1340, -17.7848, -18.3971]],
						        [[-12.6072, -14.9486, -14.6631], [-13.7629, -17.0907, -17.7745], [-12.7899, -16.1695, -17.1671]],
						    ]    )
			# Cityscapes checkpoints
			elif model_name == "segformer.b0.1024x1024.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-11.9295, -13.4057, -14.8106], [-13.3431, -14.8179, -15.3781], [-14.2836, -15.5942, -16.1588]],
						        [[-11.4906, -12.8067, -13.6564], [-13.1189, -14.0500, -14.1543], [-13.8748, -14.5136, -14.8789]],
						        [[0.5374, 0.1067, -0.4742], [0.1141, -0.2255, -0.7099], [-0.3000, -0.5924, -1.3105]],
						    ]    )
			elif model_name == "segformer.b0.512x1024.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-7.8217, -9.8767, -10.1717], [-9.4438, -10.9058, -11.4047], [-9.7939, -12.3495, -12.1079]],
						        [[-7.1514, -9.5336, -10.0860], [-9.7776, -11.6822, -11.8439], [-10.1411, -12.7655, -12.8972]],
						        [[0.3021, 0.0805, -0.2310], [-0.0328, -0.1605, -0.2714], [-0.1408, -0.5477, -0.6976]],
						    ]    )
			elif model_name == "segformer.b0.640x1280.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [
						            [-1.13_72E01, -1.27_87E01, -1.34_77E01],
						            [-1.25_36E01, -1.41_94E01, -1.44_09E01],
						            [-1.32_17E01, -1.48_88E01, -1.53_27E01],
						        ],
						        [
						            [-1.47_91E01, -1.71_22E01, -1.82_77E01],
						            [-1.71_63E01, -1.91_92E01, -1.95_33E01],
						            [-1.78_97E01, -1.99_91E01, -2.03_15E01],
						        ],
						        [
						            [7.67_23E-01, 4.19_21E-01, -7.78_78E-02],
						            [4.77_72E-01, 9.55_57E-03, -2.80_82E-01],
						            [3.60_32E-01, -2.48_26E-01, -5.11_68E-01],
						        ],
						    ]    )
			elif model_name == "segformer.b0.768x768.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-9.4959, -11.3087, -11.7479], [-11.0025, -12.6540, -12.3319], [-11.4064, -13.0487, -12.9905]],
						        [[-9.8905, -11.3084, -12.0854], [-11.1726, -12.7698, -12.9583], [-11.5985, -13.3278, -14.1774]],
						        [[0.2213, 0.0192, -0.2466], [-0.1731, -0.4213, -0.4874], [-0.3126, -0.6541, -1.1389]],
						    ]    )
			elif model_name == "segformer.b1.1024x1024.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-13.5748, -13.9111, -12.6500], [-14.3500, -15.3683, -14.2328], [-14.7532, -16.0424, -15.6087]],
						        [[-17.1651, -15.8725, -12.9653], [-17.2580, -17.3718, -14.8223], [-16.6058, -16.8783, -16.7452]],
						        [[-3.6456, -3.0209, -1.4203], [-3.0797, -3.1959, -2.0000], [-1.8757, -1.9217, -1.6997]],
						    ]    )
			elif model_name == "segformer.b2.1024x1024.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-16.0976, -16.4856, -17.3962], [-16.6234, -19.0342, -19.7685], [-16.0900, -18.0661, -19.1180]],
						        [[-18.4750, -18.8488, -19.5074], [-19.4030, -22.1570, -22.5977], [-19.1191, -20.8486, -22.3783]],
						        [[-4.5178, -5.5037, -6.5109], [-5.0884, -7.2174, -8.0334], [-4.4156, -5.8117, -7.2970]],
						    ]    )
			elif model_name == "segformer.b3.1024x1024.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-14.2081, -14.4732, -14.1977], [-14.5867, -16.4423, -16.6356], [-13.4441, -14.9685, -16.8696]],
						        [[-14.4576, -14.7073, -15.0451], [-15.0816, -17.6237, -17.9873], [-14.4213, -16.0199, -18.5992]],
						        [[-4.7349, -4.9588, -5.0966], [-4.3210, -6.9325, -7.2591], [-3.4312, -4.7484, -7.1917]],
						    ]    )
			elif model_name == "segformer.b4.1024x1024.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-11.7737, -11.9526, -11.3273], [-13.6692, -14.4574, -13.8878], [-13.8937, -14.6924, -15.9345]],
						        [[-14.6706, -14.5330, -14.1306], [-16.1502, -16.8180, -16.4269], [-16.8338, -17.8939, -20.1746]],
						        [[1.0491, 0.8289, 1.0310], [1.1044, 0.5219, 0.8055], [1.0899, 0.6926, 0.5590]],
						    ]    )
			elif model_name == "segformer.b5.1024x1024.city.160k":
						_UpperCAmelCase		       =   torch.tensor(
						    [
						        [[-12.5641, -13.4777, -13.0684], [-13.9587, -15.8983, -16.6557], [-13.3109, -15.7350, -16.3141]],
						        [[-14.7074, -15.4352, -14.5944], [-16.6353, -18.1663, -18.6120], [-15.1702, -18.0329, -18.1547]],
						        [[-1.7990, -2.0951, -1.7784], [-2.6397, -3.8245, -3.9686], [-1.5264, -2.8126, -2.9316]],
						    ]    )
			else:
						_UpperCAmelCase		       =   logits.argmax(-1    ).item()
						print('Predicted class:'							,   model.config.idalabel[predicted_class_idx]    )

			# verify logits
			if not encoder_only:
						assert logits.shape == expected_shape
						assert torch.allclose(logits[0, :3, :3, :3]							,   _UpperCAmelCase							,   atol=1E-2    )

			# finally, save model and image processor
			logger.info(F"Saving PyTorch model and image processor to {pytorch_dump_folder_path}..."    )
			Path(_UpperCAmelCase    ).mkdir(exist_ok=_UpperCAmelCase    )
			model.save_pretrained(_UpperCAmelCase    )
			image_processor.save_pretrained(_UpperCAmelCase    )


if __name__ == "__main__":
							UpperCAmelCase__   =       argparse.ArgumentParser()

							parser.add_argument(
							    "--model_name",
							    default="segformer.b0.512x512.ade.160k",
							    type=str,
							    help="Name of the model you'd like to convert.",
							)
							parser.add_argument(
							    "--checkpoint_path", default=None, type=str, help="Path to the original PyTorch checkpoint (.pth file)."
							)
							parser.add_argument(
							    "--pytorch_dump_folder_path", default=None, type=str, help="Path to the folder to output PyTorch model."
							)
							UpperCAmelCase__   =       parser.parse_args()
							convert_segformer_checkpoint(args.model_name, args.checkpoint_path, args.pytorch_dump_folder_path)





from typing import Dict, List

from nltk.translate import gleu_score

import datasets
from datasets import MetricInfo


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

a_   :List[str]        =      "\\nThe BLEU score has some undesirable properties when used for single\nsentences, as it was designed to be a corpus measure. We therefore\nuse a slightly different score for our RL experiments which we call\nthe 'GLEU score'. For the GLEU score, we record all sub-sequences of\n1, 2, 3 or 4 tokens in output and target sequence (n-grams). We then\ncompute a recall, which is the ratio of the number of matching n-grams\nto the number of total n-grams in the target (ground truth) sequence,\nand a precision, which is the ratio of the number of matching n-grams\nto the number of total n-grams in the generated output sequence. Then\nGLEU score is simply the minimum of recall and precision. This GLEU\nscore's range is always between 0 (no matches) and 1 (all match) and\nit is symmetrical when switching output and target. According to\nour experiments, GLEU score correlates quite well with the BLEU\nmetric on a corpus level but does not have its drawbacks for our per\nsentence reward objective.\n"

a_   :List[str]        =      "\\nComputes corpus-level Google BLEU (GLEU) score of translated segments against one or more references.\nInstead of averaging the sentence level GLEU scores (i.e. macro-average precision), Wu et al. (2016) sum up the matching\ntokens and the max of hypothesis and reference tokens for each sentence, then compute using the aggregate values.\n\nArgs:\n    predictions (list of str): list of translations to score.\n        Each translation should be tokenized into a list of tokens.\n    references (list of list of str): list of lists of references for each translation.\n        Each reference should be tokenized into a list of tokens.\n    min_len (int): The minimum order of n-gram this function should extract. Defaults to 1.\n    max_len (int): The maximum order of n-gram this function should extract. Defaults to 4.\n\nReturns:\n    'google_bleu': google_bleu score\n\nExamples:\n    Example 1:\n        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',\n        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',\n        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']\n        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',\n        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',\n        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']\n\n        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',\n        ...         'interested', 'in', 'world', 'history']\n        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',\n        ...          'because', 'he', 'read', 'the', 'book']\n\n        >>> list_of_references = [[ref1a], [ref2a]]\n        >>> hypotheses = [hyp1, hyp2]\n        >>> google_bleu = datasets.load_metric(\"google_bleu\")\n        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references)\n        >>> print(round(results[\"google_bleu\"], 2))\n        0.44\n\n    Example 2:\n        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',\n        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',\n        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']\n        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',\n        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',\n        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']\n        >>> ref1b = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',\n        ...          'ensures', 'that', 'the', 'rubber', 'duck', 'will', 'never',\n        ...          'heed', 'the', 'cat', 'commands']\n        >>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',\n        ...          'rubber', 'duck', 'army', 'never', 'to', 'heed', 'the', 'directions',\n        ...          'of', 'the', 'cat']\n\n        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',\n        ...         'interested', 'in', 'world', 'history']\n        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',\n        ...          'because', 'he', 'read', 'the', 'book']\n\n        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]\n        >>> hypotheses = [hyp1, hyp2]\n        >>> google_bleu = datasets.load_metric(\"google_bleu\")\n        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references)\n        >>> print(round(results[\"google_bleu\"], 2))\n        0.61\n\n    Example 3:\n        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',\n        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',\n        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']\n        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',\n        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',\n        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']\n        >>> ref1b = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',\n        ...          'ensures', 'that', 'the', 'rubber', 'duck', 'will', 'never',\n        ...          'heed', 'the', 'cat', 'commands']\n        >>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',\n        ...          'rubber', 'duck', 'army', 'never', 'to', 'heed', 'the', 'directions',\n        ...          'of', 'the', 'cat']\n\n        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',\n        ...         'interested', 'in', 'world', 'history']\n        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',\n        ...          'because', 'he', 'read', 'the', 'book']\n\n        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]\n        >>> hypotheses = [hyp1, hyp2]\n        >>> google_bleu = datasets.load_metric(\"google_bleu\")\n        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references, min_len=2)\n        >>> print(round(results[\"google_bleu\"], 2))\n        0.53\n\n    Example 4:\n        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',\n        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',\n        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']\n        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',\n        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',\n        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']\n        >>> ref1b = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',\n        ...          'ensures', 'that', 'the', 'rubber', 'duck', 'will', 'never',\n        ...          'heed', 'the', 'cat', 'commands']\n        >>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',\n        ...          'rubber', 'duck', 'army', 'never', 'to', 'heed', 'the', 'directions',\n        ...          'of', 'the', 'cat']\n\n        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',\n        ...         'interested', 'in', 'world', 'history']\n        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',\n        ...          'because', 'he', 'read', 'the', 'book']\n\n        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]\n        >>> hypotheses = [hyp1, hyp2]\n        >>> google_bleu = datasets.load_metric(\"google_bleu\")\n        >>> results = google_bleu.compute(predictions=hypotheses,references=list_of_references, min_len=2, max_len=6)\n        >>> print(round(results[\"google_bleu\"], 2))\n        0.4\n"




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






     """simple docstring"""


     def    lowercase_   (       self  :  str					)   ->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    lowercase_   (       self  :  str, _snake_case  :  List[List[List[str]]], _snake_case  :  List[List[str]], _snake_case  :  int = 1, _snake_case  :  int = 4, )   ->Dict[str, float]:
            return {
                "google_bleu": gleu_score.corpus_gleu(
                    list_of_references=_snake_case, hypotheses=_snake_case, min_len=_snake_case, max_len=_snake_case					)
            }






