# # Copyright (C) Stanislaw Adaszewski, 2020 # License: GPLv3 # import numpy as np import scipy.sparse as sp def norm_adj_mat_one_node_type(adj): adj = sp.coo_matrix(adj) assert adj.shape[0] == adj.shape[1] adj_ = adj + sp.eye(adj.shape[0]) rowsum = np.array(adj_.sum(1)) degree_mat_inv_sqrt = np.power(rowsum, -0.5).flatten() degree_mat_inv_sqrt = sp.diags(degree_mat_inv_sqrt) adj_normalized = adj_.dot(degree_mat_inv_sqrt).transpose().dot(degree_mat_inv_sqrt) return adj_normalized def norm_adj_mat_two_node_types(adj): adj = sp.coo_matrix(adj) rowsum = np.array(adj.sum(1)) colsum = np.array(adj.sum(0)) rowdegree_mat_inv = sp.diags(np.nan_to_num(np.power(rowsum, -0.5)).flatten()) coldegree_mat_inv = sp.diags(np.nan_to_num(np.power(colsum, -0.5)).flatten()) adj_normalized = rowdegree_mat_inv.dot(adj).dot(coldegree_mat_inv).tocoo() return adj_normalized