From fb31b99866c529b758fc74f0638b0fb05c9d89e2 Mon Sep 17 00:00:00 2001 From: 20kav <123114628+20kavishs@users.noreply.github.com> Date: Tue, 27 Jun 2023 00:32:00 -0400 Subject: [PATCH 01/26] first commit, isolates and betweeness isolates passes all tests still need to pass a few betweenness tests --- .gitignore | 2 + README.md | 18 ++- nx_parallel/__init__.py | 4 +- .../algorithms/centrality/betweenness.py | 119 ++++++++++++++++++ nx_parallel/algorithms/isolate.py | 105 ++++++++++++++++ nx_parallel/centrality.py | 44 ------- nx_parallel/{ => classes}/graph.py | 0 nx_parallel/interface.py | 19 ++- 8 files changed, 258 insertions(+), 53 deletions(-) create mode 100644 nx_parallel/algorithms/centrality/betweenness.py create mode 100644 nx_parallel/algorithms/isolate.py delete mode 100644 nx_parallel/centrality.py rename nx_parallel/{ => classes}/graph.py (100%) diff --git a/.gitignore b/.gitignore index aa44ee2..06dcea0 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,5 @@ dmypy.json # Pyre type checker .pyre/ +test.py +runtimes.py diff --git a/README.md b/README.md index cd5079b..348869a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -NX-Parallel +nx_parallel ----------- -A NetworkX backend plugin which uses dask for parallelization. +A NetworkX backend plugin which uses joblib and multiprocessing for parallelization. ``` python In [1]: import networkx as nx; import nx_parallel @@ -23,4 +23,16 @@ Out[4]: 8: 0.0, 9: 0.0} -``` \ No newline at end of file +``` + +Currently the following functions have parallelized implementations: + - centrality + - betweenness_centrality + - isolates + - number_of_isolates + + +### TODO: add graphic showing speedup of nx_parallel vs. networkx + + + diff --git a/nx_parallel/__init__.py b/nx_parallel/__init__.py index f16b848..243e8e3 100644 --- a/nx_parallel/__init__.py +++ b/nx_parallel/__init__.py @@ -1,3 +1,3 @@ -from .centrality import * -from .graph import * +from .algorithms import * +from .classes.graph import * from .interface import * diff --git a/nx_parallel/algorithms/centrality/betweenness.py b/nx_parallel/algorithms/centrality/betweenness.py new file mode 100644 index 0000000..2165c08 --- /dev/null +++ b/nx_parallel/algorithms/centrality/betweenness.py @@ -0,0 +1,119 @@ +from joblib import Parallel, delayed +import multiprocessing +import itertools +from networkx import betweenness_centrality_subset + +__all__ = ["betweenness_centrality"] + + +def betweenness_centrality( + G, k=None, normalized=True, weight=None, endpoints=False, seed=None +): + """Compute the shortest-path betweenness centrality for nodes. Parallel implementation. + + Betweenness centrality of a node $v$ is the sum of the + fraction of all-pairs shortest paths that pass through $v$ + + .. math:: + + c_B(v) =\sum_{s,t \in V} \frac{\sigma(s, t|v)}{\sigma(s, t)} + + where $V$ is the set of nodes, $\sigma(s, t)$ is the number of + shortest $(s, t)$-paths, and $\sigma(s, t|v)$ is the number of + those paths passing through some node $v$ other than $s, t$. + If $s = t$, $\sigma(s, t) = 1$, and if $v \in {s, t}$, + $\sigma(s, t|v) = 0$ [2]_. + + Parameters + ---------- + G : graph + A NetworkX graph. + + k : int, optional (default=None) + If k is not None use k node samples to estimate betweenness. + The value of k <= n where n is the number of nodes in the graph. + Higher values give better approximation. + + normalized : bool, optional + If True the betweenness values are normalized by `2/((n-1)(n-2))` + for graphs, and `1/((n-1)(n-2))` for directed graphs where `n` + is the number of nodes in G. + + weight : None or string, optional (default=None) + If None, all edge weights are considered equal. + Otherwise holds the name of the edge attribute used as weight. + Weights are used to calculate weighted shortest paths, so they are + interpreted as distances. + + endpoints : bool, optional + If True include the endpoints in the shortest path counts. + + seed : integer, random_state, or None (default) + Indicator of random number generation state. + See :ref:`Randomness`. + Note that this is only used if k is not None. + + Returns + ------- + nodes : dictionary + Dictionary of nodes with betweenness centrality as the value. + + Notes + ----- + This algorithm is a parallelized version of betwenness centrality in NetworkX. Nodes are divided into + chunks based on the number of available processors, and otherwise all calculations are similar + + References + ---------- + .. [1] Ulrik Brandes: + A Faster Algorithm for Betweenness Centrality. + Journal of Mathematical Sociology 25(2):163-177, 2001. + https://doi.org/10.1080/0022250X.2001.9990249 + .. [2] Linton C. Freeman: + A set of measures of centrality based on betweenness. + Sociometry 40: 35–41, 1977 + https://doi.org/10.2307/3033543 + .. [3] Linton C. Freeman: + A set of measures of centrality based on betweenness. + Sociometry 40: 35–41, 1977 + https://doi.org/10.2307/3033543 + .. [4] NetworkX Development Team: + Parallel Betweenness Centrality. NetworkX documentation. + Available at: https://networkx.org/documentation/stable/auto_examples/algorithms/plot_parallel_betweenness.html + Accessed on June 26, 2023. + """ + # TODO: Work on passing all tests for betweenness_centrality + total_cores = multiprocessing.cpu_count() + num_nodes = len(G) + num_chunks = max(num_nodes // total_cores, 1) + node_chunks = list(_chunks(G.nodes(), num_chunks)) + bt_sc = Parallel(n_jobs=total_cores, backend="loky")( + delayed(betweenness_centrality_subset)( + G, + nodes, + list(G), + normalized, + weight, + ) + for nodes in node_chunks + ) + + #Reducing partial solution + bt_c = bt_sc[0] + for bt in bt_sc[1:]: + for n in bt: + bt_c[n] += bt[n] + + return bt_c + +# helpers for betweenness centrality + +def _chunks(l, n): # divide vertices into chunks of specified size + l_c = iter(l) + while True: + x = tuple(itertools.islice(l_c, n)) + if not x: + return + yield x + + diff --git a/nx_parallel/algorithms/isolate.py b/nx_parallel/algorithms/isolate.py new file mode 100644 index 0000000..f97608b --- /dev/null +++ b/nx_parallel/algorithms/isolate.py @@ -0,0 +1,105 @@ +from joblib import Parallel, delayed + +__all__ = ["number_of_isolates"] + +def is_isolate(G, n): + """Determines whether a node is an isolate. + + An *isolate* is a node with no neighbors (that is, with degree + zero). For directed graphs, this means no in-neighbors and no + out-neighbors. + + Parameters + ---------- + G : NetworkX graph + + n : node + A node in `G`. + + Returns + ------- + is_isolate : bool + True if and only if `n` has no neighbors. + + Examples + -------- + >>> G = nx.Graph() + >>> G.add_edge(1, 2) + >>> G.add_node(3) + >>> nx.is_isolate(G, 2) + False + >>> nx.is_isolate(G, 3) + True + """ + return G.degree(n) == 0 + +def isolates(G): + """Iterator over isolates in the graph. + + An *isolate* is a node with no neighbors (that is, with degree + zero). For directed graphs, this means no in-neighbors and no + out-neighbors. + + Parameters + ---------- + G : NetworkX graph + + Returns + ------- + iterator + An iterator over the isolates of `G`. + + Examples + -------- + To get a list of all isolates of a graph, use the :class:`list` + constructor:: + + >>> G = nx.Graph() + >>> G.add_edge(1, 2) + >>> G.add_node(3) + >>> list(nx.isolates(G)) + [3] + + To remove all isolates in the graph, first create a list of the + isolates, then use :meth:`Graph.remove_nodes_from`:: + + >>> G.remove_nodes_from(list(nx.isolates(G))) + >>> list(G) + [1, 2] + + For digraphs, isolates have zero in-degree and zero out_degre:: + + >>> G = nx.DiGraph([(0, 1), (1, 2)]) + >>> G.add_node(3) + >>> list(nx.isolates(G)) + [3] + + """ + return (n for n, d in G.degree() if d == 0) + + +def number_of_isolates(G): + """Returns the number of isolates in the graph. Parallel implementation. + + An *isolate* is a node with no neighbors (that is, with degree + zero). For directed graphs, this means no in-neighbors and no + out-neighbors. + + Parameters + ---------- + G : NetworkX graph + + Returns + ------- + int + The number of degree zero nodes in the graph `G`. + + """ + num_isolates = Parallel(n_jobs=-1, backend="threading")( + delayed(lambda x: 1)(v) for v in isolates(G) + ) + return sum(num_isolates) + + + + diff --git a/nx_parallel/centrality.py b/nx_parallel/centrality.py deleted file mode 100644 index abba84c..0000000 --- a/nx_parallel/centrality.py +++ /dev/null @@ -1,44 +0,0 @@ -from joblib import Parallel, delayed -from networkx.algorithms.centrality.betweenness import ( - _single_source_shortest_path_basic, - _accumulate_endpoints, - _accumulate_basic, - _rescale, - _single_source_dijkstra_path_basic, -) - -__all__ = ["betweenness_centrality"] - - -def betweenness_centrality( - G, k=None, normalized=True, weight=None, endpoints=False, seed=None -): - betweenness = dict.fromkeys(G, 0.0) # b[v]=0 for v in G - if k is None: - nodes = G - else: - nodes = seed.sample(list(G.nodes()), k) - - def __node_loop(nodes): - for s in nodes: - # single source shortest paths - if weight is None: # use BFS - S, P, sigma, _ = _single_source_shortest_path_basic(G, s) - else: # use Dijkstra's algorithm - S, P, sigma, _ = _single_source_dijkstra_path_basic(G, s, weight) - # accumulation - if endpoints: - betweenness, _ = _accumulate_endpoints(betweenness, S, P, sigma, s) - else: - betweenness, _ = _accumulate_basic(betweenness, S, P, sigma, s) - - # rescaling - betweenness = _rescale( - betweenness, - len(G), - normalized=normalized, - directed=G.is_directed(), - k=k, - endpoints=endpoints, - ) - return betweenness diff --git a/nx_parallel/graph.py b/nx_parallel/classes/graph.py similarity index 100% rename from nx_parallel/graph.py rename to nx_parallel/classes/graph.py diff --git a/nx_parallel/interface.py b/nx_parallel/interface.py index e05aee0..a6bd577 100644 --- a/nx_parallel/interface.py +++ b/nx_parallel/interface.py @@ -1,15 +1,25 @@ -from .centrality import betweenness_centrality +from .algorithms.centrality.betweenness import betweenness_centrality +from .algorithms.isolate import number_of_isolates, isolates, is_isolate + __all__ = ["Dispatcher"] class Dispatcher: + # ============================= + # Centrality betweenness_centrality = betweenness_centrality + # Isolates + number_of_isolates = number_of_isolates + isolates = isolates + is_isolate = is_isolate + # ============================= + @staticmethod def convert_from_nx(incoming_graph, weight=None, *, name=None): import networkx as nx - from .graph import ParallelGraph + from .classes.graph import ParallelGraph if isinstance(incoming_graph, nx.Graph): return ParallelGraph(incoming_graph) @@ -17,9 +27,10 @@ def convert_from_nx(incoming_graph, weight=None, *, name=None): @staticmethod def convert_to_nx(obj, *, name=None): - from .graph import ParallelGraph + from .classes.graph import ParallelGraph + import networkx as nx - if isinstance(obj, Graph): + if isinstance(obj, nx.Graph): obj = obj.to_networkx() return obj From e9868e7479f91298e41246f172d1deb79e14e67f Mon Sep 17 00:00:00 2001 From: 20kav <123114628+20kavishs@users.noreply.github.com> Date: Mon, 10 Jul 2023 00:35:45 -0400 Subject: [PATCH 02/26] Works with PR #6688, more graph types, parallel implementations of vitality and tournament - Decided to just make things work with PR #6688 (had all the functions I needed marked with dispatch decorator) - More graph types and small interface changes - parallel implementations of closeness_vitality + tournament (I am a bit ahead of schedule) - Made networkx tests into my own tests for nx_parallel (same directories as in networkx. can be easily run w pytest for CI) - ended up having to include all the functions, but didn't have to reimplement (see isolates or tournament for example) - added utils/chunk.py --- .gitignore | 2 + .../algorithms/centrality/betweenness.py | 40 +- .../centrality/tests/test_betweenness.py | 579 ++++++++++++++++++ nx_parallel/algorithms/isolate.py | 105 +--- nx_parallel/algorithms/tests/test_isolate.py | 29 + .../algorithms/tests/test_tournament.py | 181 ++++++ nx_parallel/algorithms/tests/test_vitality.py | 51 ++ nx_parallel/algorithms/tournament.py | 194 ++++++ nx_parallel/algorithms/utils/chunk.py | 10 + nx_parallel/algorithms/vitality.py | 82 +++ nx_parallel/classes/graph.py | 32 +- nx_parallel/interface.py | 182 +++++- 12 files changed, 1355 insertions(+), 132 deletions(-) create mode 100644 nx_parallel/algorithms/centrality/tests/test_betweenness.py create mode 100644 nx_parallel/algorithms/tests/test_isolate.py create mode 100644 nx_parallel/algorithms/tests/test_tournament.py create mode 100644 nx_parallel/algorithms/tests/test_vitality.py create mode 100644 nx_parallel/algorithms/tournament.py create mode 100644 nx_parallel/algorithms/utils/chunk.py create mode 100644 nx_parallel/algorithms/vitality.py diff --git a/.gitignore b/.gitignore index 06dcea0..37bad78 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,5 @@ dmypy.json test.py runtimes.py +nx_parallel/interface_old.py +nx_parallel/interface2.py diff --git a/nx_parallel/algorithms/centrality/betweenness.py b/nx_parallel/algorithms/centrality/betweenness.py index 2165c08..79977ac 100644 --- a/nx_parallel/algorithms/centrality/betweenness.py +++ b/nx_parallel/algorithms/centrality/betweenness.py @@ -1,15 +1,26 @@ -from joblib import Parallel, delayed -import multiprocessing -import itertools +from joblib import Parallel, delayed, cpu_count from networkx import betweenness_centrality_subset +from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph +from nx_parallel.algorithms.utils.chunk import chunks __all__ = ["betweenness_centrality"] +"""Helper to interface between graph types""" +def _convert(G): + if isinstance(G, ParallelMultiDiGraph): + I = ParallelMultiDiGraph.to_networkx(G) + if isinstance(G, ParallelMultiGraph): + I = ParallelMultiGraph.to_networkx(G) + if isinstance(G, ParallelDiGraph): + I = ParallelDiGraph.to_networkx(G) + if isinstance(G, ParallelGraph): + I = ParallelGraph.to_networkx(G) + return I def betweenness_centrality( G, k=None, normalized=True, weight=None, endpoints=False, seed=None ): - """Compute the shortest-path betweenness centrality for nodes. Parallel implementation. + r"""Compute the shortest-path betweenness centrality for nodes. Parallel implementation. Betweenness centrality of a node $v$ is the sum of the fraction of all-pairs shortest paths that pass through $v$ @@ -82,14 +93,14 @@ def betweenness_centrality( Available at: https://networkx.org/documentation/stable/auto_examples/algorithms/plot_parallel_betweenness.html Accessed on June 26, 2023. """ - # TODO: Work on passing all tests for betweenness_centrality - total_cores = multiprocessing.cpu_count() - num_nodes = len(G) - num_chunks = max(num_nodes // total_cores, 1) - node_chunks = list(_chunks(G.nodes(), num_chunks)) + #TODO: Work on passing all tests for betweenness_centrality + I = _convert(G) + total_cores = cpu_count() + num_chunks = max(len(G) // total_cores, 1) + node_chunks = list(chunks(G.nodes, num_chunks)) bt_sc = Parallel(n_jobs=total_cores, backend="loky")( delayed(betweenness_centrality_subset)( - G, + I, nodes, list(G), normalized, @@ -103,17 +114,8 @@ def betweenness_centrality( for bt in bt_sc[1:]: for n in bt: bt_c[n] += bt[n] - return bt_c -# helpers for betweenness centrality -def _chunks(l, n): # divide vertices into chunks of specified size - l_c = iter(l) - while True: - x = tuple(itertools.islice(l_c, n)) - if not x: - return - yield x diff --git a/nx_parallel/algorithms/centrality/tests/test_betweenness.py b/nx_parallel/algorithms/centrality/tests/test_betweenness.py new file mode 100644 index 0000000..2298b69 --- /dev/null +++ b/nx_parallel/algorithms/centrality/tests/test_betweenness.py @@ -0,0 +1,579 @@ +import pytest + +import networkx as nx; import nx_parallel + + +def weighted_G(): + G = nx.Graph() + G.add_edge(0, 1, weight=3) + G.add_edge(0, 2, weight=2) + G.add_edge(0, 3, weight=6) + G.add_edge(0, 4, weight=4) + G.add_edge(1, 3, weight=5) + G.add_edge(1, 5, weight=5) + G.add_edge(2, 4, weight=1) + G.add_edge(3, 4, weight=2) + G.add_edge(3, 5, weight=1) + G.add_edge(4, 5, weight=4) + return G + + +class TestBetweennessCentrality: + def test_K5(self): + """Betweenness centrality: K5""" + G = nx.complete_graph(5) + H = nx_parallel.ParallelGraph(G) + b = nx.betweenness_centrality(H, weight=None, normalized=False) + b_answer = {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_K5_endpoints(self): + """Betweenness centrality: K5 endpoints""" + G = nx.complete_graph(5) + H = nx_parallel.ParallelGraph(G) + b = nx.betweenness_centrality(H, weight=None, normalized=False, endpoints=True) + b_answer = {0: 4.0, 1: 4.0, 2: 4.0, 3: 4.0, 4: 4.0} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + # normalized = True case + b = nx.betweenness_centrality(H, weight=None, normalized=True, endpoints=True) + b_answer = {0: 0.4, 1: 0.4, 2: 0.4, 3: 0.4, 4: 0.4} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_P3_normalized(self): + """Betweenness centrality: P3 normalized""" + G = nx.path_graph(3) + H = nx_parallel.ParallelDiGraph(G) + b = nx.betweenness_centrality(H, weight=None, normalized=True) + b_answer = {0: 0.0, 1: 1.0, 2: 0.0} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_P3(self): + """Betweenness centrality: P3""" + G = nx.path_graph(3) + H = nx_parallel.ParallelDiGraph(G) + b_answer = {0: 0.0, 1: 1.0, 2: 0.0} + b = nx.betweenness_centrality(H, weight=None, normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_sample_from_P3(self): + """Betweenness centrality: P3 sample""" + G = nx.path_graph(3) + H = nx_parallel.ParallelDiGraph(G) + b_answer = {0: 0.0, 1: 1.0, 2: 0.0} + b = nx.betweenness_centrality(H, k=3, weight=None, normalized=False, seed=1) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + b = nx.betweenness_centrality(H, k=2, weight=None, normalized=False, seed=1) + # python versions give different results with same seed + b_approx1 = {0: 0.0, 1: 1.5, 2: 0.0} + b_approx2 = {0: 0.0, 1: 0.75, 2: 0.0} + for n in sorted(G): + assert b[n] in (b_approx1[n], b_approx2[n]) + + def test_P3_endpoints(self): + """Betweenness centrality: P3 endpoints""" + G = nx.path_graph(3) + H = nx_parallel.ParallelDiGraph(G) + b_answer = {0: 2.0, 1: 3.0, 2: 2.0} + b = nx.betweenness_centrality(H, weight=None, normalized=False, endpoints=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + # normalized = True case + b_answer = {0: 2 / 3, 1: 1.0, 2: 2 / 3} + b = nx.betweenness_centrality(H, weight=None, normalized=True, endpoints=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_krackhardt_kite_graph(self): + """Betweenness centrality: Krackhardt kite graph""" + G = nx.krackhardt_kite_graph() + H = nx_parallel.ParallelGraph(G) + b_answer = { + 0: 1.667, + 1: 1.667, + 2: 0.000, + 3: 7.333, + 4: 0.000, + 5: 16.667, + 6: 16.667, + 7: 28.000, + 8: 16.000, + 9: 0.000, + } + for b in b_answer: + b_answer[b] /= 2 + b = nx.betweenness_centrality(H, weight=None, normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_krackhardt_kite_graph_normalized(self): + """Betweenness centrality: Krackhardt kite graph normalized""" + G = nx.krackhardt_kite_graph() + H = nx_parallel.ParallelGraph(G) + b_answer = { + 0: 0.023, + 1: 0.023, + 2: 0.000, + 3: 0.102, + 4: 0.000, + 5: 0.231, + 6: 0.231, + 7: 0.389, + 8: 0.222, + 9: 0.000, + } + b = nx.betweenness_centrality(H, weight=None, normalized=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_florentine_families_graph(self): + """Betweenness centrality: Florentine families graph""" + G = nx.florentine_families_graph() + H = nx_parallel.ParallelGraph(G) + b_answer = { + "Acciaiuoli": 0.000, + "Albizzi": 0.212, + "Barbadori": 0.093, + "Bischeri": 0.104, + "Castellani": 0.055, + "Ginori": 0.000, + "Guadagni": 0.255, + "Lamberteschi": 0.000, + "Medici": 0.522, + "Pazzi": 0.000, + "Peruzzi": 0.022, + "Ridolfi": 0.114, + "Salviati": 0.143, + "Strozzi": 0.103, + "Tornabuoni": 0.092, + } + + b = nx.betweenness_centrality(H, weight=None, normalized=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_les_miserables_graph(self): + """Betweenness centrality: Les Miserables graph""" + G = nx.les_miserables_graph() + H = nx_parallel.ParallelGraph(G) + b_answer = { + "Napoleon": 0.000, + "Myriel": 0.177, + "MlleBaptistine": 0.000, + "MmeMagloire": 0.000, + "CountessDeLo": 0.000, + "Geborand": 0.000, + "Champtercier": 0.000, + "Cravatte": 0.000, + "Count": 0.000, + "OldMan": 0.000, + "Valjean": 0.570, + "Labarre": 0.000, + "Marguerite": 0.000, + "MmeDeR": 0.000, + "Isabeau": 0.000, + "Gervais": 0.000, + "Listolier": 0.000, + "Tholomyes": 0.041, + "Fameuil": 0.000, + "Blacheville": 0.000, + "Favourite": 0.000, + "Dahlia": 0.000, + "Zephine": 0.000, + "Fantine": 0.130, + "MmeThenardier": 0.029, + "Thenardier": 0.075, + "Cosette": 0.024, + "Javert": 0.054, + "Fauchelevent": 0.026, + "Bamatabois": 0.008, + "Perpetue": 0.000, + "Simplice": 0.009, + "Scaufflaire": 0.000, + "Woman1": 0.000, + "Judge": 0.000, + "Champmathieu": 0.000, + "Brevet": 0.000, + "Chenildieu": 0.000, + "Cochepaille": 0.000, + "Pontmercy": 0.007, + "Boulatruelle": 0.000, + "Eponine": 0.011, + "Anzelma": 0.000, + "Woman2": 0.000, + "MotherInnocent": 0.000, + "Gribier": 0.000, + "MmeBurgon": 0.026, + "Jondrette": 0.000, + "Gavroche": 0.165, + "Gillenormand": 0.020, + "Magnon": 0.000, + "MlleGillenormand": 0.048, + "MmePontmercy": 0.000, + "MlleVaubois": 0.000, + "LtGillenormand": 0.000, + "Marius": 0.132, + "BaronessT": 0.000, + "Mabeuf": 0.028, + "Enjolras": 0.043, + "Combeferre": 0.001, + "Prouvaire": 0.000, + "Feuilly": 0.001, + "Courfeyrac": 0.005, + "Bahorel": 0.002, + "Bossuet": 0.031, + "Joly": 0.002, + "Grantaire": 0.000, + "MotherPlutarch": 0.000, + "Gueulemer": 0.005, + "Babet": 0.005, + "Claquesous": 0.005, + "Montparnasse": 0.004, + "Toussaint": 0.000, + "Child1": 0.000, + "Child2": 0.000, + "Brujon": 0.000, + "MmeHucheloup": 0.000, + } + + b = nx.betweenness_centrality(H, weight=None, normalized=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_ladder_graph(self): + """Betweenness centrality: Ladder graph""" + G = nx.Graph() # ladder_graph(3) + G.add_edges_from([(0, 1), (0, 2), (1, 3), (2, 3), (2, 4), (4, 5), (3, 5)]) + H = nx_parallel.ParallelGraph(G) + b_answer = {0: 1.667, 1: 1.667, 2: 6.667, 3: 6.667, 4: 1.667, 5: 1.667} + for b in b_answer: + b_answer[b] /= 2 + b = nx.betweenness_centrality(H, weight=None, normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_disconnected_path(self): + """Betweenness centrality: disconnected path""" + G = nx.Graph() + nx.add_path(G, [0, 1, 2]) + nx.add_path(G, [3, 4, 5, 6]) + H = nx_parallel.ParallelGraph(G) + b_answer = {0: 0, 1: 1, 2: 0, 3: 0, 4: 2, 5: 2, 6: 0} + b = nx.betweenness_centrality(H, weight=None, normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_disconnected_path_endpoints(self): + """Betweenness centrality: disconnected path endpoints""" + G = nx.Graph() + nx.add_path(G, [0, 1, 2]) + nx.add_path(G, [3, 4, 5, 6]) + H = nx_parallel.ParallelGraph(G) + b_answer = {0: 2, 1: 3, 2: 2, 3: 3, 4: 5, 5: 5, 6: 3} + b = nx.betweenness_centrality(H, weight=None, normalized=False, endpoints=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + # normalized = True case + b = nx.betweenness_centrality(H, weight=None, normalized=True, endpoints=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n] / 21, abs=1e-7) + + def test_directed_path(self): + """Betweenness centrality: directed path""" + G = nx.DiGraph() + nx.add_path(G, [0, 1, 2]) + H = nx_parallel.ParallelDiGraph(G) + b = nx.betweenness_centrality(H, weight=None, normalized=False) + b_answer = {0: 0.0, 1: 1.0, 2: 0.0} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_directed_path_normalized(self): + """Betweenness centrality: directed path normalized""" + G = nx.DiGraph() + nx.add_path(G, [0, 1, 2]) + H = nx_parallel.ParallelDiGraph(G) + b = nx.betweenness_centrality(H, weight=None, normalized=True) + b_answer = {0: 0.0, 1: 0.5, 2: 0.0} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + +class TestWeightedBetweennessCentrality: + def test_K5(self): + """Weighted betweenness centrality: K5""" + G = nx.complete_graph(5) + H = nx_parallel.ParallelGraph(G) + b = nx.betweenness_centrality(H, weight="weight", normalized=False) + b_answer = {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_P3_normalized(self): + """Weighted betweenness centrality: P3 normalized""" + G = nx.path_graph(3) + H = nx_parallel.ParallelDiGraph(G) + b = nx.betweenness_centrality(H, weight="weight", normalized=True) + b_answer = {0: 0.0, 1: 1.0, 2: 0.0} + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_P3(self): + """Weighted betweenness centrality: P3""" + G = nx.path_graph(3) + H = nx_parallel.ParallelDiGraph(G) + b_answer = {0: 0.0, 1: 1.0, 2: 0.0} + b = nx.betweenness_centrality(H, weight="weight", normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_krackhardt_kite_graph(self): + """Weighted betweenness centrality: Krackhardt kite graph""" + G = nx.krackhardt_kite_graph() + H = nx_parallel.ParallelGraph(G) + b_answer = { + 0: 1.667, + 1: 1.667, + 2: 0.000, + 3: 7.333, + 4: 0.000, + 5: 16.667, + 6: 16.667, + 7: 28.000, + 8: 16.000, + 9: 0.000, + } + for b in b_answer: + b_answer[b] /= 2 + + b = nx.betweenness_centrality(H, weight="weight", normalized=False) + + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_krackhardt_kite_graph_normalized(self): + """Weighted betweenness centrality: + Krackhardt kite graph normalized + """ + G = nx.krackhardt_kite_graph() + H = nx_parallel.ParallelGraph(G) + b_answer = { + 0: 0.023, + 1: 0.023, + 2: 0.000, + 3: 0.102, + 4: 0.000, + 5: 0.231, + 6: 0.231, + 7: 0.389, + 8: 0.222, + 9: 0.000, + } + b = nx.betweenness_centrality(H, weight="weight", normalized=True) + + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_florentine_families_graph(self): + """Weighted betweenness centrality: + Florentine families graph""" + G = nx.florentine_families_graph() + H = nx_parallel.ParallelGraph(G) + b_answer = { + "Acciaiuoli": 0.000, + "Albizzi": 0.212, + "Barbadori": 0.093, + "Bischeri": 0.104, + "Castellani": 0.055, + "Ginori": 0.000, + "Guadagni": 0.255, + "Lamberteschi": 0.000, + "Medici": 0.522, + "Pazzi": 0.000, + "Peruzzi": 0.022, + "Ridolfi": 0.114, + "Salviati": 0.143, + "Strozzi": 0.103, + "Tornabuoni": 0.092, + } + + b = nx.betweenness_centrality(H, weight="weight", normalized=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_les_miserables_graph(self): + """Weighted betweenness centrality: Les Miserables graph""" + G = nx.les_miserables_graph() + H = nx_parallel.ParallelDiGraph(G) + b_answer = { + "Napoleon": 0.000, + "Myriel": 0.177, + "MlleBaptistine": 0.000, + "MmeMagloire": 0.000, + "CountessDeLo": 0.000, + "Geborand": 0.000, + "Champtercier": 0.000, + "Cravatte": 0.000, + "Count": 0.000, + "OldMan": 0.000, + "Valjean": 0.454, + "Labarre": 0.000, + "Marguerite": 0.009, + "MmeDeR": 0.000, + "Isabeau": 0.000, + "Gervais": 0.000, + "Listolier": 0.000, + "Tholomyes": 0.066, + "Fameuil": 0.000, + "Blacheville": 0.000, + "Favourite": 0.000, + "Dahlia": 0.000, + "Zephine": 0.000, + "Fantine": 0.114, + "MmeThenardier": 0.046, + "Thenardier": 0.129, + "Cosette": 0.075, + "Javert": 0.193, + "Fauchelevent": 0.026, + "Bamatabois": 0.080, + "Perpetue": 0.000, + "Simplice": 0.001, + "Scaufflaire": 0.000, + "Woman1": 0.000, + "Judge": 0.000, + "Champmathieu": 0.000, + "Brevet": 0.000, + "Chenildieu": 0.000, + "Cochepaille": 0.000, + "Pontmercy": 0.023, + "Boulatruelle": 0.000, + "Eponine": 0.023, + "Anzelma": 0.000, + "Woman2": 0.000, + "MotherInnocent": 0.000, + "Gribier": 0.000, + "MmeBurgon": 0.026, + "Jondrette": 0.000, + "Gavroche": 0.285, + "Gillenormand": 0.024, + "Magnon": 0.005, + "MlleGillenormand": 0.036, + "MmePontmercy": 0.005, + "MlleVaubois": 0.000, + "LtGillenormand": 0.015, + "Marius": 0.072, + "BaronessT": 0.004, + "Mabeuf": 0.089, + "Enjolras": 0.003, + "Combeferre": 0.000, + "Prouvaire": 0.000, + "Feuilly": 0.004, + "Courfeyrac": 0.001, + "Bahorel": 0.007, + "Bossuet": 0.028, + "Joly": 0.000, + "Grantaire": 0.036, + "MotherPlutarch": 0.000, + "Gueulemer": 0.025, + "Babet": 0.015, + "Claquesous": 0.042, + "Montparnasse": 0.050, + "Toussaint": 0.011, + "Child1": 0.000, + "Child2": 0.000, + "Brujon": 0.002, + "MmeHucheloup": 0.034, + } + + b = nx.betweenness_centrality(H, weight="weight", normalized=True) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_ladder_graph(self): + """Weighted betweenness centrality: Ladder graph""" + G = nx.Graph() # ladder_graph(3) + G.add_edges_from([(0, 1), (0, 2), (1, 3), (2, 3), (2, 4), (4, 5), (3, 5)]) + H = nx_parallel.ParallelDiGraph(G) + b_answer = {0: 1.667, 1: 1.667, 2: 6.667, 3: 6.667, 4: 1.667, 5: 1.667} + for b in b_answer: + b_answer[b] /= 2 + b = nx.betweenness_centrality(H, weight="weight", normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-3) + + def test_G(self): + """Weighted betweenness centrality: G""" + G = weighted_G() + H = nx_parallel.ParallelGraph(G) + b_answer = {0: 2.0, 1: 0.0, 2: 4.0, 3: 3.0, 4: 4.0, 5: 0.0} + b = nx.betweenness_centrality(H, weight="weight", normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_G2(self): + """Weighted betweenness centrality: G2""" + G = nx.DiGraph() + G.add_weighted_edges_from( + [ + ("s", "u", 10), + ("s", "x", 5), + ("u", "v", 1), + ("u", "x", 2), + ("v", "y", 1), + ("x", "u", 3), + ("x", "v", 5), + ("x", "y", 2), + ("y", "s", 7), + ("y", "v", 6), + ] + ) + H = nx_parallel.ParallelDiGraph(G) + b_answer = {"y": 5.0, "x": 5.0, "s": 4.0, "u": 2.0, "v": 2.0} + + b = nx.betweenness_centrality(H, weight="weight", normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_G3(self): + """Weighted betweenness centrality: G3""" + G = nx.MultiGraph(weighted_G()) + es = list(G.edges(data=True))[::2] # duplicate every other edge + G.add_edges_from(es) + H = nx_parallel.ParallelMultiGraph(G) + b_answer = {0: 2.0, 1: 0.0, 2: 4.0, 3: 3.0, 4: 4.0, 5: 0.0} + b = nx.betweenness_centrality(G, weight="weight", normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) + + def test_G4(self): + """Weighted betweenness centrality: G4""" + G = nx.MultiDiGraph() + G.add_weighted_edges_from( + [ + ("s", "u", 10), + ("s", "x", 5), + ("s", "x", 6), + ("u", "v", 1), + ("u", "x", 2), + ("v", "y", 1), + ("v", "y", 1), + ("x", "u", 3), + ("x", "v", 5), + ("x", "y", 2), + ("x", "y", 3), + ("y", "s", 7), + ("y", "v", 6), + ("y", "v", 6), + ] + ) + + b_answer = {"y": 5.0, "x": 5.0, "s": 4.0, "u": 2.0, "v": 2.0} + H = nx_parallel.ParallelMultiDiGraph(G) + b = nx.betweenness_centrality(H, weight="weight", normalized=False) + for n in sorted(G): + assert b[n] == pytest.approx(b_answer[n], abs=1e-7) diff --git a/nx_parallel/algorithms/isolate.py b/nx_parallel/algorithms/isolate.py index f97608b..6beeca0 100644 --- a/nx_parallel/algorithms/isolate.py +++ b/nx_parallel/algorithms/isolate.py @@ -1,83 +1,30 @@ -from joblib import Parallel, delayed +from joblib import Parallel, cpu_count, delayed +import networkx as nx +from nx_parallel.algorithms.utils.chunk import chunks +from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph __all__ = ["number_of_isolates"] +"""Helper to interface between graph types""" +def _convert(G): + if isinstance(G, ParallelMultiDiGraph): + I = ParallelMultiDiGraph.to_networkx(G) + if isinstance(G, ParallelMultiGraph): + I = ParallelMultiGraph.to_networkx(G) + if isinstance(G, ParallelDiGraph): + I = ParallelDiGraph.to_networkx(G) + if isinstance(G, ParallelGraph): + I = ParallelGraph.to_networkx(G) + return I + +"""Identical to networkx implementation""" def is_isolate(G, n): - """Determines whether a node is an isolate. - - An *isolate* is a node with no neighbors (that is, with degree - zero). For directed graphs, this means no in-neighbors and no - out-neighbors. - - Parameters - ---------- - G : NetworkX graph - - n : node - A node in `G`. - - Returns - ------- - is_isolate : bool - True if and only if `n` has no neighbors. - - Examples - -------- - >>> G = nx.Graph() - >>> G.add_edge(1, 2) - >>> G.add_node(3) - >>> nx.is_isolate(G, 2) - False - >>> nx.is_isolate(G, 3) - True - """ - return G.degree(n) == 0 + return nx.is_isolate(_convert(G), n) +"""Identical to networkx implementation""" def isolates(G): - """Iterator over isolates in the graph. - - An *isolate* is a node with no neighbors (that is, with degree - zero). For directed graphs, this means no in-neighbors and no - out-neighbors. - - Parameters - ---------- - G : NetworkX graph - - Returns - ------- - iterator - An iterator over the isolates of `G`. - - Examples - -------- - To get a list of all isolates of a graph, use the :class:`list` - constructor:: - - >>> G = nx.Graph() - >>> G.add_edge(1, 2) - >>> G.add_node(3) - >>> list(nx.isolates(G)) - [3] - - To remove all isolates in the graph, first create a list of the - isolates, then use :meth:`Graph.remove_nodes_from`:: - - >>> G.remove_nodes_from(list(nx.isolates(G))) - >>> list(G) - [1, 2] - - For digraphs, isolates have zero in-degree and zero out_degre:: - - >>> G = nx.DiGraph([(0, 1), (1, 2)]) - >>> G.add_node(3) - >>> list(nx.isolates(G)) - [3] - - """ - return (n for n, d in G.degree() if d == 0) - - + return nx.isolates(_convert(G)) + def number_of_isolates(G): """Returns the number of isolates in the graph. Parallel implementation. @@ -95,11 +42,11 @@ def number_of_isolates(G): The number of degree zero nodes in the graph `G`. """ - num_isolates = Parallel(n_jobs=-1, backend="threading")( - delayed(lambda x: 1)(v) for v in isolates(G) - ) - return sum(num_isolates) - + isolates_list = list(isolates(G)) + num_chunks = max(len(isolates_list) // cpu_count(), 1) + isolate_chunks = chunks(isolates_list, num_chunks) + results = Parallel(n_jobs=-1)(delayed(len)(chunk) for chunk in isolate_chunks) + return sum(results) diff --git a/nx_parallel/algorithms/tests/test_isolate.py b/nx_parallel/algorithms/tests/test_isolate.py new file mode 100644 index 0000000..35d4c7c --- /dev/null +++ b/nx_parallel/algorithms/tests/test_isolate.py @@ -0,0 +1,29 @@ +"""Unit tests for the :mod:`networkx.algorithms.isolates` module. Modified for nx_parallel backend""" + +import networkx as nx; import nx_parallel + + +def test_is_isolate(): + G = nx.Graph() + G.add_edge(0, 1) + G.add_node(2) + H = nx_parallel.ParallelGraph(G) + assert not nx.is_isolate(H, 0) + assert not nx.is_isolate(H, 1) + assert nx.is_isolate(H, 2) + + +def test_isolates(): + G = nx.Graph() + G.add_edge(0, 1) + G.add_nodes_from([2, 3]) + H = nx_parallel.ParallelGraph(G) + assert sorted(nx.isolates(H)) == [2, 3] + + +def test_number_of_isolates(): + G = nx.Graph() + G.add_edge(0, 1) + G.add_nodes_from([2, 3]) + H = nx_parallel.ParallelGraph(G) + assert nx.number_of_isolates(H) == 2 diff --git a/nx_parallel/algorithms/tests/test_tournament.py b/nx_parallel/algorithms/tests/test_tournament.py new file mode 100644 index 0000000..51d06e5 --- /dev/null +++ b/nx_parallel/algorithms/tests/test_tournament.py @@ -0,0 +1,181 @@ +"""Unit tests for the :mod:`networkx.algorithms.tournament` module. Modified for nx_parallel backend""" +from itertools import combinations + +import pytest + +from networkx import DiGraph; import nx_parallel + +from networkx.algorithms.tournament import ( + hamiltonian_path, + index_satisfying, + is_reachable, + is_strongly_connected, + is_tournament, + random_tournament, + score_sequence, + tournament_matrix, +) + + +def test_condition_not_satisfied(): + condition = lambda x: x > 0 + iter_in = [0] + assert index_satisfying(iter_in, condition) == 1 + + +def test_empty_iterable(): + condition = lambda x: x > 0 + with pytest.raises(ValueError): + index_satisfying([], condition) + + +def test_is_tournament(): + G = DiGraph() + G.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2)]) + H = nx_parallel.ParallelDiGraph(G) + assert is_tournament(H) + + +def test_self_loops(): + """A tournament must have no self-loops.""" + G = DiGraph() + G.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2)]) + G.add_edge(0, 0) + H = nx_parallel.ParallelDiGraph(G) + assert not is_tournament(H) + + +def test_missing_edges(): + """A tournament must not have any pair of nodes without at least + one edge joining the pair. + + """ + G = DiGraph() + G.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0), (1, 3)]) + H = nx_parallel.ParallelDiGraph(G) + assert not is_tournament(H) + + +def test_bidirectional_edges(): + """A tournament must not have any pair of nodes with greater + than one edge joining the pair. + + """ + G = DiGraph() + G.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2)]) + G.add_edge(1, 0) + H = nx_parallel.ParallelDiGraph(G) + assert not is_tournament(H) + + +def test_graph_is_tournament(): + for _ in range(10): + G = random_tournament(5) + H = nx_parallel.ParallelDiGraph(G) + assert is_tournament(H) + + +def test_graph_is_tournament_seed(): + for _ in range(10): + G = random_tournament(5, seed=1) + H = nx_parallel.ParallelDiGraph(G) + assert is_tournament(H) + + +def test_graph_is_tournament_one_node(): + G = random_tournament(1) + H = nx_parallel.ParallelDiGraph(G) + assert is_tournament(H) + + +def test_graph_is_tournament_zero_node(): + G = random_tournament(0) + H = nx_parallel.ParallelDiGraph(G) + assert is_tournament(H) + + +def test_hamiltonian_empty_graph(): + path = hamiltonian_path(nx_parallel.ParallelDiGraph()) + assert len(path) == 0 + + +def test_path_is_hamiltonian(): + G = DiGraph() + G.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2)]) + H = nx_parallel.ParallelDiGraph(G) + path = hamiltonian_path(H) + assert len(path) == 4 + assert all(v in H[u] for u, v in zip(path, path[1:])) + + +def test_hamiltonian_cycle(): + """Tests that :func:`networkx.tournament.hamiltonian_path` + returns a Hamiltonian cycle when provided a strongly connected + tournament. + + """ + G = DiGraph() + G.add_edges_from([(0, 1), (1, 2), (2, 3), (3, 0), (1, 3), (0, 2)]) + H = nx_parallel.ParallelDiGraph(G) + path = hamiltonian_path(H) + assert len(path) == 4 + assert all(v in G[u] for u, v in zip(path, path[1:])) + assert path[0] in H[path[-1]] + + +def test_score_sequence_edge(): + G = DiGraph([(0, 1)]) + H = nx_parallel.ParallelDiGraph(G) + assert score_sequence(H) == [0, 1] + + +def test_score_sequence_triangle(): + G = DiGraph([(0, 1), (1, 2), (2, 0)]) + H = nx_parallel.ParallelDiGraph(G) + assert score_sequence(H) == [1, 1, 1] + + +def test_tournament_matrix(): + np = pytest.importorskip("numpy") + pytest.importorskip("scipy") + npt = np.testing + G = DiGraph([(0, 1)]) + H = nx_parallel.ParallelDiGraph(G) + m = tournament_matrix(H) + npt.assert_array_equal(m.todense(), np.array([[0, 1], [-1, 0]])) + + +def test_reachable_pair(): + """Tests for a reachable pair of nodes.""" + G = DiGraph([(0, 1), (1, 2), (2, 0)]) + H = nx_parallel.ParallelDiGraph(G) + assert is_reachable(H, 0, 2) + + +def test_same_node_is_reachable(): + """Tests that a node is always reachable from it.""" + # G is an arbitrary tournament on ten nodes. + G = DiGraph(sorted(p) for p in combinations(range(10), 2)) + H = nx_parallel.ParallelDiGraph(G) + assert all(is_reachable(H, v, v) for v in H) + + +def test_unreachable_pair(): + """Tests for an unreachable pair of nodes.""" + G = DiGraph([(0, 1), (0, 2), (1, 2)]) + H = nx_parallel.ParallelDiGraph(G) + assert not is_reachable(H, 1, 0) + + +def test_is_strongly_connected(): + """Tests for a strongly connected tournament.""" + G = DiGraph([(0, 1), (1, 2), (2, 0)]) + H = nx_parallel.ParallelDiGraph(G) + assert is_strongly_connected(H) + + +def test_not_strongly_connected(): + """Tests for a tournament that is not strongly connected.""" + G = DiGraph([(0, 1), (0, 2), (1, 2)]) + H = nx_parallel.ParallelDiGraph(G) + assert not is_strongly_connected(H) diff --git a/nx_parallel/algorithms/tests/test_vitality.py b/nx_parallel/algorithms/tests/test_vitality.py new file mode 100644 index 0000000..8ac789b --- /dev/null +++ b/nx_parallel/algorithms/tests/test_vitality.py @@ -0,0 +1,51 @@ +"""Unit tests for the :mod:`networkx.algorithms.vitality` module. Modified for nx_parallel backend""" + +import networkx as nx; import nx_parallel + + +class TestClosenessVitality: + def test_unweighted(self): + G = nx.cycle_graph(3) + H = nx_parallel.ParallelGraph(G) + vitality = nx.closeness_vitality(H) + assert vitality == {0: 2, 1: 2, 2: 2} + + def test_weighted(self): + G = nx.Graph() + nx.add_cycle(G, [0, 1, 2], weight=2) + H = nx_parallel.ParallelGraph(G) + vitality = nx.closeness_vitality(H, weight="weight") + assert vitality == {0: 4, 1: 4, 2: 4} + + def test_unweighted_digraph(self): + G = nx.DiGraph(nx.cycle_graph(3)) + print(G) + H = nx_parallel.ParallelDiGraph(G) + print(H) + vitality = nx.closeness_vitality(H) + assert vitality == {0: 4, 1: 4, 2: 4} + + def test_weighted_digraph(self): + G = nx.DiGraph() + nx.add_cycle(G, [0, 1, 2], weight=2) + nx.add_cycle(G, [2, 1, 0], weight=2) + H = nx_parallel.ParallelDiGraph(G) + vitality = nx.closeness_vitality(H, weight="weight") + assert vitality == {0: 8, 1: 8, 2: 8} + + def test_weighted_multidigraph(self): + G = nx.MultiDiGraph() + nx.add_cycle(G, [0, 1, 2], weight=2) + nx.add_cycle(G, [2, 1, 0], weight=2) + H = nx_parallel.ParallelMultiDiGraph(G) + vitality = nx.closeness_vitality(H, weight="weight") + assert vitality == {0: 8, 1: 8, 2: 8} + + def test_disconnecting_graph(self): + """Tests that the closeness vitality of a node whose removal + disconnects the graph is negative infinity. + + """ + G = nx.path_graph(3) + H = nx_parallel.ParallelGraph(G) + assert nx.closeness_vitality(G, node=1) == -float("inf") diff --git a/nx_parallel/algorithms/tournament.py b/nx_parallel/algorithms/tournament.py new file mode 100644 index 0000000..1c794ad --- /dev/null +++ b/nx_parallel/algorithms/tournament.py @@ -0,0 +1,194 @@ +import itertools +from joblib import Parallel, cpu_count, delayed +import networkx as nx +from nx_parallel.algorithms.utils.chunk import chunks +from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph +from networkx.algorithms.simple_paths import is_simple_path as is_path + +__all__ = [ + "is_reachable", + "tournament_is_strongly_connected", +] + +"""Helper to interface between graph types""" +def _convert(G): + if isinstance(G, ParallelMultiDiGraph): + I = ParallelMultiDiGraph.to_networkx(G) + if isinstance(G, ParallelMultiGraph): + I = ParallelMultiGraph.to_networkx(G) + if isinstance(G, ParallelDiGraph): + I = ParallelDiGraph.to_networkx(G) + if isinstance(G, ParallelGraph): + I = ParallelGraph.to_networkx(G) + return I + +"""Identical to networkx implementation""" +def index_satisfying(iterable, condition): + return nx.algorithms.tournament.index_satisfying(iterable, condition) + +"""Identical to networkx implementation""" +def is_tournament(G): + return nx.algorithms.tournament.is_tournament(_convert(G)) + + +"""Identical to networkx implementation""" +def hamiltonian_path(G): + return nx.algorithms.tournament.hamiltonian_path(_convert(G)) + +"""Identical to networkx implementation""" +def random_tournament(n, seed=None): + return nx.algorithms.tournament.random_tournament(n, seed) + +"""Identical to networkx implementation""" +def score_sequence(G): + return nx.algorithms.tournament.score_sequence(_convert(G)) + +"""Identical to networkx implementation""" +def tournament_matrix(G): + return nx.algorithms.tournament.tournament_matrix(_convert(G)) + + +def is_reachable(G, s, t): + """Decides whether there is a path from `s` to `t` in the + tournament. + + This function is more theoretically efficient than the reachability + checks than the shortest path algorithms in + :mod:`networkx.algorithms.shortest_paths`. + + The given graph **must** be a tournament, otherwise this function's + behavior is undefined. + + Parameters + ---------- + G : NetworkX graph + A directed graph representing a tournament. + + s : node + A node in the graph. + + t : node + A node in the graph. + + Returns + ------- + bool + Whether there is a path from `s` to `t` in `G`. + + Examples + -------- + >>> from networkx.algorithms import tournament + >>> G = nx.DiGraph([(1, 0), (1, 3), (1, 2), (2, 3), (2, 0), (3, 0)]) + >>> tournament.is_reachable(G, 1, 3) + True + >>> tournament.is_reachable(G, 3, 2) + False + + Notes + ----- + Although this function is more theoretically efficient than the + generic shortest path functions, a speedup requires the use of + parallelism. Though it may in the future, the current implementation + does not use parallelism, thus you may not see much of a speedup. + + This algorithm comes from [1]. + + References + ---------- + .. [1] Tantau, Till. + "A note on the complexity of the reachability problem for + tournaments." + *Electronic Colloquium on Computational Complexity*. 2001. + + """ + + """Subset version of two_neighborhood""" + def two_neighborhood_subset(G, chunk): + reList = set() + for v in chunk: + reList.update({x for x in G if x == v or x in G[v] or any(is_path(I, [v, z, x]) for z in G)}) + return reList + + """Identical to networkx helper implementation""" + def is_closed(G, nodes): + return all(v in G[u] for u in set(G) - nodes for v in nodes) + + """helper to check closure conditions for chunk (iterable) of neighborhoods""" + def check_closure_subset(chunk): + return all(not (is_closed(G, S) and s in S and t not in S) for S in chunk) + + I = _convert(G) + num_chunks = max(len(G) // cpu_count(), 1) + + #send chunk of vertices to each process (calculating neighborhoods) + node_chunks = list(chunks(G.nodes, num_chunks)) + neighborhoods = Parallel(n_jobs=-1)( + delayed(two_neighborhood_subset)(G, chunk) for chunk in node_chunks + ) + + #send chunk of neighborhoods to each process (checking closure conditions) + neighborhood_chunks = list(chunks(neighborhoods, num_chunks)) + results = Parallel(n_jobs=-1, backend="loky")( + delayed(check_closure_subset)(chunk) for chunk in neighborhood_chunks + ) + return all(results) + +def tournament_is_strongly_connected(G): + """Decides whether the given tournament is strongly connected. + + This function is more theoretically efficient than the + :func:`~networkx.algorithms.components.is_strongly_connected` + function. + + The given graph **must** be a tournament, otherwise this function's + behavior is undefined. + + Parameters + ---------- + G : NetworkX graph + A directed graph representing a tournament. + + Returns + ------- + bool + Whether the tournament is strongly connected. + + Examples + -------- + >>> from networkx.algorithms import tournament + >>> G = nx.DiGraph([(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3), (3, 0)]) + >>> tournament.is_strongly_connected(G) + True + >>> G.remove_edge(1, 3) + >>> tournament.is_strongly_connected(G) + False + + Notes + ----- + Although this function is more theoretically efficient than the + generic strong connectivity function, a speedup requires the use of + parallelism. Though it may in the future, the current implementation + does not use parallelism, thus you may not see much of a speedup. + + This algorithm comes from [1]. + + References + ---------- + .. [1] Tantau, Till. + "A note on the complexity of the reachability problem for + tournaments." + *Electronic Colloquium on Computational Complexity*. 2001. + + + """ + + """Subset version of is_reachable""" + def is_reachable_subset(G, chunk): + re = set() + for v in chunk: + re.update(is_reachable(G, u, v) for u in G) + return all(re) + num_chunks = max(len(G) // cpu_count(), 1) + node_chunks = list(chunks(G.nodes, num_chunks)) + results = Parallel(n_jobs=-1)(delayed(is_reachable_subset)(G, chunk) for chunk in node_chunks) + return all(results) diff --git a/nx_parallel/algorithms/utils/chunk.py b/nx_parallel/algorithms/utils/chunk.py new file mode 100644 index 0000000..0167899 --- /dev/null +++ b/nx_parallel/algorithms/utils/chunk.py @@ -0,0 +1,10 @@ +import itertools + +"""Divides an iterable into chunks of size n""" +def chunks(l, n): + l_c = iter(l) + while True: + x = tuple(itertools.islice(l_c, n)) + if not x: + return + yield x \ No newline at end of file diff --git a/nx_parallel/algorithms/vitality.py b/nx_parallel/algorithms/vitality.py new file mode 100644 index 0000000..8e347cc --- /dev/null +++ b/nx_parallel/algorithms/vitality.py @@ -0,0 +1,82 @@ +from functools import partial +from joblib import Parallel, delayed +import networkx as nx +from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph + +__all__ = ["closeness_vitality"] + +def closeness_vitality(G, node=None, weight=None, wiener_index=None): + """Returns the closeness vitality for nodes in the graph. Parallel implementation. + + The *closeness vitality* of a node, defined in Section 3.6.2 of [1], + is the change in the sum of distances between all node pairs when + excluding that node. + + Parameters + ---------- + G : NetworkX graph + A strongly-connected graph. + + weight : string + The name of the edge attribute used as weight. This is passed + directly to the :func:`~networkx.wiener_index` function. + + node : object + If specified, only the closeness vitality for this node will be + returned. Otherwise, a dictionary mapping each node to its + closeness vitality will be returned. + + Other parameters + ---------------- + wiener_index : number + If you have already computed the Wiener index of the graph + `G`, you can provide that value here. Otherwise, it will be + computed for you. + + Returns + ------- + dictionary or float + If `node` is None, this function returns a dictionary + with nodes as keys and closeness vitality as the + value. Otherwise, it returns only the closeness vitality for the + specified `node`. + + The closeness vitality of a node may be negative infinity if + removing that node would disconnect the graph. + + Examples + -------- + >>> G = nx.cycle_graph(3) + >>> nx.closeness_vitality(G) + {0: 2.0, 1: 2.0, 2: 2.0} + + See Also + -------- + closeness_centrality + + References + ---------- + .. [1] Ulrik Brandes, Thomas Erlebach (eds.). + *Network Analysis: Methodological Foundations*. + Springer, 2005. + + + """ + if isinstance(G, ParallelMultiDiGraph): + I = ParallelMultiDiGraph.to_networkx(G) + if isinstance(G, ParallelMultiGraph): + I = ParallelMultiGraph.to_networkx(G) + if isinstance(G, ParallelDiGraph): + I = ParallelDiGraph.to_networkx(G) + if isinstance(G, ParallelGraph): + I = ParallelGraph.to_networkx(G) + if wiener_index is None: + wiener_index = nx.wiener_index(I, weight=weight) + if node is not None: + after = nx.wiener_index(G.subgraph(set(G) - {node}), weight=weight) + return wiener_index - after + vitality = partial(closeness_vitality, I, weight=weight, wiener_index=wiener_index) + result = Parallel(n_jobs=-1)( + delayed(lambda v: (v, vitality(v)))(v) for v in I + ) + return dict(result) diff --git a/nx_parallel/classes/graph.py b/nx_parallel/classes/graph.py index b098bbe..4a170fc 100644 --- a/nx_parallel/classes/graph.py +++ b/nx_parallel/classes/graph.py @@ -1,6 +1,6 @@ -from networkx import Graph +from networkx import Graph, DiGraph, MultiDiGraph, MultiGraph -__all__ = ["ParallelGraph"] +__all__ = ["ParallelGraph", "ParallelDiGraph", "ParallelMultiDiGraph", "ParallelMultiGraph"] class ParallelGraph(Graph): @@ -11,3 +11,31 @@ def __init__(self, incoming_graph_data=None, **attr): def to_networkx(self): return Graph(self) + +class ParallelDiGraph(DiGraph): + __networkx_plugin__ = "parallel" + + def __init__(self, incoming_graph_data=None, **attr): + super().__init__(incoming_graph_data, **attr) + + def to_networkx(self): + return DiGraph(self) + +class ParallelMultiGraph(Graph): + __networkx_plugin__ = "parallel" + + def __init__(self, incoming_graph_data=None, **attr): + super().__init__(incoming_graph_data, **attr) + + def to_networkx(self): + return MultiGraph(self) + + +class ParallelMultiDiGraph(Graph): + __networkx_plugin__ = "parallel" + + def __init__(self, incoming_graph_data=None, **attr): + super().__init__(incoming_graph_data, **attr) + + def to_networkx(self): + return MultiDiGraph(self) \ No newline at end of file diff --git a/nx_parallel/interface.py b/nx_parallel/interface.py index def5217..4aca11d 100644 --- a/nx_parallel/interface.py +++ b/nx_parallel/interface.py @@ -1,52 +1,170 @@ +import networkx as nx +from networkx import DiGraph, Graph, MultiDiGraph, MultiGraph, PlanarEmbedding +from .classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph from .algorithms.centrality.betweenness import betweenness_centrality from .algorithms.isolate import number_of_isolates, isolates, is_isolate - +from .algorithms.vitality import closeness_vitality +from .algorithms.tournament import ( + hamiltonian_path, + is_reachable, + tournament_is_strongly_connected, + is_tournament, + random_tournament, + score_sequence, + tournament_matrix, +) __all__ = ["Dispatcher"] +def convert(graph): + if isinstance(graph, MultiDiGraph): + return ParallelMultiDiGraph(graph) + if isinstance(graph, MultiGraph): + return ParallelMultiGraph(graph) + if isinstance(graph, DiGraph): + return ParallelDiGraph(graph) + if isinstance(graph, Graph): + return ParallelGraph(graph) + raise TypeError(f"Unsupported type of graph: {type(graph)}") + + class Dispatcher: # ============================= - # Centrality - betweenness_centrality = betweenness_centrality # Isolates number_of_isolates = number_of_isolates isolates = isolates is_isolate = is_isolate + + #Vitality + closeness_vitality = closeness_vitality + + #Tournament + is_tournament = is_tournament + hamiltonian_path = hamiltonian_path + random_tournament = random_tournament + score_sequence = score_sequence + tournament_matrix = tournament_matrix + is_reachable = is_reachable + tournament_is_strongly_connected = tournament_is_strongly_connected + + # Centrality + #TODO: make pass tests (pass some more by adding digraph, etc like GRAPHBLAS) + betweenness_centrality = betweenness_centrality + # ============================= + def __getattr__(self, item): + try: + return nx.utils.backends._registered_algorithms[item].__wrapped__ + except KeyError: + raise AttributeError(item) from None @staticmethod - def convert_from_nx(incoming_graph, weight=None, *, name=None): - import networkx as nx - from .classes.graph import ParallelGraph + def convert_from_nx( + graph, + *, + edge_attrs=None, + node_attrs=None, + preserve_edge_attrs=None, + preserve_node_attrs=None, + preserve_graph_attrs=None, + name=None, + graph_name=None, + ): + if name in { + # Raise if input graph changes + "lexicographical_topological_sort", + "topological_generations", + "topological_sort", + # Sensitive tests (iteration order matters) + "dfs_labeled_edges", + }: + return graph + if not isinstance(graph, Graph): + if name == "is_partition": + # May be NodeView + return graph + raise TypeError( + f"Bad type for graph argument {graph_name} in {name}: type(graph)" + ) + + G = graph.__class__() + + if preserve_graph_attrs: + G.graph.update(graph.graph) - if isinstance(incoming_graph, nx.Graph): - return ParallelGraph(incoming_graph) - raise TypeError(f"Unsupported type of graph: {type(incoming_graph)}") + if preserve_node_attrs: + G.add_nodes_from(graph.nodes(data=True)) + elif node_attrs: + G.add_nodes_from( + ( + node, + { + k: datadict.get(k, default) + for k, default in node_attrs.items() + if default is not None or k in datadict + }, + ) + for node, datadict in graph.nodes(data=True) + ) + else: + G.add_nodes_from(graph) + + if graph.is_multigraph(): + if preserve_edge_attrs: + G.add_edges_from( + (u, v, key, datadict) + for u, nbrs in graph._adj.items() + for v, keydict in nbrs.items() + for key, datadict in keydict.items() + ) + elif edge_attrs: + G.add_edges_from( + ( + u, + v, + key, + { + k: datadict.get(k, default) + for k, default in edge_attrs.items() + if default is not None or k in datadict + }, + ) + for u, nbrs in graph._adj.items() + for v, keydict in nbrs.items() + for key, datadict in keydict.items() + ) + else: + G.add_edges_from( + (u, v, key, {}) + for u, nbrs in graph._adj.items() + for v, keydict in nbrs.items() + for key, datadict in keydict.items() + ) + elif preserve_edge_attrs: + G.add_edges_from(graph.edges(data=True)) + elif edge_attrs: + G.add_edges_from( + ( + u, + v, + { + k: datadict.get(k, default) + for k, default in edge_attrs.items() + if default is not None or k in datadict + }, + ) + for u, v, datadict in graph.edges(data=True) + ) + else: + G.add_edges_from(graph.edges) + return G @staticmethod def convert_to_nx(obj, *, name=None): - from .classes.graph import ParallelGraph - - if isinstance(obj, ParallelGraph): - obj = obj.to_networkx() - return obj - - # @staticmethod - # def on_start_tests(items): - # try: - # import pytest - # except ImportError: # pragma: no cover (import) - # return - # skip = [ - # ("test_attributes", {"TestBoruvka", "test_mst.py"}), - # ("test_weight_attribute", {"TestBoruvka", "test_mst.py"}), - # ] - # for item in items: - # kset = set(item.keywords) - # for test_name, keywords in skip: - # if item.name == test_name and keywords.issubset(kset): - # item.add_marker( - # pytest.mark.xfail(reason="unable to handle multi-attributed graphs") - # ) + return obj + + + + From d8e18600bea7f1703e86588773e6cd392291f71d Mon Sep 17 00:00:00 2001 From: 20kav <123114628+20kavishs@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:40:51 -0400 Subject: [PATCH 03/26] Fixed betweeness tests + made betweenness_centrality pass all tests - Fixed betweenness tests, had some small errors in them - Minor changes to graph class constructors - Changed betweenness_centrality implementation, passes all tests --- .../algorithms/centrality/betweenness.py | 69 +++++++++++++++---- .../centrality/tests/test_betweenness.py | 10 +-- nx_parallel/classes/graph.py | 4 +- 3 files changed, 61 insertions(+), 22 deletions(-) diff --git a/nx_parallel/algorithms/centrality/betweenness.py b/nx_parallel/algorithms/centrality/betweenness.py index 79977ac..4e711eb 100644 --- a/nx_parallel/algorithms/centrality/betweenness.py +++ b/nx_parallel/algorithms/centrality/betweenness.py @@ -1,8 +1,15 @@ from joblib import Parallel, delayed, cpu_count -from networkx import betweenness_centrality_subset from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph from nx_parallel.algorithms.utils.chunk import chunks - +import networkx as nx +from networkx.utils import py_random_state +from networkx.algorithms.centrality.betweenness import ( + _rescale, + _single_source_shortest_path_basic, + _single_source_dijkstra_path_basic, + _accumulate_endpoints, + _accumulate_basic +) __all__ = ["betweenness_centrality"] """Helper to interface between graph types""" @@ -17,6 +24,7 @@ def _convert(G): I = ParallelGraph.to_networkx(G) return I +@py_random_state(5) def betweenness_centrality( G, k=None, normalized=True, weight=None, endpoints=False, seed=None ): @@ -92,29 +100,60 @@ def betweenness_centrality( Parallel Betweenness Centrality. NetworkX documentation. Available at: https://networkx.org/documentation/stable/auto_examples/algorithms/plot_parallel_betweenness.html Accessed on June 26, 2023. - """ - #TODO: Work on passing all tests for betweenness_centrality + """ I = _convert(G) + if k is None: + nodes = G.nodes + else: + nodes = seed.sample(list(G.nodes), k) total_cores = cpu_count() - num_chunks = max(len(G) // total_cores, 1) - node_chunks = list(chunks(G.nodes, num_chunks)) - bt_sc = Parallel(n_jobs=total_cores, backend="loky")( - delayed(betweenness_centrality_subset)( + num_chunks = max(len(nodes) // total_cores, 1) + node_chunks = list(chunks(nodes, num_chunks)) + bt_cs = Parallel(n_jobs=total_cores)( + delayed(betweenness_centrality_node_subset)( I, - nodes, - list(G), - normalized, + chunk, weight, + endpoints, ) - for nodes in node_chunks + for chunk in node_chunks ) #Reducing partial solution - bt_c = bt_sc[0] - for bt in bt_sc[1:]: + bt_c = bt_cs[0] + for bt in bt_cs[1:]: for n in bt: bt_c[n] += bt[n] - return bt_c + + betweenness = _rescale( + bt_c, + len(G), + normalized=normalized, + directed=I.is_directed(), + k=k, + endpoints=endpoints, + ) + return betweenness + + + +def betweenness_centrality_node_subset(G, nodes, weight=None, endpoints=False): + betweenness = dict.fromkeys(G, 0.0) + for s in nodes: + # single source shortest paths + if weight is None: # use BFS + S, P, sigma, _ = _single_source_shortest_path_basic(G, s) + else: # use Dijkstra's algorithm + S, P, sigma, _ = _single_source_dijkstra_path_basic(G, s, weight) + # accumulation + if endpoints: + betweenness, delta = _accumulate_endpoints(betweenness, S, P, sigma, s) + else: + betweenness, delta = _accumulate_basic(betweenness, S, P, sigma, s) + return betweenness + + + diff --git a/nx_parallel/algorithms/centrality/tests/test_betweenness.py b/nx_parallel/algorithms/centrality/tests/test_betweenness.py index 2298b69..8601750 100644 --- a/nx_parallel/algorithms/centrality/tests/test_betweenness.py +++ b/nx_parallel/algorithms/centrality/tests/test_betweenness.py @@ -54,7 +54,7 @@ def test_P3_normalized(self): def test_P3(self): """Betweenness centrality: P3""" G = nx.path_graph(3) - H = nx_parallel.ParallelDiGraph(G) + H = nx_parallel.ParallelGraph(G) b_answer = {0: 0.0, 1: 1.0, 2: 0.0} b = nx.betweenness_centrality(H, weight=None, normalized=False) for n in sorted(G): @@ -63,7 +63,7 @@ def test_P3(self): def test_sample_from_P3(self): """Betweenness centrality: P3 sample""" G = nx.path_graph(3) - H = nx_parallel.ParallelDiGraph(G) + H = nx_parallel.ParallelGraph(G) b_answer = {0: 0.0, 1: 1.0, 2: 0.0} b = nx.betweenness_centrality(H, k=3, weight=None, normalized=False, seed=1) for n in sorted(G): @@ -78,7 +78,7 @@ def test_sample_from_P3(self): def test_P3_endpoints(self): """Betweenness centrality: P3 endpoints""" G = nx.path_graph(3) - H = nx_parallel.ParallelDiGraph(G) + H = nx_parallel.ParallelGraph(G) b_answer = {0: 2.0, 1: 3.0, 2: 2.0} b = nx.betweenness_centrality(H, weight=None, normalized=False, endpoints=True) for n in sorted(G): @@ -326,7 +326,7 @@ def test_P3_normalized(self): def test_P3(self): """Weighted betweenness centrality: P3""" G = nx.path_graph(3) - H = nx_parallel.ParallelDiGraph(G) + H = nx_parallel.ParallelGraph(G) b_answer = {0: 0.0, 1: 1.0, 2: 0.0} b = nx.betweenness_centrality(H, weight="weight", normalized=False) for n in sorted(G): @@ -498,7 +498,7 @@ def test_ladder_graph(self): """Weighted betweenness centrality: Ladder graph""" G = nx.Graph() # ladder_graph(3) G.add_edges_from([(0, 1), (0, 2), (1, 3), (2, 3), (2, 4), (4, 5), (3, 5)]) - H = nx_parallel.ParallelDiGraph(G) + H = nx_parallel.ParallelGraph(G) b_answer = {0: 1.667, 1: 1.667, 2: 6.667, 3: 6.667, 4: 1.667, 5: 1.667} for b in b_answer: b_answer[b] /= 2 diff --git a/nx_parallel/classes/graph.py b/nx_parallel/classes/graph.py index 4a170fc..cd5c8ef 100644 --- a/nx_parallel/classes/graph.py +++ b/nx_parallel/classes/graph.py @@ -21,7 +21,7 @@ def __init__(self, incoming_graph_data=None, **attr): def to_networkx(self): return DiGraph(self) -class ParallelMultiGraph(Graph): +class ParallelMultiGraph(MultiGraph): __networkx_plugin__ = "parallel" def __init__(self, incoming_graph_data=None, **attr): @@ -31,7 +31,7 @@ def to_networkx(self): return MultiGraph(self) -class ParallelMultiDiGraph(Graph): +class ParallelMultiDiGraph(MultiDiGraph): __networkx_plugin__ = "parallel" def __init__(self, incoming_graph_data=None, **attr): From 007c73e3960a363ab1d6a25e412dca5dce1bf5c0 Mon Sep 17 00:00:00 2001 From: 20kav <123114628+20kavishs@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:39:08 -0400 Subject: [PATCH 04/26] Changed betweenness Redid betweenness without convert function Tried to use __wrapped__ but it only worked for isolates...for consistency I kept everything the same Errors for using __wrapped__ were because various methods were "not implemented by parallel" --- nx_parallel/algorithms/.DS_Store | Bin 0 -> 6148 bytes .../algorithms/centrality/betweenness.py | 17 ++--------------- 2 files changed, 2 insertions(+), 15 deletions(-) create mode 100644 nx_parallel/algorithms/.DS_Store diff --git a/nx_parallel/algorithms/.DS_Store b/nx_parallel/algorithms/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..87121c68d15e97913ec957f711dbe4a890fcc929 GIT binary patch literal 6148 zcmeHK%}N6?5T3NvZY@F&Djow~3vR0j;$^Az1zgdCO5JsfF0Px>ZY@#@d(;>5QG6a} zl2k0M2QMOa1}0xJKO6F8$s_GI zJZ?0ab?Hv(a(viy>vDhZU^1yVn>)Klr=5r7F;y>yPJw@(mUW9$c*V}bl|A|WG*Rgt z`lq?m97bk<8DIvMg8_T`Io0J@F0YaqUY2!SLxj~Z-LeGrfu`>(%LJ@j)v`ZZh!ZXM%Gr$bY zGEg+b8rA=k@8AEkNjzc(n1O%AfGD;7b_ Date: Sun, 6 Aug 2023 13:23:10 -0400 Subject: [PATCH 05/26] Parallelized efficiency_measures Passes all tests --- nx_parallel/algorithms/efficiency_measures.py | 83 +++++++++++++++++++ .../algorithms/tests/test_efficiency.py | 64 ++++++++++++++ nx_parallel/interface.py | 8 +- 3 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 nx_parallel/algorithms/efficiency_measures.py create mode 100644 nx_parallel/algorithms/tests/test_efficiency.py diff --git a/nx_parallel/algorithms/efficiency_measures.py b/nx_parallel/algorithms/efficiency_measures.py new file mode 100644 index 0000000..bf1da1c --- /dev/null +++ b/nx_parallel/algorithms/efficiency_measures.py @@ -0,0 +1,83 @@ +"""Provides functions for computing the efficiency of nodes and graphs.""" +from joblib import Parallel, cpu_count, delayed +from nx_parallel.algorithms.utils.chunk import chunks +from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph +import networkx as nx +from networkx.utils import not_implemented_for + +__all__ = ["local_efficiency"] + +"""Helper to interface between graph types""" +def _convert(G): + if isinstance(G, ParallelMultiDiGraph): + I = ParallelMultiDiGraph.to_networkx(G) + if isinstance(G, ParallelMultiGraph): + I = ParallelMultiGraph.to_networkx(G) + if isinstance(G, ParallelDiGraph): + I = ParallelDiGraph.to_networkx(G) + if isinstance(G, ParallelGraph): + I = ParallelGraph.to_networkx(G) + return I + +@not_implemented_for("directed") +def efficiency(G, u, v): + return nx.efficiency(_convert(G), u, v) + + +@not_implemented_for("directed") +def global_efficiency(G): + return nx.global_efficiency(_convert(G)) + + +@not_implemented_for("directed") +def local_efficiency(G): + """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. + + """ + total_cores = cpu_count() + num_chunks = max(len(G.nodes) // total_cores, 1) + node_chunks = list(chunks(G.nodes, num_chunks)) + efficiencies = Parallel(n_jobs=total_cores)( + delayed(local_efficiency_node_subset)(G, chunk) for chunk in node_chunks + ) + return sum(efficiencies) / len(G) + + +def local_efficiency_node_subset(G, nodes): + return sum(global_efficiency(G.subgraph(G[v])) for v in nodes) diff --git a/nx_parallel/algorithms/tests/test_efficiency.py b/nx_parallel/algorithms/tests/test_efficiency.py new file mode 100644 index 0000000..1316b01 --- /dev/null +++ b/nx_parallel/algorithms/tests/test_efficiency.py @@ -0,0 +1,64 @@ +"""Unit tests for the :mod:`networkx.algorithms.efficiency` module.""" + +import networkx as nx; import nx_parallel + + +class TestEfficiency: + def setup_method(self): + # G1 is a disconnected graph + self.G1 = nx.Graph() + self.G1.add_nodes_from([1, 2, 3]) + self.H1 = nx_parallel.ParallelGraph(self.G1) + # G2 is a cycle graph + self.G2 = nx.cycle_graph(4) + self.H2 = nx_parallel.ParallelGraph(self.G2) + # G3 is the triangle graph with one additional edge + self.G3 = nx.lollipop_graph(3, 1) + self.H3 = nx_parallel.ParallelGraph(self.G3) + + + def test_efficiency_disconnected_nodes(self): + """ + When nodes are disconnected, efficiency is 0 + """ + assert nx.efficiency(self.H1, 1, 2) == 0 + + def test_local_efficiency_disconnected_graph(self): + """ + In a disconnected graph the efficiency is 0 + """ + assert nx.local_efficiency(self.H1) == 0 + + def test_efficiency(self): + assert nx.efficiency(self.H2, 0, 1) == 1 + assert nx.efficiency(self.H2, 0, 2) == 1 / 2 + + def test_global_efficiency(self): + assert nx.global_efficiency(self.H2) == 5 / 6 + + def test_global_efficiency_complete_graph(self): + """ + Tests that the average global efficiency of the complete graph is one. + """ + for n in range(2, 10): + G = nx.complete_graph(n) + H = nx_parallel.ParallelGraph(G) + assert nx.global_efficiency(H) == 1 + + def test_local_efficiency_complete_graph(self): + """ + Test that the local efficiency for a complete graph with at least 3 + nodes should be one. For a graph with only 2 nodes, the induced + subgraph has no edges. + """ + for n in range(3, 10): + G = nx.complete_graph(n) + H = nx_parallel.ParallelGraph(G) + assert nx.local_efficiency(H) == 1 + + def test_using_ego_graph(self): + """ + Test that the ego graph is used when computing local efficiency. + For more information, see GitHub issue #2710. + """ + assert nx.local_efficiency(self.H3) == 7 / 12 \ No newline at end of file diff --git a/nx_parallel/interface.py b/nx_parallel/interface.py index 4aca11d..85c9546 100644 --- a/nx_parallel/interface.py +++ b/nx_parallel/interface.py @@ -13,6 +13,8 @@ score_sequence, tournament_matrix, ) +from .algorithms.efficiency_measures import efficiency, local_efficiency, global_efficiency + __all__ = ["Dispatcher"] @@ -50,9 +52,13 @@ class Dispatcher: tournament_is_strongly_connected = tournament_is_strongly_connected # Centrality - #TODO: make pass tests (pass some more by adding digraph, etc like GRAPHBLAS) betweenness_centrality = betweenness_centrality + #Efficiency + efficiency = efficiency + local_efficiency = local_efficiency + global_efficiency = global_efficiency + # ============================= def __getattr__(self, item): try: From 1da22212c8303de54fca7208eccd737c68076d57 Mon Sep 17 00:00:00 2001 From: 20kav <123114628+20kavishs@users.noreply.github.com> Date: Sat, 26 Aug 2023 20:09:55 -0400 Subject: [PATCH 06/26] added originalGraph to parallel classes, added heatmaps + their code added originalGraph to parallel classes, added heatmaps + their code in the timing folder WIP for heatmap --- .github/workflows/test.yml | 2 +- README.md | 11 ++- nx_parallel/algorithms/isolate.py | 16 +--- nx_parallel/algorithms/tournament.py | 24 ++---- nx_parallel/algorithms/vitality.py | 14 +--- nx_parallel/classes/graph.py | 4 + timing/heatmap_all_functions.png | Bin 0 -> 273261 bytes .../heatmap_betweenness_centrality_timing.png | Bin 0 -> 47898 bytes timing/heatmap_closeness_vitality_timing.png | Bin 0 -> 47279 bytes timing/heatmap_is_reachable_timing.png | Bin 0 -> 32267 bytes timing/heatmap_local_efficiency_timing.png | Bin 0 -> 41856 bytes timing/timing_all_functions | 69 ++++++++++++++++++ timing/timing_comparison.md | 32 ++++++++ timing/timing_individual_function.py | 68 +++++++++++++++++ 14 files changed, 191 insertions(+), 49 deletions(-) create mode 100644 timing/heatmap_all_functions.png create mode 100644 timing/heatmap_betweenness_centrality_timing.png create mode 100644 timing/heatmap_closeness_vitality_timing.png create mode 100644 timing/heatmap_is_reachable_timing.png create mode 100644 timing/heatmap_local_efficiency_timing.png create mode 100644 timing/timing_all_functions create mode 100644 timing/timing_comparison.md create mode 100644 timing/timing_individual_function.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0ab1e27..1bf5acc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,4 +37,4 @@ jobs: echo "Done with installing" - name: PyTest run: | - NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx + pytest diff --git a/README.md b/README.md index 348869a..cf7cd9a 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,14 @@ Out[4]: Currently the following functions have parallelized implementations: - centrality - betweenness_centrality - - isolates - - number_of_isolates + - tournament + - is_reachable + - closeness_vitality + - efficiency_measures + - local_efficiency +![alt text](timing/heatmap_all_functions.png) -### TODO: add graphic showing speedup of nx_parallel vs. networkx - +See the ```/timing``` folder for more heatmaps and code for heatmap generation! diff --git a/nx_parallel/algorithms/isolate.py b/nx_parallel/algorithms/isolate.py index 6beeca0..2e091dd 100644 --- a/nx_parallel/algorithms/isolate.py +++ b/nx_parallel/algorithms/isolate.py @@ -5,25 +5,13 @@ __all__ = ["number_of_isolates"] -"""Helper to interface between graph types""" -def _convert(G): - if isinstance(G, ParallelMultiDiGraph): - I = ParallelMultiDiGraph.to_networkx(G) - if isinstance(G, ParallelMultiGraph): - I = ParallelMultiGraph.to_networkx(G) - if isinstance(G, ParallelDiGraph): - I = ParallelDiGraph.to_networkx(G) - if isinstance(G, ParallelGraph): - I = ParallelGraph.to_networkx(G) - return I - """Identical to networkx implementation""" def is_isolate(G, n): - return nx.is_isolate(_convert(G), n) + return nx.is_isolate(G.originalGraph, n) """Identical to networkx implementation""" def isolates(G): - return nx.isolates(_convert(G)) + return nx.isolates(G.originalGraph) def number_of_isolates(G): """Returns the number of isolates in the graph. Parallel implementation. diff --git a/nx_parallel/algorithms/tournament.py b/nx_parallel/algorithms/tournament.py index 1c794ad..7a70608 100644 --- a/nx_parallel/algorithms/tournament.py +++ b/nx_parallel/algorithms/tournament.py @@ -10,30 +10,17 @@ "tournament_is_strongly_connected", ] -"""Helper to interface between graph types""" -def _convert(G): - if isinstance(G, ParallelMultiDiGraph): - I = ParallelMultiDiGraph.to_networkx(G) - if isinstance(G, ParallelMultiGraph): - I = ParallelMultiGraph.to_networkx(G) - if isinstance(G, ParallelDiGraph): - I = ParallelDiGraph.to_networkx(G) - if isinstance(G, ParallelGraph): - I = ParallelGraph.to_networkx(G) - return I - """Identical to networkx implementation""" def index_satisfying(iterable, condition): return nx.algorithms.tournament.index_satisfying(iterable, condition) """Identical to networkx implementation""" def is_tournament(G): - return nx.algorithms.tournament.is_tournament(_convert(G)) - + return nx.algorithms.tournament.is_tournament(G.originalGraph) """Identical to networkx implementation""" def hamiltonian_path(G): - return nx.algorithms.tournament.hamiltonian_path(_convert(G)) + return nx.algorithms.tournament.hamiltonian_path(G.originalGraph) """Identical to networkx implementation""" def random_tournament(n, seed=None): @@ -41,11 +28,11 @@ def random_tournament(n, seed=None): """Identical to networkx implementation""" def score_sequence(G): - return nx.algorithms.tournament.score_sequence(_convert(G)) + return nx.algorithms.tournament.score_sequence(G.originalGraph) """Identical to networkx implementation""" def tournament_matrix(G): - return nx.algorithms.tournament.tournament_matrix(_convert(G)) + return nx.algorithms.tournament.tournament_matrix(G.originalGraph) def is_reachable(G, s, t): @@ -106,7 +93,7 @@ def is_reachable(G, s, t): def two_neighborhood_subset(G, chunk): reList = set() for v in chunk: - reList.update({x for x in G if x == v or x in G[v] or any(is_path(I, [v, z, x]) for z in G)}) + reList.update({x for x in G if x == v or x in G[v] or any(is_path(G.originalGraph, [v, z, x]) for z in G)}) return reList """Identical to networkx helper implementation""" @@ -117,7 +104,6 @@ def is_closed(G, nodes): def check_closure_subset(chunk): return all(not (is_closed(G, S) and s in S and t not in S) for S in chunk) - I = _convert(G) num_chunks = max(len(G) // cpu_count(), 1) #send chunk of vertices to each process (calculating neighborhoods) diff --git a/nx_parallel/algorithms/vitality.py b/nx_parallel/algorithms/vitality.py index 8e347cc..9cbd64a 100644 --- a/nx_parallel/algorithms/vitality.py +++ b/nx_parallel/algorithms/vitality.py @@ -62,21 +62,13 @@ def closeness_vitality(G, node=None, weight=None, wiener_index=None): """ - if isinstance(G, ParallelMultiDiGraph): - I = ParallelMultiDiGraph.to_networkx(G) - if isinstance(G, ParallelMultiGraph): - I = ParallelMultiGraph.to_networkx(G) - if isinstance(G, ParallelDiGraph): - I = ParallelDiGraph.to_networkx(G) - if isinstance(G, ParallelGraph): - I = ParallelGraph.to_networkx(G) if wiener_index is None: - wiener_index = nx.wiener_index(I, weight=weight) + wiener_index = nx.wiener_index(G.originalGraph, weight=weight) if node is not None: after = nx.wiener_index(G.subgraph(set(G) - {node}), weight=weight) return wiener_index - after - vitality = partial(closeness_vitality, I, weight=weight, wiener_index=wiener_index) + vitality = partial(closeness_vitality, G.originalGraph, weight=weight, wiener_index=wiener_index) result = Parallel(n_jobs=-1)( - delayed(lambda v: (v, vitality(v)))(v) for v in I + delayed(lambda v: (v, vitality(v)))(v) for v in G.originalGraph ) return dict(result) diff --git a/nx_parallel/classes/graph.py b/nx_parallel/classes/graph.py index cd5c8ef..4106ed9 100644 --- a/nx_parallel/classes/graph.py +++ b/nx_parallel/classes/graph.py @@ -8,6 +8,7 @@ class ParallelGraph(Graph): def __init__(self, incoming_graph_data=None, **attr): super().__init__(incoming_graph_data, **attr) + self.originalGraph = Graph(self) def to_networkx(self): return Graph(self) @@ -17,6 +18,7 @@ class ParallelDiGraph(DiGraph): def __init__(self, incoming_graph_data=None, **attr): super().__init__(incoming_graph_data, **attr) + self.originalGraph = DiGraph(self) def to_networkx(self): return DiGraph(self) @@ -26,6 +28,7 @@ class ParallelMultiGraph(MultiGraph): def __init__(self, incoming_graph_data=None, **attr): super().__init__(incoming_graph_data, **attr) + self.originalGraph = MultiGraph(self) def to_networkx(self): return MultiGraph(self) @@ -36,6 +39,7 @@ class ParallelMultiDiGraph(MultiDiGraph): def __init__(self, incoming_graph_data=None, **attr): super().__init__(incoming_graph_data, **attr) + self.originalGraph = MultiDiGraph(self) def to_networkx(self): return MultiDiGraph(self) \ No newline at end of file diff --git a/timing/heatmap_all_functions.png b/timing/heatmap_all_functions.png new file mode 100644 index 0000000000000000000000000000000000000000..dec0613553a0525defea6f9155d310c0f5514e75 GIT binary patch literal 273261 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≀u!I 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≦KO8^?_R-F|{xXR5P*`;T&2k1ep=zR1bj+mjS` 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 RP5Px__~>C7Z~y%t{{u6^-53A> literal 0 HcmV?d00001 diff --git a/timing/heatmap_betweenness_centrality_timing.png b/timing/heatmap_betweenness_centrality_timing.png new file mode 100644 index 0000000000000000000000000000000000000000..491361504f90f2e96fc0de42858d3e8e09c74410 GIT binary patch literal 47898 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%0Da5Km$H2lh1{=+inhbW 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ⅆ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 literal 0 HcmV?d00001 diff --git a/timing/heatmap_closeness_vitality_timing.png b/timing/heatmap_closeness_vitality_timing.png new file mode 100644 index 0000000000000000000000000000000000000000..128a7885da0098e3fc2d6cd20bf99ed5dfc36e9b GIT binary patch literal 47279 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 KW=@&^fByjsC8)dr literal 0 HcmV?d00001 diff --git a/timing/heatmap_local_efficiency_timing.png b/timing/heatmap_local_efficiency_timing.png new file mode 100644 index 0000000000000000000000000000000000000000..97d9bcdb4ce9aad80ad621e86bec8857a3467fba GIT binary patch literal 41856 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

