


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


UpperCAmelCase__   	=							datasets.utils.logging.get_logger(__name__)







@dataclass
class       lowerCamelCase__   (       datasets.BuilderConfig):
     SCREAMING_SNAKE_CASE__      			=			10000
     SCREAMING_SNAKE_CASE__      			=			None
     SCREAMING_SNAKE_CASE__      			=			None







class       lowerCamelCase__   (       datasets.ArrowBasedBuilder):
     SCREAMING_SNAKE_CASE__      			=			ParquetConfig





     def      __A					(self       )     ->   Union[str, Any]:
      return datasets.DatasetInfo(features=self.config.features       )





     def      __A					(self		,     UpperCAmelCase       )     ->   List[str]:
      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}"       )
      _lowercase							      =dl_manager.download_and_extract(self.config.data_files       )
      if isinstance(UpperCAmelCase		,     (str, list, tuple)       ):
       _lowercase							      =data_files
       if isinstance(UpperCAmelCase		,     UpperCAmelCase       ):
        _lowercase							      =[files]
       # Use `dl_manager.iter_files` to skip hidden files in an extracted archive
       _lowercase							      =[dl_manager.iter_files(UpperCAmelCase       ) for file in files]
       return [datasets.SplitGenerator(name=datasets.Split.TRAIN		,     gen_kwargs={'''files''': files}       )]
      _lowercase							      =[]
      for split_name, files in data_files.items():
       if isinstance(UpperCAmelCase		,     UpperCAmelCase       ):
        _lowercase							      =[files]
       # Use `dl_manager.iter_files` to skip hidden files in an extracted archive
       _lowercase							      =[dl_manager.iter_files(UpperCAmelCase       ) 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(UpperCAmelCase       ):
         with open(UpperCAmelCase		,     '''rb'''       ) as f:
          _lowercase							      =datasets.Features.from_arrow_schema(pq.read_schema(UpperCAmelCase       )       )
         break
       splits.append(datasets.SplitGenerator(name=UpperCAmelCase		,     gen_kwargs={'''files''': files}       )       )
      return splits





     def      __A					(self		,     UpperCAmelCase       )     ->   pa.Table:
      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
       _lowercase							      =table_cast(UpperCAmelCase		,     self.info.features.arrow_schema       )
      return pa_table





     def      __A					(self		,     UpperCAmelCase       )     ->   Tuple:
      _lowercase							      =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(UpperCAmelCase       )       ):
       with open(UpperCAmelCase		,     '''rb'''       ) as f:
        _lowercase							      =pq.ParquetFile(UpperCAmelCase       )
        try:
         for batch_idx, record_batch in enumerate(
             parquet_file.iter_batches(batch_size=self.config.batch_size		,     columns=self.config.columns       )       ):
          _lowercase							      =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(UpperCAmelCase       )
        except ValueError as e:
         logger.error(f"Failed to read file '{file}' with error {type(UpperCAmelCase       )}: {e}"       )
         raise





UpperCAmelCase__   	=							8.31_44_62  # Unit - J mol-1 K-1
def 				UpperCAmelCase_					(							__snake_case     ,						__snake_case     ,						__snake_case						)     ->			float:







 """simple docstring"""


 if moles < 0 or kelvin < 0 or volume < 0:
  raise ValueError('''Invalid inputs. Enter positive value.'''						)
 return moles * kelvin * UNIVERSAL_GAS_CONSTANT / volume
def 				UpperCAmelCase_					(							__snake_case     ,						__snake_case     ,						__snake_case						)     ->			float:







 """simple docstring"""


 if moles < 0 or kelvin < 0 or pressure < 0:
  raise ValueError('''Invalid inputs. Enter positive value.'''						)
 return moles * kelvin * UNIVERSAL_GAS_CONSTANT / pressure


if __name__ == "__main__":
  from doctest import testmod

  testmod()

