



import numpy as np
from scipy.spatial.distance import cdist
from sklearn.metrics import fa_score

import datasets


UpperCAmelCase   :							Optional[int]							 ="""\
    @inproceedings{kakwani2020indicnlpsuite,
    title={{IndicNLPSuite: Monolingual Corpora, Evaluation Benchmarks and Pre-trained Multilingual Language Models for Indian Languages}},
    author={Divyanshu Kakwani and Anoop Kunchukuttan and Satish Golla and Gokul N.C. and Avik Bhattacharyya and Mitesh M. Khapra and Pratyush Kumar},
    year={2020},
    booktitle={Findings of EMNLP},
}
"""

UpperCAmelCase   :							List[Any]							 ="""\
    IndicGLUE is a natural language understanding benchmark for Indian languages. It contains a wide
    variety of tasks and covers 11 major Indian languages - as, bn, gu, hi, kn, ml, mr, or, pa, ta, te.
"""

UpperCAmelCase   :							List[str]							 ="""
Compute IndicGLUE evaluation metric associated to each IndicGLUE dataset.
Args:
    predictions: list of predictions to score (as int64),
        except for 'cvit-mkb-clsr' where each prediction is a vector (of float32).
    references: list of ground truth labels corresponding to the predictions (as int64),
        except for 'cvit-mkb-clsr' where each reference is a vector (of float32).
Returns: depending on the IndicGLUE subset, one or several of:
    \"accuracy\": Accuracy
    \"f1\": F1 score
    \"precision\": Precision@10
Examples:

    >>> indic_glue_metric = datasets.load_metric('indic_glue', 'wnli')  # 'wnli' or any of [\"copa\", \"sna\", \"csqa\", \"wstp\", \"inltkh\", \"bbca\", \"iitp-mr\", \"iitp-pr\", \"actsa-sc\", \"md\"]
    >>> references = [0, 1]
    >>> predictions = [0, 1]
    >>> results = indic_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'accuracy': 1.0}

    >>> indic_glue_metric = datasets.load_metric('indic_glue', 'wiki-ner')
    >>> references = [0, 1]
    >>> predictions = [0, 1]
    >>> results = indic_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'accuracy': 1.0, 'f1': 1.0}

    >>> indic_glue_metric = datasets.load_metric('indic_glue', 'cvit-mkb-clsr')
    >>> references = [[0.5, 0.5, 0.5], [0.1, 0.2, 0.3]]
    >>> predictions = [[0.5, 0.5, 0.5], [0.1, 0.2, 0.3]]
    >>> results = indic_glue_metric.compute(predictions=predictions, references=references)
    >>> print(results)
    {'precision@10': 1.0}

"""



def    _lowerCAmelCase    (_lowerCAmelCase   ,	_lowerCAmelCase):
					return float((preds == labels).mean())



def    _lowerCAmelCase    (_lowerCAmelCase   ,	_lowerCAmelCase):
					UpperCamelCase_		  =   simple_accuracy(_lowerCAmelCase   ,	_lowerCAmelCase)
					UpperCamelCase_		  =   float(fa_score(y_true=_lowerCAmelCase   ,	y_pred=_lowerCAmelCase))
					return {
					    "accuracy": acc,
					    "f1": fa,
					}



def    _lowerCAmelCase    (_lowerCAmelCase   ,	_lowerCAmelCase):
					UpperCamelCase_		  =   np.array(_lowerCAmelCase)
					UpperCamelCase_		  =   np.array(_lowerCAmelCase)
					UpperCamelCase_		  =   en_sentvecs.shape[0]

					# mean centering
					UpperCamelCase_		  =   en_sentvecs - np.mean(_lowerCAmelCase   ,	axis=0)
					UpperCamelCase_		  =   in_sentvecs - np.mean(_lowerCAmelCase   ,	axis=0)

					UpperCamelCase_		  =   cdist(_lowerCAmelCase   ,	_lowerCAmelCase   ,	"cosine")
					UpperCamelCase_		  =   np.array(range(_lowerCAmelCase))
					UpperCamelCase_		  =   sim.argsort(axis=1)[:, :10]
					UpperCamelCase_		  =   np.any(preds == actual[:, None]   ,	axis=1)
					return float(matches.mean())






@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION      ,   _KWARGS_DESCRIPTION      )
class       _lowercase   (datasets.Metric      ):
				'''simple docstring'''







				def       _lowerCamelCase					( self    ):

									'''simple docstring'''


									if self.config_name not in [
									    "wnli",
									    "copa",
									    "sna",
									    "csqa",
									    "wstp",
									    "inltkh",
									    "bbca",
									    "cvit-mkb-clsr",
									    "iitp-mr",
									    "iitp-pr",
									    "actsa-sc",
									    "md",
									    "wiki-ner",
									]:
														raise KeyError(
														    "You should supply a configuration name selected in "
														    "[\"wnli\", \"copa\", \"sna\", \"csqa\", \"wstp\", \"inltkh\", \"bbca\", "
														    "\"cvit-mkb-clsr\", \"iitp-mr\", \"iitp-pr\", \"actsa-sc\", \"md\", "
														    "\"wiki-ner\"]"    )
									return datasets.MetricInfo(
									    description=_DESCRIPTION     , citation=_CITATION     , inputs_description=_KWARGS_DESCRIPTION     , features=datasets.Features(
									        {
									            "predictions": datasets.Value("int64"    )
									            if self.config_name != "cvit-mkb-clsr"
									            else datasets.Sequence(datasets.Value("float32"    )    ),
									            "references": datasets.Value("int64"    )
									            if self.config_name != "cvit-mkb-clsr"
									            else datasets.Sequence(datasets.Value("float32"    )    ),
									        }    )     , codebase_urls=[]     , reference_urls=[]     , format="numpy" if self.config_name != "cvit-mkb-clsr" else None     , )

				def       _lowerCamelCase					( self     , snake_case__     , snake_case__    ):

									'''simple docstring'''


									if self.config_name == "cvit-mkb-clsr":
														return {"precision@10": precision_at_aa(snake_case__     , snake_case__    )}
									elif self.config_name in ["wiki-ner"]:
														return acc_and_fa(snake_case__     , snake_case__    )
									elif self.config_name in [
									    "wnli",
									    "copa",
									    "sna",
									    "csqa",
									    "wstp",
									    "inltkh",
									    "bbca",
									    "iitp-mr",
									    "iitp-pr",
									    "actsa-sc",
									    "md",
									]:
														return {"accuracy": simple_accuracy(snake_case__     , snake_case__    )}
									else:
														raise KeyError(
														    "You should supply a configuration name selected in "
														    "[\"wnli\", \"copa\", \"sna\", \"csqa\", \"wstp\", \"inltkh\", \"bbca\", "
														    "\"cvit-mkb-clsr\", \"iitp-mr\", \"iitp-pr\", \"actsa-sc\", \"md\", "
														    "\"wiki-ner\"]"    )





import torch



def    _lowerCAmelCase    ():
					if torch.cuda.is_available():
										UpperCamelCase_		  =   torch.cuda.device_count()
					else:
										UpperCamelCase_		  =   0
					print(f"""Successfully ran on {num_gpus} GPUs""")


if __name__ == "__main__":
	main()
