§
    �ŠtjÙQ  ã                   ój  — 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
 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#z           dedz  de$e!e                  fd„Z%dS ) é    N)ÚSequence)ÚcastÚGenericÚIterableÚTypeVar)Ú
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     úV/var/www/html/CA-Chatbot/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   a@  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 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 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)
        ...

        >>> # Multi-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)   r.   r"   r    r   r   I   s@   € € € € € ðjð jðX+˜W Uœ^ð +ð +ð +ð +ð +ð +r"   r   c                   óP   — e Zd ZU dZeedf         ed<   deddfd„Zd„ Zde	f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                 ój   ‡— t          ˆfd„‰D ¦   «         ¦  «        rt          d¦  «        ‚‰| _        d S )Nc              3   ó|   •K  — | ]6}‰d                                d ¦  «        |                      d ¦  «        k    V — Œ7dS )r   N)Úsize)Ú.0Útensorr2   s     €r    ú	<genexpr>z)TensorDataset.__init__.<locals>.<genexpr>É   sB   øè è € ÐJÐJ¸ˆw�qŒz�Š˜qÑ!Ô! V§[¢[°¡^¤^Ò3ÐJÐJÐJÐJÐJÐJr"   zSize mismatch between tensors)ÚanyÚAssertionErrorr2   )r   r2   s    `r    Ú__init__zTensorDataset.__init__È   sC   ø€ ÝÐJÐJÐJÐJÀ'ÐJÑJÔJÑJÔJð 	BÝ Ð!@ÑAÔAÐAØˆŒˆˆr"   c                 óD   ‡— t          ˆfd„| j        D ¦   «         ¦  «        S )Nc              3   ó(   •K  — | ]}|‰         V — Œd S r'   r.   )r6   r7   r   s     €r    r8   z,TensorDataset.__getitem__.<locals>.<genexpr>Î   s'   øè è € Ð>Ð> v�V˜E”]Ð>Ð>Ð>Ð>Ð>Ð>r"   )Útupler2   r   s    `r    r!   zTensorDataset.__getitem__Í   s(   ø€ ÝÐ>Ð>Ð>Ð>°´Ð>Ñ>Ô>Ñ>Ô>Ð>r"   c                 óB   — | j         d                              d¦  «        S ©Nr   )r2   r5   ©r   s    r    Ú__len__zTensorDataset.__len__Ð   s   € ØŒ|˜AŒ×#Ò# AÑ&Ô&Ð&r"   )r*   r+   r,   r-   r>   r   Ú__annotations__r;   r!   ÚintrB   r.   r"   r    r   r   ½   sƒ   € € € € € € ðð ð �6˜3�;ÔÐÐÑð ð ¨Dð ð ð ð ð
?ð ?ð ?ð'˜ð 'ð 'ð 'ð 'ð 'ð 'r"   r   c                   ón   — e Zd ZU dZeez  ed<   dee         dee         ddfd„Z	d„ Z
d	efd
„Zdef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©r6   Údatasetr   s     €r    r8   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    r8   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   r9   rF   Ú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 r.   r.   )r6   Ú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'   r.   )r6   rO   r   s     €r    r8   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¬¦  «        D ]
\  }}|||<   ŒŒ¥t          ||d¬¦  «        D ]\  }}||         ||<   ŒŒÉ|S d„ |D ¦   «         }	| j        D ]å}t	          t          |dd ¦  «        ¦  «        r’|                     |¦  «        }t          |¦  «        t          |¦  «        k    r/t          dt          |¦  «        › dt          |¦  «        › �¦  «        ‚t          ||	d¬¦  «        D ]\  }}
|
 
                    |¦  «         ŒŒ²t          ||	d¬¦  «        D ] \  }}
|
 
                    ||         ¦  «         Œ!Œæd„ |	D ¦   «         }|S )	Nc                 ó   — g | ]}i ‘ŒS r.   r.   ©r6   Ú_s     r    ú
