§
    ù²Åj  ã                   ó®   — d dl Z d dlmZmZmZmZmZmZ d dlZd dl	m
Z d dlmZ d dlmZ  G d„ de¦  «        Z G d„ de¦  «        Z G d	„ d
e¦  «        ZdS )é    N)ÚcastÚIteratorÚListÚOptionalÚSizedÚUnion)ÚSampler)Ú
VideoClipsc                   óˆ   — e Zd ZdZ	 	 	 	 ddedee         dee         ded	ed
dfd„Zd
e	e         fd„Z
d
efd„Zded
dfd„ZdS )ÚDistributedSampleraÝ  
    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]

    NFé   ÚdatasetÚnum_replicasÚrankÚshuffleÚ
group_sizeÚreturnc                 ór  — |€5t          j        ¦   «         st          d¦  «        ‚t          j        ¦   «         }|€5t          j        ¦   «         st          d¦  «        ‚t          j        ¦   «         }t          |¦  «        |z  dk    r"t          dt          |¦  «        › d|› �¦  «        ‚|| _        || _        || _	        || _
        d| _        t          |¦  «        |z  }t          t          j        |dz  | j	        z  ¦  «        ¦  «        | _        | j        |z  | _        | j        | j	        z  | _        || _        d S )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          ú[C:\Projects\Historical\venv\Lib\site-packages\torchvision/datasets/samplers/clip_sampler.pyÚ__init__zDistributedSampler.__init__'   s<  € ð ÐÝÔ$Ñ&Ô&ð SÝ"Ð#QÑRÔRÐRÝÔ.Ñ0Ô0ˆLØˆ<ÝÔ$Ñ&Ô&ð SÝ"Ð#QÑRÔRÐRÝ”=‘?”?ˆDÝˆw‰<Œ<˜*Ñ$¨Ò)Ð)ÝØ}ÕUXÐY`ÑUaÔUaÐ}Ð}Ðq{Ð}Ð}ñô ð ð ˆŒØ$ˆŒØ(ˆÔØˆŒ	ØˆŒ
Ý" 7™|œ|¨zÑ9ÐÝ!$¥T¤YÐ/CÀcÑ/IÈDÔL]Ñ/]Ñ%^Ô%^Ñ!_Ô!_ˆÔØÔ1°JÑ>ˆÔØÔ*¨TÔ->Ñ>ˆŒØˆŒˆˆó    c                 ó”  ‡— t          j        ¦   «         }|                     | j        ¦  «         | j        r;t          j        t          | j        ¦  «        |¬¦  «                             ¦   «         }n.t          t          t          | j        ¦  «        ¦  «        ¦  «        }||d | j        t          |¦  «        z
  …         z  }t          |¦  «        | j        k    sJ ‚| j        | j        z  }t          j        t          j        |¦  «        || j        f¦  «        }|| j        || j        …d d …f         }t          j        |d¦  «                             ¦   «         }t          |¦  «        | j        k    sJ ‚t%          | j        t&          ¦  «        r/t          t)          | j        ¦  «        ¦  «        Šˆfd„|D ¦   «         }t)          |¦  «        S )N)Ú	generator)éÿÿÿÿc                 ó    •— g | ]
}‰|         ‘ŒS © r,   )Ú.0ÚiÚorig_indicess     €r%   ú
<listcomp>z/DistributedSampler.__iter__.<locals>.<listcomp>^   s   ø€ Ð8Ð8Ð8¨1�| A”Ð8Ð8Ð8r'   )ÚtorchÚ	GeneratorÚmanual_seedr   r   Úrandpermr   r   ÚtolistÚlistÚranger"   r   ÚreshapeÚ
LongTensorr   r   r!   Ú
isinstancer	   Úiter)r#   ÚgÚindicesÚtotal_group_sizer/   s       @r%   Ú__iter__zDistributedSampler.__iter__F   s’  ø€ åŒOÑÔˆØ	�Š�d”jÑ!Ô!Ð!àŒ<ð 	5Ý”n¥S¨¬Ñ%6Ô%6À!ÐDÑDÔD×KÒKÑMÔMˆGˆGå�5¥ T¤\Ñ!2Ô!2Ñ3Ô3Ñ4Ô4ˆGð 	�7Ð=˜dœoµ°G±´Ñ<Ð=Ô>Ñ>ˆÝ�7‰|Œ|˜tœÒ.Ð.Ð.Ð.àœ?¨d¬oÑ=ÐÝ”-¥Ô 0°Ñ 9Ô 9Ð<LÈdÌoÐ;^Ñ_Ô_ˆð ˜$œ)Ð&6¸Ô9JÐJÈAÈAÈAÐMÔNˆÝ”- ¨Ñ/Ô/×6Ò6Ñ8Ô8ˆÝ�7‰|Œ|˜tÔ/Ò/Ð/Ð/Ð/å�d”l¥GÑ,Ô,ð 	9Ý¥ T¤\Ñ 2Ô 2Ñ3Ô3ˆLØ8Ð8Ð8Ð8°Ð8Ñ8Ô8ˆGå�G‰}Œ}Ðr'   c                 ó   — | j         S ©N)r!   ©r#   s    r%   Ú__len__zDistributedSampler.__len__b   s   € ØÔÐr'   r   c                 ó   — || _         d S rA   )r   )r#   r   s     r%   Ú	set_epochzDistributedSampler.set_epoche   s   € ØˆŒ
ˆ
ˆ
r'   )NNFr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úboolr&   r   r?   rC   rE   r,   r'   r%   r   r   
   sã   € € € € € ðð ð> '+Ø"ØØðð àðð ˜s”mðð �sŒmð	ð
 ðð ðð 
