
    Vh<                         d dl Z d dlmZmZ d dlmZmZ d dlZd dlm	Z	 d dl
mZ d dl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)IteratorSized)OptionalTypeVar)functional_datapipe)IterDataPipe)SamplerSequentialSampler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        ]/home/dcms/DCMS/lib/python3.12/site-packages/torch/utils/data/datapipes/iter/combinatorics.pyr   zSamplerIterDataPipe.__init__"   s     e
 	IH	I 
 	 "."6BL$2$:b 1 1dt}}dPTPcPcd    c                 ,    t        | j                        S N)iterr   r   s    r   __iter__zSamplerIterDataPipe.__iter__3   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__6   s=    dllE*t||$$4:..//RSTTr   )r)   
__module____qualname____doc__r   __annotations__r	   r
   r(   r   tupledictr   r   r   r#   intr*   __classcell__r   s   @r   r   r      s     
 "3(,)-ee ge uo	e
 !e 
e""(5/ "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   )r6   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   r7   r   unbatchr6   r8   r9   randomRandomr:   )r   r   r6   r;   r   s       r   r   zShufflerIterDataPipe.__init__g   sr     	 %'QE EEA$DM$,,=,IDM&
MMO	r   c                     || _         | S r    )r8   )r   r4   s     r   set_shufflez ShufflerIterDataPipe.set_shuffle|   s    r   seedc                     || _         | S r    )r9   )r   rB   s     r   set_seedzShufflerIterDataPipe.set_seed   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      )	r8   r   r&   r7   r6   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)r7   r8   r9   r1   torchemptyint64random_itemr:   rB   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   r6   r8   r9   r7   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   r6   r8   r9   r7   rX   rY   r>   r?   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    )r7   clearr"   s    r   __del__zShufflerIterDataPipe.__del__   s    r   )T)r   N)r)   r+   r,   r-   r   r   r.   r1   listboolr   r>   r?   r   rA   rD   r   r#   r*   rU   r\   r`   rc   r2   r3   s   @r   r   r   =   s    B 5!!%[NC=
-- !$u%$ 	$
 $ 
$*S ,(5/ ,U U
&r   )r>   collections.abcr   r   typingr   r   rP   %torch.utils.data.datapipes._decoratorr   #torch.utils.data.datapipes.datapiper   torch.utils.data.samplerr	   r
   __all__r   r   r   r   r   r   <module>rl      ss     + $  E < ?  	4(%U,u- %UP Y@<. @  @r   