def test_split_edge_case(self): G, x, y, edge_x, edge_y, edge_index, graph_x, graph_y = \ simple_networkx_graph() dg = Graph(G) dg_node = dg.split() dg_num_nodes_reduced = dg.num_nodes - 3 self.assertEqual( dg_node[0].node_label_index.shape[0], 1 + int(dg_num_nodes_reduced * 0.8)) self.assertEqual( dg_node[1].node_label_index.shape[0], 1 + int(dg_num_nodes_reduced * 0.1)) self.assertEqual( dg_node[2].node_label_index.shape[0], dg.num_nodes - 2 - int(dg_num_nodes_reduced * 0.8) - int(dg_num_nodes_reduced * 0.1)) dg_edge = dg.split(task='edge') dg_num_edges_reduced = dg.num_edges - 3 edge_0 = 1 + int(dg_num_edges_reduced * 0.8) edge_1 = 1 + int(dg_num_edges_reduced * 0.1) edge_2 = dg.num_edges - edge_0 - edge_1 self.assertEqual(dg_edge[0].edge_label_index.shape[1], edge_0) self.assertEqual(dg_edge[1].edge_label_index.shape[1], edge_1) self.assertEqual(dg_edge[2].edge_label_index.shape[1], edge_2) dg_link = dg.split(task='link_pred') dg_num_edges_reduced = dg.num_edges - 3 edge_0 = 1 + int(dg_num_edges_reduced * 0.8) edge_1 = 1 + int(dg_num_edges_reduced * 0.1) edge_2 = dg.num_edges - edge_0 - edge_1 self.assertEqual(dg_link[0].edge_label_index.shape[1], edge_0) self.assertEqual(dg_link[1].edge_label_index.shape[1], edge_1) self.assertEqual(dg_link[2].edge_label_index.shape[1], edge_2)
def test_split_edge_case(self): G, x, y, edge_x, edge_y, edge_index, graph_x, graph_y = ( simple_networkx_graph()) Graph.add_node_attr(G, "node_label", y) Graph.add_edge_attr(G, "edge_label", edge_y) dg = Graph(G) dg_node = dg.split() dg_num_nodes = dg.num_nodes node_0 = int(dg_num_nodes * 0.8) node_1 = int(dg_num_nodes * 0.1) node_2 = dg_num_nodes - node_0 - node_1 self.assertEqual(dg_node[0].node_label_index.shape[0], node_0) self.assertEqual(dg_node[1].node_label_index.shape[0], node_1) self.assertEqual(dg_node[2].node_label_index.shape[0], node_2) dg_edge = dg.split(task="edge") dg_num_edges = dg.num_edges edge_0 = int(dg_num_edges * 0.8) edge_1 = int(dg_num_edges * 0.1) edge_2 = dg_num_edges - edge_0 - edge_1 self.assertEqual(dg_edge[0].edge_label_index.shape[1], edge_0) self.assertEqual(dg_edge[1].edge_label_index.shape[1], edge_1) self.assertEqual(dg_edge[2].edge_label_index.shape[1], edge_2) dg_link = dg.split(task="link_pred") edge_0 = int(dg_num_edges * 0.8) edge_1 = int(dg_num_edges * 0.1) edge_2 = dg.num_edges - edge_0 - edge_1 self.assertEqual(dg_link[0].edge_label_index.shape[1], edge_0) self.assertEqual(dg_link[1].edge_label_index.shape[1], edge_1) self.assertEqual(dg_link[2].edge_label_index.shape[1], edge_2)
def test_split_edge_case(self): G, x, y, edge_x, edge_y, edge_index, graph_x, graph_y = ( simple_networkx_graph() ) dg = Graph( node_label=y, edge_label=edge_y, edge_index=edge_index, directed=True ) dg_node = dg.split() dg_num_nodes = dg.num_nodes self.assertEqual( dg_node[0].node_label_index.shape[0], int(dg_num_nodes * 0.8), ) self.assertEqual( dg_node[1].node_label_index.shape[0], int(dg_num_nodes * 0.1), ) self.assertEqual( dg_node[2].node_label_index.shape[0], dg.num_nodes - int(dg_num_nodes * 0.8) - int(dg_num_nodes * 0.1) ) dg_edge = dg.split(task="edge") dg_num_edges = dg.num_edges edge_0 = int(dg_num_edges * 0.8) edge_1 = int(dg_num_edges * 0.1) edge_2 = dg.num_edges - edge_0 - edge_1 self.assertEqual( dg_edge[0].edge_label_index.shape[1], edge_0 ) self.assertEqual( dg_edge[1].edge_label_index.shape[1], edge_1 ) self.assertEqual( dg_edge[2].edge_label_index.shape[1], edge_2 ) dg_link = dg.split(task="link_pred") dg_num_edges = dg.num_edges edge_0 = int(dg_num_edges * 0.8) edge_1 = int(dg_num_edges * 0.1) edge_2 = dg.num_edges - edge_0 - edge_1 self.assertEqual(dg_link[0].edge_label_index.shape[1], edge_0) self.assertEqual(dg_link[1].edge_label_index.shape[1], edge_1) self.assertEqual(dg_link[2].edge_label_index.shape[1], edge_2)
def test_split(self): pyg_dataset = Planetoid("./cora", "Cora") x = pyg_dataset[0].x y = pyg_dataset[0].y edge_index = pyg_dataset[0].edge_index row, col = copy.deepcopy(edge_index) mask = row < col row, col = row[mask], col[mask] edge_index = torch.stack([row, col], dim=0) edge_index = torch.cat( [edge_index, torch.flip(edge_index, [0])], dim=1) dg = Graph(node_feature=x, node_label=y, edge_index=edge_index, directed=False) dg_node = dg.split() dg_num_nodes = dg.num_nodes node_0 = int(dg_num_nodes * 0.8) node_1 = int(dg_num_nodes * 0.1) node_2 = dg_num_nodes - node_0 - node_1 self.assertEqual(dg_node[0].node_label_index.shape[0], node_0) self.assertEqual(dg_node[1].node_label_index.shape[0], node_1) self.assertEqual(dg_node[2].node_label_index.shape[0], node_2) for split_ratio in [[0.1, 0.4, 0.5], [0.4, 0.3, 0.3], [0.7, 0.2, 0.1]]: dg_link_custom = (dg.split(task="link_pred", split_ratio=split_ratio)) dg_num_edges = dg.num_edges edge_0 = 2 * int(split_ratio[0] * dg_num_edges) edge_1 = 2 * int(split_ratio[1] * dg_num_edges) edge_2 = 2 * (dg_num_edges - int(split_ratio[0] * dg_num_edges) - int(split_ratio[1] * dg_num_edges)) self.assertEqual( dg_link_custom[0].edge_label_index.shape[1], edge_0, ) self.assertEqual( dg_link_custom[1].edge_label_index.shape[1], edge_1, ) self.assertEqual( dg_link_custom[2].edge_label_index.shape[1], edge_2, )
def test_split(self): pyg_dataset = Planetoid("./cora", "Cora") x = pyg_dataset[0].x y = pyg_dataset[0].y edge_index = pyg_dataset[0].edge_index row, col = copy.deepcopy(edge_index) mask = row < col row, col = row[mask], col[mask] edge_index = torch.stack([row, col], dim=0) edge_index = torch.cat( [edge_index, torch.flip(edge_index, [0])], dim=1 ) dg = Graph( node_feature=x, node_label=y, edge_index=edge_index, directed=False ) dg_node = dg.split() dg_num_nodes_reduced = dg.num_nodes - 3 self.assertEqual( dg_node[0].node_label_index.shape[0], 1 + int(dg_num_nodes_reduced * 0.8), ) self.assertEqual( dg_node[1].node_label_index.shape[0], 1 + int(dg_num_nodes_reduced * 0.1), ) self.assertEqual( dg_node[2].node_label_index.shape[0], dg.num_nodes - 2 - int(dg_num_nodes_reduced * 0.8) - int(dg_num_nodes_reduced * 0.1), ) dg_link = dg.split(task="link_pred") dg_num_edges_reduced = dg.num_edges - 3 edge_0 = 2 * (1 + int(dg_num_edges_reduced * 0.8)) edge_1 = 2 * (1 + int(dg_num_edges_reduced * 0.1)) edge_2 = dg.num_edges * 2 - edge_0 - edge_1 self.assertEqual(dg_link[0].edge_label_index.shape[1], edge_0) self.assertEqual(dg_link[1].edge_label_index.shape[1], edge_1) self.assertEqual(dg_link[2].edge_label_index.shape[1], edge_2) for message_ratio in [0.1, 0.2, 0.4, 0.8]: dg_link_resample = ( dg_link[0].clone().resample_disjoint( message_ratio=message_ratio, ) ) positive_edge_num = ( int(0.5 * dg_link[0].clone().edge_label_index.shape[1]) ) self.assertEqual( dg_link_resample.edge_label_index.shape[1], 2 * ( positive_edge_num - 1 - int(message_ratio * (positive_edge_num - 2)) ) ) for split_ratio in [[0.1, 0.4, 0.5], [0.4, 0.3, 0.3], [0.7, 0.2, 0.1]]: dg_link_custom = ( dg.split(task="link_pred", split_ratio=split_ratio) ) dg_num_edges_reduced = dg.num_edges - 3 edge_0 = 2 * (1 + int(dg_num_edges_reduced * split_ratio[0])) self.assertEqual( dg_link_custom[0].edge_label_index.shape[1], edge_0, ) edge_1 = ( 2 * ( 1 + int(split_ratio[0] * dg_num_edges_reduced) + 1 + int(split_ratio[1] * dg_num_edges_reduced) ) - edge_0 ) self.assertEqual( dg_link_custom[1].edge_label_index.shape[1], edge_1, ) edge_2 = dg.num_edges * 2 - edge_0 - edge_1 self.assertEqual( dg_link_custom[2].edge_label_index.shape[1], edge_2, )