




'''simple docstring'''

from typing import Dict

from transformers import EvalPrediction, HfArgumentParser, TrainingArguments, is_torch_available
from transformers.testing_utils import (
    TestCasePlus,
    execute_subprocess_async,
    get_torch_dist_unique_port,
    require_torch_multi_gpu,
    require_torch_neuroncore,
)
from transformers.training_args import ParallelMode
from transformers.utils import logging


a  :				List[str]									=  logging.get_logger(__name__)


if is_torch_available():
							import torch
							from torch import nn
							from torch.utils.data import Dataset

							from transformers import Trainer






							class 						a				(   _lowerCamelCase     ):


											def __init__(		self    :					List[Any]       ,				lowercase_    :					int = 101					):
																snake_case_									=				length


											def __len__(		self    :					Optional[Any]					):
																return self.length


											def __getitem__(		self    :					Any       ,				lowercase_    :					Any					):
																return i







							class 						a				:


											def __call__(		self    :					Dict       ,				lowercase_    :					str					):
																return {"input_ids": torch.tensor(lowercase_					), "labels": torch.tensor(lowercase_					)}







							class 						a				(   nn.Module     ):


											def __init__(		self    :					Any					):
																super().__init__()
																# Add some (unused) params otherwise DDP will complain.
																snake_case_									=				nn.Linear(120       ,				80					)


											def   A_ (		self    :					Tuple       ,				lowercase_    :					List[str]       ,				lowercase_    :					List[Any]=None					):
																if labels is not None:
																					return torch.tensor(0.0       ,				device=input_ids.device					), input_ids
																else:
																					return input_ids






class 						a				(   _lowerCamelCase     ):


				@require_torch_neuroncore
				def   A_ (		self    :					List[Any]					):
									snake_case_									=				F"--nproc_per_node=2\n            --master_port={get_torch_dist_unique_port()}\n            {self.test_file_dir}/test_trainer_distributed.py\n        ".split()
									snake_case_									=				self.get_auto_remove_tmp_dir()
									snake_case_									=				F"--output_dir {output_dir}".split()
									snake_case_									=				['''torchrun'''] + distributed_args + args
									execute_subprocess_async(lowercase_       ,				env=self.get_env()					)
									# successful return here == success - any errors would have caused an error in the sub-call







class 						a				(   _lowerCamelCase     ):


				@require_torch_multi_gpu
				def   A_ (		self    :					List[str]					):
									snake_case_									=				F"--nproc_per_node={torch.cuda.device_count()}\n            --master_port={get_torch_dist_unique_port()}\n            {self.test_file_dir}/test_trainer_distributed.py\n        ".split()
									snake_case_									=				self.get_auto_remove_tmp_dir()
									snake_case_									=				F"--output_dir {output_dir}".split()
									snake_case_									=				['''torchrun'''] + distributed_args + args
									execute_subprocess_async(lowercase_       ,				env=self.get_env()					)
									# successful return here == success - any errors would have caused an error in the sub-call


if __name__ == "__main__":
							# The script below is meant to be run under torch.distributed, on a machine with multiple GPUs:
							#
							# PYTHONPATH="src" python -m torch.distributed.run --nproc_per_node 2 --output_dir output_dir ./tests/test_trainer_distributed.py

							a  :				List[Any]									=  HfArgumentParser((TrainingArguments,))
							a  :				Any									=  parser.parse_args_into_dataclasses()[0]

							logger.warning(
							    f'''Process rank: {training_args.local_rank}, device: {training_args.device}, n_gpu: {training_args.n_gpu}, '''
							    f'''distributed training: {training_args.parallel_mode != ParallelMode.NOT_DISTRIBUTED}'''
							)

							# Essentially, what we want to verify in the distributed case is that we get all samples back,
							# in the right order. (this is crucial for prediction for instance)
							for dataset_length in [101, 40, 7]:
														a  :				List[Any]									=  DummyDataset(dataset_length)


														def 		__magic_name__    (	__UpperCAmelCase	)		->					Dict:

																			'''simple docstring'''

																			snake_case_									=				list(range(len(__UpperCAmelCase	)	)	)
																			snake_case_									=				p.predictions.tolist() == sequential and p.label_ids.tolist() == sequential
																			if not success and training_args.local_rank == 0:
																								logger.warning(
																								    '''Predictions and/or labels do not match expected results:\n  - predictions: '''
																								    F"{p.predictions.tolist()}\n  - labels: {p.label_ids.tolist()}\n  - expected: {sequential}"	)
																			return {"success": success}

														a  :				List[str]									=  Trainer(
														    model=DummyModel(),
														    args=training_args,
														    data_collator=DummyDataCollator(),
														    eval_dataset=dataset,
														    compute_metrics=compute_metrics,
														)
														a  :				str									=  trainer.evaluate()
														logger.info(metrics)
														if metrics["eval_success"] is not True:
																					logger.error(metrics)
																					exit(1)

														a  :				str									=  trainer.predict(dataset)
														logger.info(p.metrics)
														if p.metrics["test_success"] is not True:
																					logger.error(p.metrics)
																					exit(1)

														a  :				Any									=  2

														a  :				int									=  trainer.evaluate()
														logger.info(metrics)
														if metrics["eval_success"] is not True:
																					logger.error(metrics)
																					exit(1)

														a  :				Optional[Any]									=  trainer.predict(dataset)
														logger.info(p.metrics)
														if p.metrics["test_success"] is not True:
																					logger.error(p.metrics)
																					exit(1)

														a  :				Tuple									=  None




