|
@@ -1,4 +1,3 @@
|
|
|
-from modelverse_state import status
|
|
|
import sys
|
|
|
from collections import defaultdict
|
|
|
import os
|
|
@@ -52,7 +51,7 @@ class ModelverseState(object):
|
|
|
for i, e in self.edges.iteritems():
|
|
|
f.write("%s -> %s [label=\"%s\"];\n" % (e[0], e[1], i))
|
|
|
f.write("}")
|
|
|
- return (self.root, status.SUCCESS)
|
|
|
+ return self.root
|
|
|
|
|
|
def parse(self, filename):
|
|
|
picklefile = filename + ".pickle"
|
|
@@ -93,18 +92,18 @@ class ModelverseState(object):
|
|
|
if element_type == "Node":
|
|
|
name = name.split()[0]
|
|
|
if values == "":
|
|
|
- symbols[name], status = self.create_node()
|
|
|
+ symbols[name] = self.create_node()
|
|
|
else:
|
|
|
value = values
|
|
|
if value in complex_primitives:
|
|
|
value = string_to_instance(value)
|
|
|
else:
|
|
|
value = eval(value)
|
|
|
- symbols[name], status = self.create_nodevalue(value)
|
|
|
+ symbols[name] = self.create_nodevalue(value)
|
|
|
elif element_type == "Edge":
|
|
|
name = name.split()[0]
|
|
|
values = [v.split()[0] for v in values.split(",")]
|
|
|
- symbols[name], status = self.create_edge(resolve(values[0]), resolve(values[1]))
|
|
|
+ symbols[name] = self.create_edge(resolve(values[0]), resolve(values[1]))
|
|
|
elif element_type == "Dict":
|
|
|
values = [v.split()[0] for v in values.split(",")]
|
|
|
if values[1] in complex_primitives:
|
|
@@ -115,9 +114,6 @@ class ModelverseState(object):
|
|
|
else:
|
|
|
raise Exception("Unknown element type: %s" % element_type)
|
|
|
|
|
|
- if status != 100:
|
|
|
- raise Exception("Failed to process line for reason %s: %s" % (status, line))
|
|
|
-
|
|
|
# Creation successful, now also create a pickle
|
|
|
with open(picklefile, 'wb') as f:
|
|
|
pickle.dump((symbols["root"], self.free_id, self.nodes, self.edges, self.values, self.cache, self.cache_node), f, pickle.HIGHEST_PROTOCOL)
|
|
@@ -125,18 +121,18 @@ class ModelverseState(object):
|
|
|
return symbols["root"]
|
|
|
|
|
|
def read_root(self):
|
|
|
- return (self.root, status.SUCCESS)
|
|
|
+ return self.root
|
|
|
|
|
|
def create_node(self):
|
|
|
self.nodes.add(self.free_id)
|
|
|
self.free_id += 1
|
|
|
- return (self.free_id - 1, status.SUCCESS)
|
|
|
+ return self.free_id - 1
|
|
|
|
|
|
def create_edge(self, source, target):
|
|
|
if source not in self.edges and source not in self.nodes:
|
|
|
- return (None, status.FAIL_CE_SOURCE)
|
|
|
+ return None
|
|
|
elif target not in self.edges and target not in self.nodes:
|
|
|
- return (None, status.FAIL_CE_TARGET)
|
|
|
+ return None
|
|
|
else:
|
|
|
self.outgoing.setdefault(source, set()).add(self.free_id)
|
|
|
self.incoming.setdefault(target, set()).add(self.free_id)
|
|
@@ -149,7 +145,7 @@ class ModelverseState(object):
|
|
|
if target in self.values:
|
|
|
self.cache.setdefault(dict_source, {})[self.values[target]] = source
|
|
|
self.cache_node.setdefault(dict_source, {})[target] = source
|
|
|
- return (self.free_id - 1, status.SUCCESS)
|
|
|
+ return self.free_id - 1
|
|
|
|
|
|
def is_valid_datavalue(self, value):
|
|
|
if isinstance(value, dict):
|
|
@@ -165,58 +161,54 @@ class ModelverseState(object):
|
|
|
|
|
|
def create_nodevalue(self, value):
|
|
|
if not self.is_valid_datavalue(value):
|
|
|
- return (None, status.FAIL_CNV_OOB)
|
|
|
+ return None
|
|
|
self.values[self.free_id] = value
|
|
|
self.nodes.add(self.free_id)
|
|
|
self.free_id += 1
|
|
|
- return (self.free_id - 1, status.SUCCESS)
|
|
|
+ return self.free_id - 1
|
|
|
|
|
|
def create_dict(self, source, data, destination):
|
|
|
if source not in self.nodes and source not in self.edges:
|
|
|
- return (None, status.FAIL_CDICT_SOURCE)
|
|
|
- if destination not in self.nodes and destination not in self.edges:
|
|
|
- return (None, status.FAIL_CDICT_TARGET)
|
|
|
- if not self.is_valid_datavalue(data):
|
|
|
- return (None, status.FAIL_CDICT_OOB)
|
|
|
- n = self.create_nodevalue(data)[0]
|
|
|
- e = self.create_edge(source, destination)[0]
|
|
|
- self.create_edge(e, n)
|
|
|
- self.cache.setdefault(source, {})[data] = e
|
|
|
- self.cache_node.setdefault(source, {})[n] = e
|
|
|
-
|
|
|
- return (None, status.SUCCESS)
|
|
|
+ return None
|
|
|
+ elif destination not in self.nodes and destination not in self.edges:
|
|
|
+ return None
|
|
|
+ elif not self.is_valid_datavalue(data):
|
|
|
+ return None
|
|
|
+ else:
|
|
|
+ n = self.create_nodevalue(data)
|
|
|
+ e = self.create_edge(source, destination)
|
|
|
+ self.create_edge(e, n)
|
|
|
+ self.cache.setdefault(source, {})[data] = e
|
|
|
+ self.cache_node.setdefault(source, {})[n] = e
|
|
|
|
|
|
def read_value(self, node):
|
|
|
if node in self.values:
|
|
|
- return (self.values[node], status.SUCCESS)
|
|
|
- elif node not in self.nodes:
|
|
|
- return (None, status.FAIL_RV_UNKNOWN)
|
|
|
+ return self.values[node]
|
|
|
else:
|
|
|
- return (None, status.FAIL_RV_NO_VALUE)
|
|
|
+ return None
|
|
|
|
|
|
def read_outgoing(self, elem):
|
|
|
if elem in self.edges or elem in self.nodes:
|
|
|
if elem in self.outgoing:
|
|
|
- return (list(self.outgoing[elem]), status.SUCCESS)
|
|
|
+ return list(self.outgoing[elem])
|
|
|
else:
|
|
|
- return ([], status.SUCCESS)
|
|
|
- else:
|
|
|
- return (None, status.FAIL_RO_UNKNOWN)
|
|
|
+ return []
|
|
|
+ return None
|
|
|
|
|
|
def read_incoming(self, elem):
|
|
|
if elem in self.edges or elem in self.nodes:
|
|
|
if elem in self.incoming:
|
|
|
- return (list(self.incoming[elem]), status.SUCCESS)
|
|
|
+ return list(self.incoming[elem])
|
|
|
else:
|
|
|
- return ([], status.SUCCESS)
|
|
|
+ return []
|
|
|
else:
|
|
|
- return (None, status.FAIL_RI_UNKNOWN)
|
|
|
+ return None
|
|
|
|
|
|
def read_edge(self, edge):
|
|
|
if edge in self.edges:
|
|
|
- return ([self.edges[edge][0], self.edges[edge][1]], status.SUCCESS)
|
|
|
+ return [self.edges[edge][0], self.edges[edge][1]]
|
|
|
else:
|
|
|
- return ([None, None], status.FAIL_RE_UNKNOWN)
|
|
|
+ return [None, None]
|
|
|
|
|
|
def read_dict(self, node, value):
|
|
|
try:
|
|
@@ -224,23 +216,18 @@ class ModelverseState(object):
|
|
|
# Got hit, so validate
|
|
|
if (self.edges[first][0] == node) and \
|
|
|
(value in [self.values[self.edges[i][1]] for i in self.outgoing[first]]):
|
|
|
- return (self.edges[first][1], status.SUCCESS)
|
|
|
+ return self.edges[first][1]
|
|
|
# Hit but invalid now
|
|
|
del self.cache[node][value]
|
|
|
except KeyError:
|
|
|
# Didn't exist
|
|
|
pass
|
|
|
-
|
|
|
- if node not in self.nodes and node not in self.edges:
|
|
|
- return (None, status.FAIL_RDICT_UNKNOWN)
|
|
|
- elif not self.is_valid_datavalue(value):
|
|
|
- return (None, status.FAIL_RDICT_OOB)
|
|
|
- else:
|
|
|
- return (None, status.FAIL_RDICT_NOT_FOUND)
|
|
|
+ return None
|
|
|
|
|
|
def read_dict_keys(self, node):
|
|
|
if node not in self.nodes and node not in self.edges:
|
|
|
- return (None, status.FAIL_RDICTKEYS_UNKNOWN)
|
|
|
+ return None
|
|
|
+
|
|
|
result = []
|
|
|
if node in self.outgoing:
|
|
|
for e1 in self.outgoing[node]:
|
|
@@ -248,7 +235,7 @@ class ModelverseState(object):
|
|
|
for e2 in self.outgoing[e1]:
|
|
|
result.append(self.edges[e2][1])
|
|
|
#NOTE cannot just use the cache here, as some keys in the cache might not actually exist; we would have to check all of them anyway
|
|
|
- return (result, status.SUCCESS)
|
|
|
+ return result
|
|
|
|
|
|
def read_dict_edge(self, node, value):
|
|
|
try:
|
|
@@ -256,31 +243,23 @@ class ModelverseState(object):
|
|
|
# Got hit, so validate
|
|
|
if (self.edges[first][0] == node) and \
|
|
|
(value in [self.values[self.edges[i][1]] for i in self.outgoing[first]]):
|
|
|
- return (first, status.SUCCESS)
|
|
|
+ return first
|
|
|
# Hit but invalid now
|
|
|
del self.cache[node][value]
|
|
|
except KeyError:
|
|
|
# Didn't exist
|
|
|
pass
|
|
|
|
|
|
- if node not in self.nodes and node not in self.edges:
|
|
|
- return (None, status.FAIL_RDICTE_UNKNOWN)
|
|
|
- elif not self.is_valid_datavalue(value):
|
|
|
- return (None, status.FAIL_RDICTE_OOB)
|
|
|
- else:
|
|
|
- return (None, status.FAIL_RDICTE_NOT_FOUND)
|
|
|
+ return None
|
|
|
|
|
|
def read_dict_node(self, node, value_node):
|
|
|
- e, s = self.read_dict_node_edge(node, value_node)
|
|
|
+ e = self.read_dict_node_edge(node, value_node)
|
|
|
|
|
|
- if s != status.SUCCESS:
|
|
|
- return (None, {status.FAIL_RDICTNE_UNKNOWN: status.FAIL_RDICTN_UNKNOWN,
|
|
|
- status.FAIL_RDICTNE_UNCERTAIN: status.FAIL_RDICTN_UNCERTAIN,
|
|
|
- status.FAIL_RDICTNE_AMBIGUOUS: status.FAIL_RDICTN_AMBIGUOUS,
|
|
|
- status.FAIL_RDICTNE_OOB: status.FAIL_RDICTN_OOB,
|
|
|
- status.FAIL_RDICTNE_NOT_FOUND: status.FAIL_RDICTN_NOT_FOUND}[s])
|
|
|
- self.cache_node.setdefault(node, {})[value_node] = e
|
|
|
- return (self.edges[e][1], status.SUCCESS)
|
|
|
+ if e is None:
|
|
|
+ return None
|
|
|
+ else:
|
|
|
+ self.cache_node.setdefault(node, {})[value_node] = e
|
|
|
+ return self.edges[e][1]
|
|
|
|
|
|
def read_dict_node_edge(self, node, value_node):
|
|
|
try:
|
|
@@ -288,23 +267,20 @@ class ModelverseState(object):
|
|
|
# Got hit, so validate
|
|
|
if (self.edges[first][0] == node) and \
|
|
|
(value_node in [self.edges[i][1] for i in self.outgoing[first]]):
|
|
|
- return (first, status.SUCCESS)
|
|
|
+ return first
|
|
|
# Hit but invalid now
|
|
|
del self.cache_node[node][value_node]
|
|
|
except KeyError:
|
|
|
# Didn't exist
|
|
|
pass
|
|
|
|
|
|
- if node not in self.nodes and node not in self.edges:
|
|
|
- return (None, status.FAIL_RDICTNE_UNKNOWN)
|
|
|
- else:
|
|
|
- return (None, status.FAIL_RDICTNE_NOT_FOUND)
|
|
|
+ return None
|
|
|
|
|
|
def read_reverse_dict(self, node, value):
|
|
|
if node not in self.nodes and node not in self.edges:
|
|
|
- return (None, status.FAIL_RRDICT_UNKNOWN)
|
|
|
+ return None
|
|
|
elif not self.is_valid_datavalue(value):
|
|
|
- return (None, status.FAIL_RRDICT_OOB)
|
|
|
+ return None
|
|
|
# Get all outgoing links
|
|
|
matches = []
|
|
|
if node in self.incoming:
|
|
@@ -318,20 +294,19 @@ class ModelverseState(object):
|
|
|
if target in self.values and self.values[target] == value:
|
|
|
# Found a match
|
|
|
if len(self.outgoing[e1]) > 1:
|
|
|
- return (None, status.FAIL_RRDICT_UNCERTAIN)
|
|
|
+ return None
|
|
|
else:
|
|
|
matches.append(e1)
|
|
|
if len(matches) == 0:
|
|
|
- return (None, status.FAIL_RRDICT_NOT_FOUND)
|
|
|
+ return None
|
|
|
else:
|
|
|
- return ([self.edges[e][0] for e in matches], status.SUCCESS)
|
|
|
+ return [self.edges[e][0] for e in matches]
|
|
|
|
|
|
def delete_node(self, node):
|
|
|
if node == self.root:
|
|
|
- return (None, status.FAIL_DN_UNKNOWN)
|
|
|
-
|
|
|
- if node not in self.nodes:
|
|
|
- return (None, status.FAIL_DN_UNKNOWN)
|
|
|
+ return None
|
|
|
+ elif node not in self.nodes:
|
|
|
+ return None
|
|
|
|
|
|
self.nodes.remove(node)
|
|
|
|
|
@@ -356,11 +331,11 @@ class ModelverseState(object):
|
|
|
if node in self.incoming:
|
|
|
del self.incoming[node]
|
|
|
|
|
|
- return (None, status.SUCCESS)
|
|
|
+ return None
|
|
|
|
|
|
def delete_edge(self, edge):
|
|
|
if edge not in self.edges:
|
|
|
- return (None, status.FAIL_DE_UNKNOWN)
|
|
|
+ return None
|
|
|
|
|
|
s, t = self.edges[edge]
|
|
|
if t in self.incoming:
|
|
@@ -392,8 +367,6 @@ class ModelverseState(object):
|
|
|
# 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:
|
|
|
t = self.to_delete.pop()
|