From 7e97372bcaf38c5bea46e6a6c8885dbd520f4b6a Mon Sep 17 00:00:00 2001 From: maor226 Date: Thu, 27 Jan 2022 15:39:27 +0200 Subject: [PATCH] first try off wait all --- NodeLibrary.py | 174 +++++++++++++++++++++++++++++++++----------- Tests/TTT.png | Bin 31314 -> 31053 bytes Tests/TTT2.flow | 4 +- Tests/TTT_maor.flow | 53 ++++++++++++++ flow.py | 7 +- 5 files changed, 191 insertions(+), 47 deletions(-) create mode 100644 Tests/TTT_maor.flow diff --git a/NodeLibrary.py b/NodeLibrary.py index 4348c7e..3d04bdc 100644 --- a/NodeLibrary.py +++ b/NodeLibrary.py @@ -1,5 +1,6 @@ import abc import copy +import itertools from collections import Counter from itertools import permutations from typing import * @@ -112,6 +113,7 @@ def state_visualization(self, n: DiagramNode) -> None: del t["BLOCK"] n.label += "\n" + str(t) n.height += 20 + n.height = min(400, n.height) elif n.tokens_display == 'count only': if len(n.sync) > 0: n.label += "\n %d tokens" % len(n.sync) @@ -131,12 +133,13 @@ def synchronization(self, tokens: Sequence[Dict], sync: Sequence[Dict], node: Di t['REQ'] = eval(node.req, globals(), t) if node.wait != "[]": - w=eval(node.wait, globals(), t) - t['WAIT']=w if callable(w) else self.genF(w) + print(t) + w = eval(node.wait, globals(), t) + t['WAIT'] = w if callable(w) else self.genF(w) if node.block != "[]": - b=eval(node.block, globals(), t) - t['BLOCK']=b if callable(b) else self.genF(b) + b = eval(node.block, globals(), t) + t['BLOCK'] = b if callable(b) else self.genF(b) if node.tokens_display != 'full with event': if 'event' in t: @@ -154,20 +157,20 @@ def type_string(self) -> str: return "loop" def node_manipulator(self, node: DiagramNode) -> None: - node.label='LOOP' + node.label = 'LOOP' node.label += "\ncount:" + node.count super().node_manipulator(node) def transformation(self, tokens: Sequence[Dict], node: DiagramNode, port: str) -> Sequence[Dict]: - nxtt=[] + nxtt = [] for pt in tokens: - t=copy.deepcopy(pt) + t = copy.deepcopy(pt) try: - t["COUNT"]=t["COUNT"] - 1 + t["COUNT"] = t["COUNT"] - 1 except KeyError: - t["COUNT"]=int(node.count) + t["COUNT"] = int(node.count) if port == 'after': if t["COUNT"] == 0: @@ -196,22 +199,22 @@ def type_string(self) -> str: return "permutation" def node_manipulator(self, node: DiagramNode) -> None: - node.label='PERMUTATION' + node.label = 'PERMUTATION' node.label += "\nkeys:" + node.keys super().node_manipulator(node) def transformation(self, tokens: Sequence[Dict], node: DiagramNode, port: str) -> Sequence[Dict]: - ret=[] + ret = [] for t in tokens: - keys=eval(node.keys, globals(), t) - values=[t[k] for k in keys] - pvalues=permutations(values) + keys = eval(node.keys, globals(), t) + values = [t[k] for k in keys] + pvalues = permutations(values) for pval in pvalues: - t=copy.deepcopy(t) + t = copy.deepcopy(t) for k in range(len(pval)): - t[keys[k]]=pval[k] + t[keys[k]] = pval[k] ret.append(t) return ret @@ -224,13 +227,13 @@ def type_string(self) -> str: return "join" def node_manipulator(self, node: DiagramNode) -> None: - node.label='JOIN\nCOUNT=%s' % node.count - node.log=[] + node.label = 'JOIN\nCOUNT=%s' % node.count + node.log = [] super().node_manipulator(node) def state_visualization(self, n: DiagramNode) -> None: - n.label=n.org_label - n.height=50 + n.label = n.org_label + n.height = 50 n.label += "\n---------------------" for t in n.log: @@ -238,34 +241,37 @@ def state_visualization(self, n: DiagramNode) -> None: n.height += 20 def get_groups(self, node: DiagramNode): - ret=[] + ret = [] - join_by=eval(node.join_by) - def joinby(t): return [t[i] for i in join_by] + join_by = eval(node.join_by) + + def joinby(t): + return [t[i] for i in join_by] node.log.sort(key=joinby) - join=None + join = None for t in node.log: if joinby(t) != join: - join=joinby(t) - group=[t] + join = joinby(t) + group = [t] else: group.append(t) - if(len(group) >= eval(node.count)): + if (len(group) >= eval(node.count)): ret.append(group) return ret - def synchronization(self, tokens: Sequence[Dict], sync: Sequence[Dict], node: DiagramNode) -> (Sequence[Dict], Sequence[Dict]): - if len(tokens) is not 0: + def synchronization(self, tokens: Sequence[Dict], sync: Sequence[Dict], node: DiagramNode) -> ( + Sequence[Dict], Sequence[Dict]): + if len(tokens) != 0: node.log.extend(tokens) return (tokens, []) # TODO change this node to work like WaitForSetType - i.e., without using transformation. def transformation(self, tokens: Sequence[Dict], node: DiagramNode, port: str) -> Sequence[Dict]: - groups=self.get_groups(node) + groups = self.get_groups(node) if len(groups) != 0: for g in groups: for t in g: @@ -286,17 +292,17 @@ def type_string(self) -> str: return "waitforset" def node_manipulator(self, node: DiagramNode) -> None: - node.label="ANY " + node.threshold + " OF \n" + node.set - node.set=eval(node.set) - node.visited=[] - node.threshold=int(node.threshold) + node.label = "ANY " + node.threshold + " OF \n" + node.set + node.set = eval(node.set) + node.visited = [] + node.threshold = int(node.threshold) # node.width = 400 - node.height=100 + node.height = 100 super().node_manipulator(node) def state_visualization(self, n: DiagramNode) -> None: - n.label=n.org_label - n.height=80 + n.label = n.org_label + n.height = 80 n.label += "\n---------------------" n.label += "\nhistory=" + str(n.visited) @@ -308,13 +314,95 @@ def transformation(self, tokens: Sequence[Dict], node: DiagramNode, port: str) - node.visited += [t for t in tokens if t in node.set and t not in node.visited] if len(node.visited) >= node.threshold: - tmp=node.visited - node.visited=[] + tmp = node.visited + node.visited = [] return [{'subset': tmp}] else: return [] +###################################################################################### +class WaitAll(NodeType): + + def type_string(self) -> str: + return "waitall" + + def node_manipulator(self, node: DiagramNode) -> None: + node.label = "WAIT All OF\n" + node.waitall + # node.waitall =[] if node.waitall == '[]' else node.waitall.split(",") + node.width = 400 + node.height = 300 + super().node_manipulator(node) + + def state_visualization(self, n: DiagramNode) -> None: + n.label = n.org_label + "\n-----------" + n.height = 300 + if n.tokens_display == 'full' or n.tokens_display == 'full with event': + for t in n.sync: + t = copy.deepcopy(t) + # if "WAITALL" in t: + # del t["WAITALL"] + if "WAIT" in t: + del t["WAIT"] + n.label += "\n" + str(t) + n.height += 20 + elif n.tokens_display == 'count only': + if len(n.sync) > 0: + n.label += "\n %d tokens" % len(n.sync) + else: + raise Exception("Illegal value for 'tokens_display': " + n.tokens_display) + + def genF(self, l): + return lambda e: True in [e in le for le in l] + + def synchronization(self, tokens: Sequence[Dict], sync: Sequence[Dict], node: DiagramNode) -> Sequence[Dict]: + sync = copy.deepcopy(sync) + for t in tokens: + t = copy.deepcopy(t) + + if node.waitall is not "[]": + if "WAITALL" not in t.keys(): + t['WAITALL']= eval(node.waitall, globals(), t) + + t['WAIT'] =(lambda w : w if callable(w) else self.genF(w))(list(itertools.chain(copy.deepcopy(t['WAITALL'])))) # need to be the union + # t['WAITALL']= [(lambda w :w if callable(w) else self.genF(w))(eval(w, globals(), t)) for w in node.waitall] + + sync.append(t) + + # try: + # t["COUNT"] = t["COUNT"] - 1 + # except KeyError: + # t["COUNT"] = int(node.count) + + return (sync, sync) + + def transformation(self, tokens: Sequence[Dict], node: DiagramNode, port: str) -> Sequence[Dict]: + nxtt = [] + + for t in tokens: + + + try: + e = t["event"] + t["le"] = e + if e is not None: + del t["event"] + for waitlist in t["WAITALL"]: + waitlist.remove(e) + if len(waitlist) == 0: + nxtt.append(copy.deepcopy(t)) + + except KeyError: + pass + + + + # if not t["WAITALL"]: + # nxtt.append(t) + + return nxtt + + ###################################################################################### class LoggerType(NodeType): @@ -322,13 +410,13 @@ def type_string(self) -> str: return "logger" def node_manipulator(self, node: DiagramNode) -> None: - node.label='LOG' - node.log=[] + node.label = 'LOG' + node.log = [] super().node_manipulator(node) def state_visualization(self, n: DiagramNode) -> None: - n.label=n.org_label - n.height=50 + n.label = n.org_label + n.height = 50 n.label += "\n---------------------" for t in n.log: diff --git a/Tests/TTT.png b/Tests/TTT.png index 1854aa4224730f6b63c24ff3a266045422a48f5a..889b938534f4122a6c88c704b3ded0194e5da8a9 100644 GIT binary patch literal 31053 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 MY*S9$wC}`!0kacw-T(jq literal 31314 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 slLKq;_%GI#&`> diff --git a/Tests/TTT2.flow b/Tests/TTT2.flow index dee18e9..615d214 100644 --- a/Tests/TTT2.flow +++ b/Tests/TTT2.flow @@ -1,9 +1,9 @@ blockdiag { st -> join -> req; - st [type=start, initial="[{1:'1'},{2:'2'},{3:'3'}]"]; + st [type=start, initial="[{1:'1'},{2:'2'},{third:'3'}]"]; join [type=join] - req [type=sync, req="['O'+t[3]]"] + req [type=sync, req="['O'+third]"] diff --git a/Tests/TTT_maor.flow b/Tests/TTT_maor.flow new file mode 100644 index 0000000..d412cb7 --- /dev/null +++ b/Tests/TTT_maor.flow @@ -0,0 +1,53 @@ +blockdiag { +initialization_code=" +global X +X = lambda i : 'X'+str(i) + +global O +O=lambda i : 'O'+str(i) + +global perm3 +perm3 = lambda a : [[a[0],a[1],a[2]],[a[0],a[2],a[1]],[a[1],a[0],a[2]],[a[2],a[0],a[1]], [a[1],a[2],a[0]],[a[2],a[1],a[0]]] + +global Path +Path = [['1','2','3'],['4','5','6'],['7','8','9'],['1','4','7'],['2','5','8'],['3','6','9'],['1','5','9'],['3','5','7']] + +global Lines +Lines =[] +for p in Path: + Lines.extend(perm3(p)) + +global All +All= lambda A:[A(i) for i in range(1,9)] + +global AllMove +AllMove=lambda : All(X).extern(All(O)) +" + + + st3 -> wa -> rq3; + + st3 [type=start, initial="[{'path':Path[0]} ]", width=400]; + wa [type=waitall, waitall="[[X(i) for i in path]]"] + rq3 [type=sync, req="['Player X wins'], block =[AllMove()]"] + + + + + st2 -> rqX1 ; + + st2 [type=start, initial="[{'i':i }for i in range(1,4)]", width=400]; + rqX1[type = sync , req="[X(i)]"] + + + # For debugging + class hidden [color = none, style = none, textcolor = white]; + stt -> listener -> "Event viewer" -> listener [style = "none"]; + + listener [type=sync, + wait="['X'+str(i) for i in range(1,9)]+['O'+str(i) for i in range(1,9)]", + class = "hidden", autoformat='false']; + + stt [type=start, class = "hidden", autoformat='false']; + +} diff --git a/flow.py b/flow.py index 07a48eb..3ece00c 100644 --- a/flow.py +++ b/flow.py @@ -7,7 +7,7 @@ from NodeLibrary import * -statecount = 0 +statecount = 0 # const builder.DiagramNode.type = "pass" builder.DiagramNode.SYNC = None builder.DiagramNode.T = None @@ -28,12 +28,15 @@ builder.DiagramNode.join_by = [] builder.DiagramNode.join = None +builder.DiagramNode.waitall = "[]" + + builder.Diagram.run = None builder.Diagram.initialization_code = "" builder.Diagram.event_selection_mechanism = 'random' node_types = (StartType(), SyncType(), LoopType(), PassType(), PermutationType(), - JoinType(), WaitForSetType(), LoggerType()) + JoinType(), WaitForSetType(), LoggerType(), WaitAll()) def traverse_nodes(n):