



# 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 							A			(  _UpperCAmelCase       :     Optional[int]="no"							,     _UpperCAmelCase       :     str = default_json_config_file							,     _UpperCAmelCase       :     bool = False					)       ->				Tuple:







			'''simple docstring'''
			_UpperCAmelCase	 =     Path(_UpperCAmelCase					)
			path.parent.mkdir(parents=_UpperCAmelCase							,     exist_ok=_UpperCAmelCase					)
			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
			_UpperCAmelCase	 =     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}"					)
			_UpperCAmelCase	 =     {
			    'compute_environment': 'LOCAL_MACHINE',
			    'mixed_precision': mixed_precision,
			}
			if torch.cuda.is_available():
						_UpperCAmelCase	 =     torch.cuda.device_count()
						_UpperCAmelCase	 =     num_gpus
						_UpperCAmelCase	 =     False
						if num_gpus > 1:
									_UpperCAmelCase	 =     'MULTI_GPU'
						else:
									_UpperCAmelCase	 =     'NO'
			elif is_xpu_available() and use_xpu:
						_UpperCAmelCase	 =     torch.xpu.device_count()
						_UpperCAmelCase	 =     num_xpus
						_UpperCAmelCase	 =     False
						if num_xpus > 1:
									_UpperCAmelCase	 =     'MULTI_XPU'
						else:
									_UpperCAmelCase	 =     'NO'
			elif is_npu_available():
						_UpperCAmelCase	 =     torch.npu.device_count()
						_UpperCAmelCase	 =     num_npus
						_UpperCAmelCase	 =     False
						if num_npus > 1:
									_UpperCAmelCase	 =     'MULTI_NPU'
						else:
									_UpperCAmelCase	 =     'NO'
			else:
						_UpperCAmelCase	 =     0
						_UpperCAmelCase	 =     True
						_UpperCAmelCase	 =     1
						_UpperCAmelCase	 =     'NO'
			_UpperCAmelCase	 =     ClusterConfig(**_UpperCAmelCase					)
			config.to_json_file(_UpperCAmelCase					)
			return path





def 							A			(  _UpperCAmelCase       :     Tuple							,     _UpperCAmelCase       :     List[str]					)       ->				Tuple:







			'''simple docstring'''
			_UpperCAmelCase	 =     parser.add_parser('default'							,     parents=_UpperCAmelCase							,     help=_UpperCAmelCase							,     formatter_class=_UpperCAmelCase					)
			parser.add_argument(
			    '--config_file'							,     default=_UpperCAmelCase							,     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=_UpperCAmelCase							,     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=_UpperCAmelCase					)
			return parser





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







			'''simple docstring'''
			_UpperCAmelCase	 =     write_basic_config(args.mixed_precision							,     args.save_location					)
			if config_file:
						print(F"accelerate configuration saved at {config_file}"					)





def 							A			(  _UpperCAmelCase       :     int							,     _UpperCAmelCase       :     int					)       ->				int:







			'''simple docstring'''
			while second != 0:
						_UpperCAmelCase	 =     first & second
						first ^= second
						_UpperCAmelCase	 =     c << 1
			return first


if __name__ == "__main__":
							import doctest

							doctest.testmod()

							UpperCAmelCase__     = int(input("Enter the first number: ").strip())
							UpperCAmelCase__     = int(input("Enter the second number: ").strip())
							print(f"""{add(first, second) = }""")
