Ë
    ùÿæiØQ  ã                   óØ  — 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%y) é    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y)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     úm/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torch/utils/data/dataset.pyÚ__getitem__zDataset.__getitem__:   s   € Ü!Ð"WÓXÐXó    c                 ó   — t        | |g«      S ©N)r   ©r   Úothers     r    Ú__add__zDataset.__add__A   s   € Ü˜d E˜]Ó+Ð+r"   N)r&   zDataset[_T_co]r   zConcatDataset[_T_co])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r'   © r"   r    r   r   '   s   „ ñð$Y Eó Yô,r"   r   c                   ó"   — e Zd ZdZdee   fd„Zy)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)
        ...

        >>> # 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'   r,   r"   r    r   r   I   s   „ ñjðX+˜W U™^ô +r"   r   c                   óH   — 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
y)	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                 óR   ‡— t        ˆfd„‰D «       «      rt        d«      ‚‰| _        y )Nc              3   ój   •K  — | ]*  }‰d    j                  d «      |j                  d «      k7  –— Œ, y­w)r   N)Úsize)Ú.0Útensorr0   s     €r    Ú	<genexpr>z)TensorDataset.__init__.<locals>.<genexpr>É   s,   øè ø€ ÐJÁ'¸ˆw�q‰z�‰˜qÓ! V§[¡[°£^Õ3Á'ùs   ƒ03zSize mismatch between tensors)ÚanyÚAssertionErrorr0   )r   r0   s    `r    Ú__init__zTensorDataset.__init__È   s$   ø€ ÜÓJÁ'ÓJÔJÜ Ð!@ÓAÐAØˆ�r"   c                 ó@   ‡— t        ˆfd„| j                  D «       «      S )Nc              3   ó(   •K  — | ]	  }|‰   –— Œ y ­wr$   r,   )r4   r5   r   s     €r    r6   z,TensorDataset.__getitem__.<locals>.<genexpr>Î   s   øè ø€ Ð>± v�V˜E•]±ùó   ƒ)Útupler0   r   s    `r    r!   zTensorDataset.__getitem__Í   s   ø€ ÜÓ>°·²Ó>Ó>Ð>r"   c                 ó>   — | j                   d   j                  d«      S ©Nr   )r0   r3   ©r   s    r    Ú__len__zTensorDataset.__len__Ð   s   € Ø�|‰|˜A‰×#Ñ# AÓ&Ð&r"   )r(   r)   r*   r+   r=   r   Ú__annotations__r9   r!   ÚintrA   r,   r"   r    r   r   ½   s<   … ñð �6˜3�;ÑÓð ð ¨Dó ò
?ð'˜ô 'r"   r   c                   ó`   — 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y)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                 óV  ‡ — |rG|rt        d«      ‚t        |d   «      ‰ _        t        ˆ fd„|D «       «      rt        d«      ‚|‰ _        y |rSt        |j                  «       «      }t        |d   «      ‰ _        t        ˆ fd„|D «       «      rt        d«      ‚|‰ _        y t        d«      ‚)NztSupported either ``tuple``- (via ``args``) or``dict``- (via ``kwargs``) like input/output, but both types are given.r   c              3   óN   •K  — | ]  }‰j                   t        |«      k7  –— Œ y ­wr$   ©Ú_lengthÚlen©r4   Údatasetr   s     €r    r6   z(StackDataset.__init__.<locals>.<genexpr>ñ   s   øè ø€ ÐD¹t°G�4—<‘<¤3 w£<Õ/¹tùó   ƒ"%zSize mismatch between datasetsc              3   óN   •K  — | ]  }‰j                   t        |«      k7  –— Œ y ­wr$   rJ   rM   s     €r    r6   z(StackDataset.__init__.<locals>.<genexpr>÷   s   øè ø€ ÐC¹s°G�4—<‘<¤3 w£<Õ/¹sùrO   z%At least one dataset should be passed)Ú
ValueErrorrL   rK   r7   rE   ÚlistÚvalues)r   rF   rG   Útmps   `   r    r9   zStackDataset.__init__é   s�   ø€ ÙÙÜ ð^óð ô ˜t A™w›<ˆDŒLÜÓD¹tÓDÔDÜ Ð!AÓBÐBØ ˆD�MÙÜ�v—}‘}“Ó'ˆCÜ˜s 1™v›;ˆDŒLÜÓC¹sÓCÔCÜ Ð!AÓBÐBØ"ˆD�MäÐDÓEÐEr"   c                 óâ   ‡— t        | j                  t        «      r1| j                  j                  «       D ��ci c]  \  }}||‰   “Œ c}}S t	        ˆfd„| j                  D «       «      S c c}}w )Nc              3   ó(   •K  — | ]	  }|‰   –— Œ y ­wr$   r,   )r4   rN   r   s     €r    r6   z+StackDataset.__getitem__.<locals>.<genexpr>   s   øè ø€ ÐA±=¨�W˜U•^±=ùr<   )Ú
isinstancerE   ÚdictÚitemsr=   )r   r   ÚkrN   s    `  r    r!   zStackDataset.__getitem__ý   s]   ø€ Ü�d—m‘m¤TÔ*Ø8<¿¹×8KÑ8KÔ8MÔNÑ8M©*¨!¨W�A�w˜u‘~Ñ%Ð8MÒNÐNÜÓA°4·=²=ÓAÓAÐAùó Os   ¹A+Úindicesc           	      óÊ  — t        | j                  t        «      rÎ|D �cg c]  }i ‘Œ }}| j                  j                  «       D ]   \  }}t	        t        |dd «      «      rg|j                  |«      }t        |«      t        |«      k7  r#t        dt        |«      › dt        |«      › �«      ‚t        ||d¬«      D ]
  \  }}|||<   Œ Œƒt        ||d¬«      D ]  \  }	}||	   ||<   Œ Œ¢ |S |D �cg c]  }g ‘Œ }
}| j                  D ]µ  }t	        t        |dd «      «      rs|j                  |«      }t        |«      t        |«      k7  r#t        dt        |«      › dt        |«      › �«      ‚t        ||
d¬«      D ]  \  }}|j                  |«       Œ ŒŒt        ||
d¬«      D ]  \  }	}|j                  ||	   «       Œ Œ· |
D �cg c]  }t        |«      ‘Œ }}|S c c}w c c}w c c}w )NÚ__getitems__z0Nested dataset's output size mismatch. Expected z, got T©Ústrict)rW   rE   rX   rY   ÚcallableÚgetattrr]   rL   rQ   ÚzipÚappendr=   )r   r[   Ú_Ú
dict_batchrZ   rN   rY   ÚdataÚd_sampleÚidxÚ
list_batchÚt_sampleÚsampleÚtuple_batchs                 r    r]   zStackDataset.__getitems__  sð  € ä�d—m‘m¤TÔ*Ù5<Ó(=±W°ª°WˆJÐ(=Ø"Ÿm™m×1Ñ1Ö3‘
��7ÜœG G¨^¸TÓBÔCØ#×0Ñ0°Ó9�EÜ˜5“z¤S¨£\Ò1Ü(ð)Ü),¨W«¨°f¼SÀ»Z¸LðJóð ô +.¨e°ZÈ×*M™˜˜hØ&*˜ šñ +Nô *-¨W°jÈ×)N™˜˜XØ&-¨c¡l˜ šñ *Oð 4ð Ðñ /6Ó!6©g¨¢"¨gˆ
Ð!6Ø—}”}ˆGÜœ ¨¸Ó>Ô?Ø×,Ñ,¨WÓ5�Ü�u“:¤ W£Ò-Ü$ð%Ü%(¨£\ N°&¼¸U»¸ðFóð ô '*¨%°ÀD×&I‘N�D˜(Ø—O‘O DÕ)ñ 'Jô &)¨°*ÀT×%J‘M�C˜Ø—O‘O G¨C¡LÕ1ñ &Kð %ñ DNÓ&NÁ:¸¤u¨V¥}À:ˆÐ&NØÐùòA )>ùò" "7ùò 'Os   Ÿ	GÃ-	GÇ G c                 ó   — | j                   S r$   )rK   r@   s    r    rA   zStackDataset.__len__'  s   € Ø�|‰|Ðr"   )r(   r)   r*   r+   r=   rX   rB   r   r   r9   r!   rR   r]   rC   rA   r,   r"   r    r   r   Ô   sX   … ñð$ �d‰lÓðF˜g e™nð F¸À¹ð FÈ4ó Fò(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
    rE   Úcumulative_sizesc                 ód   — g d}}| D ]&  }t        |«      }|j                  ||z   «       ||z  }Œ( |S r?   )rL   rc   )ÚsequenceÚrÚsÚeÚls        r    ÚcumsumzConcatDataset.cumsum7  s=   € à�1ˆ1ˆÛˆAÜ�A“ˆAØ�H‰H�Q˜‘UŒOØ�‰F‰Að ð ˆr"   r   Nc                 ó   •— t         ‰| �  «        t        |«      | _        t	        | j                  «      dk(  rt        d«      ‚| j                  D ]  }t        |t        «      sŒt        d«      ‚ | j                  | j                  «      | _	        y )Nr   z(datasets should not be an empty iterablez.ConcatDataset does not support IterableDataset)
