§
    Ó˜ºhL  ã                   ó‚  — d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZmZmZ g d¢Z ed¦  «        Z edd	¬
¦  «        Zeeef         Zeedf         Z edee¦  «        Z G d„ dee         ¦  «        Z G d„ dee         e	e         ¦  «        Z G d„ deeedf                  ¦  «        Z G d„ dee         ¦  «        Z  G d„ dee         ¦  «        Z! G d„ de¦  «        Z" G d„ dee         ¦  «        Z#efdee         deee$e%f                  de
e         de&e#e                  fd„Z'dS ) é    N)ÚSequence)ÚcastÚGenericÚIterableÚOptionalÚTypeVarÚUnion)Ú
deprecated)Údefault_generatorÚ	GeneratorÚrandpermÚTensor)ÚDatasetÚIterableDatasetÚTensorDatasetÚStackDatasetÚConcatDatasetÚChainDatasetÚSubsetÚrandom_splitÚ_TÚ_T_coT)Ú	covariant.Ú_T_stackc                   ó&   — e Zd ZdZdefd„Zd	d„ZdS )
r   aµ  An abstract class representing a :class:`Dataset`.

    All datasets that represent a map from keys to data samples should subclass
    it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a
    data sample for a given key. Subclasses could also optionally overwrite
    :meth:`__len__`, which is expected to return the size of the dataset by many
    :class:`~torch.utils.data.Sampler` implementations and the default options
    of :class:`~torch.utils.data.DataLoader`. Subclasses could also
    optionally implement :meth:`__getitems__`, for speedup batched samples
    loading. This method accepts list of indices of samples of batch and returns
    list of samples.

    .. note::
      :class:`~torch.utils.data.DataLoader` by default constructs an index
      sampler that yields integral indices.  To make it work with a map-style
      dataset with non-integral indices/keys, a custom sampler must be provided.
    Úreturnc                 ó    — t          d¦  «        ‚)Nz3Subclasses of Dataset should implement __getitem__.)ÚNotImplementedError©ÚselfÚindexs     ú`/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/torch/utils/data/dataset.pyÚ__getitem__zDataset.__getitem__:   s   € Ý!Ð"WÑXÔXÐXó    ÚotherúDataset[_T_co]úConcatDataset[_T_co]c                 ó$   — t          | |g¦  «        S ©N)r   ©r    r%   s     r"   Ú__add__zDataset.__add__A   s   € Ý˜d E˜]Ñ+Ô+Ð+r$   N)r%   r&   r   r'   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r+   © r$   r"   r   r   '   sR   € € € € € ðð ð$Y Eð Yð Yð Yð Yð,ð ,ð ,ð ,ð ,ð ,r$   r   c                   ó*   — e Zd ZdZdee         fd„ZdS )r   aI  An iterable Dataset.

    All datasets that represent an iterable of data samples should subclass it.
    Such form of datasets is particularly useful when data come from a stream.

    All subclasses should overwrite :meth:`__iter__`, which would return an
    iterator of samples in this dataset.

    When a subclass is used with :class:`~torch.utils.data.DataLoader`, each
    item in the dataset will be yielded from the :class:`~torch.utils.data.DataLoader`
    iterator. When :attr:`num_workers > 0`, each worker process will have a
    different copy of the dataset object, so it is often desired to configure
    each copy independently to avoid having duplicate data returned from the
    workers. :func:`~torch.utils.data.get_worker_info`, when called in a worker
    process, returns information about the worker. It can be used in either the
    dataset's :meth:`__iter__` method or the :class:`~torch.utils.data.DataLoader` 's
    :attr:`worker_init_fn` option to modify each copy's behavior.

    Example 1: splitting workload across all workers in :meth:`__iter__`::

        >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_DATALOADER)
        >>> # xdoctest: +SKIP("Fails on MacOS12")
        >>> class MyIterableDataset(torch.utils.data.IterableDataset):
        ...     def __init__(self, start, end):
        ...         super(MyIterableDataset).__init__()
        ...         assert end > start, "this example code only works with end >= start"
        ...         self.start = start
        ...         self.end = end
        ...
        ...     def __iter__(self):
        ...         worker_info = torch.utils.data.get_worker_info()
        ...         if worker_info is None:  # single-process data loading, return the full iterator
        ...             iter_start = self.start
        ...             iter_end = self.end
        ...         else:  # in a worker process
        ...             # split workload
        ...             per_worker = int(math.ceil((self.end - self.start) / float(worker_info.num_workers)))
        ...             worker_id = worker_info.id
        ...             iter_start = self.start + worker_id * per_worker
        ...             iter_end = min(iter_start + per_worker, self.end)
        ...         return iter(range(iter_start, iter_end))
        ...
        >>> # should give same set of data as range(3, 7), i.e., [3, 4, 5, 6].
        >>> ds = MyIterableDataset(start=3, end=7)

        >>> # Single-process loading
        >>> print(list(torch.utils.data.DataLoader(ds, num_workers=0)))
        [tensor([3]), tensor([4]), tensor([5]), tensor([6])]

        >>> # xdoctest: +REQUIRES(POSIX)
        >>> # Multi-process loading with two worker processes
        >>> # Worker 0 fetched [3, 4].  Worker 1 fetched [5, 6].
        >>> # xdoctest: +IGNORE_WANT("non deterministic")
        >>> print(list(torch.utils.data.DataLoader(ds, num_workers=2)))
        [tensor([3]), tensor([5]), tensor([4]), tensor([6])]

        >>> # With even more workers
        >>> # xdoctest: +IGNORE_WANT("non deterministic")
        >>> print(list(torch.utils.data.DataLoader(ds, num_workers=12)))
        [tensor([3]), tensor([5]), tensor([4]), tensor([6])]

    Example 2: splitting workload across all workers using :attr:`worker_init_fn`::

        >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_DATALOADER)
        >>> class MyIterableDataset(torch.utils.data.IterableDataset):
        ...     def __init__(self, start, end):
        ...         super(MyIterableDataset).__init__()
        ...         assert end > start, "this example code only works with end >= start"
        ...         self.start = start
        ...         self.end = end
        ...
        ...     def __iter__(self):
        ...         return iter(range(self.start, self.end))
        ...
        >>> # should give same set of data as range(3, 7), i.e., [3, 4, 5, 6].
        >>> ds = MyIterableDataset(start=3, end=7)

        >>> # Single-process loading
        >>> print(list(torch.utils.data.DataLoader(ds, num_workers=0)))
        [3, 4, 5, 6]
        >>>
        >>> # Directly doing multi-process loading yields duplicate data
        >>> print(list(torch.utils.data.DataLoader(ds, num_workers=2)))
        [3, 3, 4, 4, 5, 5, 6, 6]

        >>> # Define a `worker_init_fn` that configures each dataset copy differently
        >>> def worker_init_fn(worker_id):
        ...     worker_info = torch.utils.data.get_worker_info()
        ...     dataset = worker_info.dataset  # the dataset copy in this worker process
        ...     overall_start = dataset.start
        ...     overall_end = dataset.end
        ...     # configure the dataset to only process the split workload
        ...     per_worker = int(math.ceil((overall_end - overall_start) / float(worker_info.num_workers)))
        ...     worker_id = worker_info.id
        ...     dataset.start = overall_start + worker_id * per_worker
        ...     dataset.end = min(dataset.start + per_worker, overall_end)
        ...

        >>> # Mult-process loading with the custom `worker_init_fn`
        >>> # Worker 0 fetched [3, 4].  Worker 1 fetched [5, 6].
        >>> print(list(torch.utils.data.DataLoader(ds, num_workers=2, worker_init_fn=worker_init_fn)))
        [3, 5, 4, 6]

        >>> # With even more workers
        >>> print(list(torch.utils.data.DataLoader(ds, num_workers=12, worker_init_fn=worker_init_fn)))
        [3, 4, 5, 6]
    r%   c                 ó$   — t          | |g¦  «        S r)   )r   r*   s     r"   r+   zIterableDataset.__add__¶   s   € Ý˜T 5˜MÑ*Ô*Ð*r$   N)r,   r-   r.   r/   r   r   r+   r0   r$   r"   r   r   I   s@   € € € € € ðjð jðX+˜W Uœ^ð +ð +ð +ð +ð +ð +r$   r   c                   óJ   — e Zd ZU dZeedf         ed<   deddfd„Zd„ Zd„ Z	dS )	r   zÎDataset wrapping tensors.

    Each sample will be retrieved by indexing tensors along the first dimension.

    Args:
        *tensors (Tensor): tensors that have the same size of the first dimension.
    .Útensorsr   Nc                 ó`   ‡— t          ˆfd„‰D ¦   «         ¦  «        s
