Franck Pommereau

Go and Python build same LTS (to be further tested)

export GOPATH=$(pwd)/libs/go
......@@ -4,6 +4,17 @@ from snakes.nets import Marking, mset, dot, hdict
event = collections.namedtuple("event", ["trans", "mode", "state"])
def dumps (obj) :
if isinstance(obj, Marking) :
return "{%s}" % ", ".join("%s: %s" % (p, list(sorted(t)))
for p, t in sorted(obj.items()))
elif isinstance(obj, event) :
return "%s %s => %s" % (obj.trans, dumps(obj.mode), dumps(obj.state))
elif isinstance(obj, dict) :
return "{%s}" % ", ".join("%s: %s" % i for i in sorted(obj.items()))
else :
return str(obj)
def load_code (text) :
return eval(text, {"dot": dot, "mset": mset})
......@@ -24,7 +35,10 @@ def load (infile) :
if head.startswith("[") :
ident = int(head[1:-1])
last = load_state(text, ident)
g[last] = set()
if last in g :
print("# duplicated state", dumps(last))
else :
g[last] = set()
if ident == 0 :
g[0] = last
elif head == "@" :
......@@ -42,11 +56,11 @@ def load (infile) :
raise ValueError("invalid line %r" % line)
return g
def compare (left, right) :
def diff (left, right) :
if left[0] != right[0] :
print("not same initial state:")
print(" ", left[0])
print(" ", right[0])
print(" ", dumps(left[0]))
print(" ", dumps(right[0]))
return
print("let's go (%s states vs %s)" % (len(left) - 1, len(right) - 1))
todo = collections.deque([left[0]])
......@@ -57,18 +71,29 @@ def compare (left, right) :
todo.extend(succs)
seen.update(succs)
if state not in right :
print("missing", state)
print("missing", dumps(state))
return
elif left[state] != right[state] :
print("not same successors for [%s] %s" % (state.ident, state))
print("not same successors for [%s] %s" % (state.ident, dumps(state)))
for s in left[state] - right[state] :
print(" -", s)
print(" -", dumps(s))
for s in right[state] - left[state] :
print(" +", s)
print(" +", dumps(s))
return
print("no difference found")
def states (g) :
d = {}
for s in g :
if isinstance(s, int) :
continue
d[dumps(s)] = s
for k, s in sorted(d.items()) :
print(dumps(s))
if __name__ == "__main__" :
import sys
print("loading %r and %r..." % tuple(sys.argv[-2:]))
compare(load(open(sys.argv[-2])), load(open(sys.argv[-1])))
left = load(open(sys.argv[-2]))
right = load(open(sys.argv[-1]))
......
......@@ -35,7 +35,6 @@ net "test net" :
place p1 int = 0, 1, 2
place p2 int = 1, 2, 3
place p3 int = MAX, {MAX+1}
place p4
# values
trans t01 :
< p0 val = DOT
......@@ -66,7 +65,7 @@ net "test net" :
< p1 expr = abs(x - y)
> p2 var = x
> p2 expr = y+1
> p4 expr = abs(x - y)
> p3 expr = abs(x - y)
# test on input
trans t06 x != y :
< p0 val = DOT
......@@ -158,10 +157,6 @@ net "test net" :
> p6 (expr, var, val) = ({fmt.Sprintf("%d", x)}, y, true)
> p6 (val, (var, expr), val) = ({fmt.Sprintf("%d", x)}, (x, {x-1}), true)
# inhibitor
trans t21 :
< p0 val = DOT
< p5 !(var, val) = (x, 0)
# inhibitor
trans t22 :
< p0 val = DOT
< p5 !(var, val) = (x, 0)
......
......@@ -11,7 +11,6 @@ net "test net" :
place p1 int = 0, 1, 2
place p2 int = 1, 2, 3
place p3 int = MAX, {MAX+1}
place p4
# values
trans t01 :
< p0 val = dot
......@@ -42,7 +41,7 @@ net "test net" :
< p1 expr = abs(x - y)
> p2 var = x
> p2 expr = y+1
> p4 expr = abs(x - y)
> p3 expr = abs(x - y)
# test on input
trans t06 x != y :
< p0 val = dot
......@@ -133,11 +132,6 @@ net "test net" :
< p5 var = y
> p6 (expr, var, val) = ({str(x)}, y, True)
> p6 (expr, (var, expr), val) = ({str(x)}, (x, {x-1}), True)
# untyped :
trans t21 x < y :
< p0 val = dot
< p4 (var, var) = (x, y)
> p4 (var, var) = (y, x)
# inhibitor
trans t22 :
< p0 val = dot
......