'''simple docstring'''





from sklearn.metrics import recall_score

import datasets


__lowerCamelCase    :				Optional[Any]							     =	'''
Recall is the fraction of the positive examples that were correctly labeled by the model as positive. It can be computed with the equation:
Recall = TP / (TP + FN)
Where TP is the true positives and FN is the false negatives.
'''


__lowerCamelCase    :				List[Any]							     =	'''
Args:
- **predictions** (`list` of `int`): The predicted labels.
- **references** (`list` of `int`): The ground truth labels.
- **labels** (`list` of `int`): The set of labels to include when `average` is not set to `binary`, and their order when average is `None`. Labels present in the data can be excluded in this input, for example to calculate a multiclass average ignoring a majority negative class, while labels not present in the data will result in 0 components in a macro average. For multilabel targets, labels are column indices. By default, all labels in y_true and y_pred are used in sorted order. Defaults to None.
- **pos_label** (`int`): The class label to use as the \'positive class\' when calculating the recall. Defaults to `1`.
- **average** (`string`): This parameter is required for multiclass/multilabel targets. If None, the scores for each class are returned. Otherwise, this determines the type of averaging performed on the data. Defaults to `\'binary\'`.
    - `\'binary\'`: Only report results for the class specified by `pos_label`. This is applicable only if the target labels and predictions are binary.
    - `\'micro\'`: Calculate metrics globally by counting the total true positives, false negatives, and false positives.
    - `\'macro\'`: Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.
    - `\'weighted\'`: Calculate metrics for each label, and find their average weighted by support (the number of true instances for each label). This alters `\'macro\'` to account for label imbalance. Note that it can result in an F-score that is not between precision and recall.
    - `\'samples\'`: Calculate metrics for each instance, and find their average (only meaningful for multilabel classification).
- **sample_weight** (`list` of `float`): Sample weights Defaults to `None`.
- **zero_division** (): Sets the value to return when there is a zero division. Defaults to .
    - `\'warn\'`: If there is a zero division, the return value is `0`, but warnings are also raised.
    - `0`: If there is a zero division, the return value is `0`.
    - `1`: If there is a zero division, the return value is `1`.

Returns:
- **recall** (`float`, or `array` of `float`): Either the general recall score, or the recall scores for individual classes, depending on the values input to `labels` and `average`. Minimum possible value is 0. Maximum possible value is 1. A higher recall means that more of the positive examples have been labeled correctly. Therefore, a higher recall is generally considered better.

Examples:

    Example 1-A simple example with some errors
        >>> recall_metric = datasets.load_metric(\'recall\')
        >>> results = recall_metric.compute(references=[0, 0, 1, 1, 1], predictions=[0, 1, 0, 1, 1])
        >>> print(results)
        {\'recall\': 0.6666666666666666}

    Example 2-The same example as Example 1, but with `pos_label=0` instead of the default `pos_label=1`.
        >>> recall_metric = datasets.load_metric(\'recall\')
        >>> results = recall_metric.compute(references=[0, 0, 1, 1, 1], predictions=[0, 1, 0, 1, 1], pos_label=0)
        >>> print(results)
        {\'recall\': 0.5}

    Example 3-The same example as Example 1, but with `sample_weight` included.
        >>> recall_metric = datasets.load_metric(\'recall\')
        >>> sample_weight = [0.9, 0.2, 0.9, 0.3, 0.8]
        >>> results = recall_metric.compute(references=[0, 0, 1, 1, 1], predictions=[0, 1, 0, 1, 1], sample_weight=sample_weight)
        >>> print(results)
        {\'recall\': 0.55}

    Example 4-A multiclass example, using different averages.
        >>> recall_metric = datasets.load_metric(\'recall\')
        >>> predictions = [0, 2, 1, 0, 0, 1]
        >>> references = [0, 1, 2, 0, 1, 2]
        >>> results = recall_metric.compute(predictions=predictions, references=references, average=\'macro\')
        >>> print(results)
        {\'recall\': 0.3333333333333333}
        >>> results = recall_metric.compute(predictions=predictions, references=references, average=\'micro\')
        >>> print(results)
        {\'recall\': 0.3333333333333333}
        >>> results = recall_metric.compute(predictions=predictions, references=references, average=\'weighted\')
        >>> print(results)
        {\'recall\': 0.3333333333333333}
        >>> results = recall_metric.compute(predictions=predictions, references=references, average=None)
        >>> print(results)
        {\'recall\': array([1., 0., 0.])}
'''


__lowerCamelCase    :				List[Any]							     =	'''
@article{scikit-learn, title={Scikit-learn: Machine Learning in {P}ython}, author={Pedregosa, F. and Varoquaux, G. and Gramfort, A. and Michel, V. and Thirion, B. and Grisel, O. and Blondel, M. and Prettenhofer, P. and Weiss, R. and Dubourg, V. and Vanderplas, J. and Passos, A. and Cournapeau, D. and Brucher, M. and Perrot, M. and Duchesnay, E.}, journal={Journal of Machine Learning Research}, volume={12}, pages={2825--2830}, year={2011}
'''







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




   def 			__a		(					self    :       Optional[Any]   ):



     """simple docstring"""






     return datasets.MetricInfo(
         description=_DESCRIPTION ,			citation=_CITATION ,			inputs_description=_KWARGS_DESCRIPTION ,			features=datasets.Features(
             {
                 """predictions""": datasets.Sequence(datasets.Value("""int32"""   )   ),
                 """references""": datasets.Sequence(datasets.Value("""int32"""   )   ),
             }
             if self.config_name == """multilabel"""
             else {
                 """predictions""": datasets.Value("""int32"""   ),
                 """references""": datasets.Value("""int32"""   ),
             }   ) ,			reference_urls=["""https://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html"""] ,			)




   def 			__a		(					self    :       Any ,			_lowercase    :       int ,			_lowercase    :       Dict ,			_lowercase    :       str=None ,			_lowercase    :       List[Any]=1 ,			_lowercase    :       Tuple="binary" ,			_lowercase    :       Tuple=None ,			_lowercase    :       Tuple="warn" ,			):



     """simple docstring"""






     SCREAMING_SNAKE_CASE__    							=   recall_score(
         __lowerCamelCase ,			__lowerCamelCase ,			labels=__lowerCamelCase ,			pos_label=__lowerCamelCase ,			average=__lowerCamelCase ,			sample_weight=__lowerCamelCase ,			zero_division=__lowerCamelCase ,			)
     return {"recall": float(__lowerCamelCase   ) if score.size == 1 else score}

