




import math



def      UpperCAmelCase_   (     __UpperCamelCase     ):
    if n <= 0:
        raise ValueError("""Only positive integers have prime factors"""     )
    SCREAMING_SNAKE_CASE__       =[]
    while n % 2 == 0:
        pf.append(2     )
        SCREAMING_SNAKE_CASE__       =int(n / 2     )
    for i in range(3,    int(math.sqrt(__UpperCamelCase     )     ) + 1,    2     ):
        while n % i == 0:
            pf.append(__UpperCamelCase     )
            SCREAMING_SNAKE_CASE__       =int(n / i     )
    if n > 2:
        pf.append(__UpperCamelCase     )
    return pf



def      UpperCAmelCase_   (     __UpperCamelCase     ):
    if n <= 0:
        raise ValueError("""Only positive numbers are accepted"""     )
    SCREAMING_SNAKE_CASE__       =1
    SCREAMING_SNAKE_CASE__       =1
    while n % 2 == 0:
        temp += 1
        SCREAMING_SNAKE_CASE__       =int(n / 2     )
    div *= temp
    for i in range(3,    int(math.sqrt(__UpperCamelCase     )     ) + 1,    2     ):
        SCREAMING_SNAKE_CASE__       =1
        while n % i == 0:
            temp += 1
            SCREAMING_SNAKE_CASE__       =int(n / i     )
        div *= temp
    if n > 1:
        div *= 2
    return div



def      UpperCAmelCase_   (     __UpperCamelCase     ):
    if n <= 0:
        raise ValueError("""Only positive numbers are accepted"""     )
    SCREAMING_SNAKE_CASE__       =1
    SCREAMING_SNAKE_CASE__       =1
    while n % 2 == 0:
        temp += 1
        SCREAMING_SNAKE_CASE__       =int(n / 2     )
    if temp > 1:
        s *= (2**temp - 1) / (2 - 1)
    for i in range(3,    int(math.sqrt(__UpperCamelCase     )     ) + 1,    2     ):
        SCREAMING_SNAKE_CASE__       =1
        while n % i == 0:
            temp += 1
            SCREAMING_SNAKE_CASE__       =int(n / i     )
        if temp > 1:
            s *= (i**temp - 1) / (i - 1)
    return int(__UpperCamelCase     )



def      UpperCAmelCase_   (     __UpperCamelCase     ):
    SCREAMING_SNAKE_CASE__       =n
    for x in set(prime_factors(__UpperCamelCase     )     ):
        s *= (x - 1) / x
    return int(__UpperCamelCase     )


if __name__ == "__main__":
    import doctest

    doctest.testmod()







import os
import tempfile
from pathlib import Path
from unittest import TestCase

import pyarrow as pa
import pytest

from datasets.arrow_dataset import Dataset
from datasets.arrow_reader import ArrowReader, BaseReader, FileInstructions, ReadInstruction, make_file_instructions
from datasets.info import DatasetInfo
from datasets.splits import NamedSplit, Split, SplitDict, SplitInfo

from .utils import assert_arrow_memory_doesnt_increase, assert_arrow_memory_increases
class 				__a (			__lowerCamelCase					):


     """simple docstring"""


     def   __A    (     self      :			Optional[Any]    ,_UpperCamelCase      :			Optional[int]    ,_UpperCamelCase      :			Optional[Any]=False						)		->       Tuple:


         '''simple docstring'''





         SCREAMING_SNAKE_CASE__      ,		SCREAMING_SNAKE_CASE__      ,		SCREAMING_SNAKE_CASE__       =(
             filename_skip_take["""filename"""],
             filename_skip_take["""skip"""] if """skip""" in filename_skip_take else None,
             filename_skip_take["""take"""] if """take""" in filename_skip_take else None,
         )
         open(os.path.join(_UpperCamelCase						)    ,"""wb"""						).close()
         SCREAMING_SNAKE_CASE__       =pa.Table.from_pydict({"""filename""": [Path(_UpperCamelCase						).name] * 1_0_0}						)
         if take == -1:
             SCREAMING_SNAKE_CASE__       =len(_UpperCamelCase						) - skip
         if skip is not None and take is not None:
             SCREAMING_SNAKE_CASE__       =pa_table.slice(_UpperCamelCase    ,_UpperCamelCase						)
         return pa_table






