Ë
    g^(ho;  ã                   ó†  — d dl Z d dlmZ d dlmZ d dlmZmZ ej                  fd„Z	d ej                  fd„Z
d ej                  fd„Zej                  ej                  fd„Zej                  ej                  fd„Zej                  fd	„Zej                  fd
„Zej                  fd„Zddej                  fd„Zej                  ej                  fd„Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d „ d!e«      Zy)"é    N)ÚFunction)ÚgroupÚReduceOpc                 ó0   — t         j                  ||| «      S )a»  
    Broadcasts the tensor to the whole group.

    ``tensor`` must have the same number of elements in all processes
    participating in the collective.

    Arguments:
        tensor (Tensor): Data to be sent if ``src`` is the rank of current
            process.
        src (int): Source rank.
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        Tensor: Received tensor from the broadcast op.

    )Ú
_BroadcastÚapply)ÚtensorÚsrcr   s      ú]/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/distributed/nn/functional.pyÚ	broadcastr      s   € ô" ×Ñ˜C ¨Ó/Ð/ó    c                 ó0   — t         j                  ||| «      S )aT  
    Gathers a list of tensors in a single process.

    Arguments:
        tensor (Tensor): Input tensor.
        dst (int, optional): Destination rank (default is 0).
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        tuple[Tensor]: List of appropriately-sized tensors with the gathered data.
    )Ú_Gatherr   )r	   Údstr   s      r   Úgatherr       s   € ô �=‰=˜˜e VÓ,Ð,r   c                 ó0   — t        j                  ||g| ¢­Ž S )aö  
    Scatters a list of tensors to all processes in a group.

    Each process will receive exactly one tensor and store its data in the
    ``tensor`` argument.

    Arguments:
        tensors (list[Tensor]): List of tensors to scatter on the source rank.
            Receivers must pass ``None`.
        src (int, optional): Source rank (default is 0).
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        Tensor: Output tensor from the scatter operation.

    )Ú_Scatterr   )Útensorsr
   r   s      r   Úscatterr   /   s   € ô" �>‰>˜#˜uÐ/ wÒ/Ð/r   c                 ó2   — t         j                  |||| «      S )a  
    Reduces the tensor data across all machines.

    Only the process with rank ``dst`` is going to receive the final result.

    Arguments:
        tensor (Tensor): Input of the collective.
        dst (int): Destination rank.
        op (optional): One of the values from
            ``torch.distributed.ReduceOp``
            enum.  Specifies an operation used for element-wise reductions.
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        Tensor: Output of the collective.

    )Ú_Reducer   )r	   r   Úopr   s       r   Úreducer   C   s   € ô$ �=‰=˜˜b %¨Ó0Ð0r   c                 ó2   — t        j                  ||| g|¢­Ž S )aõ  
    Reduces, then scatters a list of tensors to all processes in a group.

    Arguments:
        output (Tensor): Output tensor.
        input_list (list[Tensor]): List of tensors to reduce and scatter.
        op (optional): One of the values from
            ``torch.distributed.ReduceOp``
            enum.  Specifies an operation used for element-wise reductions.
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        Tensor: Output of the collective.

    )Ú_Reduce_Scatterr   )ÚoutputÚ
input_listr   r   s       r   Úreduce_scatterr   X   s   € ô  × Ñ   U¨FÐ@°ZÒ@Ð@r   c                 ó.   — t         j                  || «      S )a  
    Gathers tensors from the whole group in a list.

    Arguments:
        tensor (Tensor): Tensor to be broadcast from current process.
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        tuple([Tensor]): Output of the collective.

    )Ú
_AllGatherr   )r	   r   s     r   Ú
all_gatherr!   k   s   € ô ×Ñ˜E 6Ó*Ð*r   c                 ó0   — t         j                  | ||«      S )aâ  
    Single tensor all gather. Gathers a single tensor from all ranks, and puts them in a single output tensor.

    Args:
        output_tensor (Tensor): Output tensor. It should contain
            correctly-sized tensors to be used for output of the collective.
        input_tensor (Tensor): Tensor to be broadcast from current process.
        group (ProcessGroup, optional): The process group to work on. If None,
            the default process group will be used.

    Examples:
        >>> # All tensors below are of torch.int64 dtype.
        >>> # We have 2 process groups, 2 ranks.
        >>> # xdoctest: +SKIP("incorrect want text")
        >>> output_tensor = torch.zeros(2, dtype=torch.int64)
        >>> output_tensor
        [tensor([0, 0])] # Rank 0 and 1
        >>> tensor = torch.arange(1, dtype=torch.int64) + 1 + rank
        >>> tensor
        tensor([1]) # Rank 0
        tensor([2]) # Rank 1
        >>> dist.all_gather_base(output_tensor, tensor)
        >>> output_tensor
        tensor([1,2]) # Rank 0
        tensor([1,2]) # Rank 1

    .. warning::
        `_all_gather_base` is experimental and subject to change.
        It is the caller's responsibility to ensure the output_tensor
        is correctly sized.

    )Ú_AllGatherBaser   )Úoutput_tensorÚinput_tensorr   s      r   Ú_all_gather_baser&   z   s   € ôB ×Ñ ¨|¸UÓCÐCr   c                 ó0   — t        j                  || g|¢­Ž S )aÃ  
    Each process scatters list of input tensors to all processes in a group and return gathered list of tensors in output list.

    Arguments:
        output_tensor_list (list[Tensor]): list of tensors to gather one per rank.
        input_tensor_list (list[Tensor]): List of tensors to scatter one per rank.
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        tuple([Tensor]): Output of the collective.

    )Ú	_AlltoAllr   )Úoutput_tensor_listÚinput_tensor_listr   s      r   Ú
all_to_allr+   ž   s   € ô �?‰?˜5Ð"4ÐIÐ7HÒIÐIr   c                 ó4   — t         j                  || |||«      S )a  
    Each process splits input tensor and then scatters the split list to all processes in a group.

    Then concatenate the received tensors from all the processes in the group and return single output tensor.

    Arguments:
        output (Tensor): Gathered concatenated output tensor.
        input (Tensor): Input tensor to scatter.
        output_split_sizes: (list[Int], optional): Output split sizes for dim 0
            if specified None or empty, dim 0 of ``output`` tensor must divide
            equally by ``world_size``.
        input_split_sizes: (list[Int], optional): Input split sizes for dim 0
            if specified None or empty, dim 0 of ``input`` tensor must divide
            equally by ``world_size``.

    Returns:
        Tensor: Output of the collective.

    )Ú_AlltoAllSingler   )r   ÚinputÚoutput_split_sizesÚinput_split_sizesr   s        r   Úall_to_all_singler1   ®   s$   € ô4 × Ñ ØˆvÐ)Ð+<¸eóð r   c                 ó0   — t         j                  ||| «      S )a&  
    Reduces the tensor data across all machines in such a way that all get the final result.

    After the call the returned tensor is going to be bitwise
    identical in all processes.

    Arguments:
        tensor (Tensor): Input of the collective.
        op (optional): One of the values from
            ``torch.distributed.ReduceOp``
            enum.  Specifies an operation used for element-wise reductions.
        group (ProcessGroup, optional): The process group to work on.

    Returns:
        Tensor: Output of the collective

    )Ú
_AllReducer   )r	   r   r   s      r   Ú
all_reducer4   Í   s   € ô$ ×Ñ˜B  vÓ.Ð.r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r   c                 ó¨   — || _         || _        t        j                  |¬«      | _        |j                  «       }t        j                  |||¬«       |S ©N©r   )r
   r   ÚdistÚget_rankÚrankÚcloner   )Úctxr
   r   r	   s       r   Úforwardz_Broadcast.forwardã   sB   € àˆŒØˆŒ	Ü—=‘= uÔ-ˆŒð —‘“ˆÜ�‰�v˜s¨%Õ0Øˆr   c                 óÒ   — t         j                  | j                  t        j                  | j
                  |«      }| j                  | j                  k7  r|j                  «        d d |fS ©N)r   r   r
   r   ÚSUMr   r;   Úzero_)r=   Úgrad_outputÚgxs      r   Úbackwardz_Broadcast.backwardî   sH   € ä�]‰]˜3Ÿ7™7¤H§L¡L°#·)±)¸[ÓIˆØ�7‰7�c—h‘hÒØ�H‰HŒJØ�d˜BÐÐr   N©Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr>   rE   © r   r   r   r   â   s(   „ Øñó ðð ñ ó ñ r   r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r   c                 óˆ  — || _         || _        t        t        j                  |¬«      «      D �cg c]  }t        j                  |«      ‘Œ }}|j                  «       }t        j                  |¬«      |k(  r$t        j                  ||||¬«       t        |«      S t        j                  |d ||¬«       t        |«      S c c}w r7   )r   r   Úranger9   Úget_world_sizeÚtorchÚ
zeros_likeÚ
contiguousr:   r   Útuple)r=   r   r   r	   ÚiÚtensor_lists         r   r>   z_Gather.forward÷   s«   € àˆŒØˆŒ	ô /4´D×4GÑ4GÈeÔ4TÓ.Uö
Ø)*ŒE×Ñ˜VÕ$ð
ˆð 
ð ×"Ñ"Ó$ˆÜ�=‰=˜uÔ%¨Ò,Ü�K‰K˜ ¨S¸Õ>ô �[Ó!Ð!ô �K‰K˜  c°Õ7Ü�[Ó!Ð!ùò
s   °B?c                 ó`   — dt        j                  | j                  | j                  g|¢­Ž fz   S ©N©NN)r   r   r   r   )r=   Úgrad_outputss     r   rE   z_Gather.backward
  s(   € àœxŸ~™~¨c¯g©g°s·y±yÐPÀ<ÒPÐRÑRÐRr   NrF   rK   r   r   r   r   ö   s*   „ Øñ"ó ð"ð$ ñSó ñSr   r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r   c                 ó,  ‡— || _         || _        t        ˆfd„‰D «       «      sJ ‚t        j                  ‰d   «      }t        j                  |¬«      |k(  r$t        j                  |t        ‰«      ||¬«       |S t        j                  |d ||¬«       |S )Nc              3   óf   •K  — | ](  }|j                  «       ‰d    j                  «       k(  –— Œ* y­w)r   N)Úsize)Ú.0Útr   s     €r   ú	<genexpr>z#_Scatter.forward.<locals>.<genexpr>  s'   øè ø€ ÒB°Q�1—6‘6“8˜w q™zŸ™Ó0Õ0ÑBùs   ƒ.1r   r8   )	r
   r   ÚallrP   rQ   r9   r:   r   Úlist)r=   r
   r   r   r   s      ` r   r>   z_Scatter.forward  s€   ø€ àˆŒØˆŒ	ÜÓB¸'ÔBÔBÐBÐBÜ×!Ñ! '¨!¡*Ó-ˆÜ�=‰=˜uÔ%¨Ò,Ü�L‰L˜¤ g£°¸5ÕAð ˆô �L‰L˜  s°%Õ8Øˆr   c                 ó^   — dt         j                  | j                  | j                  |«      z   S rW   )r   r   r
   r   ©r=   rC   s     r   rE   z_Scatter.backward  s"   € àœgŸm™m¨C¯G©G°S·Y±YÀÓLÑLÐLr   NrF   rK   r   r   r   r     s*   „ Øñ	ó ð	ð ñMó ñMr   r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r   c                 ót   — || _         || _        |j                  «       }t        j                  ||||¬«       |S )N©r   r   )r
   r   r<   r9   r   )r=   r
   r   r   r	   s        r   r>   z_Reduce.forward"  s2   € àˆŒØˆŒ	Ø—‘“ˆÜ�‰�F˜C B¨eÕ4Øˆr   c                 ó`   — dt         j                  | j                  | j                  |«      fz   S ©N)NNN)r   r   r
   r   rd   s     r   rE   z_Reduce.backward*  s'   € à!¤Z×%5Ñ%5°c·g±g¸s¿y¹yÈ+Ó%VÐ$XÑXÐXr   NrF   rK   r   r   r   r   !  s*   „ Øñó ðð ñYó ñYr   r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r   c                 óœ   — || _         |j                  «       }t        d„ |D «       «      }t        j                  |t        |«      ||¬«       |S )Nc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr@   ©rR   ©r^   r_   s     r   r`   z*_Reduce_Scatter.forward.<locals>.<genexpr>5  s   è ø€ Ò!L°Q !§,¡,§.Ñ!Lùó   ‚rg   )r   rR   rS   r9   r   rb   )r=   r   r   r	   r*   s        r   r>   z_Reduce_Scatter.forward0  sH   € àˆŒ	à×"Ñ"Ó$ˆÜ!Ñ!LÐ:KÔ!LÓLÐÜ×Ñ˜F¤DÐ):Ó$;ÀÈ%ÕPØˆr   c                 óH   — dt         j                  | j                  |«      z   S ri   )r    r   r   rd   s     r   rE   z_Reduce_Scatter.backward9  s   € à!¤J×$4Ñ$4°S·Y±YÀÓ$LÑLÐLr   NrF   rK   r   r   r   r   /  s*   „ Øñó ðð ñMó ñMr   r   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r    c                 óþ   — |j                  «       }|| _        t        t        j                  |¬«      «      D �cg c]  }t        j                  |«      ‘Œ }}t        j                  |||¬«       t        |«      S c c}w r7   )	rR   r   rN   r9   rO   rP   Ú
