|
|
@@ -14,11 +14,14 @@ Created on Tue Apr 14 15:16:34 2020 |
|
|
|
|
|
|
|
import numpy as np |
|
|
|
import networkx as nx |
|
|
|
import sys |
|
|
|
from collections import Counter |
|
|
|
# from functools import partial |
|
|
|
from itertools import combinations_with_replacement |
|
|
|
from gklearn.utils import SpecialLabel |
|
|
|
from gklearn.utils.parallel import parallel_gm, parallel_me |
|
|
|
from gklearn.kernels import GraphKernel |
|
|
|
from gklearn.utils.iters import get_iters |
|
|
|
|
|
|
|
|
|
|
|
class WeisfeilerLehman(GraphKernel): # @todo: sp, edge user kernel. |
|
|
@@ -268,7 +271,11 @@ class WeisfeilerLehman(GraphKernel): # @todo: sp, edge user kernel. |
|
|
|
all_num_of_each_label = [] # number of occurence of each label in each graph in this iteration |
|
|
|
|
|
|
|
# for each graph |
|
|
|
for G in Gn: |
|
|
|
if self.verbose >= 2: |
|
|
|
iterator = get_iters(Gn, desc='Setting all labels into a tuple') |
|
|
|
else: |
|
|
|
iterator = Gn |
|
|
|
for G in iterator: |
|
|
|
# set all labels into a tuple. |
|
|
|
for nd, attrs in G.nodes(data=True): # @todo: there may be a better way. |
|
|
|
G.nodes[nd]['label_tuple'] = tuple(attrs[name] for name in self._node_labels) |
|
|
@@ -288,6 +295,10 @@ class WeisfeilerLehman(GraphKernel): # @todo: sp, edge user kernel. |
|
|
|
all_num_of_each_label = [] # number of occurence of each label in G |
|
|
|
|
|
|
|
# @todo: parallel this part. |
|
|
|
# if self.verbose >= 2: |
|
|
|
# iterator = get_iters(enumerate(Gn), desc='Going through iteration ' + str(h), length=len(Gn)) |
|
|
|
# else: |
|
|
|
# iterator = enumerate(Gn) |
|
|
|
for idx, G in enumerate(Gn): |
|
|
|
|
|
|
|
all_multisets = [] |
|
|
@@ -341,11 +352,15 @@ class WeisfeilerLehman(GraphKernel): # @todo: sp, edge user kernel. |
|
|
|
# parallel_gm(do_partial, gram_matrix, Gn, init_worker=init_worker, |
|
|
|
# glbv=(all_num_of_each_label,), n_jobs=self.n_jobs, verbose=self.verbose) |
|
|
|
# elif self.parallel is None: |
|
|
|
for i in range(len(gram_matrix)): |
|
|
|
for j in range(i, len(gram_matrix)): |
|
|
|
gram_matrix[i][j] = self._compute_subtree_kernel(all_num_of_each_label[i], |
|
|
|
all_num_of_each_label[j], gram_matrix[i][j]) |
|
|
|
gram_matrix[j][i] = gram_matrix[i][j] |
|
|
|
itr = combinations_with_replacement(range(0, len(gram_matrix)), 2) |
|
|
|
len_itr = int(len(gram_matrix) * (len(gram_matrix) + 1) / 2) |
|
|
|
iterator = get_iters(itr, desc='Computing Gram matrix for this iteration', file=sys.stdout, length=len_itr, verbose=(self.verbose >= 2)) |
|
|
|
for i, j in iterator: |
|
|
|
# for i in iterator: |
|
|
|
# for j in range(i, len(gram_matrix)): |
|
|
|
gram_matrix[i][j] = self._compute_subtree_kernel(all_num_of_each_label[i], |
|
|
|
all_num_of_each_label[j], gram_matrix[i][j]) |
|
|
|
gram_matrix[j][i] = gram_matrix[i][j] |
|
|
|
|
|
|
|
|
|
|
|
def _compute_subtree_kernel(self, num_of_each_label1, num_of_each_label2, kernel): |
|
|
|