
    Ph                         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	
      Z G d dee         Z ed       G d dee                Zy)    N)SamplerSequentialSampler)functional_datapipe)IterDataPipe)DictIteratorListOptionalSizedTupleTypeTypeVarSamplerIterDataPipeShufflerIterDataPipeT_coT)	covariantc                        e Zd ZU dZeed<   eed<   eddfdedee   de	e
   de	e   ddf
 fdZdee   fd	Zdefd
Z xZS )r   a7  
    Generate 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sampler_argssampler_kwargsreturnc                     t        |t              sJ d       t        |           || _        |dn|| _        |i n|| _         || j
                  d| j                  i| j                  | _        y )Nz;Sampler class requires input datapipe implemented `__len__` data_source)
isinstancer   super__init__r   r   r   r   )selfr   r   r   r   	__class__s        xC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/utils/data/datapipes/iter/combinatorics.pyr   zSamplerIterDataPipe.__init__   sx     (E* 	JI	J* "."6BL$2$:b 1 1dt}}dPTPcPcd    c                 ,    t        | j                        S N)iterr   r   s    r!   __iter__zSamplerIterDataPipe.__iter__-   s    DLL!!r"   c                     t        | j                  t              rt        | j                        S t	        t        |       j                   d      Nz# instance doesn't have valid length)r   r   r   len	TypeErrortype__name__r&   s    r!   __len__zSamplerIterDataPipe.__len__0   s=    dllE*t||$$4:..//RSTTr"   )r-   
__module____qualname____doc__r   __annotations__r   r   r   r
   r   r   r   r   r   r'   intr.   __classcell__r    s   @r!   r   r      s      +<1526	e'ew-e  (e "*$	e
 e"(4. "U Ur"   shufflec            	            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
dee   dededdf fdZddZdefdZdee   fdZdefdZddZd Zd Zd Z xZS )r   a  
    Shuffle 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   )r8   unbatch_levelr=   r   Nc                    t         |           g | _        |dkD  sJ d       |dk(  r|| _        n|j	                  |      | _        || _        d| _        d | _        t        j                         | _
        y )Nr   z#buffer_size should be larger than 0)r=   T)r   r   r9   r   unbatchr8   r:   r;   randomRandomr<   )r   r   r8   r=   r    s       r!   r   zShufflerIterDataPipe.__init__a   sr     	 $&QE EEA$DM$,,=,IDM&
MMO	r"   c                     || _         | S r$   )r:   )r   r6   s     r!   set_shufflez ShufflerIterDataPipe.set_shuffleu   s    r"   seedc                     || _         | S r$   )r;   )r   rD   s     r!   set_seedzShufflerIterDataPipe.set_seedy   s    
r"   c              #   n  K   | j                   s| j                  E d {    y | j                  D ]  }t        | j                        | j                  k(  rV| j
                  j                  dt        | j                        dz
        }| j                  |   |c}| j                  |<   | {| j                  j                  |        | j                  r]| j
                  j                  dt        | j                        dz
        }| j                  j                  |       | j                  r\y y 7 w)Nr      )	r:   r   r*   r9   r8   r<   randintappendpop)r   xidxvals       r!   r'   zShufflerIterDataPipe.__iter__}   s     }}}}$$]]t||$(8(88))++As4<</@1/DEC-1\\#->*Cc*ILL''* # ,,ii''3t||+<q+@All&&s++ ,, %s   D5D2DD50D5c                     t        | j                  t              rt        | j                        S t	        t        |       j                   d      r)   )r   r   r   r*   r+   r,   r-   r&   s    r!   r.   zShufflerIterDataPipe.__len__   s=    dmmU+t}}%%4:..//RSTTr"   c                 :   g | _         | j                  r| j                  Ot        t	        j
                  dt        j                        j                         j                               | _        | j                  j                  | j                         d | _        y y )Nr   )dtype)r9   r:   r;   r3   torchemptyint64random_itemr<   rD   r&   s    r!   resetzShufflerIterDataPipe.reset   sg    ==zz! Ru{{!C!K!K!M!R!R!TU
IINN4::&DJ	 r"   c                     | j                   | j                  | j                  | j                  | j                  | j
                  j                         | j                  | j                  f}t        j                  t        j                  |      S |S r$   )r   r8   r:   r;   r9   r<   getstate_valid_iterator_id_number_of_samples_yieldedr   getstate_hook)r   states     r!   __getstate__z!ShufflerIterDataPipe.__getstate__   st    MMMMJJLLII ##++	
 %%1--e44r"   c           	          |\  | _         | _        | _        | _        | _        }| _        | _        t        j                         | _	        | j                  j                  |       y r$   )r   r8   r:   r;   r9   rZ   r[   r@   rA   r<   setstate)r   r]   	rng_states      r!   __setstate__z!ShufflerIterDataPipe.__setstate__   sT     		
MMJL#+MMO			9%r"   c                 8    | j                   j                          y r$   )r9   clearr&   s    r!   __del__zShufflerIterDataPipe.__del__   s    r"   )T)r   N)r-   r/   r0   r1   r   r   r2   r3   r	   boolr
   r@   rA   r   rC   rF   r   r'   r.   rW   r^   rb   re   r4   r5   s   @r!   r   r   7   s    B 4  $ZNC=
--
 %*&'	$'-$ "$ !$	$
 $(S ,(4. ,U U
&r"   )r@   rR   torch.utils.datar   r   %torch.utils.data.datapipes._decoratorr   #torch.utils.data.datapipes.datapiper   typingr   r   r	   r
   r   r   r   r   __all__r   r   r   r   r"   r!   <module>rl      sv      7 E < N N N 
 v&#U,t, #UL Y<-   r"   