§
    d˜ºhÐC  ã                   ó’  — d Z ddlZddlmZ g d¢Z ej        d¬¦  «        dd„¦   «         Z ej        d¬¦  «        dd„¦   «         Z ed	¦  «         ed
¦  «         ej        d¬¦  «        	 dd„¦   «         ¦   «         ¦   «         Z	 ed	¦  «         ed
¦  «         ej        d¬¦  «        	 dd„¦   «         ¦   «         ¦   «         Z
dd„ZdS )a{  Laplacian matrix of graphs.

All calculations here are done using the out-degree. For Laplacians using
in-degree, use `G.reverse(copy=False)` instead of `G` and take the transpose.

The `laplacian_matrix` function provides an unnormalized matrix,
while `normalized_laplacian_matrix`, `directed_laplacian_matrix`,
and `directed_combinatorial_laplacian_matrix` are all normalized.
é    N)Únot_implemented_for)Úlaplacian_matrixÚnormalized_laplacian_matrixÚdirected_laplacian_matrixÚ'directed_combinatorial_laplacian_matrixÚweight)Ú
edge_attrsc           	      ó  — ddl }|€t          | ¦  «        }t          j        | ||d¬¦  «        }|j        \  }}|j                             |j                             |                     d¬¦  «        d||d¬¦  «        ¦  «        }||z
  S )uÚ  Returns the Laplacian matrix of G.

    The graph Laplacian is the matrix L = D - A, where
    A is the adjacency matrix and D is the diagonal matrix of node degrees.

    Parameters
    ----------
    G : graph
       A NetworkX graph

    nodelist : list, optional
       The rows and columns are ordered according to the nodes in nodelist.
       If nodelist is None, then the ordering is produced by G.nodes().

    weight : string or None, optional (default='weight')
       The edge data key used to compute each value in the matrix.
       If None, then each edge has weight 1.

    Returns
    -------
    L : SciPy sparse array
      The Laplacian matrix of G.

    Notes
    -----
    For MultiGraph, the edges weights are summed.

    This returns an unnormalized matrix. For a normalized output,
    use `normalized_laplacian_matrix`, `directed_laplacian_matrix`,
    or `directed_combinatorial_laplacian_matrix`.

    This calculation uses the out-degree of the graph `G`. To use the
    in-degree for calculations instead, use `G.reverse(copy=False)` and
    take the transpose.

    See Also
    --------
    :func:`~networkx.convert_matrix.to_numpy_array`
    normalized_laplacian_matrix
    directed_laplacian_matrix
    directed_combinatorial_laplacian_matrix
    :func:`~networkx.linalg.spectrum.laplacian_spectrum`

    Examples
    --------
    For graphs with multiple connected components, L is permutation-similar
    to a block diagonal matrix where each block is the respective Laplacian
    matrix for each component.

    >>> G = nx.Graph([(1, 2), (2, 3), (4, 5)])
    >>> print(nx.laplacian_matrix(G).toarray())
    [[ 1 -1  0  0  0]
     [-1  2 -1  0  0]
     [ 0 -1  1  0  0]
     [ 0  0  0  1 -1]
     [ 0  0  0 -1  1]]

    >>> edges = [
    ...     (1, 2),
    ...     (2, 1),
    ...     (2, 4),
    ...     (4, 3),
    ...     (3, 4),
    ... ]
    >>> DiG = nx.DiGraph(edges)
    >>> print(nx.laplacian_matrix(DiG).toarray())
    [[ 1 -1  0  0]
     [-1  2 -1  0]
     [ 0  0  1 -1]
     [ 0  0 -1  1]]

    Notice that node 4 is represented by the third column and row. This is because
    by default the row/column order is the order of `G.nodes` (i.e. the node added
    order -- in the edgelist, 4 first appears in (2, 4), before node 3 in edge (4, 3).)
    To control the node order of the matrix, use the `nodelist` argument.

    >>> print(nx.laplacian_matrix(DiG, nodelist=[1, 2, 3, 4]).toarray())
    [[ 1 -1  0  0]
     [-1  2  0 -1]
     [ 0  0  1 -1]
     [ 0  0 -1  1]]

    This calculation uses the out-degree of the graph `G`. To use the
    in-degree for calculations instead, use `G.reverse(copy=False)` and
    take the transpose.

    >>> print(nx.laplacian_matrix(DiG.reverse(copy=False)).toarray().T)
    [[ 1 -1  0  0]
     [-1  1 -1  0]
     [ 0  0  2 -1]
     [ 0  0 -1  1]]

    References
    ----------
    .. [1] Langville, Amy N., and Carl D. Meyer. Googleâ€™s PageRank and Beyond:
       The Science of Search Engine Rankings. Princeton University Press, 2006.

    r   NÚcsr©Únodelistr   Úformaté   ©Úaxis©r   )	ÚscipyÚlistÚnxÚto_scipy_sparse_arrayÚshapeÚsparseÚ	csr_arrayÚspdiagsÚsum)ÚGr   r   ÚspÚAÚnÚmÚDs           úg/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/networkx/linalg/laplacianmatrix.pyr   r      s‹   € ðH ÐÐÐàÐÝ˜‘7”7ˆÝ