empty_liker!   rS   )r=   r   r	   Ú_Úout_tensor_lists        r   r>   z_AllGather.forward?  sp   € ð ×"Ñ"Ó$ˆàˆŒ	ä.3´D×4GÑ4GÈeÔ4TÓ.Uö
Ø)*ŒE×Ñ˜VÕ$ð
ˆð 
ô 	�‰˜¨°uÕ=Ü�_Ó%Ð%ùò
s   ¹A:c                 ó:  — t        j                  | j                  ¬«      t         j                  j                  u rlt        j
                  | j                  ¬«      }t        j                  ||   «      }t        j                  t        j                  | j                  |g|¢­Ž }d |fS |D �cg c]  }t        j                  |«      ‘Œ }}t        j                  | j                  |g|¢­Ž }t        j                  t        j                  |«      d¬«      }d |fS c c}w )Nr8   r   )Údim)r9   Úget_backendr   ÚBackendÚNCCLr:   rP   rs   r   r   r   rA   r(   ÚsumÚstack)r=   rY   r;   rD   r	   rU   Úgxss          r   rE   z_AllGather.backwardL  sÛ   € ä×Ñ #§)¡)Ô,´·±×0AÑ0AÑAÜ—=‘= s§y¡yÔ1ˆDÜ×!Ñ! ,¨tÑ"4Ó5ˆBÜ ×&Ñ&¤x§|¡|°S·Y±YÀÐRÀ\ÒRˆBð �bˆzÐð COÖO¸œ5×+Ñ+¨FÕ3ÐOˆKÐOÜ—/‘/ #§)¡)¨[ÐH¸<ÒHˆCÜ—‘œ5Ÿ;™; sÓ+°Ô3ˆBØ�bˆzÐùò Ps   Â+DNrF   rK   r   r   r    r    >  s(   „ Øñ