class 				__a (			__lowerCamelCase					):


     """simple docstring"""


     def   __A    (     self      :			List[str]						)		->       Any:


         '''simple docstring'''





         SCREAMING_SNAKE_CASE__       ="""my_name"""
         SCREAMING_SNAKE_CASE__       =SplitInfo(name="""train"""    ,num_examples=1_0_0						)
         SCREAMING_SNAKE_CASE__       =SplitInfo(name="""test"""    ,num_examples=1_0_0						)
         SCREAMING_SNAKE_CASE__       =[train_info, test_info]
         SCREAMING_SNAKE_CASE__       =SplitDict()
         split_dict.add(_UpperCamelCase						)
         split_dict.add(_UpperCamelCase						)
         SCREAMING_SNAKE_CASE__       =DatasetInfo(splits=_UpperCamelCase						)

         with tempfile.TemporaryDirectory() as tmp_dir:
             SCREAMING_SNAKE_CASE__       =ReaderTest(_UpperCamelCase    ,_UpperCamelCase						)

             SCREAMING_SNAKE_CASE__       ="""test[:33%]"""
             SCREAMING_SNAKE_CASE__       =Dataset(**reader.read(_UpperCamelCase    ,_UpperCamelCase    ,_UpperCamelCase						)						)
             self.assertEqual(dset["""filename"""][0]    ,f"""{name}-test"""						)
             self.assertEqual(dset.num_rows    ,3_3						)
             self.assertEqual(dset.num_columns    ,1						)

             SCREAMING_SNAKE_CASE__       =["""train""", """test[:33%]"""]
             SCREAMING_SNAKE_CASE__       =[Split.TRAIN, ReadInstruction.from_spec("""test[:33%]"""						)]
             for instructions in [instructionsa, instructionsa]:
                 SCREAMING_SNAKE_CASE__       =[reader.read(_UpperCamelCase    ,_UpperCamelCase    ,_UpperCamelCase						) for instr in instructions]
                 SCREAMING_SNAKE_CASE__      ,		SCREAMING_SNAKE_CASE__       =(Dataset(**_UpperCamelCase						) for dataset_kwargs in datasets_kwargs)
                 self.assertEqual(train_dset["""filename"""][0]    ,f"""{name}-train"""						)
                 self.assertEqual(train_dset.num_rows    ,1_0_0						)
                 self.assertEqual(train_dset.num_columns    ,1						)
                 self.assertIsInstance(train_dset.split    ,_UpperCamelCase						)
                 self.assertEqual(str(train_dset.split						)    ,"""train"""						)
                 self.assertEqual(test_dset["""filename"""][0]    ,f"""{name}-test"""						)
                 self.assertEqual(test_dset.num_rows    ,3_3						)
                 self.assertEqual(test_dset.num_columns    ,1						)
                 self.assertIsInstance(test_dset.split    ,_UpperCamelCase						)
                 self.assertEqual(str(test_dset.split						)    ,"""test[:33%]"""						)
                 del train_dset, test_dset




     def   __A    (     self      :			Tuple						)		->       str:


         '''simple docstring'''





         SCREAMING_SNAKE_CASE__       ="""my_name"""
         SCREAMING_SNAKE_CASE__       =SplitInfo(name="""train"""    ,num_examples=1_0_0_0    ,shard_lengths=[1_0_0] * 1_0						)
         SCREAMING_SNAKE_CASE__       =[train_info]
         SCREAMING_SNAKE_CASE__       =SplitDict()
         split_dict.add(_UpperCamelCase						)
         SCREAMING_SNAKE_CASE__       =DatasetInfo(splits=_UpperCamelCase						)

         with tempfile.TemporaryDirectory() as tmp_dir:
             SCREAMING_SNAKE_CASE__       =ReaderTest(_UpperCamelCase    ,_UpperCamelCase						)

             SCREAMING_SNAKE_CASE__       ="""train[:33%]"""
             SCREAMING_SNAKE_CASE__       =Dataset(**reader.read(_UpperCamelCase    ,_UpperCamelCase    ,_UpperCamelCase						)						)
             self.assertEqual(dset["""filename"""][0]    ,f"""{name}-train-00000-of-00010"""						)
             self.assertEqual(dset["""filename"""][-1]    ,f"""{name}-train-00003-of-00010"""						)
             self.assertEqual(dset.num_rows    ,3_3_0						)
             self.assertEqual(dset.num_columns    ,1						)




     def   __A    (     self      :			Dict						)		->       Union[str, Any]:


         '''simple docstring'''





         SCREAMING_SNAKE_CASE__       =SplitInfo(name="""train"""    ,num_examples=1_0_0						)
         SCREAMING_SNAKE_CASE__       =SplitInfo(name="""test"""    ,num_examples=1_0_0						)
         SCREAMING_SNAKE_CASE__       =SplitDict()
         split_dict.add(_UpperCamelCase						)
         split_dict.add(_UpperCamelCase						)
         SCREAMING_SNAKE_CASE__       =DatasetInfo(splits=_UpperCamelCase						)

         with tempfile.TemporaryDirectory() as tmp_dir:
             SCREAMING_SNAKE_CASE__       =ReaderTest(_UpperCamelCase    ,_UpperCamelCase						)

             SCREAMING_SNAKE_CASE__       =[
                 {"""filename""": os.path.join(_UpperCamelCase    ,"""train"""						)},
                 {"""filename""": os.path.join(_UpperCamelCase    ,"""test"""						), """skip""": 1_0, """take""": 1_0},
             ]
             SCREAMING_SNAKE_CASE__       =Dataset(**reader.read_files(_UpperCamelCase    ,original_instructions="""train+test[10:20]"""						)						)
             self.assertEqual(dset.num_rows    ,1_1_0						)
             self.assertEqual(dset.num_columns    ,1						)
             del dset






