
    Αi0                        S SK Jr  S SKJr  S SK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
KJr  / r   S             SS jjr   S             SS jjrg)    )annotations)TYPE_CHECKINGN)_C_ops)check_variable_and_dtype)Variable)LayerHelper)in_dynamic_or_pir_mode)Sequence)Tensorc           	     .   Ub  Ub  SOSn[        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$ )a  

Reindex Graph API.

This API is mainly used in Graph Learning domain, which should be used
in conjunction with `paddle.geometric.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.

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].
Then after graph_reindex, we will have 3 different outputs: reindex_src: [3, 4, 0, 5, 6, 7, 6], reindex_dst: [0, 0, 1, 1, 1, 2, 2]
and out_nodes: [0, 1, 2, 8, 9, 4, 7, 6]. We can see that the numbers in `reindex_src` and `reindex_dst` is the corresponding index
of nodes in `out_nodes`.

Note:
    The number in x should be unique, otherwise it would cause potential errors. We will reindex all the nodes from 0.

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. Only useful for gpu version. Default is None.
    index_buffer (Tensor, optional): Index buffer for hashtable. The data type should be int32,
                                and should be filled with -1. Only useful for gpu version.
                                `value_buffer` and `index_buffer` should be both not None
                                if you want to speed up by using hashtable buffer. Default is None.
    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 = [8, 9, 0, 4, 7, 6, 7]
        >>> count = [2, 3, 2]
        >>> x = paddle.to_tensor(x, dtype="int64")
        >>> neighbors = paddle.to_tensor(neighbors, dtype="int64")
        >>> count = paddle.to_tensor(count, dtype="int32")
        >>> reindex_src, reindex_dst, out_nodes = paddle.geometric.reindex_graph(x, neighbors, count)
        >>> print(reindex_src.numpy())
        [3 4 0 5 6 7 6]
        >>> print(reindex_dst.numpy())
        [0 0 1 1 1 2 2]
        >>> print(out_nodes.numpy())
        [0 1 2 8 9 4 7 6]

NTF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)reindex_graph)	r	   r   r!   r   r   locals"create_variable_for_type_inferencer   	append_opx	neighborscountvalue_bufferindex_buffernameuse_buffer_hashtablereindex_srcreindex_dst	out_nodeshelpers              X/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/geometric/reindex.pyr!   r!   "   sT   L (\-E5  .4.B.B/
+) 22Q%7I; 2O UGgH +g	
 	!+g	
 5FH5F;;!'';JK;;!'';JK999HI
"/C|/C|
 '&"
   Y..    c           	        Ub  Ub  SOSn[        5       (       aK  [        R                  " USS9n[        R                  " USS9n[        R                  " U UUUU5      u  pxn	XxU	4$ [        U[        5      (       a  U/n[        U[        5      (       a  U/n[        R                  " USS9n[        R                  " USS9n[        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	[        R                  " USS9n[        R                  " US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$ )aU  

Reindex HeterGraph API.

This API is mainly used in Graph Learning domain, which should be used
in conjunction with `paddle.geometric.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.

Take input nodes x = [0, 1, 2] as an example. For graph A, suppose 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]. For graph B,
suppose we have neighbors = [0, 2, 3, 5, 1], and count = [1, 3, 1], then we know that the neighbors of 0 is [0], the neighbors of 1 is [2, 3, 5],
and the neighbors of 3 is [1]. We will get following outputs: reindex_src: [3, 4, 0, 5, 6, 7, 6, 0, 2, 8, 9, 1], reindex_dst: [0, 0, 1, 1, 1, 2, 2, 0, 1, 1, 1, 2]
and out_nodes: [0, 1, 2, 8, 9, 4, 7, 6, 3, 5].

Note:
    The number in x should be unique, otherwise it would cause potential errors. We support multi-edge-types neighbors reindexing in reindex_heter_graph api. We will reindex all the nodes from 0.

Args:
    x (Tensor): The input nodes which we sample neighbors for. The available
                data type is int32, int64.
    neighbors (list|tuple): The neighbors of the input nodes `x` from different graphs.
                            The data type should be the same with `x`.
    count (list|tuple): The neighbor counts of the input nodes `x` from different graphs.
                        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. Only useful for gpu version. Default is None.
    index_buffer (Tensor, optional): Index buffer for hashtable. The data type should be int32,
                                and should be filled with -1. Only useful for gpu version.
                                `value_buffer` and `index_buffer` should be both not None
                                if you want to speed up by using hashtable buffer. Default is None.
    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_a = [8, 9, 0, 4, 7, 6, 7]
        >>> count_a = [2, 3, 2]
        >>> x = paddle.to_tensor(x, dtype="int64")
        >>> neighbors_a = paddle.to_tensor(neighbors_a, dtype="int64")
        >>> count_a = paddle.to_tensor(count_a, dtype="int32")
        >>> neighbors_b = [0, 2, 3, 5, 1]
        >>> count_b = [1, 3, 1]
        >>> neighbors_b = paddle.to_tensor(neighbors_b, dtype="int64")
        >>> count_b = paddle.to_tensor(count_b, dtype="int32")
        >>> neighbors = [neighbors_a, neighbors_b]
        >>> count = [count_a, count_b]
        >>> reindex_src, reindex_dst, out_nodes = paddle.geometric.reindex_heter_graph(x, neighbors, count)
        >>> print(reindex_src.numpy())
        [3 4 0 5 6 7 6 0 2 8 9 1]
        >>> print(reindex_dst.numpy())
        [0 0 1 1 1 2 2 0 1 1 1 2]
        >>> print(out_nodes.numpy())
        [0 1 2 8 9 4 7 6 3 5]

NTFr   )axisr   r   heter_graph_reindexr   r   r   r   r   r   r   r   r   r   )reindex_heter_graph)r	   paddleconcatr   r!   
isinstancer   r   r   r"   r#   r   r$   r%   s              r1   r6   r6      s   \ (\-E5  MM)!4	e!,.4.B.B/
+) 22)X&&K	%""ia0IMM%a(EQ%79NO; 2O UGgH +g	
 	!+g	
 ;&(;F;;!'';JK;;!'';JK999HIia0IMM%a(E
"/C|/C|
 '&"
   Y..r2   )NNN)r&   r   r'   r   r(   r   r)   Tensor | Noner*   r:   r+   
str | Nonereturntuple[Tensor, Tensor, Tensor])r&   r   r'   Sequence[Tensor]r(   r>   r)   r:   r*   r:   r+   r;   r<   r=   )
__future__r   typingr   r7   r   paddle.base.data_feederr   paddle.base.frameworkr   paddle.base.layer_helperr   paddle.frameworkr	   collections.abcr
   r   __all__r!   r6    r2   r1   <module>rH      s    #     < * 0 3(
 #'"&t/t/t/ t/  	t/
  t/ t/ #t/v #'"&H/H/H/ H/  	H/
  H/ H/ #H/r2   