§
    bŠtjRA  ã                   ó’  — 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                             |                     d¬¦  «        df||f¬¦  «                             ¦   «         }||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©Úshape)	ÚscipyÚlistÚnxÚto_scipy_sparse_arrayr   ÚsparseÚ	dia_arrayÚsumÚtocsr)ÚGr   r   ÚspÚAÚnÚmÚDs           ú]/var/www/html/CA-Chatbot/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Ø
Œ	×Ò˜QŸUšU¨˜U™]œ]¨AÐ.°q¸!°fÐÑ=Ô=×CÒCÑEÔE€AØˆq‰5€Ló    c                 óB  — ddl }ddl}|€t          | ¦  «        }t          j        | ||d¬¦  «        }|j        \  }}|                     d¬¦  «        }|j                             |df||f¬¦  «         	                    ¦   «         }	|	|z
  }
| 
                    d¬	¦  «        5  d
|                     |¦  «        z  }ddd¦  «         n# 1 swxY w Y   d||                     |¦  «        <   |j                             |df||f¬¦  «         	                    ¦   «         }||
|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   „   si  € ðB ÐÐÐØÐÐÐàÐÝ˜‘7”7ˆÝ
Ô  ¨X¸fÈUÐSÑSÔS€AØŒ7�D€A€qØ�EŠE�qˆE‰MŒM€EØ
Œ	×Ò˜U A˜J¨q°!¨fÐÑ5Ô5×;Ò;Ñ=Ô=€AØ	ˆA‰€AØ	�Š˜HˆÑ	%Ô	%ð *ð *Ø˜2Ÿ7š7 5™>œ>Ñ)ˆ
ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *à'(€Jˆr�xŠx˜
Ñ#Ô#Ñ$Ø	Œ×	Ò	˜j¨!˜_°Q¸°FÐ	Ñ	;Ô	;×	AÒ	AÑ	CÔ	C€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                             |df||f¬¦  «                             ¦   «         |z  |j                             d|z  df||f¬¦  «                             ¦   «         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(   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   ú   sH  € ð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à
Œ	×Ò˜U A˜J¨q°!¨fÐÑ5Ô5×;Ò;Ñ=Ô=Ø
ñ	à
Œ)×
Ò
˜s U™{¨AÐ.°q¸!°fÐ
Ñ
=Ô
=×
CÒ
CÑ
EÔ
Eñ	Fð ð 	�Š•C˜‘F”FÑÔ€Aà��A”C‘˜3‰ÑÐr#   c                 óˆ  — ddl }t          | ||||¬¦  «        }|j        \  }}|j        j                             |j        d¬¦  «        \  }	}
|
                     ¦   «         j        }|| 	                    ¦   «         z  }|j         
                    |df||f¬¦  «                             ¦   «         }|||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?   r@   rA   r   r   Útoarray)r   r   r   r7   r8   r   rE   r   r    rF   rG   rH   rI   ÚPhis                 r"   r   r   \  sÎ   € ðN ÐÐÐåØ	�H V°yÈð	ñ 	ô 	€Að Œ7�D€A€qà”9Ô#×(Ò(¨¬°Ð(Ñ2Ô2�L€Eˆ5Ø�Š‰ŒÔ€AØ	ˆA�EŠE‰GŒG‰€Aà
Œ)×
Ò
˜q !˜f¨Q°¨FÐ
Ñ
3Ô
3×
;Ò
;Ñ
=Ô
=€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         	                    d| 
                    d	¬
¦  «        z  df||f¬¦  «                             ¦   «         }
|dk    r|
|z  }nÙ|j                             |d¬¦  «        }||
|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   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   Ú	eye_arrayÚ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× Ò  #¨¯ª°1¨©¬Ñ"5°qÐ!9À!ÀQÀÐ ÑHÔH×NÒNÑPÔPˆØ˜Ò Ð Ø�Q‘ˆAˆAà”	×#Ò# A¨eÐ#Ñ4Ô4ˆ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>rb      sš  ððð ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .ðð ð €ð €Ô˜XÐ&Ñ&Ô&ðjð jð jñ 'Ô&ðjðZ €Ô˜XÐ&Ñ&Ô&ðnð nð nñ 'Ô&ðnðj Ð�\Ñ"Ô"ØÐ�\Ñ"Ô"Ø€Ô˜XÐ&Ñ&Ô&à=Að\ð \ð \ñ 'Ô&ñ #Ô"ñ #Ô"ð\ð~ Ð�\Ñ"Ô"ØÐ�\Ñ"Ô"Ø€Ô˜XÐ&Ñ&Ô&à=AðR-ð R-ð R-ñ 'Ô&ñ #Ô"ñ #Ô"ðR-ðjLð Lð Lð Lð Lð Lr#   