-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGraphletKernel.py
More file actions
135 lines (124 loc) · 4.7 KB
/
GraphletKernel.py
File metadata and controls
135 lines (124 loc) · 4.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import networkx as nx
import itertools
import SootUtilities as sutil
import sys
import os
def getSubgraphs(g,size):
nodes=g.nodes()
labels=sutil.get_node_labels(g)
combs=itertools.combinations(nodes,size)
connectedSubgs=[]
subgs={}
for i in combs:
subg=g.subgraph(i)
if nx.is_weakly_connected(subg):
connectedSubgs.append(subg)
print len(connectedSubgs)
for i in connectedSubgs:
#print i
cnt=1
for j in connectedSubgs:
#print j
if i!=j:
DiGM = nx.isomorphism.DiGraphMatcher(i,j)
if DiGM.is_isomorphic():
nodeMap=DiGM.mapping
if nodeLabelExactMatch(nodeMap,labels)==True:
"""
print 'iso found'
print i.nodes()
print j.nodes()
print nodeMap
"""
cnt+=1
connectedSubgs.remove(j)
subgs[i]=float(cnt)/float(len(connectedSubgs))
#if i in connectedSubgs:
# connectedSubgs.remove(i)
return subgs
def nodeLabelExactMatch(nodeMap,labels):
check=True
for i in nodeMap:
if labels[i]!=labels[nodeMap[i]]:
check=False
return check
#calculates the k_graph(G,G') for two graphs
def calcGraphletKernelVal(g1Graphlets,g1NodeLabels,g2Graphlets,g2NodeLabels):
k_graph=0
for i in g1Graphlets:
for j in g2Graphlets:
#print i.nodes()
#print j.nodes()
k_graph+=calcSubgraphKernelVal(i,g1NodeLabels,j,g2NodeLabels)*g1Graphlets[i]*g2Graphlets[j]
return k_graph
#calculate the kernel value k_subgraph(subg1,subg2) for two subgraphs
def calcSubgraphKernelVal(subg1,subg1NodeLabels,subg2,subg2NodeLabels):
DiGM = nx.isomorphism.DiGraphMatcher(subg1,subg2)
if DiGM.is_isomorphic():
#print 'isomorphic'
nodeMap=DiGM.mapping
k_subgraph=1
for n in nodeMap:
#k_subgraph=k_subgraph*getNodeKernelVal(subg1NodeLabels[n],subg2NodeLabels[nodeMap[n]])
k_subgraph=k_subgraph*getNodeKernelValExactEqual(subg1NodeLabels[n],subg2NodeLabels[nodeMap[n]])
else:
k_subgraph=0
return k_subgraph
def getNodeKernelValExactEqual(l1,l2):
if(l1==l2):
return 1
else:
return 0
def getNodeKernelVal(l1,l2):
if(l1==l2):
return 1
elif(sutil.get_group(l1)==sutil.get_group(l2)):
return 0.5
else:
return 0.001
def create_graphlet_kernel_matrix(class_file_name,km_file_name,graphletSize):
class_file=open(class_file_name,'r')
dot_file_names=[]
for line in class_file:
fields=line.strip('\n').split(':')
dot_file_names.append(fields[0])
class_file.close()
dotFileLoc='/s/bach/h/proj/saxs/upuleegk/Soot/openSourceMethods/AllUsedMethods/AllUsedDotFiles'
computedValsDict={}
f=open(km_file_name,'w')
for i in range(0,len(dot_file_names)):
temp_str=str(dot_file_names[i])
for j in range(0,len(dot_file_names)):
print dot_file_names[i]
sys.stdout.flush()
print dot_file_names[j]
sys.stdout.flush()
if computedValsDict.has_key(str(i)+'.'+str(j)):
print 'Found val'
sys.stdout.flush()
val=computedValsDict[str(i)+'.'+str(j)]
elif computedValsDict.has_key(str(j)+'.'+str(i)):
print 'Found val'
sys.stdout.flush()
val=computedValsDict[str(j)+'.'+str(i)]
else:
print 'Computing val...'
sys.stdout.flush()
#g1=nx.read_dot(dotFileLoc+'/'+dot_file_names[i]+'.dot')
dd1,g1=sutil.get_dd_cd_subgraphs(dotFileLoc+'/'+dot_file_names[i]+'.dot')
#g1=sutil.removeMultiGraphEdgesFromDD(dd1)
dd2,g2=sutil.get_dd_cd_subgraphs(dotFileLoc+'/'+dot_file_names[j]+'.dot')
#g2=sutil.removeMultiGraphEdgesFromDD(dd2)
g1NodeLabels=sutil.get_node_labels(g1)
g1Graphlets=getSubgraphs(g1,graphletSize)
g2NodeLabels=sutil.get_node_labels(g2)
g2Graphlets=getSubgraphs(g2,graphletSize)
#a=create_modified_DPG(g1,g2)
val=calcGraphletKernelVal(g1Graphlets,g1NodeLabels,g2Graphlets,g2NodeLabels)
computedValsDict[str(i)+'.'+str(j)]=val
temp_str+=','+str(val)
temp_str+='\n'
f.write(temp_str)
f.close()
os.system("mailx -s \"File writing finished\" < /dev/null \"upuleegk@gmail.com\"")
create_graphlet_kernel_matrix(sys.argv[1],sys.argv[2],int(sys.argv[3]))