(self, graph, return_dict=False)
| 33 | self.step = step |
| 34 | |
| 35 | def forward(self, graph, return_dict=False): |
| 36 | self.G = graph.to_networkx() |
| 37 | self.num_node = self.G.number_of_nodes() |
| 38 | A = np.asarray(nx.adjacency_matrix(self.G).todense(), dtype=float) |
| 39 | A = preprocessing.normalize(A, "l1") |
| 40 | |
| 41 | log_beta = np.log(1.0 / self.num_node) |
| 42 | A_list = [A] |
| 43 | T_list = [sum(A).tolist()] |
| 44 | temp = A |
| 45 | # calculate A^1, A^2, ... , A^step, respectively |
| 46 | for i in range(self.step - 1): |
| 47 | temp = temp.dot(A) |
| 48 | A_list.append(A) |
| 49 | T_list.append(sum(temp).tolist()) |
| 50 | |
| 51 | final_emb = np.zeros((self.num_node, 1)) |
| 52 | for k in range(self.step): |
| 53 | for j in range(A.shape[1]): |
| 54 | A_list[k][:, j] = np.log(A_list[k][:, j] / T_list[k][j] + 1e-20) - log_beta |
| 55 | for i in range(A.shape[0]): |
| 56 | A_list[k][i, j] = max(A_list[k][i, j], 0) |
| 57 | # concatenate all k-step representations |
| 58 | if k == 0: |
| 59 | dimension = self.dimension - int(self.dimension / self.step) * (self.step - 1) |
| 60 | final_emb = self._get_embedding(A_list[k], dimension) |
| 61 | else: |
| 62 | W = self._get_embedding(A_list[k], self.dimension / self.step) |
| 63 | final_emb = np.hstack((final_emb, W)) |
| 64 | |
| 65 | embeddings = final_emb |
| 66 | if return_dict: |
| 67 | features_matrix = dict() |
| 68 | for vid, node in enumerate(self.G.nodes()): |
| 69 | features_matrix[node] = embeddings[vid] |
| 70 | else: |
| 71 | features_matrix = np.zeros((graph.num_nodes, embeddings.shape[1])) |
| 72 | nx_nodes = self.G.nodes() |
| 73 | features_matrix[nx_nodes] = embeddings[np.arange(graph.num_nodes)] |
| 74 | return features_matrix |
| 75 | |
| 76 | def _get_embedding(self, matrix, dimension): |
| 77 | # get embedding from svd and process normalization for ut |
nothing calls this directly
no test coverage detected