K i'dZddlmZddlZgdZej dddZej dddZej ddd Z ej ddd Z ej ddd Z ej ddd Z ej d Z ej dZy)z5Functions for finding and evaluating cuts in a graph.)chainN)boundary_expansion conductancecut_sizeedge_expansionmixing_expansionnode_expansionnormalized_cut_sizevolumeweight) edge_attrsc tj||||d}|jr$t|tj||||d}t d|DS)aReturns the size of the cut between two sets of nodes. A *cut* is a partition of the nodes of a graph into two sets. The *cut size* is the sum of the weights of the edges "between" the two sets of nodes. Parameters ---------- G : NetworkX graph S : collection A collection of nodes in `G`. T : collection A collection of nodes in `G`. If not specified, this is taken to be the set complement of `S`. weight : object Edge attribute key to use as weight. If not specified, edges have weight one. Returns ------- number Total weight of all edges from nodes in set `S` to nodes in set `T` (and, in the case of directed graphs, all edges from nodes in `T` to nodes in `S`). Examples -------- In the graph with two cliques joined by a single edges, the natural bipartition of the graph into two blocks, one for each clique, yields a cut of weight one:: >>> G = nx.barbell_graph(3, 0) >>> S = {0, 1, 2} >>> T = {3, 4, 5} >>> nx.cut_size(G, S, T) 1 Each parallel edge in a multigraph is counted when determining the cut size:: >>> G = nx.MultiGraph(["ab", "ab"]) >>> S = {"a"} >>> T = {"b"} >>> nx.cut_size(G, S, T) 2 Notes ----- In a multigraph, the cut size is the total weight of edges including multiplicity. )datadefaultc3(K|] \}}}| ywN).0uvr s ^/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/networkx/algorithms/cuts.py zcut_size..Rs0,!Qv0s)nx edge_boundary is_directedrsum)GSTr edgess rrrsVr   Q161 =E}}eR--aAFANO 0%0 00c|jr |jn |j}td|||DS)a|Returns the volume of a set of nodes. The *volume* of a set *S* is the sum of the (out-)degrees of nodes in *S* (taking into account parallel edges in multigraphs). [1] Parameters ---------- G : NetworkX graph S : collection A collection of nodes in `G`. weight : object Edge attribute key to use as weight. If not specified, edges have weight one. Returns ------- number The volume of the set of nodes represented by `S` in the graph `G`. See also -------- conductance cut_size edge_expansion edge_boundary normalized_cut_size References ---------- .. [1] David Gleich. *Hierarchical Directed Spectral Graph Partitioning*. c3&K|] \}}| ywrr)rrds rrzvolume..}s6TQq6sr )r out_degreedegreer)rrr r(s rr r Us4N]]_Q\\!((F 6VAf56 66r"c|t|t|z }t||||}t|||}t|||}|d|z d|z zzS)aReturns the normalized size of the cut between two sets of nodes. The *normalized cut size* is the cut size times the sum of the reciprocal sizes of the volumes of the two sets. [1] Parameters ---------- G : NetworkX graph S : collection A collection of nodes in `G`. T : collection A collection of nodes in `G`. weight : object Edge attribute key to use as weight. If not specified, edges have weight one. Returns ------- number The normalized cut size between the two sets `S` and `T`. Notes ----- In a multigraph, the cut size is the total weight of edges including multiplicity. See also -------- conductance cut_size edge_expansion volume References ---------- .. [1] David Gleich. *Hierarchical Directed Spectral Graph Partitioning*. r r r&r)setrr rrr r num_cut_edgesvolume_Svolume_Ts rr r s_Z y FSVOQQv6Ma6*Ha6*H Q\a(l; < r&)r+rr minr,s rrrsYP y FSVOQ1V4Ma6*Ha6*H 3x2 22r"c|t|t|z }t||||}|tt|t|z S)aReturns the edge expansion between two node sets. The *edge expansion* is the quotient of the cut size and the smaller of the cardinalities of the two sets. [1] Parameters ---------- G : NetworkX graph S : collection A collection of nodes in `G`. T : collection A collection of nodes in `G`. weight : object Edge attribute key to use as weight. If not specified, edges have weight one. Returns ------- number The edge expansion between the two sets `S` and `T`. See also -------- boundary_expansion mixing_expansion node_expansion References ---------- .. [1] Fan Chung. *Spectral Graph Theory*. (CBMS Regional Conference Series in Mathematics, No. 92), American Mathematical Society, 1997, ISBN 0-8218-0315-8 r*)r+rr1len)rrr r r-s rrrsER y FSVOQQv6M 3s1vs1v. ..r"cPt||||}|j}|d|zz S)usReturns the mixing expansion between two node sets. The *mixing expansion* is the quotient of the cut size and twice the number of edges in the graph. [1] Parameters ---------- G : NetworkX graph S : collection A collection of nodes in `G`. T : collection A collection of nodes in `G`. weight : object Edge attribute key to use as weight. If not specified, edges have weight one. Returns ------- number The mixing expansion between the two sets `S` and `T`. See also -------- boundary_expansion edge_expansion node_expansion References ---------- .. [1] Vadhan, Salil P. "Pseudorandomness." *Foundations and Trends in Theoretical Computer Science* 7.1–3 (2011): 1–336. r*)rnumber_of_edges)rrr r r-num_total_edgess rrrs3RQQv6M'')O A/ 00r"cttjfd|D}t|t|z S)uReturns the node expansion of the set `S`. The *node expansion* is the quotient of the size of the node boundary of *S* and the cardinality of *S*. [1] Parameters ---------- G : NetworkX graph S : collection A collection of nodes in `G`. Returns ------- number The node expansion of the set `S`. See also -------- boundary_expansion edge_expansion mixing_expansion References ---------- .. [1] Vadhan, Salil P. "Pseudorandomness." *Foundations and Trends in Theoretical Computer Science* 7.1–3 (2011): 1–336. c3@K|]}j|ywr) neighbors)rrrs rrz!node_expansion..fs*Ea1;;q>*Es)r+r from_iterabler3)rr neighborhoods` rr r Ds5Du***E1*EEFL | s1v %%r"cXttj||t|z S)uReturns the boundary expansion of the set `S`. The *boundary expansion* is the quotient of the size of the node boundary and the cardinality of *S*. [1] Parameters ---------- G : NetworkX graph S : collection A collection of nodes in `G`. Returns ------- number The boundary expansion of the set `S`. See also -------- edge_expansion mixing_expansion node_expansion References ---------- .. [1] Vadhan, Salil P. "Pseudorandomness." *Foundations and Trends in Theoretical Computer Science* 7.1–3 (2011): 1–336. )r3r node_boundary)rrs rrrls&D r1% &Q //r")NNr)__doc__ itertoolsrnetworkxr__all__ _dispatchablerr r rrrr rrr"rrDs; X&;1';1|X&'7''7TX&1='1=hX&,3',3^X&+/'+/\X&*1'*1^"&"&N!0!0r"