'''simple docstring'''

import pyarrow.parquet as pq
import pytest

from datasets import Audio, Dataset, DatasetDict, Features, NamedSplit, Sequence, Value, config
from datasets.features.image import Image
from datasets.io.parquet import ParquetDatasetReader, ParquetDatasetWriter, get_writer_batch_size

from ..utils import assert_arrow_memory_doesnt_increase, assert_arrow_memory_increases
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase     ):
 assert isinstance(UpperCAmelCase		,     UpperCAmelCase     )
 assert dataset.num_rows == 4
 assert dataset.num_columns == 3
 assert dataset.column_names == ["col_1", "col_2", "col_3"]
 for feature, expected_dtype in expected_features.items():
  assert dataset.features[feature].dtype == expected_dtype
@pytest.mark.parametrize('''keep_in_memory'''		,     [False, True]     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase     ):
 lowercase__				:    List[str]  =					tmp_path / '''cache'''
 lowercase__				:    str  =					{'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''}
 with assert_arrow_memory_increases() if keep_in_memory else assert_arrow_memory_doesnt_increase():
  lowercase__				:    Optional[Any]  =					ParquetDatasetReader(UpperCAmelCase		,     cache_dir=UpperCAmelCase		,     keep_in_memory=UpperCAmelCase     ).read()
 _check_parquet_dataset(UpperCAmelCase		,     UpperCAmelCase     )
@pytest.mark.parametrize(
    '''features'''		,     [
        None,
        {'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''},
        {'''col_1''': '''string''', '''col_2''': '''string''', '''col_3''': '''string'''},
        {'''col_1''': '''int32''', '''col_2''': '''int32''', '''col_3''': '''int32'''},
        {'''col_1''': '''float32''', '''col_2''': '''float32''', '''col_3''': '''float32'''},
    ]		,     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase     ):
 lowercase__				:    str  =					tmp_path / '''cache'''
 lowercase__				:    Union[str, Any]  =					{'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''}
 lowercase__				:    Any  =					features.copy() if features else default_expected_features
 lowercase__				:    Union[str, Any]  =					(
     Features({feature: Value(UpperCAmelCase     ) for feature, dtype in features.items()}     ) if features is not None else None
 )
 lowercase__				:    List[Any]  =					ParquetDatasetReader(UpperCAmelCase		,     features=UpperCAmelCase		,     cache_dir=UpperCAmelCase     ).read()
 _check_parquet_dataset(UpperCAmelCase		,     UpperCAmelCase     )
@pytest.mark.parametrize('''split'''		,     [None, NamedSplit('''train'''     ), '''train''', '''test''']     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase     ):
 lowercase__				:    Optional[int]  =					tmp_path / '''cache'''
 lowercase__				:    Tuple  =					{'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''}
 lowercase__				:    Any  =					ParquetDatasetReader(UpperCAmelCase		,     cache_dir=UpperCAmelCase		,     split=UpperCAmelCase     ).read()
 _check_parquet_dataset(UpperCAmelCase		,     UpperCAmelCase     )
 assert dataset.split == split if split else "train"
@pytest.mark.parametrize('''path_type'''		,     [str, list]     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase     ):
 if issubclass(UpperCAmelCase		,     UpperCAmelCase     ):
  lowercase__				:    int  =					parquet_path
 elif issubclass(UpperCAmelCase		,     UpperCAmelCase     ):
  lowercase__				:    str  =					[parquet_path]
 lowercase__				:    int  =					tmp_path / '''cache'''
 lowercase__				:    Any  =					{'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''}
 lowercase__				:    Dict  =					ParquetDatasetReader(UpperCAmelCase		,     cache_dir=UpperCAmelCase     ).read()
 _check_parquet_dataset(UpperCAmelCase		,     UpperCAmelCase     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase=("train",)     ):
 assert isinstance(UpperCAmelCase		,     UpperCAmelCase     )
 for split in splits:
  lowercase__				:    Dict  =					dataset_dict[split]
  assert dataset.num_rows == 4
  assert dataset.num_columns == 3
  assert dataset.column_names == ["col_1", "col_2", "col_3"]
  for feature, expected_dtype in expected_features.items():
   assert dataset.features[feature].dtype == expected_dtype
@pytest.mark.parametrize('''keep_in_memory'''		,     [False, True]     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase     ):
 lowercase__				:    Tuple  =					tmp_path / '''cache'''
 lowercase__				:    Dict  =					{'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''}
 with assert_arrow_memory_increases() if keep_in_memory else assert_arrow_memory_doesnt_increase():
  lowercase__				:    Any  =					ParquetDatasetReader(
      {'''train''': parquet_path}		,     cache_dir=UpperCAmelCase		,     keep_in_memory=UpperCAmelCase     ).read()
 _check_parquet_datasetdict(UpperCAmelCase		,     UpperCAmelCase     )
@pytest.mark.parametrize(
    '''features'''		,     [
        None,
        {'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''},
        {'''col_1''': '''string''', '''col_2''': '''string''', '''col_3''': '''string'''},
        {'''col_1''': '''int32''', '''col_2''': '''int32''', '''col_3''': '''int32'''},
        {'''col_1''': '''float32''', '''col_2''': '''float32''', '''col_3''': '''float32'''},
    ]		,     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase     ):
 lowercase__				:    List[Any]  =					tmp_path / '''cache'''
 lowercase__				:    List[Any]  =					{'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''}
 lowercase__				:    List[str]  =					features.copy() if features else default_expected_features
 lowercase__				:    Tuple  =					(
     Features({feature: Value(UpperCAmelCase     ) for feature, dtype in features.items()}     ) if features is not None else None
 )
 lowercase__				:    Union[str, Any]  =					ParquetDatasetReader({'''train''': parquet_path}		,     features=UpperCAmelCase		,     cache_dir=UpperCAmelCase     ).read()
 _check_parquet_datasetdict(UpperCAmelCase		,     UpperCAmelCase     )
@pytest.mark.parametrize('''split'''		,     [None, NamedSplit('''train'''     ), '''train''', '''test''']     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase		,     UpperCAmelCase     ):
 if split:
  lowercase__				:    str  =					{split: parquet_path}
 else:
  lowercase__				:    str  =					'''train'''
  lowercase__				:    Any  =					{'''train''': parquet_path, '''test''': parquet_path}
 lowercase__				:    str  =					tmp_path / '''cache'''
 lowercase__				:    Tuple  =					{'''col_1''': '''string''', '''col_2''': '''int64''', '''col_3''': '''float64'''}
 lowercase__				:    str  =					ParquetDatasetReader(UpperCAmelCase		,     cache_dir=UpperCAmelCase     ).read()
 _check_parquet_datasetdict(UpperCAmelCase		,     UpperCAmelCase		,     splits=list(path.keys()     )     )
 assert all(dataset[split].split == split for split in path.keys()     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase     ):
 lowercase__				:    Optional[int]  =					ParquetDatasetWriter(UpperCAmelCase		,     tmp_path / '''foo.parquet'''     )
 assert writer.write() > 0
 lowercase__				:    int  =					pq.ParquetFile(tmp_path / '''foo.parquet'''     )
 lowercase__				:    List[str]  =					pf.read()
 assert dataset.data.table == output_table
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase     ):
 lowercase__				:    List[Any]  =					str(shared_datadir / '''test_image_rgb.jpg'''     )
 lowercase__				:    Any  =					{'''image''': [image_path]}
 lowercase__				:    Optional[Any]  =					Features({'''image''': Image()}     )
 lowercase__				:    Tuple  =					Dataset.from_dict(UpperCAmelCase		,     features=UpperCAmelCase     )
 lowercase__				:    List[Any]  =					ParquetDatasetWriter(UpperCAmelCase		,     tmp_path / '''foo.parquet'''     )
 assert writer.write() > 0

 lowercase__				:    Union[str, Any]  =					Dataset.from_parquet(str(tmp_path / '''foo.parquet'''     )     )
 assert dataset.features == reloaded_dataset.features

 lowercase__				:    List[Any]  =					ParquetDatasetReader(str(tmp_path / '''foo.parquet'''     )		,     streaming=UpperCAmelCase     ).read()
 assert dataset.features == reloaded_iterable_dataset.features





@pytest.mark.parametrize(
    '''feature, expected'''		,     [
        (Features({'''foo''': Value('''int32'''     )}     ), None),
        (Features({'''image''': Image(), '''foo''': Value('''int32'''     )}     ), config.PARQUET_ROW_GROUP_SIZE_FOR_IMAGE_DATASETS),
        (Features({'''nested''': Sequence(Audio()     )}     ), config.PARQUET_ROW_GROUP_SIZE_FOR_AUDIO_DATASETS),
    ]		,     )
def 			__UpperCamelCase       (   UpperCAmelCase		,     UpperCAmelCase     ):
 assert get_writer_batch_size(UpperCAmelCase     ) == expected


'''simple docstring'''

def 			__UpperCamelCase       (   UpperCAmelCase     ):
 lowercase__				:    List[str]  =					0
 while num > 0:
  digit_sum += num % 10
  num //= 10
 return digit_sum
def 			__UpperCamelCase       (   UpperCAmelCase = 100     ):
 lowercase__				:    Dict  =					1
 lowercase__				:    Optional[int]  =					2

 for i in range(2		,     max_n + 1     ):
  lowercase__				:    List[str]  =					pre_numerator
  lowercase__				:    Optional[Any]  =					2 * i // 3 if i % 3 == 0 else 1
  lowercase__				:    Union[str, Any]  =					cur_numerator
  lowercase__				:    int  =					e_cont * pre_numerator + temp

 return sum_digits(UpperCAmelCase     )


if __name__ == "__main__":
  print(F'{solution() = }')

