
# 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       __lowerCAmelCase      (						A    ):
	UpperCAmelCase_       				=			botoa.client("iam"    )

	UpperCAmelCase_       				=			{
	    "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=A       ,     AssumeRolePolicyDocument=json.dumps(A       ,     indent=2    )    )
		UpperCAmelCase_       				=			{
		    "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=A       ,     PolicyName=F"{role_name}_policy_permission"       ,     PolicyDocument=json.dumps(A       ,     indent=2    )       ,     )
	except iam_client.exceptions.EntityAlreadyExistsException:
		print(F"role {role_name} already exists. Using existing one"    )



def       __lowerCAmelCase      (						A    ):
	UpperCAmelCase_       				=			botoa.client("iam"    )
	return iam_client.get_role(RoleName=A    )["Role"]["Arn"]




def       __lowerCAmelCase      (						):
	UpperCAmelCase_       				=			_ask_options(
	    "How do you want to authorize?"       ,     ["AWS Profile", "Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) "]       ,     A       ,     )
	UpperCAmelCase_       				=			None
	if credentials_configuration == 0:
		UpperCAmelCase_       				=			_ask_field("Enter your AWS Profile name: [default] "       ,     default="default"    )
		UpperCAmelCase_       				=			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`"    )
		UpperCAmelCase_       				=			_ask_field("AWS Access Key ID: "    )
		UpperCAmelCase_       				=			aws_access_key_id

		UpperCAmelCase_       				=			_ask_field("AWS Secret Access Key: "    )
		UpperCAmelCase_       				=			aws_secret_access_key

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

	UpperCAmelCase_       				=			_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"]       ,     A       ,     )
	if role_management == 0:
		UpperCAmelCase_       				=			_ask_field("Enter your IAM role name: "    )
	else:
		UpperCAmelCase_       				=			"accelerate_sagemaker_execution_role"
		print(F"Accelerate will create an iam role \"{iam_role_name}\" using the provided credentials"    )
		_create_iam_role_for_sagemaker(A    )

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

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

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

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

		if use_custom_options:
			UpperCAmelCase_       				=			_ask_options(
			    "Which mode do you want to use?"       ,     A       ,     lambda A    : TORCH_DYNAMO_MODES[int(A    )]       ,     default="default"       ,     )
			UpperCAmelCase_       				=			_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=A       ,     error_message="Please enter yes or no."       ,     )
			UpperCAmelCase_       				=			_ask_field(
			    "Do you want to enable dynamic shape tracing? [yes/NO]: "       ,     _convert_yes_no_to_bool       ,     default=A       ,     error_message="Please enter yes or no."       ,     )
	UpperCAmelCase_       				=			"Which EC2 instance type you want to use for your training?"
	if distributed_type != SageMakerDistributedType.NO:
		UpperCAmelCase_       				=			_ask_options(
		    A       ,     A       ,     lambda A    : SAGEMAKER_PARALLEL_EC2_INSTANCES[int(A    )]    )
	else:
		eca_instance_query += "? [ml.p3.2xlarge]:"
		UpperCAmelCase_       				=			_ask_field(A       ,     lambda A    : str(A    ).lower()       ,     default="ml.p3.2xlarge"    )

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

	UpperCAmelCase_       				=			_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=A       ,     compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER       ,     distributed_type=A       ,     use_cpu=A       ,     dynamo_config=A       ,     eca_instance_type=A       ,     profile=A       ,     region=A       ,     iam_role_name=A       ,     mixed_precision=A       ,     num_machines=A       ,     sagemaker_inputs_file=A       ,     sagemaker_metrics_file=A       ,     )


from __future__ import annotations

class 						__UpperCamelCase    :




	def __init__(		self	:						Optional[Any]		,	lowerCAmelCase	:						str		,	lowerCAmelCase	:						str							):


		'''simple docstring'''







		UpperCAmelCase_				,   UpperCAmelCase_       				=			text, pattern
		UpperCAmelCase_				,   UpperCAmelCase_       				=			len(lowerCAmelCase							), len(lowerCAmelCase							)




	def       __A					(		self	:						List[str]		,	lowerCAmelCase	:						str							):


		'''simple docstring'''







		for i in range(self.patLen - 1		,	-1		,	-1							):
			if char == self.pattern[i]:
				return i
		return -1




	def       __A					(		self	:						int		,	lowerCAmelCase	:						int							):


		'''simple docstring'''







		for i in range(self.patLen - 1		,	-1		,	-1							):
			if self.pattern[i] != self.text[current_pos + i]:
				return current_pos + i
		return -1




	def       __A					(		self	:						str							):


		'''simple docstring'''







		UpperCAmelCase_       				=			[]
		for i in range(self.textLen - self.patLen + 1							):
			UpperCAmelCase_       				=			self.mismatch_in_text(lowerCAmelCase							)
			if mismatch_index == -1:
				positions.append(lowerCAmelCase							)
			else:
				UpperCAmelCase_       				=			self.match_in_pattern(self.text[mismatch_index]							)
				UpperCAmelCase_       				=			(
				    mismatch_index - match_index
				)  # shifting index lgtm [py/multiple-definition]
		return positions


_a:    Dict 							=			"""ABAABA"""
_a:    Union[str, Any] 							=			"""AB"""
_a:    str 							=			BoyerMooreSearch(text, pattern)
_a:    Dict 							=			bms.bad_character_heuristic()

if len(positions) == 0:
				print("""No match found""")
else:
				print("""Pattern found in following positions: """)
				print(positions)