






'''simple docstring'''



# Lint as: python3
import sys
from collections.abc import Mapping
from typing import TYPE_CHECKING

import numpy as np
import pyarrow as pa

from .. import config
from ..utils.py_utils import map_nested
from .formatting import TensorFormatter


if TYPE_CHECKING:
      import torch
class UpperCAmelCase_       (     TensorFormatter[Mapping, '''torch.Tensor''', Mapping]					):




      """simple docstring"""




      def __init__(			self      :		Dict  ,   UpperCAmelCase      :		str=None  ,   **UpperCAmelCase      :		List[Any]		)	->	int:


       '''simple docstring'''

       super().__init__(features=UpperCAmelCase		)
       lowercase       : List[Any]						=torch_tensor_kwargs
       import torch  # noqa import torch at initialization






      def 					A__   (			self      :		Union[str, Any]  ,   UpperCAmelCase      :		Dict		)	->	List[str]:


       '''simple docstring'''

       import torch

       if isinstance(UpperCAmelCase  ,   UpperCAmelCase		) and column:
        if all(
            isinstance(UpperCAmelCase  ,   torch.Tensor		) and x.shape == column[0].shape and x.dtype == column[0].dtype
            for x in column		):
         return torch.stack(UpperCAmelCase		)
       return column






      def 					A__   (			self      :		List[str]  ,   UpperCAmelCase      :		Optional[int]		)	->	Optional[Any]:


       '''simple docstring'''

       import torch

       if isinstance(UpperCAmelCase  ,   (str, bytes, type(UpperCAmelCase		))		):
        return value
       elif isinstance(UpperCAmelCase  ,   (np.character, np.ndarray)		) and np.issubdtype(value.dtype  ,   np.character		):
        return value.tolist()

       lowercase       : Any						={}

       if isinstance(UpperCAmelCase  ,   (np.number, np.ndarray)		) and np.issubdtype(value.dtype  ,   np.integer		):
        lowercase       : Tuple						={'''dtype''': torch.intaa}
       elif isinstance(UpperCAmelCase  ,   (np.number, np.ndarray)		) and np.issubdtype(value.dtype  ,   np.floating		):
        lowercase       : int						={'''dtype''': torch.floataa}
       elif config.PIL_AVAILABLE and "PIL" in sys.modules:
        import PIL.Image

        if isinstance(UpperCAmelCase  ,   PIL.Image.Image		):
         lowercase       : List[Any]						=np.asarray(UpperCAmelCase		)
       return torch.tensor(UpperCAmelCase  ,   **{**default_dtype, **self.torch_tensor_kwargs}		)






      def 					A__   (			self      :		List[Any]  ,   UpperCAmelCase      :		Dict		)	->	Tuple:


       '''simple docstring'''

       import torch

       # support for torch, tf, jax etc.
       if hasattr(UpperCAmelCase  ,   '''__array__'''		) and not isinstance(UpperCAmelCase  ,   torch.Tensor		):
        lowercase       : List[Any]						=data_struct.__array__()
       # support for nested types like struct of list of struct
       if isinstance(UpperCAmelCase  ,   np.ndarray		):
        if data_struct.dtype == object:  # torch tensors cannot be instantied from an array of objects
         return self._consolidate([self.recursive_tensorize(UpperCAmelCase		) for substruct in data_struct]		)
       elif isinstance(UpperCAmelCase  ,   (list, tuple)		):
        return self._consolidate([self.recursive_tensorize(UpperCAmelCase		) for substruct in data_struct]		)
       return self._tensorize(UpperCAmelCase		)






      def 					A__   (			self      :		str  ,   UpperCAmelCase      :		dict		)	->	Any:


       '''simple docstring'''

       return map_nested(self._recursive_tensorize  ,   UpperCAmelCase  ,   map_list=UpperCAmelCase		)






      def 					A__   (			self      :		Union[str, Any]  ,   UpperCAmelCase      :		pa.Table		)	->	Mapping:


       '''simple docstring'''

       lowercase       : List[str]						=self.numpy_arrow_extractor().extract_row(UpperCAmelCase		)
       lowercase       : Any						=self.python_features_decoder.decode_row(UpperCAmelCase		)
       return self.recursive_tensorize(UpperCAmelCase		)






      def 					A__   (			self      :		Any  ,   UpperCAmelCase      :		pa.Table		)	->	"torch.Tensor":


       '''simple docstring'''

       lowercase       : int						=self.numpy_arrow_extractor().extract_column(UpperCAmelCase		)
       lowercase       : Tuple						=self.python_features_decoder.decode_column(UpperCAmelCase  ,   pa_table.column_names[0]		)
       lowercase       : Optional[Any]						=self.recursive_tensorize(UpperCAmelCase		)
       lowercase       : Any						=self._consolidate(UpperCAmelCase		)
       return column






      def 					A__   (			self      :		str  ,   UpperCAmelCase      :		pa.Table		)	->	Mapping:


       '''simple docstring'''

       lowercase       : Tuple						=self.numpy_arrow_extractor().extract_batch(UpperCAmelCase		)
       lowercase       : List[str]						=self.python_features_decoder.decode_batch(UpperCAmelCase		)
       lowercase       : Dict						=self.recursive_tensorize(UpperCAmelCase		)
       for column_name in batch:
        lowercase       : str						=self._consolidate(batch[column_name]		)
       return batch










'''simple docstring'''

import dataclasses
import json
import warnings
from dataclasses import dataclass, field
from time import time
from typing import List

from ..utils import logging


a   	=    logging.get_logger(__name__)