Ô  ¨X¸fÈUÐSÑSÔS€AØŒ7�D€A€qà
Œ	×Ò˜BœI×-Ò-¨a¯eªe¸¨e©m¬m¸QÀÀ1ÈUÐ-ÑSÔSÑTÔT€AØˆq‰5€Ló    c           	      óV  — ddl }ddl}|€t          | ¦  «        }t          j        | ||d¬¦  «        }|j        \  }}|                     d¬¦  «        }|j                             |j         	                    |d||d¬¦  «        ¦  «        }	|	|z
  }
| 
                    d¬	¦  «        5  d
|                     |¦  «        z  }ddd¦  «         n# 1 swxY w Y   d||                     |¦  «        <   |j                             |j         	                    |d||d¬¦  «        ¦  «        }||
|z  z  S )uê  Returns the normalized Laplacian matrix of G.

    The normalized graph Laplacian is the matrix

    .. math::

        N = D^{-1/2} L D^{-1/2}

    where `L` is the graph Laplacian and `D` is the diagonal matrix of
    node degrees [1]_.

    Parameters
    ----------
    G : graph
       A NetworkX graph

    nodelist : list, optional
       The rows and columns are ordered according to the nodes in nodelist.
       If nodelist is None, then the ordering is produced by G.nodes().

    weight : string or None, optional (default='weight')
       The edge data key used to compute each value in the matrix.
       If None, then each edge has weight 1.

    Returns
    -------
    N : SciPy sparse array
      The normalized Laplacian matrix of G.

    Notes
    -----
    For MultiGraph, the edges weights are summed.
    See :func:`to_numpy_array` for other options.

    If the Graph contains selfloops, D is defined as ``diag(sum(A, 1))``, where A is
    the adjacency matrix [2]_.

    This calculation uses the out-degree of the graph `G`. To use the
    in-degree for calculations instead, use `G.reverse(copy=False)` and
    take the transpose.

    For an unnormalized output, use `laplacian_matrix`.

    Examples
    --------

    >>> import numpy as np
    >>> edges = [
    ...     (1, 2),
    ...     (2, 1),
    ...     (2, 4),
    ...     (4, 3),
    ...     (3, 4),
    ... ]
    >>> DiG = nx.DiGraph(edges)
    >>> print(nx.normalized_laplacian_matrix(DiG).toarray())
    [[ 1.         -0.70710678  0.          0.        ]
     [-0.70710678  1.         -0.70710678  0.        ]
     [ 0.          0.          1.         -1.        ]
     [ 0.          0.         -1.          1.        ]]

    Notice that node 4 is represented by the third column and row. This is because
    by default the row/column order is the order of `G.nodes` (i.e. the node added
    order -- in the edgelist, 4 first appears in (2, 4), before node 3 in edge (4, 3).)
    To control the node order of the matrix, use the `nodelist` argument.

    >>> print(nx.normalized_laplacian_matrix(DiG, nodelist=[1, 2, 3, 4]).toarray())
    [[ 1.         -0.70710678  0.          0.        ]
     [-0.70710678  1.          0.         -0.70710678]
     [ 0.          0.          1.         -1.        ]
     [ 0.          0.         -1.          1.        ]]
    >>> G = nx.Graph(edges)
    >>> print(nx.normalized_laplacian_matrix(G).toarray())
    [[ 1.         -0.70710678  0.          0.        ]
     [-0.70710678  1.         -0.5         0.        ]
     [ 0.         -0.5         1.         -0.70710678]
     [ 0.          0.         -0.70710678  1.        ]]

    See Also
    --------
    laplacian_matrix
    normalized_laplacian_spectrum
    directed_laplacian_matrix
    directed_combinatorial_laplacian_matrix

    References
    ----------
    .. [1] Fan Chung-Graham, Spectral Graph Theory,
       CBMS Regional Conference Series in Mathematics, Number 92, 1997.
    .. [2] Steve Butler, Interlacing For Weighted Graphs Using The Normalized
       Laplacian, Electronic Journal of Linear Algebra, Volume 16, pp. 90-98,
       March 2007.
    .. [3] Langville, Amy N., and Carl D. Meyer. Googleâ€™s PageRank and Beyond:
       The Science of Search Engine Rankings. Princeton University Press, 2006.
    r   Nr   r   r   r   r   Úignore)Údivideç      ð?)Únumpyr   r   r   r   r   r   r   r   r   ÚerrstateÚsqrtÚisinf)r   r   r   Únpr   r   r   Ú_Údiagsr!   ÚLÚ
