
    Vh_                         d dl Z d dlmZ d dlmZmZ d dlZd dlmZm	Z	 dgZ
 edd      Z G d	 dee         Z e	j                  d
e       y)    N)Iterator)OptionalTypeVar)IterDataPipeMapDataPipeShufflerIterDataPipe_T_coT)	covariantc                        e Zd ZU dZee   ed<   eed<   ee	   ed<   e
j                  ed<   dddee   dee   d	df fd
ZddZde	fdZd	ee   fdZddZd	e	fdZd Zd Z xZS )r   a  
    Shuffle the input MapDataPipe via its indices (functional name: ``shuffle``).

    When it is used with :class:`~torch.utils.data.DataLoader`, the methods to
    set up random seed are different based on :attr:`num_workers`.

    For single-process mode (:attr:`num_workers == 0`), the random seed is set before
    the :class:`~torch.utils.data.DataLoader` in the main process. For multi-process
    mode (:attr:`num_worker > 0`), ``worker_init_fn`` is used to set up a random seed
    for each worker process.

    Args:
        datapipe: MapDataPipe being shuffled
        indices: a list of indices of the MapDataPipe. If not provided, we assume it uses 0-based indexing

    Example:
        >>> # xdoctest: +SKIP
        >>> from torchdata.datapipes.map import SequenceWrapper
        >>> dp = SequenceWrapper(range(10))
        >>> shuffle_dp = dp.shuffle().set_seed(0)
        >>> list(shuffle_dp)
        [7, 8, 1, 5, 3, 4, 2, 0, 9, 6]
        >>> list(shuffle_dp)
        [6, 1, 9, 5, 2, 4, 7, 3, 8, 0]
        >>> # Reset seed for Shuffler
        >>> shuffle_dp = shuffle_dp.set_seed(0)
        >>> list(shuffle_dp)
        [7, 8, 1, 5, 3, 4, 2, 0, 9, 6]

    Note:
        Even thought this ``shuffle`` operation takes a ``MapDataPipe`` as the input, it would return an
        ``IterDataPipe`` rather than a ``MapDataPipe``, because ``MapDataPipe`` should be non-sensitive to
        the order of data order for the sake of random reads, but ``IterDataPipe`` depends on the order
        of data during data-processing.
    datapipe_enabled_seed_rngN)indicesr   returnc                    t         |           || _        |t        t	        t        |                  n|| _        d| _        d | _        t        j                         | _        | j                  | _        y )NT)super__init__r   listrangelenr   r   r   randomRandomr   _shuffled_indices)selfr   r   	__class__s      \/home/dcms/DCMS/lib/python3.12/site-packages/torch/utils/data/datapipes/map/combinatorics.pyr   zShufflerIterDataPipe.__init__;   sY     	 5<_tE#h-01'
MMO	'+||    c                     || _         | S N)r   )r   shuffles     r   set_shufflez ShufflerIterDataPipe.set_shuffleI   s    r   seedc                     || _         | S r    )r   )r   r#   s     r   set_seedzShufflerIterDataPipe.set_seedM   s    
r   c              #      K   | j                   s#| j                  D ]  }| j                  |     y | j                  r9| j                  j	                         }| j                  |    | j                  r8y y wr    )r   r   r   r   pop)r   idxs     r   __iter__zShufflerIterDataPipe.__iter__Q   sh     }}|| )mmC(() ((,,002mmC(( ((s   A3A86A8c                    | j                   r[| j                  Ot        t        j                  dt        j
                        j                         j                               | _        | j                  j                  | j                         d | _        | j                  j                  | j                  t        | j                              | _        y )N )dtype)r   r   inttorchemptyint64random_itemr   r#   sampler   r   r   r   s    r   resetzShufflerIterDataPipe.resetZ   s    ==TZZ/U[[5;;?GGINNPQDJ		tzz"
!%!1!1$,,DLL@Q!Rr   c                 ,    t        | j                        S r    )r   r   r4   s    r   __len__zShufflerIterDataPipe.__len__a   s    4==!!r   c                     | j                   | j                  | j                  | j                  | j                  j                         | j                  | j                  | j                  f}t        j                  t        j                  |      S |S r    )r   r   r   r   r   getstater   _valid_iterator_id_number_of_samples_yieldedr   getstate_hook)r   states     r   __getstate__z!ShufflerIterDataPipe.__getstate__d   st    MMLLMMJJII ""##++	
 %%1--e44r   c           	          |\  | _         | _        | _        | _        }| _        | _        | _        t        j                         | _	        | j                  j                  |       y r    )r   r   r   r   r   r:   r;   r   r   r   setstate)r   r=   	rng_states      r   __setstate__z!ShufflerIterDataPipe.__setstate__s   sT     		
MLMJ"#+MMO			9%r   )T)r   N)__name__
__module____qualname____doc__r   r	   __annotations__boolr   r-   r   r   r   r   r"   r%   r   r)   r5   r7   r>   rB   __classcell__)r   s   @r   r   r      s    "H %  NC=
-- #'	4e$4 $	4
 
4S )(5/ )S" "&r   r!   )r   collections.abcr   typingr   r   r.   #torch.utils.data.datapipes.datapiper   r   __all__r	   r   register_datapipe_as_functionr+   r   r   <module>rO      sU     $ $  I "
" 	4(n&<. n&b * ) ))5I Jr   