
    hy                         S SK r S SKJrJr  S SK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)IteratorSized)castOptional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          b/var/www/auris/envauris/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__G   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__c   s    r'   r   c                     Xl         g r>   )r   )r"   r   s     r$   	set_epochDistributedSampler.set_epochf   s    
r'   )	r   r   r   r   r   r    r   r   r!   )NNF   )__name__
__module____qualname____firstlineno____doc__r   r   r   boolr%   r   r;   r@   rC   __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)UniformClipSamplerj   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 )r4   r	   	TypeErrortyperQ   rR   )r"   rQ   rR   s      r$   r%   UniformClipSampler.__init__u   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   rE   )steps)rQ   clipsr   r+   linspacerR   floortoint64appendr5   r   r0   r   catr/   )r"   idxssclengthsampleds         r$   r;   UniformClipSampler.__iter__{   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   rR   .0rd   r"   s     r$   	<genexpr>-UniformClipSampler.__len__.<locals>.<genexpr>   s(     Z5KsSTvXYz+4++5Ks   --sumrQ   r[   r?   s   `r$   r@   UniformClipSampler.__len__   s     ZT5E5E5K5KZZZr'   )rR   rQ   rF   rG   rH   rI   rJ   r	   r   r%   r   r;   r@   rL   rM   r'   r$   rO   rO   j   s?    7J 7S 7T 7?(3- ?[ [r'   rO   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
rQ   max_clips_per_videor   Nc                 t    [        U[        5      (       d  [        S[        U5       35      eXl        X l        g rT   )r4   r	   rU   rV   rQ   ru   )r"   rQ   ru   s      r$   r%   RandomClipSampler.__init__   rX   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   )rQ   r[   r   minru   r+   r.   r`   ra   r5   r/   )	r"   rb   rc   rd   re   sizerf   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>   )ry   r   ru   rj   s     r$   rl   ,RandomClipSampler.__len__.<locals>.<genexpr>   s'     YBXQ3s1vt7788BXs   ,/rn   r?   s   `r$   r@   RandomClipSampler.__len__   s     Y$BRBRBXBXYYYr'   )ru   rQ   rq   rM   r'   r$   rs   rs      s?    7J 7S 7T 7*(3- *Z Zr'   rs   )r   collections.abcr   r   typingr   r   r   r+   torch.distributeddistributedr   torch.utils.datar    torchvision.datasets.video_utilsr	   r   rO   rs   rM   r'   r$   <module>r      sI     + ( (    $ 7\ \~![ ![HZ Zr'   