Úsuperr9   rR   rE   rL   r8   rW   r   rv   ro   )r   rE   ÚdÚ	__class__s      €r    r9   zConcatDataset.__init__@  sq   ø€ Ü‰ÑÔÜ˜X›ˆŒÜˆt�}‰}Ó Ò"Ü Ð!KÓLÐLØ—”ˆAÜ˜!œ_Õ-Ü$Ð%UÓVÐVð ð !%§¡¨D¯M©MÓ :ˆÕr"   c                 ó    — | j                   d   S )Néÿÿÿÿ©ro   r@   s    r    rA   zConcatDataset.__len__J  s   € Ø×$Ñ$ RÑ(Ð(r"   c                 óú   — |dk  r(| t        | «      kD  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é   )rL   rQ   ÚbisectÚbisect_rightro   rE   )r   rh   Údataset_idxÚ
sample_idxs       r    r!   zConcatDataset.__getitem__M  sˆ   € Ø�Š7Øˆt”c˜$“iÒÜ ØNóð ô �d“)˜c‘/ˆCÜ×)Ñ)¨$×*?Ñ*?ÀÓEˆØ˜!ÒØ‰Jà˜t×4Ñ4°[À1±_ÑEÑEˆJØ�}‰}˜[Ñ)¨*Ñ5Ð5r"   z>`cummulative_sizes` attribute is renamed to `cumulative_sizes`)Úcategoryc                 ó   — | j                   S r$   r}   r@   s    r    Úcummulative_sizeszConcatDataset.cummulative_sizes[  s   € ð ×$Ñ$Ð$r"   )r(   r)   r*   r+   rR   r   r   rB   rC   Ústaticmethodrv   r   r9   rA   r!   Úpropertyr   ÚFutureWarningr†   Ú__classcell__©rz   s   @r    r   r   +  s…   ø… ñð �7˜5‘>Ñ"Ó"Ø˜3‘iÓàñó ðð; ¨'Ñ!2ð ;°tõ ;ð)˜ó )ò6ð ÙØHØôñ%ó	ó ô
%r"   r   c                   óD   ‡ — 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
    rE   r   Nc                 ó0   •— t         ‰| �  «        || _        y r$   )rx   r9   rE   )r   rE   rz   s     €r    r9   zChainDataset.__init__o  s   ø€ Ü‰ÑÔØ ˆ�r"   c              #   ó|   K  — | j                   D ]'  }t        |t        «      st        d«      ‚|E d {  –—†  Œ) y 7 Œ­w)Nú*ChainDataset only supports IterableDataset)rE   rW   r   r8   )r   ry   s     r    Ú__iter__zChainDataset.__iter__s  s6   è ø€ Ø—”ˆAÜ˜a¤Ô1Ü$Ð%QÓRÐRØ�L‰Lñ ð ús   ‚0<²:³<c                 ó~   — d}| j                   D ]+  }t        |t        «      st        d«      ‚|t	        |«      z  }Œ- |S )Nr   r�   )rE   rW   r   r8   rL   )r   Útotalry   s      r    rA   zChainDataset.__len__y  s?   € ØˆØ—”ˆAÜ˜a¤Ô1Ü$Ð%QÓRÐRØ”S˜“V‰O‰Eð ð ˆr"   )r(   r)   r*   r+   r   r   r9   r�   rC   rA   rŠ   r‹   s   @r    r   r   d  s1   ø„ ñð! ¨'Ñ!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y)
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
    rN   r[   r   Nc                 óø   — || _         || _        t        | «      j                  t        j                  urGt        | «      j
                  t        j
                  u r!t        t        | «      j                  › d�«      ‚y y )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])rN   r[   Útyper!   r   r]   r   r(   )r   rN   r[   s      r    r9   zSubset.__init__ž  su   € ØˆŒØˆŒô �‹J×"Ñ"¬&×*<Ñ*<Ñ<Ü�T“
×'Ñ'¬6×+>Ñ+>Ñ>ä%Ü˜“:×&Ñ&Ð'ð (Hð Hóð ð ?ð =r"   c                 ó¸   — t        |t        «      r*| j                  |D �cg c]  }| j                  |   ‘Œ c}   S | j                  | j                  |      S c c}w r$   )rW   rR   rN   r[   )r   rh   Úis      r    r!   zSubset.__getitem__°  sO   € Ü�cœ4Ô Ø—<‘<¹#Ó >¹#°Q §¡¨a£¸#Ñ >Ñ?Ð?Ø�|‰|˜DŸL™L¨Ñ-Ñ.Ð.ùò !?s    Ac                 ó  — t        t        | j                  dd «      «      r6| j                  j                  |D �cg c]  }| j                  |   ‘Œ c}«      S |D �cg c]  }| j                  | j                  |      ‘Œ  c}S c c}w c c}w )Nr]   )r`   ra   rN   r]   r[   )r   r[   rh   s      r    r]   zSubset.__getitems__µ  sv   € ô ”G˜DŸL™L¨.¸$Ó?Ô@Ø—<‘<×,Ñ,É7Ó-SÉ7ÀC¨d¯l©l¸3Ó.?È7Ñ-SÓTÐTá?FÓG¹w¸�D—L‘L §¡¨cÑ!2Ó3¸wÑGÐGùò .TùâGs   ºBÁ#Bc                 ó,   — t        | j                  «      S r$   )rL   r[   r@   s    r    rA   zSubset.__len__½  s   € Ü�4—<‘<Ó Ð r"   )r(   r)   r*   r+   r   r   rB   r   rC   r9   r!   rR   r]   rA   r,   r"   r    r   r   ‚  sn   … ñð0 �U‰^ÓØ�c‰]Óð ¨¡ð ¸À#¹ð È4ó ò$/ð
H D¨¡Ið H°$°u±+ó Hð!˜ô !r"   r   rN   ÚlengthsÚ	generatorr   c           
      óZ  — t        j                  t        |«      d«      ræt        |«      dk  rØg }t        |«      D ]P  \  }}|dk  s|dkD  rt	        d|› d�«      ‚t        j
                  t        | «      |z  «      }|j                  |«       ŒR t        | «      t        |«      z
  }t        |«      D ]  }|t        |«      z  }||xx   dz  cc<   Œ |}t        |«      D ]&  \  }}	|	dk(  sŒt        j                  d|› d�d¬«       Œ( t        |«      t        | «      k7  rt	        d	«      ‚t        t        |«      |¬
«      j                  «       }
t        t        t           |«      }t!        t#        j$                  |«      |d¬«      D ��	cg c]  \  }}	t'        | |
||	z
  | «      ‘Œ c}	}S c c}	}w )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›   Tr^   )ÚmathÚiscloseÚsumÚ	enumeraterQ   ÚfloorrL   rc   ÚrangeÚwarningsÚwarnr   Útolistr   r   rC   rb   Ú	itertoolsÚ
