# test#4: basic h0 = F.ones((3, 5, 5)) h1 = conv(g, h0) assert len(g.ndata) == 0 assert len(g.edata) == 0 # test not override features g.ndata["h"] = 2 * F.ones((3, 1)) h1 = conv(g, h0) assert len(g.ndata) == 1 assert len(g.edata) == 0 assert "h" in g.ndata check_close(g.ndata['h'], 2 * F.ones((3, 1))) @parametrize_dtype @pytest.mark.parametrize('g', get_cases(['h**o', 'block-bipartite'], exclude=['zero-degree', 'dglgraph'])) @pytest.mark.parametrize('norm', ['none', 'both', 'right', 'left']) @pytest.mark.parametrize('weight', [True, False]) @pytest.mark.parametrize('bias', [False]) @pytest.mark.parametrize('out_dim', [1, 2]) def test_graph_conv2(idtype, g, norm, weight, bias, out_dim): g = g.astype(idtype).to(F.ctx()) conv = nn.GraphConv(5, out_dim, norm=norm, weight=weight, bias=bias) conv.initialize(ctx=F.ctx()) ext_w = F.randn((5, out_dim)).as_in_context(F.ctx()) nsrc = g.number_of_src_nodes() ndst = g.number_of_dst_nodes() h = F.randn((nsrc, 5)).as_in_context(F.ctx()) if weight: h_out = conv(g, h) else:
h0 = F.ones((3, 5, 5)) h1 = conv(g, h0) assert len(g.ndata) == 0 assert len(g.edata) == 0 # test not override features g.ndata["h"] = 2 * F.ones((3, 1)) h1 = conv(g, h0) assert len(g.ndata) == 1 assert len(g.edata) == 0 assert "h" in g.ndata check_close(g.ndata['h'], 2 * F.ones((3, 1))) @pytest.mark.parametrize('g', get_cases(['path', 'bipartite', 'small'], exclude=['zero-degree'])) @pytest.mark.parametrize('norm', ['none', 'both', 'right']) @pytest.mark.parametrize('weight', [True, False]) @pytest.mark.parametrize('bias', [False]) def test_graph_conv2(g, norm, weight, bias): conv = nn.GraphConv(5, 2, norm=norm, weight=weight, bias=bias) conv.initialize(ctx=F.ctx()) ext_w = F.randn((5, 2)).as_in_context(F.ctx()) nsrc = g.number_of_nodes() if isinstance( g, dgl.DGLGraph) else g.number_of_src_nodes() ndst = g.number_of_nodes() if isinstance( g, dgl.DGLGraph) else g.number_of_dst_nodes() h = F.randn((nsrc, 5)).as_in_context(F.ctx()) h_dst = F.randn((ndst, 2)).as_in_context(F.ctx()) if weight: h_out = conv(g, h)
h1 = conv(g, h0) assert len(g.ndata) == 0 assert len(g.edata) == 0 # test#4: basic h0 = F.ones((3, 5, 5)) h1 = conv(g, h0) assert len(g.ndata) == 0 assert len(g.edata) == 0 # test rest_parameters old_weight = deepcopy(conv.weight.data) conv.reset_parameters() new_weight = conv.weight.data assert not F.allclose(old_weight, new_weight) @pytest.mark.parametrize('g', get_cases(['path', 'bipartite', 'small'], exclude=['zero-degree'])) @pytest.mark.parametrize('norm', ['none', 'both', 'right']) @pytest.mark.parametrize('weight', [True, False]) @pytest.mark.parametrize('bias', [True, False]) def test_graph_conv2(g, norm, weight, bias): conv = nn.GraphConv(5, 2, norm=norm, weight=weight, bias=bias).to(F.ctx()) ext_w = F.randn((5, 2)).to(F.ctx()) nsrc = g.number_of_nodes() if isinstance(g, dgl.DGLGraph) else g.number_of_src_nodes() ndst = g.number_of_nodes() if isinstance(g, dgl.DGLGraph) else g.number_of_dst_nodes() h = F.randn((nsrc, 5)).to(F.ctx()) if weight: h = conv(g, h) else: h = conv(g, h, weight=ext_w) assert h.shape == (ndst, 2)
g = kg(x) check_knn(g, x, 0, 8) g = kg(x.view(2, 4, 3)) check_knn(g, x, 0, 4) check_knn(g, x, 4, 8) kg = dgl.nn.SegmentedKNNGraph(3) g = kg(x, [3, 5]) check_knn(g, x, 0, 3) check_knn(g, x, 3, 8) @parametrize_dtype @pytest.mark.parametrize('g', get_cases(['h**o'], exclude=['dglgraph'])) @pytest.mark.parametrize('weight', [True, False]) @pytest.mark.parametrize('relabel', [True, False]) def test_edge_coarsening(idtype, g, weight, relabel): num_nodes = g.num_nodes() g = dgl.to_bidirected(g) g = g.astype(idtype).to(F.ctx()) edge_weight = None if weight: edge_weight = F.abs(F.randn((g.num_edges(),))).to(F.ctx()) node_labels = neighbor_matching(g, edge_weight, relabel_idx=relabel) unique_ids, counts = th.unique(node_labels, return_counts=True) num_result_ids = unique_ids.size(0) # shape correct assert node_labels.shape == (g.num_nodes(),)
assert F.allclose(e, e1) print('forward passed') F.backward(F.reduce_sum(e1)) if msg != 'copy_rhs': assert F.allclose(F.grad(lhs_frame['x']), grad_lhs) if msg != 'copy_lhs': assert F.allclose(F.grad(rhs_frame['y']), grad_rhs) print('backward passed') lhs_frame.pop('x') rhs_frame.pop('y') if 'm' in g.edata: g.edata.pop('m') @pytest.mark.parametrize('g', get_cases(['clique'])) @pytest.mark.parametrize('norm_by', ['src', 'dst']) @pytest.mark.parametrize('shp', edge_softmax_shapes) @parametrize_dtype def test_edge_softmax(g, norm_by, shp, idtype): g = g.astype(idtype).to(F.ctx()) edata = F.tensor(np.random.rand(g.number_of_edges(), *shp)) e1 = F.attach_grad(F.clone(edata)) with F.record_grad(): score1 = edge_softmax(g, e1, norm_by=norm_by) F.backward(F.reduce_sum(score1)) grad_edata = F.grad(e1) with F.record_grad(): e2 = F.attach_grad(F.clone(edata))
import dgl import pytest import torch from dglgo.model import * from test_utils.graph_cases import get_cases @pytest.mark.parametrize('g', get_cases(['has_scalar_e_feature'])) def test_gcn(g): data_info = { 'num_nodes': g.num_nodes(), 'out_size': 7 } node_feat = None edge_feat = g.edata['scalar_w'] # node embedding + not use_edge_weight model = GCN(data_info, embed_size=10, use_edge_weight=False) model(g, node_feat) # node embedding + use_edge_weight model = GCN(data_info, embed_size=10, use_edge_weight=True) model(g, node_feat, edge_feat) data_info['in_size'] = g.ndata['h'].shape[-1] node_feat = g.ndata['h'] # node feat + not use_edge_weight model = GCN(data_info, embed_size=-1, use_edge_weight=False) model(g, node_feat) # node feat + use_edge_weight