
    JThL                        S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	J
r
JrJr  S SKJr  S SKJrJrJrJr  / SQr\" S5      r\" SS	S
9r\\\4   r\\S4   r\" S\\5      r " S S\\   5      r " S S\\   \	\   5      r " S S\\\S4      5      r " S S\\   5      r  " S S\\   5      r! " S S\5      r" " S S\\   5      r#\4S\\   S\\\$\%4      S\
\   S\&\#\      4S jjr'g)     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                   0    \ rS rSrSrS\4S jrSS jrSrg)	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                     [        S5      e)Nz3Subclasses of Dataset should implement __getitem__.)NotImplementedErrorselfindexs     P/var/www/auris/envauris/lib/python3.13/site-packages/torch/utils/data/dataset.py__getitem__Dataset.__getitem__:   s    !"WXX    c                     [        X/5      $ N)r   r!   others     r#   __add__Dataset.__add__A   s    d]++r&    N)r*   zDataset[_T_co]r   zConcatDataset[_T_co])	__name__
__module____qualname____firstlineno____doc__r   r$   r+   __static_attributes__r-   r&   r#   r   r   '   s    $YE Y,r&   r   c                   ,    \ rS rSrSrS\\   4S jrSrg)r   I   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 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                     [        X/5      $ r(   )r   r)   s     r#   r+   IterableDataset.__add__   s    TM**r&   r-   N)	r.   r/   r0   r1   r2   r   r   r+   r3   r-   r&   r#   r   r   I   s    jX+WU^ +r&   r   c                   L    \ rS rSr% Sr\\S4   \S'   S\SS4S jrS r	S	 r
S
rg)r      zDataset 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                 V   ^ [        U4S jT 5       5      (       d   S5       eTU l        g )Nc              3   p   >#    U  H+  nTS    R                  S 5      UR                  S 5      :H  v   M-     g7f)r   N)size).0tensorr:   s     r#   	<genexpr>)TensorDataset.__init__.<locals>.<genexpr>   s.      
?FVGAJOOA&++a.0ws   36zSize mismatch between tensors)allr:   )r!   r:   s    `r#   __init__TensorDataset.__init__   s8     
?F
 
 
 	+*	+ 
 r&   c                 B   ^ [        U4S jU R                   5       5      $ )Nc              3   ,   >#    U  H	  oT   v   M     g 7fr(   r-   )r>   r?   r"   s     r#   r@   ,TensorDataset.__getitem__.<locals>.<genexpr>   s     >vE]   )tupler:   r    s    `r#   r$   TensorDataset.__getitem__   s    >>>>r&   c                 >    U R                   S   R                  S5      $ Nr   )r:   r=   r!   s    r#   __len__TensorDataset.__len__   s    ||A##A&&r&   )r:   )r.   r/   r0   r1   r2   rI   r   __annotations__rC   r$   rN   r3   r-   r&   r#   r   r      s5     63; D ?'r&   r   c                   j    \ rS rSr% Sr\\\4   \S'   S\	\
   S\	\
   SS4S jrS	 rS