&ó ð
&ð ñó ñr   r    c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r#   c                 ó`   — || _         t        j                  ||j                  «       |¬«       |S r7   )r   r9   r&   rR   )r=   r$   r%   r   s       r   r>   z_AllGatherBase.forward\  s*   € àˆŒ	Ü×Ñ˜m¨\×-DÑ-DÓ-FÈeÕTØÐr   c                 óL  — t        j                  | j                  ¬«      t         j                  j                  u rÛt        j
                  | j                  ¬«      }t        |j                  «       «      }|d   |z  dk7  rt        d|› d|› �«      ‚|d   t        j
                  | j                  ¬«      z  |d<   t        j                  ||j                  |j                  ¬«      }t        j                  ||t        j                  | j                  «       nt        d«      ‚d |d fS )Nr8   r   zTensor with dimensions: z8 does not have first dimension divisible by world_size: ©ÚdeviceÚdtypezBackend not supported!)r9   rx   r   ry   rz   rO   rb   r]   ÚRuntimeErrorrP   Úemptyr‚   rƒ   Ú_reduce_scatter_baser   rA   )r=   rC   Ú
world_sizeÚout_sizerD   s        r   rE   z_AllGatherBase.backwardb  sû   € ä×Ñ #§)¡)Ô,´·±×0AÑ0AÑAÜ×,Ñ,°3·9±9Ô=ˆJÜ˜K×,Ñ,Ó.Ó/ˆHØ˜‰{˜ZÑ'¨1Ò,Ü"Ø.¨x¨jð 9IØISÈðVóð ð # 1™+¬×)<Ñ)<À3Ç9Á9Ô)MÑMˆH�Q‰KÜ—‘Ø ×!3Ñ!3¸;×;LÑ;LôˆBô ×%Ñ% b¨+´x·|±|ÀSÇYÁYÕOäÐ7Ó8Ð8Ø�b˜$ÐÐr   NrF   rK   r   r   r#   r#   [  s(   „ Øñó ðð
 ñ ó ñ r   r#   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r(   c                 ób  — || _         t        t        j                  |¬«      «      D �cg c]  }||   j	                  «       ‘Œ c}| _        t        j                  |¬«      }t        d„ |D «       «      }t        j                  |¬«      t        j                  j                  u r]t        t        j                  |¬«      «      D ]0  }d }||k(  rt        |«      }t        j                  ||   |||¬«       Œ2 t        |«      S t        j                  |t        |«      |¬«       t        |«      S c c}w )Nr8   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr@   rm   rn   s     r   r`   z$_AlltoAll.forward.<locals>.<genexpr>~  s   è ø€ Ò8¨1˜Ÿ™ŸÑ8ùro   )r   rN   r9   rO   r]   Úinput_tensor_size_listr:   rS   rx   ry   ÚGLOOrb   r   r+   )r=   r   ru   r   rT   Úmy_rankÚto_sends          r   r>   z_AlltoAll.forwardw  s   € àˆŒ	ä',¬T×-@Ñ-@ÀuÔ-MÓ'Nö&
