Ë
    [²jy  ã                   óž   — d dl Z d dlmZmZ d dl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y)é    N)ÚIteratorÚSized)ÚcastÚOptionalÚUnion)ÚSampler)Ú
VideoClipsc                   ót   — 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y)Ú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]

    NÚdatasetÚnum_replicasÚrankÚshuffleÚ
group_sizeÚreturnc                 óh  — |€3t        j                  «       st        d«      ‚t        j                  «       }|€3t        j                  «       st        d«      ‚t        j                  «       }t        |«      |z  dk7  rt        dt        |«      › d|› �«      ‚|| _        || _        || _	        || _
        d| _        t        |«      |z  }t        t        j                  |dz  | j                  z  «      «      | _        | j                  |z  | _        | j                   | j                  z  | _        || _        y )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/ia-enhanced/venv/lib/python3.12/site-packages/torchvision/datasets/samplers/clip_sampler.pyÚ__init__zDistributedSampler.__init__(   s  € ð ÐÜ×$Ñ$Ô&Ü"Ð#QÓRÐRÜ×.Ñ.Ó0ˆLØˆ<Ü×$Ñ$Ô&Ü"Ð#QÓRÐRÜ—=‘=“?ˆDÜˆw‹<˜*Ñ$¨Ò)ÜØTÔUXÐY`ÓUaÐTbÐbpÐq{Ðp|Ð}óð ð ˆŒØ$ˆŒØ(ˆÔØˆŒ	ØˆŒ
Ü" 7›|¨zÑ9ÐÜ!$¤T§Y¡YÐ/CÀcÑ/IÈD×L]ÑL]Ñ/]Ó%^Ó!_ˆÔØ×1Ñ1°JÑ>ˆÔØ×*Ñ*¨T×->Ñ->Ñ>ˆŒØˆ�ó    c                 ó´  — t        j                  «       }|j                  | j                  «       | j                  r9t        j
                  t        | j                  «      |¬«      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«      j                  «       }t        |«      | j"                  k(  sJ ‚t%        | j                  t&        «      r0t        t)        | j                  «      «      }|D �cg c]  }||   ‘Œ	 }}t)        |«      S c c}w )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__zDistributedSampler.__iter__G   si  € ä�O‰OÓˆØ	�‰�d—j‘jÔ!à�<Š<Ü—n‘n¤S¨¯©Ó%6À!ÔD×KÑKÓM‰Gäœ5¤ T§\¡\Ó!2Ó3Ó4ˆGð 	�7Ð=˜dŸo™o´°G³Ñ<Ð>Ñ>ˆÜ�7‹|˜tŸ™Ò.Ð.Ð.àŸ?™?¨d¯o©oÑ=ÐÜ—-‘-¤× 0Ñ 0°Ó 9Ð<LÈdÏoÉoÐ;^Ó_ˆð ˜$Ÿ)™)Ð&6¸×9JÑ9JÐJÊAÐMÑNˆÜ—-‘- ¨Ó/×6Ñ6Ó8ˆÜ�7‹|˜t×/Ñ/Ò/Ð/Ð/ä�d—l‘l¤GÔ,Ü¤ T§\¡\Ó 2Ó3ˆLØ07Ö8¨1�| A“Ð8ˆGÐ8ä�G‹}Ðùò 9s   Æ<Gc                 ó   — | j                   S ©N)r   ©r!   s    r#   Ú__len__zDistributedSampler.__len__c   s   € Ø×ÑÐr%   r   c                 ó   — || _         y r;   )r   )r!   r   s     r#   Ú	set_epochzDistributedSampler.set_epochf   s	   € Øˆ�
r%   )NNFé   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úboolr$   r   r9   r=   r?   © r%   r#   r   r      s‹   „ ñð> '+Ø"ØØñàðð ˜s‘mðð �s‰mð	ð
 ðð ðð 
óð>˜( 3™-ó ð8 ˜ó  ð˜sð  tô r%   r   c                   óB   — 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	y)	Ú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                 ón   — t        |t        «      st        dt        |«      › �«      ‚|| _        || _        y ©Nz:Expected video_clips to be an instance of VideoClips, got )r2   r	   Ú	TypeErrorÚtyperI   rJ   )r!   rI   rJ   s      r#   r$   zUniformClipSampler.__init__u   ó7   € Ü˜+¤zÔ2ÜÐXÔY]Ð^iÓYjÐXkÐlÓmÐmØ&ˆÔØ#6ˆÕ r%   c                 ó¶  — g }d}| j                   j                  D ]|  }t        |«      }|dk(  rŒt        j                  |||z   dz
  | j
                  ¬«      j                  «       j                  t        j                  «      }||z  }|j                  |«       Œ~ t        t        t        t           t        j                  |«      j                  «       «      «      S )Nr   r@   )Ústeps)rI   Úclipsr   r)   ÚlinspacerJ   ÚfloorÚtoÚint64Úappendr3   r   r.   r   Úcatr-   )r!   ÚidxsÚsÚcÚlengthÚsampleds         r#   r9   zUniformClipSampler.__iter__{   s³   € ØˆØˆà×!Ñ!×'Ñ'ò 	!ˆAÜ˜“VˆFØ˜Š{àä—n‘n Q¨¨F©