J d¦   «         ‚‰| _        d S )Nc              3   ó|   •K  — | ]6}‰d                                d ¦  «        |                      d ¦  «        k    V — Œ7dS )r   N)Úsize)Ú.0Útensorr4   s     €r"   ú	<genexpr>z)TensorDataset.__init__.<locals>.<genexpr>É   sS   øè è € ð 
ð 
Ø5;ˆG�AŒJ�OŠO˜AÑÔ &§+¢+¨a¡.¤.Ò0ð
ð 
ð 
ð 
ð 
ð 
r$   zSize mismatch between tensors)Úallr4   )r    r4   s    `r"   Ú__init__zTensorDataset.__init__È   s_   ø€ Ýð 
ð 
ð 
ð 
Ø?Fð
ñ 
ô 
ñ 
ô 
ð 	+ð 	+à*ñ	+ô 	+ð 	+ð ˆŒˆˆr$   c                 óD   ‡— t          ˆfd„| j        D ¦   «         ¦  «        S )Nc              3   ó(   •K  — | ]}|‰         V — Œd S r)   r0   )r8   r9   r!   s     €r"   r:   z,TensorDataset.__getitem__.<locals>.<genexpr>Ï   s'   øè è € Ð>Ð> v�V˜E”]Ð>Ð>Ð>Ð>Ð>Ð>r$   )Útupler4   r   s    `r"   r#   zTensorDataset.__getitem__Î   s(   ø€ ÝÐ>Ð>Ð>Ð>°´Ð>Ñ>Ô>Ñ>Ô>Ð>r$   c                 óB   — | j         d                              d¦  «        S ©Nr   )r4   r7   ©r    s    r"   Ú__len__zTensorDataset.__len__Ñ   s   € ØŒ|˜AŒ×#Ò# AÑ&Ô&Ð&r$   )
r,   r-   r.   r/   r?   r   Ú__annotations__r<   r#   rC   r0   r$   r"   r   r   ½   sw   € € € € € € ðð ð �6˜3�;ÔÐÐÑð ð ¨Dð ð ð ð ð?ð ?ð ?ð'ð 'ð 'ð 'ð 'r$   r   c                   ór   — e Zd ZU dZeeef         ed<   dee	         dee	         ddfd„Z
d„ Zd	efd
„Zd„ ZdS )r   a�  Dataset as a stacking of multiple datasets.

    This class is useful to assemble different parts of complex input data, given as datasets.

    Example:
        >>> # xdoctest: +SKIP
        >>> images = ImageDataset()
        >>> texts = TextDataset()
        >>> tuple_stack = StackDataset(images, texts)
        >>> tuple_stack[0] == (images[0], texts[0])
        >>> dict_stack = StackDataset(image=images, text=texts)
        >>> dict_stack[0] == {'image': images[0], 'text': texts[0]}

    Args:
        *args (Dataset): Datasets for stacking returned as tuple.
        **kwargs (Dataset): Datasets for stacking returned as dict.
    ÚdatasetsÚargsÚkwargsr   Nc                 óÂ  ‡ — |r^|rt          d¦  «        ‚t          |d         ¦  «        ‰ _        t          ˆ fd„|D ¦   «         ¦  «        rt          d¦  «        ‚|‰ _        d S |rnt          |                     ¦   «         ¦  «        }t          |d         ¦  «        ‰ _        t          ˆ fd„|D ¦   «         ¦  «        rt          d¦  «        ‚|‰ _        d S t          d¦  «        ‚)NztSupported either ``tuple``- (via ``args``) or``dict``- (via ``kwargs``) like input/output, but both types are given.r   c              3   óH   •K  — | ]}‰j         t          |¦  «        k    V — Œd S r)   ©Ú_lengthÚlen©r8   Údatasetr    s     €r"   r:   z(StackDataset.__init__.<locals>.<genexpr>ò   s0   øè è € ÐDÐD°G�4”<¥3 w¡<¤<Ò/ÐDÐDÐDÐDÐDÐDr$   zSize mismatch between datasetsc              3   óH   •K  — | ]}‰j         t          |¦  «        k    V — Œd S r)   rK   rN   s     €r"   r:   z(StackDataset.__init__.<locals>.<genexpr>ø   s0   øè è € ÐCÐC°G�4”<¥3 w¡<¤<Ò/ÐCÐCÐCÐCÐCÐCr$   z%At least one dataset should be passed)Ú
