
    ϑiT                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  \(       a  S SKJr  \" S	S
SSS9    S               SS jj5       rg)    )annotations)TYPE_CHECKING)_C_ops)check_variable_and_dtype)LayerHelper)in_dynamic_or_pir_mode)
deprecated)Tensorz2.4.0zpaddle.geometric.reindex_graph   z7paddle.incubate.graph_reindex will be removed in future)since	update_tolevelreasonNc           	     J   U(       a  Ub  Uc  [        S5      e[        5       (       a!  [        R                  " U UUUU5      u  pxn	XxU	4$ [	        U SSS5        [	        USSS5        [	        USSS5        U(       a  [	        US	SS5        [	        US
SS5        [        S0 [        5       D6n
U
R                  U R                  S9nU
R                  U R                  S9nU
R                  U R                  S9n	U
R                  SU UUU(       a  UOSU(       a  UOSS.UUU	S.S9  XxU	4$ )aq  

Graph Reindex API.

This API is mainly used in Graph Learning domain, which should be used
in conjunction with `graph_sample_neighbors` API. And the main purpose
is to reindex the ids information of the input nodes, and return the
corresponding graph edges after reindex.

Notes:
    The number in x should be unique, otherwise it would cause potential errors.
    Besides, we also support multi-edge-types neighbors reindexing. If we have different
    edge_type neighbors for x, we should concatenate all the neighbors and count of x.
    We will reindex all the nodes from 0.

Take input nodes x = [0, 1, 2] as an example.
If we have neighbors = [8, 9, 0, 4, 7, 6, 7], and count = [2, 3, 2],
then we know that the neighbors of 0 is [8, 9], the neighbors of 1
is [0, 4, 7], and the neighbors of 2 is [6, 7].

Args:
    x (Tensor): The input nodes which we sample neighbors for. The available
                data type is int32, int64.
    neighbors (Tensor): The neighbors of the input nodes `x`. The data type
                        should be the same with `x`.
    count (Tensor): The neighbor count of the input nodes `x`. And the
                    data type should be int32.
    value_buffer (Tensor, optional): Value buffer for hashtable. The data type should
                                be int32, and should be filled with -1. Default is None.
    index_buffer (Tensor, optional): Index buffer for hashtable. The data type should
                                be int32, and should be filled with -1. Default is None.
    flag_buffer_hashtable (bool, optional): Whether to use buffer for hashtable to speed up.
                                  Default is False. Only useful for gpu version currently.
    name (str, optional): Name for the operation (optional, default is None).
                          For more information, please refer to :ref:`api_guide_Name`.

Returns:
    - reindex_src (Tensor), The source node index of graph edges after reindex.
    - reindex_dst (Tensor), The destination node index of graph edges after reindex.
    - out_nodes (Tensor), The index of unique input nodes and neighbors before reindex,
      where we put the input nodes `x` in the front, and put neighbor
      nodes in the back.

Examples:
    .. code-block:: python

        >>> import paddle

        >>> x = [0, 1, 2]
        >>> neighbors_e1 = [8, 9, 0, 4, 7, 6, 7]
        >>> count_e1 = [2, 3, 2]
        >>> x = paddle.to_tensor(x, dtype="int64")
        >>> neighbors_e1 = paddle.to_tensor(neighbors_e1, dtype="int64")
        >>> count_e1 = paddle.to_tensor(count_e1, dtype="int32")

        >>> reindex_src, reindex_dst, out_nodes = paddle.incubate.graph_reindex(  # type: ignore[operator]
        ...     x,
        ...     neighbors_e1,
        ...     count_e1,
        ... )
        >>> print(reindex_src)
        Tensor(shape=[7], dtype=int64, place=Place(cpu), stop_gradient=True,
        [3, 4, 0, 5, 6, 7, 6])
        >>> print(reindex_dst)
        Tensor(shape=[7], dtype=int64, place=Place(cpu), stop_gradient=True,
        [0, 0, 1, 1, 1, 2, 2])
        >>> print(out_nodes)
        Tensor(shape=[8], dtype=int64, place=Place(cpu), stop_gradient=True,
        [0, 1, 2, 8, 9, 4, 7, 6])

        >>> neighbors_e2 = [0, 2, 3, 5, 1]
        >>> count_e2 = [1, 3, 1]
        >>> neighbors_e2 = paddle.to_tensor(neighbors_e2, dtype="int64")
        >>> count_e2 = paddle.to_tensor(count_e2, dtype="int32")

        >>> neighbors = paddle.concat([neighbors_e1, neighbors_e2])
        >>> count = paddle.concat([count_e1, count_e2])
        >>> reindex_src, reindex_dst, out_nodes = paddle.incubate.graph_reindex(  # type: ignore[operator]
        ...     x,
        ...     neighbors,
        ...     count,
        ... )
        >>> print(reindex_src)
        Tensor(shape=[12], dtype=int64, place=Place(cpu), stop_gradient=True,
        [3, 4, 0, 5, 6, 7, 6, 0, 2, 8, 9, 1])
        >>> print(reindex_dst)
        Tensor(shape=[12], dtype=int64, place=Place(cpu), stop_gradient=True,
        [0, 0, 1, 1, 1, 2, 2, 0, 1, 1, 1, 2])
        >>> print(out_nodes)
        Tensor(shape=[10], dtype=int64, place=Place(cpu), stop_gradient=True,
        [0, 1, 2, 8, 9, 4, 7, 6, 3, 5])

NzW`value_buffer` and `index_buffer` should notbe None if `flag_buffer_hashtable` is True.X)int32int64graph_reindex	NeighborsCountr   HashTable_ValueHashTable_Index)dtype)r   r   r   r   r   )Reindex_SrcReindex_Dst	Out_Nodes)typeinputsoutputs)r   )

ValueErrorr   r   reindex_graphr   r   locals"create_variable_for_type_inferencer   	append_op)x	neighborscountvalue_bufferindex_bufferflag_buffer_hashtablenamereindex_srcreindex_dst	out_nodeshelpers              g/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/incubate/operators/graph_reindex.pyr   r      s`   X <#7> 
 .4.B.B/
+) 22Q%7I; 2O UGgH +g	
 	!+g	
 5FH5F;;!'';JK;;!'';JK999HI
"/D|$/D|$
 '&"
   Y..    )NNFN)r%   r
   r&   r
   r'   r
   r(   Tensor | Noner)   r2   r*   boolr+   z
str | Nonereturnztuple[Tensor, Tensor, Tensor])
__future__r   typingr   paddler   paddle.base.data_feederr   paddle.base.layer_helperr   paddle.frameworkr   paddle.utilsr	   r
   r    r1   r0   <module>r=      s    #    < 0 3 # 
.
D	 #'"&"'X/X/X/ X/  	X/
  X/  X/ X/ #X/X/r1   