
"""simple docstring"""






# 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.
import json
import os

from ...utils.constants import SAGEMAKER_PARALLEL_EC2_INSTANCES, TORCH_DYNAMO_MODES
from ...utils.dataclasses import ComputeEnvironment, SageMakerDistributedType
from ...utils.imports import is_botoa_available
from .config_args import SageMakerConfig
from .config_utils import (
    DYNAMO_BACKENDS,
    _ask_field,
    _ask_options,
    _convert_dynamo_backend,
    _convert_mixed_precision,
    _convert_sagemaker_distributed_mode,
    _convert_yes_no_to_bool,
)


if is_botoa_available():
					import botoa  # noqa: F401




def __magic_name__	(				_lowerCamelCase:		Any			)					->						str:

	'''simple docstring'''




	lowerCAmelCase												=  botoa.client('''iam'''			)

	lowerCAmelCase												=  {
	    '''Version''': '''2012-10-17''',
	    '''Statement''': [
	        {'''Effect''': '''Allow''', '''Principal''': {'''Service''': '''sagemaker.amazonaws.com'''}, '''Action''': '''sts:AssumeRole'''}
	    ],
	}
	try:
		# create the role, associated with the chosen trust policy
		iam_client.create_role(
		    RoleName=_lowerCamelCase,					AssumeRolePolicyDocument=json.dumps(_lowerCamelCase,					indent=2			)			)
		lowerCAmelCase												=  {
		    '''Version''': '''2012-10-17''',
		    '''Statement''': [
		        {
		            '''Effect''': '''Allow''',
		            '''Action''': [
		                '''sagemaker:*''',
		                '''ecr:GetDownloadUrlForLayer''',
		                '''ecr:BatchGetImage''',
		                '''ecr:BatchCheckLayerAvailability''',
		                '''ecr:GetAuthorizationToken''',
		                '''cloudwatch:PutMetricData''',
		                '''cloudwatch:GetMetricData''',
		                '''cloudwatch:GetMetricStatistics''',
		                '''cloudwatch:ListMetrics''',
		                '''logs:CreateLogGroup''',
		                '''logs:CreateLogStream''',
		                '''logs:DescribeLogStreams''',
		                '''logs:PutLogEvents''',
		                '''logs:GetLogEvents''',
		                '''s3:CreateBucket''',
		                '''s3:ListBucket''',
		                '''s3:GetBucketLocation''',
		                '''s3:GetObject''',
		                '''s3:PutObject''',
		            ],
		            '''Resource''': '''*''',
		        }
		    ],
		}
		# attach policy to role
		iam_client.put_role_policy(
		    RoleName=_lowerCamelCase,					PolicyName=F"""{role_name}_policy_permission""",					PolicyDocument=json.dumps(_lowerCamelCase,					indent=2			),					)
	except iam_client.exceptions.EntityAlreadyExistsException:
		print(F"""role {role_name} already exists. Using existing one"""			)




def __magic_name__	(				_lowerCamelCase:		int			)					->						Optional[int]:

	'''simple docstring'''




	lowerCAmelCase												=  botoa.client('''iam'''			)
	return iam_client.get_role(RoleName=_lowerCamelCase			)["Role"]["Arn"]




