Example #1
0
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))
Example #2
0
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))
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #6
0
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)
Example #7
0
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))
Example #8
0
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,
        )
Example #10
0
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)
Example #11
0
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
Example #14
0
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"})