+
    )iRA                     `   R t ^ RIt^ RIHt . ROt]P                  ! RR7      RR l4       t]P                  ! RR7      RR l4       t]! R4      ]! R4      ]P                  ! RR7      RR	 l4       4       4       t	]! R4      ]! R4      ]P                  ! RR7      RR
 l4       4       4       t
RR ltR# )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weight)
edge_attrsc                   ^ RI pVf   \        V 4      p\        P                  ! WVRR7      pVP                  w  rVVP
                  P                  VP                  ^R7      ^ 3We3R7      P                  4       pWt,
          # )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.

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/photoedit/myenv/lib/python3.14/site-packages/networkx/linalg/laplacianmatrix.pylaplacian_matrixr      sp    H 7
  fUSA77DA
		QUUU]A.qf=CCEA5L    c                L   ^ RI p^ RIpVf   \        V 4      p\        P                  ! WVRR7      pVP
                  w  rgVP                  ^R7      pVP                  P                  V^ 3Wf3R7      P                  4       p	W,
          p
VP                  RR7      ;_uu_ 4        RVP                  V4      ,          pRRR4       ^ XVP                  V4      &   VP                  P                  V^ 3Wf3R7      P                  4       pWV,          ,          #   + '       g   i     La; i)	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.
Nr   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   normalized_laplacian_matrixr-      s    B 7
  fUSA77DAEEqEME
		UAJqf5;;=A	A	H	%	%2775>)
 
&'(Jrxx
#$			j!_QF		;	A	A	CBR=	 
&	%s   !DD#	
undirected
multigraphc                   ^ RI p^ RIp\        WW#VR7      pVP                  w  rVP                  P
                  P                  VP                  ^R7      w  rVP                  4       P                  pWP                  4       ,          pVP                  VP                  V4      4      pVP                  P                  V^ 3W3R7      P                  4       V,          VP                  P                  RV,          ^ 3W3R7      P                  4       ,          pVP                  \!        V 4      4      pVWP                  ,           R,          ,
          # )a  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
Nr   r   	walk_typealphakr   r"          @)r#   r   _transition_matrixr   r   linalgeigsTflattenrealr   r%   absr   r   identitylen)r   r   r   r2   r3   r'   r   Pr   r   evalsevecsvpsqrtpQIs   &&&&&            r   directed_laplacian_matrixrH      s   P  		V	A 77DA99##(((2LEA	EEGAGGBFF1IE
		UAJqf5;;=
	
))

sU{A.qf

=
C
C
E	F  	CFACC3r   c                   ^ RI p\        WW#VR7      pVP                  w  rxVP                  P                  P                  VP                  ^R7      w  rV
P                  4       P                  pWP                  4       ,          pVP                  P                  V^ 3Ww3R7      P                  4       pWV,          VP                  V,          ,           R,          ,
          # )at  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
Nr1   r4   r   r6   )r   r7   r   r   r8   r9   r:   r;   r<   r   r   toarray)r   r   r   r2   r3   r   r@   r   r   rA   rB   rC   rD   Phis   &&&&&         r   'directed_combinatorial_laplacian_matrixrL   \  s    N 	V	A 77DA99##(((2LEA	EEGA
))

q!fQF

3
;
;
=C'ACC#I%,,,r   c                   ^ RI p^ RIpVfA   \        P                  ! V 4      '       d#   \        P                  ! V 4      '       d   RpMRpMRp\        P
                  ! WV\        R7      pVP                  w  rVR9   d   VP                  P                  RVP                  ^R7      ,          ^ 3W3R7      P                  4       p
VR8X  d   W,          pV# VP                  P                  VR	R
7      pWV,          ,           R,          p V# VR8X  d   ^ Tu;8  d   ^8  g   M \        P                  ! R4      hVP                  4       p^V,          WwP                  ^R7      ^ 8H  R3&   WwP                  ^R7      VP                  R3,          P                   ,          pWG,          ^V,
          V,          ,           pV# \        P                  ! R4      h)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
Nrandomlazypagerank)r   r   dtyper"   r
   r   r   )r	   r6   zalpha must be between 0 and 1:NNNz+walk_type must be random, lazy, or pagerank)rN   rO   )r#   r   r   is_strongly_connectedis_aperiodicr   floatr   r   r   r   r   	eye_arrayNetworkXErrorrJ   newaxisr:   )r   r   r   r2   r3   r'   r   r   r   r   DIr@   rG   s   &&&&&        r   r7   r7     s   R ##A&&q!!$	"	"I
  fERA77DA&&YY  #1"5q!9! HNNP A$ H! 		##Ae#4A!Vs"A H 
j	 EA""#BCCIIK#$q5%%Q%-1
a
 1bjj!m,...IUa' H LMMr   )r   r-   rH   rL   )Nr   )Nr   Ngffffff?)__doc__networkxr   networkx.utilsr   __all___dispatchabler   r-   rH   rL   r7    r   r   <module>r_      s     . X&j 'jZ X&n 'nj \"\"X&\ ' # #\~ \"\"X&R- ' # #R-jLr   