Ø"#ˆG�A‰J�O‰OÕò&
ˆÔ"ô —-‘- eÔ,ˆÜÑ8°Ô8Ó8ˆä×Ñ %Ô(¬D¯L©L×,=Ñ,=Ñ=Üœ4×.Ñ.°UÔ;Ó<ò J�Ø�Ø˜’<Ü" 7›m�GÜ—‘˜_¨QÑ/°¸!À5ÖIð	Jô �_Ó%Ð%ô �O‰OØÜ�W“Øõô
 �_Ó%Ð%ùò%&
s   ©D,c           	      óæ   — | j                   D �cg c]4  }t        j                  ||d   j                  |d   j                  ¬«      ‘Œ6 }}dt        j                  | j                  |g|¢­Ž z   S c c}w )Nr   r�   rX   )rŒ   rP   r…   r‚   rƒ   r(   r   r   )r=   rY   r]   rU   s       r   rE   z_AlltoAll.backwardŽ  ss   € ð ×2Ñ2ö	
ð ô �K‰KØ˜\¨!™_×3Ñ3¸<È¹?×;PÑ;Pöð
ˆð 
ð œiŸo™o¨c¯i©i¸ÐTÀ|ÒTÑTÐTùò
s   �9A.NrF   rK   r   r   r(   r(   v  s*   „ Øñ&ó ð&ð, ñUó ñUr   r(   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r-   c                 óŽ   — || _         |j                  «       | _        || _        || _        t        j                  |||||¬«       |S )N)r/   r0   r   )r   r]   Ú
input_sizer/   r0   r9   r1   )r=   r   r   r/   r0   r.   s         r   r>   z_AlltoAllSingle.forwardš  sJ   € àˆŒ	ØŸ™›ˆŒØ!2ˆÔØ 2ˆÔÜ×ÑØØØ1Ø/Øõ	
ð ˆr   c           	      ó   — t        j                  | j                  |j                  |j                  ¬«      }dt
        j                  | j                  || j                  | j                  |j                  «       «      fz   S )Nr�   )NNNN)rP   r…   r“   r‚   rƒ   r-   r   r   r/   r0   rR   )r=   rC   r	   s      r   rE   z_AlltoAllSingle.backward©  sq   € ä—‘Ø�N‰N ;×#5Ñ#5¸[×=NÑ=Nô
