test_model.py 6.04 KB
Newer Older
1
import dgl
Mufei Li's avatar
Mufei Li committed
2
3
import pytest
import torch
4
from pytests_utils.graph_cases import get_cases
5
6
7
8
from dglgo.model import *


@pytest.mark.parametrize("g", get_cases(["has_scalar_e_feature"]))
Mufei Li's avatar
Mufei Li committed
9
def test_gcn(g):
10
    data_info = {"num_nodes": g.num_nodes(), "out_size": 7}
Mufei Li's avatar
Mufei Li committed
11
    node_feat = None
12
    edge_feat = g.edata["scalar_w"]
Mufei Li's avatar
Mufei Li committed
13
14
15
16
17
18
19
20
21

    # 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)

22
23
    data_info["in_size"] = g.ndata["h"].shape[-1]
    node_feat = g.ndata["h"]
Mufei Li's avatar
Mufei Li committed
24
25
26
27
28
29
30
31
32

    # 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
    model = GCN(data_info, embed_size=-1, use_edge_weight=True)
    model(g, node_feat, edge_feat)

33
34

@pytest.mark.parametrize("g", get_cases(["block-bipartite"]))
Mufei Li's avatar
Mufei Li committed
35
def test_gcn_block(g):
36
    data_info = {"in_size": 10, "out_size": 7}
Mufei Li's avatar
Mufei Li committed
37
38

    blocks = [g]
39
    node_feat = torch.randn(g.num_src_nodes(), data_info["in_size"])
Mufei Li's avatar
Mufei Li committed
40
41
42
43
44
45
46
47
48
    edge_feat = torch.abs(torch.randn(g.num_edges()))
    # not use_edge_weight
    model = GCN(data_info, use_edge_weight=False)
    model.forward_block(blocks, node_feat)

    # use_edge_weight
    model = GCN(data_info, use_edge_weight=True)
    model.forward_block(blocks, node_feat, edge_feat)

49
50

@pytest.mark.parametrize("g", get_cases(["has_scalar_e_feature"]))
Mufei Li's avatar
Mufei Li committed
51
def test_gat(g):
52
    data_info = {"num_nodes": g.num_nodes(), "out_size": 7}
Mufei Li's avatar
Mufei Li committed
53
54
55
56
57
58
59
    node_feat = None

    # node embedding
    model = GAT(data_info, embed_size=10)
    model(g, node_feat)

    # node feat
60
61
    data_info["in_size"] = g.ndata["h"].shape[-1]
    node_feat = g.ndata["h"]
Mufei Li's avatar
Mufei Li committed
62
63
64
    model = GAT(data_info, embed_size=-1)
    model(g, node_feat)

65
66

@pytest.mark.parametrize("g", get_cases(["block-bipartite"]))
Mufei Li's avatar
Mufei Li committed
67
def test_gat_block(g):
68
    data_info = {"in_size": 10, "out_size": 7}
Mufei Li's avatar
Mufei Li committed
69
70

    blocks = [g]
71
    node_feat = torch.randn(g.num_src_nodes(), data_info["in_size"])
Mufei Li's avatar
Mufei Li committed
72
73
74
    model = GAT(data_info, num_layers=1, heads=[8])
    model.forward_block(blocks, node_feat)

75
76

@pytest.mark.parametrize("g", get_cases(["has_scalar_e_feature"]))
Mufei Li's avatar
Mufei Li committed
77
def test_gin(g):
78
    data_info = {"num_nodes": g.num_nodes(), "out_size": 7}
Mufei Li's avatar
Mufei Li committed
79
80
81
82
83
84
85
    node_feat = None

    # node embedding
    model = GIN(data_info, embed_size=10)
    model(g, node_feat)

    # node feat
86
87
    data_info["in_size"] = g.ndata["h"].shape[-1]
    node_feat = g.ndata["h"]
Mufei Li's avatar
Mufei Li committed
88
89
90
    model = GIN(data_info, embed_size=-1)
    model(g, node_feat)

91
92

@pytest.mark.parametrize("g", get_cases(["has_scalar_e_feature"]))
Mufei Li's avatar
Mufei Li committed
93
def test_sage(g):
94
    data_info = {"num_nodes": g.num_nodes(), "out_size": 7}
Mufei Li's avatar
Mufei Li committed
95
    node_feat = None
96
    edge_feat = g.edata["scalar_w"]
Mufei Li's avatar
Mufei Li committed
97
98
99
100
101
102
103

    # node embedding
    model = GraphSAGE(data_info, embed_size=10)
    model(g, node_feat)
    model(g, node_feat, edge_feat)

    # node feat
104
105
    data_info["in_size"] = g.ndata["h"].shape[-1]
    node_feat = g.ndata["h"]
Mufei Li's avatar
Mufei Li committed
106
107
108
109
    model = GraphSAGE(data_info, embed_size=-1)
    model(g, node_feat)
    model(g, node_feat, edge_feat)

