




import argparse
import os
import re

import packaging.version


UpperCamelCase__    			=			"""examples/"""
UpperCamelCase__    			=			{
    """examples""": (re.compile(R"""^check_min_version\(\"[^\"]+\"\)\s*$""", re.MULTILINE), """check_min_version(\"VERSION\")\n"""),
    """init""": (re.compile(R"""^__version__\s+=\s+\"([^\"]+)\"\s*$""", re.MULTILINE), """__version__ = \"VERSION\"\n"""),
    """setup""": (re.compile(R"""^(\s*)version\s*=\s*\"[^\"]+\",""", re.MULTILINE), R"""\1version=\"VERSION\","""),
    """doc""": (re.compile(R"""^(\s*)release\s*=\s*\"[^\"]+\"$""", re.MULTILINE), """release = \"VERSION\"\n"""),
}
UpperCamelCase__    			=			{
    """init""": """src/transformers/__init__.py""",
    """setup""": """setup.py""",
}
UpperCamelCase__    			=			"""README.md"""







def 	_a      (						SCREAMING_SNAKE_CASE_							:				Optional[int]      ,      SCREAMING_SNAKE_CASE_							:				Any      ,      SCREAMING_SNAKE_CASE_							:				List[str]     ):
					with open(SCREAMING_SNAKE_CASE_      ,      "r"      ,      encoding="utf-8"      ,      newline="\n"     ) as f:
										__lowerCAmelCase				   =       f.read()
					__lowerCAmelCase   ,							__lowerCAmelCase				   =       REPLACE_PATTERNS[pattern]
					__lowerCAmelCase				   =       replace.replace("VERSION"      ,      SCREAMING_SNAKE_CASE_     )
					__lowerCAmelCase				   =       re_pattern.sub(SCREAMING_SNAKE_CASE_      ,      SCREAMING_SNAKE_CASE_     )
					with open(SCREAMING_SNAKE_CASE_      ,      "w"      ,      encoding="utf-8"      ,      newline="\n"     ) as f:
										f.write(SCREAMING_SNAKE_CASE_     )







def 	_a      (						SCREAMING_SNAKE_CASE_							:				List[Any]     ):
					for folder, directories, fnames in os.walk(SCREAMING_SNAKE_CASE_     ):
										# Removing some of the folders with non-actively maintained examples from the walk
										if "research_projects" in directories:
															directories.remove("research_projects"     )
										if "legacy" in directories:
															directories.remove("legacy"     )
										for fname in fnames:
															if fname.endswith(".py"     ):
																				update_version_in_file(os.path.join(SCREAMING_SNAKE_CASE_      ,      SCREAMING_SNAKE_CASE_     )      ,      SCREAMING_SNAKE_CASE_      ,      pattern="examples"     )







def 	_a      (						SCREAMING_SNAKE_CASE_							:				Tuple      ,      SCREAMING_SNAKE_CASE_							:				Optional[int]=False     ):
					for pattern, fname in REPLACE_FILES.items():
										update_version_in_file(SCREAMING_SNAKE_CASE_      ,      SCREAMING_SNAKE_CASE_      ,      SCREAMING_SNAKE_CASE_     )
					if not patch:
										update_version_in_examples(SCREAMING_SNAKE_CASE_     )







def 	_a      (						):
					__lowerCAmelCase				   =       "🤗 Transformers currently provides the following architectures"
					__lowerCAmelCase				   =       "1. Want to contribute a new model?"
					with open(SCREAMING_SNAKE_CASE_      ,      "r"      ,      encoding="utf-8"      ,      newline="\n"     ) as f:
										__lowerCAmelCase				   =       f.readlines()

					# Find the start of the list.
					__lowerCAmelCase				   =       0
					while not lines[start_index].startswith(_start_prompt     ):
										start_index += 1
					start_index += 1

					__lowerCAmelCase				   =       start_index
					# Update the lines in the model list.
					while not lines[index].startswith(_end_prompt     ):
										if lines[index].startswith("1."     ):
															__lowerCAmelCase				   =       lines[index].replace(
															    "https://huggingface.co/docs/transformers/main/model_doc"      ,      "https://huggingface.co/docs/transformers/model_doc"      ,      )
										index += 1

					with open(SCREAMING_SNAKE_CASE_      ,      "w"      ,      encoding="utf-8"      ,      newline="\n"     ) as f:
										f.writelines(SCREAMING_SNAKE_CASE_     )







def 	_a      (						):
					with open(REPLACE_FILES["init"]      ,      "r"     ) as f:
										__lowerCAmelCase				   =       f.read()
					__lowerCAmelCase				   =       REPLACE_PATTERNS["init"][0].search(SCREAMING_SNAKE_CASE_     ).groups()[0]
					return packaging.version.parse(SCREAMING_SNAKE_CASE_     )







def 	_a      (						SCREAMING_SNAKE_CASE_							:				List[Any]=False     ):
					__lowerCAmelCase				   =       get_version()
					if patch and default_version.is_devrelease:
										raise ValueError("Can't create a patch version from the dev branch, checkout a released version!"     )
					if default_version.is_devrelease:
										__lowerCAmelCase				   =       default_version.base_version
					elif patch:
										__lowerCAmelCase				   =       F"""{default_version.major}.{default_version.minor}.{default_version.micro + 1}"""
					else:
										__lowerCAmelCase				   =       F"""{default_version.major}.{default_version.minor + 1}.0"""

					# Now let's ask nicely if that's the right one.
					__lowerCAmelCase				   =       input(F"""Which version are you releasing? [{default_version}]"""     )
					if len(SCREAMING_SNAKE_CASE_     ) == 0:
										__lowerCAmelCase				   =       default_version

					print(F"""Updating version to {version}."""     )
					global_version_update(SCREAMING_SNAKE_CASE_      ,      patch=SCREAMING_SNAKE_CASE_     )
					if not patch:
										print("Cleaning main README, don't forget to run `make fix-copies`."     )
										clean_main_ref_in_model_list()







