§
    Ì²Åj”3  ã                   ó`  — d dl Z d dlmZmZmZmZmZmZmZm	Z	m
Z
 d dlZg d¢Z e	dd¬¦  «        Z G d„ dee         ¦  «        Z G d	„ d
ee         ¦  «        Z G d„ dee         ¦  «        Z G d„ dee         ¦  «        Z G d„ dee         ¦  «        Z G d„ deee                  ¦  «        ZdS )é    N)	ÚGenericÚIterableÚIteratorÚListÚOptionalÚSequenceÚSizedÚTypeVarÚUnion)ÚBatchSamplerÚRandomSamplerÚSamplerÚSequentialSamplerÚSubsetRandomSamplerÚWeightedRandomSamplerÚ_T_coT)Ú	covariantc                   óH   — e Zd ZdZddee         ddfd„Zdee         fd„Z	dS )r   a;  Base class for all Samplers.

    Every Sampler subclass has to provide an :meth:`__iter__` method, providing a
    way to iterate over indices or lists of indices (batches) of dataset elements,
    and may provide a :meth:`__len__` method that returns the length of the returned iterators.

    Args:
        data_source (Dataset): This argument is not used and will be removed in 2.2.0.
            You may still have custom implementation that utilizes it.

    Example:
        >>> # xdoctest: +SKIP
        >>> class AccedingSequenceLengthSampler(Sampler[int]):
        >>>     def __init__(self, data: List[str]) -> None:
        >>>         self.data = data
        >>>
        >>>     def __len__(self) -> int:
        >>>         return len(self.data)
        >>>
        >>>     def __iter__(self) -> Iterator[int]:
        >>>         sizes = torch.tensor([len(x) for x in self.data])
        >>>         yield from torch.argsort(sizes).tolist()
        >>>
        >>> class AccedingSequenceLengthBatchSampler(Sampler[List[int]]):
        >>>     def __init__(self, data: List[str], batch_size: int) -> None:
        >>>         self.data = data
        >>>         self.batch_size = batch_size
        >>>
        >>>     def __len__(self) -> int:
        >>>         return (len(self.data) + self.batch_size - 1) // self.batch_size
        >>>
        >>>     def __iter__(self) -> Iterator[List[int]]:
        >>>         sizes = torch.tensor([len(x) for x in self.data])
        >>>         for batch in torch.chunk(torch.argsort(sizes), len(self)):
        >>>             yield batch.tolist()

    .. note:: The :meth:`__len__` method isn't strictly required by
              :class:`~torch.utils.data.DataLoader`, but is expected in any
              calculation involving the length of a :class:`~torch.utils.data.DataLoader`.
    NÚdata_sourceÚreturnc                 ó@   — |�dd l }|                     d¦  «         d S d S )Nr   zz`data_source` argument is not used and will be removed in 2.2.0.You may still have custom implementation that utilizes it.)ÚwarningsÚwarn)Úselfr   r   s      úIC:\Projects\Historical\venv\Lib\site-packages\torch/utils/data/sampler.pyÚ__init__zSampler.__init__I   s?   € ØÐ"ØˆOˆOˆOà�MŠMðMñô ð ð ð ð #Ð"ó    c                 ó   — t           ‚©N)ÚNotImplementedError©r   s    r   Ú__iter__zSampler.__iter__R   s   € Ý!Ð!r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r	   r   r   r   r"   © r   r   r   r      si   € € € € € ð'ð 'ðRð  H¨U¤Oð ¸tð ð ð ð ð"˜( 5œ/ð "ð "ð "ð "ð "ð "r   r   c                   óR   — e Zd ZU dZeed<   deddfd„Zdee         fd„Z	defd„Z
dS )r   z~Samples elements sequentially, always in the same order.

    Args:
        data_source (Dataset): dataset to sample from
    r   r   Nc                 ó   — || _         d S r   )r   )r   r   s     r   r   zSequentialSampler.__init__z   s   € Ø&ˆÔÐÐr   c                 ó^   — t          t          t          | j        ¦  «        ¦  «        ¦  «        S r   )ÚiterÚrangeÚlenr   r!   s    r   r"   zSequentialSampler.__iter__}   s#   € Ý•E�#˜dÔ.Ñ/Ô/Ñ0Ô0Ñ1Ô1Ð1r   c                 ó*   — t          | j        ¦  «        S r   )r-   r   r!   s    r   Ú__len__zSequentialSampler.__len__€   s   € Ý�4Ô#Ñ$Ô$Ð$r   )r#   r$   r%   r&   r	   Ú__annotations__r   r   Úintr"   r/   r'   r   r   r   r   q   sŠ   € € € € € € ðð ð ÐÐÑð' Eð '¨dð 'ð 'ð 'ð 'ð2˜( 3œ-ð 2ð 2ð 2ð 2ð%˜ð %ð %ð %ð %ð %ð %r   r   c            	       ó”   — e Zd ZU dZeed<   eed<   	 	 	 ddededee         ddfd„Z	e
defd	„¦   «         Zdee         fd
„Zdefd„ZdS )r   aÛ  Samples elements randomly. If without replacement, then sample from a shuffled dataset.

    If with replacement, then user can specify :attr:`num_samples` to draw.

    Args:
        data_source (Dataset): dataset to sample from
        replacement (bool): samples are drawn on-demand with replacement if ``True``, default=``False``
        num_samples (int): number of samples to draw, default=`len(dataset)`.
        generator (Generator): Generator used in sampling.
    r   ÚreplacementFNÚnum_samplesr   c                 ó  — || _         || _        || _        || _        t	          | j        t
          ¦  «        st          d| j        › �¦  «        ‚t	          | j        t          ¦  «        r| j        dk    rt          d| j        › �¦  «        ‚d S )Nú;replacement should be a boolean value, but got replacement=r   úDnum_samples should be a positive integer value, but got num_samples=)
r   r3   Ú_num_samplesÚ	generatorÚ
isinstanceÚboolÚ	TypeErrorr4   r1   Ú
ValueError)r   r   r3   r4   r9   s        r   r   zRandomSampler.__init__“   s¦   € ð 'ˆÔØ&ˆÔØ'ˆÔØ"ˆŒå˜$Ô*­DÑ1Ô1ð 	ÝØ`ÈdÔN^Ð`Ð`ñô ð õ ˜$Ô*­CÑ0Ô0ð 	°DÔ4DÈÒ4IÐ4IÝØiÐW[ÔWgÐiÐiñô ð ð 5JÐ4Ir   c                 óF   — | j         €t          | j        ¦  «        S | j         S r   )r8   r-   r   r!   s    r   r4   zRandomSampler.num_samples©   s'   € ð ÔÐ$Ý�tÔ'Ñ(Ô(Ð(ØÔ Ð r   c              #   óŽ  K  — t          | j        ¦  «        }| j        €zt          t	          j        dt          j        ¬¦  «                             ¦   «                              ¦   «         ¦  «        }t	          j	        ¦   «         }| 
                    |¦  «         n| j        }| j        r™t          | j        dz  ¦  «        D ]<}t	          j        |dt          j        |¬¦  «                             ¦   «         E d {V —† Œ=t	          j        || j        dz  ft          j        |¬¦  «                             ¦   «         E d {V —† d S t          | j        |z  ¦  «        D ]0}t	          j        ||¬¦  «                             ¦   «         E d {V —† Œ1t	          j        ||¬¦  «                             ¦   «         d | j        |z  …         E d {V —† d S )Nr'   ©Údtypeé    )rB   )ÚhighÚsizerA   r9   ©r9   )r-   r   r9   r1   ÚtorchÚemptyÚint64Úrandom_ÚitemÚ	GeneratorÚmanual_seedr3   r,   r4   ÚrandintÚtolistÚrandperm)r   ÚnÚseedr9   Ú_s        r   r"   zRandomSampler.__iter__°   s  è è € Ý�Ô Ñ!Ô!ˆØŒ>Ð!Ý•u”{ 2­U¬[Ð9Ñ9Ô9×AÒAÑCÔC×HÒHÑJÔJÑKÔKˆDÝœÑ)Ô)ˆIØ×!Ò! $Ñ'Ô'Ð'Ð'àœˆIàÔð 	Ý˜4Ô+¨rÑ1Ñ2Ô2ð ð �Ý œ=Ø ­e¬kÀYðñ ô ç’&‘(”(ðð ð ð ð ð ð ð õ ”}ØØÔ&¨Ñ+Ð-Ý”kØ#ð	ñ ô ÷
 Šf‰hŒhðð ð ð ð ð ð ð ð õ ˜4Ô+¨qÑ0Ñ1Ô1ð Kð K�Ý œ>¨!°yÐAÑAÔA×HÒHÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÝ”~ a°9Ð=Ñ=Ô=×DÒDÑFÔFØ&�$Ô" QÑ&Ð&ôð ð ð ð ð ð ð ð ð r   c                 ó   — | j         S r   ©r4   r!   s    r   r/   zRandomSampler.__len__Ë   ó   € ØÔÐr   )FNN)r#   r$   r%   r&   r	   r0   r;   r   r1   r   Úpropertyr4   r   r"   r/   r'   r   r   r   r   „   sé   € € € € € € ð	ð 	ð ÐÐÑØÐÐÑð
 "Ø%)Øðð àðð ðð ˜c”]ð	ð 
ðð ð ð ð, ð!˜Sð !ð !ð !ñ „Xð!ð˜( 3œ-ð ð ð ð ð6 ˜ð  ð  ð  ð  ð  ð  r   r   c                   ól   — e Zd ZU dZee         ed<   ddee         ddfd„Zdee         fd„Z	defd„Z
dS )	r   zÉSamples elements randomly from a given list of indices, without replacement.

    Args:
        indices (sequence): a sequence of indices
        generator (Generator): Generator used in sampling.
    ÚindicesNr   c                 ó"   — || _         || _        d S r   )rX   r9   )r   rX   r9   s      r   r   zSubsetRandomSampler.__init__Ù   s   € ØˆŒØ"ˆŒˆˆr   c              #   óˆ   K  — t          j        t          | j        ¦  «        | j        ¬¦  «        D ]}| j        |         V — Œd S ©NrE   )rF   rO   r-   rX   r9   )r   Úis     r   r"   zSubsetRandomSampler.__iter__Ý   sO   è è € Ý”¥ D¤LÑ 1Ô 1¸T¼^ÐLÑLÔLð 	"ð 	"ˆAØ”,˜q”/Ð!Ð!Ð!Ð!ð	"ð 	"r   c                 ó*   — t          | j        ¦  «        S r   )r-   rX   r!   s    r   r/   zSubsetRandomSampler.__len__á   s   € Ý�4”<Ñ Ô Ð r   r   )r#   r$   r%   r&   r   r1   r0   r   r   r"   r/   r'   r   r   r   r   Ï   s—   € € € € € € ðð ð �cŒ]ÐÐÑð#ð # ¨¤ð #À$ð #ð #ð #ð #ð"˜( 3œ-ð "ð "ð "ð "ð!˜ð !ð !ð !ð !ð !ð !r   r   c            	       óŠ   — e Zd ZU dZej        ed<   eed<   eed<   	 	 dde	e
         dededdfd„Zdee         fd	„Zdefd
„ZdS )r   aN  Samples elements from ``[0,..,len(weights)-1]`` with given probabilities (weights).

    Args:
        weights (sequence)   : a sequence of weights, not necessary summing up to one
        num_samples (int): number of samples to draw
        replacement (bool): if ``True``, samples are drawn with replacement.
            If not, they are drawn without replacement, which means that when a
            sample index is drawn for a row, it cannot be drawn again for that row.
        generator (Generator): Generator used in sampling.

    Example:
        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> list(WeightedRandomSampler([0.1, 0.9, 0.4, 0.7, 3.0, 0.6], 5, replacement=True))
        [4, 4, 1, 4, 5]
        >>> list(WeightedRandomSampler([0.9, 0.4, 0.05, 0.2, 0.3, 0.1], 5, replacement=False))
        [0, 1, 4, 3, 2]
    Úweightsr4   r3   TNr   c                 óÈ  — t          |t          ¦  «        rt          |t          ¦  «        s|dk    rt          d|› �¦  «        ‚t          |t          ¦  «        st          d|› �¦  «        ‚t	          j        |t          j        ¬¦  «        }t          |j        ¦  «        dk    r$t          dt          |j        ¦  «        › �¦  «        ‚|| _
        || _        || _        || _        d S )Nr   r7   r6   r@   é   z=weights should be a 1d sequence but given weights have shape )r:   r1   r;   r=   rF   Ú	as_tensorÚdoubler-   ÚshapeÚtupler_   r4   r3   r9   )r   r_   r4   r3   r9   Úweights_tensors         r   r   zWeightedRandomSampler.__init__ü   s  € õ ˜;­Ñ,Ô,ð	å˜+¥tÑ,Ô,ð	ð ˜aÒÐåØdÐWbÐdÐdñô ð õ ˜+¥tÑ,Ô,ð 	ÝØ[ÈkÐ[Ð[ñô ð õ œ¨½¼ÐEÑEÔEˆÝˆ~Ô#Ñ$Ô$¨Ò)Ð)ÝðDÝ&+¨NÔ,@Ñ&AÔ&AðDð Dñô ð ð
 &ˆŒØ&ˆÔØ&ˆÔØ"ˆŒˆˆr   c              #   ó°   K  — t          j        | j        | j        | j        | j        ¬¦  «        }t          |                     ¦   «         ¦  «        E d {V —† d S r[   )rF   Úmultinomialr_   r4   r3   r9   r+   rN   )r   Úrand_tensors     r   r"   zWeightedRandomSampler.__iter__  sd   è è € ÝÔ'ØŒL˜$Ô*¨DÔ,<ÈÌð
ñ 
ô 
ˆõ ˜×*Ò*Ñ,Ô,Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r   c                 ó   — | j         S r   rT   r!   s    r   r/   zWeightedRandomSampler.__len__"  rU   r   )TN)r#   r$   r%   r&   rF   ÚTensorr0   r1   r;   r   Úfloatr   r   r"   r/   r'   r   r   r   r   å   sÎ   € € € € € € ðð ð$ Œ\ÐÐÑØÐÐÑØÐÐÑð !Øð#ð #à˜%”ð#ð ð#ð ð	#ð 
ð#ð #ð #ð #ð@.˜( 3œ-ð .ð .ð .ð .ð ˜ð  ð  ð  ð  ð  ð  r   r   c                   ó‚   — e Zd ZdZdeee         ee         f         dededdfd„Z	de
ee                  fd„Zdefd	„ZdS )
r   ai  Wraps another sampler to yield a mini-batch of indices.

    Args:
        sampler (Sampler or Iterable): Base sampler. Can be any iterable object
        batch_size (int): Size of mini-batch.
        drop_last (bool): If ``True``, the sampler will drop the last batch if
            its size would be less than ``batch_size``

    Example:
        >>> list(BatchSampler(SequentialSampler(range(10)), batch_size=3, drop_last=False))
        [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
        >>> list(BatchSampler(SequentialSampler(range(10)), batch_size=3, drop_last=True))
        [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
    ÚsamplerÚ
batch_sizeÚ	drop_lastr   Nc                 ó  — t          |t          ¦  «        rt          |t          ¦  «        s|dk    rt          d|› �¦  «        ‚t          |t          ¦  «        st          d|› �¦  «        ‚|| _        || _        || _        d S )Nr   zBbatch_size should be a positive integer value, but got batch_size=z7drop_last should be a boolean value, but got drop_last=)r:   r1   r;   r=   rn   ro   rp   )r   rn   ro   rp   s       r   r   zBatchSampler.__init__6  s�   € õ ˜:¥sÑ+Ô+ð	å˜*¥dÑ+Ô+ð	ð ˜QŠˆåØaÐU_ÐaÐañô ð õ ˜)¥TÑ*Ô*ð 	ÝØUÈ)ÐUÐUñô ð ð ˆŒØ$ˆŒØ"ˆŒˆˆr   c              #   ó  K  — t          | j        ¦  «        }| j        r|g| j        z  }t	          |Ž D ]}g |¢V — Œ	d S g t          j        || j        ¦  «        ¢}|r$|V — g t          j        || j        ¦  «        ¢}|°"d S d S r   )r+   rn   rp   ro   ÚzipÚ	itertoolsÚislice)r   Úsampler_iterÚargsÚbatch_droplastÚbatchs        r   r"   zBatchSampler.__iter__O  sÉ   è è € å˜DœLÑ)Ô)ˆØŒ>ð 		Kà �> D¤OÑ3ˆDÝ"% t *ð (ð (�Ø'˜Ð'Ð'Ð'Ð'Ð'ð(ð (ð G•iÔ& |°T´_ÑEÔEÐFˆEØð KØ���ØJ�)Ô*¨<¸¼ÑIÔIÐJ�ð ð Kð Kð Kð Kð Kr   c                 ó–   — | j         rt          | j        ¦  «        | j        z  S t          | j        ¦  «        | j        z   dz
  | j        z  S )Nra   )rp   r-   rn   ro   r!   s    r   r/   zBatchSampler.__len__]  sI   € ð
 Œ>ð 	PÝ�t”|Ñ$Ô$¨¬Ñ7Ð7å˜œÑ%Ô%¨¬Ñ7¸!Ñ;ÀÄÑOÐOr   )r#   r$   r%   r&   r   r   r1   r   r;   r   r   r   r"   r/   r'   r   r   r   r   &  sµ   € € € € € ðð ð#à�w˜s”| X¨c¤]Ð2Ô3ð#ð ð#ð ð	#ð
 
ð#ð #ð #ð #ð2K˜( 4¨¤9Ô-ð Kð Kð Kð KðP˜ð Pð Pð Pð Pð Pð Pr   r   )rt   Útypingr   r   r   r   r   r   r	   r
   r   rF   Ú__all__r   r   r1   r   r   r   r   r   r'   r   r   ú<module>r}      sé  ðà Ð Ð Ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð €€€ðð ð €ð 	ˆ� 4Ð(Ñ(Ô(€ð4"ð 4"ð 4"ð 4"ð 4"ˆg�eŒnñ 4"ô 4"ð 4"ðd%ð %ð %ð %ð %˜ œñ %ô %ð %ð&H ð H ð H ð H ð H �G˜C”Lñ H ô H ð H ðV!ð !ð !ð !ð !˜' #œ,ñ !ô !ð !ð,> ð > ð > ð > ð > ˜G CœLñ > ô > ð > ðB?Pð ?Pð ?Pð ?Pð ?P�7˜4 œ9Ô%ñ ?Pô ?Pð ?Pð ?Pð ?Pr   