
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__    :		Optional[int]          =   datasets.utils.logging.get_logger(__name__)



@dataclass
class       _snake_case   (	datasets.BuilderConfig							):
 __lowerCAmelCase  :     int        =			10_000
 __lowerCAmelCase  :     Optional[List[str]]        =			None
 __lowerCAmelCase  :     Optional[datasets.Features]        =			None



class       _snake_case   (	datasets.ArrowBasedBuilder							):
 __lowerCAmelCase  :     Any        =			ParquetConfig


 def      lowercase__     (					self):


   '''simple docstring'''




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


 def      lowercase__     (					self					,  SCREAMING_SNAKE_CASE_):


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


 def      lowercase__     (					self					,  SCREAMING_SNAKE_CASE_):


   '''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
     lowercase__  :   List[Any]    		=      table_cast(SCREAMING_SNAKE_CASE_					,  self.info.features.arrow_schema)
   return pa_table



 def      lowercase__     (					self					,  SCREAMING_SNAKE_CASE_):


   '''simple docstring'''




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








def 		UpperCamelCase	(      lowercase_ = 10_00   )		->	int:


  '''simple docstring'''






  return sum(2 * a * ((a - 1) // 2) for a in range(3 , n + 1   )   )


if __name__ == "__main__":
     print(solution())






