def test_graph_roundtrip_undirected_weighted_nodevals(default_plugin_resolver): rt = RoundTripper(default_plugin_resolver) g = nx.Graph() nodes = [1, 3, 5, 7, 8, 9, 10, 11, 15] node_weights = [1.1, 0.0, -4.4, 4.4, 6.5, 1.2, 2.0, 0.01, 15.2] edges = [(1, 3), (3, 5), (5, 7), (7, 9), (9, 3), (5, 5), (11, 10)] edge_weights = [1.1, 0.0, -4.4, 4.4, 6.5, 1.2, 2.0] g.add_nodes_from(nodes) g.add_edges_from(edges) # nodevals as floats, edges as bools nx.set_node_attributes( g, {node: wgt for node, wgt in zip(nodes, node_weights)}, name="weight" ) nx.set_edge_attributes( g, {edge: bool(wgt) for edge, wgt in zip(edges, edge_weights)}, name="weight" ) rt.verify_round_trip(NetworkXGraph(g)) # nodevals as ints, edges as floats nx.set_node_attributes( g, {node: int(wgt) for node, wgt in zip(nodes, node_weights)}, name="weight" ) nx.set_edge_attributes( g, {edge: wgt for edge, wgt in zip(edges, edge_weights)}, name="weight" ) rt.verify_round_trip(NetworkXGraph(g)) # nodevals as bools, edges as ints nx.set_node_attributes( g, {node: bool(wgt) for node, wgt in zip(nodes, node_weights)}, name="weight" ) nx.set_edge_attributes( g, {edge: int(wgt) for edge, wgt in zip(edges, edge_weights)}, name="weight" ) rt.verify_round_trip(NetworkXGraph(g))
def test_graph_roundtrip_directed_symmetric(default_plugin_resolver): rt = RoundTripper(default_plugin_resolver) g = nx.DiGraph() g.add_nodes_from([1, 3, 5, 7, 8, 9, 10, 11, 15]) edges = [(1, 3), (3, 1), (3, 5), (5, 3), (3, 9), (9, 3), (5, 5), (11, 10), (10, 11)] edge_weights = [1.1, 1.1, 0.0, -4.4, 4.4, 6.5, 1.2, 2.0] # float with neg weights g.add_weighted_edges_from( [(src, dst, wgt) for (src, dst), wgt in zip(edges, edge_weights)] ) rt.verify_round_trip(NetworkXGraph(g)) # float without neg weights g.add_weighted_edges_from( [(src, dst, abs(wgt)) for (src, dst), wgt in zip(edges, edge_weights)] ) rt.verify_round_trip(NetworkXGraph(g)) # int with neg weights g.add_weighted_edges_from( [(src, dst, int(wgt)) for (src, dst), wgt in zip(edges, edge_weights)] ) rt.verify_round_trip(NetworkXGraph(g)) # int without neg weights g.add_weighted_edges_from( [(src, dst, abs(int(wgt))) for (src, dst), wgt in zip(edges, edge_weights)] ) rt.verify_round_trip(NetworkXGraph(g)) # bool g.add_weighted_edges_from( [(src, dst, bool(wgt)) for (src, dst), wgt in zip(edges, edge_weights)] ) rt.verify_round_trip(NetworkXGraph(g))
def test_graph_roundtrip_directed_unweighted(default_plugin_resolver): dpr = default_plugin_resolver rt = RoundTripper(dpr) g = nx.DiGraph() g.add_nodes_from([1, 3, 5, 7, 8, 9, 10, 11, 15]) g.add_edges_from([(1, 3), (3, 1), (3, 5), (5, 7), (7, 9), (9, 3), (5, 5), (11, 10)]) graph = NetworkXGraph(g) rt.verify_round_trip(graph) # networkx: edgetype=set overrides weight label g2 = nx.DiGraph() g2.add_nodes_from([1, 3, 5, 7, 8]) g2.add_weighted_edges_from([(1, 3, 2), (3, 5, 4), (5, 7, 6)]) graph2 = NetworkXGraph(g2, aprops={"edge_type": "set"}) rt.verify_round_trip(graph2)
def build_standard_graph(directed=True): r""" 0 <--2-- 1 5 --10-> 6 | ^ | ^ ^ / | / | / | / 1 7 3 9 5 11 | / | / | / v v / v 3 --8--> 4 <--4-- 2 --6--> 7 """ ebunch = [ (0, 3, 1), (1, 0, 2), (1, 4, 3), (2, 4, 4), (2, 5, 5), (2, 7, 6), (3, 1, 7), (3, 4, 8), (4, 5, 9), (5, 6, 10), (6, 2, 11), ] nx_graph = nx.DiGraph() if directed else nx.Graph() nx_graph.add_weighted_edges_from(ebunch) return NetworkXGraph(nx_graph)
def test_graph_roundtrip_undirected_unweighted(default_plugin_resolver): rt = RoundTripper(default_plugin_resolver) g = nx.Graph() g.add_nodes_from([1, 3, 5, 7, 8, 9, 10, 11, 15]) g.add_edges_from([(1, 3), (3, 5), (5, 7), (7, 9), (9, 3), (5, 5), (11, 10)]) graph = NetworkXGraph(g) rt.verify_round_trip(graph)
def test_graph_edgeset_oneway_undirected(default_plugin_resolver): rt = RoundTripper(default_plugin_resolver) g = nx.Graph() g.add_nodes_from([1, 3, 5, 7, 8, 9, 10, 11, 15]) g.add_edges_from([(1, 3), (3, 5), (5, 7), (7, 9), (9, 3), (5, 5), (11, 10)]) graph = NetworkXGraph(g) df = pd.DataFrame( {"source": [11, 1, 3, 5, 7, 9, 5], "target": [10, 3, 5, 7, 9, 3, 5]} ) edgeset = PandasEdgeSet(df, is_directed=False) rt.verify_one_way(graph, edgeset)
def test_graph_nodeset_oneway(default_plugin_resolver): rt = RoundTripper(default_plugin_resolver) g = nx.Graph() nodes = [1, 3, 5, 7, 8, 9, 10, 11, 15] node_weights = [1.1, 0.0, -4.4, 4.4, 6.5, 1.2, 2.0, 0.01, 15.2] edges = [(1, 3), (3, 5), (5, 7), (7, 9), (9, 3), (5, 5), (11, 10)] g.add_nodes_from(nodes) g.add_edges_from(edges) nx.set_node_attributes( g, {node: wgt for node, wgt in zip(nodes, node_weights)}, name="weight" ) rt.verify_one_way(NetworkXGraph(g), NumpyNodeSet(nodes))
def test_networkx_scipy_graph_from_edgeset(default_plugin_resolver): dpr = default_plugin_resolver g = nx.DiGraph() g.add_edges_from([(2, 2), (2, 7), (7, 7), (7, 0), (0, 7)]) x = NetworkXGraph(g) # Convert networkx -> scipy adjacency # 0 2 7 # 0 [ 1] # 2 [ 1 1] # 7 [1 1] m = ss.coo_matrix(([1, 1, 1, 1, 1], ([0, 1, 1, 2, 2], [2, 1, 2, 0, 2])), dtype=bool) intermediate = ScipyGraph(m, [0, 2, 7]) y = dpr.translate(x, ScipyGraph) dpr.assert_equal(y, intermediate)
def graph_stellargraph_to_networkx(x: StellarGraph, **props) -> NetworkXGraph: aprops = StellarGraph.Type.compute_abstract_properties( x, { "is_directed", "node_type", "node_dtype", "edge_type", "edge_dtype" }) nx_multi_graph = x.value.to_networkx( node_type_attr=x.node_sg_type, edge_type_attr=x.edge_sg_type, edge_weight_attr="weight", feature_attr="weight", ) has_node_weights = aprops["node_type"] == "map" if has_node_weights: node_weight_label = "weight" caster = dtype_casting[aprops["node_dtype"]] else: node_weight_label = None for node, node_attributes in nx_multi_graph.nodes(data=True): del node_attributes[x.node_sg_type] if has_node_weights: node_attributes["weight"] = caster( node_attributes["weight"][x.node_weight_index]) else: del node_attributes["weight"] is_weighted = aprops["edge_type"] == "map" if is_weighted: edge_weight_label = "weight" caster = dtype_casting[aprops["edge_dtype"]] else: edge_weight_label = None for src, dst, edge_attributes in nx_multi_graph.edges(data=True): del edge_attributes[x.edge_sg_type] if is_weighted: edge_attributes["weight"] = caster(edge_attributes["weight"]) else: del edge_attributes["weight"] nx_graph = (nx.DiGraph(nx_multi_graph) if aprops["is_directed"] else nx.Graph(nx_multi_graph)) return NetworkXGraph( nx_graph, node_weight_label=node_weight_label, edge_weight_label=edge_weight_label, )
def test_networkx_scipy_graph_from_edgemap(default_plugin_resolver): dpr = default_plugin_resolver g = nx.DiGraph() g.add_weighted_edges_from([(2, 2, 1), (2, 7, 2), (7, 7, 0), (7, 0, 3), (0, 7, 3)]) x = NetworkXGraph(g) # Convert networkx -> scipy adjacency # 0 2 7 # 0 [ 3] # 2 [ 1 2] # 7 [3 0] m = ss.coo_matrix( ([3, 1, 2, 3, 0], ([0, 1, 1, 2, 2], [2, 1, 2, 0, 2])), dtype=np.int64 ) intermediate = ScipyGraph(m, [0, 2, 7]) y = dpr.translate(x, ScipyGraph) dpr.assert_equal(y, intermediate)
def test_graph_edgeset_oneway_directed_symmetric(default_plugin_resolver): rt = RoundTripper(default_plugin_resolver) g = nx.DiGraph() g.add_nodes_from([1, 3, 5, 7, 8, 9, 10, 11, 15]) g.add_edges_from( [(1, 3), (3, 1), (3, 5), (5, 3), (3, 9), (9, 3), (5, 5), (11, 10), (10, 11)] ) graph = NetworkXGraph(g) df = pd.DataFrame( { "source": [1, 3, 3, 5, 3, 9, 5, 11, 10], "target": [3, 1, 5, 3, 9, 3, 5, 10, 11], } ) edgeset = PandasEdgeSet(df, is_directed=True) rt.verify_one_way(graph, edgeset)
def test_weighted_directed_edge_list_cugraph_to_nextworkx(): """ 0 <--2-- 1 5 --10-> 6 | ^ | ^ ^ / | / | / | / 1 7 3 9 5 11 | / | / | / v v / v 3 --8--> 4 <--4-- 2 --6--> 7 """ dpr = mg.resolver sources = [0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6] destinations = [3, 0, 4, 4, 5, 7, 1, 4, 5, 6, 2] weights = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] gdf = cudf.DataFrame({ "source": sources, "destination": destinations, "weight": weights }) cugraph_graph = cugraph.DiGraph() cugraph_graph.from_cudf_edgelist(gdf, source="source", destination="destination", edge_attr="weight") x = dpr.wrappers.Graph.CuGraph(cugraph_graph) networkx_graph_data = [ (0, 3, 1), (1, 0, 2), (1, 4, 3), (2, 4, 4), (2, 5, 5), (2, 7, 6), (3, 1, 7), (3, 4, 8), (4, 5, 9), (5, 6, 10), (6, 2, 11), ] networkx_graph_unwrapped = nx.DiGraph() networkx_graph_unwrapped.add_weighted_edges_from(networkx_graph_data) intermediate = NetworkXGraph(networkx_graph_unwrapped) y = dpr.translate(x, NetworkXGraph) dpr.assert_equal(y, intermediate) assert len(dpr.plan.translate(x, NetworkXGraph)) == 1
def test_unweighted_directed_edge_list_cugraph_to_nextworkx(): """ 0 < - 1 5 - > 6 ^ ^ ^ | / | / | / v v / v 3 - > 4 < - 2 - > 7 """ dpr = mg.resolver sources = [0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6] destinations = [3, 0, 4, 4, 5, 7, 1, 4, 5, 6, 2] gdf = cudf.DataFrame({"source": sources, "dst": destinations}) cugraph_graph_unwrapped = cugraph.DiGraph() cugraph_graph_unwrapped.from_cudf_edgelist(gdf, source="source", destination="dst") x = dpr.wrappers.Graph.CuGraph(cugraph_graph_unwrapped) networkx_graph_data = [ (0, 3), (1, 0), (1, 4), (2, 4), (2, 5), (2, 7), (3, 1), (3, 4), (4, 5), (5, 6), (6, 2), ] networkx_graph_unwrapped = nx.DiGraph() networkx_graph_unwrapped.add_edges_from(networkx_graph_data) intermediate = NetworkXGraph(networkx_graph_unwrapped) y = dpr.translate(x, NetworkXGraph) dpr.assert_equal(y, intermediate) assert len(dpr.plan.translate(x, NetworkXGraph)) == 1
def test_networkx(): # 0 -> 0 (weight=1) # 0 -> 1 (weight=2) # 1 -> 1 (weight=0) # 1 -> 2 (weight=3) # 2 -> 1 (weight=3) aprops = { "is_directed": True, "node_type": "set", "edge_type": "map", "edge_dtype": "int", } g_int = nx.DiGraph() g_int.add_weighted_edges_from([(0, 0, 1), (0, 1, 2), (1, 1, 0), (1, 2, 3), (2, 1, 3)]) g_float = nx.DiGraph() g_float.add_weighted_edges_from([(0, 0, 1.0), (0, 1, 2.0), (1, 1, 0.0), (1, 2, 3.0), (2, 1, 3.0)]) NetworkXGraph.Type.assert_equal(NetworkXGraph(g_int), NetworkXGraph(g_int.copy()), aprops, aprops, {}, {}) g_close = g_float.copy() g_close.edges[(0, 0)]["weight"] = 1.0000000000001 NetworkXGraph.Type.assert_equal( NetworkXGraph(g_close), NetworkXGraph(g_float), { **aprops, "edge_dtype": "float" }, { **aprops, "edge_dtype": "float" }, {}, {}, ) g_diff1 = nx.DiGraph() g_diff1.add_weighted_edges_from([(0, 0, 1), (0, 1, 2), (1, 1, 0), (1, 2, 333), (2, 1, 3)]) with pytest.raises(AssertionError): NetworkXGraph.Type.assert_equal(NetworkXGraph(g_int), NetworkXGraph(g_diff1), aprops, aprops, {}, {}) g_diff2 = nx.DiGraph() g_diff2.add_weighted_edges_from([(0, 0, 1), (0, 1, 2), (1, 1, 0), (1, 2, 3), (2, 0, 3)]) with pytest.raises(AssertionError): NetworkXGraph.Type.assert_equal(NetworkXGraph(g_int), NetworkXGraph(g_diff2), aprops, aprops, {}, {}) g_extra = nx.DiGraph() g_extra.add_weighted_edges_from([ (0, 0, 1), (0, 1, 2), (1, 1, 0), (1, 2, 3), (2, 1, 3), (2, 0, 2), ]) with pytest.raises(AssertionError): NetworkXGraph.Type.assert_equal(NetworkXGraph(g_int), NetworkXGraph(g_extra), aprops, aprops, {}, {}) # Undirected vs Directed g_undir = nx.Graph() g_undir.add_weighted_edges_from([(0, 0, 1), (0, 1, 2), (1, 1, 0), (1, 2, 3)]) g_dir = nx.DiGraph() g_dir.add_weighted_edges_from([(0, 0, 1), (0, 1, 2), (1, 1, 0), (1, 2, 3)]) with pytest.raises(AssertionError): NetworkXGraph.Type.assert_equal( NetworkXGraph(g_undir), NetworkXGraph(g_dir), { **aprops, "is_directed": False }, aprops, {}, {}, ) NetworkXGraph.Type.assert_equal( NetworkXGraph(g_undir), NetworkXGraph(g_undir), { **aprops, "is_directed": False }, { **aprops, "is_directed": False }, {}, {}, ) # Different weight_label g_wgt = nx.DiGraph() g_wgt.add_weighted_edges_from( [(0, 0, 1), (0, 1, 2), (1, 1, 0), (1, 2, 3), (2, 1, 3)], weight="WGT", ) NetworkXGraph.Type.assert_equal( NetworkXGraph(g_int, edge_weight_label="weight"), NetworkXGraph(g_wgt, edge_weight_label="WGT"), aprops, aprops, {}, {}, ) # Exercise NetworkXGraph with pytest.raises(TypeError, match="unable to determine dtype"): g = nx.Graph() g.add_weighted_edges_from([(0, 2, "a"), (1, 0, "b"), (1, 2, "c")]) gr = NetworkXGraph(g) NetworkXGraph.Type.compute_abstract_properties(gr, {"edge_dtype"})