def __magic_name__	(				)					->						Any:

	'''simple docstring'''




	lowerCAmelCase												=  _ask_options(
	    '''How do you want to authorize?''',					['''AWS Profile''', '''Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) '''],					_lowerCamelCase,					)
	lowerCAmelCase												=  None
	if credentials_configuration == 0:
		lowerCAmelCase												=  _ask_field('''Enter your AWS Profile name: [default] ''',					default='''default'''			)
		lowerCAmelCase												=  aws_profile
	else:
		print(
		    '''Note you will need to provide AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY when you launch you training script with,'''
		    '''`accelerate launch --aws_access_key_id XXX --aws_secret_access_key YYY`'''			)
		lowerCAmelCase												=  _ask_field('''AWS Access Key ID: '''			)
		lowerCAmelCase												=  aws_access_key_id

		lowerCAmelCase												=  _ask_field('''AWS Secret Access Key: '''			)
		lowerCAmelCase												=  aws_secret_access_key

	lowerCAmelCase												=  _ask_field('''Enter your AWS Region: [us-east-1]''',					default='''us-east-1'''			)
	lowerCAmelCase												=  aws_region

	lowerCAmelCase												=  _ask_options(
	    '''Do you already have an IAM Role for executing Amazon SageMaker Training Jobs?''',					['''Provide IAM Role name''', '''Create new IAM role using credentials'''],					_lowerCamelCase,					)
	if role_management == 0:
		lowerCAmelCase												=  _ask_field('''Enter your IAM role name: '''			)
	else:
		lowerCAmelCase												=  '''accelerate_sagemaker_execution_role'''
		print(F"""Accelerate will create an iam role \"{iam_role_name}\" using the provided credentials"""			)
		_create_iam_role_for_sagemaker(_lowerCamelCase			)

	lowerCAmelCase												=  _ask_field(
	    '''Do you want to use custom Docker image? [yes/NO]: ''',					_convert_yes_no_to_bool,					default=_lowerCamelCase,					error_message='''Please enter yes or no.''',					)
	lowerCAmelCase												=  None
	if is_custom_docker_image:
		lowerCAmelCase												=  _ask_field('''Enter your Docker image: ''',					lambda _lowerCamelCase			: str(_lowerCamelCase			).lower()			)

	lowerCAmelCase												=  _ask_field(
	    '''Do you want to provide SageMaker input channels with data locations? [yes/NO]: ''',					_convert_yes_no_to_bool,					default=_lowerCamelCase,					error_message='''Please enter yes or no.''',					)
	lowerCAmelCase												=  None
	if is_sagemaker_inputs_enabled:
		lowerCAmelCase												=  _ask_field(
		    '''Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): ''',					lambda _lowerCamelCase			: str(_lowerCamelCase			).lower(),					)

	lowerCAmelCase												=  _ask_field(
	    '''Do you want to enable SageMaker metrics? [yes/NO]: ''',					_convert_yes_no_to_bool,					default=_lowerCamelCase,					error_message='''Please enter yes or no.''',					)
	lowerCAmelCase												=  None
	if is_sagemaker_metrics_enabled:
		lowerCAmelCase												=  _ask_field(
		    '''Enter the path to the SageMaker metrics TSV file with columns (metric_name, metric_regex): ''',					lambda _lowerCamelCase			: str(_lowerCamelCase			).lower(),					)

	lowerCAmelCase												=  _ask_options(
	    '''What is the distributed mode?''',					['''No distributed training''', '''Data parallelism'''],					_convert_sagemaker_distributed_mode,					)
	lowerCAmelCase												=  {}
	lowerCAmelCase												=  _ask_field(
	    '''Do you wish to optimize your script with torch dynamo?[yes/NO]:''',					_convert_yes_no_to_bool,					default=_lowerCamelCase,					error_message='''Please enter yes or no.''',					)
	if use_dynamo:
		lowerCAmelCase												=  '''dynamo_'''
		lowerCAmelCase												=  _ask_options(
		    '''Which dynamo backend would you like to use?''',					[x.lower() for x in DYNAMO_BACKENDS],					_convert_dynamo_backend,					default=2,					)
		lowerCAmelCase												=  _ask_field(
		    '''Do you want to customize the defaults sent to torch.compile? [yes/NO]: ''',					_convert_yes_no_to_bool,					default=_lowerCamelCase,					error_message='''Please enter yes or no.''',					)

		if use_custom_options:
			lowerCAmelCase												=  _ask_options(
			    '''Which mode do you want to use?''',					_lowerCamelCase,					lambda _lowerCamelCase			: TORCH_DYNAMO_MODES[int(_lowerCamelCase			)],					default='''default''',					)
			lowerCAmelCase												=  _ask_field(
			    '''Do you want the fullgraph mode or it is ok to break model into several subgraphs? [yes/NO]: ''',					_convert_yes_no_to_bool,					default=_lowerCamelCase,					error_message='''Please enter yes or no.''',					)
			lowerCAmelCase												=  _ask_field(
			    '''Do you want to enable dynamic shape tracing? [yes/NO]: ''',					_convert_yes_no_to_bool,					default=_lowerCamelCase,					error_message='''Please enter yes or no.''',					)
	lowerCAmelCase												=  '''Which EC2 instance type you want to use for your training?'''
	if distributed_type != SageMakerDistributedType.NO:
		lowerCAmelCase												=  _ask_options(
		    _lowerCamelCase,					_lowerCamelCase,					lambda _lowerCamelCase			: SAGEMAKER_PARALLEL_EC2_INSTANCES[int(_lowerCamelCase			)]			)
	else:
		eca_instance_query += "? [ml.p3.2xlarge]:"
		lowerCAmelCase												=  _ask_field(_lowerCamelCase,					lambda _lowerCamelCase			: str(_lowerCamelCase			).lower(),					default='''ml.p3.2xlarge'''			)

	lowerCAmelCase												=  1
	if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
		lowerCAmelCase												=  _ask_field(
		    '''How many machines do you want use? [1]: ''',					_lowerCamelCase,					default=1,					)

	lowerCAmelCase												=  _ask_options(
	    '''Do you wish to use FP16 or BF16 (mixed precision)?''',					['''no''', '''fp16''', '''bf16''', '''fp8'''],					_convert_mixed_precision,					)

	if use_dynamo and mixed_precision == "no":
		print(
		    '''Torch dynamo used without mixed precision requires TF32 to be efficient. Accelerate will enable it by default when launching your scripts.'''			)

	return SageMakerConfig(
	    image_uri=_lowerCamelCase,					compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER,					distributed_type=_lowerCamelCase,					use_cpu=_lowerCamelCase,					dynamo_config=_lowerCamelCase,					eca_instance_type=_lowerCamelCase,					profile=_lowerCamelCase,					region=_lowerCamelCase,					iam_role_name=_lowerCamelCase,					mixed_precision=_lowerCamelCase,					num_machines=_lowerCamelCase,					sagemaker_inputs_file=_lowerCamelCase,					sagemaker_metrics_file=_lowerCamelCase,					)




