import dgl import torch as th def load_reddit(): from dgl.data import RedditDataset # load reddit data data = RedditDataset(self_loop=True) train_mask = data.train_mask val_mask = data.val_mask features = th.Tensor(data.features) labels = th.LongTensor(data.labels) # Construct graph g = data.graph g.ndata['features'] = features g.ndata['labels'] = labels g.ndata['train_mask'] = th.BoolTensor(data.train_mask) g.ndata['val_mask'] = th.BoolTensor(data.val_mask) g.ndata['test_mask'] = th.BoolTensor(data.test_mask) return g, data.num_labels def load_ogb(name): from ogb.nodeproppred import DglNodePropPredDataset print('load', name) data = DglNodePropPredDataset(name=name) print('finish loading', name) splitted_idx = data.get_idx_split() graph, labels = data[0] labels = labels[:, 0] graph.ndata['features'] = graph.ndata['feat'] graph.ndata['labels'] = labels in_feats = graph.ndata['features'].shape[1] num_labels = len(th.unique(labels[th.logical_not(th.isnan(labels))])) # Find the node IDs in the training, validation, and test set. train_nid, val_nid, test_nid = splitted_idx['train'], splitted_idx['valid'], splitted_idx['test'] train_mask = th.zeros((graph.number_of_nodes(),), dtype=th.bool) train_mask[train_nid] = True val_mask = th.zeros((graph.number_of_nodes(),), dtype=th.bool) val_mask[val_nid] = True test_mask = th.zeros((graph.number_of_nodes(),), dtype=th.bool) test_mask[test_nid] = True graph.ndata['train_mask'] = train_mask graph.ndata['val_mask'] = val_mask graph.ndata['test_mask'] = test_mask print('finish constructing', name) return graph, num_labels def inductive_split(g): """Split the graph into training graph, validation graph, and test graph by training and validation masks. Suitable for inductive models.""" train_g = g.subgraph(g.ndata['train_mask']) val_g = g.subgraph(g.ndata['train_mask'] | g.ndata['val_mask']) test_g = g return train_g, val_g, test_g