
    hJ                     \    S r SSKJr  SSKrSSKJr  S/r\R                  SS j5       rS r	g)	z%Node redundancy for bipartite graphs.    )combinationsN)NetworkXErrornode_redundancyc                    ^  Uc  T n[        U 4S jU 5       5      (       a  [        S5      eU Vs0 s H  o"[        T U5      _M     sn$ s  snf )u  Computes the node redundancy coefficients for the nodes in the bipartite
graph `G`.

The redundancy coefficient of a node `v` is the fraction of pairs of
neighbors of `v` that are both linked to other nodes. In a one-mode
projection these nodes would be linked together even if `v` were
not there.

More formally, for any vertex `v`, the *redundancy coefficient of `v`* is
defined by

.. math::

    rc(v) = \frac{|\{\{u, w\} \subseteq N(v),
    \: \exists v' \neq  v,\: (v',u) \in E\:
    \mathrm{and}\: (v',w) \in E\}|}{ \frac{|N(v)|(|N(v)|-1)}{2}},

where `N(v)` is the set of neighbors of `v` in `G`.

Parameters
----------
G : graph
    A bipartite graph

nodes : list or iterable (optional)
    Compute redundancy for these nodes. The default is all nodes in G.

Returns
-------
redundancy : dictionary
    A dictionary keyed by node with the node redundancy value.

Examples
--------
Compute the redundancy coefficient of each node in a graph::

    >>> from networkx.algorithms import bipartite
    >>> G = nx.cycle_graph(4)
    >>> rc = bipartite.node_redundancy(G)
    >>> rc[0]
    1.0

Compute the average redundancy for the graph::

    >>> from networkx.algorithms import bipartite
    >>> G = nx.cycle_graph(4)
    >>> rc = bipartite.node_redundancy(G)
    >>> sum(rc.values()) / len(G)
    1.0

Compute the average redundancy for a set of nodes::

    >>> from networkx.algorithms import bipartite
    >>> G = nx.cycle_graph(4)
    >>> rc = bipartite.node_redundancy(G)
    >>> nodes = [0, 2]
    >>> sum(rc[n] for n in nodes) / len(nodes)
    1.0

Raises
------
NetworkXError
    If any of the nodes in the graph (or in `nodes`, if specified) has
    (out-)degree less than two (which would result in division by zero,
    according to the definition of the redundancy coefficient).

References
----------
.. [1] Latapy, Matthieu, Clémence Magnien, and Nathalie Del Vecchio (2008).
   Basic notions for the analysis of large two-mode networks.
   Social Networks 30(1), 31--48.

c              3   F   >#    U  H  n[        TU   5      S :  v   M     g7f)   N)len).0vGs     Z/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/bipartite/redundancy.py	<genexpr>"node_redundancy.<locals>.<genexpr>X   s     
(%Q3qt9q=%s   !zSCannot compute redundancy coefficient for a node that has fewer than two neighbors.)anyr   _node_redundancy)r   nodesr   s   `  r   r   r      sX    V }

(%
(((2
 	

 055u!1%%u555s   A	c                    ^ ^ [        T T   5      n[        U U4S j[        T T   S5       5       5      nSU-  X"S-
  -  -  $ )a  Returns the redundancy of the node `v` in the bipartite graph `G`.

If `G` is a graph with `n` nodes, the redundancy of a node is the ratio
of the "overlap" of `v` to the maximum possible overlap of `v`
according to its degree. The overlap of `v` is the number of pairs of
neighbors that have mutual neighbors themselves, other than `v`.

`v` must have at least two neighbors in `G`.

c              3   |   >#    U  H1  u  p[        TU   5      [        TU   5      -  T1-
  (       d  M-  S v   M3     g7f)   N)set)r
   uwr   r   s      r   r   #_node_redundancy.<locals>.<genexpr>m   s7      -fq#ad)c!A$i2GA31N-s   ,<	<r   r   )r	   sumr   )r   r   noverlaps   ``  r   r   r   a   sK     	AaD	A $QqT1- G KAQK((    )N)
__doc__	itertoolsr   networkxnxr   __all___dispatchabler   r    r   r   <module>r%      s;    + "  "
 R6 R6j)r   