ˆð (Ü×!Ñ!Ø—	‘	ØØ×&Ñ&Ø×%Ñ%Ø×&Ñ&Ó(óð+
ñ 
ð 	
r   NrF   rK   r   r   r-   r-   ™  s(   „ Øñó ðð ñ
ó ñ
r   r-   c                   ó,   — e Zd Zed„ «       Zed„ «       Zy)r3   c                 ó’   — || _         || _        |j                  t        j                  ¬«      }t        j                  |||¬«       |S )N)Úmemory_formatrg   )r   r   r<   rP   Úcontiguous_formatr9   r4   )r=   r   r   r	   s       r   r>   z_AllReduce.forwardº  s;   € àˆŒ	ØˆŒØ—‘¬E×,CÑ,C�ÓDˆÜ�‰˜ 2¨UÕ3Øˆr   c                 ó`   — dt         j                  | j                  | j                  |«      fz   S rW   )r3   r   r   r   rd   s     r   rE   z_AllReduce.backwardÂ  s'   € àœz×/Ñ/°·±¸¿	¹	À;ÓOÐQÑQÐQr   NrF   rK   r   r   r3   r3   ¹  s*   „ Øñó ðð ñRó ñRr   r3   )rP   Útorch.distributedÚdistributedr9   Útorch.autogradr   r   r   ÚWORLDr   r   r   rA   r   r   r!   r&   r+   r1   r4   r   r   r   r   r   r    r#   r(   r-   r3   rK   r   r   ú<module>rž      sF  ðã Ý  Ý #÷
 .ð "'§¡ó 0ð(  §¡ó -ð  %§+¡+ó 0ð( $Ÿ<™<¨u¯{©{ó 1ð* +3¯,©,¸e¿k¹kó Að& #Ÿ[™[ó +ð 9>¿¹ó !DðH =B¿K¹Kó Jð& ØØ
�+‰+óð> #Ÿ,™,¨e¯k©kó /ô* �ô  ô(Sˆhô Sô2Mˆxô Mô$Yˆhô YôM�hô Mô�ô ô: �Xô  ô6 U�ô  UôF
�hô 
ô@R�õ Rr   