ValueErrorrM   rL   ÚanyrF   ÚlistÚvalues)r    rG   rH   Útmps   `   r"   r<   zStackDataset.__init__ê   sý   ø€ Øð 	FØð Ý ð^ñô ð õ ˜t Aœw™<œ<ˆDŒLÝÐDÐDÐDÐD¸tÐDÑDÔDÑDÔDð CÝ Ð!AÑBÔBÐBØ ˆDŒMˆMˆMØð 	FÝ�v—}’}‘”Ñ'Ô'ˆCÝ˜s 1œv™;œ;ˆDŒLÝÐCÐCÐCÐC¸sÐCÑCÔCÑCÔCð CÝ Ð!AÑBÔBÐBØ"ˆDŒMˆMˆMåÐDÑEÔEÐEr$   c                 óÂ   ‡— t          | j        t          ¦  «        r%ˆfd„| j                             ¦   «         D ¦   «         S t	          ˆfd„| j        D ¦   «         ¦  «        S )Nc                 ó(   •— i | ]\  }}||‰         “ŒS r0   r0   )r8   ÚkrO   r!   s      €r"   ú
<dictcomp>z,StackDataset.__getitem__.<locals>.<dictcomp>   s#   ø€ ÐNÐNÐN©*¨!¨W�A�w˜u”~ÐNÐNÐNr$   c              3   ó(   •K  — | ]}|‰         V — Œd S r)   r0   )r8   rO   r!   s     €r"   r:   z+StackDataset.__getitem__.<locals>.<genexpr>  s'   øè è € ÐAÐA¨�W˜U”^ÐAÐAÐAÐAÐAÐAr$   )Ú
isinstancerF   ÚdictÚitemsr?   r   s    `r"   r#   zStackDataset.__getitem__þ   se   ø€ Ý�d”m¥TÑ*Ô*ð 	OØNÐNÐNÐN¸¼×8KÒ8KÑ8MÔ8MÐNÑNÔNÐNÝÐAÐAÐAÐA°4´=ÐAÑAÔAÑAÔAÐAr$   Úindicesc           	      ó  — t          | j        t          ¦  «        rìd„ |D ¦   «         }| j                             ¦   «         D ]Ä\  }}t	          t          |dd ¦  «        ¦  «        r€|                     |¦  «        }t          |¦  «        t          |¦  «        k    r/t          dt          |¦  «        › dt          |¦  «        › �¦  «        ‚t          ||¦  «        D ]
\  }}|||<   ŒŒ£t          ||¦  «        D ]\  }}||         ||<   ŒŒÅ|S d„ |D ¦   «         }	| j        D ]á}t	          t          |dd ¦  «        ¦  «        r�|                     |¦  «        }t          |¦  «        t          |¦  «        k    r/t          dt          |¦  «        › dt          |¦  «        › �¦  «        ‚t          ||	¦  «        D ]\  }}
|
 
                    |¦  «         ŒŒ°t          ||	¦  «        D ] \  }}
