
"""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

				_a														=		True
except ImportError:
				_a														=		False

_a														=		logging.get_logger(__name__)  # pylint: disable=invalid-name



def       lowerCamelCase__		(			__snake_case	)							->		Optional[Any]:


					"""simple docstring"""





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






class     _UpperCAmelCase(    lowerCamelCase	):



		@staticmethod
		def 						UpperCAmelCase							(					__a)       ->       List[str]:






							'''simple docstring'''
							_UpperCamelCase							 =  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=__a				,		help='''Configuration file on which to run.''')
							add_new_model_parser.add_argument(
							    '''--path'''				,		type=__a				,		help='''Path to cookiecutter. Should only be used for testing purposes.''')
							add_new_model_parser.set_defaults(func=__a)



		def __init__(					self				,		__a				,		__a				,		__a=None				,		*__a)       ->       Optional[Any]:






							'''simple docstring'''
							_UpperCamelCase							 =  testing
							_UpperCamelCase							 =  testing_file
							_UpperCamelCase							 =  path




		def 						UpperCAmelCase							(					self)       ->       Optional[Any]:






							'''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
							_UpperCamelCase							 =  [directory for directory in os.listdir() if '''cookiecutter-template-''' == directory[:22]]
							if len(__a) > 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.''')

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

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

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

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

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

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

							_UpperCamelCase							 =  '''PyTorch''' in generate_tensorflow_pytorch_and_flax
							_UpperCamelCase							 =  '''TensorFlow''' in generate_tensorflow_pytorch_and_flax
							_UpperCamelCase							 =  '''Flax''' in generate_tensorflow_pytorch_and_flax

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

							# 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(__a):
												with open(__a				,		'''r''') as f:
																	_UpperCamelCase							 =  f.readlines()
												with open(__a				,		'''w''') as f:
																	for line in lines:
																						if "# Copied from transformers." not in line:
																											f.write(__a)

							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(__a				,		__a				,		__a):
												# Create temp file
												_UpperCamelCase ,  _UpperCamelCase							 =  mkstemp()
												_UpperCamelCase							 =  False
												with fdopen(__a				,		'''w''') as new_file:
																	with open(__a) as old_file:
																						for line in old_file:
																											new_file.write(__a)
																											if line_to_copy_below in line:
																																_UpperCamelCase							 =  True
																																for line_to_copy in lines_to_copy:
																																					new_file.write(__a)

												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(__a				,		__a)
												# Remove original file
												remove(__a)
												# Move new file
												move(__a				,		__a)

							def skip_units(__a):
												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(__a):
												with open(__a) as datafile:
																	_UpperCamelCase							 =  []
																	_UpperCamelCase							 =  False
																	_UpperCamelCase							 =  False
																	for line in datafile:
																						if "# To replace in: " in line and "##" not in line:
																											_UpperCamelCase							 =  line.split('''"''')[1]
																											_UpperCamelCase							 =  skip_units(__a)
																						elif "# Below: " in line and "##" not in line:
																											_UpperCamelCase							 =  line.split('''"''')[1]
																											_UpperCamelCase							 =  skip_units(__a)
																						elif "# End." in line and "##" not in line:
																											if not skip_file and not skip_snippet:
																																replace(__a				,		__a				,		__a)

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

												remove(__a)

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








"""simple docstring"""





from graphs.minimum_spanning_tree_kruskal import kruskal



def       lowerCamelCase__		(			)							->		List[Any]:


					"""simple docstring"""





					_UpperCamelCase							 =  9
					_UpperCamelCase							 =  [
					    [0, 1, 4],
					    [0, 7, 8],
					    [1, 2, 8],
					    [7, 8, 7],
					    [7, 6, 1],
					    [2, 8, 2],
					    [8, 6, 6],
					    [2, 3, 7],
					    [2, 5, 4],
					    [6, 5, 2],
					    [3, 5, 14],
					    [3, 4, 9],
					    [5, 4, 10],
					    [1, 7, 11],
					]

					_UpperCamelCase							 =  kruskal(__snake_case,     __snake_case	)

					_UpperCamelCase							 =  [
					    [7, 6, 1],
					    [2, 8, 2],
					    [6, 5, 2],
					    [0, 1, 4],
					    [2, 5, 4],
					    [2, 3, 7],
					    [0, 7, 8],
					    [3, 4, 9],
					]

					assert sorted(__snake_case	) == sorted(__snake_case	)






