





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 	lowerCAmelCase_					(			__a      ,       __a						)	->						List[Any]:







  """simple docstring"""





  assert isinstance(__a      ,       __a						)
  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 	lowerCAmelCase_					(			__a      ,       __a      ,       __a						)	->						Any:







  """simple docstring"""





  lowerCamelCase__: Any         =tmp_path / "cache"
  lowerCamelCase__: Optional[int]         ={"col_1": "string", "col_2": "int64", "col_3": "float64"}
  with assert_arrow_memory_increases() if keep_in_memory else assert_arrow_memory_doesnt_increase():
    lowerCamelCase__: Tuple         =ParquetDatasetReader(__a      ,       cache_dir=__a      ,       keep_in_memory=__a						).read()
  _check_parquet_dataset(__a      ,       __a						)





@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 	lowerCAmelCase_					(			__a      ,       __a      ,       __a						)	->						List[str]:







  """simple docstring"""





  lowerCamelCase__: int         =tmp_path / "cache"
  lowerCamelCase__: Tuple         ={"col_1": "string", "col_2": "int64", "col_3": "float64"}
  lowerCamelCase__: Union[str, Any]         =features.copy() if features else default_expected_features
  lowerCamelCase__: Optional[int]         =(
      Features({feature: Value(__a						) for feature, dtype in features.items()}						) if features is not None else None
  )
  lowerCamelCase__: int         =ParquetDatasetReader(__a      ,       features=__a      ,       cache_dir=__a						).read()
  _check_parquet_dataset(__a      ,       __a						)





@pytest.mark.parametrize("split"      ,       [None, NamedSplit("train"						), "train", "test"]						)
def 	lowerCAmelCase_					(			__a      ,       __a      ,       __a						)	->						Any:







  """simple docstring"""





  lowerCamelCase__: Any         =tmp_path / "cache"
  lowerCamelCase__: Optional[Any]         ={"col_1": "string", "col_2": "int64", "col_3": "float64"}
  lowerCamelCase__: Optional[Any]         =ParquetDatasetReader(__a      ,       cache_dir=__a      ,       split=__a						).read()
  _check_parquet_dataset(__a      ,       __a						)
  assert dataset.split == split if split else "train"





@pytest.mark.parametrize("path_type"      ,       [str, list]						)
def 	lowerCAmelCase_					(			__a      ,       __a      ,       __a						)	->						int:







  """simple docstring"""





  if issubclass(__a      ,       __a						):
    lowerCamelCase__: List[Any]         =parquet_path
  elif issubclass(__a      ,       __a						):
    lowerCamelCase__: str         =[parquet_path]
  lowerCamelCase__: Tuple         =tmp_path / "cache"
  lowerCamelCase__: Optional[Any]         ={"col_1": "string", "col_2": "int64", "col_3": "float64"}
  lowerCamelCase__: int         =ParquetDatasetReader(__a      ,       cache_dir=__a						).read()
  _check_parquet_dataset(__a      ,       __a						)





def 	lowerCAmelCase_					(			__a      ,       __a      ,       __a=("train",)						)	->						Dict:







  """simple docstring"""





  assert isinstance(__a      ,       __a						)
  for split in splits:
    lowerCamelCase__: Tuple         =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 	lowerCAmelCase_					(			__a      ,       __a      ,       __a						)	->						Any:







  """simple docstring"""





  lowerCamelCase__: List[Any]         =tmp_path / "cache"
  lowerCamelCase__: Optional[Any]         ={"col_1": "string", "col_2": "int64", "col_3": "float64"}
  with assert_arrow_memory_increases() if keep_in_memory else assert_arrow_memory_doesnt_increase():
    lowerCamelCase__: Tuple         =ParquetDatasetReader(
        {"train": parquet_path}      ,       cache_dir=__a      ,       keep_in_memory=__a						).read()
  _check_parquet_datasetdict(__a      ,       __a						)





@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 	lowerCAmelCase_					(			__a      ,       __a      ,       __a						)	->						Optional[Any]:







  """simple docstring"""





  lowerCamelCase__: Tuple         =tmp_path / "cache"
  lowerCamelCase__: Optional[int]         ={"col_1": "string", "col_2": "int64", "col_3": "float64"}
  lowerCamelCase__: List[Any]         =features.copy() if features else default_expected_features
  lowerCamelCase__: int         =(
      Features({feature: Value(__a						) for feature, dtype in features.items()}						) if features is not None else None
  )
  lowerCamelCase__: Optional[Any]         =ParquetDatasetReader({"train": parquet_path}      ,       features=__a      ,       cache_dir=__a						).read()
  _check_parquet_datasetdict(__a      ,       __a						)





@pytest.mark.parametrize("split"      ,       [None, NamedSplit("train"						), "train", "test"]						)
def 	lowerCAmelCase_					(			__a      ,       __a      ,       __a						)	->						Union[str, Any]:







  """simple docstring"""





  if split:
    lowerCamelCase__: Any         ={split: parquet_path}
  else:
    lowerCamelCase__: int         ="train"
    lowerCamelCase__: Any         ={"train": parquet_path, "test": parquet_path}
  lowerCamelCase__: str         =tmp_path / "cache"
  lowerCamelCase__: Any         ={"col_1": "string", "col_2": "int64", "col_3": "float64"}
  lowerCamelCase__: int         =ParquetDatasetReader(__a      ,       cache_dir=__a						).read()
  _check_parquet_datasetdict(__a      ,       __a      ,       splits=list(path.keys()						)						)
  assert all(dataset[split].split == split for split in path.keys()						)