|
 
                    ||         ¦  «         Œ!Œâd„ |	D ¦   «         }|S )Nc                 ó   — g | ]}i ‘ŒS r0   r0   ©r8   Ú_s     r"   ú
<listcomp>z-StackDataset.__getitems__.<locals>.<listcomp>  s   € Ð(=Ð(=Ð(=°¨Ð(=Ð(=Ð(=r$   Ú__getitems__z0Nested dataset's output size mismatch. Expected z, got c                 ó   — g | ]}g ‘ŒS r0   r0   ra   s     r"   rc   z-StackDataset.__getitems__.<locals>.<listcomp>  s   € Ð!6Ð!6Ð!6¨ "Ð!6Ð!6Ð!6r$   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r0   )r?   )r8   Úsamples     r"   rc   z-StackDataset.__getitems__.<locals>.<listcomp>%  s   € Ð&NÐ&NÐ&N¸¥u¨V¡}¤}Ð&NÐ&NÐ&Nr$   )r[   rF   r\   r]   ÚcallableÚgetattrrd   rM   rQ   ÚzipÚappend)r    r^   Ú
dict_batchrX   rO   r]   ÚdataÚd_sampleÚidxÚ
list_batchÚt_sampleÚtuple_batchs               r"   rd   zStackDataset.__getitems__  sw  € å�d”m¥TÑ*Ô*ð 	Ø(=Ð(=°WÐ(=Ñ(=Ô(=ˆJØ"œm×1Ò1Ñ3Ô3ð 3ð 3‘
��7Ý�G G¨^¸TÑBÔBÑCÔCð 3Ø#×0Ò0°Ñ9Ô9�EÝ˜5‘z”z¥S¨¡\¤\Ò1Ð1Ý(ðJÝ),¨W©¬ðJð JÝ=@À¹Z¼ZðJð Jñô ð õ +.¨e°ZÑ*@Ô*@ð +ð +™˜˜hØ&*˜ ™˜ð+õ *-¨W°jÑ)AÔ)Að 3ð 3™˜˜XØ&-¨c¤l˜ ™˜ð3àÐð "7Ð!6¨gÐ!6Ñ!6Ô!6ˆ
Ø”}ð 	2ð 	2ˆGÝ� ¨¸Ñ>Ô>Ñ?Ô?ð 2Ø×,Ò,¨WÑ5Ô5�Ý�u‘:”:¥ W¡¤Ò-Ð-Ý$ðFÝ%(¨¡\¤\ðFð FÝ9<¸U¹¼ðFð Fñô ð õ '*¨%°Ñ&<Ô&<ð *ð *‘N�D˜(Ø—O’O DÑ)Ô)Ð)Ð)ð*õ &)¨°*Ñ%=Ô%=ð 2ð 2‘M�C˜Ø—O’O G¨C¤LÑ1Ô1Ð1Ð1ð2à&NÐ&NÀ:Ð&NÑ&NÔ&NˆØÐr$   c                 ó   — | j         S r)   )rL   rB   s    r"   rC   zStackDataset.__len__(  s
   € ØŒ|Ðr$   )r,   r-   r.   r/   r	   r?   r\   rD   r   r   r<   r#   rS   rd   rC   r0   r$   r"   r   r   Õ   s¬   € € € € € € ðð ð$ �E˜4�KÔ Ð Ð Ñ ðF˜g eœnð F¸À¼ð FÈ4ð Fð Fð Fð Fð(Bð Bð Bð
# Dð #ð #ð #ð #ðJð ð ð ð r$   r   c                   óÐ   ‡ — e Zd ZU dZeee                  ed<   ee         ed<   e	d„ ¦   «         Z
dee         ddfˆ fd„Zd„ Zd	„ Ze ed
e¬¦  «        d„ ¦   «         ¦   «         Zˆ xZS )r   zÄDataset as a concatenation of multiple datasets.

    This class is useful to assemble different existing datasets.

    Args:
        datasets (sequence): List of datasets to be concatenated
    rF   Úcumulative_sizesc                 óp   — g d}}| D ].}t          |¦  «        }|                     ||z   ¦  «         ||z  }Œ/|S rA   )rM   rk   )ÚsequenceÚrÚsÚeÚls        r"   ÚcumsumzConcatDataset.cumsum8  sH   € à�1ˆ1ˆØð 	ð 	ˆAÝ�A‘”ˆAØ�HŠH�Q˜‘U‰OŒOˆOØ�‰FˆAˆAØˆr$   r   Nc                 óD  •— t          ¦   «                              ¦   «          t          |¦  «        | _        t	          | j        ¦  «        dk    s