\4S jrS rSrg)r      aM  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                   ^  U(       aR  U(       a  [        S5      e[        US   5      T l        [        U 4S jU 5       5      (       a  [        S5      eUT l        g U(       aY  [        UR                  5       5      n[        US   5      T l        [        U 4S jU 5       5      (       a  [        S5      eUT l        g [        S5      e)NztSupported either ``tuple``- (via ``args``) or``dict``- (via ``kwargs``) like input/output, but both types are given.r   c              3   T   >#    U  H  nTR                   [        U5      :g  v   M     g 7fr(   _lengthlenr>   datasetr!   s     r#   r@   (StackDataset.__init__.<locals>.<genexpr>   s     DtG4<<3w</t   %(zSize mismatch between datasetsc              3   T   >#    U  H  nTR                   [        U5      :g  v   M     g 7fr(   rX   r[   s     r#   r@   r]      s     CsG4<<3w</sr^   z%At least one dataset should be passed)
ValueErrorrZ   rY   anyrS   listvalues)r!   rT   rU   tmps   `   r#   rC   StackDataset.__init__   s     ^  tAw<DLDtDDD !ABB DMv}}'Cs1v;DLCsCCC !ABB"DMDEEr&   c                    ^ [        U R                  [        5      (       a2  U R                  R                  5        VVs0 s H
  u  p#X#T   _M     snn$ [	        U4S jU R                   5       5      $ s  snnf )Nc              3   ,   >#    U  H	  oT   v   M     g 7fr(   r-   )r>   r\   r"   s     r#   r@   +StackDataset.__getitem__.<locals>.<genexpr>  s     A=U^=rH   )
isinstancerS   dictitemsrI   )r!   r"   kr\   s    `  r#   r$   StackDataset.__getitem__   s\    dmmT**8<8K8K8MN8M*!Au~%8MNNA4==AAA Os   A2indicesc           	         [        U R                  [        5      (       a  U Vs/ s H  n0 PM     nnU R                  R                  5        H  u  pE[	        [        USS 5      5      (       af  UR                  U5      n[        U5      [        U5      :w  a#  [        S[        U5       S[        U5       35      e[        Xc5       H	  u  pxXxU'   M     M  [        X5       H  u  pXY   X'   M     M     U$ U Vs/ s H  n/ PM     n
nU R                   H  n[	        [        USS 5      5      (       as  UR                  U5      n[        U5      [        U5      :w  a#  [        S[        U5       S[        U5       35      e[        Xj5       H  u  p{UR                  U5        M     M  [        X5       H  u  pUR                  XY   5        M     M     U
 Vs/ s H  n[        U5      PM     nnU$ s  snf s  snf s  snf )N__getitems__z0Nested dataset's output size mismatch. Expected z, got )ri   rS   rj   rk   callablegetattrrp   rZ   r`   zipappendrI   )r!   rn   _
dict_batchrl   r\   rk   datad_sampleidx
list_batcht_samplesampletuple_batchs                 r#   rp   StackDataset.__getitems__  s   dmmT**5<(=WWJ(="mm113
GG^TBCC#009E5zS\1()),WfSZLJ  +.e*@&* +A *-W)A&-l *B 4  /6!6g"g
!6}}G>??,,W5u:W-$%%(\N&UF  '*%&<NDOOD) '= &)%=MCOOGL1 &> % DN&N:uV}:&NA )>" "7 'Os   G)6G.G3c                     U R                   $ r(   )rY   rM   s    r#   rN   StackDataset.__len__(  s    ||r&   )rY   rS   )r.   r/   r0   r1   r2   r	   rI   rj   rP   r   r   rC   r$   rb   rp   rN   r3   r-   r&   r#   r   r      sV    $ E4K  Fgen F F4 F(B
#D #Jr&   r   c                      ^  \ rS rSr% Sr\\\      \S'   \\	   \S'   \
S 5       rS\\   SS4U 4S jjrS	 rS
 r\\" S\S9S 5       5       rSrU =r$ )r   i,  zDataset as a concatenation of multiple datasets.

This class is useful to assemble different existing datasets.

Args:
    datasets (sequence): List of datasets to be concatenated
rS   cumulative_sizesc                 b    / Sp!U  H%  n[        U5      nUR                  XB-   5        X$-  nM'     U$ rL   )rZ   rt   )sequencersels        r#   cumsumConcatDataset.cumsum8  s7    11AAAHHQUOFA  r&   r   Nc                    > [         TU ]  5         [        U5      U l        [	        U R                  5      S:  d   S5       eU R                   H  n[        U[        5      (       d  M   S5       e   U R                  U R                  5      U l        g )Nr   z(datasets should not be an empty iterablez.ConcatDataset does not support IterableDataset)	superrC   rb   rS   rZ   ri   r   r   r   )r!   rS   d	__class__s      r#   rC   ConcatDataset.__init__A  s    X4==!A%Q'QQ%A!?  @?@   !%DMM :r&   c                      U R                   S   $ )Nr   rM   s    r#   rN   ConcatDataset.__len__K  s    $$R((r&   c                     US:  a)  U* [        U 5      :  a  [        S5      e[        U 5      U-   n[        R                  " U R                  U5      nUS:X  a  UnOXR                  US-
     -
  nU R
                  U   U   $ )Nr   z8absolute value of index should not exceed dataset length   )rZ   r`   bisectbisect_rightr   rS   )r!   ry   dataset_idx
sample_idxs       r#   r$   ConcatDataset.__getitem__N  s    7tc$i N  d)c/C))$*?*?E!J44[1_EEJ}}[)*55r&   z>`cummulative_sizes` attribute is renamed to `cumulative_sizes`)categoryc                     U R                   $ r(   r   rM   s    r#   cummulative_sizesConcatDataset.cummulative_sizes\  s     $$$r&   )r   rS   )r.   r/   r0   r1   r2   rb   r   r   rP   intstaticmethodr   r   rC   rN   r$   propertyr
   FutureWarningr   r3   __classcell__r   s   @r#   r   r   ,  s~     75>""3i ;'!2 ;t ;)6 H%	 
%r&   r   c                   J   ^  \ rS rSrSrS\\   SS4U 4S jjrS rS r	S	r
U =r$ )
r   ie  aG  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
rS   r   Nc                 .   > [         TU ]  5         Xl        g r(   )r   rC   rS   )r!   rS   r   s     r#   rC   ChainDataset.__init__p  s     r&   c              #      #    U R                    H)  n[        U[        5      (       d   S5       eU S h  vN   M+     g  N	7f)N*ChainDataset only supports IterableDataset)rS   ri   r   )r!   r   s     r#   __iter__ChainDataset.__iter__t  sE     A?  <;<  LL	  s   1?=
?c                     SnU R                    H-  n[        U[        5      (       d   S5       eU[        U5      -  nM/     U$ )Nr   r   )rS   ri   r   rZ   )r!   totalr   s      r#   rN   ChainDataset.__len__{  sO    A?  <;<  SVOE	 
 r&   )rS   )r.   r/   r0   r1   r2   r   r   rC   r   rN   r3   r   r   s   @r#   r   r   e  s/    !'!2 !t ! r&   r   c                       \ rS rSr% Sr\\   \S'   \\	   \S'   S\\   S\\	   SS4S jr
S rS\\	   S\\   4S	 jrS
 rSrg)r   i  z
Subset of a dataset at specified indices.

Args:
    dataset (Dataset): The whole Dataset
    indices (sequence): Indices in the whole set selected for subset
r\   rn   r   Nc                     Xl         X l        g r(   r\   rn   )r!   r\   rn   s      r#   rC   Subset.__init__  s    r&   c                     [        U[        5      (       a,  U R                  U Vs/ s H  o R                  U   PM     sn   $ U R                  U R                  U      $ s  snf r(   )ri   rb   r\   rn   )r!   ry   is      r#   r$   Subset.__getitem__  sP    c4  <<# >#Qa# >??||DLL-.. !?s   Ac                 (   [        [        U R                  SS 5      5      (       a8  U R                  R                  U Vs/ s H  o R                  U   PM     sn5      $ U Vs/ s H  o R                  U R                  U      PM      sn$ s  snf s  snf )Nrp   )rq   rr   r\   rp   rn   )r!   rn   ry   s      r#   rp   Subset.__getitems__  su     GDLL.$?@@<<,,7-S7Cll3.?7-STT?FGwLLc!23wGG .TGs   B
"%Bc                 ,    [        U R                  5      $ r(   )rZ   rn   rM   s    r#   rN   Subset.__len__  s    4<<  r&   r   )r.   r/   r0   r1   r2   r   r   rP   r   r   rC   r$   rb   rp   rN   r3   r-   r&   r#   r   r     sg     U^c] # 4 /
HDI H$u+ H!r&   r   r\   lengths	generatorr   c           
         [         R                  " [        U5      S5      (       a  [        U5      S::  a  / n[        U5       H\  u  pEUS:  d  US:  a  [	        SU S35      e[        [         R                  " [        U 5      U-  5      5      nUR                  U5        M^     [        U 5      [        U5      -
  n[        U5       H  nU[        U5      -  nX8==   S-  ss'   M     Un[        U5       H'  u  pIU	S:X  d  M  [        R                  " SU S35        M)     [        U5      [        U 5      :w  a  [	        S5      e[        [        U5      US9R                  5       n
[        [        [
           U5      n[!        ["        R$                  " U5      U5       VV	s/ s H  u  p['        X
X-
  U 5      PM     sn	n$ s  sn	nf )	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   )mathisclosesum	enumerater`   r   floorrZ   rt   rangewarningswarnr   tolistr   r   rs   	itertools
accumulater   )r\   r   r   subset_lengthsr   fracn_items_in_split	remainderidx_to_add_atlengthrn   offsets               r#   r   r     s   < ||CL!$$W):$& )GAax4!8 #5aS8O!PQQ"

3w<$./  !!"23 * L3~#66	y!AN 33M)Q.) " !"7+IA{/s 3= > , 7|s7|#R
 	
 s7|y9@@BG8C='*G ")"6"6w"?IINF 	w&9:I  s   F;)(r   r   r   r   collections.abcr   typingr   r   r   r   r   r	   typing_extensionsr
   torchr   r   r   r   __all__r   r   rj   str_T_dictrI   _T_tupler   r   r   r   r   r   r   r   r   floatrb   r   r-   r&   r#   <module>r      sF       $ E D ( A @	 T]4(
sEz
:x1,gen ,Dn+genhuo n+h'GE&#+./ '0T78$ Tn6%GEN 6%r? @!WU^ !H &7?R[?eCJ'(? 	"? 
&*	?r&   