@pytest.mark.parametrize("""in_memory""",    [False, True]     )
def      UpperCAmelCase_   (     __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase     ):
    SCREAMING_SNAKE_CASE__       =arrow_file
    with assert_arrow_memory_increases() if in_memory else assert_arrow_memory_doesnt_increase():
        SCREAMING_SNAKE_CASE__       =ArrowReader.read_table(__UpperCamelCase,    in_memory=__UpperCamelCase     )
    assert table.shape == dataset.data.shape
    assert set(table.column_names     ) == set(dataset.data.column_names     )
    assert dict(table.to_pydict()     ) == dict(dataset.data.to_pydict()     )  # to_pydict returns OrderedDict



@pytest.mark.parametrize("""in_memory""",    [False, True]     )
def      UpperCAmelCase_   (     __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase     ):
    SCREAMING_SNAKE_CASE__       =arrow_file
    SCREAMING_SNAKE_CASE__       =ArrowReader("""""",    __UpperCamelCase     )
    with assert_arrow_memory_increases() if in_memory else assert_arrow_memory_doesnt_increase():
        SCREAMING_SNAKE_CASE__       =reader.read_files([{"""filename""": filename}],    in_memory=__UpperCamelCase     )
    assert dataset_kwargs.keys() == {"arrow_table", "info", "split"}
    SCREAMING_SNAKE_CASE__       =dataset_kwargs["""arrow_table"""]
    assert table.shape == dataset.data.shape
    assert set(table.column_names     ) == set(dataset.data.column_names     )
    assert dict(table.to_pydict()     ) == dict(dataset.data.to_pydict()     )  # to_pydict returns OrderedDict