import itertools
from dataclasses import dataclass
from typing import List, Optional

import pyarrow as pa
import pyarrow.parquet as pq

import datasets
from datasets.table import table_cast


__lowerCamelCase    :				Union[str, Any]							     =	datasets.utils.logging.get_logger(__name__)







@dataclass
class __snake_case       (		datasets.BuilderConfig	):
   lowerCAmelCase_														=							1_00_00
   lowerCAmelCase_														=							None
   lowerCAmelCase_														=							None







class __snake_case       (		datasets.ArrowBasedBuilder	):
   lowerCAmelCase_														=							ParquetConfig




   def 			__a		(					self    :       List[str]   ):



     """simple docstring"""






     return datasets.DatasetInfo(features=self.config.features   )




   def 			__a		(					self    :       Dict ,			_lowercase    :       List[str]   ):



     """simple docstring"""






     if not self.config.data_files:
       raise ValueError(f"""At least one data file must be specified, but got data_files={self.config.data_files}"""   )
     SCREAMING_SNAKE_CASE__    							=   dl_manager.download_and_extract(self.config.data_files   )
     if isinstance(_lowercase ,			(str, list, tuple)   ):
       SCREAMING_SNAKE_CASE__    							=   data_files
       if isinstance(_lowercase ,			_lowercase   ):
         SCREAMING_SNAKE_CASE__    							=   [files]
       # Use `dl_manager.iter_files` to skip hidden files in an extracted archive
       SCREAMING_SNAKE_CASE__    							=   [dl_manager.iter_files(_lowercase   ) for file in files]
       return [datasets.SplitGenerator(name=datasets.Split.TRAIN ,			gen_kwargs={"""files""": files}   )]
     SCREAMING_SNAKE_CASE__    							=   []
     for split_name, files in data_files.items():
       if isinstance(_lowercase ,			_lowercase   ):
         SCREAMING_SNAKE_CASE__    							=   [files]
       # Use `dl_manager.iter_files` to skip hidden files in an extracted archive
       SCREAMING_SNAKE_CASE__    							=   [dl_manager.iter_files(_lowercase   ) for file in files]
       # Infer features is they are stoed in the arrow schema
       if self.info.features is None:
         for file in itertools.chain.from_iterable(_lowercase   ):
           with open(_lowercase ,			"""rb"""   ) as f:
             SCREAMING_SNAKE_CASE__    							=   datasets.Features.from_arrow_schema(pq.read_schema(_lowercase   )   )
           break
       splits.append(datasets.SplitGenerator(name=_lowercase ,			gen_kwargs={"""files""": files}   )   )
     return splits




   def 			__a		(					self    :       Optional[Any] ,			_lowercase    :       pa.Table   ):



     """simple docstring"""






     if self.info.features is not None:
       # more expensive cast to support nested features with keys in a different order
       # allows str <-> int/float or str to Audio for example
       SCREAMING_SNAKE_CASE__    							=   table_cast(_lowercase ,			self.info.features.arrow_schema   )
     return pa_table




   def 			__a		(					self    :       Dict ,			_lowercase    :       List[Any]   ):



     """simple docstring"""






     SCREAMING_SNAKE_CASE__    							=   self.info.features.arrow_schema if self.info.features is not None else None
     if self.info.features is not None and self.config.columns is not None:
       if sorted(field.name for field in schema   ) != sorted(self.config.columns   ):
         raise ValueError(
             f"""Tried to load parquet data with columns '{self.config.columns}' with mismatching features '{self.info.features}'"""   )
     for file_idx, file in enumerate(itertools.chain.from_iterable(_lowercase   )   ):
       with open(_lowercase ,			"""rb"""   ) as f:
         SCREAMING_SNAKE_CASE__    							=   pq.ParquetFile(_lowercase   )
         try:
           for batch_idx, record_batch in enumerate(
               parquet_file.iter_batches(batch_size=self.config.batch_size ,			columns=self.config.columns   )   ):
             SCREAMING_SNAKE_CASE__    							=   pa.Table.from_batches([record_batch]   )
             # Uncomment for debugging (will print the Arrow table size and elements)
             # logger.warning(f"pa_table: {pa_table} num rows: {pa_table.num_rows}")
             # logger.warning('\n'.join(str(pa_table.slice(i, 1).to_pydict()) for i in range(pa_table.num_rows)))
             yield f"""{file_idx}_{batch_idx}""", self._cast_table(_lowercase   )
         except ValueError as e:
           logger.error(f"""Failed to read file '{file}' with error {type(_lowercase   )}: {e}"""   )
           raise