accumulater   )rN   rš   r›   Úsubset_lengthsr—   ÚfracÚn_items_in_splitÚ	remainderÚidx_to_add_atÚlengthr[   Úoffsets               r    r   r   Á  s¦  € ô< ‡|�|”C˜“L !Ô$¬¨W«¸Ò):Ø$&ˆÜ  Ö)‰GˆAˆtØ�aŠx˜4 !š8Ü Ð#5°a°SÐ8OÐ!PÓQÐQÜ#Ÿz™z¬#¨g«,¸Ñ*=Ó>ÐØ×!Ñ!Ð"2Õ3ð	 *ô
 ˜“L¤3 ~Ó#6Ñ6ˆ	ä�yÖ!ˆAØ¤ NÓ 3Ñ3ˆMØ˜=Ó)¨QÑ.Ô)ð "ð !ˆÜ" 7Ö+‰IˆAˆvØ˜‹{Ü—‘Ø/°¨sð 3=ð >à öð ,ô ˆ7ƒ|”s˜7“|Ò#ÜØRó
ð 	
ô ”s˜7“|¨yÔ9×@Ñ@ÓB€GÜ”8œC‘= 'Ó*€Gô "¤)×"6Ñ"6°wÓ"?ÀÐQUÕVôáV‰NˆF�Fô 	ˆw˜ ¨¡°&Ð9Õ:ØVòð ùó s   ÆF')&r€   r¨   rŸ   r¥   Úcollections.abcr   Útypingr   r   r   r   Útyping_extensionsr   Útorchr	   r
   r   r   Ú__all__r   r   rX   ÚstrÚ_T_dictr=   Ú_T_tupler   r   r   r   r   r   r   r   rC   ÚfloatrR   r   r,   r"   r    Ú<module>rº      s?  ðã Û Û Û Ý $÷ 4Ó 3Ý (÷ AÓ @ò	€ñ ˆTƒ]€Ù� 4Ô(€Ø
ˆs�EˆzÑ
€Ø�˜�Ñ€Ù�:˜x¨Ó1€ô,ˆg�e‰nô ,ôDn+�g˜e‘n h¨u¡oô n+ôh'�G˜E &¨# +Ñ.Ñ/ô 'ô.T�7˜8Ñ$ô Tôn6%�G˜E‘Nô 6%ôr�?ô ô<<!ˆW�U‰^ô <!ðD #4ñ>Ø�R‰[ð>à�c˜E‘kÑ"ð>ð ˜4Ñð>ð 
ˆ&�‰*Ñô	>r"   