
    Ng                     f    d dl Z d dlZd dlmZ d dlmZ  G d de          Z G d de          ZdS )    N)Samplerc                   &    e Zd ZdZddZd Zd ZdS )OrderedDistributedSamplera  Sampler that restricts data loading to a subset of the dataset.
    It is especially useful in conjunction with
    :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each
    process can pass a DistributedSampler instance as a DataLoader sampler,
    and load a subset of the original dataset that is exclusive to it.
    .. note::
        Dataset is assumed to be of constant size.
    Arguments:
        dataset: Dataset used for sampling.
        num_replicas (optional): Number of processes participating in
            distributed training.
        rank (optional): Rank of the current process within num_replicas.
    Nc                    |5t          j                    st          d          t          j                    }|5t          j                    st          d          t          j                    }|| _        || _        || _        t          t          j
        t          | j                  dz  | j        z                      | _        | j        | j        z  | _        d S )N,Requires distributed package to be availableg      ?)distis_availableRuntimeErrorget_world_sizeget_rankdatasetnum_replicasrankintmathceillennum_samples
total_size)selfr   r   r   s       Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/data/distributed_sampler.py__init__z"OrderedDistributedSampler.__init__   s    $&& S"#QRRR.00L<$&& S"#QRRR=??D(	tyT\):):S)@4CT)TUUVV*T->>    c                 \   t          t          t          | j                                      }||d | j        t          |          z
           z  }t          |          | j        k    sJ || j        | j        | j                 }t          |          | j        k    sJ t          |          S N)	listranger   r   r   r   r   r   iter)r   indicess     r   __iter__z"OrderedDistributedSampler.__iter__%   s    uS..//00 	7<T_s7||;<==7||t.... $)DOD4EEF7||t/////G}}r   c                     | j         S r   )r   r   s    r   __len__z!OrderedDistributedSampler.__len__2   s    r   )NN)__name__
__module____qualname____doc__r   r    r#    r   r   r   r      sP         ? ? ? ?           r   r   c                   8    e Zd ZdZ	 	 	 	 	 	 ddZd Zd	 Zd
 ZdS )RepeatAugSamplera  Sampler that restricts data loading to a subset of the dataset for distributed,
    with repeated augmentation.
    It ensures that different each augmented version of a sample will be visible to a
    different process (GPU). Heavily based on torch.utils.data.DistributedSampler

    This sampler was taken from https://github.com/facebookresearch/deit/blob/0c4b8f60/samplers.py
    Used in
    Copyright (c) 2015-present, Facebook, Inc.
    NT      r   c                    |5t          j                    st          d          t          j                    }|5t          j                    st          d          t          j                    }|| _        || _        || _        || _        || _	        d| _
        t          t          j        t          | j                  |z  | j        z                      | _        | j        | j        z  | _        |p|}|rCt          t          j        t          | j                  |z  |z  |z                      | _        d S t          t          j        t          | j                  |z                      | _        d S )Nr   r   )r   r	   r
   r   r   r   r   r   shufflenum_repeatsepochr   r   r   r   r   r   floornum_selected_samples)r   r   r   r   r.   r/   selected_roundselected_ratios           r   r   zRepeatAugSampler.__init__A   se    $&& S"#QRRR.00L<$&& S"#QRRR=??D(	&
tyT\):):[)H4K\)\]]^^*T->> (7< 	[(+DJT\""n4~EV-X -X )Y )YD%%% ),DIc$,6G6G.6X,Y,Y(Z(ZD%%%r   c                     t          j                    }|                     j                    j        r)t          j        t           j                  |          }n(t          j        dt           j                            }t           j
        t                    r{ j
                                        sbt          j         j
        t           j                  z            }|t          j         fdt!          |          D                                }n)t          j        |t%           j
                  d          }|                                } j        t          |          z
  }|dk    r||d |         z  }t          |           j        k    sJ | j         j         j                 }t          |           j        k    sJ t1          |d  j                           S )N)	generatorr   )startendc                 >    g | ]}t          |j        z            S r(   )r   r/   ).0ir   s     r   
<listcomp>z-RepeatAugSampler.__iter__.<locals>.<listcomp>r   s)    +c+c+c1CT5E0E,F,F+c+c+cr   )repeatsdim)torch	Generatormanual_seedr0   r.   randpermr   r   arange
isinstancer/   float
is_integerr   r   tensorr   repeat_interleaver   tolistr   r   r   r   r   r2   )r   gr   repeat_sizepadding_sizes   `    r   r    zRepeatAugSampler.__iter__e   s   O	dj!!!< 	CnS%6%6!DDDGGlDL0A0ABBBG d&.. 	]t7G7R7R7T7T 	])D$4s4<7H7H$HIIKel+c+c+c+cPUVaPbPb+c+c+cddeGG-gs4CS?T?TZ[\\\G..""W5!w}}--G7||t.... $)DOD4EEF7||t///// G6T667888r   c                     | j         S r   )r2   r"   s    r   r#   zRepeatAugSampler.__len__   s    ((r   c                     || _         d S r   )r0   )r   r0   s     r   	set_epochzRepeatAugSampler.set_epoch   s    


r   )NNTr+   r,   r   )r$   r%   r&   r'   r   r    r#   rO   r(   r   r   r*   r*   6   sx          "[ "[ "[ "[H9 9 9<) ) )    r   r*   )	r   r?   torch.utils.datar   torch.distributeddistributedr   r   r*   r(   r   r   <module>rS      s      $ $ $ $ $ $            ,  ,  ,  ,  ,  ,  ,  , ^Q Q Q Q Qw Q Q Q Q Qr   