^u-96K&$^u-Q(I&Mq#hcuMYm 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 literal 0 HcmV?d00001 diff --git a/timing/timing_all_functions b/timing/timing_all_functions new file mode 100644 index 0000000..fca36ac --- /dev/null +++ b/timing/timing_all_functions @@ -0,0 +1,69 @@ +from matplotlib import pyplot as plt +import networkx as nx +import nx_parallel +import time +import seaborn as sns +import pandas as pd + +#Code to create README heatmap for all functions in function_list +heatmapDF = pd.DataFrame() +function_list = [nx.betweenness_centrality, nx.closeness_vitality, nx.local_efficiency] +number_of_nodes_list = [10, 20, 50, 300, 600] + +for i in range(0, len(function_list)): + currFun = function_list[i] + for j in range(0, len(number_of_nodes_list)): + num = number_of_nodes_list[j] + + # create original and parallel graphs + G = nx.fast_gnp_random_graph(num, 0.5, directed=False) + H = nx_parallel.ParallelGraph(G) + + # time both versions and update heatmapDF + t1 = time.time() + c = currFun(H) + t2 = time.time() + parallelTime = t2-t1 + t1 = time.time() + c = currFun(G) + t2 = time.time() + stdTime = t2-t1 + timesFaster = stdTime/parallelTime + heatmapDF.at[j, i] = timesFaster + print("Finished " + str(currFun)) + +#Code to create for row of heatmap specifically for tournaments, as they cannot be generated the same way +for j in range(0, len(number_of_nodes_list)): + num = number_of_nodes_list[j] + G = nx.tournament.random_tournament(num) + H = nx_parallel.ParallelDiGraph(G) + t1 = time.time() + c = nx.tournament.is_reachable(H, 1, num) + t2 = time.time() + parallelTime = t2-t1 + t1 = time.time() + c = nx.tournament.is_reachable(G, 1, num) + t2 = time.time() + stdTime = t2-t1 + timesFaster = stdTime/parallelTime + heatmapDF.at[j, 3] = timesFaster + +# plotting the heatmap with numbers and a green color scheme +plt.figure(figsize=(20, 4)) +hm = sns.heatmap(data=heatmapDF.T, annot=True, cmap='Greens', cbar=True) + +# Remove the tick labels on both axes +hm.set_yticklabels(["betweenness_centrality", "closeness_vitality", "local_efficiency", "tournament is_reachable"]) + +# Adding x-axis labels +hm.set_xticklabels(number_of_nodes_list) + +# Rotating the x-axis labels for better readability (optional) +plt.xticks(rotation=45) +plt.yticks(rotation=20) +plt.title("Small Scale Demo: Times Speedups of nx_parallel compared to networkx") +plt.xlabel("Number of Vertices (edge probability of 0.5 except for tournaments)") +plt.ylabel("Algorithm") + +# displaying the plotted heatmap +plt.tight_layout() diff --git a/timing/timing_comparison.md b/timing/timing_comparison.md new file mode 100644 index 0000000..542f330 --- /dev/null +++ b/timing/timing_comparison.md @@ -0,0 +1,32 @@ +Timing Comparisons +__________________ + +Model: 13-inch MacBook Pro (2020) + +CPU: 2 GHz Quad-Core Intel Core i5 + +RAM: 16 GB LPDDR4X at 3733 MHz + +### All parallelized functions at this time: + +![alt text](heatmap_all_functions.png) + +### Individual functions: + +betweenness_centrality +![alt text](heatmap_betweenness_centrality_timing.png) + +closeness_vitality +![alt text](heatmap_closeness_vitality_timing.png) + + +local_efficiency +![alt text](heatmap_local_efficiency_timing.png) + + +tournament is_reachable +![alt text](heatmap_is_reachable_timing.png) + + + + diff --git a/timing/timing_individual_function.py b/timing/timing_individual_function.py new file mode 100644 index 0000000..d36034d --- /dev/null +++ b/timing/timing_individual_function.py @@ -0,0 +1,68 @@ +from matplotlib import pyplot as plt +import networkx as nx +import nx_parallel +import time +import seaborn as sns +import pandas as pd + +heatmapDF = pd.DataFrame() +number_of_nodes_list = [10, 50, 100, 300, 500] +pList = [1, 0.8, 0.6, 0.4, 0.2] +currFun = nx.betweenness_centrality +for i in range(0, len(pList)): + p = pList[i] + for j in range(0, len(number_of_nodes_list)): + num = number_of_nodes_list[j] + G = nx.fast_gnp_random_graph(num, 0.5, directed=False) + H = nx_parallel.ParallelGraph(G) + t1 = time.time() + c = currFun(H) + t2 = time.time() + parallelTime = t2-t1 + t1 = time.time() + c = currFun(G) + t2 = time.time() + stdTime = t2-t1 + timesFaster = stdTime/parallelTime + heatmapDF.at[j, i] = timesFaster + print("Finished " + str(currFun)) + +# Code to create for row of heatmap specifically for tournaments, as they cannot be generated the same way +# for i in range(0, len(pList)): +# p = pList[i] +# for j in range(0, len(number_of_nodes_list)): +# num = number_of_nodes_list[j] +# G = nx.tournament.random_tournament(num) +# H = nx_parallel.ParallelDiGraph(G) +# t1 = time.time() +# c = nx.tournament.is_reachable(H, 1, num) +# t2 = time.time() +# parallelTime = t2-t1 +# t1 = time.time() +# c = nx.tournament.is_reachable(G, 1, num) +# t2 = time.time() +# stdTime = t2-t1 +# timesFaster = stdTime/parallelTime +# heatmapDF.at[j, 3] = timesFaster + +# plotting the heatmap with numbers and a green color scheme +plt.figure(figsize=(20, 4)) +hm = sns.heatmap(data=heatmapDF.T, annot=True, cmap='Greens', cbar=True) + +# Remove the tick labels on both axes +hm.set_yticklabels(pList) + +# Adding x-axis labels +hm.set_xticklabels(number_of_nodes_list) + +# Rotating the x-axis labels for better readability (optional) +plt.xticks(rotation=45) +plt.yticks(rotation=20) +plt.title("Small Scale Demo: Times Speedups of " + currFun.__name__ + " compared to networkx") +plt.xlabel("Number of Vertices") +plt.ylabel("Edge Probability") +print(currFun.__name__) + +# displaying the plotted heatmap +plt.tight_layout() +plt.savefig("timing/" + "heatmap_" + currFun.__name__ + "_timing.png") \ No newline at end of file From 7a4f227acc400f1f28469e60e6d2f1de25798a6c Mon Sep 17 00:00:00 2001 From: 20kav <123114628+20kavishs@users.noreply.github.com> Date: Sat, 26 Aug 2023 20:12:11 -0400 Subject: [PATCH 07/26] .py add --- timing/{timing_all_functions => timing_all_functions.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename timing/{timing_all_functions => timing_all_functions.py} (100%) diff --git a/timing/timing_all_functions b/timing/timing_all_functions.py similarity index 100% rename from timing/timing_all_functions rename to timing/timing_all_functions.py From 144caf0dce33b016abc0d981f36be107fbb3eebd Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 00:57:32 -0400 Subject: [PATCH 08/26] fix test build pyproject.toml --- nx_parallel/algorithms/.DS_Store | Bin 6148 -> 0 bytes pyproject.toml | 3 +++ 2 files changed, 3 insertions(+) delete mode 100644 nx_parallel/algorithms/.DS_Store diff --git a/nx_parallel/algorithms/.DS_Store b/nx_parallel/algorithms/.DS_Store deleted file mode 100644 index 87121c68d15e97913ec957f711dbe4a890fcc929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}N6?5T3NvZY@F&Djow~3vR0j;$^Az1zgdCO5JsfF0Px>ZY@#@d(;>5QG6a} zl2k0M2QMOa1}0xJKO6F8$s_GI zJZ?0ab?Hv(a(viy>vDhZU^1yVn>)Klr=5r7F;y>yPJw@(mUW9$c*V}bl|A|WG*Rgt z`lq?m97bk<8DIvMg8_T`Io0J@F0YaqUY2!SLxj~Z-LeGrfu`>(%LJ@j)v`ZZh!ZXM%Gr$bY zGEg+b8rA=k@8AEkNjzc(n1O%AfGD;7b_ Date: Sun, 27 Aug 2023 01:30:58 -0400 Subject: [PATCH 09/26] add init files for import -- might be revised --- nx_parallel/__init__.py | 2 +- nx_parallel/algorithms/__init__.py | 8 ++++++++ nx_parallel/algorithms/centrality/__init__.py | 1 + nx_parallel/algorithms/utils/__init__.py | 1 + nx_parallel/classes/__init__.py | 1 + 5 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 nx_parallel/algorithms/__init__.py create mode 100644 nx_parallel/algorithms/centrality/__init__.py create mode 100644 nx_parallel/algorithms/utils/__init__.py create mode 100644 nx_parallel/classes/__init__.py diff --git a/nx_parallel/__init__.py b/nx_parallel/__init__.py index 243e8e3..fefc51d 100644 --- a/nx_parallel/__init__.py +++ b/nx_parallel/__init__.py @@ -1,3 +1,3 @@ from .algorithms import * -from .classes.graph import * +from .classes import * from .interface import * diff --git a/nx_parallel/algorithms/__init__.py b/nx_parallel/algorithms/__init__.py new file mode 100644 index 0000000..d98e7db --- /dev/null +++ b/nx_parallel/algorithms/__init__.py @@ -0,0 +1,8 @@ +# subpackages +from .centrality import * +from .utils import * + +# modules +from .efficiency_measures import * +from .isolate import * +from .tournament import * diff --git a/nx_parallel/algorithms/centrality/__init__.py b/nx_parallel/algorithms/centrality/__init__.py new file mode 100644 index 0000000..cf7adb6 --- /dev/null +++ b/nx_parallel/algorithms/centrality/__init__.py @@ -0,0 +1 @@ +from .betweenness import * diff --git a/nx_parallel/algorithms/utils/__init__.py b/nx_parallel/algorithms/utils/__init__.py new file mode 100644 index 0000000..253f731 --- /dev/null +++ b/nx_parallel/algorithms/utils/__init__.py @@ -0,0 +1 @@ +from .chunk import * diff --git a/nx_parallel/classes/__init__.py b/nx_parallel/classes/__init__.py new file mode 100644 index 0000000..84a54e6 --- /dev/null +++ b/nx_parallel/classes/__init__.py @@ -0,0 +1 @@ +from .graph import * From 366f4416336e7a13cee60627b0a870a00dab74c2 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 01:51:13 -0400 Subject: [PATCH 10/26] try changing dir --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1bf5acc..fb6bee6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,4 +37,5 @@ jobs: echo "Done with installing" - name: PyTest run: | - pytest + cd ~/nx_parallel + NETWORKX_graph_convert=parallel pytest nx_parallel From 4aab5880a7b8e65b42f9909938e9293884a4a2f9 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 01:54:49 -0400 Subject: [PATCH 11/26] try changing dir correctly --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fb6bee6..ff5937f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,5 +37,5 @@ jobs: echo "Done with installing" - name: PyTest run: | - cd ~/nx_parallel + cd ~/work/nx_parallel NETWORKX_graph_convert=parallel pytest nx_parallel From 35015a2bd2c99e17d1f366730ebd2c14442d8b82 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 02:10:10 -0400 Subject: [PATCH 12/26] undo dir munging tries --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ff5937f..cf9e455 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,5 +37,4 @@ jobs: echo "Done with installing" - name: PyTest run: | - cd ~/work/nx_parallel - NETWORKX_graph_convert=parallel pytest nx_parallel + NETWORKX_GRAPH_CONVERT=parallel pytest . From d49ef2c06974a3f629e53e34c9a6c69dd946955c Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 02:14:49 -0400 Subject: [PATCH 13/26] try again --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf9e455..4a1bc5d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,4 +37,4 @@ jobs: echo "Done with installing" - name: PyTest run: | - NETWORKX_GRAPH_CONVERT=parallel pytest . + NETWORKX_GRAPH_CONVERT=parallel pytest .. From 7696c8862effc338d9bfeaeb0b0aba96179faee4 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 09:33:13 -0400 Subject: [PATCH 14/26] try tests --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4a1bc5d..f2541c9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,4 +37,5 @@ jobs: echo "Done with installing" - name: PyTest run: | - NETWORKX_GRAPH_CONVERT=parallel pytest .. + NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx + PYTHONPATH=$PYTHONPATH:.. pytest . From c6e79741df9c27e3db3fab5d4ec823b3ffbd6fe5 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 11:05:00 -0400 Subject: [PATCH 15/26] debug widnows ci --- .github/workflows/test.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f2541c9..ee2e40c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,9 +33,16 @@ jobs: conda install -c conda-forge joblib scipy pandas pytest-cov pytest-randomly # matplotlib lxml pygraphviz pydot sympy # Extra networkx deps we don't need yet pip install git+https://github.com/networkx/networkx.git@main --no-deps - pip install -e . --no-deps + pwd + pip install -e .. --no-deps + python -c "import nx_parallel" echo "Done with installing" - name: PyTest run: | NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx - PYTHONPATH=$PYTHONPATH:.. pytest . + # try just using tests via networkx. + # or make OS specific environment variables changes like: + # PYTHONPATH=$PYTHONPATH:.. pytest . + # and: + # Add-Content $env:PYTHONPATH + # "D:a/nx_parallel" From 08b19681655c617fa81c7f3edcd09f035e97fc66 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 11:11:20 -0400 Subject: [PATCH 16/26] debug widnows ci --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ee2e40c..e98933a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,7 +34,8 @@ jobs: # matplotlib lxml pygraphviz pydot sympy # Extra networkx deps we don't need yet pip install git+https://github.com/networkx/networkx.git@main --no-deps pwd - pip install -e .. --no-deps + ls -l + pip install -e . --no-deps python -c "import nx_parallel" echo "Done with installing" - name: PyTest From 158d9e383a576a8c23f0baf99d08832af98ead6b Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 11:23:33 -0400 Subject: [PATCH 17/26] now get nx_parallel tests working --- .github/workflows/test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e98933a..7689b75 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,7 +40,9 @@ jobs: echo "Done with installing" - name: PyTest run: | - NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx + #NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx + pytest --collect-only + pytest # try just using tests via networkx. # or make OS specific environment variables changes like: # PYTHONPATH=$PYTHONPATH:.. pytest . From b2c5fb3e778aa62abf2fe6cc970c6fca7ce40ad8 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 11:31:47 -0400 Subject: [PATCH 18/26] show environment pre-testing --- .github/workflows/test.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7689b75..b4544cc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -41,8 +41,11 @@ jobs: - name: PyTest run: | #NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx + pwd + ls -l + python -c "import nx_parallel" pytest --collect-only - pytest + #pytest # try just using tests via networkx. # or make OS specific environment variables changes like: # PYTHONPATH=$PYTHONPATH:.. pytest . From 7f2001e0e6bed6241a87f12165bca0d0ab0a8adc Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 11:35:29 -0400 Subject: [PATCH 19/26] try pyargs with nx_parallel --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b4544cc..cae7208 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,7 +44,7 @@ jobs: pwd ls -l python -c "import nx_parallel" - pytest --collect-only + pytest --collect-only --pyargs nx_parallel #pytest # try just using tests via networkx. # or make OS specific environment variables changes like: From fea4bbeef6545731c7178347762caa5c79f454a2 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 11:46:10 -0400 Subject: [PATCH 20/26] import debug --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cae7208..a9eb08c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: run: shell: bash -l {0} strategy: - fail-fast: true + fail-fast: false matrix: os: ["ubuntu-latest", "macos-latest", "windows-latest"] python-version: ["3.10", "3.11"] @@ -43,9 +43,9 @@ jobs: #NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx pwd ls -l - python -c "import nx_parallel" + python -c "import nx_parallel;print(dir(nx_parallel))" pytest --collect-only --pyargs nx_parallel - #pytest + #pytest --pyargs nx_parallel # try just using tests via networkx. # or make OS specific environment variables changes like: # PYTHONPATH=$PYTHONPATH:.. pytest . From f1d10f14f451058d34319975fb848a0a4792f311 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 11:53:59 -0400 Subject: [PATCH 21/26] print more --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a9eb08c..304ede9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,11 +32,11 @@ jobs: run: | conda install -c conda-forge joblib scipy pandas pytest-cov pytest-randomly # matplotlib lxml pygraphviz pydot sympy # Extra networkx deps we don't need yet - pip install git+https://github.com/networkx/networkx.git@main --no-deps + python -m pip install git+https://github.com/networkx/networkx.git@main pwd ls -l - pip install -e . --no-deps - python -c "import nx_parallel" + python -m pip install . + python -c "import nx_parallel;print(dir(nx_parallel))" echo "Done with installing" - name: PyTest run: | From 47dccd3ea70893ee89af6deaba2001a614415d8d Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 12:04:34 -0400 Subject: [PATCH 22/26] use python -m pytest instead of pytest --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 304ede9..16b897d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -44,7 +44,7 @@ jobs: pwd ls -l python -c "import nx_parallel;print(dir(nx_parallel))" - pytest --collect-only --pyargs nx_parallel + python -m pytest --collect-only --pyargs nx_parallel #pytest --pyargs nx_parallel # try just using tests via networkx. # or make OS specific environment variables changes like: From e792122e394352536ade5bfea7184b4abf6a2dd4 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 27 Aug 2023 12:12:38 -0400 Subject: [PATCH 23/26] cleanup and check all --- .github/workflows/test.yml | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 16b897d..4a65468 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: run: shell: bash -l {0} strategy: - fail-fast: false + fail-fast: true matrix: os: ["ubuntu-latest", "macos-latest", "windows-latest"] python-version: ["3.10", "3.11"] @@ -33,22 +33,9 @@ jobs: conda install -c conda-forge joblib scipy pandas pytest-cov pytest-randomly # matplotlib lxml pygraphviz pydot sympy # Extra networkx deps we don't need yet python -m pip install git+https://github.com/networkx/networkx.git@main - pwd - ls -l python -m pip install . - python -c "import nx_parallel;print(dir(nx_parallel))" echo "Done with installing" - name: PyTest run: | - #NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx - pwd - ls -l - python -c "import nx_parallel;print(dir(nx_parallel))" - python -m pytest --collect-only --pyargs nx_parallel - #pytest --pyargs nx_parallel - # try just using tests via networkx. - # or make OS specific environment variables changes like: - # PYTHONPATH=$PYTHONPATH:.. pytest . - # and: - # Add-Content $env:PYTHONPATH - # "D:a/nx_parallel" + NETWORKX_GRAPH_CONVERT=parallel pytest --pyargs networkx + python -m pytest --pyargs nx_parallel From 95277fa1fb4571c0e761124c50f71af440d0f198 Mon Sep 17 00:00:00 2001 From: 20kav <123114628+20kavishs@users.noreply.github.com> Date: Sun, 27 Aug 2023 12:18:12 -0400 Subject: [PATCH 24/26] Quick timing documentation update --- timing/timing_comparison.md | 1 + timing/timing_individual_function.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/timing/timing_comparison.md b/timing/timing_comparison.md index 542f330..6a0efe9 100644 --- a/timing/timing_comparison.md +++ b/timing/timing_comparison.md @@ -7,6 +7,7 @@ CPU: 2 GHz Quad-Core Intel Core i5 RAM: 16 GB LPDDR4X at 3733 MHz +Code to generate heatmaps in timing_individual_function.py and timing_all_functions.py. ### All parallelized functions at this time: ![alt text](heatmap_all_functions.png) diff --git a/timing/timing_individual_function.py b/timing/timing_individual_function.py index d36034d..2df1e4a 100644 --- a/timing/timing_individual_function.py +++ b/timing/timing_individual_function.py @@ -5,6 +5,7 @@ import seaborn as sns import pandas as pd +#Code to create README heatmaps for individual function currFun heatmapDF = pd.DataFrame() number_of_nodes_list = [10, 50, 100, 300, 500] pList = [1, 0.8, 0.6, 0.4, 0.2] @@ -13,8 +14,12 @@ p = pList[i] for j in range(0, len(number_of_nodes_list)): num = number_of_nodes_list[j] + + # create original and parallel graphs G = nx.fast_gnp_random_graph(num, 0.5, directed=False) H = nx_parallel.ParallelGraph(G) + + # time both versions and update heatmapDF t1 = time.time() c = currFun(H) t2 = time.time() From 22017fee7f7a26bc4c0e9e74533c8b413ee6f94d Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 10 Sep 2023 23:12:57 -0400 Subject: [PATCH 25/26] style with black and ruff --- .gitignore | 5 -- .../algorithms/centrality/betweenness.py | 52 +++++------------ nx_parallel/algorithms/efficiency_measures.py | 21 ++++--- nx_parallel/algorithms/isolate.py | 12 ++-- nx_parallel/algorithms/tests/test_vitality.py | 17 +++--- nx_parallel/algorithms/tournament.py | 57 ++++++++++++++----- nx_parallel/classes/graph.py | 17 ++++-- nx_parallel/interface.py | 29 ++++++---- timing/timing_all_functions.py | 27 +++++---- timing/timing_comparison.md | 12 ++-- timing/timing_individual_function.py | 18 +++--- 11 files changed, 147 insertions(+), 120 deletions(-) diff --git a/.gitignore b/.gitignore index 37bad78..b6e4761 100644 --- a/.gitignore +++ b/.gitignore @@ -127,8 +127,3 @@ dmypy.json # Pyre type checker .pyre/ - -test.py -runtimes.py -nx_parallel/interface_old.py -nx_parallel/interface2.py diff --git a/nx_parallel/algorithms/centrality/betweenness.py b/nx_parallel/algorithms/centrality/betweenness.py index 42a9bf0..ea793ed 100644 --- a/nx_parallel/algorithms/centrality/betweenness.py +++ b/nx_parallel/algorithms/centrality/betweenness.py @@ -1,22 +1,22 @@ from joblib import Parallel, delayed, cpu_count -from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph from nx_parallel.algorithms.utils.chunk import chunks -import networkx as nx from networkx.utils import py_random_state from networkx.algorithms.centrality.betweenness import ( - _rescale, - _single_source_shortest_path_basic, - _single_source_dijkstra_path_basic, - _accumulate_endpoints, - _accumulate_basic + _rescale, + _single_source_shortest_path_basic, + _single_source_dijkstra_path_basic, + _accumulate_endpoints, + _accumulate_basic, ) + __all__ = ["betweenness_centrality"] + @py_random_state(5) def betweenness_centrality( G, k=None, normalized=True, weight=None, endpoints=False, seed=None ): - r"""Compute the shortest-path betweenness centrality for nodes. Parallel implementation. + r"""Parallel Compute shortest-path betweenness centrality for nodes Betweenness centrality of a node $v$ is the sum of the fraction of all-pairs shortest paths that pass through $v$ @@ -67,28 +67,10 @@ def betweenness_centrality( Notes ----- - This algorithm is a parallelized version of betwenness centrality in NetworkX. Nodes are divided into - chunks based on the number of available processors, and otherwise all calculations are similar - - References - ---------- - .. [1] Ulrik Brandes: - A Faster Algorithm for Betweenness Centrality. - Journal of Mathematical Sociology 25(2):163-177, 2001. - https://doi.org/10.1080/0022250X.2001.9990249 - .. [2] Linton C. Freeman: - A set of measures of centrality based on betweenness. - Sociometry 40: 35–41, 1977 - https://doi.org/10.2307/3033543 - .. [3] Linton C. Freeman: - A set of measures of centrality based on betweenness. - Sociometry 40: 35–41, 1977 - https://doi.org/10.2307/3033543 - .. [4] NetworkX Development Team: - Parallel Betweenness Centrality. NetworkX documentation. - Available at: https://networkx.org/documentation/stable/auto_examples/algorithms/plot_parallel_betweenness.html - Accessed on June 26, 2023. - """ + This algorithm is a parallelized version of betwenness centrality in NetworkX. + Nodes are divided into chunks based on the number of available processors, + and otherwise all calculations are similar. + """ if k is None: nodes = G.nodes else: @@ -106,7 +88,7 @@ def betweenness_centrality( for chunk in node_chunks ) - #Reducing partial solution + # Reducing partial solution bt_c = bt_cs[0] for bt in bt_cs[1:]: for n in bt: @@ -123,7 +105,6 @@ def betweenness_centrality( return betweenness - def betweenness_centrality_node_subset(G, nodes, weight=None, endpoints=False): betweenness = dict.fromkeys(G, 0.0) for s in nodes: @@ -138,10 +119,3 @@ def betweenness_centrality_node_subset(G, nodes, weight=None, endpoints=False): else: betweenness, delta = _accumulate_basic(betweenness, S, P, sigma, s) return betweenness - - - - - - - diff --git a/nx_parallel/algorithms/efficiency_measures.py b/nx_parallel/algorithms/efficiency_measures.py index bf1da1c..568a068 100644 --- a/nx_parallel/algorithms/efficiency_measures.py +++ b/nx_parallel/algorithms/efficiency_measures.py @@ -1,23 +1,30 @@ """Provides functions for computing the efficiency of nodes and graphs.""" from joblib import Parallel, cpu_count, delayed from nx_parallel.algorithms.utils.chunk import chunks -from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph +from nx_parallel.classes.graph import ( + ParallelGraph, + ParallelDiGraph, + ParallelMultiDiGraph, + ParallelMultiGraph, +) import networkx as nx from networkx.utils import not_implemented_for __all__ = ["local_efficiency"] """Helper to interface between graph types""" + + def _convert(G): if isinstance(G, ParallelMultiDiGraph): - I = ParallelMultiDiGraph.to_networkx(G) + return ParallelMultiDiGraph.to_networkx(G) if isinstance(G, ParallelMultiGraph): - I = ParallelMultiGraph.to_networkx(G) + return ParallelMultiGraph.to_networkx(G) if isinstance(G, ParallelDiGraph): - I = ParallelDiGraph.to_networkx(G) + return ParallelDiGraph.to_networkx(G) if isinstance(G, ParallelGraph): - I = ParallelGraph.to_networkx(G) - return I + return ParallelGraph.to_networkx(G) + @not_implemented_for("directed") def efficiency(G, u, v): @@ -77,7 +84,7 @@ def local_efficiency(G): delayed(local_efficiency_node_subset)(G, chunk) for chunk in node_chunks ) return sum(efficiencies) / len(G) - + def local_efficiency_node_subset(G, nodes): return sum(global_efficiency(G.subgraph(G[v])) for v in nodes) diff --git a/nx_parallel/algorithms/isolate.py b/nx_parallel/algorithms/isolate.py index 2e091dd..2e745d8 100644 --- a/nx_parallel/algorithms/isolate.py +++ b/nx_parallel/algorithms/isolate.py @@ -1,18 +1,23 @@ from joblib import Parallel, cpu_count, delayed import networkx as nx from nx_parallel.algorithms.utils.chunk import chunks -from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph __all__ = ["number_of_isolates"] """Identical to networkx implementation""" + + def is_isolate(G, n): return nx.is_isolate(G.originalGraph, n) + """Identical to networkx implementation""" + + def isolates(G): return nx.isolates(G.originalGraph) - + + def number_of_isolates(G): """Returns the number of isolates in the graph. Parallel implementation. @@ -35,6 +40,3 @@ def number_of_isolates(G): isolate_chunks = chunks(isolates_list, num_chunks) results = Parallel(n_jobs=-1)(delayed(len)(chunk) for chunk in isolate_chunks) return sum(results) - - - diff --git a/nx_parallel/algorithms/tests/test_vitality.py b/nx_parallel/algorithms/tests/test_vitality.py index 8ac789b..dd68e98 100644 --- a/nx_parallel/algorithms/tests/test_vitality.py +++ b/nx_parallel/algorithms/tests/test_vitality.py @@ -1,26 +1,27 @@ -"""Unit tests for the :mod:`networkx.algorithms.vitality` module. Modified for nx_parallel backend""" +"""Modified unit tests ifor backend from :mod:`networkx.algorithms.vitality`""" -import networkx as nx; import nx_parallel +import networkx as nx +import nx_parallel class TestClosenessVitality: def test_unweighted(self): G = nx.cycle_graph(3) - H = nx_parallel.ParallelGraph(G) + H = nx_parallel.ParallelGraph(G) vitality = nx.closeness_vitality(H) assert vitality == {0: 2, 1: 2, 2: 2} def test_weighted(self): G = nx.Graph() nx.add_cycle(G, [0, 1, 2], weight=2) - H = nx_parallel.ParallelGraph(G) + H = nx_parallel.ParallelGraph(G) vitality = nx.closeness_vitality(H, weight="weight") assert vitality == {0: 4, 1: 4, 2: 4} def test_unweighted_digraph(self): G = nx.DiGraph(nx.cycle_graph(3)) print(G) - H = nx_parallel.ParallelDiGraph(G) + H = nx_parallel.ParallelDiGraph(G) print(H) vitality = nx.closeness_vitality(H) assert vitality == {0: 4, 1: 4, 2: 4} @@ -29,7 +30,7 @@ def test_weighted_digraph(self): G = nx.DiGraph() nx.add_cycle(G, [0, 1, 2], weight=2) nx.add_cycle(G, [2, 1, 0], weight=2) - H = nx_parallel.ParallelDiGraph(G) + H = nx_parallel.ParallelDiGraph(G) vitality = nx.closeness_vitality(H, weight="weight") assert vitality == {0: 8, 1: 8, 2: 8} @@ -37,7 +38,7 @@ def test_weighted_multidigraph(self): G = nx.MultiDiGraph() nx.add_cycle(G, [0, 1, 2], weight=2) nx.add_cycle(G, [2, 1, 0], weight=2) - H = nx_parallel.ParallelMultiDiGraph(G) + H = nx_parallel.ParallelMultiDiGraph(G) vitality = nx.closeness_vitality(H, weight="weight") assert vitality == {0: 8, 1: 8, 2: 8} @@ -47,5 +48,5 @@ def test_disconnecting_graph(self): """ G = nx.path_graph(3) - H = nx_parallel.ParallelGraph(G) + nx_parallel.ParallelGraph(G) assert nx.closeness_vitality(G, node=1) == -float("inf") diff --git a/nx_parallel/algorithms/tournament.py b/nx_parallel/algorithms/tournament.py index 7a70608..9d602b4 100644 --- a/nx_parallel/algorithms/tournament.py +++ b/nx_parallel/algorithms/tournament.py @@ -1,8 +1,6 @@ -import itertools from joblib import Parallel, cpu_count, delayed import networkx as nx from nx_parallel.algorithms.utils.chunk import chunks -from nx_parallel.classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph from networkx.algorithms.simple_paths import is_simple_path as is_path __all__ = [ @@ -11,26 +9,43 @@ ] """Identical to networkx implementation""" + + def index_satisfying(iterable, condition): return nx.algorithms.tournament.index_satisfying(iterable, condition) + """Identical to networkx implementation""" + + def is_tournament(G): return nx.algorithms.tournament.is_tournament(G.originalGraph) + """Identical to networkx implementation""" + + def hamiltonian_path(G): return nx.algorithms.tournament.hamiltonian_path(G.originalGraph) + """Identical to networkx implementation""" + + def random_tournament(n, seed=None): return nx.algorithms.tournament.random_tournament(n, seed) + """Identical to networkx implementation""" + + def score_sequence(G): return nx.algorithms.tournament.score_sequence(G.originalGraph) + """Identical to networkx implementation""" + + def tournament_matrix(G): return nx.algorithms.tournament.tournament_matrix(G.originalGraph) @@ -88,37 +103,49 @@ def is_reachable(G, s, t): *Electronic Colloquium on Computational Complexity*. 2001. """ - + """Subset version of two_neighborhood""" + def two_neighborhood_subset(G, chunk): reList = set() for v in chunk: - reList.update({x for x in G if x == v or x in G[v] or any(is_path(G.originalGraph, [v, z, x]) for z in G)}) + reList.update( + { + x + for x in G + if x == v + or x in G[v] + or any(is_path(G.originalGraph, [v, z, x]) for z in G) + } + ) return reList - + """Identical to networkx helper implementation""" + def is_closed(G, nodes): return all(v in G[u] for u in set(G) - nodes for v in nodes) """helper to check closure conditions for chunk (iterable) of neighborhoods""" + def check_closure_subset(chunk): - return all(not (is_closed(G, S) and s in S and t not in S) for S in chunk) + return all(not (is_closed(G, S) and s in S and t not in S) for S in chunk) num_chunks = max(len(G) // cpu_count(), 1) - #send chunk of vertices to each process (calculating neighborhoods) - node_chunks = list(chunks(G.nodes, num_chunks)) + # send chunk of vertices to each process (calculating neighborhoods) + node_chunks = list(chunks(G.nodes, num_chunks)) neighborhoods = Parallel(n_jobs=-1)( delayed(two_neighborhood_subset)(G, chunk) for chunk in node_chunks ) - #send chunk of neighborhoods to each process (checking closure conditions) - neighborhood_chunks = list(chunks(neighborhoods, num_chunks)) + # send chunk of neighborhoods to each process (checking closure conditions) + neighborhood_chunks = list(chunks(neighborhoods, num_chunks)) results = Parallel(n_jobs=-1, backend="loky")( delayed(check_closure_subset)(chunk) for chunk in neighborhood_chunks ) return all(results) + def tournament_is_strongly_connected(G): """Decides whether the given tournament is strongly connected. @@ -167,14 +194,18 @@ def tournament_is_strongly_connected(G): """ - + """Subset version of is_reachable""" + def is_reachable_subset(G, chunk): re = set() for v in chunk: re.update(is_reachable(G, u, v) for u in G) return all(re) + num_chunks = max(len(G) // cpu_count(), 1) - node_chunks = list(chunks(G.nodes, num_chunks)) - results = Parallel(n_jobs=-1)(delayed(is_reachable_subset)(G, chunk) for chunk in node_chunks) + node_chunks = list(chunks(G.nodes, num_chunks)) + results = Parallel(n_jobs=-1)( + delayed(is_reachable_subset)(G, chunk) for chunk in node_chunks + ) return all(results) diff --git a/nx_parallel/classes/graph.py b/nx_parallel/classes/graph.py index 4106ed9..cd3329d 100644 --- a/nx_parallel/classes/graph.py +++ b/nx_parallel/classes/graph.py @@ -1,6 +1,11 @@ from networkx import Graph, DiGraph, MultiDiGraph, MultiGraph -__all__ = ["ParallelGraph", "ParallelDiGraph", "ParallelMultiDiGraph", "ParallelMultiGraph"] +__all__ = [ + "ParallelGraph", + "ParallelDiGraph", + "ParallelMultiDiGraph", + "ParallelMultiGraph", +] class ParallelGraph(Graph): @@ -12,7 +17,8 @@ def __init__(self, incoming_graph_data=None, **attr): def to_networkx(self): return Graph(self) - + + class ParallelDiGraph(DiGraph): __networkx_plugin__ = "parallel" @@ -22,7 +28,8 @@ def __init__(self, incoming_graph_data=None, **attr): def to_networkx(self): return DiGraph(self) - + + class ParallelMultiGraph(MultiGraph): __networkx_plugin__ = "parallel" @@ -32,7 +39,7 @@ def __init__(self, incoming_graph_data=None, **attr): def to_networkx(self): return MultiGraph(self) - + class ParallelMultiDiGraph(MultiDiGraph): __networkx_plugin__ = "parallel" @@ -42,4 +49,4 @@ def __init__(self, incoming_graph_data=None, **attr): self.originalGraph = MultiDiGraph(self) def to_networkx(self): - return MultiDiGraph(self) \ No newline at end of file + return MultiDiGraph(self) diff --git a/nx_parallel/interface.py b/nx_parallel/interface.py index 85c9546..20bc393 100644 --- a/nx_parallel/interface.py +++ b/nx_parallel/interface.py @@ -1,6 +1,11 @@ import networkx as nx -from networkx import DiGraph, Graph, MultiDiGraph, MultiGraph, PlanarEmbedding -from .classes.graph import ParallelGraph, ParallelDiGraph,ParallelMultiDiGraph, ParallelMultiGraph +from networkx import DiGraph, Graph, MultiDiGraph, MultiGraph +from .classes.graph import ( + ParallelGraph, + ParallelDiGraph, + ParallelMultiDiGraph, + ParallelMultiGraph, +) from .algorithms.centrality.betweenness import betweenness_centrality from .algorithms.isolate import number_of_isolates, isolates, is_isolate from .algorithms.vitality import closeness_vitality @@ -13,7 +18,11 @@ score_sequence, tournament_matrix, ) -from .algorithms.efficiency_measures import efficiency, local_efficiency, global_efficiency +from .algorithms.efficiency_measures import ( + efficiency, + local_efficiency, + global_efficiency, +) __all__ = ["Dispatcher"] @@ -39,10 +48,10 @@ class Dispatcher: isolates = isolates is_isolate = is_isolate - #Vitality + # Vitality closeness_vitality = closeness_vitality - #Tournament + # Tournament is_tournament = is_tournament hamiltonian_path = hamiltonian_path random_tournament = random_tournament @@ -50,11 +59,11 @@ class Dispatcher: tournament_matrix = tournament_matrix is_reachable = is_reachable tournament_is_strongly_connected = tournament_is_strongly_connected - + # Centrality betweenness_centrality = betweenness_centrality - #Efficiency + # Efficiency efficiency = efficiency local_efficiency = local_efficiency global_efficiency = global_efficiency @@ -169,8 +178,4 @@ def convert_from_nx( @staticmethod def convert_to_nx(obj, *, name=None): - return obj - - - - + return obj diff --git a/timing/timing_all_functions.py b/timing/timing_all_functions.py index fca36ac..ff282ca 100644 --- a/timing/timing_all_functions.py +++ b/timing/timing_all_functions.py @@ -5,7 +5,7 @@ import seaborn as sns import pandas as pd -#Code to create README heatmap for all functions in function_list +# Code to create README heatmap for all functions in function_list heatmapDF = pd.DataFrame() function_list = [nx.betweenness_centrality, nx.closeness_vitality, nx.local_efficiency] number_of_nodes_list = [10, 20, 50, 300, 600] @@ -23,16 +23,16 @@ t1 = time.time() c = currFun(H) t2 = time.time() - parallelTime = t2-t1 + parallelTime = t2 - t1 t1 = time.time() c = currFun(G) t2 = time.time() - stdTime = t2-t1 - timesFaster = stdTime/parallelTime + stdTime = t2 - t1 + timesFaster = stdTime / parallelTime heatmapDF.at[j, i] = timesFaster print("Finished " + str(currFun)) -#Code to create for row of heatmap specifically for tournaments, as they cannot be generated the same way +# Code to create for row of heatmap specifically for tournaments for j in range(0, len(number_of_nodes_list)): num = number_of_nodes_list[j] G = nx.tournament.random_tournament(num) @@ -40,20 +40,27 @@ t1 = time.time() c = nx.tournament.is_reachable(H, 1, num) t2 = time.time() - parallelTime = t2-t1 + parallelTime = t2 - t1 t1 = time.time() c = nx.tournament.is_reachable(G, 1, num) t2 = time.time() - stdTime = t2-t1 - timesFaster = stdTime/parallelTime + stdTime = t2 - t1 + timesFaster = stdTime / parallelTime heatmapDF.at[j, 3] = timesFaster # plotting the heatmap with numbers and a green color scheme plt.figure(figsize=(20, 4)) -hm = sns.heatmap(data=heatmapDF.T, annot=True, cmap='Greens', cbar=True) +hm = sns.heatmap(data=heatmapDF.T, annot=True, cmap="Greens", cbar=True) # Remove the tick labels on both axes -hm.set_yticklabels(["betweenness_centrality", "closeness_vitality", "local_efficiency", "tournament is_reachable"]) +hm.set_yticklabels( + [ + "betweenness_centrality", + "closeness_vitality", + "local_efficiency", + "tournament is_reachable", + ] +) # Adding x-axis labels hm.set_xticklabels(number_of_nodes_list) diff --git a/timing/timing_comparison.md b/timing/timing_comparison.md index 6a0efe9..cbbd0ae 100644 --- a/timing/timing_comparison.md +++ b/timing/timing_comparison.md @@ -1,5 +1,6 @@ Timing Comparisons -__________________ + +--- Model: 13-inch MacBook Pro (2020) @@ -8,26 +9,21 @@ CPU: 2 GHz Quad-Core Intel Core i5 RAM: 16 GB LPDDR4X at 3733 MHz Code to generate heatmaps in timing_individual_function.py and timing_all_functions.py. + ### All parallelized functions at this time: ![alt text](heatmap_all_functions.png) ### Individual functions: - + betweenness_centrality ![alt text](heatmap_betweenness_centrality_timing.png) closeness_vitality ![alt text](heatmap_closeness_vitality_timing.png) - local_efficiency ![alt text](heatmap_local_efficiency_timing.png) - tournament is_reachable ![alt text](heatmap_is_reachable_timing.png) - - - - diff --git a/timing/timing_individual_function.py b/timing/timing_individual_function.py index 2df1e4a..ac9a816 100644 --- a/timing/timing_individual_function.py +++ b/timing/timing_individual_function.py @@ -5,7 +5,7 @@ import seaborn as sns import pandas as pd -#Code to create README heatmaps for individual function currFun +# Code to create README heatmaps for individual function currFun heatmapDF = pd.DataFrame() number_of_nodes_list = [10, 50, 100, 300, 500] pList = [1, 0.8, 0.6, 0.4, 0.2] @@ -23,16 +23,16 @@ t1 = time.time() c = currFun(H) t2 = time.time() - parallelTime = t2-t1 + parallelTime = t2 - t1 t1 = time.time() c = currFun(G) t2 = time.time() - stdTime = t2-t1 - timesFaster = stdTime/parallelTime + stdTime = t2 - t1 + timesFaster = stdTime / parallelTime heatmapDF.at[j, i] = timesFaster print("Finished " + str(currFun)) -# Code to create for row of heatmap specifically for tournaments, as they cannot be generated the same way +# Code to create for row of heatmap specifically for tournaments # for i in range(0, len(pList)): # p = pList[i] # for j in range(0, len(number_of_nodes_list)): @@ -52,7 +52,7 @@ # plotting the heatmap with numbers and a green color scheme plt.figure(figsize=(20, 4)) -hm = sns.heatmap(data=heatmapDF.T, annot=True, cmap='Greens', cbar=True) +hm = sns.heatmap(data=heatmapDF.T, annot=True, cmap="Greens", cbar=True) # Remove the tick labels on both axes hm.set_yticklabels(pList) @@ -63,11 +63,13 @@ # Rotating the x-axis labels for better readability (optional) plt.xticks(rotation=45) plt.yticks(rotation=20) -plt.title("Small Scale Demo: Times Speedups of " + currFun.__name__ + " compared to networkx") +plt.title( + "Small Scale Demo: Times Speedups of " + currFun.__name__ + " compared to networkx" +) plt.xlabel("Number of Vertices") plt.ylabel("Edge Probability") print(currFun.__name__) # displaying the plotted heatmap plt.tight_layout() -plt.savefig("timing/" + "heatmap_" + currFun.__name__ + "_timing.png") \ No newline at end of file +plt.savefig("timing/" + "heatmap_" + currFun.__name__ + "_timing.png") From 82f568357c1db24fdfd6e6a4b1a9f88b04b672d8 Mon Sep 17 00:00:00 2001 From: Dan Schult Date: Sun, 10 Sep 2023 23:13:45 -0400 Subject: [PATCH 26/26] set up pre-commit config to match NetworkX --- .pre-commit-config.yaml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..33038c6 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,31 @@ +# Install pre-commit hooks via +# pre-commit install + +repos: + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + - repo: https://github.com/adamchainz/blacken-docs + rev: 1.13.0 + hooks: + - id: blacken-docs + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v2.7.1 + hooks: + - id: prettier + files: \.(html|md|toml|yml|yaml) + args: [--prose-wrap=preserve] + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: v0.0.258 + hooks: + - id: ruff + args: + - --fix + - repo: local + hooks: + - id: pyproject.toml + name: pyproject.toml + language: system + entry: python tools/generate_pyproject.toml.py + files: "pyproject.toml|requirements/.*\\.txt|tools/.*pyproject.*"