def     __magic_name__							(				__UpperCAmelCase=None				,						__UpperCAmelCase=None   )    ->       Dict:

   '''simple docstring'''







   return field(default_factory=lambda: default				,						metadata=__UpperCAmelCase   )







@dataclass
class __a			:
   __UpperCamelCase :			List[str]						   =						list_field(
       default=[], metadata={
           'help': (
               'Model checkpoints to be provided to the AutoModel classes. Leave blank to benchmark the base version'
               ' of all available models'
           )
       }, )

   __UpperCamelCase :			List[int]						   =						list_field(
       default=[8], metadata={'help': 'List of batch sizes for which memory and time performance will be evaluated'}      )

   __UpperCamelCase :			List[int]						   =						list_field(
       default=[8, 32, 128, 512], metadata={'help': 'List of sequence lengths for which memory and time performance will be evaluated'}, )

   __UpperCamelCase :			bool						   =						field(
       default=_snake_case, metadata={'help': 'Whether to benchmark inference of model. Inference can be disabled via --no-inference.'}, )
   __UpperCamelCase :			bool						   =						field(
       default=_snake_case, metadata={'help': 'Whether to run on available cuda devices. Cuda can be disabled via --no-cuda.'}, )
   __UpperCamelCase :			bool						   =						field(
       default=_snake_case, metadata={'help': 'Whether to run on available tpu devices. TPU can be disabled via --no-tpu.'}      )
   __UpperCamelCase :			bool						   =						field(default=_snake_case, metadata={'help': 'Use FP16 to accelerate inference.'}      )
   __UpperCamelCase :			bool						   =						field(default=_snake_case, metadata={'help': 'Benchmark training of model'}      )
   __UpperCamelCase :			bool						   =						field(default=_snake_case, metadata={'help': 'Verbose memory tracing'}      )
   __UpperCamelCase :			bool						   =						field(
       default=_snake_case, metadata={'help': 'Whether to perform speed measurements. Speed measurements can be disabled via --no-speed.'}, )
   __UpperCamelCase :			bool						   =						field(
       default=_snake_case, metadata={
           'help': 'Whether to perform memory measurements. Memory measurements can be disabled via --no-memory'
       }, )
   __UpperCamelCase :			bool						   =						field(default=_snake_case, metadata={'help': 'Trace memory line by line'}      )
   __UpperCamelCase :			bool						   =						field(default=_snake_case, metadata={'help': 'Save result to a CSV file'}      )
   __UpperCamelCase :			bool						   =						field(default=_snake_case, metadata={'help': 'Save all print statements in a log file'}      )
   __UpperCamelCase :			bool						   =						field(default=_snake_case, metadata={'help': 'Whether to print environment information'}      )
   __UpperCamelCase :			bool						   =						field(
       default=_snake_case, metadata={
           'help': (
               'Whether to use multiprocessing for memory and speed measurement. It is highly recommended to use'
               ' multiprocessing for accurate CPU and GPU memory measurements. This option should only be disabled'
               ' for debugging / testing and on TPU.'
           )
       }, )
   __UpperCamelCase :			str						   =						field(
       default=F'inference_time_{round(time()      )}.csv', metadata={'help': 'CSV filename used if saving time results to csv.'}, )
   __UpperCamelCase :			str						   =						field(
       default=F'inference_memory_{round(time()      )}.csv', metadata={'help': 'CSV filename used if saving memory results to csv.'}, )
   __UpperCamelCase :			str						   =						field(
       default=F'train_time_{round(time()      )}.csv', metadata={'help': 'CSV filename used if saving time results to csv for training.'}, )
   __UpperCamelCase :			str						   =						field(
       default=F'train_memory_{round(time()      )}.csv', metadata={'help': 'CSV filename used if saving memory results to csv for training.'}, )
   __UpperCamelCase :			str						   =						field(
       default=F'env_info_{round(time()      )}.csv', metadata={'help': 'CSV filename used if saving environment information.'}, )
   __UpperCamelCase :			str						   =						field(
       default=F'log_{round(time()      )}.csv', metadata={'help': 'Log filename used if print statements are saved in log.'}, )
   __UpperCamelCase :			int						   =						field(default=3, metadata={'help': 'Times an experiment will be run.'}      )
   __UpperCamelCase :			bool						   =						field(
       default=_snake_case, metadata={
           'help': (
               'Instead of loading the model as defined in `config.architectures` if exists, just load the pretrain'
               ' model weights.'
           )
       }, )





   def   UpperCAmelCase__  (       self					:      List[Any]     ):

      '''simple docstring'''

      warnings.warn(
          f"""The class {self.__class__} is deprecated. Hugging Face Benchmarking utils"""
          """ are deprecated in general and it is advised to use external Benchmarking libraries """
          """ to benchmark Transformer models."""					,lowerCamelCase					,)





   def   UpperCAmelCase__  (       self					:      int     ):

      '''simple docstring'''

      return json.dumps(dataclasses.asdict(self     )					,indent=2     )





   @property
   def   UpperCAmelCase__  (       self					:      str     ):

      '''simple docstring'''

      if len(self.models     ) <= 0:
         raise ValueError(
             """Please make sure you provide at least one model name / model identifier, *e.g.* `--models"""
             """ bert-base-cased` or `args.models = ['bert-base-cased']."""     )
      return self.models





   @property
   def   UpperCAmelCase__  (       self					:      Tuple     ):

      '''simple docstring'''

      if not self.multi_process:
         return False
      elif self.is_tpu:
         logger.info("""Multiprocessing is currently not possible on TPU."""     )
         return False
      else:
         return True





