Skip to content

Commit 21b99f4

Browse files
committed
Update graph synthesizer.
1 parent d8e206c commit 21b99f4

File tree

4 files changed

+174
-23
lines changed

4 files changed

+174
-23
lines changed

gklearn/experiments/papers/PRL_2020/synthesized_graphs_N.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def xp_synthesied_graphs_dataset_size():
107107
# Run and save.
108108
import pickle
109109
import os
110-
save_dir = 'outputs/'
110+
save_dir = 'outputs/synthesized_graphs_N/'
111111
if not os.path.exists(save_dir):
112112
os.makedirs(save_dir)
113113

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
"""
4+
Created on Mon Sep 21 10:34:26 2020
5+
6+
@author: ljia
7+
"""
8+
from utils import Graph_Kernel_List, compute_graph_kernel
9+
10+
11+
def generate_graphs(num_nodes):
12+
from gklearn.utils.graph_synthesizer import GraphSynthesizer
13+
gsyzer = GraphSynthesizer()
14+
graphs = gsyzer.unified_graphs(num_graphs=100, num_nodes=num_nodes, num_edges=int(num_nodes*2), num_node_labels=0, num_edge_labels=0, seed=None, directed=False)
15+
return graphs
16+
17+
18+
def xp_synthesied_graphs_num_nodes():
19+
20+
# Run and save.
21+
import pickle
22+
import os
23+
save_dir = 'outputs/synthesized_graphs_num_nodes/'
24+
if not os.path.exists(save_dir):
25+
os.makedirs(save_dir)
26+
27+
run_times = {}
28+
29+
for kernel_name in Graph_Kernel_List:
30+
print()
31+
print('Kernel:', kernel_name)
32+
33+
run_times[kernel_name] = []
34+
for num_nodes in [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]:
35+
print()
36+
print('Number of nodes:', num_nodes)
37+
38+
# Generate graphs.
39+
graphs = generate_graphs(num_nodes)
40+
41+
# Compute Gram matrix.
42+
gram_matrix, run_time = compute_graph_kernel(graphs, kernel_name)
43+
run_times[kernel_name].append(run_time)
44+
45+
pickle.dump(run_times, open(save_dir + 'run_time.' + kernel_name + '.' + str(num_nodes) + '.pkl', 'wb'))
46+
47+
# Save all.
48+
pickle.dump(run_times, open(save_dir + 'run_times.pkl', 'wb'))
49+
50+
return
51+
52+
53+
if __name__ == '__main__':
54+
xp_synthesied_graphs_num_nodes()
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
"""
4+
Created on Tue Sep 22 11:33:28 2020
5+
6+
@author: ljia
7+
"""
8+
Graph_Kernel_List = ['PathUpToH', 'WLSubtree', 'SylvesterEquation', 'Marginalized', 'ShortestPath', 'Treelet', 'ConjugateGradient', 'FixedPoint', 'SpectralDecomposition', 'StructuralSP', 'CommonWalk']
9+
# Graph_Kernel_List = ['CommonWalk', 'Marginalized', 'SylvesterEquation', 'ConjugateGradient', 'FixedPoint', 'SpectralDecomposition', 'ShortestPath', 'StructuralSP', 'PathUpToH', 'Treelet', 'WLSubtree']
10+
11+
12+
def compute_graph_kernel(graphs, kernel_name):
13+
import multiprocessing
14+
15+
if kernel_name == 'CommonWalk':
16+
from gklearn.kernels.commonWalkKernel import commonwalkkernel
17+
estimator = commonwalkkernel
18+
params = {'compute_method': 'geo', 'weight': 0.1}
19+
20+
elif kernel_name == 'Marginalized':
21+
from gklearn.kernels.marginalizedKernel import marginalizedkernel
22+
estimator = marginalizedkernel
23+
params = {'p_quit': 0.5, 'n_iteration': 5, 'remove_totters': False}
24+
25+
elif kernel_name == 'SylvesterEquation':
26+
from gklearn.kernels.randomWalkKernel import randomwalkkernel
27+
estimator = randomwalkkernel
28+
params = {'compute_method': 'sylvester', 'weight': 0.1}
29+
30+
elif kernel_name == 'ConjugateGradient':
31+
from gklearn.kernels.randomWalkKernel import randomwalkkernel
32+
estimator = randomwalkkernel
33+
from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct
34+
import functools
35+
mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel)
36+
sub_kernel = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel}
37+
params = {'compute_method': 'conjugate', 'weight': 0.1, 'node_kernels': sub_kernel, 'edge_kernels': sub_kernel}
38+
39+
elif kernel_name == 'FixedPoint':
40+
from gklearn.kernels.randomWalkKernel import randomwalkkernel
41+
estimator = randomwalkkernel
42+
from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct
43+
import functools
44+
mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel)
45+
sub_kernel = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel}
46+
params = {'compute_method': 'fp', 'weight': 1e-3, 'node_kernels': sub_kernel, 'edge_kernels': sub_kernel}
47+
48+
elif kernel_name == 'SpectralDecomposition':
49+
from gklearn.kernels.randomWalkKernel import randomwalkkernel
50+
estimator = randomwalkkernel
51+
params = {'compute_method': 'spectral', 'sub_kernel': 'geo', 'weight': 0.1}
52+
53+
elif kernel_name == 'ShortestPath':
54+
from gklearn.kernels.spKernel import spkernel
55+
estimator = spkernel
56+
from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct
57+
import functools
58+
mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel)
59+
sub_kernel = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel}
60+
params = {'node_kernels': sub_kernel}
61+
62+
elif kernel_name == 'StructuralSP':
63+
from gklearn.kernels.structuralspKernel import structuralspkernel
64+
estimator = structuralspkernel
65+
from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct
66+
import functools
67+
mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel)
68+
sub_kernel = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel}
69+
params = {'node_kernels': sub_kernel, 'edge_kernels': sub_kernel}
70+
71+
elif kernel_name == 'PathUpToH':
72+
from gklearn.kernels.untilHPathKernel import untilhpathkernel
73+
estimator = untilhpathkernel
74+
params = {'depth': 5, 'k_func': 'MinMax', 'compute_method': 'trie'}
75+
76+
elif kernel_name == 'Treelet':
77+
from gklearn.kernels.treeletKernel import treeletkernel
78+
estimator = treeletkernel
79+
from gklearn.utils.kernels import polynomialkernel
80+
import functools
81+
sub_kernel = functools.partial(polynomialkernel, d=4, c=1e+8)
82+
params = {'sub_kernel': sub_kernel}
83+
84+
elif kernel_name == 'WLSubtree':
85+
from gklearn.kernels.weisfeilerLehmanKernel import weisfeilerlehmankernel
86+
estimator = weisfeilerlehmankernel
87+
params = {'base_kernel': 'subtree', 'height': 5}
88+
89+
params['n_jobs'] = multiprocessing.cpu_count()
90+
params['verbose'] = True
91+
results = estimator(graphs, **params)
92+
93+
return results[0], results[1]