ðð ð ð ð>˜( 3œ-ð ð ð ð ð8 ˜ð  ð  ð  ð  ð˜sð  tð ð ð ð ð ð r'   r   c                   óJ   — e Zd ZdZdededdfd„Zdee         fd„Zdefd„Z	dS )	ÚUniformClipSamplera†  
    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          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚|| _        || _        d S ©Nz:Expected video_clips to be an instance of VideoClips, got )r:   r
   Ú	TypeErrorÚtyperM   rN   )r#   rM   rN   s      r%   r&   zUniformClipSampler.__init__t   óL   € Ý˜+¥zÑ2Ô2ð 	nÝÐlÕY]Ð^iÑYjÔYjÐlÐlÑmÔmÐmØ&ˆÔØ#6ˆÔ Ð Ð r'   c                 óÌ  — g }d}| j         j        D ]ƒ}t          |¦  «        }|dk    rŒt          j        |||z   dz
  | j        ¬¦  «                             ¦   «                              t          j        ¦  «        }||z  }| 	                    |¦  «         Œ„t          t          t          t                   t          j        |¦  «                             ¦   «         ¦  «        ¦  «        S )Nr   r   )Ústeps)rM   Úclipsr   r1   ÚlinspacerN   ÚfloorÚtoÚint64Úappendr;   r   r   r   Úcatr5   )r#   ÚidxsÚsÚcÚlengthÚsampleds         r%   r?   zUniformClipSampler.__iter__z   sÅ   € ØˆØˆàÔ!Ô'ð 	!ð 	!ˆAÝ˜‘V”VˆFØ˜Š{ˆ{àå”n Q¨¨F©