J d¦   «         ‚| j        D ]!}t          |t          ¦  «        r
J d¦   «         ‚Œ"|                      | j        ¦  «        | _        d S )Nr   z(datasets should not be an empty iterablez.ConcatDataset does not support IterableDataset)	Úsuperr<   rS   rF   rM   r[   r   r|   ru   )r    rF   ÚdÚ	__class__s      €r"   r<   zConcatDataset.__init__A  s´   ø€ Ý‰Œ×ÒÑÔÐÝ˜X™œˆŒÝ�4”=Ñ!Ô! AÒ%Ð%Ð%Ð'QÑ%Ô%Ð%Ø”ð 	@ð 	@ˆAÝ!Ø•?ñô ð @ð @à?ñ@ô @ð @ð @ð !%§¢¨D¬MÑ :Ô :ˆÔÐÐr$   c                 ó   — | j         d         S )Néÿÿÿÿ©ru   rB   s    r"   rC   zConcatDataset.__len__K  s   € ØÔ$ RÔ(Ð(r$   c                 ó
  — |dk     r5| t          | ¦  «        k    rt          d¦  «        ‚t          | ¦  «        |z   }t          j        | j        |¦  «        }|dk    r|}n|| j        |dz
           z
  }| j        |         |         S )Nr   z8absolute value of index should not exceed dataset lengthé   )rM   rQ   ÚbisectÚbisect_rightru   rF   )r    ro   Údataset_idxÚ
