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.

costfunctions.py 4.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import numpy as np
  2. from scipy.optimize import linear_sum_assignment
  3. class BasicCostFunction:
  4. def __init__(self, cns, cni, ces, cei):
  5. self.cns_ = cns
  6. self.cni_ = self.cnd_ = cni
  7. self.ces_ = ces
  8. self.cei_ = self.ced_ = cei
  9. def cns(self, u, v, G1, G2):
  10. return (G1.node[u]['label'] != G2.node[v]['label'])*self.cns_
  11. def cnd(self, u, G1):
  12. return self.cnd_
  13. def cni(self, v, G2):
  14. return self.cni_
  15. def ces(self, e1, e2, G1, G2):
  16. """tester avec des attributs autres que symboliques en testant
  17. l'operateur __eq__"""
  18. return (e1[2]['label'] != e2[2]['label'])*self.ces_
  19. def ced(self, e1, G1):
  20. return self.ced_
  21. def cei(self, e2, G2):
  22. return self.cei_
  23. class RiesenCostFunction(BasicCostFunction):
  24. def __init__(self, cf):
  25. BasicCostFunction.__init__(self, cf.cns_, cf.cni_, cf.ces_, cf.cei_)
  26. def cns(self, u, v, G1, G2):
  27. """ u et v sont des id de noeuds """
  28. n = len(G1[u])
  29. m = len(G2[v])
  30. sub_C = np.ones([n+m, n+m]) * np.inf
  31. sub_C[n:, m:] = 0
  32. i = 0
  33. l_nbr_u = G1[u]
  34. l_nbr_v = G2[v]
  35. for nbr_u in l_nbr_u:
  36. j = 0
  37. e1 = [u, nbr_u, G1[u][nbr_u]]
  38. for nbr_v in G2[v]:
  39. e2 = [v, nbr_v, G2[v][nbr_v]]
  40. sub_C[i, j] = self.ces(e1, e2, G1, G2)
  41. j += 1
  42. i += 1
  43. i = 0
  44. for nbr_u in l_nbr_u:
  45. sub_C[i, m+i] = self.ced([u, nbr_u, G1[u][nbr_u]], G1)
  46. i += 1
  47. j = 0
  48. for nbr_v in l_nbr_v:
  49. sub_C[n+j, j] = self.cei([v, nbr_v, G2[v][nbr_v]], G2)
  50. j += 1
  51. row_ind, col_ind = linear_sum_assignment(sub_C)
  52. cost = np.sum(sub_C[row_ind, col_ind])
  53. return BasicCostFunction.cns(self, u, v, G1, G2) + cost
  54. def cnd(self, u, G1):
  55. cost = 0
  56. for nbr in G1[u]:
  57. cost += BasicCostFunction.ced(self,[u,nbr,G1[u][nbr]],G1)
  58. return BasicCostFunction.cnd(self,u,G1) + cost
  59. def cni(self, v, G2):
  60. cost = 0
  61. for nbr in G2[v]:
  62. cost += BasicCostFunction.cei(self, [v,nbr,G2[v][nbr]], G2)
  63. return BasicCostFunction.cni(self, v, G2) + cost
  64. class NeighboorhoodCostFunction(BasicCostFunction):
  65. def __init__(self, cf):
  66. BasicCostFunction.__init__(self, cf.cns_, cf.cni_, cf.ces_, cf.cei_)
  67. def cns(self, u, v, G1, G2):
  68. """ u et v sont des id de noeuds """
  69. n = len(G1[u])
  70. m = len(G2[v])
  71. sub_C = np.ones([n+m, n+m]) * np.inf
  72. sub_C[n:, m:] = 0
  73. i = 0
  74. l_nbr_u = G1[u]
  75. l_nbr_v = G2[v]
  76. for nbr_u in l_nbr_u:
  77. j = 0
  78. e1 = [u, nbr_u, G1[u][nbr_u]]
  79. for nbr_v in G2[v]:
  80. e2 = [v, nbr_v, G2[v][nbr_v]]
  81. sub_C[i, j] = self.ces(e1, e2, G1, G2)
  82. sub_C[i, j] += BasicCostFunction.cns(self,
  83. nbr_u, nbr_v, G1, G2)
  84. j += 1
  85. i += 1
  86. i = 0
  87. for nbr_u in l_nbr_u:
  88. sub_C[i, m+i] = self.ced([u, nbr_u, G1[u][nbr_u]], G1)
  89. sub_C[i, m+i] += BasicCostFunction.cnd(self, nbr_u, G1)
  90. i += 1
  91. j = 0
  92. for nbr_v in l_nbr_v:
  93. sub_C[n+j, j] = self.cei([v, nbr_v, G2[v][nbr_v]], G2)
  94. sub_C[n+j, j] += BasicCostFunction.cni(self, nbr_v, G2)
  95. j += 1
  96. row_ind, col_ind = linear_sum_assignment(sub_C)
  97. cost = np.sum(sub_C[row_ind, col_ind])
  98. return BasicCostFunction.cns(self, u, v, G1, G2) + cost
  99. def cnd(self, u, G1):
  100. cost = 0
  101. for nbr in G1[u]:
  102. cost += BasicCostFunction.ced(self, [u, nbr, G1[u][nbr]], G1)
  103. return BasicCostFunction.cnd(self, u, G1) + cost
  104. def cni(self, v, G2):
  105. cost = 0
  106. for nbr in G2[v]:
  107. cost += BasicCostFunction.cei(self, [v, nbr, G2[v][nbr]], G2)
  108. return BasicCostFunction.cni(self, v, G2) + cost

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