Bläddra i källkod

add graphml2dimacs.py

jkunlin 8 år sedan
förälder
incheckning
5fbbc57634
1 ändrade filer med 105 tillägg och 0 borttagningar
  1. 105 0
      graphml2dimacs.py

+ 105 - 0
graphml2dimacs.py

@@ -0,0 +1,105 @@
+#!/usr/bin/python3.5
+import sys
+import re
+import xml.etree.ElementTree as ET
+
+ET.register_namespace('', "http://graphml.graphdrawing.org/xmlns")
+def get_namespace(element):
+  m = re.match('\{.*\}', element.tag)
+  return m.group(0) if m else ''
+
+adjacency_list = [[]]
+node_map = {}
+node_weight = [0]
+nodex_index = 1
+
+tree = ET.parse(sys.argv[1])
+namespace = get_namespace(tree.getroot())
+for elem in tree.iterfind(namespace + 'key[@attr.name="weight"]') :
+    weight_id = elem.attrib["id"]
+
+root = tree.find(namespace + "graph")
+for elem in root:
+    # get node
+    if elem.tag == namespace + 'node':
+        # print (elem.attrib['id'], " weight: ")
+        node_map[elem.attrib['id']] = nodex_index
+        while len(adjacency_list) < nodex_index:
+            adjacency_list.append([])
+        nodex_index += 1
+
+        # get weight
+        for sub_elem in elem:
+            # print (sub_elem.attrib['key'])
+            if sub_elem.attrib['key'] == weight_id:
+                # print (sub_elem.text)
+                node_weight.append(int(sub_elem.text))
+    # get edge
+    elif elem.tag == namespace + 'edge':
+        source_index = node_map[elem.attrib['source']]
+        target_index = node_map[elem.attrib['target']]
+        adjacency_list[source_index].append(target_index);
+        adjacency_list[target_index].append(source_index);
+
+# for i in range(0, len(node_weight)):
+#     print ("%s(%s) " % (i, node_weight[i]))
+
+# before mapp
+# nodex_index = 0
+# for node_list in adjacency_list:
+#     if (nodex_index == 0) :
+#         nodex_index = 1
+#         continue;
+#     print (nodex_index , end=' : ')
+#     for v in node_list:
+#         print (v, end=' ')
+#     print ()
+#     nodex_index += 1
+
+node_map.clear()
+new_node_index = 1
+nodex_index = 0
+for node_list in adjacency_list:
+    if (nodex_index == 0):
+        nodex_index = 1
+        continue
+    if (len(node_list) != 0):
+        node_map[nodex_index] = new_node_index
+        new_node_index += 1
+    nodex_index += 1
+
+# new node_weight
+new_node_weight = []
+node_index = 0
+for i in range(1, len(adjacency_list) - 1):
+    if (i in node_map):
+        if (len(new_node_weight) - 1 < node_map[i]):
+            new_node_weight.extend([0]*(node_map[i] + 1 - len(new_node_weight)))
+        new_node_weight[node_map[i]] = node_weight[i]
+
+# new graph
+node_count = new_node_index - 1
+edge_count = 0
+for node_list in adjacency_list:
+    edge_count += len(node_list)
+edge_count = (int)(edge_count / 2)
+print ("p edge %s %s" % (node_count, edge_count))
+for i in range(1, len(new_node_weight)):
+    print ("v %s %s" % (i, new_node_weight[i]))
+
+nodex_index = 0
+for node_list in adjacency_list:
+    if (nodex_index == 0):
+        nodex_index = 1
+        continue
+    if (len(node_list) == 0):
+        nodex_index += 1
+        continue
+
+    for v in node_list:
+        if (node_map[nodex_index] < node_map[v]):
+            print ("e %s %s" % (node_map[nodex_index], node_map[v]))
+    nodex_index += 1
+
+# for key in node_map:
+#     print ("%s -> %s" %(key, node_map[key]), end = ', ')