
    3KibL                        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
  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\\"\#-     S\S-  S\$\!\      4S jjr%g)     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                   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     Z/var/www/html/dynamic-report/venv/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 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                     [        X/5      $ r&   )r   r'   s     r!   r)   IterableDataset.__add__   s    TM**r$   r+   N)	r,   r-   r.   r/   r0   r   r   r)   r1   r+   r$   r!   r   r   I   s    jX+WU^ +r$   r   c                   T    \ rS rSr% Sr\\S4   \S'   S\SS4S jrS r	S\
4S	 j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                 ^   ^ [        U4S jT 5       5      (       a  [        S5      eTU l        g )Nc              3   p   >#    U  H+  nTS    R                  S 5      UR                  S 5      :g  v   M-     g7f)r   N)size).0tensorr8   s     r!   	<genexpr>)TensorDataset.__init__.<locals>.<genexpr>   s+     J'wqzq!V[[^3's   36zSize mismatch between tensors)allAssertionErrorr8   )r   r8   s    `r!   __init__TensorDataset.__init__   s'    J'JJJ !@AA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]   )tupler8   r   s    `r!   r"   TensorDataset.__getitem__   s    >>>>r$   c                 >    U R                   S   R                  S5      $ Nr   )r8   r;   r   s    r!   __len__TensorDataset.__len__   s    ||A##A&&r$   )r8   )r,   r-   r.   r/   r0   rH   r   __annotations__rB   r"   intrM   r1   r+   r$   r!   r   r      s<     63; D 
?' 'r$   r   c                   n    \ rS rSr% Sr\\-  \S'   S\\	   S\\	   SS4S jr
S	 rS
\4S jrS\4S j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!   rB   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^=rG   )
isinstancerS   dictitemsrH   )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      (       ae  UR                  U5      n[        U5      [        U5      :w  a#  [        S[        U5       S[        U5       35      e[        XcSS9 H	  u  pxXxU'   M     M  [        XSS9 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      (       ar  UR                  U5      n[        U5      [        U5      :w  a#  [        S[        U5       S[        U5       35      e[        XjSS9 H  u  p{UR                  U5        M     M  [        XSS9 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 Tstrict)ri   rS   rj   rk   callablegetattrrp   rZ   r`   zipappendrH   )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*M&* +N *-W)N&-l *O 4  /6!6g"g
!6}}G>??,,W5u:W-$%%(\N&UF  '*%D&INDOOD) 'J &)T%JMCOOGL1 &K % DN&N:uV}:&NA )>" "7 'Os   G%4G*G/c                     U R                   $ r&   )rY   rL   s    r!   rM   StackDataset.__len__'  s    ||r$   )rY   rS   )r,   r-   r.   r/   r0   rH   rj   rO   r   r   rB   r"   rb   rp   rP   rM   r1   r+   r$   r!   r   r      sX    $ dl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\	4S	 j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$ rK   )rZ   rv   )sequencersels        r!   cumsumConcatDataset.cumsum7  s7    11AAAHHQUOFA  r$   r   Nc                 0  > [         TU ]  5         [        U5      U l        [	        U R                  5      S:X  a  [        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)
superrB   rb   rS   rZ   rA   ri   r   r   r   )r   rS   d	__class__s      r!   rB   ConcatDataset.__init__@  st    Xt}}" !KLLA!_--$%UVV  !%DMM :r$   c                      U R                   S   $ )Nr   rL   s    r!   rM   ConcatDataset.__len__J  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   r{   dataset_idx
sample_idxs       r!   r"   ConcatDataset.__getitem__M  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   rL   s    r!   cummulative_sizesConcatDataset.cummulative_sizes[  s     $$$r$   )r   rS   )r,   r-   r.   r/   r0   rb   r   r   rO   rP   staticmethodr   r   rB   rM   r"   propertyr   FutureWarningr   r1   __classcell__r   s   @r!   r   r   +  s     75>""3i ;'!2 ;t ;) )6 H%	 
%r$   r   c                   R   ^  \ rS rSrSrS\\   SS4U 4S jjrS rS\	4S jr
S	rU =r$ )
r   id  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   rB   rS   )r   rS   r   s     r!   rB   ChainDataset.__init__o  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   rA   )r   r   s     r!   __iter__ChainDataset.__iter__s  s8     Aa11$%QRRLL  s   5AA
Ac                     SnU R                    H1  n[        U[        5      (       d  [        S5      eU[	        U5      -  nM3     U$ )Nr   r   )rS   ri   r   rA   rZ   )r   totalr   s      r!   rM   ChainDataset.__len__y  sB    Aa11$%QRRSVOE  r$   )rS   )r,   r-   r.   r/   r0   r   r   rB   r   rP   rM   r1   r   r   s   @r!   r   r   d  s6    !'!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\	4S
 j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!   rB   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   r{   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   )rs   rt   r\   rp   rn   )r   rn   r{   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   rL   s    r!   rM   Subset.__len__  s    4<<  r$   r   )r,   r-   r.   r/   r0   r   r   rO   r   rP   rB   r"   rb   rp   rM   r1   r+   r$   r!   r   r     sn     U^c] # 4 /
HDI H$u+ H! !r$   r   r\   lengths	generatorr   c           
      l   [         R                  " [        U5      S5      (       a  [        U5      S::  a  / n[        U5       HS  u  pEUS:  d  US:  a  [	        SU S35      e[         R
                  " [        U 5      U-  5      nUR                  U5        MU     [        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SS9  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SS9 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.   )
stacklevelzDSum of input lengths does not equal the length of the input dataset!)r   Trq   )mathisclosesum	enumerater`   floorrZ   rv   rangewarningswarnr   tolistr   r   rP   ru   	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#zz#g,*=>!!"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"?QUVVNF 	w&9:V  s   F0)&r   r   r   r   collections.abcr   typingr   r   r   r   typing_extensionsr   torchr	   r
   r   r   __all__r   r   rj   str_T_dictrH   _T_tupler   r   r   r   r   r   r   r   rP   floatrb   r   r+   r$   r!   <module>r      s?       $ 4 3 ( A @	 T]4(
sEz
:x1,gen ,Dn+genhuo n+h'GE&#+./ '.T78$ Tn6%GEN 6%r? <!WU^ !H #4>R[>cEk"> 4> 
&*	>r$   