diags_sqrtÚDHs                r"   r   r   …   sm  € ðB ÐÐÐØÐÐÐàÐÝ˜‘7”7ˆÝ
Ô  ¨X¸fÈUÐSÑSÔS€AØŒ7�D€A€qØ�EŠE�qˆE‰MŒM€Eà
Œ	×Ò˜BœI×-Ò-¨e°Q¸¸1ÀUÐ-ÑKÔKÑLÔL€AØ	ˆA‰€AØ	�Š˜HˆÑ	%Ô	%ð *ð *Ø˜2Ÿ7š7 5™>œ>Ñ)ˆ
ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *à'(€Jˆr�xŠx˜
Ñ#Ô#Ñ$à	Œ×	Ò	˜RœY×.Ò.¨z¸1¸aÀÈ5Ð.ÑQÔQÑ	RÔ	R€BØ��R‘‰=Ðs   Â$C	Ã	CÃCÚ
undirectedÚ
multigraphçffffffî?c           	      ó–  — ddl }ddl}t          | ||||¬¦  «        }|j        \  }}	|j        j                             |j        d¬¦  «        \  }
}|                     ¦   «         j	        }|| 
                    ¦   «         z  }|                     |                     |¦  «        ¦  «        }|j                             |j                             |d||¦  «        ¦  «        |z  |j                             |j                             d|z  d||¦  «        ¦  «        z  }|                     t!          | ¦  «        ¦  «        }|||j        z   dz  z
  S )ab  Returns the directed Laplacian matrix of G.

    The graph directed Laplacian is the matrix

    .. math::

        L = I - \frac{1}{2} \left (\Phi^{1/2} P \Phi^{-1/2} + \Phi^{-1/2} P^T \Phi^{1/2} \right )

    where `I` is the identity matrix, `P` is the transition matrix of the
    graph, and `\Phi` a matrix with the Perron vector of `P` in the diagonal and
    zeros elsewhere [1]_.

    Depending on the value of walk_type, `P` can be the transition matrix
    induced by a random walk, a lazy random walk, or a random walk with
    teleportation (PageRank).

    Parameters
    ----------
    G : DiGraph
       A NetworkX graph

    nodelist : list, optional
       The rows and columns are ordered according to the nodes in nodelist.
       If nodelist is None, then the ordering is produced by G.nodes().

    weight : string or None, optional (default='weight')
       The edge data key used to compute each value in the matrix.
       If None, then each edge has weight 1.

    walk_type : string or None, optional (default=None)
       One of ``"random"``, ``"lazy"``, or ``"pagerank"``. If ``walk_type=None``
       (the default), then a value is selected according to the properties of `G`:
       - ``walk_type="random"`` if `G` is strongly connected and aperiodic
       - ``walk_type="lazy"`` if `G` is strongly connected but not aperiodic
       - ``walk_type="pagerank"`` for all other cases.

    alpha : real
       (1 - alpha) is the teleportation probability used with pagerank

    Returns
    -------
    L : NumPy matrix
      Normalized Laplacian of G.

    Notes
    -----
    Only implemented for DiGraphs

    The result is always a symmetric matrix.

    This calculation uses the out-degree of the graph `G`. To use the
    in-degree for calculations instead, use `G.reverse(copy=False)` and
    take the transpose.

    See Also
    --------
    laplacian_matrix
    normalized_laplacian_matrix
    directed_combinatorial_laplacian_matrix

    References
    ----------
    .. [1] Fan Chung (2005).
       Laplacians and the Cheeger inequality for directed graphs.
       Annals of Combinatorics, 9(1), 2005
    r   N©r   r   Ú	walk_typeÚalphar   ©Úkr'   ç       @)r(   r   Ú_transition_matrixr   r   ÚlinalgÚeigsÚTÚflattenÚrealr   r*   Úabsr   r   ÚidentityÚlen)r   r   r   r7   r8   r,   r   ÚPr   r    ÚevalsÚevecsÚvÚpÚsqrtpÚQÚIs                    r"   r   r   ý   sE  € ðP ÐÐÐØÐÐÐõ 	Ø	�H V°yÈð	ñ 	ô 	€Að Œ7�D€A€qà”9Ô#×(Ò(¨¬°Ð(Ñ2Ô2�L€Eˆ5Ø�Š‰ŒÔ€AØ	ˆA�EŠE‰GŒG‰€Aà�GŠG�B—F’F˜1‘I”IÑÔ€Eð 	Œ	×Ò˜BœI×-Ò-¨e°Q¸¸1Ñ=Ô=Ñ>Ô>Ø
