U
    <c                     @   s   d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZ ddgZedd	d
ZG dd dee ZedG dd dee ZdS )    N)SamplerSequentialSampler)functional_datapipe)IterDataPipe)DictIteratorListOptionalSizedTupleTypeTypeVarSamplerIterDataPipeShufflerIterDataPipeT_coT)	covariantc                       st   e Zd ZU dZeed< eed< eddfeee e	e
 e	e dd fddZee dd	d
ZedddZ  ZS )r   a8  
    Generates sample elements using the provided ``Sampler`` (defaults to :class:`SequentialSampler`).

    Args:
        datapipe: IterDataPipe to sample from
        sampler: Sampler class to generate sample elements from input DataPipe.
            Default is :class:`SequentialSampler` for IterDataPipe
    datapipesamplerN)r   r   sampler_argssampler_kwargsreturnc                    sd   t |tstdt   || _|d kr.dn|| _|d kr@i n|| _|| jd| ji| j| _d S )Nz;Sampler class requires input datapipe implemented `__len__` Zdata_source)	
isinstancer
   AssertionErrorsuper__init__r   r   r   r   )selfr   r   r   r   	__class__r   Q/tmp/pip-unpacked-wheel-gikjz4vx/torch/utils/data/datapipes/iter/combinatorics.pyr      s    
zSamplerIterDataPipe.__init__r   c                 C   s
   t | jS N)iterr   r   r   r   r   __iter__,   s    zSamplerIterDataPipe.__iter__c                 C   s<   t | jtr$t| jdkr$t| jS tdt| jd S )Nr   %{} instance doesn't have valid length)r   r   r
   len	TypeErrorformattype__name__r#   r   r   r   __len__/   s    
zSamplerIterDataPipe.__len__)r*   
__module____qualname____doc__r   __annotations__r   r   r   r	   r   r   r   r   r   r$   intr+   __classcell__r   r   r   r   r      s   
shufflec                       s   e Zd ZU dZee ed< eed< ee ed< e	ed< e
e ed< ejed< 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edddZddddZdd Zdd Zd d! Z  ZS )#r   a  
    Shuffles the input DataPipe with a buffer (functional name: ``shuffle``). The buffer
    with ``buffer_size`` is filled with elements from the datapipe first. Then,
    each item will be yielded from the buffer by reservoir sampling via iterator.

    ``buffer_size`` is required to be larger than ``0``. For ``buffer_size == 1``, the
    datapipe is not shuffled. In order to fully shuffle all elements from datapipe,
    ``buffer_size`` is required to be greater than or equal to the size of datapipe.

    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: The IterDataPipe being shuffled
        buffer_size: The buffer size for shuffling (default to ``10000``)
        unbatch_level: Specifies if it is necessary to unbatch source data before
            applying the shuffle

    Example:
        >>> # xdoctest: +SKIP
        >>> from torchdata.datapipes.iter import IterableWrapper
        >>> dp = IterableWrapper(range(10))
        >>> shuffle_dp = dp.shuffle()
        >>> list(shuffle_dp)
        [0, 4, 1, 6, 3, 2, 9, 5, 7, 8]
    r   buffer_size_buffer_enabled_seed_rngi'  r   )r3   unbatch_levelN)r   r3   r8   r   c                   s^   t    g | _|dks td|dkr0|| _n|j|d| _|| _d| _d | _t	
 | _d S )Nr   z#buffer_size should be larger than 0)r8   T)r   r   r4   r   r   Zunbatchr3   r5   r6   randomRandomr7   )r   r   r3   r8   r   r   r   r   ^   s    
zShufflerIterDataPipe.__init__Tc                 C   s
   || _ | S r!   )r5   )r   r2   r   r   r   set_shuffler   s    z ShufflerIterDataPipe.set_shuffle)seedc                 C   s
   || _ | S r!   )r6   )r   r<   r   r   r   set_seedv   s    zShufflerIterDataPipe.set_seedr    c                 c   s   | j s| jD ]
}|V  qn| jD ]V}t| j| jkrj| jdt| jd }| j| | }| j|< |V  q | j| q | jr| jdt| jd }| j|V  qxd S )Nr      )	r5   r   r&   r4   r3   r7   randintappendpop)r   xidxvalr   r   r   r$   z   s    


zShufflerIterDataPipe.__iter__c                 C   s.   t | jtrt| jS tdt| jd S )Nr%   )r   r   r
   r&   r'   r(   r)   r*   r#   r   r   r   r+      s    
zShufflerIterDataPipe.__len__c                 C   sL   g | _ | jrH| jd kr4ttjdtjd  | _| j	
| j d | _d S )Nr   )Zdtype)r4   r5   r6   r0   torchemptyZint64Zrandom_itemr7   r<   r#   r   r   r   reset   s    
zShufflerIterDataPipe.resetc                 C   s@   | j | j| j| j| j| j | j| jf}t	j
d k	r<t	
|S |S r!   )r   r3   r5   r6   r4   r7   getstate_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   r3   r5   r6   r4   rJ   rK   r9   r:   r7   setstate)r   rL   Z	rng_stater   r   r   __setstate__   s    

z!ShufflerIterDataPipe.__setstate__c                 C   s   | j   d S r!   )r4   clearr#   r   r   r   __del__   s    zShufflerIterDataPipe.__del__)T)r*   r,   r-   r.   r   r   r/   r0   r   boolr	   r9   r:   r   r;   r=   r   r$   r+   rH   rM   rO   rQ   r1   r   r   r   r   r   6   s.   


)r9   rE   Ztorch.utils.datar   r   Z%torch.utils.data.datapipes._decoratorr   Z#torch.utils.data.datapipes.datapiper   typingr   r   r   r	   r
   r   r   r   __all__r   r   r   r   r   r   r   <module>   s   (%