



"""simple docstring"""


import importlib.util
import json
import os
import warnings
from dataclasses import dataclass, field

import torch

from ..training_args import TrainingArguments
from ..utils import cached_property, is_sagemaker_dp_enabled, logging


__A   :							List[Any]										=   logging.get_logger(__name__)







def  lowercase	(      ):






				'''simple docstring'''



				_UpperCAmelCase					=    os.getenv('''SM_HP_MP_PARAMETERS'''					,     '''{}'''				)
				try:
								# Parse it and check the field "partitions" is included, it is required for model parallel.
								_UpperCAmelCase					=    json.loads(_SCREAMING_SNAKE_CASE				)
								if "partitions" not in smp_options:
												return False
				except json.JSONDecodeError:
								return False

				# Get the sagemaker specific framework parameters from mpi_options variable.
				_UpperCAmelCase					=    os.getenv('''SM_FRAMEWORK_PARAMS'''					,     '''{}'''				)
				try:
								# Parse it and check the field "sagemaker_distributed_dataparallel_enabled".
								_UpperCAmelCase					=    json.loads(_SCREAMING_SNAKE_CASE				)
								if not mpi_options.get('''sagemaker_mpi_enabled'''					,     _SCREAMING_SNAKE_CASE				):
												return False
				except json.JSONDecodeError:
								return False
				# Lastly, check if the `smdistributed` module is present.
				return importlib.util.find_spec('''smdistributed'''				) is not None


if is_sagemaker_model_parallel_available():
					import smdistributed.modelparallel.torch as smp

					smp.init()
@dataclass
class 			_a (					lowerCAmelCase):
			"""simple docstring"""
			UpperCamelCase__			      =	field(
			    default=""""""			,							metadata={"""help""": """Used by the SageMaker launcher to send mp-specific args. Ignored in SageMakerTrainer"""}			,							)



			def  lowercase__						(		self     :    Dict   )->List[Any]:
							super().__post_init__()
							warnings.warn(
							    '''`SageMakerTrainingArguments` is deprecated and will be removed in v5 of Transformers. You can use '''
							    '''`TrainingArguments` instead.'''				,   __UpperCamelCase				,   )



			@cached_property
			def  lowercase__						(		self     :    Optional[int]   )->"torch.device":
							logger.info('''PyTorch: setting up devices'''   )
							if torch.distributed.is_available() and torch.distributed.is_initialized() and self.local_rank == -1:
											logger.warning(
											    '''torch.distributed process group is initialized, but local_rank == -1. '''
											    '''In order to use Torch DDP, launch your script with `python -m torch.distributed.launch'''   )
							if self.no_cuda:
											_UpperCAmelCase					=    torch.device('''cpu'''   )
											_UpperCAmelCase					=    0
							elif is_sagemaker_model_parallel_available():
											_UpperCAmelCase					=    smp.local_rank()
											_UpperCAmelCase					=    torch.device('''cuda'''				,   __UpperCamelCase   )
											_UpperCAmelCase					=    1
							elif is_sagemaker_dp_enabled():
											import smdistributed.dataparallel.torch.torch_smddp  # noqa: F401

											torch.distributed.init_process_group(backend='''smddp'''				,   timeout=self.ddp_timeout_delta   )
											_UpperCAmelCase					=    int(os.getenv('''SMDATAPARALLEL_LOCAL_RANK'''   )   )
											_UpperCAmelCase					=    torch.device('''cuda'''				,   self.local_rank   )
											_UpperCAmelCase					=    1
							elif self.local_rank == -1:
											# if n_gpu is > 1 we'll use nn.DataParallel.
											# If you only want to use a specific subset of GPUs use `CUDA_VISIBLE_DEVICES=0`
											# Explicitly set CUDA to the first (index 0) CUDA device, otherwise `set_device` will
											# trigger an error that a device index is missing. Index 0 takes into account the
											# GPUs available in the environment, so `CUDA_VISIBLE_DEVICES=1,2` with `cuda:0`
											# will use the first GPU in that env, i.e. GPU#1
											_UpperCAmelCase					=    torch.device('''cuda:0''' if torch.cuda.is_available() else '''cpu'''   )
											# Sometimes the line in the postinit has not been run before we end up here, so just checking we're not at
											# the default value.
											_UpperCAmelCase					=    torch.cuda.device_count()
							else:
											# Here, we'll use torch.distributed.
											# Initializes the distributed backend which will take care of synchronizing nodes/GPUs
											if not torch.distributed.is_initialized():
															torch.distributed.init_process_group(backend='''nccl'''				,   timeout=self.ddp_timeout_delta   )
											_UpperCAmelCase					=    torch.device('''cuda'''				,   self.local_rank   )
											_UpperCAmelCase					=    1

							if device.type == "cuda":
											torch.cuda.set_device(__UpperCamelCase   )

							return device



			@property
			def  lowercase__						(		self     :    Union[str, Any]   )->str:
							if is_sagemaker_model_parallel_available():
											return smp.dp_size()

							return super().world_size



			@property
			def  lowercase__						(		self     :    str   )->int:
							return not is_sagemaker_model_parallel_available()



			@property
			def  lowercase__						(		self     :    str   )->List[Any]:
							return False