110
111

@pytest.mark.parametrize("g", get_cases(["block-bipartite"]))
Mufei Li's avatar
Mufei Li committed
112
def test_sage_block(g):
113
    data_info = {"in_size": 10, "out_size": 7}
Mufei Li's avatar
Mufei Li committed
114
115

    blocks = [g]
116
    node_feat = torch.randn(g.num_src_nodes(), data_info["in_size"])
Mufei Li's avatar
Mufei Li committed
117
118
119
120
121
    edge_feat = torch.abs(torch.randn(g.num_edges()))
    model = GraphSAGE(data_info, embed_size=-1)
    model.forward_block(blocks, node_feat)
    model.forward_block(blocks, node_feat, edge_feat)

122
123

@pytest.mark.parametrize("g", get_cases(["has_scalar_e_feature"]))
Mufei Li's avatar
Mufei Li committed
124
def test_sgc(g):
125
    data_info = {"num_nodes": g.num_nodes(), "out_size": 7}
Mufei Li's avatar
Mufei Li committed
126
127
128
129
130
131
132
    node_feat = None

    # node embedding
    model = SGC(data_info, embed_size=10)
    model(g, node_feat)

    # node feat
133
134
    data_info["in_size"] = g.ndata["h"].shape[-1]
    node_feat = g.ndata["h"]
Mufei Li's avatar
Mufei Li committed
135
136
137
    model = SGC(data_info, embed_size=-1)
    model(g, node_feat)

138

Mufei Li's avatar
Mufei Li committed
139
def test_bilinear():
140
    data_info = {"in_size": 10, "out_size": 1}
Mufei Li's avatar
Mufei Li committed
141
142
    model = BilinearPredictor(data_info)
    num_pairs = 10
143
144
    h_src = torch.randn(num_pairs, data_info["in_size"])
    h_dst = torch.randn(num_pairs, data_info["in_size"])
Mufei Li's avatar
Mufei Li committed
145
146
    model(h_src, h_dst)

147

Mufei Li's avatar
Mufei Li committed
148
def test_ele():
149
    data_info = {"in_size": 10, "out_size": 1}
Mufei Li's avatar
Mufei Li committed
150
151
    model = ElementWiseProductPredictor(data_info)
    num_pairs = 10
152
153
    h_src = torch.randn(num_pairs, data_info["in_size"])
    h_dst = torch.randn(num_pairs, data_info["in_size"])
Mufei Li's avatar
Mufei Li committed
154
    model(h_src, h_dst)
155

156
157

@pytest.mark.parametrize("virtual_node", [True, False])
158
159
def test_ogbg_gin(virtual_node):
    # Test for ogbg-mol datasets
160
161
162
163
    data_info = {"name": "ogbg-molhiv", "out_size": 1}
    model = OGBGGIN(
        data_info, embed_size=10, num_layers=2, virtual_node=virtual_node
    )
164
165
166
167
168
169
170
171
172
173
174
175
176
    num_nodes = 5
    num_edges = 15
    g1 = dgl.rand_graph(num_nodes, num_edges)
    g2 = dgl.rand_graph(num_nodes, num_edges)
    g = dgl.batch([g1, g2])
    num_nodes = g.num_nodes()
    num_edges = g.num_edges()
    nfeat = torch.zeros(num_nodes, 9).long()
    efeat = torch.zeros(num_edges, 3).long()
    model(g, nfeat, efeat)

    # Test for non-ogbg-mol datasets
    data_info = {
177
178
179
180
        "name": "a_dataset",
        "out_size": 1,
        "node_feat_size": 15,
        "edge_feat_size": 5,
181
    }
182
183
184
185
186
    model = OGBGGIN(
        data_info, embed_size=10, num_layers=2, virtual_node=virtual_node
    )
    nfeat = torch.randn(num_nodes, data_info["node_feat_size"])
    efeat = torch.randn(num_edges, data_info["edge_feat_size"])
187
188
    model(g, nfeat, efeat)

189

190
191
def test_pna():
    # Test for ogbg-mol datasets
192
193
    data_info = {"name": "ogbg-molhiv", "delta": 1, "out_size": 1}
    model = PNA(data_info, embed_size=10, num_layers=2)
194
195
196
197
198
199
200
201
    num_nodes = 5
    num_edges = 15
    g = dgl.rand_graph(num_nodes, num_edges)
    nfeat = torch.zeros(num_nodes, 9).long()
    model(g, nfeat)

    # Test for non-ogbg-mol datasets
    data_info = {
202
203
204
205
        "name": "a_dataset",
        "node_feat_size": 15,
        "delta": 1,
        "out_size": 1,
206
    }
207
208
    model = PNA(data_info, embed_size=10, num_layers=2)
    nfeat = torch.randn(num_nodes, data_info["node_feat_size"])
209
    model(g, nfeat)