
    QЦid                         S SK r S SKJrJrJrJrJrJr  S SKrS SK	J
r  S SKJr  S SKJr   " S S\5      r " S S\5      r " S	 S
\5      rg)    N)castIteratorListOptionalSizedUnion)Sampler)
VideoClipsc                       \ rS rSrSr    SS\S\\   S\\   S\S\S	S4S
 jjr	S	\
\   4S jrS	\4S jrS\S	S4S jrSrg)DistributedSampler
   a  
Extension of DistributedSampler, as discussed in
https://github.com/pytorch/pytorch/issues/23430

Example:
    dataset: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
    num_replicas: 4
    shuffle: False

when group_size = 1
        RANK    |  shard_dataset
        =========================
        rank_0  |  [0, 4, 8, 12]
        rank_1  |  [1, 5, 9, 13]
        rank_2  |  [2, 6, 10, 0]
        rank_3  |  [3, 7, 11, 1]

when group_size = 2

        RANK    |  shard_dataset
        =========================
        rank_0  |  [0, 1, 8, 9]
        rank_1  |  [2, 3, 10, 11]
        rank_2  |  [4, 5, 12, 13]
        rank_3  |  [6, 7, 0, 1]

Ndatasetnum_replicasrankshuffle
group_sizereturnc                    Uc:  [         R                  " 5       (       d  [        S5      e[         R                  " 5       nUc:  [         R                  " 5       (       d  [        S5      e[         R                  " 5       n[        U5      U-  S:w  a  [        S[        U5       SU 35      eXl        XPl        X l	        X0l
        SU l        [        U5      U-  n[        [        R                  " US-  U R                  -  5      5      U l        U R                  U-  U l        U R                   U R                  -  U l        X@l        g )Nz,Requires distributed package to be availabler   zBdataset length must be a multiplier of group size dataset length: z, group size: g      ?)distis_availableRuntimeErrorget_world_sizeget_ranklen
ValueErrorr   r   r   r   epochintmathceilnum_group_samplesnum_samples
total_sizer   )selfr   r   r   r   r   dataset_group_lengths          i/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/torchvision/datasets/samplers/clip_sampler.py__init__DistributedSampler.__init__'   s    $$&&"#QRR..0L<$$&&"#QRR==?Dw<*$)TUXY`UaTbbpq{p|}  $(	
"7|z9!$TYY/Cc/IDL]L]/]%^!_11J>**T->->>    c                    [         R                  " 5       nUR                  U R                  5        U R                  (       a7  [         R
                  " [        U R                  5      US9R                  5       nO'[        [        [        U R                  5      5      5      nX"S U R                  [        U5      -
   -  n[        U5      U R                  :X  d   eU R                  U R                  -  n[         R                  " [         R                  " U5      X0R                  45      nX R                  X0R                   2S S 24   n[         R                  " US5      R                  5       n[        U5      U R"                  :X  d   e[%        U R                  [&        5      (       a2  [        [)        U R                  5      5      nU Vs/ s H  oTU   PM	     nn[)        U5      $ s  snf )N)	generator))torch	Generatormanual_seedr   r   randpermr   r   tolistlistranger"   r   reshape
LongTensorr   r   r!   
isinstancer	   iter)r#   gindicestotal_group_sizeorig_indicesis         r%   __iter__DistributedSampler.__iter__F   sc   OO	djj!<<nnS%6!DKKMG5T\\!234G 	=dooG<>>7|t...??doo=-- 0 0 9<Loo;^_ ))&69J9JJAMN--/6687|t/////dllG,,T\\ 23L0781AG8G} 9s   G!c                     U R                   $ N)r!   r#   s    r%   __len__DistributedSampler.__len__b   s    r(   r   c                     Xl         g r?   )r   )r#   r   s     r%   	set_epochDistributedSampler.set_epoche   s    
r(   )	r   r   r   r    r   r!   r   r   r"   )NNF   )__name__
__module____qualname____firstlineno____doc__r   r   r   boolr&   r   r<   rA   rD   __static_attributes__ r(   r%   r   r   
   s    > '+" sm sm	
   
>(3- 8   s t r(   r   c                   P    \ rS rSrSrS\S\SS4S jrS\\   4S jr	S\4S	 jr
S
rg)UniformClipSampleri   aj  
Sample `num_video_clips_per_video` clips for each video, equally spaced.
When number of unique clips in the video is fewer than num_video_clips_per_video,
repeat the clips until `num_video_clips_per_video` clips are collected

Args:
    video_clips (VideoClips): video clips to sample from
    num_clips_per_video (int): number of clips to be sampled per video
video_clipsnum_clips_per_videor   Nc                 t    [        U[        5      (       d  [        S[        U5       35      eXl        X l        g Nz:Expected video_clips to be an instance of VideoClips, got )r5   r
   	TypeErrortyperR   rS   )r#   rR   rS   s      r%   r&   UniformClipSampler.__init__t   6    +z22XY]^iYjXklmm&#6 r(   c                    / nSnU R                   R                   H{  n[        U5      nUS:X  a  M  [        R                  " X"U-   S-
  U R
                  S9R                  5       R                  [        R                  5      nX$-  nUR                  U5        M}     [        [        [        [           [        R                  " U5      R                  5       5      5      $ )Nr   rF   )steps)rR   clipsr   r,   linspacerS   floortoint64appendr6   r   r   r   catr0   )r#   idxssclengthsampleds         r%   r<   UniformClipSampler.__iter__z   s    !!''AVF{nnQF
Qd>V>VW]]_bbchcncnoGKAKK  ( DcEIIdO$:$:$<=>>r(   c                 V   ^  [        U 4S jT R                  R                   5       5      $ )Nc              3   ^   >#    U  H"  n[        U5      S :  d  M  TR                  v   M$     g7f)r   N)r   rS   .0re   r#   s     r%   	<genexpr>-UniformClipSampler.__len__.<locals>.<genexpr>   s(     Z5KsSTvXYz+4++5Ks   --sumrR   r\   r@   s   `r%   rA   UniformClipSampler.__len__   s     ZT5E5E5K5KZZZr(   )rS   rR   rG   rH   rI   rJ   rK   r
   r   r&   r   r<   rA   rM   rN   r(   r%   rP   rP   i   s?    7J 7S 7T 7?(3- ?[ [r(   rP   c                   P    \ rS rSrSrS\S\SS4S jrS\\   4S jr	S\4S	 jr
S
rg)RandomClipSampler   z
Samples at most `max_video_clips_per_video` clips for each video randomly

Args:
    video_clips (VideoClips): video clips to sample from
    max_clips_per_video (int): maximum number of clips to be sampled per video
rR   max_clips_per_videor   Nc                 t    [        U[        5      (       d  [        S[        U5       35      eXl        X l        g rU   )r5   r
   rV   rW   rR   rv   )r#   rR   rv   s      r%   r&   RandomClipSampler.__init__   rY   r(   c                    / nSnU R                   R                   HT  n[        U5      n[        X@R                  5      n[
        R                  " U5      S U U-   nX$-  nUR                  U5        MV     [
        R                  " U5      n[
        R                  " [        U5      5      n[        Xx   R                  5       5      $ )Nr   )rR   r\   r   minrv   r,   r/   ra   rb   r6   r0   )	r#   rc   rd   re   rf   sizerg   idxs_perms	            r%   r<   RandomClipSampler.__iter__   s    !!''AVFv778DnnV,Ud3a7GKAKK  ( 		$~~c%j)EK&&())r(   c                 V   ^  [        U 4S jT R                  R                   5       5      $ )Nc              3   b   >#    U  H$  n[        [        U5      TR                  5      v   M&     g 7fr?   )rz   r   rv   rk   s     r%   rm   ,RandomClipSampler.__len__.<locals>.<genexpr>   s'     YBXQ3s1vt7788BXs   ,/ro   r@   s   `r%   rA   RandomClipSampler.__len__   s     Y$BRBRBXBXYYYr(   )rv   rR   rr   rN   r(   r%   rt   rt      s?    7J 7S 7T 7*(3- *Z Zr(   rt   )r   typingr   r   r   r   r   r   r,   torch.distributeddistributedr   torch.utils.datar	    torchvision.datasets.video_utilsr
   r   rP   rt   rN   r(   r%   <module>r      sF     ? ?    $ 7\ \~![ ![HZ Zr(   