°Q©¸d×>VÑ>VÔW×]Ñ]Ó_×bÑbÔch×cnÑcnÓoˆGØ�‰KˆAØ�K‰K˜Õ ð	!ô ”Dœœc™¤E§I¡I¨d£O×$:Ñ$:Ó$<Ó=Ó>Ð>r%   c                 óT   ‡ — t        ˆ fd„‰ j                  j                  D «       «      S )Nc              3   óT   •K  — | ]  }t        |«      d kD  sŒ‰j                  –— Œ! y­w)r   N)r   rJ   ©Ú.0r[   r!   s     €r#   ú	<genexpr>z-UniformClipSampler.__len__.<locals>.<genexpr>‹   s#   øè ø€ ÒZ°ÌsÐSTËvÐXYËz�4×+Õ+ÑZùs   ƒ(—(©ÚsumrI   rR   r<   s   `r#   r=   zUniformClipSampler.__len__Š   s    ø€ ÜÓZ°T×5EÑ5E×5KÑ5KÔZÓZÐZr%   ©
rA   rB   rC   rD   r	   r   r$   r   r9   r=   rF   r%   r#   rH   rH   j   s?   „ ñð7 Jð 7ÀSð 7ÈTó 7ð?˜( 3™-ó ?ð[˜ô [r%   rH   c                   óB   — 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	y)	Ú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
    rI   Úmax_clips_per_videor   Nc                 ón   — t        |t        «      st        dt        |«      › �«      ‚|| _        || _        y rL   )r2   r	   rM   rN   rI   rh   )r!   rI   rh   s      r#   r$   zRandomClipSampler.__init__—   rO   r%   c                 ó‚  — g }d}| j                   j                  D ]T  }t        |«      }t        || j                  «      }t        j                  |«      d | |z   }||z  }|j                  |«       ŒV t        j                  |«      }t        j                  t        |«      «      }t        ||   j                  «       «      S )Nr   )rI   rR   r   Úminrh   r)   r,   rW   rX   r3   r-   )	r!   rY   rZ   r[   r\   Úsizer]   Úidxs_Úperms	            r#   r9   zRandomClipSampler.__iter__�   sª   € ØˆØˆà×!Ñ!×'Ñ'ò 	!ˆAÜ˜“VˆFÜ�v˜t×7Ñ7Ó8ˆDÜ—n‘n VÓ,¨U¨dÐ3°aÑ7ˆGØ�‰KˆAØ�K‰K˜Õ ð	!ô —	‘	˜$“ˆä�~‰~œc %›jÓ)ˆÜ�E˜$‘K×&Ñ&Ó(Ó)Ð)r%   c                 óT   ‡ — t        ˆ fd„‰ j                  j                  D «       «      S )Nc              3   ó\   •K  — | ]#  }t        t        |«      ‰j                  «      –— Œ% y ­wr;   )rk   r   rh   r`   s     €r#   rb   z,RandomClipSampler.__len__.<locals>.<genexpr>­   s"   øè ø€ ÒY¸Q”3”s˜1“v˜t×7Ñ7×8ÑYùs   ƒ),rc   r<   s   `r#   r=   zRandomClipSampler.__len__¬   s    ø€ ÜÓYÀ$×BRÑBR×BXÑBXÔYÓYÐYr%   re   rF   r%   r#   rg   rg   Ž   s?   „ ñð7 Jð 7ÀSð 7ÈTó 7ð*˜( 3™-ó *ðZ˜ô Zr%   rg   )r   Úcollections.abcr   r   Útypingr   r   r   r)   Útorch.distributedÚdistributedr   Útorch.utils.datar   Ú torchvision.datasets.video_utilsr	   r   rH   rg   rF   r%   r#   ú<module>rw      sI   ðÛ ß +ß (Ñ (ã Ý  Ý $Ý 7ô\˜ô \ô~![˜ô ![ôHZ˜õ Zr%   