|
- import ot
- import sys
- import pathlib
- sys.path.insert(0, "../")
-
- from pygraph.utils.graphfiles import loadDataset
- from pygraph.ged.costfunctions import ConstantCostFunction
- from pygraph.utils.utils import getSPLengths
- from tqdm import tqdm
- import numpy as np
- from scipy.optimize import linear_sum_assignment
- from pygraph.ged.GED import ged
- import scipy
-
- def pad(C, n):
- C_pad = np.zeros((n, n))
- C_pad[:C.shape[0], :C.shape[1]] = C
- return C_pad
-
- if (__name__ == "__main__"):
- ds_filename = "/home/bgauzere/work/Datasets/Acyclic/dataset_bps.ds"
- dataset, y = loadDataset(ds_filename)
- cf = ConstantCostFunction(1, 3, 1, 3)
- N = len(dataset)
-
- pairs = list()
-
- ged_distances = list() #np.zeros((N, N))
- gw_distances = list() #np.zeros((N, N))
- for i in tqdm(range(0, N)):
- for j in tqdm(range(i, N)):
- G1 = dataset[i]
- G2 = dataset[j]
- n = G1.number_of_nodes()
- m = G2.number_of_nodes()
- if(n == m):
- C1 = getSPLengths(G1)
- C2 = getSPLengths(G2)
-
- C1 /= C1.max()
- C2 /= C2.max()
-
- dim = max(n, m)
- if(n < m):
- C1 = pad(C1, dim)
- elif (m < n):
- C2 = pad(C2, dim)
-
- p = ot.unif(dim)
- q = ot.unif(dim)
-
- gw = ot.gromov_wasserstein(C1, C2, p, q,
- 'square_loss', epsilon=5e-3)
- row_ind, col_ind = linear_sum_assignment(-gw)
- rho = col_ind
- varrho = row_ind[np.argsort(col_ind)]
- pairs.append((i,j))
- gw_distances.append(ged(G1, G2, cf=cf, rho=rho, varrho=varrho)[0])
-
- ged_distances.append(ged(G1, G2, cf=cf)[0])
-
- print("Moyenne sur Riesen : {}".format(np.mean(ged_distances)))
- print("Moyenne sur GW : {} ".format(np.mean(gw_distances)))
-
- np.save("distances_riesen", ged_distances)
- np.save("distances_gw", gw_distances)
|