Ë
    "täiRA  ã                   óX  — 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y)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                  |j                  d¬«      df||f¬«      j                  «       }||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           ún/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/networkx/linalg/laplacianmatrix.pyr   r      sx   € óH àÐÜ˜“7ˆÜ
× Ñ  ¨X¸fÈUÔS€AØ�7‰7�D€A€qØ
�	‰	×Ñ˜QŸU™U¨˜U›]¨AÐ.°q¸!°fÐÓ=×CÑCÓE€AØˆq‰5€Ló    c                 ó  — ddl }ddl}|€t        | «      }t        j                  | ||d¬«      }|j
                  \  }}|j                  d¬«      }|j                  j                  |df||f¬«      j                  «       }	|	|z
  }
|j                  d¬	«      5  d
|j                  |«      z  }ddd«       d|j                  |«      <   |j                  j                  |df||f¬«      j                  «       }||
|z  z  S # 1 sw Y   ŒTxY w)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   „   sø   € óB ÛàÐÜ˜“7ˆÜ
× Ñ  ¨X¸fÈUÔS€AØ�7‰7�D€A€qØ�E‰E�qˆE‹M€EØ
�	‰	×Ñ˜U A˜J¨q°!¨fÐÓ5×;Ñ;Ó=€AØ	ˆA‰€AØ	�‰˜HˆÕ	%Ø˜2Ÿ7™7 5›>Ñ)ˆ
÷ 
&à'(€Jˆr�x‰x˜
Ó#Ñ$Ø	�‰×	Ñ	˜j¨!˜_°Q¸°FÐ	Ó	;×	AÑ	AÓ	C€BØ��R‘‰=Ð÷	 
&Ð	%ús   ÂC>Ã>DÚ
undirectedÚ
multigraphc                 óz  — ddl }ddl}t        | ||||¬«      }|j                  \  }}	|j                  j
                  j                  |j                  d¬«      \  }
}|j                  «       j                  }||j                  «       z  }|j                  |j                  |«      «      }|j                  j                  |df||f¬«      j                  «       |z  |j                  j                  d|z  df||f¬«      j                  «       z  }|j                  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   r6   r7   r,   r   ÚPr   r    ÚevalsÚevecsÚvÚpÚsqrtpÚQÚIs                    r"   r   r   ú   s!  € óP Ûô 	Ø	�H V°yÈô	€Að �7‰7�D€A€qà—9‘9×#Ñ#×(Ñ(¨¯©°Ð(Ó2�L€Eˆ5Ø�‰‹×Ñ€AØ	ˆA�E‰E‹G‰€Aà�G‰G�B—F‘F˜1“IÓ€Eà
�	‰	×Ñ˜U A˜J¨q°!¨fÐÓ5×;Ñ;Ó=Ø
ñ	à
�)‰)×
Ñ
˜s U™{¨AÐ.°q¸!°fÐ
Ó
=×
CÑ
CÓ
Eñ	Fð ð 	�‰”C˜“FÓ€Aà��A—C‘C‘˜3‰ÑÐr#   c                 óž  — ddl }t        | ||||¬«      }|j                  \  }}|j                  j                  j                  |j                  d¬«      \  }	}
|
j                  «       j                  }||j                  «       z  }|j                  j                  |df||f¬«      j                  «       }|||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   Nr5   r   r8   r   r:   )r   r;   r   r   r<   r=   r>   r?   r@   r   r   Útoarray)r   r   r   r6   r7   r   rD   r   r    rE   rF   rG   rH   ÚPhis                 r"   r   r   \  s¾   € óN äØ	�H V°yÈô	€Að �7‰7�D€A€qà—9‘9×#Ñ#×(Ñ(¨¯©°Ð(Ó2�L€Eˆ5Ø�‰‹×Ñ€AØ	ˆA�E‰E‹G‰€Aà
�)‰)×
Ñ
˜q !˜f¨Q°¨FÐ
Ó
3×
;Ñ
;Ó
=€Cà�#˜‘'˜AŸC™C #™IÑ%¨Ñ,Ñ,Ð,r#   c                 ó   — ddl }ddl}|€2t        j                  | «      rt        j                  | «      rd}nd}nd}t        j
                  | ||t        ¬«      }|j                  \  }}	|dv rx|j                  j                  d|j                  d	¬
«      z  df||f¬«      j                  «       }
|dk(  r|
|z  }|S |j                  j                  |d¬«      }||
|z  z   dz  }|S |dk(  r‘d|cxk  rd	k  sn t        j                  d«      ‚|j                  «       }d	|z  ||j                  d	¬
«      dk(  dd…f<   ||j                  d	¬
«      |j                  dd…f   j                   z  }||z  d	|z
  |z  z   }|S t        j                  d«      ‚)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)rP   rQ   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ÚNetworkXErrorrM   Únewaxisr>   )r   r   r   r6   r7   r,   r   r   r   r    ÚDIrD   rK   s                r"   r;   r;   ´  s˜  € óR ÛàÐÜ×#Ñ# AÔ&Ü�‰˜qÔ!Ø$‘	à"‘	à"ˆIä
× Ñ  ¨X¸fÌEÔR€AØ�7‰7�D€A€qØÐ&Ñ&Ø�Y‰Y× Ñ  #¨¯©°1¨«Ñ"5°qÐ!9À!ÀQÀÐ ÓH×NÑNÓPˆØ˜Ò Ø�Q‘ˆAð$ €Hð! —	‘	×#Ñ# A¨eÐ#Ó4ˆAØ�R˜!‘V‘˜sÑ"ˆAð €Hð 
�jÒ	 Ø�E”˜A”Ü×"Ñ"Ð#BÓCÐCà�I‰I‹Kˆà#$ q¡5ˆˆ!�%‰%�Qˆ%‹-˜1Ñ
šaÐ
Ñ à�—‘˜1�“˜bŸj™jª!˜mÑ,×.Ñ.Ñ.ˆØ�A‰I˜˜U™ a™Ñ'ˆð €Hô ×ÑÐLÓMÐMr#   )Nr   )Nr   Ngffffffî?)Ú__doc__Únetworkxr   Únetworkx.utilsr   Ú__all__Ú_dispatchabler   r   r   r   r;   © r#   r"   Ú<module>ra      sé   ðñó Ý .ò€ð €×Ñ˜XÔ&òjó 'ðjðZ €×Ñ˜XÔ&ònó 'ðnñj �\Ó"Ù�\Ó"Ø€×Ñ˜XÔ&à=Aò\ó 'ó #ó #ð\ñ~ �\Ó"Ù�\Ó"Ø€×Ñ˜XÔ&à=AòR-ó 'ó #ó #ðR-ôjLr#   