
    h)%                     8   S r SSKrSSKJr  / SQr\" S5      \" S5      \R                  S 5       5       5       r\" S5      \" S5      \R                  S 5       5       5       r\" S5      \" S5      \R                  S	 5       5       5       r	\R                  S
 5       r
g)z5
Subraph centrality and communicability betweenness.
    N)not_implemented_for)subgraph_centrality_expsubgraph_centrality&communicability_betweenness_centralityestrada_indexdirected
multigraphc           
          SSK n[        U 5      n[        R                  " X5      nSX3S:g  '   UR                  R                  U5      n[        [        U[        [        UR                  5       5      5      5      nU$ )a  Returns the subgraph centrality for each node of G.

Subgraph centrality  of a node `n` is the sum of weighted closed
walks of all lengths starting and ending at node `n`. The weights
decrease with path length. Each closed walk is associated with a
connected subgraph ([1]_).

Parameters
----------
G: graph

Returns
-------
nodes:dictionary
    Dictionary of nodes with subgraph centrality as the value.

Raises
------
NetworkXError
    If the graph is not undirected and simple.

See Also
--------
subgraph_centrality:
    Alternative algorithm of the subgraph centrality for each node of G.

Notes
-----
This version of the algorithm exponentiates the adjacency matrix.

The subgraph centrality of a node `u` in G can be found using
the matrix exponential of the adjacency matrix of G [1]_,

.. math::

    SC(u)=(e^A)_{uu} .

References
----------
.. [1] Ernesto Estrada, Juan A. Rodriguez-Velazquez,
   "Subgraph centrality in complex networks",
   Physical Review E 71, 056103 (2005).
   https://arxiv.org/abs/cond-mat/0504730

Examples
--------
(Example from [1]_)
>>> G = nx.Graph(
...     [
...         (1, 2),
...         (1, 5),
...         (1, 8),
...         (2, 3),
...         (2, 8),
...         (3, 4),
...         (3, 6),
...         (4, 5),
...         (4, 7),
...         (5, 6),
...         (6, 7),
...         (7, 8),
...     ]
... )
>>> sc = nx.subgraph_centrality_exp(G)
>>> print([f"{node} {sc[node]:0.2f}" for node in sorted(sc)])
['1 3.90', '2 3.90', '3 3.64', '4 3.71', '5 3.64', '6 3.71', '7 3.64', '8 3.90']
r   N   g        )scipylistnxto_numpy_arraylinalgexpmdictzipmapfloatdiagonal)GspnodelistAexpAscs         ]/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/centrality/subgraph_alg.pyr   r      sa    P AwH
!&AA3hK99>>!D	c(Ct}}78	9BI    c           	      H   SSK n[        U 5      n[        R                  " X5      nSX1R	                  U5      '   UR
                  R                  U5      u  pEUR                  U5      S-  nUR                  U5      nXg-  n[        [        U[        [        U5      5      5      n	U	$ )a  Returns subgraph centrality for each node in G.

Subgraph centrality  of a node `n` is the sum of weighted closed
walks of all lengths starting and ending at node `n`. The weights
decrease with path length. Each closed walk is associated with a
connected subgraph ([1]_).

Parameters
----------
G: graph

Returns
-------
nodes : dictionary
   Dictionary of nodes with subgraph centrality as the value.

Raises
------
NetworkXError
   If the graph is not undirected and simple.

See Also
--------
subgraph_centrality_exp:
    Alternative algorithm of the subgraph centrality for each node of G.

Notes
-----
This version of the algorithm computes eigenvalues and eigenvectors
of the adjacency matrix.

Subgraph centrality of a node `u` in G can be found using
a spectral decomposition of the adjacency matrix [1]_,

.. math::

   SC(u)=\sum_{j=1}^{N}(v_{j}^{u})^2 e^{\lambda_{j}},

where `v_j` is an eigenvector of the adjacency matrix `A` of G
corresponding to the eigenvalue `\lambda_j`.

Examples
--------
(Example from [1]_)
>>> G = nx.Graph(
...     [
...         (1, 2),
...         (1, 5),
...         (1, 8),
...         (2, 3),
...         (2, 8),
...         (3, 4),
...         (3, 6),
...         (4, 5),
...         (4, 7),
...         (5, 6),
...         (6, 7),
...         (7, 8),
...     ]
... )
>>> sc = nx.subgraph_centrality(G)
>>> print([f"{node} {sc[node]:0.2f}" for node in sorted(sc)])
['1 3.90', '2 3.90', '3 3.64', '4 3.71', '5 3.64', '6 3.71', '7 3.64', '8 3.90']

References
----------
.. [1] Ernesto Estrada, Juan A. Rodriguez-Velazquez,
   "Subgraph centrality in complex networks",
   Physical Review E 71, 056103 (2005).
   https://arxiv.org/abs/cond-mat/0504730

r   Nr      )numpyr   r   r   nonzeror   eigharrayexpr   r   r   r   )
r   npr   r   wvvsquareexpwxgr   s
             r   r   r   d   s    X AwH
!&AAjjm99>>!DAhhqkQG66!9D	B	c(CrN+	,BIr   c                 >   SSK nSSKn[        U 5      n[        U5      n[        R
                  " X5      nSXQR                  U5      '   UR                  R                  U5      n[        [        U[        U5      5      5      n0 nU  H  n	Xy   n
XZSS24   R                  5       nUSS2U
4   R                  5       nSXZSS24'   SUSS2U
4'   XbR                  R                  U5      -
  U-  nSXSS24'   SUSS2U
4'   XR                  UR                  U5      5      -  n[        UR                  5       5      X'   XU
SS24'   XSS2U
4'   M     [        U5      nUS:  a:  SUS-
  S-  US-
  -
  -  nUR!                  5        VVs0 s H  u  nnUUU-  _M     nnnU$ s  snnf )aQ  Returns subgraph communicability for all pairs of nodes in G.

Communicability betweenness measure makes use of the number of walks
connecting every pair of nodes as the basis of a betweenness centrality
measure.

Parameters
----------
G: graph

Returns
-------
nodes : dictionary
    Dictionary of nodes with communicability betweenness as the value.

Raises
------
NetworkXError
    If the graph is not undirected and simple.

Notes
-----
Let `G=(V,E)` be a simple undirected graph with `n` nodes and `m` edges,
and `A` denote the adjacency matrix of `G`.

Let `G(r)=(V,E(r))` be the graph resulting from
removing all edges connected to node `r` but not the node itself.

The adjacency matrix for `G(r)` is `A+E(r)`,  where `E(r)` has nonzeros
only in row and column `r`.

The subraph betweenness of a node `r`  is [1]_

.. math::

     \omega_{r} = \frac{1}{C}\sum_{p}\sum_{q}\frac{G_{prq}}{G_{pq}},
     p\neq q, q\neq r,

where
`G_{prq}=(e^{A}_{pq} - (e^{A+E(r)})_{pq}`  is the number of walks
involving node r,
`G_{pq}=(e^{A})_{pq}` is the number of closed walks starting
at node `p` and ending at node `q`,
and `C=(n-1)^{2}-(n-1)` is a normalization factor equal to the
number of terms in the sum.

The resulting `\omega_{r}` takes values between zero and one.
The lower bound cannot be attained for a connected
graph, and the upper bound is attained in the star graph.

References
----------
.. [1] Ernesto Estrada, Desmond J. Higham, Naomichi Hatano,
   "Communicability Betweenness in Complex Networks"
   Physica A 388 (2009) 764-774.
   https://arxiv.org/abs/0905.4102

Examples
--------
>>> G = nx.Graph([(0, 1), (1, 2), (1, 5), (5, 4), (2, 4), (2, 3), (4, 3), (3, 6)])
>>> cbc = nx.communicability_betweenness_centrality(G)
>>> print([f"{node} {cbc[node]:0.2f}" for node in sorted(cbc)])
['0 0.03', '1 0.45', '2 0.51', '3 0.45', '4 0.40', '5 0.19', '6 0.03']
r   Nr   r    g      ?)r!   r   r   lenr   r   r"   r   r   r   r   rangecopydiagr   sumitems)r   r&   r   r   nr   r   mappingcbcr(   irowcolBorderscalenodevalues                     r   r   r      s   H AwHHA
!&AAjjm99>>!D3xq*+G
CJ1glln1gllnQ$!Q$IINN1%%-Q$!Q$	WWRWWQZ  quuw!Q$!Q$ " HEqy)US[9:69iikBk{tUtUU]"kBJ Cs   Fc                 F    [        [        U 5      R                  5       5      $ )uC  Returns the Estrada index of a the graph G.

The Estrada Index is a topological index of folding or 3D "compactness" ([1]_).

Parameters
----------
G: graph

Returns
-------
estrada index: float

Raises
------
NetworkXError
    If the graph is not undirected and simple.

Notes
-----
Let `G=(V,E)` be a simple undirected graph with `n` nodes  and let
`\lambda_{1}\leq\lambda_{2}\leq\cdots\lambda_{n}`
be a non-increasing ordering of the eigenvalues of its adjacency
matrix `A`. The Estrada index is ([1]_, [2]_)

.. math::
    EE(G)=\sum_{j=1}^n e^{\lambda _j}.

References
----------
.. [1] E. Estrada, "Characterization of 3D molecular structure",
   Chem. Phys. Lett. 319, 713 (2000).
   https://doi.org/10.1016/S0009-2614(00)00158-5
.. [2] José Antonio de la Peñaa, Ivan Gutman, Juan Rada,
   "Estimating the Estrada index",
   Linear Algebra and its Applications. 427, 1 (2007).
   https://doi.org/10.1016/j.laa.2007.06.020

Examples
--------
>>> G = nx.Graph([(0, 1), (1, 2), (1, 5), (5, 4), (2, 4), (2, 3), (4, 3), (3, 6)])
>>> ei = nx.estrada_index(G)
>>> print(f"{ei:0.5}")
20.55
)r1   r   values)r   s    r   r   r   &  s    \ "1%,,.//r   )__doc__networkxr   networkx.utilsr   __all___dispatchabler   r   r   r    r   r   <module>rF      s     . Z \"N  # !Nb Z \"U  # !Up Z \"a  # !aH -0 -0r   