"""simple docstring"""





from scipy.stats import spearmanr

import datasets


_a       =							'\nThe Spearman rank-order correlation coefficient is a measure of the\nrelationship between two datasets. Like other correlation coefficients,\nthis one varies between -1 and +1 with 0 implying no correlation.\nPositive correlations imply that as data in dataset x increases, so\ndoes data in dataset y. Negative correlations imply that as x increases,\ny decreases. Correlations of -1 or +1 imply an exact monotonic relationship.\n\nUnlike the Pearson correlation, the Spearman correlation does not\nassume that both datasets are normally distributed.\n\nThe p-value roughly indicates the probability of an uncorrelated system\nproducing datasets that have a Spearman correlation at least as extreme\nas the one computed from these datasets. The p-values are not entirely\nreliable but are probably reasonable for datasets larger than 500 or so.\n'

_a       =							'\nArgs:\n    predictions (`List[float]`): Predicted labels, as returned by a model.\n    references (`List[float]`): Ground truth labels.\n    return_pvalue (`bool`): If `True`, returns the p-value. If `False`, returns\n            only the spearmanr score. Defaults to `False`.\nReturns:\n    spearmanr (`float`): Spearman correlation coefficient.\n    p-value (`float`): p-value. **Note**: is only returned if `return_pvalue=True` is input.\nExamples:\n    Example 1:\n        >>> spearmanr_metric = datasets.load_metric("spearmanr")\n        >>> results = spearmanr_metric.compute(references=[1, 2, 3, 4, 5], predictions=[10, 9, 2.5, 6, 4])\n        >>> print(results)\n        {\'spearmanr\': -0.7}\n\n    Example 2:\n        >>> spearmanr_metric = datasets.load_metric("spearmanr")\n        >>> results = spearmanr_metric.compute(references=[1, 2, 3, 4, 5],\n        ...                                     predictions=[10, 9, 2.5, 6, 4],\n        ...                                     return_pvalue=True)\n        >>> print(results[\'spearmanr\'])\n        -0.7\n        >>> print(round(results[\'spearmanr_pvalue\'], 2))\n        0.19\n'

_a       =							r'\\n@book{kokoska2000crc,\n  title={CRC standard probability and statistics tables and formulae},\n  author={Kokoska, Stephen and Zwillinger, Daniel},\n  year={2000},\n  publisher={Crc Press}\n}\n@article{2020SciPy-NMeth,\n  author  = {Virtanen, Pauli and Gommers, Ralf and Oliphant, Travis E. and\n            Haberland, Matt and Reddy, Tyler and Cournapeau, David and\n            Burovski, Evgeni and Peterson, Pearu and Weckesser, Warren and\n            Bright, Jonathan and {van der Walt}, St{\'e}fan J. and\n            Brett, Matthew and Wilson, Joshua and Millman, K. Jarrod and\n            Mayorov, Nikolay and Nelson, Andrew R. J. and Jones, Eric and\n            Kern, Robert and Larson, Eric and Carey, C J and\n            Polat, {\.I}lhan and Feng, Yu and Moore, Eric W. and\n            {VanderPlas}, Jake and Laxalde, Denis and Perktold, Josef and\n            Cimrman, Robert and Henriksen, Ian and Quintero, E. A. and\n            Harris, Charles R. and Archibald, Anne M. and\n            Ribeiro, Ant{\^o}nio H. and Pedregosa, Fabian and\n            {van Mulbregt}, Paul and {SciPy 1.0 Contributors}},\n  title   = {{{SciPy} 1.0: Fundamental Algorithms for Scientific\n            Computing in Python}},\n  journal = {Nature Methods},\n  year    = {2020},\n  volume  = {17},\n  pages   = {261--272},\n  adsurl  = {https://rdcu.be/b08Wh},\n  doi     = {10.1038/s41592-019-0686-2},\n}\n'




@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION     ,_KWARGS_DESCRIPTION   )
class 					_lowerCAmelCase  (	datasets.Metric   ):







 """simple docstring"""







 def 					_lowercase (			self							:			Dict	):
    return datasets.MetricInfo(
        description=_DESCRIPTION,					citation=_CITATION,					inputs_description=_KWARGS_DESCRIPTION,					features=datasets.Features(
            {
                "predictions": datasets.Value("float"	),
                "references": datasets.Value("float"	),
            }	),					reference_urls=["https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.spearmanr.html"],					)



 def 					_lowercase (			self							:			Optional[Any],					UpperCAmelCase__							:			Optional[int],					UpperCAmelCase__							:			List[str],					UpperCAmelCase__							:			Optional[int]=False	):
    __lowercase								=						spearmanr(UpperCAmelCase__,					UpperCAmelCase__	)
    if return_pvalue:
       return {"spearmanr": results[0], "spearmanr_pvalue": results[1]}
    else:
       return {"spearmanr": results[0]}