sample_idxs       r"   r#   zConcatDataset.__getitem__N  s“   € Ø�Š7ˆ7Øˆt•c˜$‘i”iÒÐÝ ØNñô ð õ �d‘)”)˜c‘/ˆCÝÔ)¨$Ô*?ÀÑEÔEˆØ˜!ÒÐØˆJˆJà˜tÔ4°[À1±_ÔEÑEˆJØŒ}˜[Ô)¨*Ô5Ð5r$   z>`cummulative_sizes` attribute is renamed to `cumulative_sizes`)Úcategoryc                 ó   — | j         S r)   rƒ   rB   s    r"   Úcummulative_sizeszConcatDataset.cummulative_sizes\  s   € ð Ô$Ð$r$   )r,   r-   r.   r/   rS   r   r   rD   ÚintÚstaticmethodr|   r   r<   rC   r#   Úpropertyr
   ÚFutureWarningrŒ   Ú__classcell__©r€   s   @r"   r   r   ,  sù   ø€ € € € € € ðð ð �7˜5”>Ô"Ð"Ð"Ñ"Ø˜3”iÐÐÑàðð ñ „\ðð; ¨'Ô!2ð ;°tð ;ð ;ð ;ð ;ð ;ð ;ð)ð )ð )ð6ð 6ð 6ð Ø€ZØHØðñ ô ð%ð %ñ	ô ñ „Xð
%ð %ð %ð %ð %r$   r   c                   óD   ‡ — e Zd ZdZdee         ddfˆ fd„Zd„ Zd„ Zˆ xZ	S )r   a_  Dataset for chaining multiple :class:`IterableDataset` s.

    This class is useful to assemble different existing dataset streams. The
    chaining operation is done on-the-fly, so concatenating large-scale
    datasets with this class will be efficient.

    Args:
        datasets (iterable of IterableDataset): datasets to be chained together
    rF   r   Nc                 óV   •— t          ¦   «                              ¦   «          || _        d S r)   )r~   r<   rF   )r    rF   r€   s     €r"   r<   zChainDataset.__init__p  s$   ø€ Ý‰Œ×ÒÑÔÐØ ˆŒˆˆr$   c              #   ól   K  — | j         D ])}t          |t          ¦  «        s
