|
@@ -28,6 +28,8 @@ class ModelverseState(object):
|
|
|
self.incoming = defaultdict(set)
|
|
|
self.values = {}
|
|
|
self.nodes = set()
|
|
|
+ self.GC = True
|
|
|
+ self.to_delete = set()
|
|
|
|
|
|
self.cache = {}
|
|
|
|
|
@@ -315,10 +317,15 @@ class ModelverseState(object):
|
|
|
return ([self.edges[e][0] for e in matches], status.SUCCESS)
|
|
|
|
|
|
def delete_node(self, node):
|
|
|
+ if node is self.root:
|
|
|
+ return (None, status.FAIL_DN_UNKNOWN)
|
|
|
+
|
|
|
if node not in self.nodes:
|
|
|
return (None, status.FAIL_DN_UNKNOWN)
|
|
|
|
|
|
self.nodes.remove(node)
|
|
|
+ if node in self.values:
|
|
|
+ del self.values[node]
|
|
|
s = set()
|
|
|
for e in self.outgoing[node]:
|
|
|
s.add(e)
|
|
@@ -338,6 +345,7 @@ class ModelverseState(object):
|
|
|
s, t = self.edges[edge]
|
|
|
self.incoming[t].remove(edge)
|
|
|
self.outgoing[s].remove(edge)
|
|
|
+
|
|
|
del self.edges[edge]
|
|
|
|
|
|
s = set()
|
|
@@ -350,4 +358,14 @@ class ModelverseState(object):
|
|
|
del self.outgoing[edge]
|
|
|
del self.incoming[edge]
|
|
|
|
|
|
+ if (self.GC) and (not self.incoming[t]) and (t not in self.edges):
|
|
|
+ # Remove this node as well
|
|
|
+ # Edges aren't deleted like this, as they might have a reachable target and source!
|
|
|
+ # If they haven't, they will be removed because the source was removed.
|
|
|
+ self.to_delete.add(t)
|
|
|
+
|
|
|
return (None, status.SUCCESS)
|
|
|
+
|
|
|
+ def garbage_collect(self):
|
|
|
+ while self.to_delete:
|
|
|
+ self.delete_node(self.to_delete.pop())
|