<listcomp>z-StackDataset.__getitems__.<locals>.<listcomp>  s   € Ð(=Ð(=Ð(=°¨Ð(=Ð(=Ð(=r"   Ú__getitems__z0Nested dataset's output size mismatch. Expected z, got T©Ústrictc                 ó   — g | ]}g ‘ŒS r.   r.   r`   s     r    rb   z-StackDataset.__getitems__.<locals>.<listcomp>  s   € Ð!6Ð!6Ð!6¨ "Ð!6Ð!6Ð!6r"   c                 ó,   — g | ]}t          |¦  «        ‘ŒS r.   )r>   )r6   Úsamples     r    rb   z-StackDataset.__getitems__.<locals>.<listcomp>$  s   € Ð&NÐ&NÐ&N¸¥u¨V¡}¤}Ð&NÐ&NÐ&Nr"   )rZ   rF   r[   r\   ÚcallableÚgetattrrc   rM   rQ   ÚzipÚappend)r   r]   Ú
dict_batchrW   rO   r\   ÚdataÚd_sampleÚidxÚ
list_batchÚt_sampleÚtuple_batchs               r    rc   zStackDataset.__getitems__  s‹  € å�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ÈÐ*MÑ*MÔ*Mð +ð +™˜˜hØ&*˜ ™˜ð+õ *-¨W°jÈÐ)NÑ)NÔ)Nð 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ñô ð õ '*¨%°ÀDÐ&IÑ&IÔ&Ið *ð *‘N�D˜(Ø—O’O DÑ)Ô)Ð)Ð)ð*õ &)¨°*ÀTÐ%JÑ%JÔ%Jð 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   rA   s    r    rB   zStackDataset.__len__'  s
   € ØŒ|Ðr"   )r*   r+   r,   r-   r>   r[   rC   r   r   r;   r!   rR   rc   rD   rB   r.   r"   r    r   r   Ô   s³   € € € € € € ðð ð$ �d‰lÐÐÑð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ef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 r@   )rM   rl   )ÚsequenceÚrÚsÚeÚls        r    ÚcumsumzConcatDataset.cumsum7  sH   € à�1ˆ1ˆØð 	ð 	ˆAÝ�A‘”ˆAØ�HŠH�Q˜‘U‰OŒOˆOØ�‰FˆAˆAØˆr"   r   Nc                 óX  •— t          ¦   «                              ¦   «          t          |¦  «        | _        t	          | j        ¦  «        dk    rt          d¦  «        ‚| j        D ]&}t          |t          ¦  «        rt          d¦  «        ‚Œ'|                      | j        ¦  «        | _	        d S )Nr   z(datasets should not be an empty iterablez.ConcatDataset does not support IterableDataset)
Úsuperr;   rR   rF   rM   r:   rZ   r   r}   rv   )r   rF   ÚdÚ	__class__s      €r    r;   zConcatDataset.__init__@  s¡   ø€ Ý‰Œ×ÒÑÔÐÝ˜X™œˆŒÝˆtŒ}ÑÔ Ò"Ð"Ý Ð!KÑLÔLÐLØ”ð 	Wð 	WˆAÝ˜!�_Ñ-Ô-ð WÝ$Ð%UÑVÔVÐVðWà $§¢¨D¬MÑ :Ô :ˆÔÐÐr"   c                 ó   — | j         d         S )Néÿÿÿÿ©rv   rA   s    r    rB   zConcatDataset.__len__J  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_rightrv   rF   )r   rp   Údataset_idxÚ
sample_idxs       r    r!   zConcatDataset.__getitem__M  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„   rA   s    r    Úcummulative_sizeszConcatDataset.cummulative_sizes[  s   € ð Ô$Ð$r"   )r*   r+   r,   r-   rR   r   r   rC   rD   Ústaticmethodr}   r   r;   rB   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                   óJ   ‡ — e Zd ZdZdee         ddfˆ fd„Zd„ Zdef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__o  s$   ø€ Ý‰Œ×ÒÑÔÐØ ˆŒˆˆr"   c              #   óv   K  — | j         D ].}t          |t          ¦  «        st          d¦  «        ‚|E d {V —† Œ/d S )Nú*ChainDataset only supports IterableDataset)rF   rZ   r   r:   )r   r€   s     r    Ú__iter__zChainDataset.__iter__s  sV   è è € Ø”ð 	ð 	ˆAÝ˜a¥Ñ1Ô1ð SÝ$Ð%QÑRÔRÐRØˆLˆLˆLˆLˆLˆLˆLˆLð	ð 	r"   c                 óŠ   — d}| j         D ]8}t          |t          ¦  «        st          d¦  «        ‚|t	          |¦  «        z  }Œ9|S )Nr   r–   )rF   rZ   r   r:   rM   )r   Útotalr€   s      r    rB   zChainDataset.__len__y  sP   € ØˆØ”ð 	ð 	ˆAÝ˜a¥Ñ1Ô1ð SÝ$Ð%QÑRÔRÐRØ•S˜‘V”V‰OˆEˆEØˆr"   )r*   r+   r,   r-   r   r   r;   r—   rD   rB   r‘   r’   s   @r    r   r   d  s„   ø€ € € € € ðð ð! ¨'Ô!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efd	„ZdS )
r   a^  
    Subset of a dataset at specified indices.

    .. note::
        When subclassing `Subset` and overriding `__getitem__`, you **must** also
        override `__getitems__` to ensure `DataLoader` works correctly with your
        custom logic. If you override only `__getitem__`, a `NotImplementedError`
        will be raised when using `DataLoader`.

        A simple implementation of `__getitems__` can delegate to `__getitem__`:

        .. code-block:: python

            def __getitems__(self, indices):
                return [self.__getitem__(idx) for idx in indices]

        For better performance, consider implementing batch-aware logic in
        `__getitems__` instead of calling `__getitem__` multiple times.

    Args:
        dataset (Dataset): The whole Dataset
        indices (sequence): Indices in the whole set selected for subset
    rO   r]   r   Nc                 óî   — || _         || _        t          | ¦  «        j        t          j        urDt          | ¦  «        j        t          j        u r&t          t          | ¦  «        j        › d�¦  «        ‚d S d S )Na2   overrides __getitem__ but not __getitems__. When subclassing Subset and overriding __getitem__, you must also override __getitems__ to ensure DataLoader works correctly with your custom logic. A simple implementation:

