├── BCB.zip ├── README.md ├── createclone.py ├── createclone_bcb.py ├── createclone_java.py ├── createclone_old.py ├── edge_index.py ├── ggnn_bcb.py ├── ggnn_gcj.py ├── googlejam4_src.zip ├── javadata.zip ├── models.py ├── models_old.py ├── run.py ├── run_bcb.py ├── run_bcbnew.py ├── run_bcbnoid.py ├── run_java.py ├── runbcbr.py ├── toydata.py ├── validsmall.txt.0 └── visualize_bcb.py /BCB.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobwwh/graphmatch_clone/0080fdb0c610865249a841381080114405eb75bb/BCB.zip -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Detecting Code Clones with Graph Neural Network and Flow-Augmented Abstract Syntax Tree 2 | Code for paper "Detecting Code Clones with Graph Neural Network and Flow-Augmented Abstract Syntax Tree", SANER 2020 3 | Requires: 4 | pytorch 5 | javalang 6 | pytorch-geometric 7 | 8 | ## Data 9 | Google Code Jam snippets in googlejam4_src.zip 10 | Google Code Jam clone pairs in javadata.zip 11 | BigCloneBench snippets and clone pairs in BCB.zip 12 | 13 | ## Running 14 | Run experiments on Google Code Jam: 15 | python run_java.py 16 | For BigCloneBench: 17 | python run_bcb.py 18 | 19 | This operation include training, validation, testing and writing test results to files. 20 | 21 | Arguments: 22 | nextsib, ifedge, whileedge, foredge, blockedge, nexttoken, nextuse: whether to include these edge types in FA-AST 23 | data_setting: whether to perform data balance on training set 24 | '0': no data balance 25 | '11': pos:neg = 1:1 26 | '13': pos:neg = 1:3 27 | '0'/'11'/'13'/+'small': use a smaller version of the training set 28 | -------------------------------------------------------------------------------- /createclone.py: -------------------------------------------------------------------------------- 1 | import os 2 | import itertools 3 | import pycparser 4 | import torch 5 | from torch_geometric.data import Data 6 | from pycparser import c_parser 7 | from pycparser.c_ast import Node 8 | parser = c_parser.CParser() 9 | #Node.__slots__=('id') 10 | #print(Node.__slots__) 11 | #quit() 12 | token_mode='value' 13 | def get_token(node, lower=True,mode='value'): 14 | 15 | name = node.__class__.__name__ 16 | token = name 17 | if mode=='typeonly': 18 | return token 19 | elif mode=='value': 20 | is_name = False 21 | if len(node.children()) == 0: 22 | attr_names = node.attr_names 23 | if attr_names: 24 | if 'names' in attr_names: 25 | token = node.names[0] 26 | elif 'name' in attr_names: 27 | token = node.name 28 | is_name = True 29 | else: 30 | token = node.value 31 | else: 32 | token = name 33 | else: 34 | if name == 'TypeDecl': 35 | token = node.declname 36 | if node.attr_names: 37 | attr_names = node.attr_names 38 | if 'op' in attr_names: 39 | if node.op[0] == 'p': 40 | token = node.op[1:] 41 | else: 42 | token = node.op 43 | if token is None: 44 | token = name 45 | if lower and is_name: 46 | token = token.lower() 47 | return token 48 | 49 | def appendtokens(tree,tokenlist): 50 | tokenlist.append(get_token(tree,mode=token_mode)) 51 | for (child_name, child) in tree.children(): 52 | appendtokens(child,tokenlist) 53 | 54 | def getnodes(tree,nodelist): 55 | nodelist.append(tree) 56 | for (child_name, child) in tree.children(): 57 | getnodes(child,nodelist) 58 | 59 | def getedges(tree,src,tgt,nodedict): 60 | for (child_name, child) in tree.children(): 61 | src.append(nodedict[tree]) 62 | tgt.append(nodedict[child]) 63 | src.append(nodedict[child]) 64 | tgt.append(nodedict[tree]) 65 | getedges(child,src,tgt,nodedict) 66 | 67 | def getnodeandedge(tree,indexlist,vocabdict,src,tgt,nodedict): 68 | token=get_token(tree,mode=token_mode) 69 | indexlist.append([vocabdict[token]]) 70 | for (child_name, child) in tree.children(): 71 | src.append(nodedict[tree]) 72 | tgt.append(nodedict[child]) 73 | src.append(nodedict[child]) 74 | tgt.append(nodedict[tree]) 75 | getnodeandedge(child,indexlist,vocabdict,src,tgt,nodedict) 76 | 77 | class Queue(): 78 | def __init__(self): 79 | self.__list = list() 80 | 81 | def isEmpty(self): 82 | return self.__list == [] 83 | 84 | def push(self, data): 85 | self.__list.append(data) 86 | 87 | def pop(self): 88 | if self.isEmpty(): 89 | return False 90 | return self.__list.pop(0) 91 | def traverse(node,index): 92 | queue = Queue() 93 | queue.push(node) 94 | result = [] 95 | while not queue.isEmpty(): 96 | node = queue.pop() 97 | result.append(get_token(node,mode=token_mode)) 98 | result.append(index) 99 | index+=1 100 | for (child_name, child) in node.children(): 101 | #print(get_token(child),index) 102 | queue.push(child) 103 | return result 104 | 105 | def createast(): 106 | paths=[] 107 | asts=[] 108 | alltokens=[] 109 | dirname = 'sourcecode/' 110 | for i in range(1,16): 111 | for rt, dirs, files in os.walk(dirname+str(i)): 112 | count=0 113 | for file in files: 114 | programfile=open(os.path.join(rt,file)) 115 | programtext=programfile.read() 116 | programtext=programtext.replace('\r','') 117 | programast=parser.parse(programtext) 118 | appendtokens(programast,alltokens) 119 | '''nodelist=[] 120 | getnodes(programast,nodelist) 121 | #print(nodelist) 122 | nodedict=dict(zip(nodelist,range(len(nodelist)))) 123 | print(len(nodedict)) 124 | edgesrc=[] 125 | edgetgt=[] 126 | getedges(programast,edgesrc,edgetgt,nodedict) 127 | edge_index=[edgesrc,edgetgt] 128 | print(len(edgesrc)) 129 | print(edge_index) 130 | quit()''' 131 | programfile.close() 132 | programpath=os.path.join(rt,file) 133 | print(programpath) 134 | paths.append(programpath) 135 | asts.append(programast) 136 | astdict=dict(zip(paths,asts)) 137 | #print(astdict) 138 | print(len(astdict)) 139 | alltokens=list(set(alltokens)) 140 | vocablen=len(alltokens) 141 | tokenids=range(vocablen) 142 | vocabdict=dict(zip(alltokens,tokenids)) 143 | print(vocablen) 144 | return astdict,vocablen,vocabdict 145 | 146 | def creategmndata(id,astdict,vocablen,vocabdict,device): 147 | if id=='0': 148 | trainfile=open('train.txt') 149 | validfile = open('valid.txt') 150 | testfile = open('test.txt') 151 | elif id=='13': 152 | trainfile = open('train13.txt') 153 | validfile = open('valid.txt') 154 | testfile = open('test.txt') 155 | elif id=='11': 156 | trainfile = open('train11.txt') 157 | validfile = open('valid.txt') 158 | testfile = open('test.txt') 159 | elif id=='0small': 160 | trainfile = open('trainsmall.txt') 161 | validfile = open('validsmall.txt') 162 | testfile = open('testsmall.txt') 163 | elif id == '13small': 164 | trainfile = open('train13small.txt') 165 | validfile = open('validsmall.txt') 166 | testfile = open('testsmall.txt') 167 | elif id=='11small': 168 | trainfile = open('train11small.txt') 169 | validfile = open('validsmall.txt') 170 | testfile = open('testsmall.txt') 171 | else: 172 | print('file not exist') 173 | quit() 174 | trainlist=trainfile.readlines() 175 | validlist=validfile.readlines() 176 | testlist=testfile.readlines() 177 | traindata=[] 178 | validdata=[] 179 | testdata=[] 180 | for line in trainlist: 181 | pairinfo=line.split() 182 | code1path=pairinfo[0].replace('\\','/') 183 | #print(pairinfo[0].replace('\\','/')) 184 | code2path = pairinfo[1].replace('\\','/') 185 | label=torch.tensor(int(pairinfo[2]),dtype=torch.float,device=device) 186 | #print(code1path,code2path) 187 | ast1=astdict[code1path] 188 | ast2=astdict[code2path] 189 | nodelist1=[] 190 | nodelist2=[] 191 | getnodes(ast1,nodelist1) 192 | getnodes(ast2,nodelist2) 193 | #print(len(nodelist)) 194 | nodedict1=dict(zip(nodelist1,range(len(nodelist1)))) 195 | nodedict2=dict(zip(nodelist2,range(len(nodelist2)))) 196 | x1=[] 197 | x2=[] 198 | edgesrc1=[] 199 | edgetgt1=[] 200 | edgesrc2=[] 201 | edgetgt2=[] 202 | getnodeandedge(ast1,x1,vocabdict,edgesrc1,edgetgt1,nodedict1) 203 | ast1length=len(x1) 204 | #print(ast1length1) 205 | getnodeandedge(ast2,x2,vocabdict,edgesrc2,edgetgt2,nodedict2) 206 | ast2length=len(x2) 207 | #print(ast2length) 208 | x1=torch.tensor(x1,dtype=torch.long,device=device) 209 | x2=torch.tensor(x2,dtype=torch.long,device=device) 210 | edge_index1=torch.tensor([edgesrc1,edgetgt1],dtype=torch.long,device=device) 211 | edge_index2=torch.tensor([edgesrc2,edgetgt2],dtype=torch.long,device=device) 212 | #print(edge_index) 213 | matchsrc=[] 214 | matchtgt=[] 215 | for i in range(ast1length): 216 | for j in range(ast2length): 217 | matchsrc.append(i) 218 | matchtgt.append(j) 219 | match_index=torch.tensor([matchsrc,matchtgt],dtype=torch.long,device=device) 220 | #print(edge_index2) 221 | data=[[x1,x2,edge_index1,edge_index2,match_index],label] 222 | #data = Data(x_1=x1, x_2=x2, edge_index_1=edge_index1,edge_index_2=edge_index2,match_index=match_index) 223 | #print(data) 224 | traindata.append(data) 225 | #quit() 226 | return traindata,validdata,testdata 227 | if __name__ == '__main__': 228 | xxx=0 229 | astdict,vocablen,vocabdict=createast() 230 | creategmndata('11',astdict,vocablen,vocabdict) 231 | 232 | -------------------------------------------------------------------------------- /createclone_bcb.py: -------------------------------------------------------------------------------- 1 | import os 2 | import random 3 | import javalang 4 | import javalang.tree 5 | import javalang.ast 6 | import javalang.util 7 | from javalang.ast import Node 8 | import torch 9 | from anytree import AnyNode, RenderTree 10 | #import treelib 11 | from anytree import find 12 | from createclone_java import getedge_nextsib,getedge_flow,getedge_nextstmt,getedge_nexttoken,getedge_nextuse 13 | 14 | def get_token(node): 15 | token = '' 16 | #print(isinstance(node, Node)) 17 | #print(type(node)) 18 | if isinstance(node, str): 19 | token = node 20 | elif isinstance(node, set): 21 | token = 'Modifier' 22 | elif isinstance(node, Node): 23 | token = node.__class__.__name__ 24 | #print(node.__class__.__name__,str(node)) 25 | #print(node.__class__.__name__, node) 26 | return token 27 | def get_child(root): 28 | #print(root) 29 | if isinstance(root, Node): 30 | children = root.children 31 | elif isinstance(root, set): 32 | children = list(root) 33 | else: 34 | children = [] 35 | 36 | def expand(nested_list): 37 | for item in nested_list: 38 | if isinstance(item, list): 39 | for sub_item in expand(item): 40 | #print(sub_item) 41 | yield sub_item 42 | elif item: 43 | #print(item) 44 | yield item 45 | return list(expand(children)) 46 | def get_sequence(node, sequence): 47 | token, children = get_token(node), get_child(node) 48 | sequence.append(token) 49 | #print(len(sequence), token) 50 | for child in children: 51 | get_sequence(child, sequence) 52 | 53 | def getnodes(node,nodelist): 54 | nodelist.append(node) 55 | children = get_child(node) 56 | for child in children: 57 | getnodes(child,nodelist) 58 | 59 | def createtree(root,node,nodelist,parent=None): 60 | id = len(nodelist) 61 | #print(id) 62 | token, children = get_token(node), get_child(node) 63 | if id==0: 64 | root.token=token 65 | root.data=node 66 | else: 67 | newnode=AnyNode(id=id,token=token,data=node,parent=parent) 68 | nodelist.append(node) 69 | for child in children: 70 | if id==0: 71 | createtree(root,child, nodelist, parent=root) 72 | else: 73 | createtree(root,child, nodelist, parent=newnode) 74 | def getnodeandedge_astonly(node,nodeindexlist,vocabdict,src,tgt): 75 | token=node.token 76 | nodeindexlist.append([vocabdict[token]]) 77 | for child in node.children: 78 | src.append(node.id) 79 | tgt.append(child.id) 80 | src.append(child.id) 81 | tgt.append(node.id) 82 | getnodeandedge_astonly(child,nodeindexlist,vocabdict,src,tgt) 83 | def getnodeandedge(node,nodeindexlist,vocabdict,src,tgt,edgetype): 84 | token=node.token 85 | nodeindexlist.append([vocabdict[token]]) 86 | for child in node.children: 87 | src.append(node.id) 88 | tgt.append(child.id) 89 | edgetype.append([0]) 90 | src.append(child.id) 91 | tgt.append(node.id) 92 | edgetype.append([0]) 93 | getnodeandedge(child,nodeindexlist,vocabdict,src,tgt,edgetype) 94 | 95 | def countnodes(node,ifcount,whilecount,forcount,blockcount): 96 | token=node.token 97 | if token=='IfStatement': 98 | ifcount+=1 99 | if token=='WhileStatement': 100 | whilecount+=1 101 | if token=='ForStatement': 102 | forcount+=1 103 | if token=='BlockStatement': 104 | blockcount+=1 105 | print(ifcount,whilecount,forcount,blockcount) 106 | for child in node.children: 107 | countnodes(child,ifcount,whilecount,forcount,blockcount) 108 | '''def getedge_nextsib(node,vocabdict,src,tgt,edgetype): 109 | token=node.token 110 | for i in range(len(node.children)-1): 111 | src.append(node.children[i].id) 112 | tgt.append(node.children[i+1].id) 113 | edgetype.append([1]) 114 | src.append(node.children[i+1].id) 115 | tgt.append(node.children[i].id) 116 | edgetype.append([1]) 117 | for child in node.children: 118 | getedge_nextsib(child,vocabdict,src,tgt,edgetype)''' 119 | def createast(): 120 | asts=[] 121 | paths=[] 122 | alltokens=[] 123 | dirname = 'BCB/bigclonebenchdata/' 124 | for rt, dirs, files in os.walk(dirname): 125 | for file in files: 126 | programfile=open(os.path.join(rt,file),encoding='utf-8') 127 | #print(os.path.join(rt,file)) 128 | programtext=programfile.read() 129 | #programtext=programtext.replace('\r','') 130 | programtokens=javalang.tokenizer.tokenize(programtext) 131 | #print(list(programtokens)) 132 | parser=javalang.parse.Parser(programtokens) 133 | programast=parser.parse_member_declaration() 134 | paths.append(os.path.join(rt,file)) 135 | asts.append(programast) 136 | get_sequence(programast,alltokens) 137 | programfile.close() 138 | #print(programast) 139 | #print(alltokens) 140 | astdict=dict(zip(paths,asts)) 141 | ifcount=0 142 | whilecount=0 143 | forcount=0 144 | blockcount=0 145 | docount = 0 146 | switchcount = 0 147 | for token in alltokens: 148 | if token=='IfStatement': 149 | ifcount+=1 150 | if token=='WhileStatement': 151 | whilecount+=1 152 | if token=='ForStatement': 153 | forcount+=1 154 | if token=='BlockStatement': 155 | blockcount+=1 156 | if token=='DoStatement': 157 | docount+=1 158 | if token=='SwitchStatement': 159 | switchcount+=1 160 | print(ifcount,whilecount,forcount,blockcount,docount,switchcount) 161 | print('allnodes ',len(alltokens)) 162 | alltokens=list(set(alltokens)) 163 | vocabsize = len(alltokens) 164 | tokenids = range(vocabsize) 165 | vocabdict = dict(zip(alltokens, tokenids)) 166 | print(vocabsize) 167 | return astdict,vocabsize,vocabdict 168 | 169 | def createseparategraph(astdict,vocablen,vocabdict,device,mode='astonly',nextsib=False,ifedge=False,whileedge=False,foredge=False,blockedge=False,nexttoken=False,nextuse=False): 170 | pathlist=[] 171 | treelist=[] 172 | print('nextsib ',nextsib) 173 | print('ifedge ',ifedge) 174 | print('whileedge ',whileedge) 175 | print('foredge ',foredge) 176 | print('blockedge ',blockedge) 177 | print('nexttoken', nexttoken) 178 | print('nextuse ',nextuse) 179 | print(len(astdict)) 180 | for path,tree in astdict.items(): 181 | #print(tree) 182 | #print(path) 183 | nodelist = [] 184 | newtree=AnyNode(id=0,token=None,data=None) 185 | createtree(newtree, tree, nodelist) 186 | #print(path) 187 | #print(newtree) 188 | x = [] 189 | edgesrc = [] 190 | edgetgt = [] 191 | edge_attr=[] 192 | if mode=='astonly': 193 | getnodeandedge_astonly(newtree, x, vocabdict, edgesrc, edgetgt) 194 | else: 195 | getnodeandedge(newtree, x, vocabdict, edgesrc, edgetgt,edge_attr) 196 | if nextsib==True: 197 | getedge_nextsib(newtree,vocabdict,edgesrc,edgetgt,edge_attr) 198 | getedge_flow(newtree,vocabdict,edgesrc,edgetgt,edge_attr,ifedge,whileedge,foredge) 199 | if blockedge==True: 200 | getedge_nextstmt(newtree,vocabdict,edgesrc,edgetgt,edge_attr) 201 | tokenlist=[] 202 | if nexttoken==True: 203 | getedge_nexttoken(newtree,vocabdict,edgesrc,edgetgt,edge_attr,tokenlist) 204 | variabledict={} 205 | if nextuse==True: 206 | getedge_nextuse(newtree,vocabdict,edgesrc,edgetgt,edge_attr,variabledict) 207 | #x = torch.tensor(x, dtype=torch.long, device=device) 208 | edge_index=[edgesrc, edgetgt] 209 | #edge_index = torch.tensor([edgesrc, edgetgt], dtype=torch.long, device=device) 210 | astlength=len(x) 211 | #print(x) 212 | #print(edge_index) 213 | #print(edge_attr) 214 | pathlist.append(path) 215 | treelist.append([[x,edge_index,edge_attr],astlength]) 216 | astdict[path]=[[x,edge_index,edge_attr],astlength] 217 | #treedict=dict(zip(pathlist,treelist)) 218 | #print(totalif,totalwhile,totalfor,totalblock) 219 | return astdict 220 | def creategmndata(id,treedict,vocablen,vocabdict,device): 221 | indexdir='BCB/' 222 | if id=='0': 223 | trainfile = open(indexdir+'traindata.txt') 224 | validfile = open(indexdir+'devdata.txt') 225 | testfile = open(indexdir+'testdata.txt') 226 | elif id=='11': 227 | trainfile = open(indexdir+'traindata11.txt') 228 | validfile = open(indexdir+'devdata.txt') 229 | testfile = open(indexdir+'testdata.txt') 230 | else: 231 | print('file not exist') 232 | quit() 233 | trainlist=trainfile.readlines() 234 | validlist=validfile.readlines() 235 | testlist=testfile.readlines() 236 | traindata=[] 237 | validdata=[] 238 | testdata=[] 239 | print('train data') 240 | traindata=createpairdata(treedict,trainlist,device=device) 241 | print('valid data') 242 | validdata=createpairdata(treedict,validlist,device=device) 243 | print('test data') 244 | testdata=createpairdata(treedict,testlist,device=device) 245 | return traindata, validdata, testdata 246 | def createpairdata(treedict,pathlist,device): 247 | datalist=[] 248 | countlines=1 249 | for line in pathlist: 250 | #print(countlines) 251 | countlines += 1 252 | pairinfo = line.split() 253 | code1path='BCB'+pairinfo[0].strip('.') 254 | code2path='BCB'+pairinfo[1].strip('.') 255 | label=int(pairinfo[2]) 256 | data1 = treedict[code1path] 257 | data2 = treedict[code2path] 258 | x1,edge_index1,edge_attr1,ast1length=data1[0][0],data1[0][1],data1[0][2],data1[1] 259 | x2,edge_index2,edge_attr2,ast2length=data2[0][0],data2[0][1],data2[0][2],data2[1] 260 | '''matchsrc = [] 261 | matchtgt = [] 262 | for i in range(ast1length): 263 | for j in range(ast2length): 264 | matchsrc.append(i) 265 | matchtgt.append(j) 266 | match_index=[matchsrc, matchtgt]''' 267 | #match_index = torch.tensor([matchsrc, matchtgt], dtype=torch.long, device=device) 268 | if edge_attr1==[]: 269 | edge_attr1 = None 270 | edge_attr2 = None 271 | data = [[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2], label] 272 | datalist.append(data) 273 | return datalist 274 | 275 | if __name__ == '__main__': 276 | astdict, vocabsize, vocabdict=createast() 277 | treedict=createseparategraph(astdict, vocabsize, vocabdict,device='cpu',mode='else',nextsib=True,ifedge=True,whileedge=True,foredge=True,blockedge=True,nexttoken=True,nextuse=True) 278 | #creategmndata(treedict,vocabsize,vocabdict,device='cpu') -------------------------------------------------------------------------------- /createclone_java.py: -------------------------------------------------------------------------------- 1 | import os 2 | import random 3 | import javalang 4 | import javalang.tree 5 | import javalang.ast 6 | import javalang.util 7 | from javalang.ast import Node 8 | import torch 9 | from anytree import AnyNode, RenderTree 10 | #import treelib 11 | from anytree import find 12 | from edge_index import edges 13 | 14 | def get_token(node): 15 | token = '' 16 | #print(isinstance(node, Node)) 17 | #print(type(node)) 18 | if isinstance(node, str): 19 | token = node 20 | elif isinstance(node, set): 21 | token = 'Modifier' 22 | elif isinstance(node, Node): 23 | token = node.__class__.__name__ 24 | #print(node.__class__.__name__,str(node)) 25 | #print(node.__class__.__name__, node) 26 | return token 27 | def get_child(root): 28 | #print(root) 29 | if isinstance(root, Node): 30 | children = root.children 31 | elif isinstance(root, set): 32 | children = list(root) 33 | else: 34 | children = [] 35 | 36 | def expand(nested_list): 37 | for item in nested_list: 38 | if isinstance(item, list): 39 | for sub_item in expand(item): 40 | #print(sub_item) 41 | yield sub_item 42 | elif item: 43 | #print(item) 44 | yield item 45 | return list(expand(children)) 46 | def get_sequence(node, sequence): 47 | token, children = get_token(node), get_child(node) 48 | sequence.append(token) 49 | #print(len(sequence), token) 50 | for child in children: 51 | get_sequence(child, sequence) 52 | 53 | def getnodes(node,nodelist): 54 | nodelist.append(node) 55 | children = get_child(node) 56 | for child in children: 57 | getnodes(child,nodelist) 58 | 59 | class Queue(): 60 | def __init__(self): 61 | self.__list = list() 62 | 63 | def isEmpty(self): 64 | return self.__list == [] 65 | 66 | def push(self, data): 67 | self.__list.append(data) 68 | 69 | def pop(self): 70 | if self.isEmpty(): 71 | return False 72 | return self.__list.pop(0) 73 | def traverse(node,index): 74 | queue = Queue() 75 | queue.push(node) 76 | result = [] 77 | while not queue.isEmpty(): 78 | node = queue.pop() 79 | result.append(get_token(node)) 80 | result.append(index) 81 | index+=1 82 | for (child_name, child) in node.children(): 83 | #print(get_token(child),index) 84 | queue.push(child) 85 | return result 86 | 87 | def createtree(root,node,nodelist,parent=None): 88 | id = len(nodelist) 89 | #print(id) 90 | token, children = get_token(node), get_child(node) 91 | if id==0: 92 | root.token=token 93 | root.data=node 94 | else: 95 | newnode=AnyNode(id=id,token=token,data=node,parent=parent) 96 | nodelist.append(node) 97 | for child in children: 98 | if id==0: 99 | createtree(root,child, nodelist, parent=root) 100 | else: 101 | createtree(root,child, nodelist, parent=newnode) 102 | def getnodeandedge_astonly(node,nodeindexlist,vocabdict,src,tgt): 103 | token=node.token 104 | nodeindexlist.append([vocabdict[token]]) 105 | for child in node.children: 106 | src.append(node.id) 107 | tgt.append(child.id) 108 | src.append(child.id) 109 | tgt.append(node.id) 110 | getnodeandedge_astonly(child,nodeindexlist,vocabdict,src,tgt) 111 | def getnodeandedge(node,nodeindexlist,vocabdict,src,tgt,edgetype): 112 | token=node.token 113 | nodeindexlist.append([vocabdict[token]]) 114 | for child in node.children: 115 | src.append(node.id) 116 | tgt.append(child.id) 117 | edgetype.append([0]) 118 | src.append(child.id) 119 | tgt.append(node.id) 120 | edgetype.append([0]) 121 | getnodeandedge(child,nodeindexlist,vocabdict,src,tgt,edgetype) 122 | def getedge_nextsib(node,vocabdict,src,tgt,edgetype): 123 | token=node.token 124 | for i in range(len(node.children)-1): 125 | src.append(node.children[i].id) 126 | tgt.append(node.children[i+1].id) 127 | edgetype.append([1]) 128 | src.append(node.children[i+1].id) 129 | tgt.append(node.children[i].id) 130 | edgetype.append([edges['Prevsib']]) 131 | for child in node.children: 132 | getedge_nextsib(child,vocabdict,src,tgt,edgetype) 133 | def getedge_flow(node,vocabdict,src,tgt,edgetype,ifedge=False,whileedge=False,foredge=False): 134 | token=node.token 135 | if whileedge==True: 136 | if token=='WhileStatement': 137 | src.append(node.children[0].id) 138 | tgt.append(node.children[1].id) 139 | edgetype.append([edges['While']]) 140 | src.append(node.children[1].id) 141 | tgt.append(node.children[0].id) 142 | edgetype.append([edges['While']]) 143 | if foredge==True: 144 | if token=='ForStatement': 145 | src.append(node.children[0].id) 146 | tgt.append(node.children[1].id) 147 | edgetype.append([edges['For']]) 148 | src.append(node.children[1].id) 149 | tgt.append(node.children[0].id) 150 | edgetype.append([edges['For']]) 151 | '''if len(node.children[1].children)!=0: 152 | src.append(node.children[0].id) 153 | tgt.append(node.children[1].children[0].id) 154 | edgetype.append(edges['For_loopstart']) 155 | src.append(node.children[1].children[0].id) 156 | tgt.append(node.children[0].id) 157 | edgetype.append(edges['For_loopstart']) 158 | src.append(node.children[1].children[-1].id) 159 | tgt.append(node.children[0].id) 160 | edgetype.append(edges['For_loopend']) 161 | src.append(node.children[0].id) 162 | tgt.append(node.children[1].children[-1].id) 163 | edgetype.append(edges['For_loopend'])''' 164 | #if token=='ForControl': 165 | #print(token,len(node.children)) 166 | if ifedge==True: 167 | if token=='IfStatement': 168 | src.append(node.children[0].id) 169 | tgt.append(node.children[1].id) 170 | edgetype.append([edges['If']]) 171 | src.append(node.children[1].id) 172 | tgt.append(node.children[0].id) 173 | edgetype.append([edges['If']]) 174 | if len(node.children)==3: 175 | src.append(node.children[0].id) 176 | tgt.append(node.children[2].id) 177 | edgetype.append([edges['Ifelse']]) 178 | src.append(node.children[2].id) 179 | tgt.append(node.children[0].id) 180 | edgetype.append([edges['Ifelse']]) 181 | for child in node.children: 182 | getedge_flow(child,vocabdict,src,tgt,edgetype,ifedge,whileedge,foredge) 183 | def getedge_nextstmt(node,vocabdict,src,tgt,edgetype): 184 | token=node.token 185 | if token=='BlockStatement': 186 | for i in range(len(node.children)-1): 187 | src.append(node.children[i].id) 188 | tgt.append(node.children[i+1].id) 189 | edgetype.append([edges['Nextstmt']]) 190 | src.append(node.children[i+1].id) 191 | tgt.append(node.children[i].id) 192 | edgetype.append([edges['Prevstmt']]) 193 | for child in node.children: 194 | getedge_nextstmt(child,vocabdict,src,tgt,edgetype) 195 | def getedge_nexttoken(node,vocabdict,src,tgt,edgetype,tokenlist): 196 | def gettokenlist(node,vocabdict,edgetype,tokenlist): 197 | token=node.token 198 | if len(node.children)==0: 199 | tokenlist.append(node.id) 200 | for child in node.children: 201 | gettokenlist(child,vocabdict,edgetype,tokenlist) 202 | gettokenlist(node,vocabdict,edgetype,tokenlist) 203 | for i in range(len(tokenlist)-1): 204 | src.append(tokenlist[i]) 205 | tgt.append(tokenlist[i+1]) 206 | edgetype.append([edges['Nexttoken']]) 207 | src.append(tokenlist[i+1]) 208 | tgt.append(tokenlist[i]) 209 | edgetype.append([edges['Prevtoken']]) 210 | def getedge_nextuse(node,vocabdict,src,tgt,edgetype,variabledict): 211 | def getvariables(node,vocabdict,edgetype,variabledict): 212 | token=node.token 213 | if token=='MemberReference': 214 | for child in node.children: 215 | if child.token==node.data.member: 216 | variable=child.token 217 | variablenode=child 218 | if not variabledict.__contains__(variable): 219 | variabledict[variable]=[variablenode.id] 220 | else: 221 | variabledict[variable].append(variablenode.id) 222 | for child in node.children: 223 | getvariables(child,vocabdict,edgetype,variabledict) 224 | getvariables(node,vocabdict,edgetype,variabledict) 225 | #print(variabledict) 226 | for v in variabledict.keys(): 227 | for i in range(len(variabledict[v])-1): 228 | src.append(variabledict[v][i]) 229 | tgt.append(variabledict[v][i+1]) 230 | edgetype.append([edges['Nextuse']]) 231 | src.append(variabledict[v][i+1]) 232 | tgt.append(variabledict[v][i]) 233 | edgetype.append([edges['Prevuse']]) 234 | def createast(): 235 | asts=[] 236 | paths=[] 237 | alltokens=[] 238 | dirname = 'googlejam4_src/' 239 | for i in range(1,13): 240 | for rt, dirs, files in os.walk(dirname+str(i)): 241 | for file in files: 242 | programfile=open(os.path.join(rt,file),encoding='utf-8') 243 | #print(os.path.join(rt,file)) 244 | programtext=programfile.read() 245 | #programtext=programtext.replace('\r','') 246 | programtokens=javalang.tokenizer.tokenize(programtext) 247 | #print(list(programtokens)) 248 | programast=javalang.parser.parse(programtokens) 249 | paths.append(os.path.join(rt,file)) 250 | asts.append(programast) 251 | get_sequence(programast,alltokens) 252 | programfile.close() 253 | #print(programast) 254 | #print(alltokens) 255 | astdict=dict(zip(paths,asts)) 256 | ifcount=0 257 | whilecount=0 258 | forcount=0 259 | blockcount=0 260 | docount=0 261 | switchcount=0 262 | for token in alltokens: 263 | if token=='IfStatement': 264 | ifcount+=1 265 | if token=='WhileStatement': 266 | whilecount+=1 267 | if token=='ForStatement': 268 | forcount+=1 269 | if token=='BlockStatement': 270 | blockcount+=1 271 | if token=='DoStatement': 272 | docount+=1 273 | if token=='SwitchStatement': 274 | switchcount+=1 275 | print(ifcount,whilecount,forcount,blockcount,docount,switchcount) 276 | print('allnodes ',len(alltokens)) 277 | alltokens=list(set(alltokens)) 278 | vocabsize = len(alltokens) 279 | tokenids = range(vocabsize) 280 | vocabdict = dict(zip(alltokens, tokenids)) 281 | print(vocabsize) 282 | return astdict,vocabsize,vocabdict 283 | 284 | def createseparategraph(astdict,vocablen,vocabdict,device,mode='astonly',nextsib=False,ifedge=False,whileedge=False,foredge=False,blockedge=False,nexttoken=False,nextuse=False): 285 | pathlist=[] 286 | treelist=[] 287 | print('nextsib ',nextsib) 288 | print('ifedge ',ifedge) 289 | print('whileedge ',whileedge) 290 | print('foredge ',foredge) 291 | print('blockedge ',blockedge) 292 | print('nexttoken', nexttoken) 293 | print('nextuse ',nextuse) 294 | print(len(astdict)) 295 | for path,tree in astdict.items(): 296 | #print(tree) 297 | #print(path) 298 | nodelist = [] 299 | newtree=AnyNode(id=0,token=None,data=None) 300 | createtree(newtree, tree, nodelist) 301 | #print(path) 302 | #print(newtree) 303 | x = [] 304 | edgesrc = [] 305 | edgetgt = [] 306 | edge_attr=[] 307 | if mode=='astonly': 308 | getnodeandedge_astonly(newtree, x, vocabdict, edgesrc, edgetgt) 309 | else: 310 | getnodeandedge(newtree, x, vocabdict, edgesrc, edgetgt,edge_attr) 311 | if nextsib==True: 312 | getedge_nextsib(newtree,vocabdict,edgesrc,edgetgt,edge_attr) 313 | getedge_flow(newtree,vocabdict,edgesrc,edgetgt,edge_attr,ifedge,whileedge,foredge) 314 | if blockedge==True: 315 | getedge_nextstmt(newtree,vocabdict,edgesrc,edgetgt,edge_attr) 316 | tokenlist=[] 317 | if nexttoken==True: 318 | getedge_nexttoken(newtree,vocabdict,edgesrc,edgetgt,edge_attr,tokenlist) 319 | variabledict={} 320 | if nextuse==True: 321 | getedge_nextuse(newtree,vocabdict,edgesrc,edgetgt,edge_attr,variabledict) 322 | #x = torch.tensor(x, dtype=torch.long, device=device) 323 | edge_index=[edgesrc, edgetgt] 324 | #edge_index = torch.tensor([edgesrc, edgetgt], dtype=torch.long, device=device) 325 | astlength=len(x) 326 | #print(x) 327 | #print(edge_index) 328 | #print(edge_attr) 329 | pathlist.append(path) 330 | treelist.append([[x,edge_index,edge_attr],astlength]) 331 | astdict[path]=[[x,edge_index,edge_attr],astlength] 332 | #treedict=dict(zip(pathlist,treelist)) 333 | return astdict 334 | def creategmndata(id,treedict,vocablen,vocabdict,device): 335 | indexdir='javadata/' 336 | if id=='0': 337 | trainfile=open(indexdir+'trainall.txt') 338 | validfile = open(indexdir+'valid.txt') 339 | testfile = open(indexdir+'test.txt') 340 | elif id=='13': 341 | trainfile = open(indexdir+'train13.txt') 342 | validfile = open(indexdir+'valid.txt') 343 | testfile = open(indexdir+'test.txt') 344 | elif id=='11': 345 | trainfile = open(indexdir+'train11.txt') 346 | validfile = open(indexdir+'valid.txt') 347 | testfile = open(indexdir+'test.txt') 348 | elif id=='0small': 349 | trainfile = open(indexdir+'trainsmall.txt') 350 | validfile = open(indexdir+'valid.txt') 351 | testfile = open(indexdir+'test.txt') 352 | elif id == '13small': 353 | trainfile = open(indexdir+'train13small.txt') 354 | validfile = open(indexdir+'validsmall.txt') 355 | testfile = open(indexdir+'testsmall.txt') 356 | elif id=='11small': 357 | trainfile = open(indexdir+'train11small.txt') 358 | validfile = open(indexdir+'validsmall.txt') 359 | testfile = open(indexdir+'testsmall.txt') 360 | else: 361 | print('file not exist') 362 | quit() 363 | trainlist=trainfile.readlines() 364 | validlist=validfile.readlines() 365 | testlist=testfile.readlines() 366 | traindata=[] 367 | validdata=[] 368 | testdata=[] 369 | print('train data') 370 | traindata=createpairdata(treedict,trainlist,device=device) 371 | print('valid data') 372 | validdata=createpairdata(treedict,validlist,device=device) 373 | print('test data') 374 | testdata=createpairdata(treedict,testlist,device=device) 375 | return traindata, validdata, testdata 376 | def createpairdata(treedict,pathlist,device): 377 | datalist=[] 378 | countlines=1 379 | for line in pathlist: 380 | #print(countlines) 381 | countlines += 1 382 | pairinfo = line.split() 383 | code1path = pairinfo[0].replace('\\', '/') 384 | #code1path=pairinfo[0] 385 | #print(pairinfo[0].replace('\\','/')) 386 | code2path = pairinfo[1].replace('\\', '/') 387 | #code2path = pairinfo[1] 388 | label=int(pairinfo[2]) 389 | #label = torch.tensor(int(pairinfo[2]), dtype=torch.float, device=device) 390 | #print(code1path,code2path) 391 | #print(treedict['googlejam4_src/1/googlejam1.p507.Mushrooms.java']) 392 | data1 = treedict[code1path] 393 | data2 = treedict[code2path] 394 | x1,edge_index1,edge_attr1,ast1length=data1[0][0],data1[0][1],data1[0][2],data1[1] 395 | x2,edge_index2,edge_attr2,ast2length=data2[0][0],data2[0][1],data2[0][2],data2[1] 396 | '''matchsrc = [] 397 | matchtgt = [] 398 | for i in range(ast1length): 399 | for j in range(ast2length): 400 | matchsrc.append(i) 401 | matchtgt.append(j) 402 | match_index=[matchsrc, matchtgt]''' 403 | #match_index = torch.tensor([matchsrc, matchtgt], dtype=torch.long, device=device) 404 | if edge_attr1==[]: 405 | edge_attr1 = None 406 | edge_attr2 = None 407 | data = [[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2], label] 408 | datalist.append(data) 409 | return datalist 410 | if __name__ == '__main__': 411 | astdict, vocabsize, vocabdict=createast() 412 | treedict=createseparategraph(astdict, vocabsize, vocabdict,device='cpu',mode='else',nextsib=True,ifedge=True,whileedge=True,foredge=True,blockedge=True,nexttoken=True,nextuse=True) 413 | #creategmndata('0small',treedict,vocabsize,vocabdict,device='cpu') 414 | 415 | 416 | -------------------------------------------------------------------------------- /createclone_old.py: -------------------------------------------------------------------------------- 1 | import os 2 | import itertools 3 | import pycparser 4 | import torch 5 | from torch_geometric.data import Data 6 | from pycparser import c_parser 7 | from pycparser.c_ast import Node 8 | parser = c_parser.CParser() 9 | Node.__slots__=('id') 10 | print(Node.__slots__) 11 | #quit() 12 | token_mode='value' 13 | def get_token(node, lower=True,mode='value'): 14 | 15 | name = node.__class__.__name__ 16 | token = name 17 | if mode=='typeonly': 18 | return token 19 | elif mode=='value': 20 | is_name = False 21 | if len(node.children()) == 0: 22 | attr_names = node.attr_names 23 | if attr_names: 24 | if 'names' in attr_names: 25 | token = node.names[0] 26 | elif 'name' in attr_names: 27 | token = node.name 28 | is_name = True 29 | else: 30 | token = node.value 31 | else: 32 | token = name 33 | else: 34 | if name == 'TypeDecl': 35 | token = node.declname 36 | if node.attr_names: 37 | attr_names = node.attr_names 38 | if 'op' in attr_names: 39 | if node.op[0] == 'p': 40 | token = node.op[1:] 41 | else: 42 | token = node.op 43 | if token is None: 44 | token = name 45 | if lower and is_name: 46 | token = token.lower() 47 | return token 48 | 49 | def appendtokens(tree,tokenlist): 50 | tokenlist.append(get_token(tree,mode=token_mode)) 51 | for (child_name, child) in tree.children(): 52 | appendtokens(child,tokenlist) 53 | 54 | def getnodes(tree,nodelist): 55 | nodelist.append(tree) 56 | for (child_name, child) in tree.children(): 57 | getnodes(child,nodelist) 58 | 59 | def getedges(tree,src,tgt,nodedict): 60 | for (child_name, child) in tree.children(): 61 | src.append(nodedict[tree]) 62 | tgt.append(nodedict[child]) 63 | src.append(nodedict[child]) 64 | tgt.append(nodedict[tree]) 65 | getedges(child,src,tgt,nodedict) 66 | 67 | def getnodeandedge(tree,indexlist,vocabdict,src,tgt,nodedict): 68 | token=get_token(tree,mode=token_mode) 69 | indexlist.append([vocabdict[token]]) 70 | for (child_name, child) in tree.children(): 71 | src.append(nodedict[tree]) 72 | tgt.append(nodedict[child]) 73 | src.append(nodedict[child]) 74 | tgt.append(nodedict[tree]) 75 | getnodeandedge(child,indexlist,vocabdict,src,tgt,nodedict) 76 | 77 | class Queue(): 78 | def __init__(self): 79 | self.__list = list() 80 | 81 | def isEmpty(self): 82 | return self.__list == [] 83 | 84 | def push(self, data): 85 | self.__list.append(data) 86 | 87 | def pop(self): 88 | if self.isEmpty(): 89 | return False 90 | return self.__list.pop(0) 91 | def traverse(node,index): 92 | queue = Queue() 93 | queue.push(node) 94 | result = [] 95 | while not queue.isEmpty(): 96 | node = queue.pop() 97 | result.append(get_token(node,mode=token_mode)) 98 | result.append(index) 99 | index+=1 100 | for (child_name, child) in node.children(): 101 | #print(get_token(child),index) 102 | queue.push(child) 103 | return result 104 | 105 | def createast(): 106 | paths=[] 107 | asts=[] 108 | alltokens=[] 109 | dirname = 'sourcecode/' 110 | for i in range(1,16): 111 | for rt, dirs, files in os.walk(dirname+str(i)): 112 | count=0 113 | for file in files: 114 | programfile=open(os.path.join(rt,file)) 115 | programtext=programfile.read() 116 | programtext=programtext.replace('\r','') 117 | programast=parser.parse(programtext) 118 | appendtokens(programast,alltokens) 119 | '''nodelist=[] 120 | getnodes(programast,nodelist) 121 | #print(nodelist) 122 | nodedict=dict(zip(nodelist,range(len(nodelist)))) 123 | print(len(nodedict)) 124 | edgesrc=[] 125 | edgetgt=[] 126 | getedges(programast,edgesrc,edgetgt,nodedict) 127 | edge_index=[edgesrc,edgetgt] 128 | print(len(edgesrc)) 129 | print(edge_index) 130 | quit()''' 131 | programfile.close() 132 | programpath=os.path.join(rt,file) 133 | print(programpath) 134 | paths.append(programpath) 135 | asts.append(programast) 136 | astdict=dict(zip(paths,asts)) 137 | #print(astdict) 138 | print(len(astdict)) 139 | alltokens=list(set(alltokens)) 140 | vocablen=len(alltokens) 141 | tokenids=range(vocablen) 142 | vocabdict=dict(zip(alltokens,tokenids)) 143 | print(vocablen) 144 | return astdict,vocablen,vocabdict 145 | 146 | def creategmndata(id,astdict,vocablen,vocabdict): 147 | if id=='0': 148 | trainfile=open('train.txt') 149 | validfile = open('valid.txt') 150 | testfile = open('test.txt') 151 | elif id=='13': 152 | trainfile = open('train13.txt') 153 | validfile = open('valid.txt') 154 | testfile = open('test.txt') 155 | elif id=='11': 156 | trainfile = open('train11.txt') 157 | validfile = open('valid.txt') 158 | testfile = open('test.txt') 159 | elif id=='0small': 160 | trainfile = open('trainsmall.txt') 161 | validfile = open('validsmall.txt') 162 | testfile = open('testsmall.txt') 163 | elif id == '13small': 164 | trainfile = open('train13small.txt') 165 | validfile = open('validsmall.txt') 166 | testfile = open('testsmall.txt') 167 | elif id=='11small': 168 | trainfile = open('train11small.txt') 169 | validfile = open('validsmall.txt') 170 | testfile = open('testsmall.txt') 171 | else: 172 | print('file not exist') 173 | quit() 174 | trainlist=trainfile.readlines() 175 | validlist=validfile.readlines() 176 | testlist=testfile.readlines() 177 | traindata=[] 178 | validdata=[] 179 | testdata=[] 180 | for line in trainlist: 181 | pairinfo=line.split() 182 | code1path=pairinfo[0].replace('\\','/') 183 | #print(pairinfo[0].replace('\\','/')) 184 | code2path = pairinfo[1].replace('\\','/') 185 | #print(code1path,code2path) 186 | ast1=astdict[code1path] 187 | ast2=astdict[code2path] 188 | nodelist=[] 189 | getnodes(ast1,nodelist) 190 | getnodes(ast2,nodelist) 191 | #print(len(nodelist)) 192 | nodedict=dict(zip(nodelist,range(len(nodelist)))) 193 | x=[] 194 | edgesrc=[] 195 | edgetgt=[] 196 | getnodeandedge(ast1,x,vocabdict,edgesrc,edgetgt,nodedict) 197 | ast1lenth=len(x) 198 | #print(ast1lenth) 199 | getnodeandedge(ast2,x,vocabdict,edgesrc,edgetgt,nodedict) 200 | pairlength=len(x) 201 | #print(pairlength) 202 | x=torch.tensor(x,dtype=torch.long) 203 | edge_index=torch.tensor([edgesrc,edgetgt],dtype=torch.long) 204 | #print(edge_index) 205 | edge2src=[] 206 | edge2tgt=[] 207 | for i in range(ast1lenth): 208 | for j in range(ast1lenth,pairlength): 209 | edge2src.append(i) 210 | edge2tgt.append(j) 211 | edge2src.append(j) 212 | edge2tgt.append(i) 213 | edge_index2=torch.tensor([edge2src,edge2tgt],dtype=torch.long) 214 | #print(edge_index2) 215 | data = Data(x=x, edge_index=edge_index,edge_index2=edge_index2) 216 | #print(data) 217 | traindata.append(data) 218 | #quit() 219 | return traindata,validdata,testdata 220 | if __name__ == '__main__': 221 | xxx=0 222 | astdict,vocablen,vocabdict=createast() 223 | creategmndata('11',astdict,vocablen,vocabdict) 224 | 225 | -------------------------------------------------------------------------------- /edge_index.py: -------------------------------------------------------------------------------- 1 | edges={'Nexttoken':2,'Prevtoken':3,'Nextuse':4,'Prevuse':5,'If':6,'Ifelse':7,'While':8,'For':9,'Nextstmt':10,'Prevstmt':11,'Prevsib':12} -------------------------------------------------------------------------------- /ggnn_bcb.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_bcb import createast,creategmndata,createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=False) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='0') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=10) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | device=torch.device('cuda:0') 38 | #device=torch.device('cpu') 39 | astdict,vocablen,vocabdict=createast() 40 | treedict=createseparategraph(astdict, vocablen, vocabdict,device,mode=args.graphmode,nextsib=args.nextsib,ifedge=args.ifedge,whileedge=args.whileedge,foredge=args.foredge,blockedge=args.blockedge,nexttoken=args.nexttoken,nextuse=args.nextuse) 41 | traindata,validdata,testdata=creategmndata(args.data_setting,treedict,vocablen,vocabdict,device) 42 | print(len(traindata)) 43 | #trainloder=DataLoader(traindata,batch_size=1) 44 | num_layers=int(args.num_layers) 45 | model=models.GGNN(vocablen,embedding_dim=100,num_layers=num_layers,device=device).to(device) 46 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 47 | criterion=nn.CosineEmbeddingLoss() 48 | criterion2=nn.MSELoss() 49 | def create_batches(data): 50 | #random.shuffle(data) 51 | batches = [data[graph:graph+args.batch_size] for graph in range(0, len(data), args.batch_size)] 52 | return batches 53 | 54 | def test(dataset): 55 | #model.eval() 56 | count=0 57 | correct=0 58 | tp = 0 59 | tn = 0 60 | fp = 0 61 | fn = 0 62 | results=[] 63 | for data,label in dataset: 64 | label=torch.tensor(label, dtype=torch.float, device=device) 65 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 66 | x1=torch.tensor(x1, dtype=torch.long, device=device) 67 | x2=torch.tensor(x2, dtype=torch.long, device=device) 68 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 69 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 70 | if edge_attr1!=None: 71 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 72 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 73 | data1=[x1,edge_index1,edge_attr1] 74 | data2=[x2,edge_index2,edge_attr2] 75 | prediction1=model(data1) 76 | prediction2=model(data2) 77 | output=F.cosine_similarity(prediction1,prediction2) 78 | results.append(output.item()) 79 | prediction = torch.sign(output).item() 80 | 81 | if prediction>args.threshold and label.item()==1: 82 | tp+=1 83 | #print('tp') 84 | if prediction<=args.threshold and label.item()==-1: 85 | tn+=1 86 | #print('tn') 87 | if prediction>args.threshold and label.item()==-1: 88 | fp+=1 89 | #print('fp') 90 | if prediction<=args.threshold and label.item()==1: 91 | fn+=1 92 | #print('fn') 93 | print(tp,tn,fp,fn) 94 | p=0.0 95 | r=0.0 96 | f1=0.0 97 | if tp+fp==0: 98 | print('precision is none') 99 | return 100 | p=tp/(tp+fp) 101 | if tp+fn==0: 102 | print('recall is none') 103 | return 104 | r=tp/(tp+fn) 105 | f1=2*p*r/(p+r) 106 | print('precision') 107 | print(p) 108 | print('recall') 109 | print(r) 110 | print('F1') 111 | print(f1) 112 | return results 113 | 114 | epochs = trange(args.num_epochs, leave=True, desc = "Epoch") 115 | for epoch in epochs:# without batching 116 | print(epoch) 117 | batches=create_batches(traindata) 118 | totalloss=0.0 119 | main_index=0.0 120 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc = "Batches"): 121 | optimizer.zero_grad() 122 | batchloss= 0 123 | for data,label in batch: 124 | label=torch.tensor(label, dtype=torch.float, device=device) 125 | #print(len(data)) 126 | #for i in range(len(data)): 127 | #print(i) 128 | #data[i]=torch.tensor(data[i], dtype=torch.long, device=device) 129 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 130 | x1=torch.tensor(x1, dtype=torch.long, device=device) 131 | x2=torch.tensor(x2, dtype=torch.long, device=device) 132 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 133 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 134 | if edge_attr1!=None: 135 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 136 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 137 | data1=[x1,edge_index1,edge_attr1] 138 | data2=[x2,edge_index2,edge_attr2] 139 | prediction1=model(data1) 140 | prediction2=model(data2) 141 | #batchloss=batchloss+criterion(prediction1,prediction2,label) 142 | cossim=F.cosine_similarity(prediction1,prediction2) 143 | batchloss=batchloss+criterion2(cossim,label) 144 | batchloss.backward(retain_graph=True) 145 | optimizer.step() 146 | loss = batchloss.item() 147 | totalloss+=loss 148 | main_index = main_index + len(batch) 149 | loss=totalloss/main_index 150 | epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 151 | #test(validdata) 152 | devresults=test(validdata) 153 | devfile=open('ggnnbcbresult/'+args.graphmode+'_dev_epoch_'+str(epoch+1),mode='w') 154 | for res in devresults: 155 | devfile.write(str(res)+'\n') 156 | devfile.close() 157 | #test(testdata) 158 | testresults=test(testdata) 159 | resfile=open('ggnnbcbresult/'+args.graphmode+'_epoch_'+str(epoch+1),mode='w') 160 | for res in testresults: 161 | resfile.write(str(res)+'\n') 162 | resfile.close() 163 | 164 | #for start in range(0, len(traindata), args.batch_size): 165 | #batch = traindata[start:start+args.batch_size] 166 | #epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 167 | 168 | 169 | '''for batch in trainloder: 170 | batch=batch.to(device) 171 | print(batch) 172 | quit() 173 | time_start=time.time() 174 | model.forward(batch) 175 | time_end=time.time() 176 | print(time_end-time_start) 177 | quit()''' 178 | -------------------------------------------------------------------------------- /ggnn_gcj.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_java import createast,creategmndata,createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=False) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='0') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=10) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | device=torch.device('cuda:0') 38 | #device=torch.device('cpu') 39 | astdict,vocablen,vocabdict=createast() 40 | treedict=createseparategraph(astdict, vocablen, vocabdict,device,mode=args.graphmode,nextsib=args.nextsib,ifedge=args.ifedge,whileedge=args.whileedge,foredge=args.foredge,blockedge=args.blockedge,nexttoken=args.nexttoken,nextuse=args.nextuse) 41 | traindata,validdata,testdata=creategmndata(args.data_setting,treedict,vocablen,vocabdict,device) 42 | print(len(traindata)) 43 | #trainloder=DataLoader(traindata,batch_size=1) 44 | num_layers=int(args.num_layers) 45 | model=models.GGNN(vocablen,embedding_dim=100,num_layers=num_layers,device=device).to(device) 46 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 47 | criterion=nn.CosineEmbeddingLoss() 48 | criterion2=nn.MSELoss() 49 | def create_batches(data): 50 | #random.shuffle(data) 51 | batches = [data[graph:graph+args.batch_size] for graph in range(0, len(data), args.batch_size)] 52 | return batches 53 | 54 | def test(dataset): 55 | #model.eval() 56 | count=0 57 | correct=0 58 | tp = 0 59 | tn = 0 60 | fp = 0 61 | fn = 0 62 | results=[] 63 | for data,label in dataset: 64 | label=torch.tensor(label, dtype=torch.float, device=device) 65 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 66 | x1=torch.tensor(x1, dtype=torch.long, device=device) 67 | x2=torch.tensor(x2, dtype=torch.long, device=device) 68 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 69 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 70 | if edge_attr1!=None: 71 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 72 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 73 | data1=[x1,edge_index1,edge_attr1] 74 | data2=[x2,edge_index2,edge_attr2] 75 | prediction1=model(data1) 76 | prediction2=model(data2) 77 | output=F.cosine_similarity(prediction1,prediction2) 78 | results.append(output.item()) 79 | prediction = torch.sign(output).item() 80 | 81 | if prediction>args.threshold and label.item()==1: 82 | tp+=1 83 | #print('tp') 84 | if prediction<=args.threshold and label.item()==-1: 85 | tn+=1 86 | #print('tn') 87 | if prediction>args.threshold and label.item()==-1: 88 | fp+=1 89 | #print('fp') 90 | if prediction<=args.threshold and label.item()==1: 91 | fn+=1 92 | #print('fn') 93 | print(tp,tn,fp,fn) 94 | p=0.0 95 | r=0.0 96 | f1=0.0 97 | if tp+fp==0: 98 | print('precision is none') 99 | return 100 | p=tp/(tp+fp) 101 | if tp+fn==0: 102 | print('recall is none') 103 | return 104 | r=tp/(tp+fn) 105 | f1=2*p*r/(p+r) 106 | print('precision') 107 | print(p) 108 | print('recall') 109 | print(r) 110 | print('F1') 111 | print(f1) 112 | return results 113 | 114 | epochs = trange(args.num_epochs, leave=True, desc = "Epoch") 115 | for epoch in epochs:# without batching 116 | print(epoch) 117 | batches=create_batches(traindata) 118 | totalloss=0.0 119 | main_index=0.0 120 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc = "Batches"): 121 | optimizer.zero_grad() 122 | batchloss= 0 123 | for data,label in batch: 124 | label=torch.tensor(label, dtype=torch.float, device=device) 125 | #print(len(data)) 126 | #for i in range(len(data)): 127 | #print(i) 128 | #data[i]=torch.tensor(data[i], dtype=torch.long, device=device) 129 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 130 | x1=torch.tensor(x1, dtype=torch.long, device=device) 131 | x2=torch.tensor(x2, dtype=torch.long, device=device) 132 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 133 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 134 | if edge_attr1!=None: 135 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 136 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 137 | data1=[x1,edge_index1,edge_attr1] 138 | data2=[x2,edge_index2,edge_attr2] 139 | prediction1=model(data1) 140 | prediction2=model(data2) 141 | batchloss=batchloss+criterion(prediction1,prediction2,label) 142 | #cossim=F.cosine_similarity(prediction1,prediction2) 143 | #batchloss=batchloss+criterion2(cossim,label) 144 | batchloss.backward(retain_graph=True) 145 | optimizer.step() 146 | loss = batchloss.item() 147 | totalloss+=loss 148 | main_index = main_index + len(batch) 149 | loss=totalloss/main_index 150 | epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 151 | #test(validdata) 152 | devresults=test(validdata) 153 | devfile=open('ggnngcjresult/'+args.graphmode+'_dev_epoch_'+str(epoch+1),mode='w') 154 | for res in devresults: 155 | devfile.write(str(res)+'\n') 156 | devfile.close() 157 | #test(testdata) 158 | testresults=test(testdata) 159 | resfile=open('ggnngcjresult/'+args.graphmode+'_epoch_'+str(epoch+1),mode='w') 160 | for res in testresults: 161 | resfile.write(str(res)+'\n') 162 | resfile.close() 163 | 164 | #for start in range(0, len(traindata), args.batch_size): 165 | #batch = traindata[start:start+args.batch_size] 166 | #epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 167 | 168 | 169 | '''for batch in trainloder: 170 | batch=batch.to(device) 171 | print(batch) 172 | quit() 173 | time_start=time.time() 174 | model.forward(batch) 175 | time_end=time.time() 176 | print(time_end-time_start) 177 | quit()''' 178 | -------------------------------------------------------------------------------- /googlejam4_src.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobwwh/graphmatch_clone/0080fdb0c610865249a841381080114405eb75bb/googlejam4_src.zip -------------------------------------------------------------------------------- /javadata.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jacobwwh/graphmatch_clone/0080fdb0c610865249a841381080114405eb75bb/javadata.zip -------------------------------------------------------------------------------- /models.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from torch.nn import Parameter 4 | import torch.nn.functional as F 5 | from torch_geometric.nn import MessagePassing,GatedGraphConv 6 | from torch_geometric.utils import degree, remove_self_loops, add_self_loops, softmax,scatter_ 7 | #from torch_geometric.nn.conv import GATConv 8 | from torch_geometric.nn.inits import glorot, zeros 9 | from torch_geometric.nn.glob import GlobalAttention 10 | import sys 11 | import inspect 12 | is_python2 = sys.version_info[0] < 3 13 | getargspec = inspect.getargspec if is_python2 else inspect.getfullargspec 14 | special_args = [ 15 | 'edge_index', 'edge_index_i', 'edge_index_j', 'size', 'size_i', 'size_j' 16 | ] 17 | __size_error_msg__ = ('All tensors which should get mapped to the same source ' 18 | 'or target nodes must be of same size in dimension 0.') 19 | 20 | class GMNlayer(MessagePassing): 21 | def __init__(self, in_channels, out_channels,device): 22 | super(GMNlayer, self).__init__(aggr='add') # "Add" aggregation. 23 | self.device=device 24 | self.out_channels = out_channels 25 | self.fmessage = nn.Linear(3*in_channels, out_channels) 26 | self.fnode = torch.nn.GRUCell(2*out_channels, out_channels, bias=True) 27 | self.__match_args__ = getargspec(self.match)[0][1:] 28 | self.__special_match_args__ = [(i, arg) 29 | for i, arg in enumerate(self.__match_args__) 30 | if arg in special_args] 31 | self.__match_args__ = [ 32 | arg for arg in self.__match_args__ if arg not in special_args 33 | ] 34 | 35 | '''def propagate(self, edge_index, size=None, **kwargs): 36 | size = [None, None] if size is None else list(size) 37 | assert len(size) == 2 38 | 39 | i, j = (0, 1) if self.flow == 'target_to_source' else (1, 0) 40 | ij = {"_i": i, "_j": j} 41 | 42 | message_args = [] 43 | for arg in self.__message_args__: 44 | #print(arg) 45 | if arg[-2:] in ij.keys(): 46 | tmp = kwargs.get(arg[:-2], None) 47 | if tmp is None: # pragma: no cover 48 | message_args.append(tmp) 49 | else: 50 | idx = ij[arg[-2:]] 51 | if isinstance(tmp, tuple) or isinstance(tmp, list): 52 | assert len(tmp) == 2 53 | if tmp[1 - idx] is not None: 54 | if size[1 - idx] is None: 55 | size[1 - idx] = tmp[1 - idx].size(0) 56 | if size[1 - idx] != tmp[1 - idx].size(0): 57 | raise ValueError(__size_error_msg__) 58 | tmp = tmp[idx] 59 | 60 | if size[idx] is None: 61 | size[idx] = tmp.size(0) 62 | if size[idx] != tmp.size(0): 63 | raise ValueError(__size_error_msg__) 64 | 65 | tmp = torch.index_select(tmp, 0, edge_index[idx]) 66 | message_args.append(tmp) 67 | else: 68 | message_args.append(kwargs.get(arg, None)) 69 | 70 | size[0] = size[1] if size[0] is None else size[0] 71 | size[1] = size[0] if size[1] is None else size[1] 72 | 73 | kwargs['edge_index'] = edge_index 74 | kwargs['size'] = size 75 | 76 | for (idx, arg) in self.__special_args__: 77 | if arg[-2:] in ij.keys(): 78 | message_args.insert(idx, kwargs[arg[:-2]][ij[arg[-2:]]]) 79 | else: 80 | message_args.insert(idx, kwargs[arg]) 81 | 82 | update_args = [kwargs[arg] for arg in self.__update_args__] 83 | out = self.message(*message_args) 84 | out = scatter_(self.aggr, out, edge_index[i], dim_size=size[i]) 85 | #print(out.size()) 86 | out = self.update(out, *update_args) 87 | return out''' 88 | def propagate_match(self, edge_index, size=None, **kwargs): 89 | size = [None, None] if size is None else list(size) 90 | assert len(size) == 2 91 | 92 | i, j = (0, 1) if self.flow == 'target_to_source' else (1, 0) 93 | ij = {"_i": i, "_j": j} 94 | 95 | match_args = [] 96 | #print(self.__special_match_args__) 97 | #print(self.__match_args__) 98 | #print(ij.keys()) 99 | for arg in self.__match_args__: 100 | #print(arg) 101 | #print(arg[-2:]) 102 | if arg[-2:] in ij.keys(): 103 | tmp = kwargs.get(arg[:-2], None) 104 | if tmp is None: # pragma: no cover 105 | match_args.append(tmp) 106 | else: 107 | idx = ij[arg[-2:]] 108 | if isinstance(tmp, tuple) or isinstance(tmp, list): 109 | assert len(tmp) == 2 110 | if tmp[1 - idx] is not None: 111 | if size[1 - idx] is None: 112 | size[1 - idx] = tmp[1 - idx].size(0) 113 | if size[1 - idx] != tmp[1 - idx].size(0): 114 | raise ValueError(__size_error_msg__) 115 | tmp = tmp[idx] 116 | 117 | if size[idx] is None: 118 | size[idx] = tmp.size(0) 119 | if size[idx] != tmp.size(0): 120 | raise ValueError(__size_error_msg__) 121 | 122 | tmp = torch.index_select(tmp, 0, edge_index[idx]) 123 | match_args.append(tmp) 124 | #print(tmp) 125 | else: 126 | match_args.append(kwargs.get(arg, None)) 127 | 128 | size[0] = size[1] if size[0] is None else size[0] 129 | size[1] = size[0] if size[1] is None else size[1] 130 | 131 | kwargs['edge_index'] = edge_index 132 | kwargs['size'] = size 133 | 134 | for (idx, arg) in self.__special_match_args__: 135 | if arg[-2:] in ij.keys(): 136 | match_args.insert(idx, kwargs[arg[:-2]][ij[arg[-2:]]]) 137 | else: 138 | match_args.insert(idx, kwargs[arg]) 139 | 140 | update_args = [kwargs[arg] for arg in self.__update_args__] 141 | #print(match_args) 142 | out_attn = self.match(*match_args) 143 | #print(out_attn.size()) 144 | out_attn = scatter_(self.aggr, out_attn, edge_index[i], dim_size=size[i]) 145 | #print(out_attn.size()) 146 | out_attn = self.update(out_attn, *update_args) 147 | #out=torch.cat([out,out_attn],dim=1) 148 | #print(out.size()) 149 | return out_attn 150 | 151 | def forward(self, x1,x2, edge_index1,edge_index2,edge_weight1,edge_weight2,mode='train'): 152 | # x has shape [N, in_channels] 153 | # edge_index has shape [2, E] 154 | # Step 1: Add self-loops to the adjacency matrix. 155 | #edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0)) 156 | # Step 2: Linearly transform node feature matrix. 157 | #x = self.lin(x) 158 | 159 | # Step 3-5: Start propagating messages. 160 | m1=self.propagate(edge_index1,size=(x1.size(0), x1.size(0)), x=x1,edge_weight=edge_weight1) 161 | m2=self.propagate(edge_index2,size=(x2.size(0), x2.size(0)), x=x2,edge_weight=edge_weight2) 162 | #print('m',m1.size(),m2.size()) 163 | scores = torch.mm(x1, x2.t()) 164 | attn_1=F.softmax(scores,dim=1) 165 | #print(attn_1.size()) 166 | attn_2=F.softmax(scores,dim=0).t() 167 | #print(attn_2.size()) 168 | attnsum_1=torch.mm(attn_1,x2) 169 | attnsum_2=torch.mm(attn_2,x1) 170 | '''if mode!='train': 171 | print(attn_1) 172 | torch.save(attn_1,'attns/'+mode+'_attn1') 173 | print(attn_1.size()) 174 | torch.save(attn_2, 'attns/' + mode + '_attn2')''' 175 | #print(attn_2) 176 | #print(attn_2.size()) 177 | #print(attnsum_1.size()) 178 | #print(attnsum_2.size()) 179 | u1=x1-attnsum_1 180 | u2=x2-attnsum_2 181 | #u=self.propagate_match(edge_index_attn,size=(x1.size(0), x2.size(0)),x=(x1,x2)) 182 | #print('u',u.size()) 183 | m1=torch.cat([m1,u1],dim=1) 184 | h1=self.fnode(m1,x1) 185 | m2=torch.cat([m2,u2],dim=1) 186 | h2=self.fnode(m2,x2) 187 | return h1,h2 188 | 189 | def message(self, x_i, x_j, edge_index,size,edge_weight=None): 190 | # x_j has shape [E, out_channels] 191 | # Step 3: Normalize node features. 192 | #print(x_i.size(),x_j.size()) 193 | if type(edge_weight)==type(None): 194 | edge_weight=torch.ones(x_i.size(0),x_i.size(1)).to(self.device) 195 | m=F.relu(self.fmessage(torch.cat([x_i,x_j,edge_weight],dim=1))) 196 | else: 197 | m=F.relu(self.fmessage(torch.cat([x_i,x_j,edge_weight],dim=1))) 198 | return m 199 | 200 | def match(self, edge_index_i, x_i, x_j, size_i): 201 | return 202 | '''def match(self, edge_index_i, x_i, x_j, size_i): 203 | #x_j = x_j.view(-1, 1, self.out_channels) 204 | #alpha = torch.dot(x_i, x_j) 205 | #print(edge_index_i.size()) 206 | #print(x_i.size(),x_j.size()) 207 | alpha=torch.sum(x_i*x_j, dim=1) 208 | #alpha=torch.bmm(x_i.unsqueeze(1), x_j.unsqueeze(2)) 209 | #print(alpha.size()) 210 | size_i=x_i.size(0) 211 | alpha = softmax(alpha, edge_index_i, size_i) 212 | #print(alpha.size()) 213 | c = torch.ones(A, B) * 2 214 | v = torch.randn(A, B, C) 215 | print(c) 216 | print(v) 217 | print(c[:,:, None].size()) 218 | d = c[:,:, None] * v 219 | return alpha[:,None]*x_j 220 | #return x_j* alpha.view(-1, 1, 1) 221 | #return (x_i-x_j)* alpha.view(-1, 1, 1)''' 222 | 223 | def update(self, aggr_out): 224 | # aggr_out has shape [N, out_channels] 225 | # Step 5: Return new node embeddings. 226 | return aggr_out 227 | 228 | class GMNnet(torch.nn.Module): 229 | def __init__(self,vocablen,embedding_dim,num_layers,device): 230 | super(GMNnet, self).__init__() 231 | self.device=device 232 | self.num_layers=num_layers 233 | self.embed=nn.Embedding(vocablen,embedding_dim) 234 | self.edge_embed=nn.Embedding(20,embedding_dim) 235 | #self.gmn=nn.ModuleList([GMNlayer(embedding_dim,embedding_dim) for i in range(num_layers)]) 236 | self.gmnlayer=GMNlayer(embedding_dim,embedding_dim,self.device) 237 | self.mlp_gate=nn.Sequential(nn.Linear(embedding_dim,1),nn.Sigmoid()) 238 | self.pool=GlobalAttention(gate_nn=self.mlp_gate) 239 | 240 | def forward(self, data,mode='train'): 241 | x1,x2, edge_index1, edge_index2,edge_attr1,edge_attr2 = data 242 | #print(edge_attr1) 243 | x1 = self.embed(x1) 244 | x1 = x1.squeeze(1) 245 | x2 = self.embed(x2) 246 | x2 = x2.squeeze(1) 247 | if type(edge_attr1)==type(None): 248 | edge_weight1=None 249 | edge_weight2=None 250 | else: 251 | edge_weight1=self.edge_embed(edge_attr1) 252 | edge_weight1=edge_weight1.squeeze(1) 253 | edge_weight2=self.edge_embed(edge_attr2) 254 | edge_weight2=edge_weight2.squeeze(1) 255 | for i in range(self.num_layers): 256 | x1, x2 = self.gmnlayer.forward(x1, x2, edge_index1, edge_index2, edge_weight1, edge_weight2, mode='train') 257 | '''if i==self.num_layers-1: 258 | x1,x2=self.gmnlayer.forward(x1,x2 ,edge_index1, edge_index2,edge_weight1,edge_weight2,mode=mode) 259 | else: 260 | x1, x2 = self.gmnlayer.forward(x1, x2, edge_index1, edge_index2, edge_weight1, edge_weight2, mode='train')''' 261 | batch1=torch.zeros(x1.size(0),dtype=torch.long).to(self.device) # without batching 262 | batch2=torch.zeros(x2.size(0),dtype=torch.long).to(self.device) 263 | hg1=self.pool(x1,batch=batch1) 264 | hg2=self.pool(x2,batch=batch2) 265 | #sim=F.cosine_similarity(hg1,hg2) 266 | return hg1,hg2 267 | #for layer in self.gmn: 268 | #x=layer(x,edge_index, edge_index2) 269 | 270 | class GGNN(torch.nn.Module): 271 | def __init__(self,vocablen,embedding_dim,num_layers,device): 272 | super(GGNN, self).__init__() 273 | self.device=device 274 | #self.num_layers=num_layers 275 | self.embed=nn.Embedding(vocablen,embedding_dim) 276 | self.edge_embed=nn.Embedding(20,embedding_dim) 277 | #self.gmn=nn.ModuleList([GMNlayer(embedding_dim,embedding_dim) for i in range(num_layers)]) 278 | self.ggnnlayer=GatedGraphConv(embedding_dim,num_layers) 279 | self.mlp_gate=nn.Sequential(nn.Linear(embedding_dim,1),nn.Sigmoid()) 280 | self.pool=GlobalAttention(gate_nn=self.mlp_gate) 281 | 282 | def forward(self, data): 283 | x, edge_index, edge_attr = data 284 | x = self.embed(x) 285 | x = x.squeeze(1) 286 | if type(edge_attr)==type(None): 287 | edge_weight=None 288 | else: 289 | edge_weight=self.edge_embed(edge_attr) 290 | edge_weight=edge_weight.squeeze(1) 291 | x = self.ggnnlayer(x, edge_index) 292 | batch=torch.zeros(x.size(0),dtype=torch.long).to(self.device) 293 | hg=self.pool(x,batch=batch) 294 | return hg -------------------------------------------------------------------------------- /models_old.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from torch.nn import Parameter 4 | import torch.nn.functional as F 5 | from torch_geometric.nn import MessagePassing 6 | from torch_geometric.utils import degree, remove_self_loops, add_self_loops, softmax,scatter_ 7 | #from torch_geometric.nn.conv import GATConv 8 | from torch_geometric.nn.inits import glorot, zeros 9 | import sys 10 | import inspect 11 | is_python2 = sys.version_info[0] < 3 12 | getargspec = inspect.getargspec if is_python2 else inspect.getfullargspec 13 | special_args = [ 14 | 'edge_index', 'edge_index_i', 'edge_index_j', 'size', 'size_i', 'size_j' 15 | ] 16 | __size_error_msg__ = ('All tensors which should get mapped to the same source ' 17 | 'or target nodes must be of same size in dimension 0.') 18 | 19 | class GMNlayer(MessagePassing): 20 | def __init__(self, in_channels, out_channels): 21 | super(GMNlayer, self).__init__(aggr='add') # "Add" aggregation. 22 | self.out_channels = out_channels 23 | self.fmessage = nn.Linear(3*in_channels, out_channels) 24 | self.fnode = torch.nn.GRUCell(2*out_channels, out_channels, bias=True) 25 | self.__match_args__ = getargspec(self.match)[0][1:] 26 | self.__special_match_args__ = [(i, arg) 27 | for i, arg in enumerate(self.__match_args__) 28 | if arg in special_args] 29 | self.__match_args__ = [ 30 | arg for arg in self.__match_args__ if arg not in special_args 31 | ] 32 | 33 | '''def propagate(self, edge_index, size=None, **kwargs): 34 | size = [None, None] if size is None else list(size) 35 | assert len(size) == 2 36 | 37 | i, j = (0, 1) if self.flow == 'target_to_source' else (1, 0) 38 | ij = {"_i": i, "_j": j} 39 | 40 | message_args = [] 41 | for arg in self.__message_args__: 42 | #print(arg) 43 | if arg[-2:] in ij.keys(): 44 | tmp = kwargs.get(arg[:-2], None) 45 | if tmp is None: # pragma: no cover 46 | message_args.append(tmp) 47 | else: 48 | idx = ij[arg[-2:]] 49 | if isinstance(tmp, tuple) or isinstance(tmp, list): 50 | assert len(tmp) == 2 51 | if tmp[1 - idx] is not None: 52 | if size[1 - idx] is None: 53 | size[1 - idx] = tmp[1 - idx].size(0) 54 | if size[1 - idx] != tmp[1 - idx].size(0): 55 | raise ValueError(__size_error_msg__) 56 | tmp = tmp[idx] 57 | 58 | if size[idx] is None: 59 | size[idx] = tmp.size(0) 60 | if size[idx] != tmp.size(0): 61 | raise ValueError(__size_error_msg__) 62 | 63 | tmp = torch.index_select(tmp, 0, edge_index[idx]) 64 | message_args.append(tmp) 65 | else: 66 | message_args.append(kwargs.get(arg, None)) 67 | 68 | size[0] = size[1] if size[0] is None else size[0] 69 | size[1] = size[0] if size[1] is None else size[1] 70 | 71 | kwargs['edge_index'] = edge_index 72 | kwargs['size'] = size 73 | 74 | for (idx, arg) in self.__special_args__: 75 | if arg[-2:] in ij.keys(): 76 | message_args.insert(idx, kwargs[arg[:-2]][ij[arg[-2:]]]) 77 | else: 78 | message_args.insert(idx, kwargs[arg]) 79 | 80 | update_args = [kwargs[arg] for arg in self.__update_args__] 81 | out = self.message(*message_args) 82 | out = scatter_(self.aggr, out, edge_index[i], dim_size=size[i]) 83 | #print(out.size()) 84 | out = self.update(out, *update_args) 85 | return out''' 86 | def propagate_match(self, edge_index, size=None, **kwargs): 87 | size = [None, None] if size is None else list(size) 88 | assert len(size) == 2 89 | 90 | i, j = (0, 1) if self.flow == 'target_to_source' else (1, 0) 91 | ij = {"_i": i, "_j": j} 92 | 93 | match_args = [] 94 | #print(self.__special_match_args__) 95 | #print(self.__match_args__) 96 | #print(ij.keys()) 97 | for arg in self.__match_args__: 98 | #print(arg) 99 | #print(arg[-2:]) 100 | if arg[-2:] in ij.keys(): 101 | tmp = kwargs.get(arg[:-2], None) 102 | if tmp is None: # pragma: no cover 103 | match_args.append(tmp) 104 | else: 105 | idx = ij[arg[-2:]] 106 | if isinstance(tmp, tuple) or isinstance(tmp, list): 107 | assert len(tmp) == 2 108 | if tmp[1 - idx] is not None: 109 | if size[1 - idx] is None: 110 | size[1 - idx] = tmp[1 - idx].size(0) 111 | if size[1 - idx] != tmp[1 - idx].size(0): 112 | raise ValueError(__size_error_msg__) 113 | tmp = tmp[idx] 114 | 115 | if size[idx] is None: 116 | size[idx] = tmp.size(0) 117 | if size[idx] != tmp.size(0): 118 | raise ValueError(__size_error_msg__) 119 | 120 | tmp = torch.index_select(tmp, 0, edge_index[idx]) 121 | match_args.append(tmp) 122 | #print(tmp) 123 | else: 124 | match_args.append(kwargs.get(arg, None)) 125 | 126 | size[0] = size[1] if size[0] is None else size[0] 127 | size[1] = size[0] if size[1] is None else size[1] 128 | 129 | kwargs['edge_index'] = edge_index 130 | kwargs['size'] = size 131 | 132 | for (idx, arg) in self.__special_match_args__: 133 | if arg[-2:] in ij.keys(): 134 | match_args.insert(idx, kwargs[arg[:-2]][ij[arg[-2:]]]) 135 | else: 136 | match_args.insert(idx, kwargs[arg]) 137 | 138 | update_args = [kwargs[arg] for arg in self.__update_args__] 139 | #print(match_args) 140 | out_attn = self.match(*match_args) 141 | #print(out_attn.size()) 142 | out_attn = scatter_(self.aggr, out_attn, edge_index[i], dim_size=size[i]) 143 | #print(out_attn.size()) 144 | out_attn = self.update(out_attn, *update_args) 145 | #out=torch.cat([out,out_attn],dim=1) 146 | #print(out.size()) 147 | return out_attn 148 | 149 | def forward(self, x, edge_index,edge_index_attn): 150 | # x has shape [N, in_channels] 151 | # edge_index has shape [2, E] 152 | # Step 1: Add self-loops to the adjacency matrix. 153 | #edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0)) 154 | # Step 2: Linearly transform node feature matrix. 155 | #x = self.lin(x) 156 | 157 | # Step 3-5: Start propagating messages. 158 | m=self.propagate(edge_index,size=(x.size(0), x.size(0)), x=x,edge_weight=None) 159 | u=self.propagate_match(edge_index_attn,size=(x.size(0), x.size(0)),x=x) 160 | m=torch.cat([m,u],dim=1) 161 | h=self.fnode(m,x) 162 | return h 163 | 164 | def message(self, x_i, x_j, edge_index,size,edge_weight=None): 165 | # x_j has shape [E, out_channels] 166 | # Step 3: Normalize node features. 167 | #print(x_i.size(),x_j.size()) 168 | if edge_weight==None: 169 | edge_weight=torch.ones(x_i.size(0),x_i.size(1)).cuda() 170 | m=F.relu(self.fmessage(torch.cat([x_i,x_j,edge_weight],dim=1))) 171 | else: 172 | m=F.relu(self.fmessage(torch.cat([x_i,x_j],dim=1))) 173 | return m 174 | 175 | def match(self, edge_index_i, x_i, x_j, size_i): 176 | #x_j = x_j.view(-1, 1, self.out_channels) 177 | #alpha = torch.dot(x_i, x_j) 178 | #print(edge_index_i.size()) 179 | #print(x_i.size(),x_j.size()) 180 | alpha=torch.sum(x_i*x_j, dim=1) 181 | #alpha=torch.bmm(x_i.unsqueeze(1), x_j.unsqueeze(2)) 182 | #print(alpha.size()) 183 | size_i=x_i.size(0) 184 | alpha = softmax(alpha, edge_index_i, size_i) 185 | #print(alpha.size()) 186 | '''c = torch.ones(A, B) * 2 187 | v = torch.randn(A, B, C) 188 | print(c) 189 | print(v) 190 | print(c[:,:, None].size()) 191 | d = c[:,:, None] * v''' 192 | return alpha[:,None]*x_j 193 | #return x_j* alpha.view(-1, 1, 1) 194 | #return (x_i-x_j)* alpha.view(-1, 1, 1) 195 | 196 | def update(self, aggr_out): 197 | # aggr_out has shape [N, out_channels] 198 | # Step 5: Return new node embeddings. 199 | return aggr_out 200 | 201 | class GATConv(MessagePassing): 202 | def __init__(self, in_channels, out_channels, heads=1, concat=True, 203 | negative_slope=0.2, dropout=0, bias=True, **kwargs): 204 | super(GATConv, self).__init__(aggr='add', **kwargs) 205 | 206 | self.in_channels = in_channels 207 | self.out_channels = out_channels 208 | self.heads = heads 209 | self.concat = concat 210 | self.negative_slope = negative_slope 211 | self.dropout = dropout 212 | 213 | self.weight = Parameter( 214 | torch.Tensor(in_channels, heads * out_channels)) 215 | self.att = Parameter(torch.Tensor(1, heads, 2 * out_channels)) 216 | 217 | if bias and concat: 218 | self.bias = Parameter(torch.Tensor(heads * out_channels)) 219 | elif bias and not concat: 220 | self.bias = Parameter(torch.Tensor(out_channels)) 221 | else: 222 | self.register_parameter('bias', None) 223 | self.reset_parameters() 224 | def propagate(self, edge_index, size=None, **kwargs): 225 | size = [None, None] if size is None else list(size) 226 | assert len(size) == 2 227 | 228 | i, j = (0, 1) if self.flow == 'target_to_source' else (1, 0) 229 | ij = {"_i": i, "_j": j} 230 | 231 | message_args = [] 232 | print(self.__message_args__) 233 | for arg in self.__message_args__: 234 | print(arg) 235 | if arg[-2:] in ij.keys(): 236 | tmp = kwargs.get(arg[:-2], None) 237 | if tmp is None: # pragma: no cover 238 | message_args.append(tmp) 239 | else: 240 | idx = ij[arg[-2:]] 241 | if isinstance(tmp, tuple) or isinstance(tmp, list): 242 | assert len(tmp) == 2 243 | if tmp[1 - idx] is not None: 244 | if size[1 - idx] is None: 245 | size[1 - idx] = tmp[1 - idx].size(0) 246 | if size[1 - idx] != tmp[1 - idx].size(0): 247 | raise ValueError(__size_error_msg__) 248 | tmp = tmp[idx] 249 | 250 | if size[idx] is None: 251 | size[idx] = tmp.size(0) 252 | if size[idx] != tmp.size(0): 253 | raise ValueError(__size_error_msg__) 254 | 255 | tmp = torch.index_select(tmp, 0, edge_index[idx]) 256 | print(tmp.size()) 257 | message_args.append(tmp) 258 | else: 259 | message_args.append(kwargs.get(arg, None)) 260 | 261 | size[0] = size[1] if size[0] is None else size[0] 262 | size[1] = size[0] if size[1] is None else size[1] 263 | 264 | kwargs['edge_index'] = edge_index 265 | kwargs['size'] = size 266 | 267 | for (idx, arg) in self.__special_args__: 268 | if arg[-2:] in ij.keys(): 269 | message_args.insert(idx, kwargs[arg[:-2]][ij[arg[-2:]]]) 270 | else: 271 | message_args.insert(idx, kwargs[arg]) 272 | 273 | update_args = [kwargs[arg] for arg in self.__update_args__] 274 | 275 | out = self.message(*message_args) 276 | out = scatter_(self.aggr, out, edge_index[i], dim_size=size[i]) 277 | out = self.update(out, *update_args) 278 | return out 279 | def reset_parameters(self): 280 | glorot(self.weight) 281 | glorot(self.att) 282 | zeros(self.bias) 283 | 284 | def forward(self, x, edge_index, size=None): 285 | if size is None and torch.is_tensor(x): 286 | edge_index, _ = remove_self_loops(edge_index) 287 | edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0)) 288 | 289 | if torch.is_tensor(x): 290 | x = torch.matmul(x, self.weight) 291 | else: 292 | x = (None if x[0] is None else torch.matmul(x[0], self.weight), 293 | None if x[1] is None else torch.matmul(x[1], self.weight)) 294 | #print(x.size()) 295 | #print(size) 296 | return self.propagate(edge_index, size=size, x=x) 297 | 298 | 299 | def message(self, edge_index_i, x_i, x_j, size_i): 300 | print(edge_index_i.size())#size[E,] 301 | # Compute attention coefficients. 302 | #print(x_i.size(),x_j.size()) 303 | #print(size_i) 304 | x_j = x_j.view(-1, self.heads, self.out_channels) 305 | if x_i is None: 306 | alpha = (x_j * self.att[:, :, self.out_channels:]).sum(dim=-1) 307 | else: 308 | x_i = x_i.view(-1, self.heads, self.out_channels) 309 | alpha = (torch.cat([x_i, x_j], dim=-1) * self.att).sum(dim=-1) 310 | 311 | alpha = F.leaky_relu(alpha, self.negative_slope) 312 | alpha = softmax(alpha, edge_index_i, size_i) 313 | 314 | # Sample attention coefficients stochastically. 315 | alpha = F.dropout(alpha, p=self.dropout, training=self.training) 316 | 317 | return x_j * alpha.view(-1, self.heads, 1) 318 | 319 | def update(self, aggr_out): 320 | if self.concat is True: 321 | aggr_out = aggr_out.view(-1, self.heads * self.out_channels) 322 | else: 323 | aggr_out = aggr_out.mean(dim=1) 324 | 325 | if self.bias is not None: 326 | aggr_out = aggr_out + self.bias 327 | return aggr_out 328 | 329 | def __repr__(self): 330 | return '{}({}, {}, heads={})'.format(self.__class__.__name__, 331 | self.in_channels, 332 | self.out_channels, self.heads) 333 | class GMNnet(torch.nn.Module): 334 | def __init__(self,vocablen,embedding_dim,num_layers): 335 | super(GMNnet, self).__init__() 336 | self.num_layers=num_layers 337 | self.embed=nn.Embedding(vocablen,embedding_dim) 338 | #self.gmn=nn.ModuleList([GMNlayer(embedding_dim,embedding_dim) for i in range(num_layers)]) 339 | self.gmnlayer=GMNlayer(embedding_dim,embedding_dim) 340 | 341 | def forward(self, data): 342 | x, edge_index, edge_index2, batch = data.x, data.edge_index, data.edge_index2, data.batch 343 | x = self.embed(x) 344 | x = x.squeeze(1) 345 | for i in range(self.num_layers): 346 | x=self.gmnlayer(x,edge_index, edge_index2) 347 | #for layer in self.gmn: 348 | #x=layer(x,edge_index, edge_index2) -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone import createast,creategmndata 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--data_setting", default='11') 21 | parser.add_argument("--batch_size", default=32) 22 | parser.add_argument("--num_epochs", default=10) 23 | parser.add_argument("--lr", default=0.001) 24 | args = parser.parse_args() 25 | 26 | device=torch.device('cuda:0') 27 | astdict,vocablen,vocabdict=createast() 28 | traindata,validdata,testdata=creategmndata('11small',astdict,vocablen,vocabdict,device) 29 | #print(traindata) 30 | #trainloder=DataLoader(traindata,batch_size=1) 31 | 32 | model=models.GMNnet(vocablen,embedding_dim=100,num_layers=4).to(device) 33 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 34 | criterion=nn.CosineEmbeddingLoss() 35 | def create_batches(data): 36 | #random.shuffle(data) 37 | batches = [data[graph:graph+args.batch_size] for graph in range(0, len(data), args.batch_size)] 38 | return batches 39 | epochs = trange(args.num_epochs, leave=True, desc = "Epoch") 40 | for epoch in epochs:# without batching 41 | print(epoch) 42 | batches=create_batches(traindata) 43 | totalloss=0.0 44 | main_index=0.0 45 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc = "Batches"): 46 | optimizer.zero_grad() 47 | batchloss= 0 48 | for data,label in batch: 49 | prediction=model(data) 50 | batchloss=batchloss+criterion(prediction[0],prediction[1],label) 51 | batchloss.backward(retain_graph=True) 52 | optimizer.step() 53 | loss = batchloss.item() 54 | totalloss+=loss 55 | main_index = main_index + len(batch) 56 | loss=totalloss/main_index 57 | epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 58 | 59 | #for start in range(0, len(traindata), args.batch_size): 60 | #batch = traindata[start:start+args.batch_size] 61 | #epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 62 | '''for batch in trainloder: 63 | batch=batch.to(device) 64 | print(batch) 65 | quit() 66 | time_start=time.time() 67 | model.forward(batch) 68 | time_end=time.time() 69 | print(time_end-time_start) 70 | quit()''' -------------------------------------------------------------------------------- /run_bcb.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_bcb import createast,creategmndata,createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=False) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='11') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=10) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | device=torch.device('cuda:0') 38 | #device=torch.device('cpu') 39 | astdict,vocablen,vocabdict=createast() 40 | treedict=createseparategraph(astdict, vocablen, vocabdict,device,mode=args.graphmode,nextsib=args.nextsib,ifedge=args.ifedge,whileedge=args.whileedge,foredge=args.foredge,blockedge=args.blockedge,nexttoken=args.nexttoken,nextuse=args.nextuse) 41 | traindata,validdata,testdata=creategmndata(args.data_setting,treedict,vocablen,vocabdict,device) 42 | print(len(traindata)) 43 | #trainloder=DataLoader(traindata,batch_size=1) 44 | num_layers=int(args.num_layers) 45 | model=models.GMNnet(vocablen,embedding_dim=100,num_layers=num_layers,device=device).to(device) 46 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 47 | criterion=nn.CosineEmbeddingLoss() 48 | criterion2=nn.MSELoss() 49 | def create_batches(data): 50 | #random.shuffle(data) 51 | batches = [data[graph:graph+args.batch_size] for graph in range(0, len(data), args.batch_size)] 52 | return batches 53 | 54 | def test(dataset): 55 | #model.eval() 56 | count=0 57 | correct=0 58 | tp = 0 59 | tn = 0 60 | fp = 0 61 | fn = 0 62 | results=[] 63 | for data,label in dataset: 64 | label=torch.tensor(label, dtype=torch.float, device=device) 65 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 66 | x1=torch.tensor(x1, dtype=torch.long, device=device) 67 | x2=torch.tensor(x2, dtype=torch.long, device=device) 68 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 69 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 70 | if edge_attr1!=None: 71 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 72 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 73 | data=[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 74 | prediction=model(data) 75 | output=F.cosine_similarity(prediction[0],prediction[1]) 76 | results.append(output.item()) 77 | prediction = torch.sign(output).item() 78 | 79 | if prediction>args.threshold and label.item()==1: 80 | tp+=1 81 | #print('tp') 82 | if prediction<=args.threshold and label.item()==-1: 83 | tn+=1 84 | #print('tn') 85 | if prediction>args.threshold and label.item()==-1: 86 | fp+=1 87 | #print('fp') 88 | if prediction<=args.threshold and label.item()==1: 89 | fn+=1 90 | #print('fn') 91 | print(tp,tn,fp,fn) 92 | p=0.0 93 | r=0.0 94 | f1=0.0 95 | if tp+fp==0: 96 | print('precision is none') 97 | return 98 | p=tp/(tp+fp) 99 | if tp+fn==0: 100 | print('recall is none') 101 | return 102 | r=tp/(tp+fn) 103 | f1=2*p*r/(p+r) 104 | print('precision') 105 | print(p) 106 | print('recall') 107 | print(r) 108 | print('F1') 109 | print(f1) 110 | return results 111 | epochs = trange(args.num_epochs, leave=True, desc = "Epoch") 112 | for epoch in epochs:# without batching 113 | print(epoch) 114 | batches=create_batches(traindata) 115 | totalloss=0.0 116 | main_index=0.0 117 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc = "Batches"): 118 | optimizer.zero_grad() 119 | batchloss= 0 120 | for data,label in batch: 121 | label=torch.tensor(label, dtype=torch.float, device=device) 122 | #print(len(data)) 123 | #for i in range(len(data)): 124 | #print(i) 125 | #data[i]=torch.tensor(data[i], dtype=torch.long, device=device) 126 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 127 | x1=torch.tensor(x1, dtype=torch.long, device=device) 128 | x2=torch.tensor(x2, dtype=torch.long, device=device) 129 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 130 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 131 | if edge_attr1!=None: 132 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 133 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 134 | data=[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 135 | prediction=model(data) 136 | #batchloss=batchloss+criterion(prediction[0],prediction[1],label) 137 | cossim=F.cosine_similarity(prediction[0],prediction[1]) 138 | batchloss=batchloss+criterion2(cossim,label) 139 | batchloss.backward(retain_graph=True) 140 | optimizer.step() 141 | loss = batchloss.item() 142 | totalloss+=loss 143 | main_index = main_index + len(batch) 144 | loss=totalloss/main_index 145 | epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 146 | #test(validdata) 147 | devresults=test(validdata) 148 | devfile=open('gmnbcbresult/'+args.graphmode+'_dev_epoch_'+str(epoch+1),mode='w') 149 | for res in devresults: 150 | devfile.write(str(res)+'\n') 151 | devfile.close() 152 | testresults=test(testdata) 153 | resfile=open('gmnbcbresult/'+args.graphmode+'_epoch_'+str(epoch+1),mode='w') 154 | for res in testresults: 155 | resfile.write(str(res)+'\n') 156 | resfile.close() 157 | #torch.save(model,'gmnmodels/gmnbcb'+str(epoch+1)) 158 | #for start in range(0, len(traindata), args.batch_size): 159 | #batch = traindata[start:start+args.batch_size] 160 | #epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 161 | 162 | 163 | '''for batch in trainloder: 164 | batch=batch.to(device) 165 | print(batch) 166 | quit() 167 | time_start=time.time() 168 | model.forward(batch) 169 | time_end=time.time() 170 | print(time_end-time_start) 171 | quit()''' 172 | -------------------------------------------------------------------------------- /run_bcbnew.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_bcbnew import createast, creategmndata, createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=True) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='11') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=5) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | # device=torch.device('cuda:0') 38 | device = torch.device('cpu') 39 | astdict, vocablen, vocabdict = createast() 40 | treedict = createseparategraph(astdict, vocablen, vocabdict, device, mode=args.graphmode, nextsib=args.nextsib, 41 | ifedge=args.ifedge, whileedge=args.whileedge, foredge=args.foredge, 42 | blockedge=args.blockedge, nexttoken=args.nexttoken, nextuse=args.nextuse) 43 | traindata, validdata, testdata = creategmndata(args.data_setting, treedict, vocablen, vocabdict, device) 44 | print("numTrainData:") 45 | print(len(traindata)) 46 | # trainloder=DataLoader(traindata,batch_size=1) 47 | num_layers = int(args.num_layers) 48 | model = models.GMNnet(vocablen, embedding_dim=100, num_layers=num_layers, device=device).to(device) 49 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 50 | criterion = nn.CosineEmbeddingLoss() 51 | criterion2 = nn.MSELoss() 52 | 53 | 54 | def create_batches(data): 55 | # random.shuffle(data) 56 | batches = [data[graph:graph + args.batch_size] for graph in range(0, len(data), args.batch_size)] 57 | return batches 58 | 59 | 60 | def test(dataset,epoch): 61 | # model.eval() 62 | ff=open("recordFATT"+str(epoch)+".txt",'w') 63 | count = 0 64 | correct = 0 65 | # tp = 0 66 | # tn = 0 67 | # fp = 0 68 | # fn = 0 69 | tp = 0 70 | tn = 0 71 | fp = 0 72 | fn = 0 73 | 74 | results = [] 75 | for data, label in dataset: 76 | label = torch.tensor(label, dtype=torch.float, device=device) 77 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2 = data 78 | x1 = torch.tensor(x1, dtype=torch.long, device=device) 79 | x2 = torch.tensor(x2, dtype=torch.long, device=device) 80 | edge_index1 = torch.tensor(edge_index1, dtype=torch.long, device=device) 81 | edge_index2 = torch.tensor(edge_index2, dtype=torch.long, device=device) 82 | if edge_attr1 != None: 83 | edge_attr1 = torch.tensor(edge_attr1, dtype=torch.long, device=device) 84 | edge_attr2 = torch.tensor(edge_attr2, dtype=torch.long, device=device) 85 | data = [x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 86 | prediction = model(data) 87 | output = F.cosine_similarity(prediction[0], prediction[1]) 88 | results.append(output.item()) 89 | prediction = torch.sign(output).item() 90 | ff.write(str(output.item())) 91 | ff.write(" ") 92 | if prediction > args.threshold and label.item() == 1: 93 | tp += 1 94 | # print('tp') 95 | if prediction <= args.threshold and label.item() == -1: 96 | tn += 1 97 | # print('tn') 98 | if prediction > args.threshold and label.item() == -1: 99 | fp += 1 100 | # print('fp') 101 | if prediction <= args.threshold and label.item() == 1: 102 | fn += 1 103 | # print('fn') 104 | fy=open("recordR8T"+str(epoch)+".txt",'w') 105 | print(tp, tn, fp, fn) 106 | ff.close() 107 | p = 0.0 108 | r = 0.0 109 | f1 = 0.0 110 | if tp + fp == 0: 111 | print('precision is none') 112 | return 113 | p = tp / (tp + fp) 114 | if tp + fn == 0: 115 | print('recall is none') 116 | return 117 | r = tp / (tp + fn) 118 | f1 = 2 * p * r / (p + r) 119 | fy.write("precision") 120 | fy.write("\n") 121 | fy.write(str(p)) 122 | fy.write("recall") 123 | fy.write("\n") 124 | fy.write(str(r)) 125 | fy.write("f1") 126 | fy.write("\n") 127 | fy.write(str(f1)) 128 | fy.close() 129 | print('precision') 130 | print(p) 131 | print('recall') 132 | print(r) 133 | print('F1') 134 | print(f1) 135 | 136 | 137 | 138 | return results 139 | 140 | 141 | epochs = trange(args.num_epochs, leave=True, desc="Epoch") 142 | for epoch in epochs: # without batching 143 | print(epoch) 144 | batches = create_batches(traindata) 145 | totalloss = 0.0 146 | main_index = 0.0 147 | zz=0 148 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc="Batches"): 149 | optimizer.zero_grad() 150 | batchloss = 0 151 | # zzz=0 152 | # zz+=1 153 | # if zz>10: 154 | # break 155 | for data, label in batch: 156 | # zzz+=1 157 | # print(zzz) 158 | label = torch.tensor(label, dtype=torch.float, device=device) 159 | # print(len(data)) 160 | # for i in range(len(data)): 161 | # print(i) 162 | # data[i]=torch.tensor(data[i], dtype=torch.long, device=device) 163 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2 = data 164 | x1 = torch.tensor(x1, dtype=torch.long, device=device) 165 | x2 = torch.tensor(x2, dtype=torch.long, device=device) 166 | edge_index1 = torch.tensor(edge_index1, dtype=torch.long, device=device) 167 | edge_index2 = torch.tensor(edge_index2, dtype=torch.long, device=device) 168 | if edge_attr1 != None: 169 | edge_attr1 = torch.tensor(edge_attr1, dtype=torch.long, device=device) 170 | edge_attr2 = torch.tensor(edge_attr2, dtype=torch.long, device=device) 171 | data = [x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 172 | prediction = model(data) 173 | # batchloss=batchloss+criterion(prediction[0],prediction[1],label) 174 | cossim = F.cosine_similarity(prediction[0], prediction[1]) 175 | batchloss = batchloss + criterion2(cossim, label) 176 | batchloss.backward(retain_graph=True) 177 | optimizer.step() 178 | loss = batchloss.item() 179 | totalloss += loss 180 | main_index = main_index + len(batch) 181 | loss = totalloss / main_index 182 | epochs.set_description("Epoch (Loss=%g)" % round(loss, 5)) 183 | # test(validdata) 184 | #devresults = test(validdata) 185 | # devfile = open('gmnbcbresultnew/' + args.graphmode + '_dev_epoch_' + str(epoch + 1), mode='w') 186 | # for res in devresults: 187 | # devfile.write(str(res) + '\n') 188 | # devfile.close() 189 | print("start test:") 190 | testresults = test(testdata,epoch) 191 | 192 | # resfile = open('gmnbcbresultnew/' + args.graphmode + '_epoch_' + str(epoch + 1), mode='w') 193 | # for res in testresults: 194 | # resfile.write(str(res) + '\n') 195 | # resfile.close() 196 | # torch.save(model,'gmnmodels/gmnbcb'+str(epoch+1)) 197 | # for start in range(0, len(traindata), args.batch_size): 198 | # batch = traindata[start:start+args.batch_size] 199 | # epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 200 | 201 | '''for batch in trainloder: 202 | batch=batch.to(device) 203 | print(batch) 204 | quit() 205 | time_start=time.time() 206 | model.forward(batch) 207 | time_end=time.time() 208 | print(time_end-time_start) 209 | quit()''' 210 | -------------------------------------------------------------------------------- /run_bcbnoid.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_bcb_noid import createast, creategmndata, createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=True) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='11') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=10) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | # device=torch.device('cuda:0') 38 | device = torch.device('cpu') 39 | astdict, vocablen, vocabdict = createast() 40 | treedict = createseparategraph(astdict, vocablen, vocabdict, device, mode=args.graphmode, nextsib=args.nextsib, 41 | ifedge=args.ifedge, whileedge=args.whileedge, foredge=args.foredge, 42 | blockedge=args.blockedge, nexttoken=args.nexttoken, nextuse=args.nextuse) 43 | traindata, validdata, testdata = creategmndata(args.data_setting, treedict, vocablen, vocabdict, device) 44 | print("numTrainData:") 45 | print(len(traindata)) 46 | # trainloder=DataLoader(traindata,batch_size=1) 47 | num_layers = int(args.num_layers) 48 | model = models.GMNnet(vocablen, embedding_dim=100, num_layers=num_layers, device=device).to(device) 49 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 50 | criterion = nn.CosineEmbeddingLoss() 51 | criterion2 = nn.MSELoss() 52 | 53 | 54 | def create_batches(data): 55 | # random.shuffle(data) 56 | batches = [data[graph:graph + args.batch_size] for graph in range(0, len(data), args.batch_size)] 57 | return batches 58 | 59 | 60 | def test(dataset): 61 | # model.eval() 62 | count = 0 63 | correct = 0 64 | tp = 0 65 | tn = 0 66 | fp = 0 67 | fn = 0 68 | results = [] 69 | for data, label in dataset: 70 | 71 | label = torch.tensor(label, dtype=torch.float, device=device) 72 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2 = data 73 | x1 = torch.tensor(x1, dtype=torch.long, device=device) 74 | x2 = torch.tensor(x2, dtype=torch.long, device=device) 75 | edge_index1 = torch.tensor(edge_index1, dtype=torch.long, device=device) 76 | edge_index2 = torch.tensor(edge_index2, dtype=torch.long, device=device) 77 | if edge_attr1 != None: 78 | edge_attr1 = torch.tensor(edge_attr1, dtype=torch.long, device=device) 79 | edge_attr2 = torch.tensor(edge_attr2, dtype=torch.long, device=device) 80 | data = [x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 81 | prediction = model(data) 82 | output = F.cosine_similarity(prediction[0], prediction[1]) 83 | results.append(output.item()) 84 | prediction = torch.sign(output).item() 85 | 86 | if prediction > args.threshold and label.item() == 1: 87 | tp += 1 88 | # print('tp') 89 | if prediction <= args.threshold and label.item() == -1: 90 | tn += 1 91 | # print('tn') 92 | if prediction > args.threshold and label.item() == -1: 93 | fp += 1 94 | # print('fp') 95 | if prediction <= args.threshold and label.item() == 1: 96 | fn += 1 97 | # print('fn') 98 | print(tp, tn, fp, fn) 99 | p = 0.0 100 | r = 0.0 101 | f1 = 0.0 102 | if tp + fp == 0: 103 | print('precision is none') 104 | return 105 | p = tp / (tp + fp) 106 | if tp + fn == 0: 107 | print('recall is none') 108 | return 109 | r = tp / (tp + fn) 110 | f1 = 2 * p * r / (p + r) 111 | print('precision') 112 | print(p) 113 | print('recall') 114 | print(r) 115 | print('F1') 116 | print(f1) 117 | return results 118 | 119 | 120 | epochs = trange(args.num_epochs, leave=True, desc="Epoch") 121 | for epoch in epochs: # without batching 122 | print(epoch) 123 | batches = create_batches(traindata) 124 | totalloss = 0.0 125 | main_index = 0.0 126 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc="Batches"): 127 | optimizer.zero_grad() 128 | batchloss = 0 129 | # zzz=0 130 | for data, label in batch: 131 | # zzz+=1 132 | # print(zzz) 133 | label = torch.tensor(label, dtype=torch.float, device=device) 134 | # print(len(data)) 135 | # for i in range(len(data)): 136 | # print(i) 137 | # data[i]=torch.tensor(data[i], dtype=torch.long, device=device) 138 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2 = data 139 | x1 = torch.tensor(x1, dtype=torch.long, device=device) 140 | x2 = torch.tensor(x2, dtype=torch.long, device=device) 141 | edge_index1 = torch.tensor(edge_index1, dtype=torch.long, device=device) 142 | edge_index2 = torch.tensor(edge_index2, dtype=torch.long, device=device) 143 | if edge_attr1 != None: 144 | edge_attr1 = torch.tensor(edge_attr1, dtype=torch.long, device=device) 145 | edge_attr2 = torch.tensor(edge_attr2, dtype=torch.long, device=device) 146 | data = [x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 147 | prediction = model(data) 148 | # batchloss=batchloss+criterion(prediction[0],prediction[1],label) 149 | cossim = F.cosine_similarity(prediction[0], prediction[1]) 150 | batchloss = batchloss + criterion2(cossim, label) 151 | batchloss.backward(retain_graph=True) 152 | optimizer.step() 153 | loss = batchloss.item() 154 | totalloss += loss 155 | main_index = main_index + len(batch) 156 | loss = totalloss / main_index 157 | epochs.set_description("Epoch (Loss=%g)" % round(loss, 5)) 158 | # test(validdata) 159 | devresults = test(validdata) 160 | # devfile = open('gmnbcbresultnoid/' + args.graphmode + '_dev_epoch_' + str(epoch + 1), mode='w') 161 | # for res in devresults: 162 | # devfile.write(str(res) + '\n') 163 | # devfile.close() 164 | testresults = test(testdata) 165 | # resfile = open('gmnbcbresultnoid/' + args.graphmode + '_epoch_' + str(epoch + 1), mode='w') 166 | # for res in testresults: 167 | # resfile.write(str(res) + '\n') 168 | # resfile.close() 169 | # torch.save(model,'gmnmodels/gmnbcb'+str(epoch+1)) 170 | # for start in range(0, len(traindata), args.batch_size): 171 | # batch = traindata[start:start+args.batch_size] 172 | # epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 173 | 174 | '''for batch in trainloder: 175 | batch=batch.to(device) 176 | print(batch) 177 | quit() 178 | time_start=time.time() 179 | model.forward(batch) 180 | time_end=time.time() 181 | print(time_end-time_start) 182 | quit()''' 183 | -------------------------------------------------------------------------------- /run_java.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_java import createast,creategmndata,createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=False) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='0') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=10) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | device=torch.device('cuda:0') 38 | #device=torch.device('cpu') 39 | astdict,vocablen,vocabdict=createast() 40 | treedict=createseparategraph(astdict, vocablen, vocabdict,device,mode=args.graphmode,nextsib=args.nextsib,ifedge=args.ifedge,whileedge=args.whileedge,foredge=args.foredge,blockedge=args.blockedge,nexttoken=args.nexttoken,nextuse=args.nextuse) 41 | traindata,validdata,testdata=creategmndata(args.data_setting,treedict,vocablen,vocabdict,device) 42 | #trainloder=DataLoader(traindata,batch_size=1) 43 | num_layers=int(args.num_layers) 44 | model=models.GMNnet(vocablen,embedding_dim=100,num_layers=num_layers,device=device).to(device) 45 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 46 | criterion=nn.CosineEmbeddingLoss() 47 | criterion2=nn.MSELoss() 48 | def create_batches(data): 49 | #random.shuffle(data) 50 | batches = [data[graph:graph+args.batch_size] for graph in range(0, len(data), args.batch_size)] 51 | return batches 52 | 53 | def test(dataset): 54 | #model.eval() 55 | count=0 56 | correct=0 57 | tp = 0 58 | tn = 0 59 | fp = 0 60 | fn = 0 61 | results=[] 62 | for data,label in dataset: 63 | label=torch.tensor(label, dtype=torch.float, device=device) 64 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 65 | x1=torch.tensor(x1, dtype=torch.long, device=device) 66 | x2=torch.tensor(x2, dtype=torch.long, device=device) 67 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 68 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 69 | if edge_attr1!=None: 70 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 71 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 72 | data=[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 73 | prediction=model(data) 74 | output=F.cosine_similarity(prediction[0],prediction[1]) 75 | results.append(output.item()) 76 | prediction = torch.sign(output).item() 77 | 78 | if prediction>args.threshold and label.item()==1: 79 | tp+=1 80 | #print('tp') 81 | if prediction<=args.threshold and label.item()==-1: 82 | tn+=1 83 | #print('tn') 84 | if prediction>args.threshold and label.item()==-1: 85 | fp+=1 86 | #print('fp') 87 | if prediction<=args.threshold and label.item()==1: 88 | fn+=1 89 | #print('fn') 90 | print(tp,tn,fp,fn) 91 | p=0.0 92 | r=0.0 93 | f1=0.0 94 | if tp+fp==0: 95 | print('precision is none') 96 | return 97 | p=tp/(tp+fp) 98 | if tp+fn==0: 99 | print('recall is none') 100 | return 101 | r=tp/(tp+fn) 102 | f1=2*p*r/(p+r) 103 | print('precision') 104 | print(p) 105 | print('recall') 106 | print(r) 107 | print('F1') 108 | print(f1) 109 | return results 110 | 111 | epochs = trange(args.num_epochs, leave=True, desc = "Epoch") 112 | for epoch in epochs:# without batching 113 | print(epoch) 114 | batches=create_batches(traindata) 115 | totalloss=0.0 116 | main_index=0.0 117 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc = "Batches"): 118 | optimizer.zero_grad() 119 | batchloss= 0 120 | for data,label in batch: 121 | label=torch.tensor(label, dtype=torch.float, device=device) 122 | #print(len(data)) 123 | #for i in range(len(data)): 124 | #print(i) 125 | #data[i]=torch.tensor(data[i], dtype=torch.long, device=device) 126 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 127 | x1=torch.tensor(x1, dtype=torch.long, device=device) 128 | x2=torch.tensor(x2, dtype=torch.long, device=device) 129 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 130 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 131 | if edge_attr1!=None: 132 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 133 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 134 | data=[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 135 | prediction=model(data) 136 | #batchloss=batchloss+criterion(prediction[0],prediction[1],label) 137 | cossim=F.cosine_similarity(prediction[0],prediction[1]) 138 | batchloss=batchloss+criterion2(cossim,label) 139 | batchloss.backward(retain_graph=True) 140 | optimizer.step() 141 | loss = batchloss.item() 142 | totalloss+=loss 143 | main_index = main_index + len(batch) 144 | loss=totalloss/main_index 145 | epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 146 | #test(validdata) 147 | devresults=test(validdata) 148 | devfile=open('gcjresult/'+args.graphmode+'_dev_epoch_'+str(epoch+1),mode='w') 149 | for res in devresults: 150 | devfile.write(str(res)+'\n') 151 | devfile.close() 152 | #test(testdata) 153 | testresults=test(testdata) 154 | resfile=open('gcjresult/'+args.graphmode+'_epoch_'+str(epoch+1),mode='w') 155 | for res in testresults: 156 | resfile.write(str(res)+'\n') 157 | resfile.close() 158 | #torch.save(model,'models/gmngcj'+str(epoch+1)) 159 | #for start in range(0, len(traindata), args.batch_size): 160 | #batch = traindata[start:start+args.batch_size] 161 | #epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 162 | 163 | 164 | '''for batch in trainloder: 165 | batch=batch.to(device) 166 | print(batch) 167 | quit() 168 | time_start=time.time() 169 | model.forward(batch) 170 | time_end=time.time() 171 | print(time_end-time_start) 172 | quit()''' 173 | -------------------------------------------------------------------------------- /runbcbr.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_bcb import createast, creategmndata, createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=True) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='11') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=5) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | # device=torch.device('cuda:0') 38 | device = torch.device('cpu') 39 | astdict, vocablen, vocabdict = createast() 40 | treedict = createseparategraph(astdict, vocablen, vocabdict, device, mode=args.graphmode, nextsib=args.nextsib, 41 | ifedge=args.ifedge, whileedge=args.whileedge, foredge=args.foredge, 42 | blockedge=args.blockedge, nexttoken=args.nexttoken, nextuse=args.nextuse) 43 | traindata, validdata, testdata = creategmndata(args.data_setting, treedict, vocablen, vocabdict, device) 44 | print("numTrainData:") 45 | print(len(traindata)) 46 | # trainloder=DataLoader(traindata,batch_size=1) 47 | num_layers = int(args.num_layers) 48 | model = models.GMNnet(vocablen, embedding_dim=100, num_layers=num_layers, device=device).to(device) 49 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 50 | criterion = nn.CosineEmbeddingLoss() 51 | criterion2 = nn.MSELoss() 52 | 53 | 54 | def create_batches(data): 55 | # random.shuffle(data) 56 | batches = [data[graph:graph + args.batch_size] for graph in range(0, len(data), args.batch_size)] 57 | return batches 58 | 59 | 60 | def test(dataset,epoch): 61 | # model.eval() 62 | ff=open("recordFATTOld"+str(epoch)+".txt",'w') 63 | count = 0 64 | correct = 0 65 | # tp = 0 66 | # tn = 0 67 | # fp = 0 68 | # fn = 0 69 | tp = [] 70 | tn = [] 71 | fp = [] 72 | fn = [] 73 | for yi in range(0,18): 74 | tp.append(0) 75 | tn.append(0) 76 | fp.append(0) 77 | fn.append(0) 78 | results = [] 79 | for data, label in dataset: 80 | label = torch.tensor(label, dtype=torch.float, device=device) 81 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2 = data 82 | x1 = torch.tensor(x1, dtype=torch.long, device=device) 83 | x2 = torch.tensor(x2, dtype=torch.long, device=device) 84 | edge_index1 = torch.tensor(edge_index1, dtype=torch.long, device=device) 85 | edge_index2 = torch.tensor(edge_index2, dtype=torch.long, device=device) 86 | if edge_attr1 != None: 87 | edge_attr1 = torch.tensor(edge_attr1, dtype=torch.long, device=device) 88 | edge_attr2 = torch.tensor(edge_attr2, dtype=torch.long, device=device) 89 | data = [x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 90 | prediction = model(data) 91 | output = F.cosine_similarity(prediction[0], prediction[1]) 92 | results.append(output.item()) 93 | prediction = torch.sign(output).item() 94 | ff.write(str(output.item())) 95 | ff.write(" ") 96 | 97 | ff.close() 98 | return results 99 | 100 | 101 | epochs = trange(args.num_epochs, leave=True, desc="Epoch") 102 | for epoch in epochs: # without batching 103 | print(epoch) 104 | batches = create_batches(traindata) 105 | totalloss = 0.0 106 | main_index = 0.0 107 | zz=0 108 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc="Batches"): 109 | optimizer.zero_grad() 110 | batchloss = 0 111 | # zzz=0 112 | # zz+=1 113 | # if zz>10: 114 | # break 115 | for data, label in batch: 116 | # zzz+=1 117 | # print(zzz) 118 | label = torch.tensor(label, dtype=torch.float, device=device) 119 | # print(len(data)) 120 | # for i in range(len(data)): 121 | # print(i) 122 | # data[i]=torch.tensor(data[i], dtype=torch.long, device=device) 123 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2 = data 124 | x1 = torch.tensor(x1, dtype=torch.long, device=device) 125 | x2 = torch.tensor(x2, dtype=torch.long, device=device) 126 | edge_index1 = torch.tensor(edge_index1, dtype=torch.long, device=device) 127 | edge_index2 = torch.tensor(edge_index2, dtype=torch.long, device=device) 128 | if edge_attr1 != None: 129 | edge_attr1 = torch.tensor(edge_attr1, dtype=torch.long, device=device) 130 | edge_attr2 = torch.tensor(edge_attr2, dtype=torch.long, device=device) 131 | data = [x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 132 | prediction = model(data) 133 | # batchloss=batchloss+criterion(prediction[0],prediction[1],label) 134 | cossim = F.cosine_similarity(prediction[0], prediction[1]) 135 | batchloss = batchloss + criterion2(cossim, label) 136 | batchloss.backward(retain_graph=True) 137 | optimizer.step() 138 | loss = batchloss.item() 139 | totalloss += loss 140 | main_index = main_index + len(batch) 141 | loss = totalloss / main_index 142 | epochs.set_description("Epoch (Loss=%g)" % round(loss, 5)) 143 | # test(validdata) 144 | #devresults = test(validdata) 145 | # devfile = open('gmnbcbresultnew/' + args.graphmode + '_dev_epoch_' + str(epoch + 1), mode='w') 146 | # for res in devresults: 147 | # devfile.write(str(res) + '\n') 148 | # devfile.close() 149 | print("start test:") 150 | testresults = test(testdata,epoch) 151 | 152 | # resfile = open('gmnbcbresultnew/' + args.graphmode + '_epoch_' + str(epoch + 1), mode='w') 153 | # for res in testresults: 154 | # resfile.write(str(res) + '\n') 155 | # resfile.close() 156 | # torch.save(model,'gmnmodels/gmnbcb'+str(epoch+1)) 157 | # for start in range(0, len(traindata), args.batch_size): 158 | # batch = traindata[start:start+args.batch_size] 159 | # epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 160 | 161 | '''for batch in trainloder: 162 | batch=batch.to(device) 163 | print(batch) 164 | quit() 165 | time_start=time.time() 166 | model.forward(batch) 167 | time_end=time.time() 168 | print(time_end-time_start) 169 | quit()''' 170 | -------------------------------------------------------------------------------- /toydata.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from torch_geometric.data import Data, DataLoader 3 | A=4 4 | B=3 5 | c = torch.ones(A, ) * 2 6 | v = torch.randn(A, B) 7 | print(c) 8 | print(v) 9 | print(c[:, None]) 10 | d = c[:, None] * v 11 | print(d) 12 | quit() 13 | 14 | edge_index = torch.tensor([[0, 1, 1, 2], 15 | [1, 0, 2, 1]], dtype=torch.long) 16 | x = torch.tensor([[-1], [0], [1]], dtype=torch.float) 17 | edge_index2 = torch.tensor([[0, 1, 0, 2], 18 | [1, 0, 2, 0]], dtype=torch.long) 19 | 20 | data = Data(x=x, edge_index=edge_index,edge_index2=edge_index2) 21 | data2=Data(x=x, edge_index=edge_index2,edge_index2=edge_index) 22 | datalist=[data,data2] 23 | loader=DataLoader(datalist, batch_size=2) 24 | for batch in loader: 25 | print(batch,batch.num_graphs) -------------------------------------------------------------------------------- /validsmall.txt.0: -------------------------------------------------------------------------------- 1 | googlejam4_src/9\googlejam9.p012.Main.java googlejam4_src/6\googlejam6.p122.Main.java -1 2 | googlejam4_src/6\googlejam6.p183.B.java googlejam4_src/6\googlejam6.p539.RankAndFile.java 1 3 | googlejam4_src/6\googlejam6.p183.B.java googlejam4_src/6\googlejam6.p756.RankFile.java 1 4 | googlejam4_src/1\googlejam1.p703.ABC.java googlejam4_src/3\googlejam3.p076.A.java -1 5 | googlejam4_src/6\googlejam6.p045.GCJ2016B.java googlejam4_src/6\googlejam6.p040.B.java 1 6 | googlejam4_src/1\googlejam1.p058.A.java googlejam4_src/3\googlejam3.p076.A.java -1 7 | googlejam4_src/8\googlejam8.p269.A.java googlejam4_src/8\googlejam8.p179.CJ20161.java 1 8 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/6\googlejam6.p496.Bsmall.java -1 9 | googlejam4_src/1\googlejam1.p703.ABC.java googlejam4_src/4\googlejam4.p161.A.java -1 10 | googlejam4_src/1\googlejam1.p389.MainA.java googlejam4_src/1\googlejam1.p769.First.java 1 11 | googlejam4_src/8\googlejam8.p509.Main.java googlejam4_src/12\googlejam12.p019.TeachingAssistant.java -1 12 | googlejam4_src/6\googlejam6.p526.B_1A_RankAndFile.java googlejam4_src/8\googlejam8.p754.A.java -1 13 | googlejam4_src/3\googlejam3.p088.Solution.java googlejam4_src/8\googlejam8.p058.Senate.java -1 14 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/6\googlejam6.p608.Solder.java -1 15 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/1\googlejam1.p198.A.java 1 16 | googlejam4_src/1\googlejam1.p285.Main.java googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java 1 17 | googlejam4_src/6\googlejam6.p544.prblmB.java googlejam4_src/6\googlejam6.p523.B.java 1 18 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/1\googlejam1.p109.R1A.java -1 19 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/6\googlejam6.p183.B.java 1 20 | googlejam4_src/6\googlejam6.p392.ProblemB.java googlejam4_src/8\googlejam8.p018.CodeJamQuestion.java -1 21 | googlejam4_src/9\googlejam9.p059.slides.java googlejam4_src/1\googlejam1.p364.Q1.java -1 22 | googlejam4_src/6\googlejam6.p290.Main.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 23 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/8\googlejam8.p265.A_1C.java -1 24 | googlejam4_src/6\googlejam6.p024.GCJ.java googlejam4_src/6\googlejam6.p165.Rank.java 1 25 | googlejam4_src/3\googlejam3.p326.Solution.java googlejam4_src/3\googlejam3.p128.A.java 1 26 | googlejam4_src/3\googlejam3.p554.Q8.java googlejam4_src/6\googlejam6.p009.B.java -1 27 | googlejam4_src/2\googlejam2.p346.Cup2.java googlejam4_src/1\googlejam1.p025.ProblemA.java -1 28 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/1\googlejam1.p092.Mushroom.java 1 29 | googlejam4_src/1\googlejam1.p168.Main.java googlejam4_src/10\googlejam10.p195.TaskA.java -1 30 | googlejam4_src/8\googlejam8.p744.gpro.java googlejam4_src/2\googlejam2.p368.Round1BA.java -1 31 | googlejam4_src/11\googlejam11.p104.B.java googlejam4_src/8\googlejam8.p601.A.java -1 32 | googlejam4_src/3\googlejam3.p150.Battleship.java googlejam4_src/3\googlejam3.p256.ProblemA.java 1 33 | googlejam4_src/6\googlejam6.p183.B.java googlejam4_src/8\googlejam8.p265.A_1C.java -1 34 | googlejam4_src/6\googlejam6.p317.B_RankAndFile.java googlejam4_src/6\googlejam6.p544.prblmB.java 1 35 | googlejam4_src/1\googlejam1.p670.Main.java googlejam4_src/6\googlejam6.p489.ProblemB.java -1 36 | googlejam4_src/6\googlejam6.p010.B.java googlejam4_src/3\googlejam3.p017.SolutionA.java -1 37 | googlejam4_src/3\googlejam3.p017.SolutionA.java googlejam4_src/1\googlejam1.p198.A.java -1 38 | googlejam4_src/10\googlejam10.p189.A.java googlejam4_src/9\googlejam9.p059.slides.java -1 39 | googlejam4_src/1\googlejam1.p389.MainA.java googlejam4_src/8\googlejam8.p879.codejam3.java -1 40 | googlejam4_src/8\googlejam8.p498.MainClass.java googlejam4_src/3\googlejam3.p461.Brattleship.java -1 41 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/6\googlejam6.p496.Bsmall.java -1 42 | googlejam4_src/8\googlejam8.p498.MainClass.java googlejam4_src/3\googlejam3.p501.Battleship.java -1 43 | googlejam4_src/1\googlejam1.p703.ABC.java googlejam4_src/2\googlejam2.p364.Main.java -1 44 | googlejam4_src/1\googlejam1.p544.a.java googlejam4_src/11\googlejam11.p065.RedTapeCommittee.java -1 45 | googlejam4_src/10\googlejam10.p067.RatherPerplexingShowdown.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 46 | googlejam4_src/6\googlejam6.p326.BRank_File.java googlejam4_src/6\googlejam6.p489.ProblemB.java 1 47 | googlejam4_src/3\googlejam3.p076.A.java googlejam4_src/10\googlejam10.p195.TaskA.java -1 48 | googlejam4_src/6\googlejam6.p435.RankandFile.java googlejam4_src/2\googlejam2.p056.GoogleCodeJam.java -1 49 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/1\googlejam1.p229.Mushroom.java 1 50 | googlejam4_src/10\googlejam10.p067.RatherPerplexingShowdown.java googlejam4_src/6\googlejam6.p473.Main.java -1 51 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/1\googlejam1.p720.Mushrooms.java 1 52 | googlejam4_src/8\googlejam8.p509.Main.java googlejam4_src/8\googlejam8.p179.CJ20161.java 1 53 | googlejam4_src/9\googlejam9.p059.slides.java googlejam4_src/1\googlejam1.p363.a.java -1 54 | googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java googlejam4_src/3\googlejam3.p199.Sample.java -1 55 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/6\googlejam6.p404.B.java -1 56 | googlejam4_src/9\googlejam9.p209.GCJR1B.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java 1 57 | googlejam4_src/3\googlejam3.p199.Sample.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 58 | googlejam4_src/3\googlejam3.p095.A.java googlejam4_src/6\googlejam6.p489.ProblemB.java -1 59 | googlejam4_src/11\googlejam11.p104.B.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 60 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/8\googlejam8.p613.prblmA.java -1 61 | googlejam4_src/1\googlejam1.p025.ProblemA.java googlejam4_src/6\googlejam6.p145.ProblemB.java -1 62 | googlejam4_src/3\googlejam3.p482.R1cA.java googlejam4_src/1\googlejam1.p198.A.java -1 63 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/9\googlejam9.p142.RoundThreeProblemThree.java -1 64 | googlejam4_src/6\googlejam6.p290.Main.java googlejam4_src/1\googlejam1.p177.A.java -1 65 | googlejam4_src/6\googlejam6.p703.Solution.java googlejam4_src/6\googlejam6.p435.RankandFile.java 1 66 | googlejam4_src/1\googlejam1.p198.A.java googlejam4_src/3\googlejam3.p256.ProblemA.java -1 67 | googlejam4_src/3\googlejam3.p544.Main.java googlejam4_src/3\googlejam3.p461.Brattleship.java 1 68 | googlejam4_src/3\googlejam3.p088.Solution.java googlejam4_src/6\googlejam6.p654.Prob1B.java -1 69 | googlejam4_src/3\googlejam3.p482.R1cA.java googlejam4_src/8\googlejam8.p378.Main.java -1 70 | googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java googlejam4_src/1\googlejam1.p041.A.java 1 71 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/6\googlejam6.p223.Main.java -1 72 | googlejam4_src/2\googlejam2.p292.Main.java googlejam4_src/3\googlejam3.p544.Main.java -1 73 | googlejam4_src/6\googlejam6.p395.Solution.java googlejam4_src/10\googlejam10.p195.TaskA.java -1 74 | googlejam4_src/1\googlejam1.p062.Main.java googlejam4_src/6\googlejam6.p374.RankFile.java -1 75 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/1\googlejam1.p153.Main.java 1 76 | googlejam4_src/1\googlejam1.p347.Mushroom.java googlejam4_src/3\googlejam3.p195.A.java -1 77 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/8\googlejam8.p269.A.java -1 78 | googlejam4_src/3\googlejam3.p001.A.java googlejam4_src/9\googlejam9.p026.B.java -1 79 | googlejam4_src/8\googlejam8.p378.Main.java googlejam4_src/6\googlejam6.p183.B.java -1 80 | googlejam4_src/1\googlejam1.p337.Solution.java googlejam4_src/8\googlejam8.p601.A.java -1 81 | googlejam4_src/11\googlejam11.p139.Main_Round2_2016_B.java googlejam4_src/8\googlejam8.p672.Senate.java -1 82 | googlejam4_src/6\googlejam6.p473.Main.java googlejam4_src/8\googlejam8.p879.codejam3.java -1 83 | googlejam4_src/7\googlejam7.p301.CloseMatch.java googlejam4_src/1\googlejam1.p337.Solution.java -1 84 | googlejam4_src/6\googlejam6.p756.RankFile.java googlejam4_src/1\googlejam1.p670.Main.java -1 85 | googlejam4_src/1\googlejam1.p728.Main.java googlejam4_src/9\googlejam9.p026.B.java -1 86 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/8\googlejam8.p018.CodeJamQuestion.java -1 87 | googlejam4_src/6\googlejam6.p024.GCJ.java googlejam4_src/1\googlejam1.p059.A.java -1 88 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/2\googlejam2.p364.Main.java -1 89 | googlejam4_src/4\googlejam4.p096.Pegman.java googlejam4_src/9\googlejam9.p059.slides.java -1 90 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/3\googlejam3.p195.A.java -1 91 | googlejam4_src/2\googlejam2.p104.A.java googlejam4_src/1\googlejam1.p153.Main.java -1 92 | googlejam4_src/8\googlejam8.p601.A.java googlejam4_src/1\googlejam1.p355.A.java -1 93 | googlejam4_src/9\googlejam9.p209.GCJR1B.java googlejam4_src/6\googlejam6.p122.Main.java -1 94 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/1\googlejam1.p134.A.java 1 95 | googlejam4_src/9\googlejam9.p142.RoundThreeProblemThree.java googlejam4_src/4\googlejam4.p052.A.java -1 96 | googlejam4_src/1\googlejam1.p504.Mushroom.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 97 | googlejam4_src/2\googlejam2.p292.Main.java googlejam4_src/6\googlejam6.p473.Main.java -1 98 | googlejam4_src/4\googlejam4.p176.A.java googlejam4_src/8\googlejam8.p754.A.java -1 99 | googlejam4_src/3\googlejam3.p535.ASecondThird.java googlejam4_src/1\googlejam1.p270.MushroomMonster.java -1 100 | googlejam4_src/6\googlejam6.p362.BB.java googlejam4_src/1\googlejam1.p109.R1A.java -1 101 | googlejam4_src/11\googlejam11.p139.Main_Round2_2016_B.java googlejam4_src/3\googlejam3.p095.A.java -1 102 | googlejam4_src/6\googlejam6.p435.RankandFile.java googlejam4_src/1\googlejam1.p363.a.java -1 103 | googlejam4_src/9\googlejam9.p070.B.java googlejam4_src/8\googlejam8.p179.CJ20161.java -1 104 | googlejam4_src/1\googlejam1.p270.MushroomMonster.java googlejam4_src/8\googlejam8.p018.CodeJamQuestion.java -1 105 | googlejam4_src/6\googlejam6.p425.RankAndFile.java googlejam4_src/3\googlejam3.p518.test.java -1 106 | googlejam4_src/6\googlejam6.p009.B.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 107 | googlejam4_src/4\googlejam4.p096.Pegman.java googlejam4_src/1\googlejam1.p769.First.java -1 108 | googlejam4_src/6\googlejam6.p145.ProblemB.java googlejam4_src/6\googlejam6.p523.B.java 1 109 | googlejam4_src/6\googlejam6.p159.r1ab.java googlejam4_src/3\googlejam3.p199.Sample.java -1 110 | googlejam4_src/6\googlejam6.p159.r1ab.java googlejam4_src/7\googlejam7.p296.Q2.java -1 111 | googlejam4_src/8\googlejam8.p744.gpro.java googlejam4_src/1\googlejam1.p153.Main.java -1 112 | googlejam4_src/3\googlejam3.p348.ca_2015.java googlejam4_src/6\googlejam6.p544.prblmB.java -1 113 | googlejam4_src/6\googlejam6.p317.B_RankAndFile.java googlejam4_src/3\googlejam3.p256.ProblemA.java -1 114 | googlejam4_src/1\googlejam1.p025.ProblemA.java googlejam4_src/3\googlejam3.p461.Brattleship.java -1 115 | googlejam4_src/3\googlejam3.p461.Brattleship.java googlejam4_src/1\googlejam1.p109.R1A.java -1 116 | googlejam4_src/11\googlejam11.p104.B.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 117 | googlejam4_src/2\googlejam2.p292.Main.java googlejam4_src/1\googlejam1.p135.MushroomMaster.java -1 118 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/3\googlejam3.p001.A.java -1 119 | googlejam4_src/3\googlejam3.p535.ASecondThird.java googlejam4_src/6\googlejam6.p539.RankAndFile.java -1 120 | googlejam4_src/8\googlejam8.p498.MainClass.java googlejam4_src/1\googlejam1.p270.MushroomMonster.java -1 121 | googlejam4_src/8\googlejam8.p269.A.java googlejam4_src/8\googlejam8.p601.A.java 1 122 | googlejam4_src/1\googlejam1.p198.A.java googlejam4_src/6\googlejam6.p457.RankAndFile.java -1 123 | googlejam4_src/6\googlejam6.p145.ProblemB.java googlejam4_src/3\googlejam3.p387.ProblemA.java -1 124 | googlejam4_src/6\googlejam6.p430.rankandfile.java googlejam4_src/6\googlejam6.p040.B.java 1 125 | googlejam4_src/1\googlejam1.p830.ProblemA.java googlejam4_src/6\googlejam6.p425.RankAndFile.java -1 126 | googlejam4_src/8\googlejam8.p018.CodeJamQuestion.java googlejam4_src/6\googlejam6.p433.Problem_B_Rank_and_File.java -1 127 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/1\googlejam1.p062.Main.java 1 128 | googlejam4_src/1\googlejam1.p703.ABC.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 129 | googlejam4_src/6\googlejam6.p128.Rank.java googlejam4_src/6\googlejam6.p425.RankAndFile.java 1 130 | googlejam4_src/8\googlejam8.p378.Main.java googlejam4_src/6\googlejam6.p555.Rank_File.java -1 131 | googlejam4_src/10\googlejam10.p189.A.java googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java -1 132 | googlejam4_src/6\googlejam6.p430.rankandfile.java googlejam4_src/11\googlejam11.p065.RedTapeCommittee.java -1 133 | googlejam4_src/3\googlejam3.p501.Battleship.java googlejam4_src/8\googlejam8.p018.CodeJamQuestion.java -1 134 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/12\googlejam12.p019.TeachingAssistant.java -1 135 | googlejam4_src/1\googlejam1.p168.Main.java googlejam4_src/8\googlejam8.p500.A.java -1 136 | googlejam4_src/6\googlejam6.p395.Solution.java googlejam4_src/1\googlejam1.p355.A.java -1 137 | googlejam4_src/8\googlejam8.p269.A.java googlejam4_src/9\googlejam9.p026.B.java -1 138 | googlejam4_src/8\googlejam8.p509.Main.java googlejam4_src/3\googlejam3.p385.A.java -1 139 | googlejam4_src/6\googlejam6.p526.B_1A_RankAndFile.java googlejam4_src/1\googlejam1.p355.A.java -1 140 | googlejam4_src/1\googlejam1.p134.A.java googlejam4_src/1\googlejam1.p402.a.java 1 141 | googlejam4_src/3\googlejam3.p554.Q8.java googlejam4_src/6\googlejam6.p026.B.java -1 142 | googlejam4_src/6\googlejam6.p145.ProblemB.java googlejam4_src/1\googlejam1.p363.a.java -1 143 | googlejam4_src/4\googlejam4.p096.Pegman.java googlejam4_src/8\googlejam8.p500.A.java -1 144 | googlejam4_src/8\googlejam8.p509.Main.java googlejam4_src/3\googlejam3.p387.ProblemA.java -1 145 | googlejam4_src/11\googlejam11.p128.ProblemB.java googlejam4_src/6\googlejam6.p608.Solder.java -1 146 | googlejam4_src/6\googlejam6.p290.Main.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 147 | googlejam4_src/1\googlejam1.p134.A.java googlejam4_src/6\googlejam6.p523.B.java -1 148 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/6\googlejam6.p425.RankAndFile.java -1 149 | googlejam4_src/6\googlejam6.p165.Rank.java googlejam4_src/3\googlejam3.p387.ProblemA.java -1 150 | googlejam4_src/1\googlejam1.p504.Mushroom.java googlejam4_src/11\googlejam11.p065.RedTapeCommittee.java -1 151 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 152 | googlejam4_src/6\googlejam6.p395.Solution.java googlejam4_src/6\googlejam6.p457.RankAndFile.java 1 153 | googlejam4_src/1\googlejam1.p058.A.java googlejam4_src/6\googlejam6.p026.B.java -1 154 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/3\googlejam3.p340.R20151C_A.java -1 155 | googlejam4_src/3\googlejam3.p461.Brattleship.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 156 | googlejam4_src/4\googlejam4.p176.A.java googlejam4_src/6\googlejam6.p165.Rank.java -1 157 | googlejam4_src/6\googlejam6.p109.B.java googlejam4_src/10\googlejam10.p067.RatherPerplexingShowdown.java -1 158 | googlejam4_src/6\googlejam6.p128.Rank.java googlejam4_src/8\googlejam8.p744.gpro.java -1 159 | googlejam4_src/3\googlejam3.p312.A.java googlejam4_src/3\googlejam3.p340.R20151C_A.java 1 160 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/3\googlejam3.p095.A.java 1 161 | googlejam4_src/6\googlejam6.p528.Rank.java googlejam4_src/8\googlejam8.p672.Senate.java -1 162 | googlejam4_src/1\googlejam1.p484.App.java googlejam4_src/1\googlejam1.p670.Main.java 1 163 | googlejam4_src/6\googlejam6.p087.Round1B.java googlejam4_src/6\googlejam6.p473.Main.java 1 164 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/6\googlejam6.p040.B.java -1 165 | googlejam4_src/8\googlejam8.p179.CJ20161.java googlejam4_src/1\googlejam1.p364.Q1.java -1 166 | googlejam4_src/6\googlejam6.p392.ProblemB.java googlejam4_src/2\googlejam2.p368.Round1BA.java -1 167 | googlejam4_src/1\googlejam1.p484.App.java googlejam4_src/3\googlejam3.p128.A.java -1 168 | googlejam4_src/6\googlejam6.p326.BRank_File.java googlejam4_src/6\googlejam6.p587.GCJ2.java 1 169 | googlejam4_src/1\googlejam1.p830.ProblemA.java googlejam4_src/1\googlejam1.p467.P1.java 1 170 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/1\googlejam1.p313.A.java 1 171 | googlejam4_src/2\googlejam2.p292.Main.java googlejam4_src/3\googlejam3.p385.A.java -1 172 | googlejam4_src/1\googlejam1.p270.MushroomMonster.java googlejam4_src/1\googlejam1.p467.P1.java 1 173 | googlejam4_src/6\googlejam6.p395.Solution.java googlejam4_src/1\googlejam1.p313.A.java -1 174 | googlejam4_src/6\googlejam6.p473.Main.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 175 | googlejam4_src/3\googlejam3.p017.SolutionA.java googlejam4_src/9\googlejam9.p026.B.java -1 176 | googlejam4_src/10\googlejam10.p067.RatherPerplexingShowdown.java googlejam4_src/2\googlejam2.p056.GoogleCodeJam.java -1 177 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/6\googlejam6.p145.ProblemB.java -1 178 | googlejam4_src/8\googlejam8.p179.CJ20161.java googlejam4_src/3\googlejam3.p385.A.java -1 179 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 180 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/9\googlejam9.p059.slides.java -1 181 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/3\googlejam3.p256.ProblemA.java 1 182 | googlejam4_src/6\googlejam6.p317.B_RankAndFile.java googlejam4_src/8\googlejam8.p179.CJ20161.java -1 183 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/12\googlejam12.p019.TeachingAssistant.java -1 184 | googlejam4_src/1\googlejam1.p025.ProblemA.java googlejam4_src/3\googlejam3.p518.test.java -1 185 | googlejam4_src/6\googlejam6.p172.B.java googlejam4_src/1\googlejam1.p355.A.java -1 186 | googlejam4_src/2\googlejam2.p346.Cup2.java googlejam4_src/1\googlejam1.p670.Main.java -1 187 | googlejam4_src/2\googlejam2.p364.Main.java googlejam4_src/2\googlejam2.p197.A.java 1 188 | googlejam4_src/6\googlejam6.p482.RankAndFile.java googlejam4_src/11\googlejam11.p065.RedTapeCommittee.java -1 189 | googlejam4_src/8\googlejam8.p754.A.java googlejam4_src/6\googlejam6.p122.Main.java -1 190 | googlejam4_src/6\googlejam6.p045.GCJ2016B.java googlejam4_src/8\googlejam8.p500.A.java -1 191 | googlejam4_src/3\googlejam3.p150.Battleship.java googlejam4_src/6\googlejam6.p528.Rank.java -1 192 | googlejam4_src/8\googlejam8.p427.Codejam.java googlejam4_src/6\googlejam6.p523.B.java -1 193 | googlejam4_src/3\googlejam3.p088.Solution.java googlejam4_src/3\googlejam3.p326.Solution.java 1 194 | googlejam4_src/3\googlejam3.p554.Q8.java googlejam4_src/1\googlejam1.p769.First.java -1 195 | googlejam4_src/1\googlejam1.p109.R1A.java googlejam4_src/1\googlejam1.p177.A.java 1 196 | googlejam4_src/3\googlejam3.p195.A.java googlejam4_src/6\googlejam6.p026.B.java -1 197 | googlejam4_src/11\googlejam11.p139.Main_Round2_2016_B.java googlejam4_src/8\googlejam8.p601.A.java -1 198 | googlejam4_src/1\googlejam1.p670.Main.java googlejam4_src/8\googlejam8.p879.codejam3.java -1 199 | googlejam4_src/6\googlejam6.p756.RankFile.java googlejam4_src/3\googlejam3.p095.A.java -1 200 | googlejam4_src/1\googlejam1.p292.Problem1.java googlejam4_src/6\googlejam6.p489.ProblemB.java -1 201 | googlejam4_src/6\googlejam6.p172.B.java googlejam4_src/1\googlejam1.p720.Mushrooms.java -1 202 | googlejam4_src/1\googlejam1.p517.MushroomMonster.java googlejam4_src/8\googlejam8.p265.A_1C.java -1 203 | googlejam4_src/1\googlejam1.p050.A.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 204 | googlejam4_src/6\googlejam6.p362.BB.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 205 | googlejam4_src/1\googlejam1.p285.Main.java googlejam4_src/6\googlejam6.p539.RankAndFile.java -1 206 | googlejam4_src/1\googlejam1.p504.Mushroom.java googlejam4_src/1\googlejam1.p467.P1.java 1 207 | googlejam4_src/8\googlejam8.p509.Main.java googlejam4_src/8\googlejam8.p672.Senate.java 1 208 | googlejam4_src/3\googlejam3.p195.A.java googlejam4_src/6\googlejam6.p374.RankFile.java -1 209 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/6\googlejam6.p395.Solution.java -1 210 | googlejam4_src/1\googlejam1.p728.Main.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 211 | googlejam4_src/9\googlejam9.p026.B.java googlejam4_src/6\googlejam6.p040.B.java -1 212 | googlejam4_src/6\googlejam6.p703.Solution.java googlejam4_src/8\googlejam8.p601.A.java -1 213 | googlejam4_src/6\googlejam6.p109.B.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 214 | googlejam4_src/6\googlejam6.p523.B.java googlejam4_src/6\googlejam6.p122.Main.java 1 215 | googlejam4_src/8\googlejam8.p509.Main.java googlejam4_src/1\googlejam1.p059.A.java -1 216 | googlejam4_src/6\googlejam6.p183.B.java googlejam4_src/8\googlejam8.p823.A.java -1 217 | googlejam4_src/6\googlejam6.p165.Rank.java googlejam4_src/6\googlejam6.p374.RankFile.java 1 218 | googlejam4_src/1\googlejam1.p347.Mushroom.java googlejam4_src/6\googlejam6.p435.RankandFile.java -1 219 | googlejam4_src/1\googlejam1.p728.Main.java googlejam4_src/1\googlejam1.p670.Main.java 1 220 | googlejam4_src/6\googlejam6.p392.ProblemB.java googlejam4_src/1\googlejam1.p363.a.java -1 221 | googlejam4_src/3\googlejam3.p544.Main.java googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java -1 222 | googlejam4_src/3\googlejam3.p128.A.java googlejam4_src/1\googlejam1.p135.MushroomMaster.java -1 223 | googlejam4_src/6\googlejam6.p165.Rank.java googlejam4_src/2\googlejam2.p368.Round1BA.java -1 224 | googlejam4_src/1\googlejam1.p313.A.java googlejam4_src/3\googlejam3.p518.test.java -1 225 | googlejam4_src/1\googlejam1.p484.App.java googlejam4_src/6\googlejam6.p165.Rank.java -1 226 | googlejam4_src/6\googlejam6.p128.Rank.java googlejam4_src/1\googlejam1.p544.a.java -1 227 | googlejam4_src/11\googlejam11.p128.ProblemB.java googlejam4_src/6\googlejam6.p045.GCJ2016B.java -1 228 | googlejam4_src/2\googlejam2.p197.A.java googlejam4_src/6\googlejam6.p457.RankAndFile.java -1 229 | googlejam4_src/1\googlejam1.p703.ABC.java googlejam4_src/1\googlejam1.p670.Main.java 1 230 | googlejam4_src/8\googlejam8.p744.gpro.java googlejam4_src/6\googlejam6.p374.RankFile.java -1 231 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 232 | googlejam4_src/7\googlejam7.p296.Q2.java googlejam4_src/1\googlejam1.p517.MushroomMonster.java -1 233 | googlejam4_src/6\googlejam6.p539.RankAndFile.java googlejam4_src/6\googlejam6.p362.BB.java 1 234 | googlejam4_src/6\googlejam6.p703.Solution.java googlejam4_src/6\googlejam6.p404.B.java 1 235 | googlejam4_src/1\googlejam1.p830.ProblemA.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 236 | googlejam4_src/11\googlejam11.p128.ProblemB.java googlejam4_src/1\googlejam1.p355.A.java -1 237 | googlejam4_src/3\googlejam3.p385.A.java googlejam4_src/6\googlejam6.p457.RankAndFile.java -1 238 | googlejam4_src/1\googlejam1.p839.CodeJamA.java googlejam4_src/1\googlejam1.p830.ProblemA.java 1 239 | googlejam4_src/1\googlejam1.p292.Problem1.java googlejam4_src/6\googlejam6.p087.Round1B.java -1 240 | googlejam4_src/3\googlejam3.p340.R20151C_A.java googlejam4_src/6\googlejam6.p433.Problem_B_Rank_and_File.java -1 241 | googlejam4_src/6\googlejam6.p326.BRank_File.java googlejam4_src/3\googlejam3.p511.Brattleship.java -1 242 | googlejam4_src/4\googlejam4.p096.Pegman.java googlejam4_src/6\googlejam6.p223.Main.java -1 243 | googlejam4_src/2\googlejam2.p368.Round1BA.java googlejam4_src/8\googlejam8.p613.prblmA.java -1 244 | googlejam4_src/6\googlejam6.p526.B_1A_RankAndFile.java googlejam4_src/3\googlejam3.p095.A.java -1 245 | googlejam4_src/11\googlejam11.p128.ProblemB.java googlejam4_src/6\googlejam6.p392.ProblemB.java -1 246 | googlejam4_src/11\googlejam11.p128.ProblemB.java googlejam4_src/6\googlejam6.p172.B.java -1 247 | googlejam4_src/8\googlejam8.p378.Main.java googlejam4_src/8\googlejam8.p613.prblmA.java 1 248 | googlejam4_src/4\googlejam4.p052.A.java googlejam4_src/10\googlejam10.p195.TaskA.java -1 249 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/1\googlejam1.p177.A.java -1 250 | googlejam4_src/9\googlejam9.p012.Main.java googlejam4_src/8\googlejam8.p378.Main.java -1 251 | googlejam4_src/3\googlejam3.p535.ASecondThird.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 252 | googlejam4_src/9\googlejam9.p142.RoundThreeProblemThree.java googlejam4_src/8\googlejam8.p018.CodeJamQuestion.java -1 253 | googlejam4_src/1\googlejam1.p839.CodeJamA.java googlejam4_src/1\googlejam1.p109.R1A.java 1 254 | googlejam4_src/1\googlejam1.p347.Mushroom.java googlejam4_src/8\googlejam8.p378.Main.java -1 255 | googlejam4_src/1\googlejam1.p198.A.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 256 | googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 257 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/8\googlejam8.p672.Senate.java -1 258 | googlejam4_src/3\googlejam3.p017.SolutionA.java googlejam4_src/1\googlejam1.p670.Main.java -1 259 | googlejam4_src/6\googlejam6.p587.GCJ2.java googlejam4_src/3\googlejam3.p340.R20151C_A.java -1 260 | googlejam4_src/2\googlejam2.p346.Cup2.java googlejam4_src/8\googlejam8.p179.CJ20161.java -1 261 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/3\googlejam3.p461.Brattleship.java 1 262 | googlejam4_src/6\googlejam6.p128.Rank.java googlejam4_src/6\googlejam6.p087.Round1B.java 1 263 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 264 | googlejam4_src/12\googlejam12.p019.TeachingAssistant.java googlejam4_src/1\googlejam1.p769.First.java -1 265 | googlejam4_src/1\googlejam1.p389.MainA.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 266 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/6\googlejam6.p473.Main.java 1 267 | googlejam4_src/9\googlejam9.p127.R1C_B_1.java googlejam4_src/6\googlejam6.p555.Rank_File.java -1 268 | googlejam4_src/3\googlejam3.p554.Q8.java googlejam4_src/6\googlejam6.p122.Main.java -1 269 | googlejam4_src/6\googlejam6.p435.RankandFile.java googlejam4_src/8\googlejam8.p378.Main.java -1 270 | googlejam4_src/6\googlejam6.p526.B_1A_RankAndFile.java googlejam4_src/6\googlejam6.p122.Main.java 1 271 | googlejam4_src/8\googlejam8.p498.MainClass.java googlejam4_src/6\googlejam6.p392.ProblemB.java -1 272 | googlejam4_src/2\googlejam2.p292.Main.java googlejam4_src/1\googlejam1.p504.Mushroom.java -1 273 | googlejam4_src/6\googlejam6.p482.RankAndFile.java googlejam4_src/3\googlejam3.p387.ProblemA.java -1 274 | googlejam4_src/1\googlejam1.p229.Mushroom.java googlejam4_src/6\googlejam6.p045.GCJ2016B.java -1 275 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 276 | googlejam4_src/8\googlejam8.p744.gpro.java googlejam4_src/6\googlejam6.p425.RankAndFile.java -1 277 | googlejam4_src/1\googlejam1.p504.Mushroom.java googlejam4_src/8\googlejam8.p845.codejam.java -1 278 | googlejam4_src/4\googlejam4.p176.A.java googlejam4_src/1\googlejam1.p422.P1.java -1 279 | googlejam4_src/6\googlejam6.p159.r1ab.java googlejam4_src/9\googlejam9.p026.B.java -1 280 | googlejam4_src/1\googlejam1.p352.Mushrooms.java googlejam4_src/8\googlejam8.p227.A.java -1 281 | googlejam4_src/2\googlejam2.p197.A.java googlejam4_src/1\googlejam1.p670.Main.java -1 282 | googlejam4_src/3\googlejam3.p076.A.java googlejam4_src/1\googlejam1.p467.P1.java -1 283 | googlejam4_src/3\googlejam3.p501.Battleship.java googlejam4_src/8\googlejam8.p613.prblmA.java -1 284 | googlejam4_src/11\googlejam11.p104.B.java googlejam4_src/1\googlejam1.p285.Main.java -1 285 | googlejam4_src/6\googlejam6.p703.Solution.java googlejam4_src/7\googlejam7.p296.Q2.java -1 286 | googlejam4_src/1\googlejam1.p363.a.java googlejam4_src/11\googlejam11.p065.RedTapeCommittee.java -1 287 | googlejam4_src/1\googlejam1.p347.Mushroom.java googlejam4_src/6\googlejam6.p489.ProblemB.java -1 288 | googlejam4_src/6\googlejam6.p587.GCJ2.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 289 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/2\googlejam2.p364.Main.java -1 290 | googlejam4_src/7\googlejam7.p271.B.java googlejam4_src/6\googlejam6.p386.B.java -1 291 | googlejam4_src/6\googlejam6.p326.BRank_File.java googlejam4_src/10\googlejam10.p195.TaskA.java -1 292 | googlejam4_src/1\googlejam1.p352.Mushrooms.java googlejam4_src/3\googlejam3.p095.A.java -1 293 | googlejam4_src/8\googlejam8.p179.CJ20161.java googlejam4_src/1\googlejam1.p670.Main.java -1 294 | googlejam4_src/2\googlejam2.p056.GoogleCodeJam.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 295 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/1\googlejam1.p134.A.java 1 296 | googlejam4_src/6\googlejam6.p587.GCJ2.java googlejam4_src/3\googlejam3.p518.test.java -1 297 | googlejam4_src/10\googlejam10.p067.RatherPerplexingShowdown.java googlejam4_src/1\googlejam1.p128.A.java -1 298 | googlejam4_src/3\googlejam3.p095.A.java googlejam4_src/1\googlejam1.p177.A.java -1 299 | googlejam4_src/6\googlejam6.p544.prblmB.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 300 | googlejam4_src/6\googlejam6.p128.Rank.java googlejam4_src/1\googlejam1.p313.A.java -1 301 | googlejam4_src/7\googlejam7.p179.CloseMatch.java googlejam4_src/3\googlejam3.p385.A.java -1 302 | googlejam4_src/1\googlejam1.p347.Mushroom.java googlejam4_src/1\googlejam1.p168.Main.java 1 303 | googlejam4_src/6\googlejam6.p290.Main.java googlejam4_src/3\googlejam3.p326.Solution.java -1 304 | googlejam4_src/3\googlejam3.p348.ca_2015.java googlejam4_src/1\googlejam1.p517.MushroomMonster.java -1 305 | googlejam4_src/2\googlejam2.p104.A.java googlejam4_src/1\googlejam1.p504.Mushroom.java -1 306 | googlejam4_src/6\googlejam6.p430.rankandfile.java googlejam4_src/1\googlejam1.p355.A.java -1 307 | googlejam4_src/7\googlejam7.p296.Q2.java googlejam4_src/11\googlejam11.p104.B.java -1 308 | googlejam4_src/1\googlejam1.p058.A.java googlejam4_src/1\googlejam1.p467.P1.java 1 309 | googlejam4_src/1\googlejam1.p839.CodeJamA.java googlejam4_src/2\googlejam2.p364.Main.java -1 310 | googlejam4_src/6\googlejam6.p317.B_RankAndFile.java googlejam4_src/1\googlejam1.p285.Main.java -1 311 | googlejam4_src/11\googlejam11.p128.ProblemB.java googlejam4_src/1\googlejam1.p825.A.java -1 312 | googlejam4_src/3\googlejam3.p478.A.java googlejam4_src/8\googlejam8.p500.A.java -1 313 | googlejam4_src/3\googlejam3.p017.SolutionA.java googlejam4_src/1\googlejam1.p355.A.java -1 314 | googlejam4_src/8\googlejam8.p754.A.java googlejam4_src/6\googlejam6.p433.Problem_B_Rank_and_File.java -1 315 | googlejam4_src/6\googlejam6.p539.RankAndFile.java googlejam4_src/2\googlejam2.p197.A.java -1 316 | googlejam4_src/1\googlejam1.p364.Q1.java googlejam4_src/6\googlejam6.p165.Rank.java -1 317 | googlejam4_src/3\googlejam3.p501.Battleship.java googlejam4_src/1\googlejam1.p177.A.java -1 318 | googlejam4_src/1\googlejam1.p352.Mushrooms.java googlejam4_src/1\googlejam1.p830.ProblemA.java 1 319 | googlejam4_src/8\googlejam8.p498.MainClass.java googlejam4_src/4\googlejam4.p161.A.java -1 320 | googlejam4_src/8\googlejam8.p498.MainClass.java googlejam4_src/3\googlejam3.p199.Sample.java -1 321 | googlejam4_src/3\googlejam3.p088.Solution.java googlejam4_src/6\googlejam6.p010.B.java -1 322 | googlejam4_src/1\googlejam1.p364.Q1.java googlejam4_src/3\googlejam3.p387.ProblemA.java -1 323 | googlejam4_src/2\googlejam2.p346.Cup2.java googlejam4_src/1\googlejam1.p291.A.java -1 324 | googlejam4_src/1\googlejam1.p402.a.java googlejam4_src/1\googlejam1.p720.Mushrooms.java 1 325 | googlejam4_src/1\googlejam1.p620.MushroomMonster.java googlejam4_src/11\googlejam11.p128.ProblemB.java -1 326 | googlejam4_src/8\googlejam8.p509.Main.java googlejam4_src/1\googlejam1.p830.ProblemA.java -1 327 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java 1 328 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java 1 329 | googlejam4_src/3\googlejam3.p150.Battleship.java googlejam4_src/1\googlejam1.p670.Main.java -1 330 | googlejam4_src/3\googlejam3.p544.Main.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 331 | googlejam4_src/3\googlejam3.p348.ca_2015.java googlejam4_src/3\googlejam3.p501.Battleship.java 1 332 | googlejam4_src/9\googlejam9.p012.Main.java googlejam4_src/8\googlejam8.p179.CJ20161.java -1 333 | googlejam4_src/3\googlejam3.p535.ASecondThird.java googlejam4_src/8\googlejam8.p601.A.java -1 334 | googlejam4_src/6\googlejam6.p539.RankAndFile.java googlejam4_src/6\googlejam6.p122.Main.java 1 335 | googlejam4_src/4\googlejam4.p096.Pegman.java googlejam4_src/3\googlejam3.p511.Brattleship.java -1 336 | googlejam4_src/3\googlejam3.p256.ProblemA.java googlejam4_src/1\googlejam1.p355.A.java -1 337 | googlejam4_src/1\googlejam1.p467.P1.java googlejam4_src/6\googlejam6.p496.Bsmall.java -1 338 | googlejam4_src/6\googlejam6.p386.B.java googlejam4_src/6\googlejam6.p608.Solder.java 1 339 | googlejam4_src/6\googlejam6.p159.r1ab.java googlejam4_src/3\googlejam3.p482.R1cA.java -1 340 | googlejam4_src/2\googlejam2.p346.Cup2.java googlejam4_src/6\googlejam6.p024.GCJ.java -1 341 | googlejam4_src/8\googlejam8.p427.Codejam.java googlejam4_src/6\googlejam6.p145.ProblemB.java -1 342 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/6\googlejam6.p555.Rank_File.java -1 343 | googlejam4_src/7\googlejam7.p301.CloseMatch.java googlejam4_src/9\googlejam9.p127.R1C_B_1.java -1 344 | googlejam4_src/1\googlejam1.p484.App.java googlejam4_src/6\googlejam6.p756.RankFile.java -1 345 | googlejam4_src/1\googlejam1.p134.A.java googlejam4_src/1\googlejam1.p198.A.java 1 346 | googlejam4_src/9\googlejam9.p070.B.java googlejam4_src/1\googlejam1.p153.Main.java -1 347 | googlejam4_src/6\googlejam6.p010.B.java googlejam4_src/1\googlejam1.p337.Solution.java -1 348 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/6\googlejam6.p392.ProblemB.java 1 349 | googlejam4_src/6\googlejam6.p087.Round1B.java googlejam4_src/8\googlejam8.p058.Senate.java -1 350 | googlejam4_src/6\googlejam6.p392.ProblemB.java googlejam4_src/6\googlejam6.p425.RankAndFile.java 1 351 | googlejam4_src/2\googlejam2.p104.A.java googlejam4_src/3\googlejam3.p128.A.java -1 352 | googlejam4_src/3\googlejam3.p501.Battleship.java googlejam4_src/10\googlejam10.p195.TaskA.java -1 353 | googlejam4_src/2\googlejam2.p056.GoogleCodeJam.java googlejam4_src/1\googlejam1.p422.P1.java -1 354 | googlejam4_src/6\googlejam6.p362.BB.java googlejam4_src/1\googlejam1.p168.Main.java -1 355 | googlejam4_src/6\googlejam6.p544.prblmB.java googlejam4_src/6\googlejam6.p395.Solution.java 1 356 | googlejam4_src/6\googlejam6.p482.RankAndFile.java googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java -1 357 | googlejam4_src/2\googlejam2.p104.A.java googlejam4_src/1\googlejam1.p670.Main.java -1 358 | googlejam4_src/6\googlejam6.p435.RankandFile.java googlejam4_src/3\googlejam3.p312.A.java -1 359 | googlejam4_src/7\googlejam7.p179.CloseMatch.java googlejam4_src/1\googlejam1.p135.MushroomMaster.java -1 360 | googlejam4_src/3\googlejam3.p348.ca_2015.java googlejam4_src/9\googlejam9.p026.B.java -1 361 | googlejam4_src/1\googlejam1.p504.Mushroom.java googlejam4_src/1\googlejam1.p363.a.java 1 362 | googlejam4_src/1\googlejam1.p062.Main.java googlejam4_src/8\googlejam8.p845.codejam.java -1 363 | googlejam4_src/6\googlejam6.p473.Main.java googlejam4_src/1\googlejam1.p504.Mushroom.java -1 364 | googlejam4_src/3\googlejam3.p478.A.java googlejam4_src/6\googlejam6.p654.Prob1B.java -1 365 | googlejam4_src/6\googlejam6.p109.B.java googlejam4_src/9\googlejam9.p142.RoundThreeProblemThree.java -1 366 | googlejam4_src/6\googlejam6.p010.B.java googlejam4_src/1\googlejam1.p270.MushroomMonster.java -1 367 | googlejam4_src/8\googlejam8.p427.Codejam.java googlejam4_src/3\googlejam3.p385.A.java -1 368 | googlejam4_src/1\googlejam1.p153.Main.java googlejam4_src/6\googlejam6.p290.Main.java -1 369 | googlejam4_src/6\googlejam6.p526.B_1A_RankAndFile.java googlejam4_src/3\googlejam3.p326.Solution.java -1 370 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/2\googlejam2.p197.A.java -1 371 | googlejam4_src/10\googlejam10.p189.A.java googlejam4_src/3\googlejam3.p076.A.java -1 372 | googlejam4_src/6\googlejam6.p145.ProblemB.java googlejam4_src/1\googlejam1.p769.First.java -1 373 | googlejam4_src/6\googlejam6.p526.B_1A_RankAndFile.java googlejam4_src/3\googlejam3.p340.R20151C_A.java -1 374 | googlejam4_src/6\googlejam6.p165.Rank.java googlejam4_src/1\googlejam1.p337.Solution.java -1 375 | googlejam4_src/1\googlejam1.p364.Q1.java googlejam4_src/1\googlejam1.p041.A.java 1 376 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/6\googlejam6.p045.GCJ2016B.java -1 377 | googlejam4_src/1\googlejam1.p484.App.java googlejam4_src/9\googlejam9.p059.slides.java -1 378 | googlejam4_src/3\googlejam3.p150.Battleship.java googlejam4_src/4\googlejam4.p176.A.java -1 379 | googlejam4_src/1\googlejam1.p352.Mushrooms.java googlejam4_src/3\googlejam3.p256.ProblemA.java -1 380 | googlejam4_src/7\googlejam7.p271.B.java googlejam4_src/8\googlejam8.p227.A.java -1 381 | googlejam4_src/2\googlejam2.p364.Main.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 382 | googlejam4_src/2\googlejam2.p056.GoogleCodeJam.java googlejam4_src/1\googlejam1.p285.Main.java -1 383 | googlejam4_src/1\googlejam1.p285.Main.java googlejam4_src/6\googlejam6.p430.rankandfile.java -1 384 | googlejam4_src/1\googlejam1.p347.Mushroom.java googlejam4_src/3\googlejam3.p312.A.java -1 385 | googlejam4_src/6\googlejam6.p087.Round1B.java googlejam4_src/6\googlejam6.p496.Bsmall.java 1 386 | googlejam4_src/2\googlejam2.p364.Main.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 387 | googlejam4_src/11\googlejam11.p128.ProblemB.java googlejam4_src/1\googlejam1.p337.Solution.java -1 388 | googlejam4_src/6\googlejam6.p317.B_RankAndFile.java googlejam4_src/4\googlejam4.p052.A.java -1 389 | googlejam4_src/8\googlejam8.p754.A.java googlejam4_src/3\googlejam3.p385.A.java -1 390 | googlejam4_src/6\googlejam6.p756.RankFile.java googlejam4_src/6\googlejam6.p555.Rank_File.java 1 391 | googlejam4_src/9\googlejam9.p070.B.java googlejam4_src/3\googlejam3.p017.SolutionA.java -1 392 | googlejam4_src/6\googlejam6.p756.RankFile.java googlejam4_src/3\googlejam3.p385.A.java -1 393 | googlejam4_src/6\googlejam6.p010.B.java googlejam4_src/2\googlejam2.p368.Round1BA.java -1 394 | googlejam4_src/6\googlejam6.p317.B_RankAndFile.java googlejam4_src/1\googlejam1.p177.A.java -1 395 | googlejam4_src/3\googlejam3.p461.Brattleship.java googlejam4_src/6\googlejam6.p496.Bsmall.java -1 396 | googlejam4_src/6\googlejam6.p425.RankAndFile.java googlejam4_src/6\googlejam6.p404.B.java 1 397 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/6\googlejam6.p386.B.java -1 398 | googlejam4_src/6\googlejam6.p386.B.java googlejam4_src/8\googlejam8.p672.Senate.java -1 399 | googlejam4_src/1\googlejam1.p092.Mushroom.java googlejam4_src/8\googlejam8.p879.codejam3.java -1 400 | googlejam4_src/3\googlejam3.p482.R1cA.java googlejam4_src/3\googlejam3.p385.A.java 1 401 | googlejam4_src/2\googlejam2.p104.A.java googlejam4_src/1\googlejam1.p291.A.java -1 402 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/11\googlejam11.p104.B.java -1 403 | googlejam4_src/9\googlejam9.p070.B.java googlejam4_src/1\googlejam1.p270.MushroomMonster.java -1 404 | googlejam4_src/8\googlejam8.p427.Codejam.java googlejam4_src/6\googlejam6.p544.prblmB.java -1 405 | googlejam4_src/10\googlejam10.p189.A.java googlejam4_src/1\googlejam1.p198.A.java -1 406 | googlejam4_src/6\googlejam6.p539.RankAndFile.java googlejam4_src/6\googlejam6.p756.RankFile.java 1 407 | googlejam4_src/11\googlejam11.p139.Main_Round2_2016_B.java googlejam4_src/4\googlejam4.p161.A.java -1 408 | googlejam4_src/1\googlejam1.p168.Main.java googlejam4_src/6\googlejam6.p026.B.java -1 409 | googlejam4_src/1\googlejam1.p313.A.java googlejam4_src/6\googlejam6.p290.Main.java -1 410 | googlejam4_src/2\googlejam2.p104.A.java googlejam4_src/6\googlejam6.p109.B.java -1 411 | googlejam4_src/1\googlejam1.p352.Mushrooms.java googlejam4_src/8\googlejam8.p879.codejam3.java -1 412 | googlejam4_src/6\googlejam6.p392.ProblemB.java googlejam4_src/1\googlejam1.p128.A.java -1 413 | googlejam4_src/12\googlejam12.p019.TeachingAssistant.java googlejam4_src/6\googlejam6.p756.RankFile.java -1 414 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/1\googlejam1.p363.a.java 1 415 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/1\googlejam1.p363.a.java 1 416 | googlejam4_src/1\googlejam1.p825.A.java googlejam4_src/3\googlejam3.p518.test.java -1 417 | googlejam4_src/1\googlejam1.p517.MushroomMonster.java googlejam4_src/1\googlejam1.p402.a.java 1 418 | googlejam4_src/3\googlejam3.p387.ProblemA.java googlejam4_src/2\googlejam2.p197.A.java -1 419 | googlejam4_src/8\googlejam8.p744.gpro.java googlejam4_src/1\googlejam1.p484.App.java -1 420 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/11\googlejam11.p104.B.java -1 421 | googlejam4_src/6\googlejam6.p165.Rank.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 422 | googlejam4_src/1\googlejam1.p041.A.java googlejam4_src/6\googlejam6.p489.ProblemB.java -1 423 | googlejam4_src/3\googlejam3.p312.A.java googlejam4_src/6\googlejam6.p756.RankFile.java -1 424 | googlejam4_src/6\googlejam6.p435.RankandFile.java googlejam4_src/1\googlejam1.p270.MushroomMonster.java -1 425 | googlejam4_src/2\googlejam2.p056.GoogleCodeJam.java googlejam4_src/6\googlejam6.p386.B.java -1 426 | googlejam4_src/3\googlejam3.p544.Main.java googlejam4_src/8\googlejam8.p227.A.java -1 427 | googlejam4_src/2\googlejam2.p346.Cup2.java googlejam4_src/1\googlejam1.p198.A.java -1 428 | googlejam4_src/9\googlejam9.p012.Main.java googlejam4_src/6\googlejam6.p045.GCJ2016B.java -1 429 | googlejam4_src/3\googlejam3.p088.Solution.java googlejam4_src/3\googlejam3.p511.Brattleship.java 1 430 | googlejam4_src/1\googlejam1.p059.A.java googlejam4_src/1\googlejam1.p355.A.java 1 431 | googlejam4_src/3\googlejam3.p256.ProblemA.java googlejam4_src/3\googlejam3.p385.A.java 1 432 | googlejam4_src/1\googlejam1.p285.Main.java googlejam4_src/6\googlejam6.p395.Solution.java -1 433 | googlejam4_src/6\googlejam6.p539.RankAndFile.java googlejam4_src/1\googlejam1.p337.Solution.java -1 434 | googlejam4_src/9\googlejam9.p012.Main.java googlejam4_src/8\googlejam8.p845.codejam.java -1 435 | googlejam4_src/2\googlejam2.p056.GoogleCodeJam.java googlejam4_src/7\googlejam7.p179.CloseMatch.java -1 436 | googlejam4_src/7\googlejam7.p271.B.java googlejam4_src/6\googlejam6.p010.B.java -1 437 | googlejam4_src/8\googlejam8.p500.A.java googlejam4_src/6\googlejam6.p404.B.java -1 438 | googlejam4_src/1\googlejam1.p292.Problem1.java googlejam4_src/8\googlejam8.p823.A.java -1 439 | googlejam4_src/1\googlejam1.p422.P1.java googlejam4_src/6\googlejam6.p457.RankAndFile.java -1 440 | googlejam4_src/1\googlejam1.p839.CodeJamA.java googlejam4_src/1\googlejam1.p402.a.java 1 441 | googlejam4_src/1\googlejam1.p484.App.java googlejam4_src/10\googlejam10.p195.TaskA.java -1 442 | googlejam4_src/8\googlejam8.p427.Codejam.java googlejam4_src/1\googlejam1.p198.A.java -1 443 | googlejam4_src/3\googlejam3.p340.R20151C_A.java googlejam4_src/1\googlejam1.p355.A.java -1 444 | googlejam4_src/7\googlejam7.p271.B.java googlejam4_src/1\googlejam1.p025.ProblemA.java -1 445 | googlejam4_src/11\googlejam11.p139.Main_Round2_2016_B.java googlejam4_src/6\googlejam6.p386.B.java -1 446 | googlejam4_src/6\googlejam6.p024.GCJ.java googlejam4_src/1\googlejam1.p198.A.java -1 447 | googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java googlejam4_src/6\googlejam6.p496.Bsmall.java -1 448 | googlejam4_src/6\googlejam6.p386.B.java googlejam4_src/3\googlejam3.p387.ProblemA.java -1 449 | googlejam4_src/6\googlejam6.p435.RankandFile.java googlejam4_src/2\googlejam2.p292.Main.java -1 450 | googlejam4_src/1\googlejam1.p389.MainA.java googlejam4_src/11\googlejam11.p065.RedTapeCommittee.java -1 451 | googlejam4_src/2\googlejam2.p104.A.java googlejam4_src/1\googlejam1.p479.CodeJam2015Round1A.java -1 452 | googlejam4_src/3\googlejam3.p199.Sample.java googlejam4_src/6\googlejam6.p608.Solder.java -1 453 | googlejam4_src/6\googlejam6.p528.Rank.java googlejam4_src/3\googlejam3.p001.A.java -1 454 | googlejam4_src/10\googlejam10.p067.RatherPerplexingShowdown.java googlejam4_src/3\googlejam3.p385.A.java -1 455 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/6\googlejam6.p040.B.java 1 456 | googlejam4_src/3\googlejam3.p461.Brattleship.java googlejam4_src/6\googlejam6.p756.RankFile.java -1 457 | googlejam4_src/1\googlejam1.p058.A.java googlejam4_src/3\googlejam3.p535.ASecondThird.java -1 458 | googlejam4_src/8\googlejam8.p744.gpro.java googlejam4_src/1\googlejam1.p720.Mushrooms.java -1 459 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/1\googlejam1.p135.MushroomMaster.java 1 460 | googlejam4_src/1\googlejam1.p313.A.java googlejam4_src/8\googlejam8.p879.codejam3.java -1 461 | googlejam4_src/6\googlejam6.p608.Solder.java googlejam4_src/1\googlejam1.p177.A.java -1 462 | googlejam4_src/11\googlejam11.p139.Main_Round2_2016_B.java googlejam4_src/6\googlejam6.p608.Solder.java -1 463 | googlejam4_src/9\googlejam9.p012.Main.java googlejam4_src/3\googlejam3.p544.Main.java -1 464 | googlejam4_src/11\googlejam11.p104.B.java googlejam4_src/6\googlejam6.p539.RankAndFile.java -1 465 | googlejam4_src/6\googlejam6.p473.Main.java googlejam4_src/6\googlejam6.p544.prblmB.java 1 466 | googlejam4_src/7\googlejam7.p179.CloseMatch.java googlejam4_src/3\googlejam3.p195.A.java -1 467 | googlejam4_src/8\googlejam8.p058.Senate.java googlejam4_src/3\googlejam3.p461.Brattleship.java -1 468 | googlejam4_src/6\googlejam6.p317.B_RankAndFile.java googlejam4_src/1\googlejam1.p041.A.java -1 469 | googlejam4_src/1\googlejam1.p285.Main.java googlejam4_src/9\googlejam9.p209.GCJR1B.java -1 470 | googlejam4_src/6\googlejam6.p482.RankAndFile.java googlejam4_src/1\googlejam1.p467.P1.java -1 471 | googlejam4_src/10\googlejam10.p067.RatherPerplexingShowdown.java googlejam4_src/8\googlejam8.p879.codejam3.java -1 472 | googlejam4_src/1\googlejam1.p292.Problem1.java googlejam4_src/6\googlejam6.p045.GCJ2016B.java -1 473 | googlejam4_src/1\googlejam1.p058.A.java googlejam4_src/6\googlejam6.p555.Rank_File.java -1 474 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/6\googlejam6.p087.Round1B.java 1 475 | googlejam4_src/3\googlejam3.p095.A.java googlejam4_src/11\googlejam11.p065.RedTapeCommittee.java -1 476 | googlejam4_src/6\googlejam6.p087.Round1B.java googlejam4_src/3\googlejam3.p017.SolutionA.java -1 477 | googlejam4_src/8\googlejam8.p265.A_1C.java googlejam4_src/8\googlejam8.p500.A.java 1 478 | googlejam4_src/6\googlejam6.p526.B_1A_RankAndFile.java googlejam4_src/3\googlejam3.p554.Q8.java -1 479 | googlejam4_src/6\googlejam6.p362.BB.java googlejam4_src/2\googlejam2.p368.Round1BA.java -1 480 | googlejam4_src/3\googlejam3.p511.Brattleship.java googlejam4_src/8\googlejam8.p227.A.java -1 481 | googlejam4_src/1\googlejam1.p389.MainA.java googlejam4_src/6\googlejam6.p010.B.java -1 482 | googlejam4_src/1\googlejam1.p347.Mushroom.java googlejam4_src/3\googlejam3.p017.SolutionA.java -1 483 | googlejam4_src/6\googlejam6.p654.Prob1B.java googlejam4_src/1\googlejam1.p270.MushroomMonster.java -1 484 | googlejam4_src/8\googlejam8.p744.gpro.java googlejam4_src/8\googlejam8.p378.Main.java 1 485 | googlejam4_src/8\googlejam8.p498.MainClass.java googlejam4_src/8\googlejam8.p058.Senate.java 1 486 | googlejam4_src/3\googlejam3.p501.Battleship.java googlejam4_src/1\googlejam1.p041.A.java -1 487 | googlejam4_src/3\googlejam3.p195.A.java googlejam4_src/6\googlejam6.p496.Bsmall.java -1 488 | googlejam4_src/8\googlejam8.p058.Senate.java googlejam4_src/7\googlejam7.p301.CloseMatch.java -1 489 | googlejam4_src/6\googlejam6.p686.Main.java googlejam4_src/6\googlejam6.p435.RankandFile.java 1 490 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/1\googlejam1.p058.A.java 1 491 | googlejam4_src/8\googlejam8.p269.A.java googlejam4_src/3\googlejam3.p312.A.java -1 492 | googlejam4_src/1\googlejam1.p050.A.java googlejam4_src/3\googlejam3.p518.test.java -1 493 | googlejam4_src/1\googlejam1.p519.A.java googlejam4_src/8\googlejam8.p265.A_1C.java -1 494 | googlejam4_src/1\googlejam1.p092.Mushroom.java googlejam4_src/7\googlejam7.p296.Q2.java -1 495 | googlejam4_src/1\googlejam1.p291.A.java googlejam4_src/6\googlejam6.p010.B.java -1 496 | googlejam4_src/6\googlejam6.p392.ProblemB.java googlejam4_src/3\googlejam3.p199.Sample.java -1 497 | googlejam4_src/3\googlejam3.p312.A.java googlejam4_src/3\googlejam3.p256.ProblemA.java 1 498 | googlejam4_src/4\googlejam4.p176.A.java googlejam4_src/6\googlejam6.p040.B.java -1 499 | googlejam4_src/2\googlejam2.p292.Main.java googlejam4_src/2\googlejam2.p364.Main.java 1 500 | googlejam4_src/2\googlejam2.p346.Cup2.java googlejam4_src/6\googlejam6.p317.B_RankAndFile.java -1 501 | -------------------------------------------------------------------------------- /visualize_bcb.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | from torch.autograd import Variable 7 | import torch.optim as optim 8 | import numpy as np 9 | import time 10 | import sys 11 | import argparse 12 | from tqdm import tqdm, trange 13 | import pycparser 14 | from createclone_bcb import createast,creategmndata,createseparategraph 15 | import models 16 | from torch_geometric.data import Data, DataLoader 17 | 18 | parser = argparse.ArgumentParser() 19 | parser.add_argument("--cuda", default=True) 20 | parser.add_argument("--dataset", default='gcj') 21 | parser.add_argument("--graphmode", default='astandnext') 22 | parser.add_argument("--nextsib", default=False) 23 | parser.add_argument("--ifedge", default=False) 24 | parser.add_argument("--whileedge", default=False) 25 | parser.add_argument("--foredge", default=False) 26 | parser.add_argument("--blockedge", default=False) 27 | parser.add_argument("--nexttoken", default=False) 28 | parser.add_argument("--nextuse", default=False) 29 | parser.add_argument("--data_setting", default='11') 30 | parser.add_argument("--batch_size", default=32) 31 | parser.add_argument("--num_layers", default=4) 32 | parser.add_argument("--num_epochs", default=4) 33 | parser.add_argument("--lr", default=0.001) 34 | parser.add_argument("--threshold", default=0) 35 | args = parser.parse_args() 36 | 37 | device=torch.device('cuda:0') 38 | #device=torch.device('cpu') 39 | astdict,vocablen,vocabdict=createast() 40 | treedict=createseparategraph(astdict, vocablen, vocabdict,device,mode=args.graphmode,nextsib=args.nextsib,ifedge=args.ifedge,whileedge=args.whileedge,foredge=args.foredge,blockedge=args.blockedge,nexttoken=args.nexttoken,nextuse=args.nextuse) 41 | traindata,validdata,testdata=creategmndata(args.data_setting,treedict,vocablen,vocabdict,device) 42 | print(len(traindata)) 43 | #trainloder=DataLoader(traindata,batch_size=1) 44 | num_layers=int(args.num_layers) 45 | model=models.GMNnet(vocablen,embedding_dim=100,num_layers=num_layers,device=device).to(device) 46 | optimizer = optim.Adam(model.parameters(), lr=args.lr) 47 | criterion=nn.CosineEmbeddingLoss() 48 | criterion2=nn.MSELoss() 49 | #model=torch.load('bcbresult/astandnext_epoch_2').to(device) 50 | #testsample=testdata[113] 51 | #print(testsample[1]) 52 | #data=testsample[0] 53 | #label=testsample[1] 54 | #quit() 55 | def visualize(data,label,mode=''): 56 | label=torch.tensor(label, dtype=torch.float, device=device) 57 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 58 | x1=torch.tensor(x1, dtype=torch.long, device=device) 59 | x2=torch.tensor(x2, dtype=torch.long, device=device) 60 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 61 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 62 | if edge_attr1!=None: 63 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 64 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 65 | data=[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 66 | prediction=model.forward(data,mode=mode) 67 | output=F.cosine_similarity(prediction[0],prediction[1]) 68 | prediction = torch.sign(output).item() 69 | print(output) 70 | '''visualize(data,label) 71 | a1=torch.load('attns/a1') 72 | print(a1) 73 | quit()''' 74 | vset=[testdata[41],testdata[81],testdata[113],testdata[115],testdata[131]] 75 | '''for data,label in vset: 76 | print(label) 77 | visualize(data,label) 78 | quit()''' 79 | 80 | def create_batches(data): 81 | #random.shuffle(data) 82 | batches = [data[graph:graph+args.batch_size] for graph in range(0, len(data), args.batch_size)] 83 | return batches 84 | 85 | def test(dataset): 86 | #model.eval() 87 | count=0 88 | correct=0 89 | tp = 0 90 | tn = 0 91 | fp = 0 92 | fn = 0 93 | results=[] 94 | for data,label in dataset: 95 | label=torch.tensor(label, dtype=torch.float, device=device) 96 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 97 | x1=torch.tensor(x1, dtype=torch.long, device=device) 98 | x2=torch.tensor(x2, dtype=torch.long, device=device) 99 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 100 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 101 | if edge_attr1!=None: 102 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 103 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 104 | data=[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 105 | prediction=model(data) 106 | output=F.cosine_similarity(prediction[0],prediction[1]) 107 | results.append(output.item()) 108 | prediction = torch.sign(output).item() 109 | 110 | if prediction>args.threshold and label.item()==1: 111 | tp+=1 112 | #print('tp') 113 | if prediction<=args.threshold and label.item()==-1: 114 | tn+=1 115 | #print('tn') 116 | if prediction>args.threshold and label.item()==-1: 117 | fp+=1 118 | #print('fp') 119 | if prediction<=args.threshold and label.item()==1: 120 | fn+=1 121 | #print('fn') 122 | print(tp,tn,fp,fn) 123 | p=0.0 124 | r=0.0 125 | f1=0.0 126 | if tp+fp==0: 127 | print('precision is none') 128 | return 129 | p=tp/(tp+fp) 130 | if tp+fn==0: 131 | print('recall is none') 132 | return 133 | r=tp/(tp+fn) 134 | f1=2*p*r/(p+r) 135 | print('precision') 136 | print(p) 137 | print('recall') 138 | print(r) 139 | print('F1') 140 | print(f1) 141 | return results 142 | epochs = trange(args.num_epochs, leave=True, desc = "Epoch") 143 | for epoch in epochs:# without batching 144 | print('epoch: ',epoch) 145 | batches=create_batches(traindata) 146 | totalloss=0.0 147 | main_index=0.0 148 | for index, batch in tqdm(enumerate(batches), total=len(batches), desc = "Batches"): 149 | optimizer.zero_grad() 150 | batchloss= 0 151 | for data,label in batch: 152 | label=torch.tensor(label, dtype=torch.float, device=device) 153 | x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2=data 154 | x1=torch.tensor(x1, dtype=torch.long, device=device) 155 | x2=torch.tensor(x2, dtype=torch.long, device=device) 156 | edge_index1=torch.tensor(edge_index1, dtype=torch.long, device=device) 157 | edge_index2=torch.tensor(edge_index2, dtype=torch.long, device=device) 158 | if edge_attr1!=None: 159 | edge_attr1=torch.tensor(edge_attr1, dtype=torch.long, device=device) 160 | edge_attr2=torch.tensor(edge_attr2, dtype=torch.long, device=device) 161 | data=[x1, x2, edge_index1, edge_index2, edge_attr1, edge_attr2] 162 | prediction=model(data) 163 | #batchloss=batchloss+criterion(prediction[0],prediction[1],label) 164 | cossim=F.cosine_similarity(prediction[0],prediction[1]) 165 | batchloss=batchloss+criterion2(cossim,label) 166 | batchloss.backward(retain_graph=True) 167 | optimizer.step() 168 | loss = batchloss.item() 169 | totalloss+=loss 170 | main_index = main_index + len(batch) 171 | loss=totalloss/main_index 172 | epochs.set_description("Epoch (Loss=%g)" % round(loss,5)) 173 | vcount=0 174 | for data, label in vset: 175 | mode='epoch'+str(epoch)+'_'+str(vcount) 176 | vcount+=1 177 | print(label) 178 | visualize(data, label,mode=mode) 179 | 180 | '''for batch in trainloder: 181 | batch=batch.to(device) 182 | print(batch) 183 | quit() 184 | time_start=time.time() 185 | model.forward(batch) 186 | time_end=time.time() 187 | print(time_end-time_start) 188 | quit()''' 189 | --------------------------------------------------------------------------------