
    x-j                        d dl mZ d dlmZmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZ erd dlmZ d dlmZ d d	lmZ 	 	 	 dddZ	 dddZ	 	 	 d d!dZdS )"    )annotations)TYPE_CHECKINGAnyN)stream)_get_global_group_warn_cur_rank_not_in_group)convert_tensor_to_object)Tensor)task)GroupTtensorr
   srcintgroupGroup | Nonesync_opboolreturnr   c                4    t          j        | |||d          S )a  
    Receive a tensor to the sender.

    Args:
        tensor (Tensor): The tensor to receive. Its data type
            should be float16, float32, float64, int32, int64, int8, uint8, bool or bfloat16.
        src (int): The source rank id.
        group (Group, optional): The group instance return by new_group or None for global default group. Default: None.
        sync_op (bool, optional): Whether this op is a sync op. The default value is True.

    Returns:
        Return a task object.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle
            >>> import paddle.distributed as dist

            >>> dist.init_parallel_env()
            >>> if dist.get_rank() == 0:
            ...     data = paddle.to_tensor([7, 8, 9])
            ...     dist.send(data, dst=1)
            >>> else:
            ...     data = paddle.to_tensor([1, 2, 3])
            ...     dist.recv(data, src=0)
            >>> print(data)
            >>> # [7, 8, 9] (2 GPUs)
    F)r   r   r   use_calc_stream)r   recv)r   r   r   r   s       e/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/distributed/communication/recv.pyr   r   #   s)    H ;Cugu       
int | Nonec                (    t          | ||d          S )aG  
    Receive a tensor to the sender.

    Args:
        tensor (Tensor): The Tensor to receive. Its data type
            should be float16, float32, float64, int32, int64, int8, uint8, bool or bfloat16.
        src (int): The source rank id.
        group (Group, optional): The group instance return by new_group or None for global default group. Default: None.

    Returns:
        Return a task object.

    Warning:
        This API only supports the dygraph mode.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle
            >>> import paddle.distributed as dist

            >>> dist.init_parallel_env()
            >>> if dist.get_rank() == 0:
            ...     data = paddle.to_tensor([7, 8, 9])
            ...     task = dist.isend(data, dst=1)
            >>> else:
            ...     data = paddle.to_tensor([1, 2, 3])
            ...     task = dist.irecv(data, src=0)
            >>> task.wait()  # type: ignore[union-attr]
            >>> print(data)
            >>> # [7, 8, 9] (2 GPUs)
    F)r   )r   )r   r   r   s      r   irecvr   L   s    H UE2222r   object_list	list[Any]src_in_groupc                   | t          |           dk    rt          d          |t                      n|}t          |          rdS |'|t          d          |                    |          }n|dn|}t          j        t          |           fd          }t          |||           t          j        |          	                                }t          j        |ft
          j
                  }t          |||           d}t          |          D ]>\  }}	|		                                }	||||	z            }
t          |
|	          | |<   ||	z  }?dS )a}  
    Receive a list of Python objects from the sender.

    Args:
        object_list (list): The list to store received objects. Must be pre-allocated with correct size.
        src (int, optional): The source rank id. Default: 0.
        group (Group, optional): The group instance return by new_group or None for global default group. Default: None.
        src_in_group (int, optional): The source rank within the group. Cannot be specified together with src. Default: None.

    Returns:
        This function does not return any value.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle
            >>> import paddle.distributed as dist

            >>> dist.init_parallel_env()
            >>> if dist.get_rank() == 0:
            ...     data = ["hello", {"key": 100}, [1, 2, 3]]
            ...     dist.send_object_list(data, dst=1)
            >>> else:
            ...     data = [None] * 3  # type: ignore
            ...     dist.recv_object_list(data, src=0)
            >>> print(data)
            >>> # ["hello", {"key": 100}, [1, 2, 3]] (2 GPUs)
    Nr   z#object_list cannot be None or emptyz7Cannot specify both 'src' and 'src_in_group' arguments.int64)dtype)r   r   )len
ValueErrorr   r   get_global_rankpaddleemptyr   sumitemuint8	enumerater	   )r   r   r   r   object_sizes_tensor
total_sizeobject_tensoroffsetiobj_sizeobj_views              r   recv_object_listr3   s   s   F c+..!33>???#(=eE"5)) ?I   ##L11;aaC ,K(8(8':'JJJ	#U3333/005577JL*flCCCMCu----F !455  8==?? &8*;!;<1(HEEA(	 r   )r   NT)
r   r
   r   r   r   r   r   r   r   r   )NN)r   r
   r   r   r   r   r   r   )NNN)r   r   r   r   r   r   r   r   )
__future__r   typingr   r   r&    paddle.distributed.communicationr   &paddle.distributed.communication.groupr   r   4paddle.distributed.communication.serialization_utilsr	   r
   paddle.base.corer   r   r   r   r3    r   r   <module>r;      sF   # " " " " " % % % % % % % %  3 3 3 3 3 3              =%%%%%%<<<<<<
 	& & & & &T CG$3 $3 $3 $3 $3R #	? ? ? ? ? ? ?r   