gklearn/utils/graph_synthesizer.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,37 @@ def __init__(self):
1717
pass
1818

1919

20-
def unified_graphs(self, num_graphs=1000, num_nodes=100, num_edges=196, num_node_labels=0, num_edge_labels=0, seed=None, directed=False):
20+
def random_graph(self, num_nodes, num_edges, num_node_labels=0, num_edge_labels=0, seed=None, directed=False, max_num_edges=None, all_edges=None):
21+
g = nx.Graph()
22+
if num_node_labels > 0:
23+
for i in range(0, num_nodes):
24+
node_labels = np.random.randint(0, high=num_node_labels, size=num_nodes)
25+
g.add_node(str(i), node_label=node_labels[i])
26+
else:
27+
for i in range(0, num_nodes):
28+
g.add_node(str(i))
29+
30+
if num_edge_labels > 0:
31+
edge_labels = np.random.randint(0, high=num_edge_labels, size=num_edges)
32+
for i in random.sample(range(0, max_num_edges), num_edges):
33+
node1, node2 = all_edges[i]
34+
g.add_edge(node1, node2, edge_label=edge_labels[i])
35+
else:
36+
for i in random.sample(range(0, max_num_edges), num_edges):
37+
node1, node2 = all_edges[i]
38+
g.add_edge(node1, node2)
39+
40+
return g
41+
42+
43+
def unified_graphs(self, num_graphs=1000, num_nodes=20, num_edges=40, num_node_labels=0, num_edge_labels=0, seed=None, directed=False):
2144
max_num_edges = int((num_nodes - 1) * num_nodes / 2)
2245
if num_edges > max_num_edges:
2346
raise Exception('Too many edges.')
2447
all_edges = [(i, j) for i in range(0, num_nodes) for j in range(i + 1, num_nodes)] # @todo: optimize. No directed graphs.
2548

2649
graphs = []
27-
for idx in range(0, num_graphs):
28-
g = nx.Graph()
29-
if num_node_labels > 0:
30-
for i in range(0, num_nodes):
31-
node_labels = np.random.randint(0, high=num_node_labels, size=num_nodes)
32-
g.add_node(str(i), node_label=node_labels[i])
33-
else:
34-
for i in range(0, num_nodes):
35-
g.add_node(str(i))
36-
37-
if num_edge_labels > 0:
38-
edge_labels = np.random.randint(0, high=num_edge_labels, size=num_edges)
39-
for i in random.sample(range(0, max_num_edges), num_edges):
40-
node1, node2 = all_edges[i]
41-
g.add_edge(node1, node2, edge_label=edge_labels[i])
42-
else:
43-
for i in random.sample(range(0, max_num_edges), num_edges):
44-
node1, node2 = all_edges[i]
45-
g.add_edge(node1, node2)
46-
47-
graphs.append(g)
50+
for idx in range(0, num_graphs):
51+
graphs.append(self.random_graph(num_nodes, num_edges, num_node_labels=num_node_labels, num_edge_labels=num_edge_labels, seed=seed, directed=directed, max_num_edges=max_num_edges, all_edges=all_edges))
4852

4953
return graphs

0 commit comments

Comments
 (0)