def 	lowerCAmelCase_					(			__a      ,       __a						)	->						int:







  """simple docstring"""





  lowerCamelCase__: List[str]         =ParquetDatasetWriter(__a      ,       tmp_path / "foo.parquet"						)
  assert writer.write() > 0
  lowerCamelCase__: List[str]         =pq.ParquetFile(tmp_path / "foo.parquet"						)
  lowerCamelCase__: List[str]         =pf.read()
  assert dataset.data.table == output_table





def 	lowerCAmelCase_					(			__a      ,       __a						)	->						List[str]:







  """simple docstring"""





  lowerCamelCase__: List[str]         =str(shared_datadir / "test_image_rgb.jpg"						)
  lowerCamelCase__: Union[str, Any]         ={"image": [image_path]}
  lowerCamelCase__: Optional[Any]         =Features({"image": Image()}						)
  lowerCamelCase__: Optional[int]         =Dataset.from_dict(__a      ,       features=__a						)
  lowerCamelCase__: Optional[int]         =ParquetDatasetWriter(__a      ,       tmp_path / "foo.parquet"						)
  assert writer.write() > 0

  lowerCamelCase__: Dict         =Dataset.from_parquet(str(tmp_path / "foo.parquet"						)						)
  assert dataset.features == reloaded_dataset.features

  lowerCamelCase__: Optional[Any]         =ParquetDatasetReader(str(tmp_path / "foo.parquet"						)      ,       streaming=__a						).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 	lowerCAmelCase_					(			__a      ,       __a						)	->						Optional[Any]:







  """simple docstring"""





  assert get_writer_batch_size(__a						) == expected




'''simple docstring'''

def 							_UpperCamelCase				(   lowerCAmelCase__:					int		,lowerCAmelCase__:					bool = False   )      -> bool:
							if n == 2:
														return True
							if not n % 2 or n < 2:
														return False
							if n > 5 and n % 10 not in (1, 3, 7, 9):  # can quickly check last digit
														return False
							if n > 3_3170_4406_4679_8873_8596_1981 and not allow_probable:
														raise ValueError(
														    'Warning: upper bound of deterministic test is exceeded. '
														    'Pass allow_probable=True to allow probabilistic test. '
														    'A return value of True indicates a probable prime.'   )
							# array bounds provided by analysis
							SCREAMING_SNAKE_CASE_				=				[
							    2047,
							    137_3653,
							    2532_6001,
							    32_1503_1751,
							    2_1523_0289_8747,
							    3_4747_4966_0383,
							    341_5500_7172_8321,
							    1,
							    382_5123_0565_4641_3051,
							    1,
							    1,
							    3186_6585_7834_0311_5116_7461,
							    3_3170_4406_4679_8873_8596_1981,
							]

							SCREAMING_SNAKE_CASE_				=				[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
							for idx, _p in enumerate(lowerCAmelCase__		,1   ):
														if n < _p:
																					# then we have our last prime to check
																					SCREAMING_SNAKE_CASE_				=				primes[:idx]
																					break
							SCREAMING_SNAKE_CASE_				,    SCREAMING_SNAKE_CASE_				=				n - 1, 0
							# break up n -1 into a power of 2 (s) and
							# remaining odd component
							# essentially, solve for d * 2 ** s == n - 1
							while d % 2 == 0:
														d //= 2
														s += 1
							for prime in plist:
														SCREAMING_SNAKE_CASE_				=				False
														for r in range(lowerCAmelCase__   ):
																					SCREAMING_SNAKE_CASE_				=				pow(lowerCAmelCase__		,d * 2**r		,lowerCAmelCase__   )
																					# see article for analysis explanation for m
																					if (r == 0 and m == 1) or ((m + 1) % n == 0):
																												SCREAMING_SNAKE_CASE_				=				True
																												# this loop will not determine compositeness
																												break
														if pr:
																					continue
														# if pr is False, then the above loop never evaluated to true,
														# and the n MUST be composite
														return False
							return True




def 							_UpperCamelCase				(   )      -> None:
							assert not miller_rabin(561   )
							assert miller_rabin(563   )
							# 2047

							assert not miller_rabin(83_8201   )
							assert miller_rabin(83_8207   )
							# 1_373_653

							assert not miller_rabin(1731_6001   )
							assert miller_rabin(1731_6017   )
							# 25_326_001

							assert not miller_rabin(30_7838_6641   )
							assert miller_rabin(30_7838_6653   )
							# 3_215_031_751

							assert not miller_rabin(1_7130_4557_4801   )
							assert miller_rabin(1_7130_4557_4819   )
							# 2_152_302_898_747

							assert not miller_rabin(2_7797_9972_8307   )
							assert miller_rabin(2_7797_9972_8327   )
							# 3_474_749_660_383

							assert not miller_rabin(113_8500_2390_9441   )
							assert miller_rabin(113_8500_2390_9527   )
							# 341_550_071_728_321

							assert not miller_rabin(127_5041_0188_4880_4351   )
							assert miller_rabin(127_5041_0188_4880_4391   )
							# 3_825_123_056_546_413_051

							assert not miller_rabin(796_6646_4458_5077_8779_1867   )
							assert miller_rabin(796_6646_4458_5077_8779_1951   )
							# 318_665_857_834_031_151_167_461

							assert not miller_rabin(5528_4067_7446_6478_9766_0333   )
							assert miller_rabin(5528_4067_7446_6478_9766_0359   )
							# 3_317_044_064_679_887_385_961_981
							# upper limit for probabilistic test


if __name__ == "__main__":
							test_miller_rabin()





