

'''simple docstring'''



import json
import os
import shutil
import warnings
from argparse import ArgumentParser, Namespace
from pathlib import Path
from typing import List

from ..utils import logging
from . import BaseTransformersCLICommand


try:
     from cookiecutter.main import cookiecutter

     _UpperCamelCase						:  Tuple							       =				True
except ImportError:
     _UpperCamelCase						:  Union[str, Any]							       =				False

_UpperCamelCase						:  List[Any]							       =				logging.get_logger(__name__)  # pylint: disable=invalid-name


def       snake_case   (	snake_case      : Namespace			) ->  int:


    """simple docstring"""


    return AddNewModelCommand(args.testing					,		args.testing_file					,		path=args.path			)



class 				_snake_case					(   a_			):

  @staticmethod
  def   _SCREAMING_SNAKE_CASE				(				_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      lowerCAmelCase 						=							parser.add_parser('add-new-model'	)
      add_new_model_parser.add_argument('--testing'      , action='store_true'      , help='If in testing mode.'	)
      add_new_model_parser.add_argument('--testing_file'      , type=_SCREAMING_SNAKE_CASE      , help='Configuration file on which to run.'	)
      add_new_model_parser.add_argument(
          '--path'      , type=_SCREAMING_SNAKE_CASE      , help='Path to cookiecutter. Should only be used for testing purposes.'	)
      add_new_model_parser.set_defaults(func=_SCREAMING_SNAKE_CASE	)

  def __init__(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE=None      , *_SCREAMING_SNAKE_CASE	):





      '''simple docstring'''

      lowerCAmelCase 						=							testing
      lowerCAmelCase 						=							testing_file
      lowerCAmelCase 						=							path


  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      warnings.warn(
          'The command `transformers-cli add-new-model` is deprecated and will be removed in v5 of Transformers. '
          'It is not actively maintained anymore, so might give a result that won\'t pass all tests and quality '
          'checks, you should use `transformers-cli add-new-model-like` instead.'	)
      if not _has_cookiecutter:
          raise ImportError(
              'Model creation dependencies are required to use the `add_new_model` command. Install them by running '
              'the following at the root of your `transformers` clone:\n\n\t$ pip install -e .[modelcreation]\n'	)
      # Ensure that there is no other `cookiecutter-template-xxx` directory in the current working directory
      lowerCAmelCase 						=							[directory for directory in os.listdir() if 'cookiecutter-template-' == directory[:22]]
      if len(_SCREAMING_SNAKE_CASE	) > 0:
          raise ValueError(
              'Several directories starting with `cookiecutter-template-` in current working directory. '
              'Please clean your directory by removing all folders starting with `cookiecutter-template-` or '
              'change your working directory.'	)

      lowerCAmelCase 						=							(
          Path(_SCREAMING_SNAKE_CASE	).parent.parent.parent.parent if self._path is None else Path(self._path	).parent.parent
      )
      lowerCAmelCase 						=							path_to_transformer_root / 'templates' / 'adding_a_new_model'

      # Execute cookiecutter
      if not self._testing:
          cookiecutter(str(_SCREAMING_SNAKE_CASE	)	)
      else:
          with open(self._testing_file      , 'r'	) as configuration_file:
              lowerCAmelCase 						=							json.load(_SCREAMING_SNAKE_CASE	)

          cookiecutter(
              str(path_to_cookiecutter if self._path is None else self._path	)      , no_input=_SCREAMING_SNAKE_CASE      , extra_context=_SCREAMING_SNAKE_CASE      , )

      lowerCAmelCase 						=							[directory for directory in os.listdir() if 'cookiecutter-template-' in directory[:22]][0]

      # Retrieve configuration
      with open(directory + '/configuration.json'      , 'r'	) as configuration_file:
          lowerCAmelCase 						=							json.load(_SCREAMING_SNAKE_CASE	)

      lowerCAmelCase 						=							configuration['lowercase_modelname']
      lowerCAmelCase 						=							configuration['generate_tensorflow_pytorch_and_flax']
      os.remove(F'{directory}/configuration.json'	)

      lowerCAmelCase 						=							'PyTorch' in generate_tensorflow_pytorch_and_flax
      lowerCAmelCase 						=							'TensorFlow' in generate_tensorflow_pytorch_and_flax
      lowerCAmelCase 						=							'Flax' in generate_tensorflow_pytorch_and_flax

      lowerCAmelCase 						=							F'{path_to_transformer_root}/src/transformers/models/{lowercase_model_name}'
      os.makedirs(_SCREAMING_SNAKE_CASE      , exist_ok=_SCREAMING_SNAKE_CASE	)
      os.makedirs(F'{path_to_transformer_root}/tests/models/{lowercase_model_name}'      , exist_ok=_SCREAMING_SNAKE_CASE	)

      # Tests require submodules as they have parent imports
      with open(F'{path_to_transformer_root}/tests/models/{lowercase_model_name}/__init__.py'      , 'w'	):
          pass

      shutil.move(
          F'{directory}/__init__.py'      , F'{model_dir}/__init__.py'      , )
      shutil.move(
          F'{directory}/configuration_{lowercase_model_name}.py'      , F'{model_dir}/configuration_{lowercase_model_name}.py'      , )

      def remove_copy_lines(_SCREAMING_SNAKE_CASE	):
          with open(_SCREAMING_SNAKE_CASE      , 'r'	) as f:
              lowerCAmelCase 						=							f.readlines()
          with open(_SCREAMING_SNAKE_CASE      , 'w'	) as f:
              for line in lines:
                  if "# Copied from transformers." not in line:
                      f.write(_SCREAMING_SNAKE_CASE	)

      if output_pytorch:
          if not self._testing:
              remove_copy_lines(F'{directory}/modeling_{lowercase_model_name}.py'	)

          shutil.move(
              F'{directory}/modeling_{lowercase_model_name}.py'      , F'{model_dir}/modeling_{lowercase_model_name}.py'      , )

          shutil.move(
              F'{directory}/test_modeling_{lowercase_model_name}.py'      , F'{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_{lowercase_model_name}.py'      , )
      else:
          os.remove(F'{directory}/modeling_{lowercase_model_name}.py'	)
          os.remove(F'{directory}/test_modeling_{lowercase_model_name}.py'	)

      if output_tensorflow:
          if not self._testing:
              remove_copy_lines(F'{directory}/modeling_tf_{lowercase_model_name}.py'	)

          shutil.move(
              F'{directory}/modeling_tf_{lowercase_model_name}.py'      , F'{model_dir}/modeling_tf_{lowercase_model_name}.py'      , )

          shutil.move(
              F'{directory}/test_modeling_tf_{lowercase_model_name}.py'      , F'{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_tf_{lowercase_model_name}.py'      , )
      else:
          os.remove(F'{directory}/modeling_tf_{lowercase_model_name}.py'	)
          os.remove(F'{directory}/test_modeling_tf_{lowercase_model_name}.py'	)

      if output_flax:
          if not self._testing:
              remove_copy_lines(F'{directory}/modeling_flax_{lowercase_model_name}.py'	)

          shutil.move(
              F'{directory}/modeling_flax_{lowercase_model_name}.py'      , F'{model_dir}/modeling_flax_{lowercase_model_name}.py'      , )

          shutil.move(
              F'{directory}/test_modeling_flax_{lowercase_model_name}.py'      , F'{path_to_transformer_root}/tests/models/{lowercase_model_name}/test_modeling_flax_{lowercase_model_name}.py'      , )
      else:
          os.remove(F'{directory}/modeling_flax_{lowercase_model_name}.py'	)
          os.remove(F'{directory}/test_modeling_flax_{lowercase_model_name}.py'	)

      shutil.move(
          F'{directory}/{lowercase_model_name}.md'      , F'{path_to_transformer_root}/docs/source/en/model_doc/{lowercase_model_name}.md'      , )

      shutil.move(
          F'{directory}/tokenization_{lowercase_model_name}.py'      , F'{model_dir}/tokenization_{lowercase_model_name}.py'      , )

      shutil.move(
          F'{directory}/tokenization_fast_{lowercase_model_name}.py'      , F'{model_dir}/tokenization_{lowercase_model_name}_fast.py'      , )

      from os import fdopen, remove
      from shutil import copymode, move
      from tempfile import mkstemp

      def replace(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	):
          # Create temp file
          lowerCAmelCase						,   lowerCAmelCase 						=							mkstemp()
          lowerCAmelCase 						=							False
          with fdopen(_SCREAMING_SNAKE_CASE      , 'w'	) as new_file:
              with open(_SCREAMING_SNAKE_CASE	) as old_file:
                  for line in old_file:
                      new_file.write(_SCREAMING_SNAKE_CASE	)
                      if line_to_copy_below in line:
                          lowerCAmelCase 						=							True
                          for line_to_copy in lines_to_copy:
                              new_file.write(_SCREAMING_SNAKE_CASE	)

          if not line_found:
              raise ValueError(F'Line {line_to_copy_below} was not found in file.'	)

          # Copy the file permissions from the old file to the new file
          copymode(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)
          # Remove original file
          remove(_SCREAMING_SNAKE_CASE	)
          # Move new file
          move(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)

      def skip_units(_SCREAMING_SNAKE_CASE	):
          return (
              ("generating PyTorch" in line and not output_pytorch)
              or ("generating TensorFlow" in line and not output_tensorflow)
              or ("generating Flax" in line and not output_flax)
          )

      def replace_in_files(_SCREAMING_SNAKE_CASE	):
          with open(_SCREAMING_SNAKE_CASE	) as datafile:
              lowerCAmelCase 						=							[]
              lowerCAmelCase 						=							False
              lowerCAmelCase 						=							False
              for line in datafile:
                  if "# To replace in: " in line and "##" not in line:
                      lowerCAmelCase 						=							line.split('"'	)[1]
                      lowerCAmelCase 						=							skip_units(_SCREAMING_SNAKE_CASE	)
                  elif "# Below: " in line and "##" not in line:
                      lowerCAmelCase 						=							line.split('"'	)[1]
                      lowerCAmelCase 						=							skip_units(_SCREAMING_SNAKE_CASE	)
                  elif "# End." in line and "##" not in line:
                      if not skip_file and not skip_snippet:
                          replace(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)

                      lowerCAmelCase 						=							[]
                  elif "# Replace with" in line and "##" not in line:
                      lowerCAmelCase 						=							[]
                  elif "##" not in line:
                      lines_to_copy.append(_SCREAMING_SNAKE_CASE	)

          remove(_SCREAMING_SNAKE_CASE	)

      replace_in_files(F'{directory}/to_replace_{lowercase_model_name}.py'	)
      os.rmdir(_SCREAMING_SNAKE_CASE	)








'''simple docstring'''



import sacrebleu as scb
from packaging import version
from sacrebleu import TER

import datasets


_UpperCamelCase						:  Optional[Any]							       =				"\\n@inproceedings{snover-etal-2006-study,\n    title = \"A Study of Translation Edit Rate with Targeted Human Annotation\",\n    author = \"Snover, Matthew  and\n      Dorr, Bonnie  and\n      Schwartz, Rich  and\n      Micciulla, Linnea  and\n      Makhoul, John\",\n    booktitle = \"Proceedings of the 7th Conference of the Association for Machine Translation in the Americas: Technical Papers\",\n    month = aug # \" 8-12\",\n    year = \"2006\",\n    address = \"Cambridge, Massachusetts, USA\",\n    publisher = \"Association for Machine Translation in the Americas\",\n    url = \"https://aclanthology.org/2006.amta-papers.25\",\n    pages = \"223--231\",\n}\n@inproceedings{post-2018-call,\n    title = \"A Call for Clarity in Reporting {BLEU} Scores\",\n    author = \"Post, Matt\",\n    booktitle = \"Proceedings of the Third Conference on Machine Translation: Research Papers\",\n    month = oct,\n    year = \"2018\",\n    address = \"Belgium, Brussels\",\n    publisher = \"Association for Computational Linguistics\",\n    url = \"https://www.aclweb.org/anthology/W18-6319\",\n    pages = \"186--191\",\n}\n"

_UpperCamelCase						:  Any							       =				"\\nTER (Translation Edit Rate, also called Translation Error Rate) is a metric to quantify the edit operations that a\nhypothesis requires to match a reference translation. We use the implementation that is already present in sacrebleu\n(https://github.com/mjpost/sacreBLEU#ter), which in turn is inspired by the TERCOM implementation, which can be found\nhere: https://github.com/jhclark/tercom.\n\nThe implementation here is slightly different from sacrebleu in terms of the required input format. The length of\nthe references and hypotheses lists need to be the same, so you may need to transpose your references compared to\nsacrebleu's required input format. See https://github.com/huggingface/datasets/issues/3154#issuecomment-950746534\n\nSee the README.md file at https://github.com/mjpost/sacreBLEU#ter for more information.\n"

_UpperCamelCase						:  Dict							       =				"\nProduces TER scores alongside the number of edits and reference length.\n\nArgs:\n    predictions (list of str): The system stream (a sequence of segments).\n    references (list of list of str): A list of one or more reference streams (each a sequence of segments).\n    normalized (boolean): If `True`, applies basic tokenization and normalization to sentences. Defaults to `False`.\n    ignore_punct (boolean): If `True`, applies basic tokenization and normalization to sentences. Defaults to `False`.\n    support_zh_ja_chars (boolean): If `True`, tokenization/normalization supports processing of Chinese characters,\n                                    as well as Japanese Kanji, Hiragana, Katakana, and Phonetic Extensions of Katakana.\n                                    Only applies if `normalized = True`. Defaults to `False`.\n    case_sensitive (boolean): If `False`, makes all predictions and references lowercase to ignore differences in case. Defaults to `False`.\n\nReturns:\n    'score' (float): TER score (num_edits / sum_ref_lengths * 100)\n    'num_edits' (int): The cumulative number of edits\n    'ref_length' (float): The cumulative average reference length\n\nExamples:\n    Example 1:\n        >>> predictions = [\"does this sentence match??\",\n        ...                     \"what about this sentence?\",\n        ...                     \"What did the TER metric user say to the developer?\"]\n        >>> references = [[\"does this sentence match\", \"does this sentence match!?!\"],\n        ...             [\"wHaT aBoUt ThIs SeNtEnCe?\", \"wHaT aBoUt ThIs SeNtEnCe?\"],\n        ...             [\"Your jokes are...\", \"...TERrible\"]]\n        >>> ter = datasets.load_metric(\"ter\")\n        >>> results = ter.compute(predictions=predictions,\n        ...                         references=references,\n        ...                         case_sensitive=True)\n        >>> print(results)\n        {'score': 150.0, 'num_edits': 15, 'ref_length': 10.0}\n\n    Example 2:\n        >>> predictions = [\"does this sentence match??\",\n        ...                     \"what about this sentence?\"]\n        >>> references = [[\"does this sentence match\", \"does this sentence match!?!\"],\n        ...             [\"wHaT aBoUt ThIs SeNtEnCe?\", \"wHaT aBoUt ThIs SeNtEnCe?\"]]\n        >>> ter = datasets.load_metric(\"ter\")\n        >>> results = ter.compute(predictions=predictions,\n        ...                         references=references,\n        ...                         case_sensitive=True)\n        >>> print(results)\n        {'score': 62.5, 'num_edits': 5, 'ref_length': 8.0}\n\n    Example 3:\n        >>> predictions = [\"does this sentence match??\",\n        ...                     \"what about this sentence?\"]\n        >>> references = [[\"does this sentence match\", \"does this sentence match!?!\"],\n        ...             [\"wHaT aBoUt ThIs SeNtEnCe?\", \"wHaT aBoUt ThIs SeNtEnCe?\"]]\n        >>> ter = datasets.load_metric(\"ter\")\n        >>> results = ter.compute(predictions=predictions,\n        ...                         references=references,\n        ...                         normalized=True,\n        ...                         case_sensitive=True)\n        >>> print(results)\n        {'score': 57.14285714285714, 'num_edits': 6, 'ref_length': 10.5}\n\n    Example 4:\n        >>> predictions = [\"does this sentence match??\",\n        ...                     \"what about this sentence?\"]\n        >>> references = [[\"does this sentence match\", \"does this sentence match!?!\"],\n        ...             [\"wHaT aBoUt ThIs SeNtEnCe?\", \"wHaT aBoUt ThIs SeNtEnCe?\"]]\n        >>> ter = datasets.load_metric(\"ter\")\n        >>> results = ter.compute(predictions=predictions,\n        ...                         references=references,\n        ...                         ignore_punct=True,\n        ...                         case_sensitive=False)\n        >>> print(results)\n        {'score': 0.0, 'num_edits': 0, 'ref_length': 8.0}\n\n    Example 5:\n        >>> predictions = [\"does this sentence match??\",\n        ...                    \"what about this sentence?\",\n        ...                    \"What did the TER metric user say to the developer?\"]\n        >>> references = [[\"does this sentence match\", \"does this sentence match!?!\"],\n        ...             [\"wHaT aBoUt ThIs SeNtEnCe?\", \"wHaT aBoUt ThIs SeNtEnCe?\"],\n        ...             [\"Your jokes are...\", \"...TERrible\"]]\n        >>> ter = datasets.load_metric(\"ter\")\n        >>> results = ter.compute(predictions=predictions,\n        ...                         references=references,\n        ...                         ignore_punct=True,\n        ...                         case_sensitive=False)\n        >>> print(results)\n        {'score': 100.0, 'num_edits': 10, 'ref_length': 10.0}\n"



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

  def   _SCREAMING_SNAKE_CASE				(				self	):





      '''simple docstring'''

      if version.parse(scb.__version__	) < version.parse('1.4.12'	):
          raise ImportWarning(
              'To use `sacrebleu`, the module `sacrebleu>=1.4.12` is required, and the current version of `sacrebleu` doesn\'t match this condition.\n'
              'You can install it with `pip install "sacrebleu>=1.4.12"`.'	)
      return datasets.MetricInfo(
          description=_DESCRIPTION      , citation=_CITATION      , homepage='http://www.cs.umd.edu/~snover/tercom/'      , inputs_description=_KWARGS_DESCRIPTION      , features=datasets.Features(
              {
                  'predictions': datasets.Value('string'      , id='sequence'	),
                  'references': datasets.Sequence(datasets.Value('string'      , id='sequence'	)      , id='references'	),
              }	)      , codebase_urls=['https://github.com/mjpost/sacreBLEU#ter']      , reference_urls=[
              'https://github.com/jhclark/tercom',
          ]      , )


  def   _SCREAMING_SNAKE_CASE				(				self      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE = False      , _SCREAMING_SNAKE_CASE = False      , _SCREAMING_SNAKE_CASE = False      , _SCREAMING_SNAKE_CASE = False      , ):





      '''simple docstring'''

      lowerCAmelCase 						=							len(references[0]	)
      if any(len(_SCREAMING_SNAKE_CASE	) != references_per_prediction for refs in references	):
          raise ValueError('Sacrebleu requires the same number of references for each prediction'	)
      lowerCAmelCase 						=							[[refs[i] for refs in references] for i in range(_SCREAMING_SNAKE_CASE	)]

      lowerCAmelCase 						=							TER(
          normalized=_SCREAMING_SNAKE_CASE      , no_punct=_SCREAMING_SNAKE_CASE      , asian_support=_SCREAMING_SNAKE_CASE      , case_sensitive=_SCREAMING_SNAKE_CASE      , )
      lowerCAmelCase 						=							sb_ter.corpus_score(_SCREAMING_SNAKE_CASE      , _SCREAMING_SNAKE_CASE	)

      return {"score": output.score, "num_edits": output.num_edits, "ref_length": output.ref_length}





