| choice = np.random.choice(list(relabeled_graph.nodes())) | choice = np.random.choice(list(relabeled_graph.nodes())) | ||||
| remaining_graph = relabeled_graph.subgraph(filter(lambda x: x != choice, list(relabeled_graph.nodes()))) | remaining_graph = relabeled_graph.subgraph(filter(lambda x: x != choice, list(relabeled_graph.nodes()))) | ||||
| remaining_graph_adj = nx.to_numpy_matrix(remaining_graph) | remaining_graph_adj = nx.to_numpy_matrix(remaining_graph) | ||||
| graph_length = len(remaining_graph) | |||||
| remaining_graph_adj = np.pad(remaining_graph_adj, [(0, max_size - graph_length), (0, max_size - graph_length)]) | |||||
| removed_node = nx.to_numpy_matrix(relabeled_graph)[choice] | removed_node = nx.to_numpy_matrix(relabeled_graph)[choice] | ||||
| removed_node_row = np.asarray(removed_node)[0] | removed_node_row = np.asarray(removed_node)[0] | ||||
| removed_node_row = np.pad(removed_node_row, [(0, max_size - len(removed_node_row))]) | |||||
| return remaining_graph_adj, feature_matrix(remaining_graph), removed_node_row | return remaining_graph_adj, feature_matrix(remaining_graph), removed_node_row | ||||
| """" | """" | ||||
| Layers: | Layers: | ||||
| Graph Convolution | Graph Convolution | ||||
| Graph Multihead Attention | Graph Multihead Attention | ||||
| Feed-Forward (as a MLP) | |||||
| """ | """ | ||||
| class GraphConv(nn.Module): | class GraphConv(nn.Module): | ||||
| def forward(self, query, key, value): | def forward(self, query, key, value): | ||||
| # print(q, k, v) | # print(q, k, v) | ||||
| bs = query.size(0) # size of the graph | |||||
| key = self.k_linear(key).view(bs, -1, self.heads, self.key_dim) | |||||
| query = self.q_linear(query).view(bs, -1, self.heads, self.key_dim) | |||||
| value = self.v_linear(value).view(bs, -1, self.heads, self.key_dim) | |||||
| bs = query.size(0) | |||||
| key = self.k_linear(key.float()).view(bs, -1, self.heads, self.key_dim) | |||||
| query = self.q_linear(query.float()).view(bs, -1, self.heads, self.key_dim) | |||||
| value = self.v_linear(value.float()).view(bs, -1, self.heads, self.key_dim) | |||||
| key = key.transpose(1,2) | key = key.transpose(1,2) | ||||
| query = query.transpose(1,2) | query = query.transpose(1,2) | ||||
| output = output.view(bs, self.model_dim) | output = output.view(bs, self.model_dim) | ||||
| return output | return output | ||||
| class FeedForward(nn.Module): | |||||
| def __init__(self, input_size, hidden_size): | |||||
| super().__init__() | |||||
| self.input_size = input_size | |||||
| self.hidden_size = hidden_size | |||||
| self.fully_connected1 = nn.Linear(self.input_size, self.hidden_size).cuda() | |||||
| self.relu = nn.ReLU() | |||||
| self.fully_connected2 = nn.Linear(self.hidden_size, 1).cuda() | |||||
| self.sigmoid = nn.Sigmoid() | |||||
| def forward(self, x): | |||||
| hidden = self.fully_connected1(x.float()) | |||||
| relu = self.relu(hidden) | |||||
| output = self.fully_connected2(relu) | |||||
| output = self.sigmoid(output) | |||||
| return output |