U
    <cH                     @   sn   d dl Z d dlZd dlmZmZ d dlmZmZmZm	Z	 dgZ
e	dddZG dd dee Zed	e dS )
    N)IterDataPipeMapDataPipe)IteratorListOptionalTypeVarShufflerIterDataPipeT_coT)	covariantc                       s   e Zd ZU dZee ed< eed< ee	 ed< e
jed< ddee ee dd fd	d
ZdddZe	dddZee dddZddddZe	dddZdd Zdd Z  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)indices)r   r   returnc                   sP   t    || _|d kr(ttt|n|| _d| _d | _t	
 | _| j| _d S )NT)super__init__r   listrangelenr   r   r   randomRandomr   _shuffled_indices)selfr   r   	__class__ P/tmp/pip-unpacked-wheel-gikjz4vx/torch/utils/data/datapipes/map/combinatorics.pyr   7   s    

zShufflerIterDataPipe.__init__Tc                 C   s
   || _ | S N)r   )r   shuffler   r   r   set_shuffleD   s    z ShufflerIterDataPipe.set_shuffle)seedc                 C   s
   || _ | S r   )r   )r   r!   r   r   r   set_seedH   s    zShufflerIterDataPipe.set_seed)r   c                 c   sB   | j s | jD ]}| j| V  qn| jr>| j }| j| V  q d S r   )r   r   r   r   pop)r   idxr   r   r   __iter__L   s    

zShufflerIterDataPipe.__iter__c                 C   s^   | j r.| jd kr.ttjdtjd  | _| j	| j d | _| j
| jt| j| _d S )Nr   )Zdtype)r   r   inttorchemptyZint64Zrandom_itemr   r!   sampler   r   r   r   r   r   r   resetU   s
    zShufflerIterDataPipe.resetc                 C   s
   t | jS r   )r   r   r+   r   r   r   __len__\   s    zShufflerIterDataPipe.__len__c                 C   s@   | j | j| j| j| j | j| j| jf}t	j
d k	r<t	
|S |S r   )r   r   r   r   r   getstater   _valid_iterator_id_number_of_samples_yieldedr   Zgetstate_hook)r   stater   r   r   __getstate___   s    


z!ShufflerIterDataPipe.__getstate__c              	   C   s<   |\| _ | _| _| _}| _| _| _t | _	| j	
| d S r   )r   r   r   r   r   r/   r0   r   r   r   setstate)r   r1   Z	rng_stater   r   r   __setstate__n   s    

z!ShufflerIterDataPipe.__setstate__)T)__name__
__module____qualname____doc__r   r	   __annotations__boolr   r&   r   r   r   r   r    r"   r   r%   r,   r-   r2   r4   __classcell__r   r   r   r   r      s$   
#

	r   )r   r'   Z#torch.utils.data.datapipes.datapiper   r   typingr   r   r   r   __all__r	   r   Zregister_datapipe_as_functionr   r   r   r   <module>   s   o