°Q©¸dÔ>VÐWÑWÔW×]Ò]Ñ_Ô_×bÒbÕchÔcnÑoÔoˆGØ�‰KˆAØ�KŠK˜Ñ Ô Ð Ð Ý•D��cœ¥E¤I¨d¡O¤O×$:Ò$:Ñ$<Ô$<Ñ=Ô=Ñ>Ô>Ð>r'   c                 óN   ‡ — t          ˆ fd„‰ j        j        D ¦   «         ¦  «        S )Nc              3   óL   •K  — | ]}t          |¦  «        d k    ¯‰j        V — ŒdS )r   N)r   rN   ©r-   r_   r#   s     €r%   ú	<genexpr>z-UniformClipSampler.__len__.<locals>.<genexpr>Š   s2   øè è € ÐZÐZ°ÍsÐSTÉvÌvÐXYÊzÈz�4Ô+ÈzÈzÈzÈzÐZÐZr'   ©ÚsumrM   rV   rB   s   `r%   rC   zUniformClipSampler.__len__‰   s,   ø€ ÝÐZÐZÐZÐZ°TÔ5EÔ5KÐZÑZÔZÑZÔZÐZr'   ©
rF   rG   rH   rI   r
   r   r&   r   r?   rC   r,   r'   r%   rL   rL   i   sˆ   € € € € € ðð ð7 Jð 7ÀSð 7ÈTð 7ð 7ð 7ð 7ð?˜( 3œ-ð ?ð ?ð ?ð ?ð[˜ð [ð [ð [ð [ð [ð [r'   rL   c                   óJ   — e Zd ZdZdededdfd„Zdee         fd„Zdefd„Z	dS )	ÚRandomClipSamplerzî
    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
    rM   Úmax_clips_per_videor   Nc                 óŠ   — t          |t          ¦  «        st          dt          |¦  «        › �¦  «        ‚|| _        || _        d S rP   )r:   r
   rQ   rR   rM   rk   )r#   rM   rk   s      r%   r&   zRandomClipSampler.__init__–   rS   r'   c                 óš  — g }d}| j         j        D ]_}t          |¦  «        }t          || j        ¦  «        }t          j        |¦  «        d |…         |z   }||z  }|                     |¦  «         Œ`t          j        |¦  «        }t          j        t          |¦  «        ¦  «        }t          ||          
                    ¦   «         ¦  «        S )Nr   )rM   rV   r   Úminrk   r1   r4   r[   r\   r;   r5   )	r#   r]   r^   r_   r`   Úsizera   Úidxs_Úperms	            r%   r?   zRandomClipSampler.__iter__œ   s¹   € ØˆØˆàÔ!Ô'ð 	!ð 	!ˆAÝ˜‘V”VˆFÝ�v˜tÔ7Ñ8Ô8ˆDÝ”n VÑ,Ô,¨U¨d¨UÔ3°aÑ7ˆGØ�‰KˆAØ�KŠK˜Ñ Ô Ð Ð Ý”	˜$‘”ˆåŒ~�c %™jœjÑ)Ô)ˆÝ�E˜$”K×&Ò&Ñ(Ô(Ñ)Ô)Ð)r'   c                 óN   ‡ — t          ˆ fd„‰ j        j        D ¦   «         ¦  «        S )Nc              3   ó\   •K  — | ]&}t          t          |¦  «        ‰j        ¦  «        V — Œ'd S rA   )rn   r   rk   rd   s     €r%   re   z,RandomClipSampler.__len__.<locals>.<genexpr>¬   s6   øè è € ÐYÐY¸Q•3•s˜1‘v”v˜tÔ7Ñ8Ô8ÐYÐYÐYÐYÐYÐYr'   rf   rB   s   `r%   rC   zRandomClipSampler.__len__«   s,   ø€ ÝÐYÐYÐYÐYÀ$ÔBRÔBXÐYÑYÔYÑYÔYÐYr'   rh   r,   r'   r%   rj   rj   �   sˆ   € € € € € ðð ð7 Jð 7ÀSð 7ÈTð 7ð 7ð 7ð 7ð*˜( 3œ-ð *ð *ð *ð *ðZ˜ð Zð Zð Zð Zð Zð Zr'   rj   )r   Útypingr   r   r   r   r   r   r1   Útorch.distributedÚdistributedr   Útorch.utils.datar	   Ú torchvision.datasets.video_utilsr
   r   rL   rj   r,   r'   r%   ú<module>ry      s!  ðØ €€€Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø $Ð $Ð $Ð $Ð $Ð $Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7ð\ð \ð \ð \ð \˜ñ \ô \ð \ð~![ð ![ð ![ð ![ð ![˜ñ ![ô ![ð ![ðHZð Zð Zð Zð Z˜ñ Zô Zð Zð Zð Zr'   