import torch import torch.nn.functional as F from torch_geometric.nn import GCNConv, GINConv, global_add_pool, SAGEConv import random class serverGIN(torch.nn.Module): def __init__(self, nlayer, nhid): super(serverGIN, self).__init__() self.graph_convs = torch.nn.ModuleList() self.nn1 = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nn1)) for l in range(nlayer - 1): self.nnk = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nnk)) class GIN(torch.nn.Module): def __init__(self, nfeat, nhid, nclass, nlayer, dropout): super(GIN, self).__init__() self.num_layers = nlayer self.dropout = dropout self.pre = torch.nn.Sequential(torch.nn.Linear(nfeat, nhid)) self.graph_convs = torch.nn.ModuleList() self.nn1 = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nn1)) for l in range(nlayer - 1): self.nnk = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nnk)) self.post = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU()) self.readout = torch.nn.Sequential(torch.nn.Linear(nhid, nclass)) def forward(self, data): x, edge_index, batch = data.x, data.edge_index, data.batch x = self.pre(x) for i in range(len(self.graph_convs)): x = self.graph_convs[i](x, edge_index) x = F.relu(x) x = F.dropout(x, self.dropout, training=self.training) x = global_add_pool(x, batch) x = self.post(x) x = F.dropout(x, self.dropout, training=self.training) x = self.readout(x) x = F.log_softmax(x, dim=1) return x def loss(self, pred, label): return F.nll_loss(pred, label) class serverGIN_dc(torch.nn.Module): def __init__(self,nfeat, n_se, nclass,nlayer, nhid,dropout): super(serverGIN_dc, self).__init__() self.pre = torch.nn.Sequential(torch.nn.Linear(nfeat, nhid)) self.embedding_s = torch.nn.Linear(n_se, nhid) self.Whp = torch.nn.Linear(nhid + nhid, nhid) self.dropout = dropout self.graph_convs = torch.nn.ModuleList() self.nn1 = torch.nn.Sequential(torch.nn.Linear(nhid + nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nn1)) self.graph_convs_s_gcn = torch.nn.ModuleList() self.graph_convs_s_gcn.append(GCNConv(nhid, nhid)) for l in range(nlayer - 1): self.nnk = torch.nn.Sequential(torch.nn.Linear(nhid + nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nnk)) self.graph_convs_s_gcn.append(GCNConv(nhid, nhid)) self.post = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU()) self.readout = torch.nn.Sequential(torch.nn.Linear(nhid, nclass)) def forward(self, data): x, edge_index, batch, s = data.x, data.edge_index, data.batch, data.stc_enc x = self.pre(x) s = self.embedding_s(s) for i in range(len(self.graph_convs)): x = torch.cat((x, s), -1) x = self.graph_convs[i](x, edge_index) x = F.relu(x) x = F.dropout(x, self.dropout, training=self.training) s = self.graph_convs_s_gcn[i](s, edge_index) s = torch.tanh(s) x = self.Whp(torch.cat((x, s), -1)) x = global_add_pool(x, batch) x = self.post(x) x = F.dropout(x, self.dropout, training=self.training) x = self.readout(x) x = F.log_softmax(x, dim=1) return x def loss(self, pred, label): return F.nll_loss(pred, label) class GIN_dc(torch.nn.Module): def __init__(self, nfeat, n_se, nhid, nclass, nlayer, dropout): super(GIN_dc, self).__init__() self.num_layers = nlayer self.dropout = dropout self.pre = torch.nn.Sequential(torch.nn.Linear(nfeat, nhid)) self.embedding_s = torch.nn.Linear(n_se, nhid) self.graph_convs = torch.nn.ModuleList() self.nn1 = torch.nn.Sequential(torch.nn.Linear(nhid + nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nn1)) self.graph_convs_s_gcn = torch.nn.ModuleList() self.graph_convs_s_gcn.append(GCNConv(nhid, nhid)) for l in range(nlayer - 1): self.nnk = torch.nn.Sequential(torch.nn.Linear(nhid + nhid, nhid), torch.nn.ReLU(), torch.nn.Linear(nhid, nhid)) self.graph_convs.append(GINConv(self.nnk)) self.graph_convs_s_gcn.append(GCNConv(nhid, nhid)) self.Whp = torch.nn.Linear(nhid + nhid, nhid) self.post = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU()) self.readout = torch.nn.Sequential(torch.nn.Linear(nhid, nclass)) def forward(self, data): x, edge_index, batch, s = data.x, data.edge_index, data.batch, data.stc_enc # print(data.x) x = self.pre(x) s = self.embedding_s(s) for i in range(len(self.graph_convs)): x = torch.cat((x, s), -1) x = self.graph_convs[i](x, edge_index) x = F.relu(x) x = F.dropout(x, self.dropout, training=self.training) s = self.graph_convs_s_gcn[i](s, edge_index) s = torch.tanh(s) x = self.Whp(torch.cat((x, s), -1)) x = global_add_pool(x, batch) x = self.post(x) x = F.dropout(x, self.dropout, training=self.training) x = self.readout(x) x = F.log_softmax(x, dim=1) return x def loss(self, pred, label): return F.nll_loss(pred, label) class serverGraphSage(torch.nn.Module): def __init__(self, nlayer, nhid): super(serverGraphSage, self).__init__() self.graph_convs = torch.nn.ModuleList() self.graph_convs.append(SAGEConv(nhid, nhid)) for l in range(nlayer - 1): self.graph_convs.append(SAGEConv(nhid, nhid)) class GraphSage(torch.nn.Module): def __init__(self, nfeat, nhid, nclass, nlayer, dropout): super(GraphSage, self).__init__() self.num_layers = nlayer self.dropout = dropout self.pre = torch.nn.Sequential(torch.nn.Linear(nfeat, nhid)) self.graph_convs = torch.nn.ModuleList() self.graph_convs.append(SAGEConv(nhid, nhid)) for l in range(nlayer - 1): self.graph_convs.append(SAGEConv(nhid, nhid)) self.post = torch.nn.Sequential(torch.nn.Linear(nhid, nhid), torch.nn.ReLU()) self.readout = torch.nn.Sequential(torch.nn.Linear(nhid, nclass)) def forward(self, data): x, edge_index, batch = data.x, data.edge_index, data.batch x = self.pre(x) for i in range(len(self.graph_convs)): x = self.graph_convs[i](x, edge_index) x = F.relu(x) x = F.dropout(x, self.dropout, training=self.training) x = global_add_pool(x, batch) x = self.post(x) x = F.dropout(x, self.dropout, training=self.training) x = self.readout(x) x = F.log_softmax(x, dim=1) return x def loss(self, pred, label): return F.nll_loss(pred, label)