"""simple docstring"""


import math_equivalence  # From: git+https://github.com/hendrycks/math.git

import datasets


__A   :							Any										=   "\\n@article{hendrycksmath2021,\n  title={Measuring Mathematical Problem Solving With the MATH Dataset},\n  author={Dan Hendrycks\n    and Collin Burns\n    and Saurav Kadavath\n    and Akul Arora\n    and Steven Basart\n    and Eric Tang\n    and Dawn Song\n    and Jacob Steinhardt},\n  journal={arXiv preprint arXiv:2103.03874},\n  year={2021}\n}\n"


__A   :							Optional[Any]										=   "\\nThis metric is used to assess performance on the Mathematics Aptitude Test of Heuristics (MATH) dataset.\nIt first canonicalizes the inputs (e.g., converting \"1/2\" to \"\\frac{1}{2}\") and then computes accuracy.\n"


__A   :							Tuple										=   r"\nCalculates accuracy after canonicalizing inputs.\n\nArgs:\n    predictions: list of predictions to score. Each prediction\n        is a string that contains natural language and LaTex.\n    references: list of reference for each prediction. Each\n        reference is a string that contains natural language\n        and LaTex.\nReturns:\n    accuracy: accuracy after canonicalizing inputs\n        (e.g., converting \"1/2\" to \"\\frac{1}{2}\")\n\nExamples:\n    >>> metric = datasets.load_metric(\"competition_math\")\n    >>> results = metric.compute(references=[\"\\frac{1}{2}\"], predictions=[\"1/2\"])\n    >>> print(results)\n    {'accuracy': 1.0}\n"
@datasets.utils.file_utils.add_end_docstrings(_DESCRIPTION			,							_KWARGS_DESCRIPTION)
class 			_a (					datasets.Metric):
			"""simple docstring"""



			def  lowercase__						(		self     :    List[Any]   )->Dict:
							return datasets.MetricInfo(
							    description=_DESCRIPTION				,   citation=_CITATION				,   inputs_description=_KWARGS_DESCRIPTION				,   features=datasets.Features(
							        {
							            '''predictions''': datasets.Value('''string'''   ),
							            '''references''': datasets.Value('''string'''   ),
							        }   )				,   homepage='''https://github.com/hendrycks/math'''				,   codebase_urls=['''https://github.com/hendrycks/math''']				,   )



			def  lowercase__						(		self     :    int				,   __UpperCamelCase     :    List[str]				,   __UpperCamelCase     :    Union[str, Any]   )->Tuple:
							_UpperCAmelCase					=    0.0
							for i, j in zip(__UpperCamelCase				,   __UpperCamelCase   ):
											n_correct += 1.0 if math_equivalence.is_equiv(__UpperCamelCase				,   __UpperCamelCase   ) else 0.0
							_UpperCAmelCase					=    n_correct / len(__UpperCamelCase   )
							return {
							    "accuracy": accuracy,
							}



