
    wg                         d Z ddlZddlmZ ddlmZ g dZ ed      ej                  d               Z	 ed      ej                  d	               Z
 ed      ej                  d
               Zy)zDProvides functions for computing the efficiency of nodes and graphs.    N)NetworkXNoPath   )not_implemented_for)
efficiencylocal_efficiencyglobal_efficiencydirectedc                 `    	 dt        j                  | ||      z  }|S # t        $ r d}Y |S w xY w)ad  Returns the efficiency of a pair of nodes in a graph.

    The *efficiency* of a pair of nodes is the multiplicative inverse of the
    shortest path distance between the nodes [1]_. Returns 0 if no path
    between nodes.

    Parameters
    ----------
    G : :class:`networkx.Graph`
        An undirected graph for which to compute the average local efficiency.
    u, v : node
        Nodes in the graph ``G``.

    Returns
    -------
    float
        Multiplicative inverse of the shortest path distance between the nodes.

    Examples
    --------
    >>> G = nx.Graph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)])
    >>> nx.efficiency(G, 2, 3)  # this gives efficiency for node 2 and 3
    0.5

    Notes
    -----
    Edge weights are ignored when computing the shortest path distances.

    See also
    --------
    local_efficiency
    global_efficiency

    References
    ----------
    .. [1] Latora, Vito, and Massimo Marchiori.
           "Efficient behavior of small-world networks."
           *Physical Review Letters* 87.19 (2001): 198701.
           <https://doi.org/10.1103/PhysRevLett.87.198701>

       r   )nxshortest_path_lengthr   )Guveffs       l/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/networkx/algorithms/efficiency_measures.pyr   r      sC    X"))!Q22 J  Js    --c                     t        |       }||dz
  z  }|dk7  rNt        j                  |       }d}|D ]+  \  }}|j                         D ]  \  }}|dkD  s|d|z  z  } - ||z  }|S d}|S )a3  Returns the average global efficiency of the graph.

    The *efficiency* of a pair of nodes in a graph is the multiplicative
    inverse of the shortest path distance between the nodes. The *average
    global efficiency* of a graph is the average efficiency of all pairs of
    nodes [1]_.

    Parameters
    ----------
    G : :class:`networkx.Graph`
        An undirected graph for which to compute the average global efficiency.

    Returns
    -------
    float
        The average global efficiency of the graph.

    Examples
    --------
    >>> G = nx.Graph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)])
    >>> round(nx.global_efficiency(G), 12)
    0.916666666667

    Notes
    -----
    Edge weights are ignored when computing the shortest path distances.

    See also
    --------
    local_efficiency

    References
    ----------
    .. [1] Latora, Vito, and Massimo Marchiori.
           "Efficient behavior of small-world networks."
           *Physical Review Letters* 87.19 (2001): 198701.
           <https://doi.org/10.1103/PhysRevLett.87.198701>

    r   r   )lenr   all_pairs_shortest_path_lengthitems)	r   ndenomlengthsg_effsourcetargetstargetdistances	            r   r   r   >   s    T 	AAQKEz33A6& 	*OFG$+MMO * a<Q\)E*	* 	 L  L    c                 H      fd D        }t        |      t               z  S )a  Returns the average local efficiency of the graph.

    The *efficiency* of a pair of nodes in a graph is the multiplicative
    inverse of the shortest path distance between the nodes. The *local
    efficiency* of a node in the graph is the average global efficiency of the
    subgraph induced by the neighbors of the node. The *average local
    efficiency* is the average of the local efficiencies of each node [1]_.

    Parameters
    ----------
    G : :class:`networkx.Graph`
        An undirected graph for which to compute the average local efficiency.

    Returns
    -------
    float
        The average local efficiency of the graph.

    Examples
    --------
    >>> G = nx.Graph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3)])
    >>> nx.local_efficiency(G)
    0.9166666666666667

    Notes
    -----
    Edge weights are ignored when computing the shortest path distances.

    See also
    --------
    global_efficiency

    References
    ----------
    .. [1] Latora, Vito, and Massimo Marchiori.
           "Efficient behavior of small-world networks."
           *Physical Review Letters* 87.19 (2001): 198701.
           <https://doi.org/10.1103/PhysRevLett.87.198701>

    c              3   X   K   | ]!  }t        j                  |                # y w)N)r   subgraph).0r   r   s     r   	<genexpr>z#local_efficiency.<locals>.<genexpr>   s$     Fq(AaD)9:Fs   '*)sumr   )r   efficiency_lists   ` r   r   r   {   s%    V GAFO#a&((r   )__doc__networkxr   networkx.exceptionr   utilsr   __all___dispatchabler   r   r    r   r   <module>r.      s    J  - '
A Z .  !.b Z 8  !8v Z *)  !*)r   