def      UpperCAmelCase_   (     ):
    assert ReadInstruction("""train""",    to=10,    unit="""abs"""     ).to_spec() == "train[:10]"
    assert ReadInstruction("""train""",    from_=-80,    to=10,    unit="""%"""     ).to_spec() == "train[-80%:10%]"

    SCREAMING_SNAKE_CASE__       ="""train+test"""
    assert ReadInstruction.from_spec(__UpperCamelCase     ).to_spec() == spec_train_test

    SCREAMING_SNAKE_CASE__       ="""train[2:10]"""
    assert ReadInstruction.from_spec(__UpperCamelCase     ).to_spec() == spec_train_abs

    SCREAMING_SNAKE_CASE__       ="""train[15%:-20%]"""
    assert ReadInstruction.from_spec(__UpperCamelCase     ).to_spec() == spec_train_pct

    SCREAMING_SNAKE_CASE__       ="""train[:10%](closest)"""
    assert ReadInstruction.from_spec(__UpperCamelCase     ).to_spec() == "train[:10%]"

    SCREAMING_SNAKE_CASE__       ="""train[:10%](pct1_dropremainder)"""
    assert ReadInstruction.from_spec(__UpperCamelCase     ).to_spec() == spec_train_pct_rounding

    SCREAMING_SNAKE_CASE__       ="""train[:10%](pct1_dropremainder)+test[-10%:](pct1_dropremainder)"""
    assert ReadInstruction.from_spec(__UpperCamelCase     ).to_spec() == spec_train_test_pct_rounding



def      UpperCAmelCase_   (     ):
    SCREAMING_SNAKE_CASE__       ="""dummy"""
    SCREAMING_SNAKE_CASE__       =[SplitInfo(name="""train""",    num_examples=100     )]
    SCREAMING_SNAKE_CASE__       ="""train[:33%]"""
    SCREAMING_SNAKE_CASE__       ="""arrow"""
    SCREAMING_SNAKE_CASE__       ="""prefix"""

    SCREAMING_SNAKE_CASE__       =make_file_instructions(__UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase     )
    assert isinstance(__UpperCamelCase,    __UpperCamelCase     )
    assert file_instructions.num_examples == 33
    assert file_instructions.file_instructions == [
        {"filename": os.path.join(__UpperCamelCase,    f"""{name}-train.arrow"""     ), "skip": 0, "take": 33}
    ]

    SCREAMING_SNAKE_CASE__       =[SplitInfo(name="""train""",    num_examples=100,    shard_lengths=[10] * 10     )]
    SCREAMING_SNAKE_CASE__       =make_file_instructions(__UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase     )
    assert isinstance(__UpperCamelCase,    __UpperCamelCase     )
    assert file_instructions.num_examples == 33
    assert file_instructions.file_instructions == [
        {"filename": os.path.join(__UpperCamelCase,    f"""{name}-train-00000-of-00010.arrow"""     ), "skip": 0, "take": -1},
        {"filename": os.path.join(__UpperCamelCase,    f"""{name}-train-00001-of-00010.arrow"""     ), "skip": 0, "take": -1},
        {"filename": os.path.join(__UpperCamelCase,    f"""{name}-train-00002-of-00010.arrow"""     ), "skip": 0, "take": -1},
        {"filename": os.path.join(__UpperCamelCase,    f"""{name}-train-00003-of-00010.arrow"""     ), "skip": 0, "take": 3},
    ]




@pytest.mark.parametrize("""name, expected_exception""",    [(None, TypeError), ("""""", ValueError)]     )
def      UpperCAmelCase_   (     __UpperCamelCase,    __UpperCamelCase     ):
    SCREAMING_SNAKE_CASE__       =[SplitInfo(name="""train""",    num_examples=100     )]
    SCREAMING_SNAKE_CASE__       ="""train"""
    SCREAMING_SNAKE_CASE__       ="""arrow"""
    SCREAMING_SNAKE_CASE__       ="""prefix_path"""
    with pytest.raises(__UpperCamelCase     ):
        SCREAMING_SNAKE_CASE__       =make_file_instructions(__UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase,    __UpperCamelCase     )






