IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
2.0KB

  1. #
  2. # Copyright (C) Stanislaw Adaszewski, 2020
  3. # License: GPLv3
  4. #
  5. import numpy as np
  6. import scipy.sparse as sp
  7. def sparse_to_tuple(sparse_mx):
  8. if not sp.isspmatrix_coo(sparse_mx):
  9. sparse_mx = sparse_mx.tocoo()
  10. coords = np.vstack((sparse_mx.row, sparse_mx.col)).transpose()
  11. values = sparse_mx.data
  12. shape = sparse_mx.shape
  13. return coords, values, shape
  14. def normalize_adjacency_matrix(adj):
  15. adj = sp.coo_matrix(adj)
  16. if adj.shape[0] == adj.shape[1]:
  17. adj_ = adj + sp.eye(adj.shape[0])
  18. rowsum = np.array(adj_.sum(1))
  19. degree_mat_inv_sqrt = np.power(rowsum, -0.5).flatten()
  20. degree_mat_inv_sqrt = sp.diags(degree_mat_inv_sqrt)
  21. adj_normalized = adj_.dot(degree_mat_inv_sqrt).transpose().dot(degree_mat_inv_sqrt)
  22. else:
  23. rowsum = np.array(adj.sum(1))
  24. colsum = np.array(adj.sum(0))
  25. rowdegree_mat_inv = sp.diags(np.nan_to_num(np.power(rowsum, -0.5)).flatten())
  26. coldegree_mat_inv = sp.diags(np.nan_to_num(np.power(colsum, -0.5)).flatten())
  27. adj_normalized = rowdegree_mat_inv.dot(adj).dot(coldegree_mat_inv).tocoo()
  28. return sparse_to_tuple(adj_normalized)
  29. def norm_adj_mat_one_node_type(adj):
  30. adj = sp.coo_matrix(adj)
  31. assert adj.shape[0] == adj.shape[1]
  32. adj_ = adj + sp.eye(adj.shape[0])
  33. rowsum = np.array(adj_.sum(1))
  34. degree_mat_inv_sqrt = np.power(rowsum, -0.5).flatten()
  35. degree_mat_inv_sqrt = sp.diags(degree_mat_inv_sqrt)
  36. adj_normalized = adj_.dot(degree_mat_inv_sqrt).transpose().dot(degree_mat_inv_sqrt)
  37. return adj_normalized
  38. def norm_adj_mat_two_node_types(adj):
  39. adj = sp.coo_matrix(adj)
  40. rowsum = np.array(adj.sum(1))
  41. colsum = np.array(adj.sum(0))
  42. rowdegree_mat_inv = sp.diags(np.nan_to_num(np.power(rowsum, -0.5)).flatten())
  43. coldegree_mat_inv = sp.diags(np.nan_to_num(np.power(colsum, -0.5)).flatten())
  44. adj_normalized = rowdegree_mat_inv.dot(adj).dot(coldegree_mat_inv).tocoo()
  45. return adj_normalized