diff convert_graph.py @ 0:fe01a054a6b2 draft

Uploaded
author bernhardlutz
date Fri, 28 Feb 2014 08:57:44 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convert_graph.py	Fri Feb 28 08:57:44 2014 -0500
@@ -0,0 +1,129 @@
+#!/usr/bin/env python
+# Aufruf convert_graph.py --infile datei --informat typ --outfile ausgabedatei --outformat ausgabetyp
+
+import sys, os
+import networkx as nx
+import argparse
+import json
+
+from xgmml_networkx import XGMMLParserHelper, XGMMLWriter
+from networkx.readwrite import json_graph
+
+#supported graph_types
+graph_types = ["gml", "yaml", "gspan", "xgmml", "gexf", "graphml", "json", "pajek"]
+
+func_dic_read= {'gml': nx.read_gml, 'yaml':nx.read_yaml, 'gexf': nx.read_gexf,
+    'graphml': nx.read_graphml, 'pajek': nx.read_pajek}
+    
+func_dic_write= {'gml': nx.write_gml, 'yaml':nx.write_yaml, 'gexf': nx.write_gexf,
+    'graphml': nx.write_graphml, 'pajek': nx.write_pajek}
+
+#completely supported types by networkx
+completely_supported_types = ["gml", "gexf", "yaml", "graphml", "pajek"]
+
+def read_gspan(infile):
+    G = nx.Graph()
+    idoffset=0
+    old_id_start=0
+    for line in infile:
+        line_split=line.split(" ")
+        if line[0] == "v":
+            G.add_node(idoffset, label=line_split[2].strip())
+            idoffset+=1
+        elif line[0] == "e":
+            G.add_edge(old_id_start+int(line_split[1]), old_id_start+int(line_split[2]), label=line_split[3].strip())
+        elif line[0] == "t":
+        # its a new subgraph
+            #idoffset*=1
+            old_id_start=idoffset
+    #print(nx.is_connected(G))
+    return G
+    
+
+def write_gspan(graph, outfile):
+    # get all subgraphs only works with undirected
+    subgraphs=nx.connected_components(graph.to_undirected())
+    id_count=1
+    node_count=0
+    #get labels
+    label_dic=nx.get_node_attributes(graph,'label')
+    for s in subgraphs:
+        node_count_tree=0
+        node_dict={}
+        outfile.write("t # id "+str(id_count)+"\n")
+        # for every node in subgraph
+        for v in sorted(s):
+        # node id restart from 0 for every sub graph
+            node_dict[v]=node_count_tree
+            outfile.write("v "+str(node_count_tree)+" "+label_dic[v]+" \n")
+            node_count_tree+=1
+            node_count+=1
+            
+        # all edges adjacent to a node of s
+        edges=nx.edges(graph, s)
+        for e in sorted(edges):
+            #print(graph[e[0]][e[1]])
+            outfile.write("e "+str(node_dict[e[0]])+" "+str(node_dict[e[1]])+" "+graph[e[0]][e[1]]['label']+"\n")
+            
+        id_count+=1
+def read_json(file):
+    json_string=file.read()
+    print(json_string)
+    json_dict=json.loads(json_string)
+    print(json_dict)
+    return nx.Graph()
+    
+def write_json(graph, outfile):
+    json_dict=json_graph.node_link_data(graph)
+    json_string=json.dumbs(json_dict)
+    outfile.write(json_string)
+    print("did it")
+    
+def main( args ):
+
+    if args.informat not in graph_types:
+        print "EXCEPTION COMPUTER EXPLODING"
+    # everything networkx can do by itself ;)
+    elif args.informat in completely_supported_types:
+        function = func_dic_read[args.informat]
+        graph = function(args.infile)
+    elif args.informat == "gspan":
+        graph = read_gspan(args.infile)
+    elif args.informat == "json":
+        graph = read_json(args.infile)
+    elif args.informat == "xgmml":
+        xgmml=XGMMLParserHelper()
+        xgmml.parseFile(args.infile)
+        graph=xgmml.graph()
+
+
+
+    if args.outformat in completely_supported_types:
+        function = func_dic_write[args.outformat]
+        function(graph, args.outfile)
+    elif args.outformat == "gspan":
+        write_gspan(graph, args.outfile)
+    elif args.outformat == "json":
+        write_json(graph, args.outfile)
+    elif args.outformat == "xgmml":  
+    #xgmml=XGMMLParserHelper(graph)
+    #xgmml.parseFile(open(sys.argv[1]))
+        a=XGMMLWriter(args.outfile, graph, "MyGraph")
+    
+if __name__ == "__main__":
+    
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--infile', type=argparse.FileType('r'),
+        help="Specify the input file representing a graph")
+    parser.add_argument('--outfile', type=argparse.FileType('w'),
+        help="Specify one output file")
+    parser.add_argument('--informat', type=str,
+        help="Specify the format of the input graph", choices = graph_types)
+    parser.add_argument('--outformat', type=str,
+        help="Specify the format of the output graph", choices = graph_types)
+    if len(sys.argv) < 8:
+        print "Too few arguments..."
+        parser.print_help()
+        exit(1)
+    args = parser.parse_args()
+    main( args )