test_model.py 6.04 KB
Newer Older
Mufei Li's avatar
Mufei Li committed
1
2
3
4
import pytest
import torch
from test_utils.graph_cases import get_cases

5
6
7
8
9
import dgl
from dglgo.model import *


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

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

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

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

34
35

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

    blocks = [g]
40
    node_feat = torch.randn(g.num_src_nodes(), data_info["in_size"])
Mufei Li's avatar
Mufei Li committed
41
42
43
44
45
46
47
48
49
    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)

50
51

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

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

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

66
67

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

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

76
77

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

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

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

92
93

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

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

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

111
112

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

    blocks = [g]
117
    node_feat = torch.randn(g.num_src_nodes(), data_info["in_size"])
Mufei Li's avatar
Mufei Li committed
118
119
120
121
122
    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)

123
124

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

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

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

139

Mufei Li's avatar
Mufei Li committed
140
def test_bilinear():
141
    data_info = {"in_size": 10, "out_size": 1}
Mufei Li's avatar
Mufei Li committed
142
143
    model = BilinearPredictor(data_info)
    num_pairs = 10
144
145
    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
146
147
    model(h_src, h_dst)

148

Mufei Li's avatar
Mufei Li committed
149
def test_ele():
150
    data_info = {"in_size": 10, "out_size": 1}
Mufei Li's avatar
Mufei Li committed
151
152
    model = ElementWiseProductPredictor(data_info)
    num_pairs = 10
153
154
    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
155
    model(h_src, h_dst)
156

157
158

@pytest.mark.parametrize("virtual_node", [True, False])
159
160
def test_ogbg_gin(virtual_node):
    # Test for ogbg-mol datasets
161
162
163
164
    data_info = {"name": "ogbg-molhiv", "out_size": 1}
    model = OGBGGIN(
        data_info, embed_size=10, num_layers=2, virtual_node=virtual_node
    )
165
166
167
168
169
170
171
172
173
174
175
176
177
    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 = {
178
179
180
181
        "name": "a_dataset",
        "out_size": 1,
        "node_feat_size": 15,
        "edge_feat_size": 5,
182
    }
183
184
185
186
187
    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"])
188
189
    model(g, nfeat, efeat)

190

191
192
def test_pna():
    # Test for ogbg-mol datasets
193
194
    data_info = {"name": "ogbg-molhiv", "delta": 1, "out_size": 1}
    model = PNA(data_info, embed_size=10, num_layers=2)
195
196
197
198
199
200
201
202
    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 = {
203
204
205
206
        "name": "a_dataset",
        "node_feat_size": 15,
        "delta": 1,
        "out_size": 1,
207
    }
208
209
    model = PNA(data_info, embed_size=10, num_layers=2)
    nfeat = torch.randn(num_nodes, data_info["node_feat_size"])
210
    model(g, nfeat)