J d¦   «         ‚|E d {V —† Œ*d S )Nú*ChainDataset only supports IterableDataset)rF   r[   r   )r    r   s     r"   Ú__iter__zChainDataset.__iter__t  sd   è è € Ø”ð 	ð 	ˆAÝØ•?ñô ð <ð <à;ñ<ô <ð <ð ˆLˆLˆLˆLˆLˆLˆLˆLð		ð 	r$   c                 ó€   — d}| j         D ]3}t          |t          ¦  «        s
J d¦   «         ‚|t          |¦  «        z  }Œ4|S )Nr   r–   )rF   r[   r   rM   )r    Útotalr   s      r"   rC   zChainDataset.__len__{  s^   € ØˆØ”ð 	ð 	ˆAÝØ•?ñô ð <ð <à;ñ<ô <ð <ð •S˜‘V”V‰OˆEˆEØˆr$   )
r,   r-   r.   r/   r   r   r<   r—   rC   r‘   r’   s   @r"   r   r   e  sx   ø€ € € € € ðð ð! ¨'Ô!2ð !°tð !ð !ð !ð !ð !ð !ðð ð ðð ð ð ð ð ð r$   r   c                   ó    — e Zd ZU dZee         ed<   ee         ed<   dee         dee         ddfd„Z	d„ Z
dee         dee         fd„Zd	„ ZdS )
r   z´
    Subset of a dataset at specified indices.

    Args:
        dataset (Dataset): The whole Dataset
        indices (sequence): Indices in the whole set selected for subset
    rO   r^   r   Nc                 ó"   — || _         || _        d S r)   ©rO   r^   )r    rO   r^   s      r"   r<   zSubset.__init__‘  s   € ØˆŒØˆŒˆˆr$   c                 ó�   ‡ — t          |t          ¦  «        r‰ j        ˆ fd„|D ¦   «                  S ‰ j        ‰ j        |                  S )Nc                 ó*   •— g | ]}‰j         |         ‘ŒS r0   ©r^   )r8   Úir    s     €r"   rc   z&Subset.__getitem__.<locals>.<listcomp>—  s   ø€ Ð >Ð >Ð >°Q ¤¨a¤Ð >Ð >Ð >r$   )r[   rS   rO   r^   )r    ro   s   ` r"   r#   zSubset.__getitem__•  sL   ø€ Ý�c�4Ñ Ô ð 	@Ø”<Ð >Ð >Ð >Ð >¸#Ð >Ñ >Ô >Ô?Ð?ØŒ|˜DœL¨Ô-Ô.Ð.r$   c                 ó²   ‡ — t          t          ‰ j        dd ¦  «        ¦  «        r&‰ j                             ˆ fd„|D ¦   «         ¦  «        S ˆ fd„|D ¦   «         S )Nrd   c                 ó*   •— g | ]}‰j         |         ‘ŒS r0   rŸ   ©r8   ro   r    s     €r"   rc   z'Subset.__getitems__.<locals>.<listcomp>ž  s    ø€ Ð-SÐ-SÐ-SÀC¨d¬l¸3Ô.?Ð-SÐ-SÐ-Sr$   c                 ó@   •— g | ]}‰j         ‰j        |                  ‘ŒS r0   rœ   r£   s     €r"   rc   z'Subset.__getitems__.<locals>.<listcomp>   s'   ø€ ÐGÐGÐG¸�D”L ¤¨cÔ!2Ô3ÐGÐGÐGr$   )rh   ri   rO   rd   )r    r^   s   ` r"   rd   zSubset.__getitems__š  si   ø€ õ •G˜DœL¨.¸$Ñ?Ô?Ñ@Ô@ð 	HØ”<×,Ò,Ð-SÐ-SÐ-SÐ-SÈ7Ð-SÑ-SÔ-SÑTÔTÐTàGÐGÐGÐG¸wÐGÑGÔGÐGr$   c                 ó*   — t          | j        ¦  «        S r)   )rM   r^   rB   s    r"   rC   zSubset.__len__¢  s   € Ý�4”<Ñ Ô Ð r$   )r,   r-   r.   r/   r   r   rD   r   r�   r<   r#   rS   rd   rC   r0   r$   r"   r   r   …  sÁ   € € € € € € ðð ð �UŒ^ÐÐÑØ�cŒ]ÐÐÑð ¨¤ð ¸À#¼ð È4ð ð ð ð ð/ð /ð /ð
H D¨¤Ið H°$°u´+ð Hð Hð Hð Hð!ð !ð !ð !ð !r$   r   rO   ÚlengthsÚ	generatorr   c                 óØ  ‡ ‡
— t          j        t          |¦  «        d¦  «        �rt          |¦  «        dk    �rg }t          |¦  «        D ]j\  }}|dk     s|dk    rt	          d|› d�¦  «        ‚t          t          j        t          ‰ ¦  «        |z  ¦  «        ¦  «        }|                     |¦  «         Œkt          ‰ ¦  «        t          |¦  «        z
  }t          |¦  «        D ]$}|t          |¦  «        z  }||xx         dz  cc<   Œ%|}t          |¦  «        D ]#\  }}	|	dk    rt          j        d|› d�¦  «         Œ$t          |¦  «        t          ‰ ¦  «        k    rt	          d¦  «        ‚t          t          |¦  «        |¬¦  «                             ¦   «         Š
t          t          t
                   |¦  «        }ˆ ˆ
