ó žÃÒYc@ smdZddlmZddlmZddlmZdjddgƒZdgZ d d „Z d „Z d S( s%Node redundancy for bipartite graphs.iÿÿÿÿ(tdivision(t combinations(t NetworkXErrors s%Jordi Torrents sAric Hagberg (hagberg@lanl.gov)tnode_redundancyc sT|dkrˆ}nt‡fd†|Dƒƒr@tdƒ‚n‡fd†|DƒS(s 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:: >>> import networkx as nx >>> 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:: >>> import networkx as nx >>> 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:: >>> import networkx as nx >>> 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. c3 s%|]}tˆ|ƒdkVqdS(iN(tlen(t.0tv(tG(s~/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bipartite/redundancy.pys bssSCannot compute redundancy coefficient for a node that has fewer than two neighbors.c s"i|]}tˆ|ƒ|“qS((t_node_redundancy(RR(R(s~/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bipartite/redundancy.pys fs N(tNonetanyR(Rtnodes((Rs~/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bipartite/redundancy.pyRs M  c sPtˆˆƒ}t‡‡fd†tˆˆdƒDƒƒ}d|||dS(s™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`. c3 s@|]6\}}tˆ|ƒtˆ|ƒ@ˆhrdVqdS(iN(tset(Rtutw(RR(s~/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bipartite/redundancy.pys ws ii(RtsumR(RRtntoverlap((RRs~/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bipartite/redundancy.pyRis ,N( t__doc__t __future__Rt itertoolsRtnetworkxRtjoint __author__t__all__R RR(((s~/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/algorithms/bipartite/redundancy.pyts    V