Ë
    D^(h)%  ã                   ó8  — d Z ddlZddlmZ g d¢Z ed«       ed«      ej                  d„ «       «       «       Z ed«       ed«      ej                  d„ «       «       «       Z ed«       ed«      ej                  d	„ «       «       «       Z	ej                  d
„ «       Z
y)z5
Subraph centrality and communicability betweenness.
é    N)Únot_implemented_for)Úsubgraph_centrality_expÚsubgraph_centralityÚ&communicability_betweenness_centralityÚestrada_indexÚdirectedÚ
multigraphc           
      óø   — ddl }t        | «      }t        j                  | |«      }d||dk7  <   |j                  j                  |«      }t        t        |t        t        |j                  «       «      «      «      }|S )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         úi/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/networkx/algorithms/centrality/subgraph_alg.pyr   r      se   € óP ä�A‹w€HÜ
×Ñ˜!˜XÓ&€Aà€A€aˆ3�h�KØ�9‰9�>‰>˜!Ó€Dä	Œc�(œC¤ t§}¡}£Ó7Ó8Ó	9€BØ€Ió    c           	      óN  — ddl }t        | «      }t        j                  | |«      }d||j	                  |«      <   |j
                  j                  |«      \  }}|j                  |«      dz  }|j                  |«      }||z  }t        t        |t        t        |«      «      «      }	|	S )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 ä�A‹w€HÜ
×Ñ˜!˜XÓ&€Aà€A€b‡j�j�ƒmÑØ�9‰9�>‰>˜!Ó�D€A€qØ�h‰h�q‹k˜QÑ€GØ�6‰6�!‹9€DØ	�4‰€Bä	Œc�(œC¤ r›NÓ+Ó	,€BØ€Ir   c                 óF  — ddl }ddl}t        | «      }t        |«      }t	        j
                  | |«      }d||j                  |«      <   |j                  j                  |«      }t        t        |t        |«      «      «      }i }| D ]Ë  }	||	   }
||
dd…f   j                  «       }|dd…|
f   j                  «       }d||
dd…f<   d|dd…|
f<   ||j                  j                  |«      z
  |z  }d||
dd…f<   d|dd…|
f<   ||j                  |j                  |«      «      z  }t        |j                  «       «      ||	<   |||
dd…f<   ||dd…|
f<   ŒÍ t        |«      }|dkD  r7d|dz
  dz  |dz
  z
  z  }|j!                  «       D ��ci c]  \  }}|||z  “Œ }}}|S c c}}w )a  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 Ûä�A‹w€HÜˆH‹€AÜ
×Ñ˜!˜XÓ&€Aà€A€b‡j�j�ƒmÑØ�9‰9�>‰>˜!Ó€DÜ”3�x¤ q£Ó*Ó+€GØ
€CØò ˆà�A‰JˆØ�’1�‰g�l‰l‹nˆØ’�1�‰g�l‰l‹nˆØˆˆ!ŠQˆ$‰ØˆŠ!ˆQˆ$‰Ø�B—I‘I—N‘N 1Ó%Ñ%¨Ñ-ˆàˆˆ!ŠQˆ$‰ØˆŠ!ˆQˆ$‰Ø	ˆR�W‰W�R—W‘W˜Q“ZÓ Ñ ˆÜ�q—u‘u“w“ˆˆA‰àˆˆ!ŠQˆ$‰ØˆŠ!ˆQˆ$Šðô" �‹H€EØˆq‚yØ˜ ™¨Ñ)¨U°S©[Ñ9Ñ:ˆØ69·i±i³k×B¡{ t¨Uˆt�U˜U‘]Ñ"ÐBˆÑBØ€Jùó Cs   ÆFc                 óF   — t        t        | «      j                  «       «      S )uÏ  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   