def 	_a      (						):
					__lowerCAmelCase				   =       get_version()
					__lowerCAmelCase				   =       F"""{current_version.major}.{current_version.minor + 1}.0.dev0"""
					__lowerCAmelCase				   =       current_version.base_version

					# Check with the user we got that right.
					__lowerCAmelCase				   =       input(F"""Which version are we developing now? [{dev_version}]"""     )
					if len(SCREAMING_SNAKE_CASE_     ) == 0:
										__lowerCAmelCase				   =       dev_version

					print(F"""Updating version to {version}."""     )
					global_version_update(SCREAMING_SNAKE_CASE_     )
					print("Cleaning main README, don't forget to run `make fix-copies`."     )
					clean_main_ref_in_model_list()


if __name__ == "__main__":
					UpperCamelCase__    			=			argparse.ArgumentParser()
					parser.add_argument("""--post_release""", action="""store_true""", help="""Whether this is pre or post release.""")
					parser.add_argument("""--patch""", action="""store_true""", help="""Whether or not this is a patch release.""")
					UpperCamelCase__    			=			parser.parse_args()
					if not args.post_release:
										pre_release_work(patch=args.patch)
					elif args.patch:
										print("""Nothing to do after a patch :-)""")
					else:
										post_release_work()






# Copyright 2021 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from pathlib import Path

import torch

from ...utils import is_npu_available, is_xpu_available
from .config_args import ClusterConfig, default_json_config_file
from .config_utils import SubcommandHelpFormatter


UpperCAmelCase	      = '''Create a default config file for Accelerate with only a few flags set.'''






def 							UpperCAmelCase_		(							__SCREAMING_SNAKE_CASE="no" ,							__SCREAMING_SNAKE_CASE = default_json_config_file ,							__SCREAMING_SNAKE_CASE = False							):
	lowercase       =    Path(__SCREAMING_SNAKE_CASE							)
	path.parent.mkdir(parents=__SCREAMING_SNAKE_CASE ,							exist_ok=__SCREAMING_SNAKE_CASE							)
	if path.exists():
		print(
		    F'''Configuration already exists at {save_location}, will not override. Run `accelerate config` manually or pass a different `save_location`.'''							)
		return False
	lowercase       =    mixed_precision.lower()
	if mixed_precision not in ["no", "fp16", "bf16", "fp8"]:
		raise ValueError(
		    F'''`mixed_precision` should be one of \'no\', \'fp16\', \'bf16\', or \'fp8\'. Received {mixed_precision}'''							)
	lowercase       =    {
	    'compute_environment': 'LOCAL_MACHINE',
	    'mixed_precision': mixed_precision,
	}
	if torch.cuda.is_available():
		lowercase       =    torch.cuda.device_count()
		lowercase       =    num_gpus
		lowercase       =    False
		if num_gpus > 1:
			lowercase       =    'MULTI_GPU'
		else:
			lowercase       =    'NO'
	elif is_xpu_available() and use_xpu:
		lowercase       =    torch.xpu.device_count()
		lowercase       =    num_xpus
		lowercase       =    False
		if num_xpus > 1:
			lowercase       =    'MULTI_XPU'
		else:
			lowercase       =    'NO'
	elif is_npu_available():
		lowercase       =    torch.npu.device_count()
		lowercase       =    num_npus
		lowercase       =    False
		if num_npus > 1:
			lowercase       =    'MULTI_NPU'
		else:
			lowercase       =    'NO'
	else:
		lowercase       =    0
		lowercase       =    True
		lowercase       =    1
		lowercase       =    'NO'
	lowercase       =    ClusterConfig(**__SCREAMING_SNAKE_CASE							)
	config.to_json_file(__SCREAMING_SNAKE_CASE							)
	return path






def 							UpperCAmelCase_		(							__SCREAMING_SNAKE_CASE ,							__SCREAMING_SNAKE_CASE							):
	lowercase       =    parser.add_parser('default' ,							parents=__SCREAMING_SNAKE_CASE ,							help=__SCREAMING_SNAKE_CASE ,							formatter_class=__SCREAMING_SNAKE_CASE							)
	parser.add_argument(
	    '--config_file' ,							default=__SCREAMING_SNAKE_CASE ,							help=(
	        'The path to use to store the config file. Will default to a file named default_config.yaml in the cache '
	        'location, which is the content of the environment `HF_HOME` suffixed with \'accelerate\', or if you don\'t have '
	        'such an environment variable, your cache directory (\'~/.cache\' or the content of `XDG_CACHE_HOME`) suffixed '
	        'with \'huggingface\'.'
	    ) ,							dest='save_location' ,							)

	parser.add_argument(
	    '--mixed_precision' ,							choices=['no', 'fp16', 'bf16'] ,							type=__SCREAMING_SNAKE_CASE ,							help='Whether or not to use mixed precision training. '
	    'Choose between FP16 and BF16 (bfloat16) training. '
	    'BF16 training is only supported on Nvidia Ampere GPUs and PyTorch 1.10 or later.' ,							default='no' ,							)
	parser.set_defaults(func=__SCREAMING_SNAKE_CASE							)
	return parser






def 							UpperCAmelCase_		(							__SCREAMING_SNAKE_CASE							):
	lowercase       =    write_basic_config(args.mixed_precision ,							args.save_location							)
	if config_file:
		print(F'''accelerate configuration saved at {config_file}'''							)