"""simple docstring"""






class 			lowercase					:






			def __init__(self  :	Dict			)       ->	List[Any]:





				"""simple docstring"""


				lowerCAmelCase												=  {}






			def 					UpperCAmelCase							(self  :	Union[str, Any]			)       ->	None:





				"""simple docstring"""


				print(self.vertex			)
				for i in self.vertex:
					print(SCREAMING_SNAKE_CASE_      ,''' -> '''      ,''' -> '''.join([str(SCREAMING_SNAKE_CASE_			) for j in self.vertex[i]]			)			)






			def 					UpperCAmelCase							(self  :	Optional[Any]      ,SCREAMING_SNAKE_CASE_  :	int      ,SCREAMING_SNAKE_CASE_  :	int			)       ->	None:





				"""simple docstring"""


				if from_vertex in self.vertex:
					self.vertex[from_vertex].append(SCREAMING_SNAKE_CASE_			)
				else:
					# else make a new vertex
					lowerCAmelCase												=  [to_vertex]






			def 					UpperCAmelCase							(self  :	List[str]			)       ->	None:





				"""simple docstring"""


				lowerCAmelCase												=  [False] * len(self.vertex			)

				# call the recursive helper function
				for i in range(len(self.vertex			)			):
					if not visited[i]:
						self.dfs_recursive(SCREAMING_SNAKE_CASE_      ,SCREAMING_SNAKE_CASE_			)






			def 					UpperCAmelCase							(self  :	Optional[Any]      ,SCREAMING_SNAKE_CASE_  :	int      ,SCREAMING_SNAKE_CASE_  :	list			)       ->	None:





				"""simple docstring"""


				lowerCAmelCase												=  True

				print(SCREAMING_SNAKE_CASE_      ,end=''' '''			)

				# Recur for all the vertices that are adjacent to this node
				for i in self.vertex:
					if not visited[i]:
						self.dfs_recursive(SCREAMING_SNAKE_CASE_      ,SCREAMING_SNAKE_CASE_			)


if __name__ == "__main__":
					UpperCAmelCase        =				Graph()
					g.add_edge(0, 1)
					g.add_edge(0, 2)
					g.add_edge(1, 2)
					g.add_edge(2, 0)
					g.add_edge(2, 3)
					g.add_edge(3, 3)

					g.print_graph()
					print("""DFS:""")
					g.dfs()

					# OUTPUT:
					# 0  ->  1 -> 2
					# 1  ->  2
					# 2  ->  0 -> 3
					# 3  ->  3
					# DFS:
					#  0 1 2 3