ñ	ð Œ)×
Ò
˜bœi×/Ò/°°e±¸QÀÀ1ÑEÔEÑ
FÔ
Fñ	Gð ð 	�Š•C˜‘F”FÑÔ€Aà��A”C‘˜3‰ÑÐr#   c                 ó²  — ddl }t          | ||||¬¦  «        }|j        \  }}|j        j                             |j        d¬¦  «        \  }	}
|
                     ¦   «         j        }|| 	                    ¦   «         z  }|j         
                    |j                             |d||¦  «        ¦  «                             ¦   «         }|||z  |j        |z  z   dz  z
  S )a4  Return the directed combinatorial Laplacian matrix of G.

    The graph directed combinatorial Laplacian is the matrix

    .. math::

        L = \Phi - \frac{1}{2} \left (\Phi P + P^T \Phi \right)

    where `P` is the transition matrix of the graph and `\Phi` a matrix
    with the Perron vector of `P` in the diagonal and zeros elsewhere [1]_.

    Depending on the value of walk_type, `P` can be the transition matrix
    induced by a random walk, a lazy random walk, or a random walk with
    teleportation (PageRank).

    Parameters
    ----------
    G : DiGraph
       A NetworkX graph

    nodelist : list, optional
       The rows and columns are ordered according to the nodes in nodelist.
       If nodelist is None, then the ordering is produced by G.nodes().

    weight : string or None, optional (default='weight')
       The edge data key used to compute each value in the matrix.
       If None, then each edge has weight 1.

    walk_type : string or None, optional (default=None)
        One of ``"random"``, ``"lazy"``, or ``"pagerank"``. If ``walk_type=None``
        (the default), then a value is selected according to the properties of `G`:
        - ``walk_type="random"`` if `G` is strongly connected and aperiodic
        - ``walk_type="lazy"`` if `G` is strongly connected but not aperiodic
        - ``walk_type="pagerank"`` for all other cases.

    alpha : real
       (1 - alpha) is the teleportation probability used with pagerank

    Returns
    -------
    L : NumPy matrix
      Combinatorial Laplacian of G.

    Notes
    -----
    Only implemented for DiGraphs

    The result is always a symmetric matrix.

    This calculation uses the out-degree of the graph `G`. To use the
    in-degree for calculations instead, use `G.reverse(copy=False)` and
    take the transpose.

    See Also
    --------
    laplacian_matrix
    normalized_laplacian_matrix
    directed_laplacian_matrix

    References
    ----------
    .. [1] Fan Chung (2005).
       Laplacians and the Cheeger inequality for directed graphs.
       Annals of Combinatorics, 9(1), 2005
    r   Nr6   r   r9   r;   )r   r<   r   r   r=   r>   r?   r@   rA   r   r   r   Útoarray)r   r   r   r7   r8   r   rE   r   r    rF   rG   rH   rI   ÚPhis                 r"   r   r   a  sÙ   € ðN ÐÐÐåØ	�H V°yÈð	ñ 	ô 	€Að Œ7�D€A€qà”9Ô#×(Ò(¨¬°Ð(Ñ2Ô2�L€Eˆ5Ø�Š‰ŒÔ€AØ	ˆA�EŠE‰GŒG‰€Að Œ)×
Ò
˜bœi×/Ò/°°1°a¸Ñ;Ô;Ñ
<Ô
<×
DÒ
DÑ
FÔ
F€Cà�#˜‘'˜AœC #™IÑ%¨Ñ,Ñ,Ð,r#   c                 ó^  — ddl }ddl}|€0t          j        | ¦  «        rt          j        | ¦  «        rd}nd}nd}t          j        | ||t          ¬¦  «        }|j        \  }}	|dv r–|j         	                    |j         
                    d|                     d	¬
