You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ged.py 3.1 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from distances import euclid_d
  2. from gklearn.ged.util import pairwise_ged, get_nb_edit_operations
  3. from gklearn.utils import get_iters
  4. import sys
  5. def compute_ged(Gi, Gj, edit_cost, method='BIPARTITE', **kwargs):
  6. """
  7. Compute GED between two graph according to edit_cost
  8. """
  9. ged_options = {'edit_cost': 'CONSTANT',
  10. 'method': method,
  11. 'edit_cost_constants': edit_cost}
  12. node_labels = kwargs.get('node_labels', [])
  13. edge_labels = kwargs.get('edge_labels', [])
  14. dis, pi_forward, pi_backward = pairwise_ged(Gi, Gj, ged_options, repeats=10)
  15. n_eo_tmp = get_nb_edit_operations(Gi, Gj, pi_forward, pi_backward, edit_cost='CONSTANT', node_labels=node_labels, edge_labels=edge_labels)
  16. return dis, n_eo_tmp
  17. def compute_ged_all_dataset(Gn, edit_cost, ed_method, **kwargs):
  18. N = len(Gn)
  19. G_pairs = []
  20. for i in range(N):
  21. for j in range(i, N):
  22. G_pairs.append([i, j])
  23. return compute_geds(G_pairs, Gn, edit_cost, ed_method, **kwargs)
  24. def compute_geds(G_pairs, Gn, edit_cost, ed_method, **kwargs):
  25. """
  26. Compute GED between all indexes in G_pairs given edit_cost
  27. :return: ged_vec : the list of computed distances, n_edit_operations : the list of edit operations
  28. """
  29. ged_vec = []
  30. n_edit_operations = []
  31. for k in get_iters(range(len(G_pairs)), desc='Computing GED', file=sys.stdout, length=len(G_pairs)):
  32. [i, j] = G_pairs[k]
  33. dis, n_eo_tmp = compute_ged(
  34. Gn[i], Gn[j], edit_cost = edit_cost, method=ed_method, **kwargs)
  35. ged_vec.append(dis)
  36. n_edit_operations.append(n_eo_tmp)
  37. return ged_vec, n_edit_operations
  38. def compute_D(G_app, edit_cost, G_test=None, ed_method='BIPARTITE', **kwargs):
  39. import numpy as np
  40. N = len(G_app)
  41. D_app = np.zeros((N, N))
  42. for i, G1 in get_iters(enumerate(G_app), desc='Computing D - app', file=sys.stdout, length=N):
  43. for j, G2 in enumerate(G_app[i+1:], i+1):
  44. D_app[i, j], _ = compute_ged(G1, G2, edit_cost, method=ed_method, **kwargs)
  45. D_app[j, i] = D_app[i, j]
  46. if (G_test is None):
  47. return D_app, edit_cost
  48. else:
  49. D_test = np.zeros((len(G_test), N))
  50. for i, G1 in get_iters(enumerate(G_test), desc='Computing D - test', file=sys.stdout, length=len(G_test)):
  51. for j, G2 in enumerate(G_app):
  52. D_test[i, j], _ = compute_ged(G1, G2, edit_cost, method=ed_method, **kwargs)
  53. return D_app, D_test, edit_cost
  54. def compute_D_random(G_app, G_test=None, ed_method='BIPARTITE', **kwargs):
  55. import numpy as np
  56. edit_costs = np.random.rand(6)
  57. return compute_D(G_app, edit_costs, G_test, ed_method=ed_method, **kwargs)
  58. def compute_D_expert(G_app, G_test=None, ed_method='BIPARTITE', **kwargs):
  59. edit_cost = [3, 3, 1, 3, 3, 1]
  60. return compute_D(G_app, edit_cost, G_test, ed_method=ed_method, **kwargs)
  61. def compute_D_fitted(G_app, y_app, G_test=None, y_distance=euclid_d,
  62. mode='reg', unlabeled=False, ed_method='BIPARTITE', **kwargs):
  63. from optim_costs import compute_optimal_costs
  64. costs_optim = compute_optimal_costs(
  65. G_app, y_app, y_distance=y_distance,
  66. mode=mode, unlabeled=unlabeled, ed_method=ed_method, **kwargs)
  67. return compute_D(G_app, costs_optim, G_test, ed_method=ed_method, **kwargs)

A Python package for graph kernels, graph edit distances and graph pre-image problem.