annotate convert_graph.py @ 0:fe01a054a6b2 draft

Uploaded
author bernhardlutz
date Fri, 28 Feb 2014 08:57:44 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
1 #!/usr/bin/env python
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
2 # Aufruf convert_graph.py --infile datei --informat typ --outfile ausgabedatei --outformat ausgabetyp
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
3
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
4 import sys, os
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
5 import networkx as nx
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
6 import argparse
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
7 import json
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
8
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
9 from xgmml_networkx import XGMMLParserHelper, XGMMLWriter
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
10 from networkx.readwrite import json_graph
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
11
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
12 #supported graph_types
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
13 graph_types = ["gml", "yaml", "gspan", "xgmml", "gexf", "graphml", "json", "pajek"]
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
14
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
15 func_dic_read= {'gml': nx.read_gml, 'yaml':nx.read_yaml, 'gexf': nx.read_gexf,
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
16 'graphml': nx.read_graphml, 'pajek': nx.read_pajek}
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
17
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
18 func_dic_write= {'gml': nx.write_gml, 'yaml':nx.write_yaml, 'gexf': nx.write_gexf,
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
19 'graphml': nx.write_graphml, 'pajek': nx.write_pajek}
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
20
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
21 #completely supported types by networkx
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
22 completely_supported_types = ["gml", "gexf", "yaml", "graphml", "pajek"]
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
23
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
24 def read_gspan(infile):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
25 G = nx.Graph()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
26 idoffset=0
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
27 old_id_start=0
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
28 for line in infile:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
29 line_split=line.split(" ")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
30 if line[0] == "v":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
31 G.add_node(idoffset, label=line_split[2].strip())
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
32 idoffset+=1
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
33 elif line[0] == "e":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
34 G.add_edge(old_id_start+int(line_split[1]), old_id_start+int(line_split[2]), label=line_split[3].strip())
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
35 elif line[0] == "t":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
36 # its a new subgraph
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
37 #idoffset*=1
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
38 old_id_start=idoffset
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
39 #print(nx.is_connected(G))
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
40 return G
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
41
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
42
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
43 def write_gspan(graph, outfile):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
44 # get all subgraphs only works with undirected
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
45 subgraphs=nx.connected_components(graph.to_undirected())
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
46 id_count=1
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
47 node_count=0
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
48 #get labels
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
49 label_dic=nx.get_node_attributes(graph,'label')
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
50 for s in subgraphs:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
51 node_count_tree=0
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
52 node_dict={}
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
53 outfile.write("t # id "+str(id_count)+"\n")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
54 # for every node in subgraph
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
55 for v in sorted(s):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
56 # node id restart from 0 for every sub graph
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
57 node_dict[v]=node_count_tree
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
58 outfile.write("v "+str(node_count_tree)+" "+label_dic[v]+" \n")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
59 node_count_tree+=1
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
60 node_count+=1
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
61
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
62 # all edges adjacent to a node of s
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
63 edges=nx.edges(graph, s)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
64 for e in sorted(edges):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
65 #print(graph[e[0]][e[1]])
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
66 outfile.write("e "+str(node_dict[e[0]])+" "+str(node_dict[e[1]])+" "+graph[e[0]][e[1]]['label']+"\n")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
67
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
68 id_count+=1
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
69 def read_json(file):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
70 json_string=file.read()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
71 print(json_string)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
72 json_dict=json.loads(json_string)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
73 print(json_dict)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
74 return nx.Graph()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
75
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
76 def write_json(graph, outfile):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
77 json_dict=json_graph.node_link_data(graph)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
78 json_string=json.dumbs(json_dict)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
79 outfile.write(json_string)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
80 print("did it")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
81
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
82 def main( args ):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
83
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
84 if args.informat not in graph_types:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
85 print "EXCEPTION COMPUTER EXPLODING"
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
86 # everything networkx can do by itself ;)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
87 elif args.informat in completely_supported_types:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
88 function = func_dic_read[args.informat]
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
89 graph = function(args.infile)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
90 elif args.informat == "gspan":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
91 graph = read_gspan(args.infile)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
92 elif args.informat == "json":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
93 graph = read_json(args.infile)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
94 elif args.informat == "xgmml":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
95 xgmml=XGMMLParserHelper()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
96 xgmml.parseFile(args.infile)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
97 graph=xgmml.graph()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
98
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
99
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
100
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
101 if args.outformat in completely_supported_types:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
102 function = func_dic_write[args.outformat]
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
103 function(graph, args.outfile)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
104 elif args.outformat == "gspan":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
105 write_gspan(graph, args.outfile)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
106 elif args.outformat == "json":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
107 write_json(graph, args.outfile)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
108 elif args.outformat == "xgmml":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
109 #xgmml=XGMMLParserHelper(graph)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
110 #xgmml.parseFile(open(sys.argv[1]))
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
111 a=XGMMLWriter(args.outfile, graph, "MyGraph")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
112
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
113 if __name__ == "__main__":
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
114
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
115 parser = argparse.ArgumentParser()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
116 parser.add_argument('--infile', type=argparse.FileType('r'),
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
117 help="Specify the input file representing a graph")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
118 parser.add_argument('--outfile', type=argparse.FileType('w'),
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
119 help="Specify one output file")
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
120 parser.add_argument('--informat', type=str,
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
121 help="Specify the format of the input graph", choices = graph_types)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
122 parser.add_argument('--outformat', type=str,
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
123 help="Specify the format of the output graph", choices = graph_types)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
124 if len(sys.argv) < 8:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
125 print "Too few arguments..."
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
126 parser.print_help()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
127 exit(1)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
128 args = parser.parse_args()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
129 main( args )