¦  «        z  d||¦  «        ¦  «        }
|dk    r|
|z  }nï|j         	                    |j                             |¦  «        ¦  «        }||
|z  z   dz  }n±|dk    r—d|cxk     rd	k     sn t          j        d¦  «        ‚|                     ¦   «         }d	|z  ||                     d	¬
¦  «        dk    dd…f<   ||                     d	¬
¦  «        |j        dd…f         j        z  }||z  d	|z
  |z  z   }nt          j        d¦  «        ‚|S )a¦  Returns the transition matrix of G.

    This is a row stochastic giving the transition probabilities while
    performing a random walk on the graph. Depending on the value of walk_type,
    P can be the transition matrix induced by a random walk, a lazy random walk,
    or a random walk with teleportation (PageRank).

    Parameters
    ----------
    G : DiGraph
       A NetworkX graph

    nodelist : list, optional
       The rows and columns are ordered according to the nodes in nodelist.
       If nodelist is None, then the ordering is produced by G.nodes().

    weight : string or None, optional (default='weight')
       The edge data key used to compute each value in the matrix.
       If None, then each edge has weight 1.

    walk_type : string or None, optional (default=None)
       One of ``"random"``, ``"lazy"``, or ``"pagerank"``. If ``walk_type=None``
       (the default), then a value is selected according to the properties of `G`:
        - ``walk_type="random"`` if `G` is strongly connected and aperiodic
        - ``walk_type="lazy"`` if `G` is strongly connected but not aperiodic
        - ``walk_type="pagerank"`` for all other cases.

    alpha : real
       (1 - alpha) is the teleportation probability used with pagerank

    Returns
    -------
    P : numpy.ndarray
      transition matrix of G.

    Raises
    ------
    NetworkXError
        If walk_type not specified or alpha not in valid range
    r   NÚrandomÚlazyÚpagerank)r   r   Údtype)rQ   rR   r'   r   r   r;   zalpha must be between 0 and 1z+walk_type must be random, lazy, or pagerank)r(   r   r   Úis_strongly_connectedÚis_aperiodicr   Úfloatr   r   r   r   r   rC   ÚNetworkXErrorrN   Únewaxisr?   )r   r   r   r7   r8   r,   r   r   r   r    ÚDIrE   rL   s                r"   r<   r<   º  sØ  € ðR ÐÐÐØÐÐÐàÐÝÔ# AÑ&Ô&ð 	#ÝŒ˜qÑ!Ô!ð #Ø$�	�	à"�	�	à"ˆIå
Ô  ¨X¸fÍEÐRÑRÔR€AØŒ7�D€A€qØÐ&Ð&Ð&àŒY× Ò  ¤×!2Ò!2°3¸¿ºÀA¸¹¼Ñ3FÈÈ1ÈaÑ!PÔ!PÑQÔQˆØ˜Ò Ð Ø�Q‘ˆAˆAð ”	×#Ò# B¤I×$6Ò$6°qÑ$9Ô$9Ñ:Ô:ˆAØ�R˜!‘V‘˜sÑ"ˆAˆAà	�jÒ	 Ð	 Ø�E��’�˜A’���ÝÔ"Ð#BÑCÔCÐCà�IŠI‰KŒKˆà#$ q¡5ˆˆ!�%Š%�Qˆ%‰-Œ-˜1Ò
˜a˜a˜aÐ
Ñ à�—’˜1�‘”˜bœj¨!¨!¨!˜mÔ,Ô.Ñ.ˆØ�A‰I˜˜U™ a™Ñ'ˆˆåÔÐLÑMÔMÐMà€Hr#   )Nr   )Nr   Nr4   )Ú__doc__Únetworkxr   Únetworkx.utilsr   Ú__all__Ú_dispatchabler   r   r   r   r<   © r#   r"   ú<module>ra      sš  ððð ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .ðð ð €ð €Ô˜XÐ&Ñ&Ô&ðkð kð kñ 'Ô&ðkð\ €Ô˜XÐ&Ñ&Ô&ðpð pð pñ 'Ô&ðpðn Ð�\Ñ"Ô"ØÐ�\Ñ"Ô"Ø€Ô˜XÐ&Ñ&Ô&à=Að^ð ^ð ^ñ 'Ô&ñ #Ô"ñ #Ô"ð^ðB Ð�\Ñ"Ô"ØÐ�\Ñ"Ô"Ø€Ô˜XÐ&Ñ&Ô&à=AðS-ð S-ð S-ñ 'Ô&ñ #Ô"ñ #Ô"ðS-ðlNð Nð Nð Nð Nð Nr#   