fd	„t!          t#          j        |¦  «        |¦  «        D ¦   «         S )
aæ  
    Randomly split a dataset into non-overlapping new datasets of given lengths.

    If a list of fractions that sum up to 1 is given,
    the lengths will be computed automatically as
    floor(frac * len(dataset)) for each fraction provided.

    After computing the lengths, if there are any remainders, 1 count will be
    distributed in round-robin fashion to the lengths
    until there are no remainders left.

    Optionally fix the generator for reproducible results, e.g.:

    Example:
        >>> # xdoctest: +SKIP
        >>> generator1 = torch.Generator().manual_seed(42)
        >>> generator2 = torch.Generator().manual_seed(42)
        >>> random_split(range(10), [3, 7], generator=generator1)
        >>> random_split(range(30), [0.3, 0.3, 0.4], generator=generator2)

    Args:
        dataset (Dataset): Dataset to be split
        lengths (sequence): lengths or fractions of splits to be produced
        generator (Generator): Generator used for the random permutation.
    r…   r   zFraction at index z is not between 0 and 1zLength of split at index z- is 0. This might result in an empty dataset.zDSum of input lengths does not equal the length of the input dataset!)r§   c                 óL   •— g | ] \  }}t          ‰‰||z
  |…         ¦  «        ‘Œ!S r0   )r   )r8   ÚoffsetÚlengthrO   r^   s      €€r"   rc   z random_split.<locals>.<listcomp>â  sE   ø€ ð ð ð áˆF�Fõ 	ˆw˜ ¨¡°&Ð 8Ô9Ñ:Ô:ðð ð r$   )ÚmathÚiscloseÚsumÚ	enumeraterQ   r�   ÚfloorrM   rk   ÚrangeÚwarningsÚwarnr   Útolistr   r   rj   Ú	itertoolsÚ
accumulate)rO   r¦   r§   Úsubset_lengthsr    ÚfracÚn_items_in_splitÚ	remainderÚidx_to_add_atr«   r^   s   `         @r"   r   r   ¦  s  øø€ õ< „|•C˜‘L”L !Ñ$Ô$ñ ­¨W©¬¸Ò):Ñ):Ø$&ˆÝ  Ñ)Ô)ð 	4ð 	4‰GˆAˆtØ�aŠxˆx˜4 !š8˜8Ý Ð!P°aÐ!PÐ!PÐ!PÑQÔQÐQÝ"Ý”
�3˜w™<œ<¨$Ñ.Ñ/Ô/ñ ô  Ðð ×!Ò!Ð"2Ñ3Ô3Ð3Ð3Ý˜‘L”L¥3 ~Ñ#6Ô#6Ñ6ˆ	å�yÑ!Ô!ð 	/ð 	/ˆAØ¥ NÑ 3Ô 3Ñ3ˆMØ˜=Ð)Ð)Ô)¨QÑ.Ð)Ð)Ñ)Ð)Ø ˆÝ" 7Ñ+Ô+ð 	ð 	‰IˆAˆvØ˜Š{ˆ{Ý”ð>°ð >ð >ð >ñô ð øõ ˆ7�|„|•s˜7‘|”|Ò#Ð#ÝØRñ
ô 
ð 	
õ •s˜7‘|”|¨yÐ9Ñ9Ô9×@Ò@ÑBÔB€GÝ•8�C”= 'Ñ*Ô*€Gðð ð ð ð å!¥)Ô"6°wÑ"?Ô"?ÀÑIÔIðñ ô ð r$   )(r†   rµ   r¬   r²   Úcollections.abcr   Útypingr   r   r   r   r   r	   Útyping_extensionsr
   Útorchr   r   r   r   Ú__all__r   r   r\   ÚstrÚ_T_dictr?   Ú_T_tupler   r   r   r   r   r   r   r   r�   ÚfloatrS   r   r0   r$   r"   ú<module>rÅ      sÞ  ðà €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $ð EÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ (Ð (Ð (Ð (Ð (Ð (ð AÐ @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @ð	ð 	ð 	€ð €WˆT�]„]€Øˆ� 4Ð(Ñ(Ô(€Ø
ˆs�EˆzÔ
€Ø�˜�Ô€Øˆ7�:˜x¨Ñ1Ô1€ð,ð ,ð ,ð ,ð ,ˆg�eŒnñ ,ô ,ð ,ðDn+ð n+ð n+ð n+ð n+�g˜e”n h¨u¤oñ n+ô n+ð n+ðh'ð 'ð 'ð 'ð '�G˜E &¨# +Ô.Ô/ñ 'ô 'ð 'ð0Tð Tð Tð Tð T�7˜8Ô$ñ Tô Tð Tðn6%ð 6%ð 6%ð 6%ð 6%�G˜E”Nñ 6%ô 6%ð 6%ðrð ð ð ð �?ñ ô ð ð@!ð !ð !ð !ð !ˆW�UŒ^ñ !ô !ð !ðH &7ð?ð ?Ø�RŒ[ð?à�e˜C ˜JÔ'Ô(ð?ð ˜	Ô"ð?ð 
ˆ&�Œ*Ôð	?ð ?ð ?ð ?ð ?ð ?r$   