Skip to content

Commit 275c57b

Browse files
committed
split the same children
1 parent 916ec47 commit 275c57b

File tree

1 file changed

+31
-11
lines changed

1 file changed

+31
-11
lines changed

callee.py

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,14 @@ def __init__(self, data, name):
7878
self.parent = None
7979
self.children = []
8080
self.head = self
81-
#self.id =get_random_id()
82-
#self.id = data
81+
self.id = 0
8382
self.name = name
8483
self.is_head = False
8584
self.first_child = None
8685
self.is_root = False
86+
87+
def link(self):
88+
return self.data + "_" + str(self.id)
8789

8890
def __init__(self, root = None):
8991
self.root = root;
@@ -99,27 +101,45 @@ def clean(self):
99101
self.core_content = ""
100102
self.id = -1
101103

102-
def is_different(self, node1, node2):
104+
def _is_different(self, node1, node2):
103105
if len(node1.children) != len(node2.children):
104106
return True
105107
for i in range(0, len(node1.children)):
106-
if self.is_different(node1.children[i], node2.children[i]):
108+
if self._is_different(node1.children[i], node2.children[i]):
107109
return True
108110
return False
109111

112+
def _split_node_children(self, children):
113+
uniq_keys = {}
114+
for child in children:
115+
if child.data not in uniq_keys:
116+
uniq_keys[child.data] = child
117+
else:
118+
# same
119+
uniq_keys[child.data].id += 1
120+
child.id = uniq_keys[child.data].id
121+
122+
for i in uniq_keys.values():
123+
i.id = 0
124+
125+
return children
126+
110127
def _uniq_children(self, children):
111128
uniq_keys = {}
112129
uniq_children = []
113130
for child in children:
114131
if child.data not in uniq_keys:
115132
uniq_keys[child.data] = child
116133
uniq_children.append(child)
117-
else:
134+
else:
118135
# same, if children are the same
119-
if self.is_different(uniq_keys[child.data], child):
136+
if self._is_different(uniq_keys[child.data], child):
137+
uniq_keys[child.data].id += 1
138+
child.id = uniq_keys[child.data].id
120139
uniq_children.append(child)
121-
#pass
122140

141+
for i in uniq_keys.values():
142+
i.id = 0
123143

124144
return uniq_children
125145

@@ -136,18 +156,18 @@ def _travel_tree(self, node):
136156
if is_simplify:
137157
uniq_children = self._uniq_children(node.children)
138158
else:
139-
uniq_children = node.children
159+
uniq_children = self._split_node_children(node.children)
140160

141161
if node.first_child:
142162
if node.is_root:
143163
new_root = "\t %s [label=\"<%s>%s\", color=red];\n" %(node.name, node.data, node.data)
144164
self.core_content += new_root
145165
#print new_root
146-
new_node = "\t %s [label=\"%s\"];\n" %(node.first_child.name, " | ".join(["<" + i.data + ">" + i.data for i in uniq_children]))
166+
new_node = "\t %s [label=\"%s\"];\n" %(node.first_child.name, " | ".join(["<" + i.link() + ">" + i.data for i in uniq_children]))
147167
self.core_content += new_node
148168
#print new_node
149-
left = "\t %s:%s" % (node.head.name, node.data)
150-
right = "%s:%s" % (node.first_child.name, node.first_child.data)
169+
left = "\t %s:%s" % (node.head.name, node.link())
170+
right = "%s:%s" % (node.first_child.name, node.first_child.link())
151171
style = "[dir=both, arrowtail=dot];\n"
152172
new_link = "%s -> %s%s" %(left, right, style)
153173
self.core_content += new_link

0 commit comments

Comments
 (0)