def __getitems__(self, indices):
    return [self.__getitem__(idx) for idx in indices])rO   r]   Útyper!   r   rc   r   r*   )r   rO   r]   s      r    r;   zSubset.__init__ž  s~   € ØˆŒØˆŒõ �‰JŒJÔ"­&Ô*<Ð<Ð<Ý�T‘
”
Ô'­6Ô+>Ð>Ð>å%Ý˜‘:”:Ô&ð Hð Hð Hñô ð ð =Ð<Ø>Ð>r"   c                 ó�   ‡ — t          |t          ¦  «        r‰ j        ˆ fd„|D ¦   «                  S ‰ j        ‰ j        |                  S )Nc                 ó*   •— g | ]}‰j         |         ‘ŒS r.   ©r]   )r6   Úir   s     €r    rb   z&Subset.__getitem__.<locals>.<listcomp>²  s   ø€ Ð >Ð >Ð >°Q ¤¨a¤Ð >Ð >Ð >r"   )rZ   rR   rO   r]   )r   rp   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 )Nrc   c                 ó*   •— g | ]}‰j         |         ‘ŒS r.   rŸ   ©r6   rp   r   s     €r    rb   z'Subset.__getitems__.<locals>.<listcomp>¹  s    ø€ Ð-SÐ-SÐ-SÀC¨d¬l¸3Ô.?Ð-SÐ-SÐ-Sr"   c                 ó@   •— g | ]}‰j         ‰j        |                  ‘ŒS r.   )rO   r]   r£   s     €r    rb   z'Subset.__getitems__.<locals>.<listcomp>»  s'   ø€ ÐGÐGÐG¸�D”L ¤¨cÔ!2Ô3ÐGÐGÐGr"   )ri   rj   rO   rc   )r   r]   s   ` r    rc   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]   rA   s    r    rB   zSubset.__len__½  s   € Ý�4”<Ñ Ô Ð r"   )r*   r+   r,   r-   r   r   rC   r   rD   r;   r!   rR   rc   rB   r.   r"   r    r   r   ‚  sÍ   € € € € € € ðð ð0 �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 ]]\  }}|dk     s|dk    rt	          d|› d�¦  «        ‚t          j        t          ‰ ¦  «        |z  ¦  «        }|                     |¦  «         Œ^t          ‰ ¦  «        t          |¦  «        z
  }t          |¦  «        D ]$}|t          |¦  «        z  }||xx         dz  cc<   Œ%|}t          |¦  «        D ]%\  }}	|	dk    rt          j
        d|› d�d¬¦  «         Œ&t          |¦  «        t          ‰ ¦  «        k    rt	          d	¦  «        ‚t          t          |¦  «        |¬
¦  «                             ¦   «         Š
t          t          t                   |¦  «        }ˆ ˆ
fd„t!          t#          j        |¦  «        |d¬¦  «        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.é   )Ú
stacklevelzDSum of input lengths does not equal the length of the input dataset!)r§   c                 óL   •— g | ] \  }}t          ‰‰||z
  |…         ¦  «        ‘Œ!S r.   )r   )r6   ÚoffsetÚlengthrO   r]   s      €€r    rb   z random_split.<locals>.<listcomp>ü  sE   ø€ ð ð ð áˆF�Fõ 	ˆw˜ ¨¡°&Ð 8Ô9Ñ:Ô:ðð ð r"   Trd   )ÚmathÚiscloseÚsumÚ	enumeraterQ   ÚfloorrM   rl   ÚrangeÚwarningsÚwarnr   Útolistr   r   rD   rk   Ú	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Ý#œz­#¨g©,¬,¸Ñ*=Ñ>Ô>ÐØ×!Ò!Ð"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Ñ"?Ô"?ÀÐQUÐVÑVÔVðñ ô ð r"   )&r‡   r·   r®   r´   Úcollections.abcr   Útypingr   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   rD   ÚfloatrR   r   r.   r"   r    ú<module>rÇ      sË  ðà €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $ð 4Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø (Ð (Ð (Ð (Ð (Ð (ð 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 &¨# +Ô.Ô/ñ 'ô 'ð 'ð.Tð Tð Tð Tð T�7˜8Ô$ñ Tô Tð Tðn6%ð 6%ð 6%ð 6%ð 6%�G˜E”Nñ 6%ô 6%ð 6%ðrð ð ð ð �?ñ ô ð ð<<!ð <!ð <!ð <!ð <!ˆW�UŒ^ñ <!ô <!ð <!ðD #4ð>ð >Ø�RŒ[ð>à�c˜E‘kÔ"ð>ð ˜4Ñð>ð 
ˆ&�Œ*Ôð	>ð >ð >ð >ð >ð >r"   