annotate xgmml_networkx.py @ 3:b7cdfd11614a draft default tip

Uploaded
author bernhardlutz
date Tue, 04 Mar 2014 16:50:32 -0500
parents fe01a054a6b2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
1 __author__ = "Yasunobu OKAMURA"
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
2 __copyright__ = "Copyright (c) 2012 Y.Okamura"
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
3 __license__ = "GPL v3+"
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
4
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
5 import xml.parsers.expat
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
6 import networkx as nx
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
7
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
8 class XGMMLParserHelper(object):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
9 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
10 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
11
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
12 def __init__(self, graph=nx.DiGraph()):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
13 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
14
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
15 Arguments:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
16 - `graph`: Network X graph object
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
17 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
18 self._graph = graph
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
19 self._parser = xml.parsers.expat.ParserCreate()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
20 self._parser.StartElementHandler = self._start_element
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
21 self._parser.EndElementHandler = self._end_element
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
22 self._tagstack = list()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
23
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
24 self._current_attr = dict()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
25 self._current_obj = dict()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
26
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
27 def _start_element(self, tag, attr):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
28 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
29
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
30 Arguments:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
31 - `self`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
32 - `tag`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
33 - `attr`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
34 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
35
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
36 self._tagstack.append(tag)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
37
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
38 if tag == 'node' or tag == 'edge':
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
39 self._current_obj = dict(attr)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
40
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
41 if tag == 'att' and (self._tagstack[-2] == 'node' or self._tagstack[-2] == 'edge'):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
42 if attr['type'] == 'string':
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
43 self._current_attr[attr['name']] = attr['value']
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
44 elif attr['type'] == 'real':
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
45 self._current_attr[attr['name']] = float(attr['value'])
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
46 elif attr['type'] == 'integer':
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
47 self._current_attr[attr['name']] = int(attr['value'])
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
48 elif attr['type'] == 'boolean':
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
49 self._current_attr[attr['name']] = bool(attr['value'])
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
50 else:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
51 raise NotImplementedError(attr['type'])
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
52
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
53 def _end_element(self, tag):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
54 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
55
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
56 Arguments:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
57 - `self`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
58 - `tag`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
59 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
60
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
61 if tag == 'node':
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
62 self._graph.add_node(self._current_obj['id'], label=self._current_obj['label'], **self._current_attr)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
63 #print 'add node', self._current_obj
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
64 elif tag == 'edge':
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
65 self._graph.add_edge(self._current_obj['source'], self._current_obj['target'], **self._current_attr)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
66
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
67 self._tagstack.pop()
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
68
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
69 def parseFile(self, file):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
70 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
71
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
72 Arguments:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
73 - `self`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
74 - `file`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
75 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
76
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
77 self._parser.ParseFile(file)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
78
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
79 def graph(self):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
80 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
81
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
82 Arguments:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
83 - `self`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
84 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
85
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
86 return self._graph
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
87
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
88 def XGMMLWriter(file, graph, graph_name):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
89 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
90
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
91 Arguments:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
92 - `graph`:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
93 """
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
94
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
95 print >>file, """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
96 <graph directed="1" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.cs.rpi.edu/XGMML">
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
97 <att name="selected" value="1" type="boolean" />
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
98 <att name="name" value="{0}" type="string"/>
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
99 <att name="shared name" value="{0}" type="string"/>
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
100 """.format(graph_name)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
101
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
102
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
103 for onenode in graph.nodes(data=True):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
104 id = onenode[0]
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
105 attr = dict(onenode[1])
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
106
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
107 if 'label' in attr:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
108 label = attr['label']
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
109 del attr['label']
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
110 else:
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
111 label = id
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
112
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
113 print >>file, '<node id="{id}" label="{label}">'.format(id=id, label=label)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
114 for k, v in attr.iteritems():
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
115 print >>file, '<att name="{}" value="{}" type="string" />'.format(k, v)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
116 print >>file, '</node>'
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
117
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
118 for oneedge in graph.edges(data=True):
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
119 print >>file, '<edge source="{}" target="{}">'.format(oneedge[0], oneedge[1])
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
120 for k, v in oneedge[2].iteritems():
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
121 print >>file, '<att name="{}" value="{}" type="string" />'.format(k, v)
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
122 print >>file, '</edge>'
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
123 print >>file, '</graph>'
fe01a054a6b2 Uploaded
bernhardlutz
parents:
diff changeset
124