From ed5e025b57a2ec393e16db39ce0a332c9d923a5a Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Sat, 23 Jul 2022 20:49:24 -0400 Subject: [PATCH 01/28] Create graph_enum.py --- macq/generate/pddl/graph_enum.py | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 macq/generate/pddl/graph_enum.py diff --git a/macq/generate/pddl/graph_enum.py b/macq/generate/pddl/graph_enum.py new file mode 100644 index 00000000..bb1c0d11 --- /dev/null +++ b/macq/generate/pddl/graph_enum.py @@ -0,0 +1,53 @@ +import networkx as nx +#import tarski as tr +import macq +from tarski.io import PDDLReader +import requests + + +class Generator: + + + def __init__( + self, + dom: str = None, + prob: str = None, + problem_id: int = None, + observe_pres_effs: bool = False, + ): + + # get attributes + self.pddl_dom = dom + self.pddl_prob = prob + self.problem_id = problem_id + self.observe_pres_effs = observe_pres_effs + # read the domain and problem + reader = PDDLReader(raise_on_error=True) + if not problem_id: + reader.parse_domain(dom) + self.problem = reader.parse_instance(prob) + else: + dom = requests.get(get_problem(problem_id)["domain_url"]).text + prob = requests.get(get_problem(problem_id)["problem_url"]).text + reader.parse_domain_string(dom) + self.problem = reader.parse_instance_string(prob) + self.lang = self.problem.language + +#x= Generator(problem_id=9348) + +DG = nx.DiGraph() +for i in x.problem: + DG.add_edge(x.curr_state, x.next_state,{"action": x.action}) + +opened= [] +closed= [] + +bfs=nx.bfs_edges(DG) +for i in bfs: + + if i not in closed(): + opened.append(i) + DG.add_edge(x.curr_state, x.next_state,{"action": x.action}) + + + From 3fc82bbee7e0be5b32cf9b01d60973f219bd1d72 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Sat, 23 Jul 2022 20:51:41 -0400 Subject: [PATCH 02/28] Delete graph_enum.py --- macq/generate/pddl/graph_enum.py | 53 -------------------------------- 1 file changed, 53 deletions(-) delete mode 100644 macq/generate/pddl/graph_enum.py diff --git a/macq/generate/pddl/graph_enum.py b/macq/generate/pddl/graph_enum.py deleted file mode 100644 index bb1c0d11..00000000 --- a/macq/generate/pddl/graph_enum.py +++ /dev/null @@ -1,53 +0,0 @@ -import networkx as nx -#import tarski as tr -import macq -from tarski.io import PDDLReader -import requests - - -class Generator: - - - def __init__( - self, - dom: str = None, - prob: str = None, - problem_id: int = None, - observe_pres_effs: bool = False, - ): - - # get attributes - self.pddl_dom = dom - self.pddl_prob = prob - self.problem_id = problem_id - self.observe_pres_effs = observe_pres_effs - # read the domain and problem - reader = PDDLReader(raise_on_error=True) - if not problem_id: - reader.parse_domain(dom) - self.problem = reader.parse_instance(prob) - else: - dom = requests.get(get_problem(problem_id)["domain_url"]).text - prob = requests.get(get_problem(problem_id)["problem_url"]).text - reader.parse_domain_string(dom) - self.problem = reader.parse_instance_string(prob) - self.lang = self.problem.language - -#x= Generator(problem_id=9348) - -DG = nx.DiGraph() -for i in x.problem: - DG.add_edge(x.curr_state, x.next_state,{"action": x.action}) - -opened= [] -closed= [] - -bfs=nx.bfs_edges(DG) -for i in bfs: - - if i not in closed(): - opened.append(i) - DG.add_edge(x.curr_state, x.next_state,{"action": x.action}) - - - From 164a10eb56e9890d84206937803cdee7dc8041a8 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Mon, 25 Jul 2022 22:14:08 -0400 Subject: [PATCH 03/28] Create graph_enum.py --- macq/generate/pddl/graph_enum.py | 128 +++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 macq/generate/pddl/graph_enum.py diff --git a/macq/generate/pddl/graph_enum.py b/macq/generate/pddl/graph_enum.py new file mode 100644 index 00000000..b840c66a --- /dev/null +++ b/macq/generate/pddl/graph_enum.py @@ -0,0 +1,128 @@ +from tarski.search.operations import progress +import random +import macq +from macq.generate.pddl import Generator +from macq.utils import ( + set_timer_throw_exc, + TraceSearchTimeOut, + InvalidTime, + set_num_traces, + set_plan_length, + progress as print_progress, +) +from macq.trace import ( + Step, + Trace, + TraceList, +) + + +class Graph_enum(Generator): + + + def __init__( + self, + dom: str = None, + prob: str = None, + problem_id: int = None, + observe_pres_effs: bool = False, + plan_len: int = 1, + num_traces: int = 0, + seed: int = None, + max_time: float = 30, + ): + super().__init__( + dom=dom, + prob=prob, + problem_id=problem_id, + observe_pres_effs=observe_pres_effs, + ) + + if self.num_traces > 0: + self.traces = self.generate_traces() + else: + self.traces = None + if seed: + random.seed(seed) + + def generate_traces(self): + """Generates traces randomly by uniformly sampling applicable actions to find plans + of the given length. + + Returns: + A TraceList object with the list of traces generated. + """ + traces = TraceList() + traces.generator = self.generate_single_trace_setup( + num_seconds=self.max_time, plan_len=self.plan_len + ) + for _ in print_progress(range(self.num_traces)): + traces.append(traces.generator()) + self.traces = traces + return traces + + def generate_single_trace_setup(self, num_seconds: float, plan_len = None): + @set_timer_throw_exc( + num_seconds=num_seconds, exception=TraceSearchTimeOut, max_time=num_seconds + ) + def generate_single_trace(self=self, plan_len=plan_len): + """Generates a single trace using the uniform random sampling technique. + Loops until a valid trace is found. The timer wrapper does not allow the function + to run past the time specified. + + The outside function is a wrapper that provides parameters for both the timer + wrapper and the function. + + Returns: + A Trace object (the valid trace generated). + """ + + if not plan_len: + plan_len = self.plan_len + if callable(plan_len): + plan_len = plan_len() + + trace = Trace() + + state = self.problem.init + valid_trace = False + while not valid_trace: + trace.clear() + # add more steps while the trace has not yet reached the desired length + for j in range(plan_len): + # if we have not yet reached the last step + if len(trace) < plan_len - 1: + # find the next applicable actions + app_act = list(self.instance.applicable(state)) + # if the trace reaches a dead lock, disregard this trace and try again + if not app_act: + break + # pick a random applicable action and apply it + + for i in app_act: + next_state=progress(state, i) + if next_state in digraph: + add edge(next_state, old_state , action=i) + + else: + add_edge(state, next_state, action=i) + + + act = random.choice(app_act) + # create the trace and progress the state + macq_action = self.tarski_act_to_macq(act) + macq_state = self.tarski_state_to_macq(state) + step = Step(macq_state, macq_action, j + 1) + trace.append(step) + state = progress(state, act) + else: + macq_state = self.tarski_state_to_macq(state) + step = Step(state=macq_state, action=None, index=j + 1) + trace.append(step) + valid_trace = True + return trace + + return generate_single_trace + + +traces= Graph_enum(problem_id=198, num_traces=1) \ No newline at end of file From d7e7d235434a96212625af574930524d0955e608 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Mon, 25 Jul 2022 23:35:42 -0400 Subject: [PATCH 04/28] Update graph_enum.py --- macq/generate/pddl/graph_enum.py | 70 ++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/macq/generate/pddl/graph_enum.py b/macq/generate/pddl/graph_enum.py index b840c66a..82bfaa94 100644 --- a/macq/generate/pddl/graph_enum.py +++ b/macq/generate/pddl/graph_enum.py @@ -1,4 +1,5 @@ from tarski.search.operations import progress +import networkx as nx import random import macq from macq.generate.pddl import Generator @@ -45,6 +46,8 @@ def __init__( if seed: random.seed(seed) + DG=nx.DiGraph() + def generate_traces(self): """Generates traces randomly by uniformly sampling applicable actions to find plans of the given length. @@ -61,6 +64,20 @@ def generate_traces(self): self.traces = traces return traces + def bfs(): + Visited={node:False for node in G.nodes} + Queue[StartNode] + Visited[StartNode]=True + Result=[] + while Queue: + cur_node Queue.pop(0) + Result.append(cur_node) + for node in G.neighbors(cur_node): + if not Visited[node]: + Queue.append(node) + Visited[node]=True + print("Result:","->".join(Result)) + def generate_single_trace_setup(self, num_seconds: float, plan_len = None): @set_timer_throw_exc( num_seconds=num_seconds, exception=TraceSearchTimeOut, max_time=num_seconds @@ -83,8 +100,61 @@ def generate_single_trace(self=self, plan_len=plan_len): plan_len = plan_len() trace = Trace() + state = self.problem.init + DG.add_node(state) + Visited={node:False for node in G.nodes} + + Queue= [state] + Visited[state]=True + while Queue: + cur_node = Queue.pop(0) + Result.append(cur_node) + app_act = list(self.instance.applicable(cur_node)) + for act in app_act: + next_state = progress(cur_node, act) + if next_state not in list(G.nodes): + G.add_node(next_state) + Visited[next_state]=False + G.add_edge(cur_node,next_state, action= act) + for node in G.neighbors(cur_node): + if (Visited[node]==False): + if node not in Result: + Queue.append(node) + Visited[node]=True +'''print(Result) +nx.draw(G, with_labels=True) +plt.draw +plt.show + + + + Visited={node:False for node in G.nodes} + Queue[state] + Visited[state]=True + while Queue: + cur_node = Queue.pop(0) + app_act = list(self.instance.applicable(cur_node)) + + Result.append(cur_node) + for node in G.neighbors(cur_node): + if not Visited[node]: + Queue.append(node) + Visited[node]=True + print("Result:","->".join(Result)) + app_act = list(self.instance.applicable(state)) + for i in app_act: + next_state=progress(state, i) + if next_state in digraph: + add edge(next_state, old_state , action=i) + + else: + add_edge(state, next_state, action=i) +''' + + + valid_trace = False while not valid_trace: trace.clear() From fd837a3b695aa1a0dcb94e6ab26d959330951395 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Mon, 25 Jul 2022 23:39:18 -0400 Subject: [PATCH 05/28] Update graph_enum.py --- macq/generate/pddl/graph_enum.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/macq/generate/pddl/graph_enum.py b/macq/generate/pddl/graph_enum.py index 82bfaa94..831bfc05 100644 --- a/macq/generate/pddl/graph_enum.py +++ b/macq/generate/pddl/graph_enum.py @@ -64,20 +64,6 @@ def generate_traces(self): self.traces = traces return traces - def bfs(): - Visited={node:False for node in G.nodes} - Queue[StartNode] - Visited[StartNode]=True - Result=[] - while Queue: - cur_node Queue.pop(0) - Result.append(cur_node) - for node in G.neighbors(cur_node): - if not Visited[node]: - Queue.append(node) - Visited[node]=True - print("Result:","->".join(Result)) - def generate_single_trace_setup(self, num_seconds: float, plan_len = None): @set_timer_throw_exc( num_seconds=num_seconds, exception=TraceSearchTimeOut, max_time=num_seconds @@ -168,7 +154,7 @@ def generate_single_trace(self=self, plan_len=plan_len): if not app_act: break # pick a random applicable action and apply it - +''' for i in app_act: next_state=progress(state, i) if next_state in digraph: @@ -177,7 +163,7 @@ def generate_single_trace(self=self, plan_len=plan_len): else: add_edge(state, next_state, action=i) - +''' act = random.choice(app_act) # create the trace and progress the state macq_action = self.tarski_act_to_macq(act) From 5eabf871428231d58af360a4014f4c2a72f7d93b Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Tue, 26 Jul 2022 00:03:49 -0400 Subject: [PATCH 06/28] Update graph_enum.py --- macq/generate/pddl/graph_enum.py | 43 +------------------------------- 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/macq/generate/pddl/graph_enum.py b/macq/generate/pddl/graph_enum.py index 831bfc05..d4e4c87a 100644 --- a/macq/generate/pddl/graph_enum.py +++ b/macq/generate/pddl/graph_enum.py @@ -106,9 +106,9 @@ def generate_single_trace(self=self, plan_len=plan_len): G.add_edge(cur_node,next_state, action= act) for node in G.neighbors(cur_node): if (Visited[node]==False): - if node not in Result: Queue.append(node) Visited[node]=True + '''print(Result) nx.draw(G, with_labels=True) plt.draw @@ -141,44 +141,3 @@ def generate_single_trace(self=self, plan_len=plan_len): - valid_trace = False - while not valid_trace: - trace.clear() - # add more steps while the trace has not yet reached the desired length - for j in range(plan_len): - # if we have not yet reached the last step - if len(trace) < plan_len - 1: - # find the next applicable actions - app_act = list(self.instance.applicable(state)) - # if the trace reaches a dead lock, disregard this trace and try again - if not app_act: - break - # pick a random applicable action and apply it -''' - for i in app_act: - next_state=progress(state, i) - if next_state in digraph: - add edge(next_state, old_state , action=i) - - else: - add_edge(state, next_state, action=i) - -''' - act = random.choice(app_act) - # create the trace and progress the state - macq_action = self.tarski_act_to_macq(act) - macq_state = self.tarski_state_to_macq(state) - step = Step(macq_state, macq_action, j + 1) - trace.append(step) - state = progress(state, act) - else: - macq_state = self.tarski_state_to_macq(state) - step = Step(state=macq_state, action=None, index=j + 1) - trace.append(step) - valid_trace = True - return trace - - return generate_single_trace - - -traces= Graph_enum(problem_id=198, num_traces=1) \ No newline at end of file From e762a1017fe603b8c3eec2537f353e32970301f2 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Tue, 26 Jul 2022 14:48:50 -0400 Subject: [PATCH 07/28] excess code removed --- macq/generate/pddl/graph_enum.py | 52 ++++++++++++++++-- macq/generate/pddl/graph_enumuation.py | 76 ++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 macq/generate/pddl/graph_enumuation.py diff --git a/macq/generate/pddl/graph_enum.py b/macq/generate/pddl/graph_enum.py index d4e4c87a..989ee184 100644 --- a/macq/generate/pddl/graph_enum.py +++ b/macq/generate/pddl/graph_enum.py @@ -46,7 +46,7 @@ def __init__( if seed: random.seed(seed) - DG=nx.DiGraph() + G=nx.DiGraph() def generate_traces(self): """Generates traces randomly by uniformly sampling applicable actions to find plans @@ -106,9 +106,10 @@ def generate_single_trace(self=self, plan_len=plan_len): G.add_edge(cur_node,next_state, action= act) for node in G.neighbors(cur_node): if (Visited[node]==False): - Queue.append(node) - Visited[node]=True - + Queue.append(node) + Visited[node]=True + return + '''print(Result) nx.draw(G, with_labels=True) plt.draw @@ -138,6 +139,45 @@ def generate_single_trace(self=self, plan_len=plan_len): else: add_edge(state, next_state, action=i) ''' + '''valid_trace = False + while not valid_trace: + trace.clear() + # add more steps while the trace has not yet reached the desired length + for j in range(plan_len): + # if we have not yet reached the last step + if len(trace) < plan_len - 1: + # find the next applicable actions + app_act = list(self.instance.applicable(state)) + # if the trace reaches a dead lock, disregard this trace and try again + if not app_act: + break + # pick a random applicable action and apply it +''' + for i in app_act: + next_state=progress(state, i) + if next_state in digraph: + add edge(next_state, old_state , action=i) + + else: + add_edge(state, next_state, action=i) - - +''' + act = random.choice(app_act) + # create the trace and progress the state + macq_action = self.tarski_act_to_macq(act) + macq_state = self.tarski_state_to_macq(state) + step = Step(macq_state, macq_action, j + 1) + trace.append(step) + state = progress(state, act) + else: + macq_state = self.tarski_state_to_macq(state) + step = Step(state=macq_state, action=None, index=j + 1) + trace.append(step) + valid_trace = True + return trace + ''' + + return generate_single_trace + + +traces= Graph_enum(problem_id=198, num_traces=1) \ No newline at end of file diff --git a/macq/generate/pddl/graph_enumuation.py b/macq/generate/pddl/graph_enumuation.py new file mode 100644 index 00000000..0dadfaae --- /dev/null +++ b/macq/generate/pddl/graph_enumuation.py @@ -0,0 +1,76 @@ +#import matplotlib.pyplot as plt +from tarski.search.operations import progress +import networkx as nx +import macq +from macq.generate.pddl import Generator +from macq.utils import ( + set_timer_throw_exc, + TraceSearchTimeOut, + InvalidTime, + set_num_traces, + set_plan_length, + progress as print_progress, +) +from macq.trace import ( + Step, + Trace, + TraceList, +) + +class Graph_enum(Generator): + + def __init__( + self, + dom: str = None, + prob: str = None, + problem_id: int = None, + observe_pres_effs: bool = False, + num_traces: int = 1, + + ): + super().__init__( + dom=dom, + prob=prob, + problem_id=problem_id, + observe_pres_effs=observe_pres_effs, + ) + + + + self.num_traces = set_num_traces(num_traces) + if self.num_traces > 0: + self.traces = self.generate_graph() + else: + self.traces = None + #self.traces = self.generate_graph() + + + + def generate_graph(self): + G=nx.DiGraph() + state = self.problem.init + G.add_node(state) + Visited={node:False for node in G.nodes} + + Queue= [state] + Visited[state]=True + while Queue: + cur_node = Queue.pop(0) + app_act = list(self.instance.applicable(cur_node)) + for act in app_act: + next_state = progress(cur_node, act) + if next_state not in list(G.nodes): + G.add_node(next_state) + Visited[next_state]=False + G.add_edge(cur_node,next_state, action= act) + for node in G.neighbors(cur_node): + if (Visited[node]==False): + Queue.append(node) + Visited[node]=True + return G + + +traces= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_traces=1) +#nx.draw(traces, with_labels=True) +#plt.draw +#plt.show \ No newline at end of file From f6fb87271ae340fbf63967806f807368538f0629 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Tue, 26 Jul 2022 15:52:54 -0400 Subject: [PATCH 08/28] Update graph_enumuation.py --- macq/generate/pddl/graph_enumuation.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/macq/generate/pddl/graph_enumuation.py b/macq/generate/pddl/graph_enumuation.py index 0dadfaae..d9891f0a 100644 --- a/macq/generate/pddl/graph_enumuation.py +++ b/macq/generate/pddl/graph_enumuation.py @@ -1,4 +1,4 @@ -#import matplotlib.pyplot as plt +import matplotlib.pyplot as plt from tarski.search.operations import progress import networkx as nx import macq @@ -70,7 +70,7 @@ def generate_graph(self): return G -traces= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_traces=1) -#nx.draw(traces, with_labels=True) -#plt.draw -#plt.show \ No newline at end of file +DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_traces=1).traces +plt.figure(figsize=(50,50)) +nx.draw(DG) +plt.show() \ No newline at end of file From f1a5f831f7faaf3092123f9c9ac435c49e8ddc0d Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Tue, 26 Jul 2022 16:30:46 -0400 Subject: [PATCH 09/28] Update graph_enumuation.py --- macq/generate/pddl/graph_enumuation.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/macq/generate/pddl/graph_enumuation.py b/macq/generate/pddl/graph_enumuation.py index d9891f0a..83150349 100644 --- a/macq/generate/pddl/graph_enumuation.py +++ b/macq/generate/pddl/graph_enumuation.py @@ -72,5 +72,12 @@ def generate_graph(self): DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_traces=1).traces plt.figure(figsize=(50,50)) -nx.draw(DG) +pos = nx.spring_layout(DG) +nx.draw(DG,pos) + +edge_labels = dict([((n1, n2), d['action']) + for n1, n2, d in DG.edges(data=True)]) + +nx.draw_networkx_edge_labels(DG,pos,edge_labels=edge_labels,font_size=5, font_weight='bold') + plt.show() \ No newline at end of file From 0fe297784488a1757447034723ed5238fb7e923c Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Wed, 27 Jul 2022 13:35:12 -0400 Subject: [PATCH 10/28] Update dot --- k1.dot | 32 +++++++++++++++++++++++++ k1.pdf | Bin 0 -> 21842 bytes k1.png | Bin 0 -> 54272 bytes macq/generate/pddl/graph_enumuation.py | 19 ++++++++++++--- 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 k1.dot create mode 100644 k1.pdf create mode 100644 k1.png diff --git a/k1.dot b/k1.dot new file mode 100644 index 00000000..d99db919 --- /dev/null +++ b/k1.dot @@ -0,0 +1,32 @@ +strict digraph "" { + node [shape=point] + "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="pick-up(d)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, b)"]; + "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(d, a)"]; + "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; + "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(a)"]; + "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" [label="stack(a, c)"]; + "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" [label="stack(a, d)"]; + "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="stack(c, b)"]; + "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; + "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="stack(c, a)"]; + "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="stack(c, d)"]; + "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, a)"]; + "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, b)"]; + "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, c)"]; + "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" [label="pick-up(a)"]; + "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, c)"]; + "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" [label="pick-up(d)"]; + "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, d)"]; + "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, b)"]; + "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="pick-up(d)"]; + "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, a)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="pick-up(d)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="pick-up(a)"]; +} diff --git a/k1.pdf b/k1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..81653c5a111eb226dc4c03fddf87d40290350cc5 GIT binary patch literal 21842 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

UWm;siUzp=>Q-c64$Qv>v{q{7Ps8E+J=R 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 OFC&AUw3}P(PyHL~o-=^} literal 0 HcmV?d00001 diff --git a/macq/generate/pddl/graph_enumuation.py b/macq/generate/pddl/graph_enumuation.py index 83150349..fcaadde3 100644 --- a/macq/generate/pddl/graph_enumuation.py +++ b/macq/generate/pddl/graph_enumuation.py @@ -2,6 +2,7 @@ from tarski.search.operations import progress import networkx as nx import macq +import pygraphviz from macq.generate.pddl import Generator from macq.utils import ( set_timer_throw_exc, @@ -51,6 +52,7 @@ def generate_graph(self): state = self.problem.init G.add_node(state) Visited={node:False for node in G.nodes} + x=1 Queue= [state] Visited[state]=True @@ -60,8 +62,13 @@ def generate_graph(self): for act in app_act: next_state = progress(cur_node, act) if next_state not in list(G.nodes): - G.add_node(next_state) - Visited[next_state]=False + if x <=20: + #print(x) + G.add_node(next_state) + Visited[next_state]=False + x=x+1 + else: + return G G.add_edge(cur_node,next_state, action= act) for node in G.neighbors(cur_node): if (Visited[node]==False): @@ -71,6 +78,7 @@ def generate_graph(self): DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_traces=1).traces +''' plt.figure(figsize=(50,50)) pos = nx.spring_layout(DG) nx.draw(DG,pos) @@ -79,5 +87,10 @@ def generate_graph(self): for n1, n2, d in DG.edges(data=True)]) nx.draw_networkx_edge_labels(DG,pos,edge_labels=edge_labels,font_size=5, font_weight='bold') +''' +A = nx.nx_agraph.to_agraph(DG) +A.write("k1.dot") # write to dot file +X3 = nx.nx_agraph.read_dot("k1.dot") # read from dotfile -plt.show() \ No newline at end of file +# You can also create .png directly with the AGraph.draw method +#A.draw("k1.png", prog="neato") \ No newline at end of file From 492e4c3961adf8c4301b30c0b35b9b5a01fa22e7 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Wed, 27 Jul 2022 16:25:02 -0400 Subject: [PATCH 11/28] Update graph_enumeration --- .gitignore | 1 + k1.dot | 256 +++++++++++++++++- k1.pdf | Bin 21842 -> 0 bytes macq/generate/pddl/graph_enum.py | 183 ------------- ...aph_enumuation.py => graph_enumeration.py} | 47 +--- macq/generate/pddl/vanilla_sampling.py | 1 + 6 files changed, 266 insertions(+), 222 deletions(-) delete mode 100644 k1.pdf delete mode 100644 macq/generate/pddl/graph_enum.py rename macq/generate/pddl/{graph_enumuation.py => graph_enumeration.py} (68%) diff --git a/.gitignore b/.gitignore index 366d2a1a..6ec8610b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ test_model.json results.txt html/ +*.dot *.DS_Store \ No newline at end of file diff --git a/k1.dot b/k1.dot index d99db919..39aa8d1e 100644 --- a/k1.dot +++ b/k1.dot @@ -1,32 +1,274 @@ strict digraph "" { - node [shape=point] "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="pick-up(d)"]; "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="pick-up(a)"]; "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, b)"]; "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(d, a)"]; "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; + "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(d, a)"]; "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(a)"]; "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" [label="stack(a, c)"]; "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" [label="stack(a, d)"]; "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="stack(c, b)"]; "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="stack(c, a)"]; "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="stack(c, d)"]; - "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, a)"]; - "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, b)"]; + "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="stack(c, a)"]; "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, c)"]; "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" [label="pick-up(a)"]; + "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, a)"]; + "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, b)"]; "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, c)"]; "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" [label="pick-up(d)"]; "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, d)"]; "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, b)"]; "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="pick-up(c)"]; "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="pick-up(a)"]; "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, d)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="pick-up(a)"]; "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, a)"]; "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="pick-up(d)"]; "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" [label="put-down(a)"]; + "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(a), handempty(), on(a,d), on(c,b), on(d,c), ontable(b)]" [label="stack(a, d)"]; + "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(c, b)"]; + "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; + "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" [label="stack(c, d)"]; + "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" -> "Model[clear(d), handempty(), on(a,c), on(c,b), on(d,a), ontable(b)]" [label="stack(d, a)"]; + "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" [label="stack(c, b)"]; + "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; + "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; + "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="stack(d, a)"]; + "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="stack(d, b)"]; + "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="stack(d, c)"]; + "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; + "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="stack(b, c)"]; + "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="stack(b, d)"]; + "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="stack(b, a)"]; + "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(a)"]; + "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="stack(a, d)"]; + "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="stack(a, c)"]; + "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="stack(a, b)"]; + "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="put-down(b)"]; + "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" [label="stack(b, c)"]; + "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" [label="stack(b, a)"]; + "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="put-down(a)"]; + "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="stack(a, c)"]; + "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(a, b)"]; + "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; + "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(d, b)"]; + "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; + "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(b)"]; + "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" [label="stack(b, c)"]; + "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" [label="stack(b, d)"]; + "Model[clear(a), handempty(), on(a,d), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" [label="unstack(a, d)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="pick-up(c)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, a)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="pick-up(b)"]; + "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, d)"]; + "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" [label="pick-up(b)"]; + "Model[clear(d), handempty(), on(a,c), on(c,b), on(d,a), ontable(b)]" -> "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" [label="unstack(d, a)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, d)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, a)"]; + "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="pick-up(c)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="pick-up(a)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, c)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="pick-up(b)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="pick-up(a)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, c)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="pick-up(d)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, d)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, a)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="pick-up(d)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, c)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="pick-up(d)"]; + "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, b)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="pick-up(d)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, c)"]; + "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, a)"]; + "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="unstack(c, d)"]; + "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="unstack(a, c)"]; + "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="pick-up(b)"]; + "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="unstack(a, b)"]; + "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, d)"]; + "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, b)"]; + "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, a)"]; + "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, c)"]; + "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="pick-up(b)"]; + "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, c)"]; + "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" [label="pick-up(d)"]; + "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, d)"]; + "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="unstack(c, a)"]; + "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="put-down(b)"]; + "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" [label="stack(b, c)"]; + "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" [label="stack(b, d)"]; + "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" [label="put-down(b)"]; + "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(b), handempty(), on(b,c), on(c,d), on(d,a), ontable(a)]" [label="stack(b, c)"]; + "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; + "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" [label="stack(b, c)"]; + "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; + "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="put-down(b)"]; + "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" [label="stack(b, c)"]; + "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; + "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(c, a)"]; + "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="stack(c, d)"]; + "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; + "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(a, c)"]; + "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="stack(a, d)"]; + "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(b)"]; + "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="stack(b, d)"]; + "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(b, a)"]; + "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; + "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="stack(a, d)"]; + "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(a, b)"]; + "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" [label="stack(d, a)"]; + "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; + "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="put-down(a)"]; + "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" [label="stack(a, d)"]; + "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" [label="stack(a, b)"]; + "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="put-down(c)"]; + "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" [label="stack(c, a)"]; + "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" [label="stack(c, b)"]; + "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="put-down(a)"]; + "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(a, c)"]; + "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="stack(a, b)"]; + "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(d, c)"]; + "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; + "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(c)"]; + "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" [label="stack(c, d)"]; + "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="stack(c, b)"]; + "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(d, b)"]; + "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; + "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; + "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(b, d)"]; + "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; + "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(d, c)"]; + "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; + "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; + "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(c, d)"]; + "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; + "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" [label="put-down(a)"]; + "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" [label="stack(a, b)"]; + "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="put-down(b)"]; + "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" -> "Model[clear(b), handempty(), on(a,c), on(b,a), on(c,d), ontable(d)]" [label="stack(b, a)"]; + "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" [label="put-down(b)"]; + "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(b), handempty(), on(b,d), on(c,a), on(d,c), ontable(a)]" [label="stack(b, d)"]; + "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" [label="put-down(d)"]; + "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" -> "Model[clear(d), handempty(), on(b,c), on(c,a), on(d,b), ontable(a)]" [label="stack(d, b)"]; + "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="unstack(b, c)"]; + "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="unstack(d, a)"]; + "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="unstack(b, d)"]; + "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" [label="pick-up(c)"]; + "Model[clear(b), handempty(), on(b,c), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" [label="unstack(b, c)"]; + "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="unstack(b, c)"]; + "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="unstack(a, d)"]; + "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="unstack(b, a)"]; + "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="unstack(b, c)"]; + "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, d)"]; + "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="pick-up(a)"]; + "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, c)"]; + "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, d)"]; + "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="pick-up(c)"]; + "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, d)"]; + "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="pick-up(a)"]; + "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, a)"]; + "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, c)"]; + "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="unstack(a, d)"]; + "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="pick-up(b)"]; + "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="unstack(a, b)"]; + "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, c)"]; + "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="pick-up(a)"]; + "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="unstack(a, b)"]; + "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" [label="pick-up(d)"]; + "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="unstack(c, b)"]; + "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" [label="pick-up(a)"]; + "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="unstack(a, c)"]; + "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, d)"]; + "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="unstack(a, b)"]; + "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="pick-up(c)"]; + "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="unstack(c, b)"]; + "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="pick-up(d)"]; + "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, a)"]; + "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="pick-up(b)"]; + "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, a)"]; + "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="pick-up(d)"]; + "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, a)"]; + "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="pick-up(c)"]; + "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, a)"]; + "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="pick-up(d)"]; + "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="unstack(a, b)"]; + "Model[clear(b), handempty(), on(a,c), on(b,a), on(c,d), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="unstack(b, a)"]; + "Model[clear(b), handempty(), on(b,d), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="unstack(b, d)"]; + "Model[clear(d), handempty(), on(b,c), on(c,a), on(d,b), ontable(a)]" -> "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" [label="unstack(d, b)"]; + "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" [label="put-down(c)"]; + "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" -> "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" [label="stack(c, b)"]; + "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="put-down(c)"]; + "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" [label="stack(c, b)"]; + "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="put-down(a)"]; + "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" [label="stack(a, c)"]; + "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="put-down(c)"]; + "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" [label="stack(c, a)"]; + "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="put-down(a)"]; + "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" [label="stack(a, b)"]; + "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="put-down(b)"]; + "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" [label="stack(b, a)"]; + "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="put-down(a)"]; + "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" [label="stack(a, d)"]; + "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" -> "Model[clear(d), handempty(), on(a,b), on(b,c), on(d,a), ontable(c)]" [label="stack(d, a)"]; + "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" [label="put-down(a)"]; + "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" [label="stack(a, c)"]; + "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="put-down(c)"]; + "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" [label="stack(c, a)"]; + "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="put-down(c)"]; + "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" [label="stack(c, d)"]; + "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="put-down(d)"]; + "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" [label="stack(d, c)"]; + "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="put-down(b)"]; + "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" [label="stack(b, d)"]; + "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" [label="stack(d, b)"]; + "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="put-down(c)"]; + "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" [label="stack(c, d)"]; + "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="put-down(d)"]; + "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" [label="stack(d, c)"]; + "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" -> "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" [label="unstack(c, b)"]; + "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="unstack(c, b)"]; + "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="unstack(a, c)"]; + "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="unstack(c, a)"]; + "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="unstack(a, b)"]; + "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="unstack(b, a)"]; + "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="unstack(a, d)"]; + "Model[clear(d), handempty(), on(a,b), on(b,c), on(d,a), ontable(c)]" -> "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" [label="unstack(d, a)"]; + "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" [label="unstack(a, c)"]; + "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="unstack(c, a)"]; + "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="unstack(c, d)"]; + "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="unstack(d, c)"]; + "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="unstack(b, d)"]; + "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="unstack(c, d)"]; + "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="unstack(d, c)"]; } diff --git a/k1.pdf b/k1.pdf deleted file mode 100644 index 81653c5a111eb226dc4c03fddf87d40290350cc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21842 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 0: - self.traces = self.generate_traces() - else: - self.traces = None - if seed: - random.seed(seed) - - G=nx.DiGraph() - - def generate_traces(self): - """Generates traces randomly by uniformly sampling applicable actions to find plans - of the given length. - - Returns: - A TraceList object with the list of traces generated. - """ - traces = TraceList() - traces.generator = self.generate_single_trace_setup( - num_seconds=self.max_time, plan_len=self.plan_len - ) - for _ in print_progress(range(self.num_traces)): - traces.append(traces.generator()) - self.traces = traces - return traces - - def generate_single_trace_setup(self, num_seconds: float, plan_len = None): - @set_timer_throw_exc( - num_seconds=num_seconds, exception=TraceSearchTimeOut, max_time=num_seconds - ) - def generate_single_trace(self=self, plan_len=plan_len): - """Generates a single trace using the uniform random sampling technique. - Loops until a valid trace is found. The timer wrapper does not allow the function - to run past the time specified. - - The outside function is a wrapper that provides parameters for both the timer - wrapper and the function. - - Returns: - A Trace object (the valid trace generated). - """ - - if not plan_len: - plan_len = self.plan_len - if callable(plan_len): - plan_len = plan_len() - - trace = Trace() - - - state = self.problem.init - DG.add_node(state) - Visited={node:False for node in G.nodes} - - Queue= [state] - Visited[state]=True - while Queue: - cur_node = Queue.pop(0) - Result.append(cur_node) - app_act = list(self.instance.applicable(cur_node)) - for act in app_act: - next_state = progress(cur_node, act) - if next_state not in list(G.nodes): - G.add_node(next_state) - Visited[next_state]=False - G.add_edge(cur_node,next_state, action= act) - for node in G.neighbors(cur_node): - if (Visited[node]==False): - Queue.append(node) - Visited[node]=True - return - -'''print(Result) -nx.draw(G, with_labels=True) -plt.draw -plt.show - - - - Visited={node:False for node in G.nodes} - Queue[state] - Visited[state]=True - while Queue: - cur_node = Queue.pop(0) - app_act = list(self.instance.applicable(cur_node)) - - Result.append(cur_node) - for node in G.neighbors(cur_node): - if not Visited[node]: - Queue.append(node) - Visited[node]=True - print("Result:","->".join(Result)) - app_act = list(self.instance.applicable(state)) - for i in app_act: - next_state=progress(state, i) - if next_state in digraph: - add edge(next_state, old_state , action=i) - - else: - add_edge(state, next_state, action=i) -''' - '''valid_trace = False - while not valid_trace: - trace.clear() - # add more steps while the trace has not yet reached the desired length - for j in range(plan_len): - # if we have not yet reached the last step - if len(trace) < plan_len - 1: - # find the next applicable actions - app_act = list(self.instance.applicable(state)) - # if the trace reaches a dead lock, disregard this trace and try again - if not app_act: - break - # pick a random applicable action and apply it -''' - for i in app_act: - next_state=progress(state, i) - if next_state in digraph: - add edge(next_state, old_state , action=i) - - else: - add_edge(state, next_state, action=i) - -''' - act = random.choice(app_act) - # create the trace and progress the state - macq_action = self.tarski_act_to_macq(act) - macq_state = self.tarski_state_to_macq(state) - step = Step(macq_state, macq_action, j + 1) - trace.append(step) - state = progress(state, act) - else: - macq_state = self.tarski_state_to_macq(state) - step = Step(state=macq_state, action=None, index=j + 1) - trace.append(step) - valid_trace = True - return trace - ''' - - return generate_single_trace - - -traces= Graph_enum(problem_id=198, num_traces=1) \ No newline at end of file diff --git a/macq/generate/pddl/graph_enumuation.py b/macq/generate/pddl/graph_enumeration.py similarity index 68% rename from macq/generate/pddl/graph_enumuation.py rename to macq/generate/pddl/graph_enumeration.py index fcaadde3..1e105919 100644 --- a/macq/generate/pddl/graph_enumuation.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -4,19 +4,7 @@ import macq import pygraphviz from macq.generate.pddl import Generator -from macq.utils import ( - set_timer_throw_exc, - TraceSearchTimeOut, - InvalidTime, - set_num_traces, - set_plan_length, - progress as print_progress, -) -from macq.trace import ( - Step, - Trace, - TraceList, -) +import math class Graph_enum(Generator): @@ -25,21 +13,17 @@ def __init__( dom: str = None, prob: str = None, problem_id: int = None, - observe_pres_effs: bool = False, - num_traces: int = 1, + num_nodes: int = math.inf, ): super().__init__( dom=dom, prob=prob, problem_id=problem_id, - observe_pres_effs=observe_pres_effs, ) - - - self.num_traces = set_num_traces(num_traces) - if self.num_traces > 0: + self.num_nodes = num_nodes + if num_nodes > 0: self.traces = self.generate_graph() else: self.traces = None @@ -52,7 +36,6 @@ def generate_graph(self): state = self.problem.init G.add_node(state) Visited={node:False for node in G.nodes} - x=1 Queue= [state] Visited[state]=True @@ -61,15 +44,15 @@ def generate_graph(self): app_act = list(self.instance.applicable(cur_node)) for act in app_act: next_state = progress(cur_node, act) - if next_state not in list(G.nodes): - if x <=20: + if next_state not in Visited: + if self.num_nodes>1: #print(x) G.add_node(next_state) Visited[next_state]=False - x=x+1 + self.num_nodes= self.num_nodes-1 else: return G - G.add_edge(cur_node,next_state, action= act) + G.add_edge(cur_node,next_state, label= act) for node in G.neighbors(cur_node): if (Visited[node]==False): Queue.append(node) @@ -77,20 +60,20 @@ def generate_graph(self): return G -DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_traces=1).traces -''' +DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl').traces + plt.figure(figsize=(50,50)) pos = nx.spring_layout(DG) nx.draw(DG,pos) -edge_labels = dict([((n1, n2), d['action']) +edge_labels = dict([((n1, n2), d['label']) for n1, n2, d in DG.edges(data=True)]) -nx.draw_networkx_edge_labels(DG,pos,edge_labels=edge_labels,font_size=5, font_weight='bold') -''' +nx.draw_networkx_edge_labels(DG,pos,edge_labels=edge_labels,font_size=5) +plt.show() + A = nx.nx_agraph.to_agraph(DG) A.write("k1.dot") # write to dot file X3 = nx.nx_agraph.read_dot("k1.dot") # read from dotfile -# You can also create .png directly with the AGraph.draw method -#A.draw("k1.png", prog="neato") \ No newline at end of file +#A.draw("k1.png", prog="neato") diff --git a/macq/generate/pddl/vanilla_sampling.py b/macq/generate/pddl/vanilla_sampling.py index 5a1a786a..c7d20868 100644 --- a/macq/generate/pddl/vanilla_sampling.py +++ b/macq/generate/pddl/vanilla_sampling.py @@ -76,6 +76,7 @@ def __init__( random.seed(seed) self.max_time = max_time self.plan_len = set_plan_length(plan_len) + self.num_traces = set_num_traces(num_traces) if self.num_traces > 0: self.traces = self.generate_traces() From b08346abfb2351c8b5007e19e1f7ba7c5a75e536 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Thu, 4 Aug 2022 16:10:07 -0400 Subject: [PATCH 12/28] Update graph_enumeration --- k1.dot | 86 ++++++++++++------------- macq/generate/pddl/graph_enumeration.py | 56 ++++++++++++++-- 2 files changed, 94 insertions(+), 48 deletions(-) diff --git a/k1.dot b/k1.dot index 39aa8d1e..29b2d838 100644 --- a/k1.dot +++ b/k1.dot @@ -42,8 +42,8 @@ strict digraph "" { "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="stack(d, b)"]; "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="stack(d, c)"]; + "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="stack(d, b)"]; "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="stack(b, c)"]; "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="stack(b, d)"]; @@ -59,8 +59,8 @@ strict digraph "" { "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="stack(a, c)"]; "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(a, b)"]; "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(d, b)"]; "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; + "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(d, b)"]; "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(b)"]; "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" [label="stack(b, c)"]; "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" [label="stack(b, d)"]; @@ -76,12 +76,12 @@ strict digraph "" { "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="pick-up(b)"]; "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, a)"]; "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="pick-up(a)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, c)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="pick-up(b)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="pick-up(a)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="pick-up(c)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="pick-up(a)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, c)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="pick-up(d)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="pick-up(a)"]; @@ -89,14 +89,14 @@ strict digraph "" { "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="pick-up(c)"]; "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="pick-up(a)"]; "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="pick-up(d)"]; "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="pick-up(d)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, c)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="pick-up(d)"]; "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="pick-up(b)"]; "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="pick-up(d)"]; "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="pick-up(c)"]; + "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="pick-up(d)"]; "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, c)"]; "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="pick-up(a)"]; "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, a)"]; @@ -105,10 +105,10 @@ strict digraph "" { "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="pick-up(b)"]; "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="unstack(a, b)"]; "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, d)"]; - "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, b)"]; - "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, a)"]; "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, c)"]; "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="pick-up(b)"]; + "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, b)"]; + "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, a)"]; "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, c)"]; "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" [label="pick-up(d)"]; "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, d)"]; @@ -123,18 +123,18 @@ strict digraph "" { "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="put-down(b)"]; "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(c, a)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="stack(c, d)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(a, c)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="stack(a, d)"]; "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(b)"]; "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="stack(b, d)"]; "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(b, a)"]; "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="stack(a, d)"]; "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(a, b)"]; + "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; + "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(c, a)"]; + "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="stack(c, d)"]; + "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; + "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(a, c)"]; + "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="stack(a, d)"]; "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" [label="stack(d, a)"]; "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; @@ -147,24 +147,24 @@ strict digraph "" { "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="put-down(a)"]; "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(a, c)"]; "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(c)"]; "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" [label="stack(c, d)"]; "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="stack(c, b)"]; + "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(d, c)"]; + "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(d, b)"]; "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(b, d)"]; "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(c, d)"]; "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; + "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; + "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(d, c)"]; + "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" [label="put-down(a)"]; "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" [label="stack(a, b)"]; "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="put-down(b)"]; @@ -183,12 +183,6 @@ strict digraph "" { "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="unstack(b, a)"]; "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="pick-up(c)"]; "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, d)"]; - "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="pick-up(a)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="pick-up(c)"]; "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, d)"]; "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="pick-up(a)"]; "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, a)"]; @@ -197,6 +191,12 @@ strict digraph "" { "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="pick-up(b)"]; "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="unstack(a, b)"]; "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, c)"]; + "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, d)"]; + "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="pick-up(a)"]; + "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, c)"]; + "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, d)"]; + "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="pick-up(c)"]; "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="unstack(d, b)"]; "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="pick-up(a)"]; "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="unstack(a, b)"]; @@ -207,18 +207,18 @@ strict digraph "" { "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, d)"]; "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="unstack(a, b)"]; "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="pick-up(c)"]; "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="unstack(c, b)"]; "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="pick-up(d)"]; + "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, b)"]; + "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="pick-up(c)"]; "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, a)"]; "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="pick-up(b)"]; "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, a)"]; "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="pick-up(c)"]; "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, a)"]; "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="pick-up(d)"]; + "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, a)"]; + "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="pick-up(c)"]; "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="unstack(a, b)"]; "Model[clear(b), handempty(), on(a,c), on(b,a), on(c,d), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="unstack(b, a)"]; "Model[clear(b), handempty(), on(b,d), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="unstack(b, d)"]; @@ -227,14 +227,14 @@ strict digraph "" { "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" -> "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" [label="stack(c, b)"]; "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="put-down(c)"]; "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="put-down(a)"]; - "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" [label="stack(a, c)"]; - "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" [label="stack(c, a)"]; "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="put-down(a)"]; "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" [label="stack(a, b)"]; "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="put-down(b)"]; "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" [label="stack(b, a)"]; + "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="put-down(a)"]; + "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" [label="stack(a, c)"]; + "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="put-down(c)"]; + "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" [label="stack(c, a)"]; "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="put-down(a)"]; "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" [label="stack(a, d)"]; "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" [label="put-down(d)"]; @@ -243,32 +243,32 @@ strict digraph "" { "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" [label="stack(a, c)"]; "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="put-down(c)"]; "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="put-down(c)"]; - "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" [label="stack(c, d)"]; "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="put-down(d)"]; "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" [label="stack(d, c)"]; + "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="put-down(c)"]; + "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" [label="stack(c, d)"]; "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="put-down(b)"]; "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" [label="stack(b, d)"]; "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="put-down(d)"]; "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" [label="stack(c, d)"]; "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="put-down(d)"]; "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" [label="stack(d, c)"]; + "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="put-down(c)"]; + "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" [label="stack(c, d)"]; "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" -> "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" [label="unstack(c, b)"]; "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="unstack(a, c)"]; - "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="unstack(c, a)"]; "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="unstack(a, b)"]; "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="unstack(b, a)"]; + "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="unstack(a, c)"]; + "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="unstack(c, a)"]; "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="unstack(a, d)"]; "Model[clear(d), handempty(), on(a,b), on(b,c), on(d,a), ontable(c)]" -> "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" [label="unstack(d, a)"]; "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" [label="unstack(a, c)"]; "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="unstack(c, d)"]; "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="unstack(d, c)"]; + "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="unstack(c, d)"]; "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="unstack(b, d)"]; "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="unstack(c, d)"]; "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="unstack(d, c)"]; + "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="unstack(c, d)"]; } diff --git a/macq/generate/pddl/graph_enumeration.py b/macq/generate/pddl/graph_enumeration.py index 1e105919..d1ad7377 100644 --- a/macq/generate/pddl/graph_enumeration.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -5,6 +5,21 @@ import pygraphviz from macq.generate.pddl import Generator import math +from macq.trace import ( + State, + Trace, + Action, +) + +class Step: + + def __init__(self, state: State, action: Action, next_state: State, index: int): + + self.state = state + self.action = action + self.index = index + self.next_state=next_state + class Graph_enum(Generator): @@ -21,14 +36,44 @@ def __init__( prob=prob, problem_id=problem_id, ) - + self.num_nodes = num_nodes if num_nodes > 0: - self.traces = self.generate_graph() + self.traces = self.generate_traces() else: self.traces = None + + + + def generate_traces(self): + traces = self.generate_single_trace() + self.traces=traces + return traces + + + #self.traces = self.generate_graph() + def generate_single_trace(self): + + trace = Trace() + graph= self.generate_graph() + + edge_labels = dict([((n1, n2), d['label']) + for n1, n2, d in graph.edges(data=True)]) + + DFS=list(nx.edge_dfs(graph,list(graph.nodes)[0])) + count=1 + for i in DFS: + macq_action = self.tarski_act_to_macq(edge_labels.get(i)) + macq_cur_state = self.tarski_state_to_macq(i[0]) + macq_next_state = self.tarski_state_to_macq(i[1]) + step = Step(macq_cur_state, macq_action,macq_next_state, count) + count+=1 + trace.append(step) + + return trace + def generate_graph(self): @@ -49,7 +94,7 @@ def generate_graph(self): #print(x) G.add_node(next_state) Visited[next_state]=False - self.num_nodes= self.num_nodes-1 + self.num_nodes-= 1 else: return G G.add_edge(cur_node,next_state, label= act) @@ -61,8 +106,8 @@ def generate_graph(self): DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl').traces - -plt.figure(figsize=(50,50)) +print(DG) +'''plt.figure(figsize=(50,50)) pos = nx.spring_layout(DG) nx.draw(DG,pos) @@ -77,3 +122,4 @@ def generate_graph(self): X3 = nx.nx_agraph.read_dot("k1.dot") # read from dotfile #A.draw("k1.png", prog="neato") +''' \ No newline at end of file From 625e4525003fb7c5ff5fcee4f9510cd732710718 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Thu, 4 Aug 2022 18:08:56 -0400 Subject: [PATCH 13/28] Update graph_enumeration.py --- macq/generate/pddl/graph_enumeration.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/macq/generate/pddl/graph_enumeration.py b/macq/generate/pddl/graph_enumeration.py index d1ad7377..92cccba0 100644 --- a/macq/generate/pddl/graph_enumeration.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -1,14 +1,15 @@ import matplotlib.pyplot as plt from tarski.search.operations import progress import networkx as nx -import macq import pygraphviz from macq.generate.pddl import Generator import math +from macq.utils import progress as print_progress from macq.trace import ( State, Trace, Action, + TraceList, ) class Step: @@ -46,8 +47,10 @@ def __init__( def generate_traces(self): - traces = self.generate_single_trace() - self.traces=traces + + traces = TraceList() + traces=self.generate_single_trace() + self.traces = traces return traces @@ -105,8 +108,8 @@ def generate_graph(self): return G -DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl').traces -print(DG) +DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_nodes=10).traces +print(DG.traces) '''plt.figure(figsize=(50,50)) pos = nx.spring_layout(DG) nx.draw(DG,pos) From e4b3d2d5beda7ec13f7b4e6cc8ec30f51374faf8 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Thu, 4 Aug 2022 19:03:23 -0400 Subject: [PATCH 14/28] Update graph_enumeration.py --- macq/generate/pddl/graph_enumeration.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/macq/generate/pddl/graph_enumeration.py b/macq/generate/pddl/graph_enumeration.py index 92cccba0..309229fe 100644 --- a/macq/generate/pddl/graph_enumeration.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -20,6 +20,12 @@ def __init__(self, state: State, action: Action, next_state: State, index: int): self.action = action self.index = index self.next_state=next_state + def print_step(self): + print(self.index) + print(self.state) + print(self.action) + print(self.next_state) + print("-----") class Graph_enum(Generator): @@ -49,7 +55,9 @@ def __init__( def generate_traces(self): traces = TraceList() - traces=self.generate_single_trace() + traces.generator=self.generate_single_trace() + for _ in print_progress(range(1)): + traces.append(traces.generator) self.traces = traces return traces @@ -72,6 +80,7 @@ def generate_single_trace(self): macq_cur_state = self.tarski_state_to_macq(i[0]) macq_next_state = self.tarski_state_to_macq(i[1]) step = Step(macq_cur_state, macq_action,macq_next_state, count) + #step.print_step() count+=1 trace.append(step) @@ -109,7 +118,7 @@ def generate_graph(self): DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_nodes=10).traces -print(DG.traces) +DG.print() '''plt.figure(figsize=(50,50)) pos = nx.spring_layout(DG) nx.draw(DG,pos) From 754f25845b477b194988ebeab50112356c369fa8 Mon Sep 17 00:00:00 2001 From: Christian Muise Date: Fri, 5 Aug 2022 14:58:26 -0400 Subject: [PATCH 15/28] Delete k1.dot --- k1.dot | 274 --------------------------------------------------------- 1 file changed, 274 deletions(-) delete mode 100644 k1.dot diff --git a/k1.dot b/k1.dot deleted file mode 100644 index 29b2d838..00000000 --- a/k1.dot +++ /dev/null @@ -1,274 +0,0 @@ -strict digraph "" { - "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; - "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(d, a)"]; - "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(a)"]; - "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" [label="stack(a, d)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="stack(c, d)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" [label="pick-up(a)"]; - "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, a)"]; - "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, d)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" [label="put-down(a)"]; - "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(a), handempty(), on(a,d), on(c,b), on(d,c), ontable(b)]" [label="stack(a, d)"]; - "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(c, b)"]; - "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" [label="stack(c, d)"]; - "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" -> "Model[clear(d), handempty(), on(a,c), on(c,b), on(d,a), ontable(b)]" [label="stack(d, a)"]; - "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="stack(b, d)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="stack(a, d)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; - "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(d, b)"]; - "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" [label="stack(b, d)"]; - "Model[clear(a), handempty(), on(a,d), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" [label="unstack(a, d)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, d)"]; - "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" [label="pick-up(b)"]; - "Model[clear(d), handempty(), on(a,c), on(c,b), on(d,a), ontable(b)]" -> "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" [label="unstack(d, a)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, d)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="unstack(c, d)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, d)"]; - "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, c)"]; - "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="pick-up(b)"]; - "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, b)"]; - "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, a)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" [label="pick-up(d)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, d)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" [label="stack(b, c)"]; - "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" [label="stack(b, d)"]; - "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" [label="put-down(b)"]; - "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(b), handempty(), on(b,c), on(c,d), on(d,a), ontable(a)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="stack(b, d)"]; - "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(b, a)"]; - "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; - "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="stack(a, d)"]; - "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(a, b)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(c, a)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="stack(c, d)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(a, c)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="stack(a, d)"]; - "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" [label="stack(a, d)"]; - "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" [label="stack(c, d)"]; - "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(b, d)"]; - "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(c, d)"]; - "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" -> "Model[clear(b), handempty(), on(a,c), on(b,a), on(c,d), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" [label="put-down(b)"]; - "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(b), handempty(), on(b,d), on(c,a), on(d,c), ontable(a)]" [label="stack(b, d)"]; - "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" -> "Model[clear(d), handempty(), on(b,c), on(c,a), on(d,b), ontable(a)]" [label="stack(d, b)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="unstack(b, c)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="unstack(b, d)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" [label="pick-up(c)"]; - "Model[clear(b), handempty(), on(b,c), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="unstack(a, d)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, d)"]; - "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, d)"]; - "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="pick-up(a)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, d)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="pick-up(d)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="pick-up(c)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(b), handempty(), on(a,c), on(b,a), on(c,d), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), handempty(), on(b,d), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="unstack(b, d)"]; - "Model[clear(d), handempty(), on(b,c), on(c,a), on(d,b), ontable(a)]" -> "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" [label="unstack(d, b)"]; - "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" [label="put-down(c)"]; - "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" -> "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" [label="stack(c, b)"]; - "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="put-down(a)"]; - "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" [label="stack(a, b)"]; - "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" [label="stack(b, a)"]; - "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="put-down(a)"]; - "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" [label="stack(a, c)"]; - "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" [label="stack(c, a)"]; - "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="put-down(a)"]; - "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" [label="stack(a, d)"]; - "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" -> "Model[clear(d), handempty(), on(a,b), on(b,c), on(d,a), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" [label="put-down(a)"]; - "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="put-down(d)"]; - "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" [label="stack(d, c)"]; - "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="put-down(c)"]; - "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" [label="stack(c, d)"]; - "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" [label="stack(b, d)"]; - "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" [label="stack(d, c)"]; - "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" [label="stack(c, d)"]; - "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" -> "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" [label="unstack(c, b)"]; - "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="unstack(a, b)"]; - "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="unstack(b, a)"]; - "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="unstack(a, c)"]; - "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="unstack(c, a)"]; - "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="unstack(a, d)"]; - "Model[clear(d), handempty(), on(a,b), on(b,c), on(d,a), ontable(c)]" -> "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="unstack(d, c)"]; - "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="unstack(c, d)"]; - "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="unstack(b, d)"]; - "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="unstack(d, c)"]; - "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="unstack(c, d)"]; -} From d17b95e040a5baee2474d29f5dbb26c90d81f941 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Mon, 8 Aug 2022 11:50:39 -0400 Subject: [PATCH 16/28] Update graph_enum --- k1.dot | 274 ------------------------ k1.png | Bin 54272 -> 0 bytes macq/generate/pddl/graph_enumeration.py | 75 +++---- 3 files changed, 38 insertions(+), 311 deletions(-) delete mode 100644 k1.dot delete mode 100644 k1.png diff --git a/k1.dot b/k1.dot deleted file mode 100644 index 29b2d838..00000000 --- a/k1.dot +++ /dev/null @@ -1,274 +0,0 @@ -strict digraph "" { - "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; - "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(d, a)"]; - "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="put-down(a)"]; - "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" [label="stack(a, d)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(c,b), ontable(a), ontable(b), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="stack(c, d)"]; - "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" [label="pick-up(a)"]; - "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), holding(d), on(c,b), ontable(a), ontable(b)]" [label="unstack(d, a)"]; - "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(a), on(c,b), ontable(b), ontable(d)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, d)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), holding(c), ontable(a), ontable(b), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(c,b), on(d,c), ontable(a), ontable(b)]" [label="put-down(a)"]; - "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(a), handempty(), on(a,d), on(c,b), on(d,c), ontable(b)]" [label="stack(a, d)"]; - "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,b), on(d,a), ontable(a), ontable(b)]" [label="stack(c, b)"]; - "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" [label="stack(c, d)"]; - "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(c,b), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" -> "Model[clear(d), handempty(), on(a,c), on(c,b), on(d,a), ontable(b)]" [label="stack(d, a)"]; - "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(c,b), ontable(b), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="stack(b, d)"]; - "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), clear(d), handempty(), ontable(a), ontable(b), ontable(c), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="stack(a, d)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(c,d), ontable(a), ontable(b), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" [label="stack(d, c)"]; - "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(d, b)"]; - "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(c,a), ontable(a), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" [label="stack(b, d)"]; - "Model[clear(a), handempty(), on(a,d), on(c,b), on(d,c), ontable(b)]" -> "Model[clear(d), holding(a), on(c,b), on(d,c), ontable(b)]" [label="unstack(a, d)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(b), clear(d), holding(c), on(d,a), ontable(a), ontable(b)]" [label="unstack(c, d)"]; - "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" -> "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" [label="pick-up(b)"]; - "Model[clear(d), handempty(), on(a,c), on(c,b), on(d,a), ontable(b)]" -> "Model[clear(a), holding(d), on(a,c), on(c,b), ontable(b)]" [label="unstack(d, a)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(a,d), ontable(b), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(c), holding(d), ontable(a), ontable(b), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, d)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), holding(b), ontable(a), ontable(c), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), holding(a), ontable(b), ontable(c), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(c,d), ontable(a), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="unstack(c, d)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="pick-up(b)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(c,d), ontable(b), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, d)"]; - "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, c)"]; - "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="pick-up(b)"]; - "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(b), clear(c), holding(d), on(c,a), ontable(a), ontable(b)]" [label="unstack(d, b)"]; - "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, a)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" [label="pick-up(d)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), holding(b), on(c,a), ontable(a), ontable(d)]" [label="unstack(b, d)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(d,a), ontable(a), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" [label="stack(b, c)"]; - "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" [label="stack(b, d)"]; - "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(b), clear(c), handempty(), on(c,d), on(d,a), ontable(a), ontable(b)]" [label="put-down(b)"]; - "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(b), handempty(), on(b,c), on(c,d), on(d,a), ontable(a)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(a,d), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(c,a), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" -> "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" [label="stack(b, c)"]; - "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="stack(b, d)"]; - "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(b, a)"]; - "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(d,c), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; - "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="stack(a, d)"]; - "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(a, b)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(c,a), on(d,b), ontable(a), ontable(b)]" [label="stack(c, a)"]; - "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="stack(c, d)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(d,b), ontable(a), ontable(b), ontable(c)]" [label="put-down(a)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(a, c)"]; - "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="stack(a, d)"]; - "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(b,c), ontable(a), ontable(c), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" [label="stack(a, d)"]; - "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(c,a), ontable(a), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(c), handempty(), on(b,d), ontable(a), ontable(c), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(b,a), on(c,d), ontable(a), ontable(d)]" [label="stack(c, d)"]; - "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), clear(d), handempty(), on(b,a), ontable(a), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), clear(d), handempty(), on(a,c), ontable(b), ontable(c), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" [label="stack(b, d)"]; - "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(c,d), ontable(b), ontable(d)]" [label="stack(c, d)"]; - "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), clear(d), handempty(), on(a,b), ontable(b), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" [label="stack(d, c)"]; - "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(b,c), on(c,d), ontable(a), ontable(d)]" [label="put-down(a)"]; - "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" [label="stack(a, b)"]; - "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" -> "Model[clear(a), clear(b), handempty(), on(a,c), on(c,d), ontable(b), ontable(d)]" [label="put-down(b)"]; - "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" -> "Model[clear(b), handempty(), on(a,c), on(b,a), on(c,d), ontable(d)]" [label="stack(b, a)"]; - "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(b), clear(d), handempty(), on(c,a), on(d,c), ontable(a), ontable(b)]" [label="put-down(b)"]; - "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(b), handempty(), on(b,d), on(c,a), on(d,c), ontable(a)]" [label="stack(b, d)"]; - "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" -> "Model[clear(b), clear(d), handempty(), on(b,c), on(c,a), ontable(a), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" -> "Model[clear(d), handempty(), on(b,c), on(c,a), on(d,b), ontable(a)]" [label="stack(d, b)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="unstack(b, c)"]; - "Model[clear(b), clear(d), handempty(), on(b,c), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(c), clear(d), holding(b), on(d,a), ontable(a), ontable(c)]" [label="unstack(b, d)"]; - "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" -> "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" [label="pick-up(c)"]; - "Model[clear(b), handempty(), on(b,c), on(c,d), on(d,a), ontable(a)]" -> "Model[clear(c), holding(b), on(c,d), on(d,a), ontable(a)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="unstack(a, d)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(c), holding(b), on(a,d), ontable(c), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(b), handempty(), on(a,d), on(b,c), on(c,a), ontable(d)]" -> "Model[clear(c), holding(b), on(a,d), on(c,a), ontable(d)]" [label="unstack(b, c)"]; - "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, d)"]; - "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(a), clear(d), holding(b), on(d,c), ontable(a), ontable(c)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(d), handempty(), on(b,a), on(d,c), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(b), clear(d), holding(a), on(d,c), ontable(b), ontable(c)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(d,c), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, c)"]; - "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(a), clear(d), holding(c), on(d,b), ontable(a), ontable(b)]" [label="unstack(c, d)"]; - "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="pick-up(a)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(d), handempty(), on(a,c), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(c), clear(d), holding(a), on(d,b), ontable(b), ontable(c)]" [label="unstack(a, d)"]; - "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(b,c), ontable(a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="pick-up(a)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(b), clear(d), holding(a), on(b,c), ontable(c), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" -> "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(a), clear(b), holding(c), on(b,d), ontable(a), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" [label="pick-up(a)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(a), clear(b), handempty(), on(a,c), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, d)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(b), clear(c), holding(a), on(b,d), ontable(c), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="pick-up(c)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(b), clear(d), holding(c), on(b,a), ontable(a), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="pick-up(d)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(b), clear(c), holding(d), on(b,a), ontable(a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="pick-up(c)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(b), holding(d), on(a,c), ontable(b), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="pick-up(b)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(a), clear(d), holding(b), on(a,c), ontable(c), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="pick-up(d)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(a), clear(d), holding(c), on(a,b), ontable(b), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="pick-up(d)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(a), clear(c), holding(d), on(a,b), ontable(b), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="pick-up(c)"]; - "Model[clear(a), handempty(), on(a,b), on(b,c), on(c,d), ontable(d)]" -> "Model[clear(b), holding(a), on(b,c), on(c,d), ontable(d)]" [label="unstack(a, b)"]; - "Model[clear(b), handempty(), on(a,c), on(b,a), on(c,d), ontable(d)]" -> "Model[clear(a), holding(b), on(a,c), on(c,d), ontable(d)]" [label="unstack(b, a)"]; - "Model[clear(b), handempty(), on(b,d), on(c,a), on(d,c), ontable(a)]" -> "Model[clear(d), holding(b), on(c,a), on(d,c), ontable(a)]" [label="unstack(b, d)"]; - "Model[clear(d), handempty(), on(b,c), on(c,a), on(d,b), ontable(a)]" -> "Model[clear(b), holding(d), on(b,c), on(c,a), ontable(a)]" [label="unstack(d, b)"]; - "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" -> "Model[clear(b), clear(c), handempty(), on(b,d), on(d,a), ontable(a), ontable(c)]" [label="put-down(c)"]; - "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" -> "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" [label="stack(c, b)"]; - "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(b), clear(c), handempty(), on(a,d), on(b,a), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" -> "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" [label="stack(c, b)"]; - "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(b,d), on(d,c), ontable(a), ontable(c)]" [label="put-down(a)"]; - "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" [label="stack(a, b)"]; - "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(a), clear(b), handempty(), on(a,d), on(d,c), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" -> "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" [label="stack(b, a)"]; - "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(c,d), on(d,b), ontable(a), ontable(b)]" [label="put-down(a)"]; - "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" [label="stack(a, c)"]; - "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(a), clear(c), handempty(), on(a,d), on(d,b), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" -> "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" [label="stack(c, a)"]; - "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(b,c), on(d,b), ontable(a), ontable(c)]" [label="put-down(a)"]; - "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" [label="stack(a, d)"]; - "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" -> "Model[clear(a), clear(d), handempty(), on(a,b), on(b,c), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" -> "Model[clear(d), handempty(), on(a,b), on(b,c), on(d,a), ontable(c)]" [label="stack(d, a)"]; - "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(b,d), on(c,b), ontable(a), ontable(d)]" [label="put-down(a)"]; - "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" [label="stack(a, c)"]; - "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(a), clear(c), handempty(), on(a,b), on(b,d), ontable(c), ontable(d)]" [label="put-down(c)"]; - "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" -> "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" [label="stack(c, a)"]; - "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(c,b), ontable(a), ontable(d)]" [label="put-down(d)"]; - "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" -> "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" [label="stack(d, c)"]; - "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), clear(d), handempty(), on(b,a), on(d,b), ontable(a), ontable(c)]" [label="put-down(c)"]; - "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" -> "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" [label="stack(c, d)"]; - "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(d,a), ontable(b), ontable(c)]" [label="put-down(b)"]; - "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" -> "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" [label="stack(b, d)"]; - "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(b), clear(d), handempty(), on(a,c), on(b,a), ontable(c), ontable(d)]" [label="put-down(d)"]; - "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" -> "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" [label="stack(d, b)"]; - "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(c,a), ontable(b), ontable(d)]" [label="put-down(d)"]; - "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" -> "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" [label="stack(d, c)"]; - "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), clear(d), handempty(), on(a,b), on(d,a), ontable(b), ontable(c)]" [label="put-down(c)"]; - "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" -> "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" [label="stack(c, d)"]; - "Model[clear(c), handempty(), on(b,d), on(c,b), on(d,a), ontable(a)]" -> "Model[clear(b), holding(c), on(b,d), on(d,a), ontable(a)]" [label="unstack(c, b)"]; - "Model[clear(c), handempty(), on(a,d), on(b,a), on(c,b), ontable(d)]" -> "Model[clear(b), holding(c), on(a,d), on(b,a), ontable(d)]" [label="unstack(c, b)"]; - "Model[clear(a), handempty(), on(a,b), on(b,d), on(d,c), ontable(c)]" -> "Model[clear(b), holding(a), on(b,d), on(d,c), ontable(c)]" [label="unstack(a, b)"]; - "Model[clear(b), handempty(), on(a,d), on(b,a), on(d,c), ontable(c)]" -> "Model[clear(a), holding(b), on(a,d), on(d,c), ontable(c)]" [label="unstack(b, a)"]; - "Model[clear(a), handempty(), on(a,c), on(c,d), on(d,b), ontable(b)]" -> "Model[clear(c), holding(a), on(c,d), on(d,b), ontable(b)]" [label="unstack(a, c)"]; - "Model[clear(c), handempty(), on(a,d), on(c,a), on(d,b), ontable(b)]" -> "Model[clear(a), holding(c), on(a,d), on(d,b), ontable(b)]" [label="unstack(c, a)"]; - "Model[clear(a), handempty(), on(a,d), on(b,c), on(d,b), ontable(c)]" -> "Model[clear(d), holding(a), on(b,c), on(d,b), ontable(c)]" [label="unstack(a, d)"]; - "Model[clear(d), handempty(), on(a,b), on(b,c), on(d,a), ontable(c)]" -> "Model[clear(a), holding(d), on(a,b), on(b,c), ontable(c)]" [label="unstack(d, a)"]; - "Model[clear(a), handempty(), on(a,c), on(b,d), on(c,b), ontable(d)]" -> "Model[clear(c), holding(a), on(b,d), on(c,b), ontable(d)]" [label="unstack(a, c)"]; - "Model[clear(c), handempty(), on(a,b), on(b,d), on(c,a), ontable(d)]" -> "Model[clear(a), holding(c), on(a,b), on(b,d), ontable(d)]" [label="unstack(c, a)"]; - "Model[clear(d), handempty(), on(b,a), on(c,b), on(d,c), ontable(a)]" -> "Model[clear(c), holding(d), on(b,a), on(c,b), ontable(a)]" [label="unstack(d, c)"]; - "Model[clear(c), handempty(), on(b,a), on(c,d), on(d,b), ontable(a)]" -> "Model[clear(d), holding(c), on(b,a), on(d,b), ontable(a)]" [label="unstack(c, d)"]; - "Model[clear(b), handempty(), on(a,c), on(b,d), on(d,a), ontable(c)]" -> "Model[clear(d), holding(b), on(a,c), on(d,a), ontable(c)]" [label="unstack(b, d)"]; - "Model[clear(d), handempty(), on(a,c), on(b,a), on(d,b), ontable(c)]" -> "Model[clear(b), holding(d), on(a,c), on(b,a), ontable(c)]" [label="unstack(d, b)"]; - "Model[clear(d), handempty(), on(a,b), on(c,a), on(d,c), ontable(b)]" -> "Model[clear(c), holding(d), on(a,b), on(c,a), ontable(b)]" [label="unstack(d, c)"]; - "Model[clear(c), handempty(), on(a,b), on(c,d), on(d,a), ontable(b)]" -> "Model[clear(d), holding(c), on(a,b), on(d,a), ontable(b)]" [label="unstack(c, d)"]; -} diff --git a/k1.png b/k1.png deleted file mode 100644 index aa7488558f7fd95a416cca016a47d1227de3512d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54272 zcmY)W2RzsR`ah0q6GapnNM%%ZNM=c8MX6LqLaA(J&x(?)qR>D>l9godos^lqSF$O4 z{_YR&^ZEX7|8qJWxxL0?T;qP-ulx1%IHz)E%jR91DJUqmD9FpHQBZ6c#m|G38}auq z?mBDy-$p&9GjbFwl-_EIRwow#WGcDT(>>!Q_y%yNUkI!%Mlf7!n< z`h#K}O;VPN%dAAyPJ{cpQm$H+r9G0@E8ZUK7hm{c)!r|@uY`FWyBnP><^TK3IA28~ zZ2#W>zu$ce<+f1$|Gfl1HPR`zGLUy!u5-=5@6V=po(BU-0 zVm;RG{r>$vF)^`s(a}^Cd+9wg3=IC?qIP1p4C0hz+0RDDTklosmIv_CdB_Pc(~M6} z7J2PFB49Omk$huUR~IA0P~qb(C#|hTC+(#u^4i;3{W;GTcrb9y>i+%vcYJB4Lw~3~ z?psC077x|2sKT35n=pDY7$D&77PZb93`fhQUjhE%#o zX(`U~_U&5%-GcQ$LZo)%1WVE^dfrvve)j4WRZq$mjX1{sir|yZ&eG1ybGIB9MpDzv zyVeemjD*!0u6b8{SNvCZ$p5ZQ-r>Bb!|Gj7C2RZ)biZ@^_Hljv{VUhBwOK+tQ-mFj zmIjB0e)@F>%!`C_QXJso+Rx6uW}|CZaoVYU+dB5??0bGa@BW&PpFRmKc**U1a4o?- zJ3ITTSDams_fejdG#hjC`$Cevp;NieOU-XL{hu{S8FF!q;%=W^E4eOkJW}mMOx<6q30x}0ec3RI@mp)Na7l*A z&4V*u48vM76z8HZI_}H-@Zm8(yZ%A;j=DW8EM2|5H)<-?YFgA}UMfBs9vs-9;JaK~4e}d^!+5oe!>+W{jjGv_n|1*{B?flX#l<~R ziE>qoHoh#>lr|+AXgSi5z!sqvtx(|aP$_0%^j2O(rE?e88E^NaDxXAEQ#1{mOrk?0 z4>%cZ-@HLlQSqFH#?#hTt)vyR)-+u!`nPWy9LBPlj2hyLA5k-Xwi&zj$5Q;QgpH5c zP5$Td*9DmICsuKkP0D`z`Sa(4xC~9tld&+2rKn}(FpljTQCLyua&u`>T-115-OyQ$5w>j~3>eX+iQ~x`V zh#jl`Tw^m}DgN=|A^hQfsrc*HuW=8XNVPJq3L`_qbDEl-j~{Q8X4lct@x>3^+c*1n zX%uoyq^)NQ{MO^wE%b^;FOeBO@;Not-P4mg)UucUQG9&-;^)>`FaLj91<#Z!W(>T& zz2OHNH*enjEHu=tW(N~fcv@OxL~%w`6xZU?(l%yhN*5OwW}1yJUcBh63OgC6a)yVo zu)2C%rQ|;v^*D_UGBPqrx+x|tk8g!K1*qz^w6wfAke0sQ*+?g*wXKakuzZeBQgYA! z(_VRa_gRfk3>WOPLpoBu#?(6Lmr9su(x_=ooJwX*{Zph1wX;4?zVhkzTjJy6Tg)+C z43yyfI>Vp3k~$gqpYPQeog;22KUS3dyU(xxr-V`a;lqcG1gpPu{D@RLh%f9K9X0*i z{CdS($HCV2oKcIx#X~!=IrE;9EuK{KfB)WfZd_hk*w4*PdGayMiR;(*u3fv9j*c#m zYhc~Fb?0%EC*8N|t}HK!InD|U4i0vXjrscd(I-tAYdySK{B(!yKxClu_na$2F3XO4 zByFo=g`deEco-ba(qXT~!}#Xw0aaDiGrGF$ckkVM{^pJ6uU{7{2&hc&?$E8$_|h?Zq*Z&<&y~B8(XmTLynGMFMn@|Gg}V6|zt;I? z+BT}o{O92Ef$xe)eA7MnQW1_4o{_QZs9C%4!0VZwYcUr;F=}RJWMmW|OyJHrU2Y2P zY;A3YDY|#H_iLp4SJWCNb8~ZdGSvT+==pN^+O=!U!nf%V)CF!=?WNfzOzFCb_O}i# zvp`&=dL!D-_-mELfTCTqkg1l#s32hh)_r>7HBli6ZpW0T}29oQSS zshqyEl6ph^VjmxkIgLs&%Q)l|}NzI8n}q-~fUkeJ89!tP%->y`^s zCL7E2y&<$yOG~R05$kVAQqsMsa^-ES2USCTe$_}Cstl7q#>UE>Iq-xOsSb8JvV({WvfndE*}^r^}tKB(=l2W%Q1Sh)CGSkKcI0DtR?am=DlX z;VP5^4hL4zQd1|{Cf_1+ zVHz$juH}b^XF`-Yd-yk+k4=qrbo6TFOU(xT=Q6ubdyr(sTYFphV|@H$*|6hx?i@te z(^$-X|GpsNr67gBpP;j|^Z3+MpHAwpx!GAu?l8p+)k~LleEIU_+4JWQVq^;`ig| z=zUG5Ew2-3>sgv z^~UFS1*^D!`69G^`}TKVzR=&id6S!;{|v5w#pUKr4n-xUpBl%-B_s+P8kpMK+sCJ; zf3M8^{VOyeW8QiEkV#cJ(#{0zfxp3mcJhT{B;}SZr*7ZomX(!N_A5AX;soO8SU{tn zzyHLT%gSyG3ybmb@w_iL%Rf8L-Tl^gH%2<);-QvUoeowcttU^O96xd5L2)lKyA+PZ z)oEecs!2F5@*MXM`nl-n=rrq*T`tdy^Yho>Ka56$w5*ar^v`=!)Q|y@u@URvefY2u zAm`A_%`lZk9i=gmF`h2g#UTWT)IVnJUtEA891B7hLKlX*yK4%STvzXVav#YY&sw$w zrX4Bq{k^q3W#dm}S(MxMtSl`pWeU$J*k8MFfdOIatVYE>7bQhSidMs8 zG9(nRh`$(T8#hkhR-5_ueE*eHQx+dK86QFYlFsCYYlVw*|1w9`o^Uw8 z!J)f2J7Hk+>PfNQw;MvlNfA1zqUvo{R(@Va3_3C3>+y)9Uaq)tVjt;%EOYA2f zpR?OmbL-&tr;Psdn;*R|UPc(}?J)CkV7wn0;cP^;0{?6*vUs+-AB> z*PlP!<66(-KhzmMfAy*?P_2vpE6)G6vGIEIp$Aa`8d@y{>r^X)CEOcyTv$9jJc6Vg zM6WrFi2Qha>_Sx#&s?d@@`IUnhsxe#TVSzA41OF}RNU;mG<6w)g^D?BDlNkKpZ)y6 zz`(hfIto*%sJ&uhjj=Q}IJB;wp8ex{==54F#e)_0bw4p@~Qz#I?rO;rKyIA-*3$H z@*i#xv-^7hc|p)&+Bodw$o5CFx&c*{KYyOm&;aP!MX_kd{?Sfqsj8|alq5m`QLIb>&q zjG^0>VKw_F+?Q_GuBX1z^OQ3kF1b~@S2-jkc88z#mIXLF?aS(YufHN6)dc{*s`MP$ z&o(9|cXw8M`9J3}PbnyPT$Pm(5!nH|byVQ%iO88?Vb#^u6}4OA@vP;MM%-zHlhAJo zpFYXrhwtU(=PzBlIi0cJ!zZT7j>)U2oQ8p^si~RwecyplMv?YX zZl|a*^J7{zpKbe3UvK=Z%Y5wafyXpEYm8C@Yok>6i;6NLZ`n@OT~4&08oYKn(++i( zZQskw=5v2{78|VGqpebbyWh{QMYo0$;p19)0n(V|!a$Tkq9lFuG^ueVj{EQZhcARH;`PA|)>`pVwRFzu`$m3T%VqS_GfnM@`2o zX^`tg9FE6p@s&Q=wtw$S#SJ0UvQKcg3JO#!i@_v=FfzW*;yZLm=uR2`OT{@k>4v$5 z1(G)qU*M-FjvuFJ^FFx>)>oZ$t3C}uH*r>OF=F(C^`$kJcQ-nNA zVBq=<8+5-tW6yrSeGjRl<+)bT_G^7F_QQv%1NpRN!3XeZXSgW^@}aH)Fx-3K!211X ze0npVJfVc4UHJ0kcvLMrc8M2bizt0hhMhZpfS!En6E82}0a)!m%SNd|n3?V3L}^!l zzx!CuLVV?c#NE4g2_Ufa_V@Svcy)x5l9En5;@TP5oD`FrQ8Em1GX>(@@#Dwu7r&lQ ztz|jv*6IWQo0D?}o_Xr&Id{Va#XF$>JGJQ9uI#KVWxu&qNL$`_*Iq!B?8jbW)kfjC z6(Lfd9WE;@{gt7medU4YFI-sXA@>m8HO~94)N7|J{Iw;6L-tc0=;`(THZ(L`?mV{F?MgW6 z-^j>FPNp%ywOQwqz7#JuuePjkYC8gY1~w3mXh4%@?pX9 zggY6g5cb}Se|Nil?V1lY6JKY+BWf|1Wl27*wEKgDhQOoxz2BZQ%Q#EIb+)mvc#n^p zXRHfu{PqeRIYM4j?8(&Q$)7_f{#H6HHkO9O$$g

UWm;siUzp=>Q-c64$Qv>v{q{7Ps8E+J=R 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 OFC&AUw3}P(PyHL~o-=^} diff --git a/macq/generate/pddl/graph_enumeration.py b/macq/generate/pddl/graph_enumeration.py index 309229fe..96ae55e9 100644 --- a/macq/generate/pddl/graph_enumeration.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -1,7 +1,5 @@ -import matplotlib.pyplot as plt from tarski.search.operations import progress import networkx as nx -import pygraphviz from macq.generate.pddl import Generator import math from macq.utils import progress as print_progress @@ -10,8 +8,9 @@ Trace, Action, TraceList, + Step, ) - +''' class Step: def __init__(self, state: State, action: Action, next_state: State, index: int): @@ -26,9 +25,9 @@ def print_step(self): print(self.action) print(self.next_state) print("-----") +''' - -class Graph_enum(Generator): +class StateEnumerator(Generator): def __init__( self, @@ -53,41 +52,28 @@ def __init__( def generate_traces(self): - traces = TraceList() - traces.generator=self.generate_single_trace() - for _ in print_progress(range(1)): - traces.append(traces.generator) - self.traces = traces - return traces - - - - #self.traces = self.generate_graph() - - def generate_single_trace(self): - trace = Trace() graph= self.generate_graph() - - edge_labels = dict([((n1, n2), d['label']) - for n1, n2, d in graph.edges(data=True)]) - - DFS=list(nx.edge_dfs(graph,list(graph.nodes)[0])) - count=1 - for i in DFS: - macq_action = self.tarski_act_to_macq(edge_labels.get(i)) - macq_cur_state = self.tarski_state_to_macq(i[0]) - macq_next_state = self.tarski_state_to_macq(i[1]) - step = Step(macq_cur_state, macq_action,macq_next_state, count) + for cur_state, next_state, act in graph.edges(data=True): + trace = Trace() + macq_action = self.tarski_act_to_macq(act) + macq_cur_state = self.tarski_state_to_macq(cur_state) + macq_next_state = self.tarski_state_to_macq(next_state) + step = Step(macq_cur_state, macq_action,1) #step.print_step() count+=1 trace.append(step) - - return trace - + step = Step(state=macq_next_state, action=None, index=2) + trace.append(step) + traces.append(trace) + return traces - + + + #self.traces = self.generate_graph() + + def generate_graph(self): G=nx.DiGraph() state = self.problem.init @@ -117,7 +103,7 @@ def generate_graph(self): return G -DG= Graph_enum(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_nodes=10).traces +DG= StateEnumerator(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_nodes=10).traces DG.print() '''plt.figure(figsize=(50,50)) pos = nx.spring_layout(DG) @@ -131,7 +117,22 @@ def generate_graph(self): A = nx.nx_agraph.to_agraph(DG) A.write("k1.dot") # write to dot file -X3 = nx.nx_agraph.read_dot("k1.dot") # read from dotfile +X3 = nx.nx_agraph.read_dot("k1.dot") read from dotfile + -#A.draw("k1.png", prog="neato") -''' \ No newline at end of file + def generate_single_trace(self,G): + + trace = Trace() + graph= self.generate_graph() + for cur_state, next_state, act in graph.edges(data=True)]) + macq_action = self.tarski_act_to_macq(act) + macq_cur_state = self.tarski_state_to_macq(cur_state) + macq_next_state = self.tarski_state_to_macq(next_state) + step = Step(macq_cur_state, macq_action,1) + #step.print_step() + count+=1 + trace.append(step) + step = Step(state=macq_next_state, action=None, index=2) + trace.append(step) +''' + \ No newline at end of file From 0b544c2f846ca01b54a7a3e85146280bb73784d0 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Mon, 8 Aug 2022 13:04:48 -0400 Subject: [PATCH 17/28] Update graph_enumeration.py --- macq/generate/pddl/graph_enumeration.py | 68 +++---------------------- 1 file changed, 8 insertions(+), 60 deletions(-) diff --git a/macq/generate/pddl/graph_enumeration.py b/macq/generate/pddl/graph_enumeration.py index 96ae55e9..25d049fc 100644 --- a/macq/generate/pddl/graph_enumeration.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -2,7 +2,6 @@ import networkx as nx from macq.generate.pddl import Generator import math -from macq.utils import progress as print_progress from macq.trace import ( State, Trace, @@ -10,22 +9,7 @@ TraceList, Step, ) -''' -class Step: - - def __init__(self, state: State, action: Action, next_state: State, index: int): - - self.state = state - self.action = action - self.index = index - self.next_state=next_state - def print_step(self): - print(self.index) - print(self.state) - print(self.action) - print(self.next_state) - print("-----") -''' + class StateEnumerator(Generator): @@ -55,25 +39,23 @@ def generate_traces(self): traces = TraceList() graph= self.generate_graph() + for cur_state, next_state, act in graph.edges(data=True): trace = Trace() - macq_action = self.tarski_act_to_macq(act) + + macq_action = self.tarski_act_to_macq(act['label']) macq_cur_state = self.tarski_state_to_macq(cur_state) macq_next_state = self.tarski_state_to_macq(next_state) step = Step(macq_cur_state, macq_action,1) - #step.print_step() - count+=1 trace.append(step) + step = Step(state=macq_next_state, action=None, index=2) trace.append(step) traces.append(trace) - return traces - - - - #self.traces = self.generate_graph() - + self.traces = traces + return traces + def generate_graph(self): G=nx.DiGraph() state = self.problem.init @@ -89,7 +71,6 @@ def generate_graph(self): next_state = progress(cur_node, act) if next_state not in Visited: if self.num_nodes>1: - #print(x) G.add_node(next_state) Visited[next_state]=False self.num_nodes-= 1 @@ -103,36 +84,3 @@ def generate_graph(self): return G -DG= StateEnumerator(prob='C:/Users/User/tarski/docs/notebooks/benchmarks/probBLOCKS-4-2.pddl', dom='C:/Users/User/tarski/docs/notebooks/benchmarks/blocksworld.pddl',num_nodes=10).traces -DG.print() -'''plt.figure(figsize=(50,50)) -pos = nx.spring_layout(DG) -nx.draw(DG,pos) - -edge_labels = dict([((n1, n2), d['label']) - for n1, n2, d in DG.edges(data=True)]) - -nx.draw_networkx_edge_labels(DG,pos,edge_labels=edge_labels,font_size=5) -plt.show() - -A = nx.nx_agraph.to_agraph(DG) -A.write("k1.dot") # write to dot file -X3 = nx.nx_agraph.read_dot("k1.dot") read from dotfile - - - def generate_single_trace(self,G): - - trace = Trace() - graph= self.generate_graph() - for cur_state, next_state, act in graph.edges(data=True)]) - macq_action = self.tarski_act_to_macq(act) - macq_cur_state = self.tarski_state_to_macq(cur_state) - macq_next_state = self.tarski_state_to_macq(next_state) - step = Step(macq_cur_state, macq_action,1) - #step.print_step() - count+=1 - trace.append(step) - step = Step(state=macq_next_state, action=None, index=2) - trace.append(step) -''' - \ No newline at end of file From 75914c36791dd5a2249881042f97be5e7bf1308a Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Mon, 8 Aug 2022 15:38:08 -0400 Subject: [PATCH 18/28] Update graph_enumeration.py --- macq/generate/pddl/graph_enumeration.py | 42 ++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/macq/generate/pddl/graph_enumeration.py b/macq/generate/pddl/graph_enumeration.py index 25d049fc..126cff85 100644 --- a/macq/generate/pddl/graph_enumeration.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -13,6 +13,20 @@ class StateEnumerator(Generator): + """State Enumerator - inherits the base Generator class and its attributes. + + A trace generator that generates traces of length 2 from a graph where nodes are the states and the edges represent the applicable actions + + Attributes: + num_nodes (int): + The number of nodes to be generated in the state space. + traces (TraceList): + The list of traces generated. + dom (str): + Describes the problem domain + prob (str): + Describes the problem + """ def __init__( self, dom: str = None, @@ -36,10 +50,17 @@ def __init__( def generate_traces(self): + """Generates n traces of length 2 using the graph generated + where n= num_nodes or for all the possible states if num_nodes is not defined + + Returns: + A TraceList object with the list of traces generated. + """ traces = TraceList() graph= self.generate_graph() - + + #act is a dictionary with key='label' of the form {'label': action} for cur_state, next_state, act in graph.edges(data=True): trace = Trace() @@ -57,17 +78,28 @@ def generate_traces(self): return traces def generate_graph(self): + """Generates a networkx strictly directed graph for the given problem by expanding the tree using bfs. + + Queue[]= Keeps track of all the nodes to be explored + Visited{node: Bool}= Keeps track of the explored nodes + + Returns: + A networkx graph with nodes representing states and edges describing the reachable states and action. + + """ G=nx.DiGraph() - state = self.problem.init + state = self.problem.init #initial state/ root node G.add_node(state) - Visited={node:False for node in G.nodes} - + Visited={ } Queue= [state] + Visited[state]=True while Queue: cur_node = Queue.pop(0) app_act = list(self.instance.applicable(cur_node)) for act in app_act: + + #creating new node if it doesn't exist in Visited as all the nodes are added to Visited with bool T/F next_state = progress(cur_node, act) if next_state not in Visited: if self.num_nodes>1: @@ -77,6 +109,8 @@ def generate_graph(self): else: return G G.add_edge(cur_node,next_state, label= act) + + #adding node to queue if it hasn't been explored for node in G.neighbors(cur_node): if (Visited[node]==False): Queue.append(node) From e1139be85cedae966f46c4cdffc66b4762f4a457 Mon Sep 17 00:00:00 2001 From: Christian Muise Date: Tue, 9 Aug 2022 10:28:16 -0400 Subject: [PATCH 19/28] Update macq/generate/pddl/vanilla_sampling.py --- macq/generate/pddl/vanilla_sampling.py | 1 - 1 file changed, 1 deletion(-) diff --git a/macq/generate/pddl/vanilla_sampling.py b/macq/generate/pddl/vanilla_sampling.py index c7d20868..5a1a786a 100644 --- a/macq/generate/pddl/vanilla_sampling.py +++ b/macq/generate/pddl/vanilla_sampling.py @@ -76,7 +76,6 @@ def __init__( random.seed(seed) self.max_time = max_time self.plan_len = set_plan_length(plan_len) - self.num_traces = set_num_traces(num_traces) if self.num_traces > 0: self.traces = self.generate_traces() From d2b3ffb095a3879b9e68d5fdcee21874b17872cd Mon Sep 17 00:00:00 2001 From: Christian Muise Date: Tue, 9 Aug 2022 10:46:49 -0400 Subject: [PATCH 20/28] Adding access to the new enumerator on import paths. --- macq/generate/pddl/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/macq/generate/pddl/__init__.py b/macq/generate/pddl/__init__.py index 04148aef..bf266eb6 100644 --- a/macq/generate/pddl/__init__.py +++ b/macq/generate/pddl/__init__.py @@ -3,5 +3,6 @@ from .trace_from_goal import TraceFromGoal from .random_goal_sampling import RandomGoalSampling from .fd_random_walk import FDRandomWalkSampling +from .graph_enumeration import StateEnumerator -__all__ = ["Generator", "VanillaSampling", "TraceFromGoal", "RandomGoalSampling", "FDRandomWalkSampling"] +__all__ = ["Generator", "VanillaSampling", "TraceFromGoal", "RandomGoalSampling", "FDRandomWalkSampling", "StateEnumerator"] From 5664b67d3701dde141c654dcf7fc4e3f0ceacd83 Mon Sep 17 00:00:00 2001 From: Christian Muise Date: Tue, 9 Aug 2022 10:48:31 -0400 Subject: [PATCH 21/28] Store the computed graph for future access --- macq/generate/pddl/graph_enumeration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/macq/generate/pddl/graph_enumeration.py b/macq/generate/pddl/graph_enumeration.py index 126cff85..c929d7ec 100644 --- a/macq/generate/pddl/graph_enumeration.py +++ b/macq/generate/pddl/graph_enumeration.py @@ -58,10 +58,10 @@ def generate_traces(self): """ traces = TraceList() - graph= self.generate_graph() + self.graph = self.generate_graph() #act is a dictionary with key='label' of the form {'label': action} - for cur_state, next_state, act in graph.edges(data=True): + for cur_state, next_state, act in self.graph.edges(data=True): trace = Trace() macq_action = self.tarski_act_to_macq(act['label']) From ef176647f1349d19382c0e3b98b424aa76c7c8b6 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Thu, 18 Aug 2022 00:16:07 -0400 Subject: [PATCH 22/28] create bglearner --- macq/extract/bglearner.py | 8 ++++++++ macq/extract/extract.py | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 macq/extract/bglearner.py diff --git a/macq/extract/bglearner.py b/macq/extract/bglearner.py new file mode 100644 index 00000000..12bab8bd --- /dev/null +++ b/macq/extract/bglearner.py @@ -0,0 +1,8 @@ +import bauhaus +class BGLearner: + class InvalidThreshold(Exception): + def __init__(self, threshold): + super().__init__( + f"Invalid threshold value: {threshold}. Threshold must be a float between 0-1 (inclusive)." + ) + diff --git a/macq/extract/extract.py b/macq/extract/extract.py index 60153f6b..1fdac03c 100644 --- a/macq/extract/extract.py +++ b/macq/extract/extract.py @@ -9,6 +9,7 @@ from .slaf import SLAF from .amdn import AMDN from .arms import ARMS +from .bglearner import BGLearner @dataclass @@ -28,6 +29,7 @@ class modes(Enum): SLAF = auto() AMDN = auto() ARMS = auto() + BGLearner=auto() class Extract: @@ -62,6 +64,8 @@ def __new__( modes.SLAF: SLAF, modes.AMDN: AMDN, modes.ARMS: ARMS, + modes.BGLearner: BGLearner + } if mode == modes.SLAF: if len(obs_lists) != 1: From e5d004dc61e93a66dff02d9d21e921b301d91824 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Sun, 4 Sep 2022 21:54:03 -0400 Subject: [PATCH 23/28] Update bglearner.py --- macq/extract/bglearner.py | 237 +++++++++++++++++++++++++++++++++++++- 1 file changed, 231 insertions(+), 6 deletions(-) diff --git a/macq/extract/bglearner.py b/macq/extract/bglearner.py index 12bab8bd..761701d3 100644 --- a/macq/extract/bglearner.py +++ b/macq/extract/bglearner.py @@ -1,8 +1,233 @@ -import bauhaus + +from typing import List, Set +from collections import defaultdict +from macq.extract import Model +from attr import dataclass +from bauhaus import Encoding, constraint, proposition + +e = Encoding() + class BGLearner: - class InvalidThreshold(Exception): - def __init__(self, threshold): - super().__init__( - f"Invalid threshold value: {threshold}. Threshold must be a float between 0-1 (inclusive)." - ) + """ max arity for atom schema + atom schemas: p0, p1, ... + max arity for action schema (defines meta-objects: mo0, mo1, ...) + action schemas: a0, a1, ... + meta-features: mk0, mk1, ... + num unary predicates: u0, u1, ... (unary preds) + num binary predicates: b0, b1, ... (binary preds) + """ + + def __new__( + cls, + obs_lists: ObservationLists, + max_hyper: int, + action(x):x=num_act + arity + predicate + m + arg + ): + + def constraits_layer0(): + + def precond_and_effect(): + """ + use(a, m)⇔p0(a, m)∨p1(a, m)∨e0(a, m)∨e1(a, m) (2) + use(m) ⇔ use(a, m) (3) + ¬p0(a, m) ∨ ¬p1(a, m) (4) + ¬e0(a, m) ∨ ¬e1(a, m) (5) + At-Most-1 {label(a, l) : l} (6) + """ + pass + + def effects_nonred(): + + """ + e0(a, m) ⇒ ¬p0(a, m) (7) + e1(a, m) ⇒ ¬p1(a, m) (8) + Exactly-1 {arity(p, i) : 0 ≤ i ≤ max-arity} (9) + """ + pass + + def struct_of_atom(): + + """ + Exactly-1 {at(m, p) : p} (10) + At-Most-1 {at(m, i, ν) : ν} (11) + at(m, p) ∧ at(m, i, ν) ⇒arity(p, j) (12) + at(m, p) ∧ arity(p, i) ⇒at(m, j, ν) (13) + at(m, p) ∧ arity(p, i) ⇒ ¬at(m, j, ν) (14) + """ + pass + + def atomname_to_atomstruct(): + """ + Strict-Lex-Order {vect(m) : m} (15) + """ + pass + + def atoms_nonstatic(): + """ + ¬static0(a, m, p) ∨ ¬static1(a, m, p)(16) + ¬static0(a, m, p) ⇒ at(m, p) ∧ p1(a, m) ∧ e0(a, m) (17) + ¬static1(a, m, p) ⇒ at(m, p) ∧ p0(a, m) ∧ e1(a, m) (18) + """ + pass + + def atom_act_arg(): + """ + use(a, m) ∧ at(m, i, ν) ⇒ arg(a, ν) (19) + arg(a, ν) ⇒ argval(a, ν, m, i) (20) + argval(a, ν, m, i) ⇔ use(a, m) ∧ at(m, i, ν) (21) + """ + pass + + def arity_act_and_pred(): + """ + ¬arg(a, ν) (22) + arg(a, ν) (23) + ¬arity(p, i) ∧arity(p, i) (24) + """ + pass + + def staticpred_actarg(): + """ + un(u, a, ν) ⇒ arg(a, ν) (25) + bin(b, a, ν, ν0) ⇒ arg(a, ν) ∧ arg(a, ν') (26) + """ + pass + +def constraits_layer1(): + + def binding_transitions(): + """ + Exactly-1 {mp(t, a) : a} (27) + At-Most-1 {mf(t, k, m) : m} (28) + At-Most-1 {mf(t, k, m) : k} (29) + """ + pass + + def consistancy(): + + """ + mp(t, a) ⇒ label(a, t.label) (30) + mp(t, a) ∧ mf(t, k, m) ⇒ use(a, m) (31) + mp(t, a) ∧ use(a, m) ⇒ mf(t, k, m) (32) + + """ + pass + + def ground_atom_unaff(): + + """ + mp(t, a) ∧ ¬mf(t, k, m) ⇒ free(k, t, a) (33) + mp(t, a) ∧ mf(t, k, m) ⇒ ¬e0(a, m) ∧ ¬e1(a, m) ⇔ free(k, t, a) (34) + """ + pass + + def trans_and_inertia(): + """ + mp(t, a) ∧ mf(t, k, m) ∧ p0(a, m) ⇒ ¬φ(k, t.src) (35) + mp(t, a) ∧ mf(t, k, m) ∧ p1(a, m) ⇒ φ(k, t.src) (36) + mp(t, a) ∧ mf(t, k, m) ∧ e0(a, m) ⇒ ¬φ(k, t.dst) (37) + mp(t, a) ∧ mf(t, k, m) ∧ e1(a, m) ⇒ φ(k, t.dst) (38) + mp(t, a)⇒ free(k, t, a)⇔[φ(k, t.src)⇔φ(k, t.dst)](39) + """ + pass + + def groundatom_differvalue(): + """ + g(k, s, s') ⇔ φ(k, s) ⊕ φ(k, s') (40) + g(k, s, s0) (41) + """ + pass + + def groundatom_pre_arg(): + """ + Exactly-1 {gr(k, p) : p} (42) + At-Most-1 {gr(k, i, o) : o} (43) + gr(k, p) ∧ gr(k, i, o) ⇒ arity(p, j) (44) + gr(k, p) ∧ arity(p, i) ⇒ gr(k, j, o) (45) + gr(k, p) ∧ arity(p, i) ⇒ ¬gr(k, j, o) (46) + """ + pass + + def groundatom_to_arg_and_pred(): + """ + Strict-Lex-Order {vect(k) : k} (47) + """ + pass + + def staticpred_actarg(): + """ + mf(t, k, m) ⇒ at(m, p) ⇔ gr(k, p) (48) + mf(t, k, m) ∧ at(m, i, ν) ⇒ gr(k, i, o) (49) + mf(t, k, m) ∧ gr(k, i, o) ⇒ at(m, i, ν) (50) + """ + pass + + def precond_and_effect(): + """ + U(u, a, ν, o) ⇔ un(u, a, ν) ∧ ¬r(u, o) (51) + B(b, a, ν, ν', o, o') ⇔ bin(b, a, ν, ν')∧ ¬s(b, o, o') (52) + """ + pass + + + def precond_and_effect(): + """ + At-Most-1 {mt(t, ν, o) : o} (53) + mp(t, a) ∧ arg(a, ν) ⇒ mt(t, ν, o) (54) + mp(t, a) ∧ mt(t, ν, o) ⇒ arg(a, ν) (55) + """ + pass + + def precond_and_effect(): + """ + mf(t, k, m) ∧ at(m, i, ν) ⇒ W(t, k, i, ν) (56) + W(t, k, i, ν) ⇒ gr(k, i, o) ⇔ mt(t, ν, o) (57) + """ + pass + + def precond_and_effect(): + """ + ¬gtuple(a, o¯) ⇒ ¬arg(a, νi) ∨ U(u, a, νi, oi) ∨ B(b, a, νi, νj , oi, oj ) (58) + """ + pass + + def precond_and_effect(): + """ + mp(t, a) ∧ mt(t, ν, o) ∧ un(u, a, ν) ⇒ r(u, o) (59) + mp(t, a) ∧ mt(t, ν, o) ∧ mt(t, ν', o') ∧ bin(b, a, ν, ν') (60) ⇒ s(b, o, o') (61) + """ + pass + + def precond_and_effect(): + """ + gtuple(a, o¯) ⇒G(t, a, o¯) (62) + G(t, a, o¯) ⇒ gtuple(a, o¯) (63) + G(t, a, o¯) ⇒ mp(t, a) ∧ mt(t, νi, oi) ∧ arg(a, νi) ⇒ mt(t, νi, oi) (64) + At-Most-1 {G(t, a, o¯) : t.src = s} (65) + Exactly-1 {G(t, a, o¯) : a, o¯} (66) + """ + pass + + def precond_and_effect(): + """ + G(t, a, o¯) ⇒ appl(a, o, t.src ¯ ) (67) + appl(a, o, s ) ⇒ G(t, a, o¯) (68) + ¬appl(a, o, s ¯ ) ⇒ ¬gtuple(a, o¯) ∨ vio0(a, o, s, k ¯ ) ∨ vio1(a, o, s, k ¯ ) (69) + vio0(a, o, s, k ¯ ) ⇒ φ(k, s) ∧ pre0eq(a, o, k, m ¯ ) (70) + vio1(a, o, s, k ¯ ) ⇒ ¬φ(k, s) ∧ pre1eq(a, o, k, m ¯ ) (71) + pre0eq(a, o, k, m ¯ ) ⇒ p0(a, m) ∧ eq(¯o, m, k) (72) + pre1eq(a, o, k, m ¯ ) ⇒ p1(a, m) ∧ eq(¯o, m, k) (73) + eq(¯o, m, k) ⇒ at(m, p) ⇔ gr(k, p) (74) + eq(¯o, m, k) ∧ at(m, i, νj ) ⇒ gr(k, i, oj ) (75) + """ + pass + + + + return Model + From 51f1c3b4708559d4d5e32b510a9565a3b322bdb3 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Wed, 7 Sep 2022 12:34:40 -0400 Subject: [PATCH 24/28] Update bglearner.py --- macq/extract/bglearner.py | 68 ++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/macq/extract/bglearner.py b/macq/extract/bglearner.py index 761701d3..cf524313 100644 --- a/macq/extract/bglearner.py +++ b/macq/extract/bglearner.py @@ -20,14 +20,50 @@ class BGLearner: def __new__( cls, obs_lists: ObservationLists, - max_hyper: int, - action(x):x=num_act - arity - predicate - m - arg + max_hyper: int, ): + def proposition_layer0(): + pre0(a,mk) # meta-feature mk appears negated in precondition of action a + pre1(a,mk) # meta-feature mk appears positive in precondition of action a + eff0(a,mk) # meta-feature mk appears negated in effect of action a + eff1(a,mk) # meta-feature mk appears positive in effect of action a + label(a,l) # action a is mapped to label l + + arity(p,i) # atom p has arity i + atom(mk,p) # meta-feature mk is atom p + atom(mk,i,mo) # meta-object mo is mapped to i-th arg of meta-feature mk + unary(u,a,mo) # action a uses static unary predicate u on argument mo + binary(b,a,mo,mo') # action a uses static binary predicate b on arguments mo and mo' + + args(a,mo) # meta-object mo is argument of action a + relevant(a,mo,mk,i) # using(a,mk) & atom(mk,i,mo) + using(mk) # meta-feature mk is used by some action + using(a,mk) # meta-feature mk is used by action a + + def proposition_layer1(): + gr(k,p) # feature k is ground instance of atom p + gr(k,i,o) # i-th arg of feature k is object o + r(u,o) # tuple for static unary predicate u in layer l + s(b,o,o') #tuple for static binary predicate b in layer l + mf(t,k,i,mo) #> [ ground(k,i,o) <=> mapt(t,mo,o) ] + map(t,a) # transition t is mapped to action a + mapf(t,k,mk) #feature k is mapped to meta-feature mk for transition t + phi(k,s) # value of (boolean) feature k at state s + + + U(l,u,a,mo,o) # unary(u,a,mo) & -r(l,u,o) + B(l,b,a,mo,mo',o,o') # binary(b,a,mo,mo') & -s(l,b,o,o') + ordi(o,k,i,s) # ground(k,i,o) & phi(k,s) [ for ordering objects ] + appl(a,t,s) #action a as in transition t is applicable in state s + mapeq(t,a,t') # map(t,a) & eq(t,t') + eq(t,t') # transitions t and t' are "equivalent" + Z0(t,k,a,s) # [ OR { pre0(t,k,a) & mapf(t,k,mk) : mk } => -phi(k,s) ] + Z1(t,k,a,s) # [ OR { pre1(t,k,a) & mapf(t,k,mk) : mk } => phi(k,s) ] + X0(a,t,k,mk) # [ pre0(a,mk) & mapf(t,k,mk) ] + X1(a,t,k,mk) # [ pre1(a,mk) & mapf(t,k,mk) ] + + def constraits_layer0(): def precond_and_effect(): @@ -97,7 +133,7 @@ def staticpred_actarg(): """ pass -def constraits_layer1(): + def constraits_layer1(): def binding_transitions(): """ @@ -158,7 +194,7 @@ def groundatom_to_arg_and_pred(): """ pass - def staticpred_actarg(): + def sync_groundatom_and_schema(): """ mf(t, k, m) ⇒ at(m, p) ⇔ gr(k, p) (48) mf(t, k, m) ∧ at(m, i, ν) ⇒ gr(k, i, o) (49) @@ -166,7 +202,7 @@ def staticpred_actarg(): """ pass - def precond_and_effect(): + def exclusive_binding_statpred(): """ U(u, a, ν, o) ⇔ un(u, a, ν) ∧ ¬r(u, o) (51) B(b, a, ν, ν', o, o') ⇔ bin(b, a, ν, ν')∧ ¬s(b, o, o') (52) @@ -174,7 +210,7 @@ def precond_and_effect(): pass - def precond_and_effect(): + def assoc_binding_transitions_pt1(): """ At-Most-1 {mt(t, ν, o) : o} (53) mp(t, a) ∧ arg(a, ν) ⇒ mt(t, ν, o) (54) @@ -182,37 +218,37 @@ def precond_and_effect(): """ pass - def precond_and_effect(): + def assoc_binding_transitions_pt2(): """ mf(t, k, m) ∧ at(m, i, ν) ⇒ W(t, k, i, ν) (56) W(t, k, i, ν) ⇒ gr(k, i, o) ⇔ mt(t, ν, o) (57) """ pass - def precond_and_effect(): + def nonexist_gtuple(): """ ¬gtuple(a, o¯) ⇒ ¬arg(a, νi) ∨ U(u, a, νi, oi) ∨ B(b, a, νi, νj , oi, oj ) (58) """ pass - def precond_and_effect(): + def exist_groundatom(): """ mp(t, a) ∧ mt(t, ν, o) ∧ un(u, a, ν) ⇒ r(u, o) (59) mp(t, a) ∧ mt(t, ν, o) ∧ mt(t, ν', o') ∧ bin(b, a, ν, ν') (60) ⇒ s(b, o, o') (61) """ pass - def precond_and_effect(): + def groundaction_tran_mandate(): """ gtuple(a, o¯) ⇒G(t, a, o¯) (62) G(t, a, o¯) ⇒ gtuple(a, o¯) (63) G(t, a, o¯) ⇒ mp(t, a) ∧ mt(t, νi, oi) ∧ arg(a, νi) ⇒ mt(t, νi, oi) (64) - At-Most-1 {G(t, a, o¯) : t.src = s} (65) + At-Most-1 {G(t, a, o¯) : t.src # s} (65) Exactly-1 {G(t, a, o¯) : a, o¯} (66) """ pass - def precond_and_effect(): + def app_actions_mandate(): """ G(t, a, o¯) ⇒ appl(a, o, t.src ¯ ) (67) appl(a, o, s ) ⇒ G(t, a, o¯) (68) From d1a25c8a36d762e47a58d36b6941ab5475729218 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Wed, 7 Sep 2022 18:55:50 -0400 Subject: [PATCH 25/28] Update bglearner.py --- macq/extract/bglearner.py | 122 ++++++++++++++++++++++++++++++++++---- 1 file changed, 111 insertions(+), 11 deletions(-) diff --git a/macq/extract/bglearner.py b/macq/extract/bglearner.py index cf524313..b184e4a3 100644 --- a/macq/extract/bglearner.py +++ b/macq/extract/bglearner.py @@ -4,24 +4,124 @@ from macq.extract import Model from attr import dataclass from bauhaus import Encoding, constraint, proposition +from dataclasses import dataclass -e = Encoding() class BGLearner: - """ max arity for atom schema - atom schemas: p0, p1, ... - max arity for action schema (defines meta-objects: mo0, mo1, ...) - action schemas: a0, a1, ... - meta-features: mk0, mk1, ... - num unary predicates: u0, u1, ... (unary preds) - num binary predicates: b0, b1, ... (binary preds) - """ def __new__( cls, obs_lists: ObservationLists, max_hyper: int, ): + + def __init__(self): + e = Encoding() + + #decision propositions + + @dataclass + @proposition(E) + class PRE0(Hashable): + m: int # atom name + a: str # action name + + def __str__(self): + return f"pre0({self.a},{self.m})" + + + @dataclass + @proposition(E) + class PRE1(Hashable): + m: str # atom name + a: str # action name + + def __str__(self): + return f"pre1({self.a},{self.m})" + + + @dataclass + @proposition(E) + class EFF0(Hashable): + m: str # atom name + a: str # action name + + def __str__(self): + return f"eff0({self.a},{self.m})" + + @dataclass + @proposition(E) + class EFF1(Hashable): + m: str # atom name + a: str # action name + + def __str__(self): + return f"eff0({self.a},{self.m})" + + + @dataclass + @proposition(E) + class LABEL(Hashable): + l: str # label name + a: str # action name + + def __str__(self): + return f"label({self.a},{self.l})" + + @dataclass + @proposition(E) + class ARITY(Hashable): + p: int # predicate id + a: str # action name + + def __str__(self): + return f"arity({self.p},{self.l})" + + @dataclass + @proposition(E) + class ATOM2(Hashable): + p: int # predicate ID + m: str # atom name + + def __str__(self): + return f"atom2({self.m},{self.p})" + + @dataclass + @proposition(E) + class ATOM3(Hashable): + v: int # argument num of action + m: str # atom name + i: int # argument num of atom + + + def __str__(self): + return f"atom3({self.m},{self.i},{self.v})" + + @dataclass + @proposition(E) + class UN(Hashable): + u: int # unary predicate + a: str # action name + v: int # argument num of action + + + def __str__(self): + return f"un({self.u},{self.a},{self.v})" + + @dataclass + @proposition(E) + class BIN(Hashable): + b: int # binary predicate + a: str # action name + v: int # argument num of action + v1: int # argument num of action + + + def __str__(self): + return f"un({self.b},{self.a},{self.v},{self.v1})" + + + def proposition_layer0(): pre0(a,mk) # meta-feature mk appears negated in precondition of action a @@ -31,8 +131,8 @@ def proposition_layer0(): label(a,l) # action a is mapped to label l arity(p,i) # atom p has arity i - atom(mk,p) # meta-feature mk is atom p - atom(mk,i,mo) # meta-object mo is mapped to i-th arg of meta-feature mk + atom2(mk,p) # meta-feature mk is atom p, arg2 + atom3(mk,i,mo) # meta-object mo is mapped to i-th arg of meta-feature mk, arg3 unary(u,a,mo) # action a uses static unary predicate u on argument mo binary(b,a,mo,mo') # action a uses static binary predicate b on arguments mo and mo' From 0aad8fc0b0a40484865756b3ec90d0774dfa0730 Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Thu, 8 Sep 2022 16:57:39 -0400 Subject: [PATCH 26/28] Update bglearner.py --- macq/extract/bglearner.py | 315 ++++++++++++++++++++++++++++++++++---- 1 file changed, 281 insertions(+), 34 deletions(-) diff --git a/macq/extract/bglearner.py b/macq/extract/bglearner.py index b184e4a3..f5f21e1a 100644 --- a/macq/extract/bglearner.py +++ b/macq/extract/bglearner.py @@ -16,15 +16,34 @@ def __new__( ): def __init__(self): - e = Encoding() + E = Encoding() + self.encode() - #decision propositions + #decision propositions layer 0 + ''' + pre0(a,mk) # meta-feature mk appears negated in precondition of action a + pre1(a,mk) # meta-feature mk appears positive in precondition of action a + eff0(a,mk) # meta-feature mk appears negated in effect of action a + eff1(a,mk) # meta-feature mk appears positive in effect of action a + label(a,l) # action a is mapped to label l + + arity(p,i) # atom p has arity i + atom2(mk,p) # meta-feature mk is atom p, arg2 + (mk,i,mo) # meta-object mo is mapped to i-th arg of meta-feature mk, arg3 + unary(u,a,mo) # action a uses static unary predicate u on argument mo + binary(b,a,mo,mo') # action a uses static binary predicate b on arguments mo and mo + + args(a,mo) # meta-object mo is argument of action a + relevant(a,mo,mk,i) # using(a,mk) & atom(mk,i,mo) + using(mk) # meta-feature mk is used by some action + using(a,mk) # meta-feature mk is used by action a + ''' @dataclass @proposition(E) class PRE0(Hashable): m: int # atom name - a: str # action name + a: str # action name def __str__(self): return f"pre0({self.a},{self.m})" @@ -34,7 +53,7 @@ def __str__(self): @proposition(E) class PRE1(Hashable): m: str # atom name - a: str # action name + a: str # action name def __str__(self): return f"pre1({self.a},{self.m})" @@ -44,7 +63,7 @@ def __str__(self): @proposition(E) class EFF0(Hashable): m: str # atom name - a: str # action name + a: str # action name def __str__(self): return f"eff0({self.a},{self.m})" @@ -53,17 +72,17 @@ def __str__(self): @proposition(E) class EFF1(Hashable): m: str # atom name - a: str # action name + a: str # action name def __str__(self): - return f"eff0({self.a},{self.m})" + return f"eff1({self.a},{self.m})" @dataclass @proposition(E) class LABEL(Hashable): l: str # label name - a: str # action name + a: str # action name def __str__(self): return f"label({self.a},{self.l})" @@ -72,36 +91,36 @@ def __str__(self): @proposition(E) class ARITY(Hashable): p: int # predicate id - a: str # action name + a: str # action name def __str__(self): return f"arity({self.p},{self.l})" @dataclass @proposition(E) - class ATOM2(Hashable): + class AT2(Hashable): p: int # predicate ID m: str # atom name def __str__(self): - return f"atom2({self.m},{self.p})" + return f"at2({self.m},{self.p})" @dataclass @proposition(E) - class ATOM3(Hashable): + class AT3(Hashable): v: int # argument num of action m: str # atom name i: int # argument num of atom def __str__(self): - return f"atom3({self.m},{self.i},{self.v})" + return f"at3({self.m},{self.i},{self.v})" @dataclass @proposition(E) class UN(Hashable): u: int # unary predicate - a: str # action name + a: str # action name v: int # argument num of action @@ -112,36 +131,264 @@ def __str__(self): @proposition(E) class BIN(Hashable): b: int # binary predicate - a: str # action name + a: str # action name v: int # argument num of action v1: int # argument num of action def __str__(self): - return f"un({self.b},{self.a},{self.v},{self.v1})" + return f"bin({self.b},{self.a},{self.v},{self.v1})" + + #implied propositions layer 0 + @dataclass + @proposition(E) + class USE1(Hashable): + m: str # atom name + + def __str__(self): + return f"use1({self.m})" + + @dataclass + @proposition(E) + class USE2(Hashable): + m: str # atom name + a: str # action name + + def __str__(self): + return f"use2({self.a},{self.m})" + + @dataclass + @proposition(E) + class ARG(Hashable): + v: int # argument num + a: str # action name + + def __str__(self): + return f"arg({self.a},{self.v})" + + @dataclass + @proposition(E) + class ARGVAL(Hashable): + v: int # argument num + a: str # action name + m: str # atom name + i: int # argument num of atom + def __str__(self): + return f"argval({self.a},{self.v},{self.m},{self.i})" + #decision propositions instance layer - def proposition_layer0(): - pre0(a,mk) # meta-feature mk appears negated in precondition of action a - pre1(a,mk) # meta-feature mk appears positive in precondition of action a - eff0(a,mk) # meta-feature mk appears negated in effect of action a - eff1(a,mk) # meta-feature mk appears positive in effect of action a - label(a,l) # action a is mapped to label l + @dataclass + @proposition(E) + class MP(Hashable): + a: str # action name + t: str # transition name corresponding to edge - arity(p,i) # atom p has arity i - atom2(mk,p) # meta-feature mk is atom p, arg2 - atom3(mk,i,mo) # meta-object mo is mapped to i-th arg of meta-feature mk, arg3 - unary(u,a,mo) # action a uses static unary predicate u on argument mo - binary(b,a,mo,mo') # action a uses static binary predicate b on arguments mo and mo' - - args(a,mo) # meta-object mo is argument of action a - relevant(a,mo,mk,i) # using(a,mk) & atom(mk,i,mo) - using(mk) # meta-feature mk is used by some action - using(a,mk) # meta-feature mk is used by action a + def __str__(self): + return f"mp({self.t},{self.a})" + + @dataclass + @proposition(E) + class MF(Hashable): + m: str # atom name + k: str # ground atom name + t: str # transition name corresponding to edge + + def __str__(self): + return f"mf({self.t},{self.k},{self.m})" + + @dataclass + @proposition(E) + class PHI(Hashable): + k: str # ground atom name + s: str # state name corresponding to node + + def __str__(self): + return f"phi({self.k},{self.s}" + + @dataclass + @proposition(E) + class GR2(Hashable): + k: str # ground atom name + p: int # predicate ID + def __str__(self): + return f"gr({self.k},{self.p}" + + @dataclass + @proposition(E) + class GR3(Hashable): + k: str # ground atom name + i: int # argument num of atom + o: int # object id + def __str__(self): + return f"gr({self.k},{self.p}" + + @dataclass + @proposition(E) + class R(Hashable): + u: int # unary predicate + o: int # object id + def __str__(self): + return f"r({self.u},{self.o}" - def proposition_layer1(): + @dataclass + @proposition(E) + class S(Hashable): + b: int # binary predicate + o: int # object id + o1: int #object id + def __str__(self): + return f"s({self.b},{self.o},{self.o1}" + + @dataclass + @proposition(E) + class GTUPLE(Hashable): + a: str # action name + o2: tuple # tuple of objects + def __str__(self): + return f"gtuple({self.a},{self.o2}" + + @dataclass + @proposition(E) + class FREE(Hashable): + a: str # action name + k: str # ground atom name + t: str # transition name corresponding to edge + def __str__(self): + return f"free({self.k},{self.t},{self.a}" + + @dataclass + @proposition(E) + class G(Hashable): + k: str # ground atom name + s: str # state name corresponding to node + s1: str # state name corresponding to node + + def __str__(self): + return f"g({self.k},{self.s},{self.s1}" + + @dataclass + @proposition(E) + class U(Hashable): + u: int # unary predicate + a: str # action name + v: int # argument num + o: int # object id + + def __str__(self): + return f"u({self.u},{self.a},{self.v},{self.o}" + + @dataclass + @proposition(E) + class B(Hashable): + b: int # binary predicate + a: str # action name + v: int # argument num + v1: int # argument num + o: int # object id + o1: int # object id + + def __str__(self): + return f"b({self.b},{self.a},{self.v},{self.v1},{self.o},{self.o1}" + + @dataclass + @proposition(E) + class MT(Hashable): + t: str # transition name corresponding to edge + v: int # argument num + o: int # object id + + def __str__(self): + return f"MT({self.t},{self.v},{self.o}" + + @dataclass + @proposition(E) + class W(Hashable): + t: str # transition name corresponding to edge + k: str # ground atom name + i: int # argument num of atom + v: int # argument num + + def __str__(self): + return f"w({self.t},{self.k},{self.i},{self.v}" + + @dataclass + @proposition(E) + class G(Hashable): + t: str # transition name corresponding to edge + a: str # action name + o2: tuple # tuple of objects + + def __str__(self): + return f"g({self.t},{self.a},{self.o2}" + + @dataclass + @proposition(E) + class APP1(Hashable): + a: str # action name + s: str # state name corresponding to node + o2: tuple # tuple of objects + + def __str__(self): + return f"app1({self.a},{self.o2},{self.s}" + + @dataclass + @proposition(E) + class VIO0(Hashable): + a: str # action name + s: str # state name corresponding to node + o2: tuple # tuple of objects + k: str # ground atom name + + def __str__(self): + return f"vio0({self.a},{self.o2},{self.s},{self.k}" + + @dataclass + @proposition(E) + class VIO1(Hashable): + a: str # action name + s: str # state name corresponding to node + o2: tuple # tuple of objects + k: str # ground atom name + + def __str__(self): + return f"vio1({self.a},{self.o2},{self.s},{self.k}" + + @dataclass + @proposition(E) + class PRE0EQ(Hashable): + a: str # action name + m: str # atom name + o2: tuple # tuple of objects + k: str # ground atom name + + def __str__(self): + return f"pre0eq({self.a},{self.o2},{self.k},{self.m}" + + @dataclass + @proposition(E) + class PRE1EQ(Hashable): + a: str # action name + m: str # atom name + o2: tuple # tuple of objects + k: str # ground atom name + + def __str__(self): + return f"pre1eq({self.a},{self.o2},{self.k},{self.m}" + + @dataclass + @proposition(E) + class EQ(Hashable): + m: str # atom name + o2: tuple # tuple of objects + k: str # ground atom name + + def __str__(self): + return f"eq({self.o2},{self.m},{self.k}" + +""" gr(k,p) # feature k is ground instance of atom p gr(k,i,o) # i-th arg of feature k is object o r(u,o) # tuple for static unary predicate u in layer l @@ -163,7 +410,7 @@ def proposition_layer1(): X0(a,t,k,mk) # [ pre0(a,mk) & mapf(t,k,mk) ] X1(a,t,k,mk) # [ pre1(a,mk) & mapf(t,k,mk) ] - +""" def constraits_layer0(): def precond_and_effect(): From b967d62de1ff5de97ca891cf65d2b4369b9878fc Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Thu, 8 Sep 2022 17:10:16 -0400 Subject: [PATCH 27/28] Update bglearner.py --- macq/extract/bglearner.py | 51 ++++++++++++--------------------------- 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/macq/extract/bglearner.py b/macq/extract/bglearner.py index f5f21e1a..88cf5378 100644 --- a/macq/extract/bglearner.py +++ b/macq/extract/bglearner.py @@ -5,7 +5,7 @@ from attr import dataclass from bauhaus import Encoding, constraint, proposition from dataclasses import dataclass - +from macq.observation import ObservationLists class BGLearner: @@ -20,7 +20,7 @@ def __init__(self): self.encode() #decision propositions layer 0 - ''' + """ pre0(a,mk) # meta-feature mk appears negated in precondition of action a pre1(a,mk) # meta-feature mk appears positive in precondition of action a eff0(a,mk) # meta-feature mk appears negated in effect of action a @@ -37,7 +37,8 @@ def __init__(self): relevant(a,mo,mk,i) # using(a,mk) & atom(mk,i,mo) using(mk) # meta-feature mk is used by some action using(a,mk) # meta-feature mk is used by action a - ''' + """ + def encode(self): @dataclass @proposition(E) @@ -214,7 +215,7 @@ class GR2(Hashable): k: str # ground atom name p: int # predicate ID def __str__(self): - return f"gr({self.k},{self.p}" + return f"gr2({self.k},{self.p}" @dataclass @proposition(E) @@ -223,7 +224,7 @@ class GR3(Hashable): i: int # argument num of atom o: int # object id def __str__(self): - return f"gr({self.k},{self.p}" + return f"gr3({self.k},{self.p}" @dataclass @proposition(E) @@ -301,7 +302,7 @@ class MT(Hashable): o: int # object id def __str__(self): - return f"MT({self.t},{self.v},{self.o}" + return f"mt({self.t},{self.v},{self.o}" @dataclass @proposition(E) @@ -388,29 +389,7 @@ class EQ(Hashable): def __str__(self): return f"eq({self.o2},{self.m},{self.k}" -""" - gr(k,p) # feature k is ground instance of atom p - gr(k,i,o) # i-th arg of feature k is object o - r(u,o) # tuple for static unary predicate u in layer l - s(b,o,o') #tuple for static binary predicate b in layer l - mf(t,k,i,mo) #> [ ground(k,i,o) <=> mapt(t,mo,o) ] - map(t,a) # transition t is mapped to action a - mapf(t,k,mk) #feature k is mapped to meta-feature mk for transition t - phi(k,s) # value of (boolean) feature k at state s - - - U(l,u,a,mo,o) # unary(u,a,mo) & -r(l,u,o) - B(l,b,a,mo,mo',o,o') # binary(b,a,mo,mo') & -s(l,b,o,o') - ordi(o,k,i,s) # ground(k,i,o) & phi(k,s) [ for ordering objects ] - appl(a,t,s) #action a as in transition t is applicable in state s - mapeq(t,a,t') # map(t,a) & eq(t,t') - eq(t,t') # transitions t and t' are "equivalent" - Z0(t,k,a,s) # [ OR { pre0(t,k,a) & mapf(t,k,mk) : mk } => -phi(k,s) ] - Z1(t,k,a,s) # [ OR { pre1(t,k,a) & mapf(t,k,mk) : mk } => phi(k,s) ] - X0(a,t,k,mk) # [ pre0(a,mk) & mapf(t,k,mk) ] - X1(a,t,k,mk) # [ pre1(a,mk) & mapf(t,k,mk) ] - -""" + def constraits_layer0(): def precond_and_effect(): @@ -557,7 +536,7 @@ def exclusive_binding_statpred(): pass - def assoc_binding_transitions_pt1(): + def assoc_binding_transitions_pt1(): """ At-Most-1 {mt(t, ν, o) : o} (53) mp(t, a) ∧ arg(a, ν) ⇒ mt(t, ν, o) (54) @@ -565,27 +544,27 @@ def assoc_binding_transitions_pt1(): """ pass - def assoc_binding_transitions_pt2(): + def assoc_binding_transitions_pt2(): """ mf(t, k, m) ∧ at(m, i, ν) ⇒ W(t, k, i, ν) (56) W(t, k, i, ν) ⇒ gr(k, i, o) ⇔ mt(t, ν, o) (57) """ pass - def nonexist_gtuple(): + def nonexist_gtuple(): """ ¬gtuple(a, o¯) ⇒ ¬arg(a, νi) ∨ U(u, a, νi, oi) ∨ B(b, a, νi, νj , oi, oj ) (58) """ pass - def exist_groundatom(): + def exist_groundatom(): """ mp(t, a) ∧ mt(t, ν, o) ∧ un(u, a, ν) ⇒ r(u, o) (59) mp(t, a) ∧ mt(t, ν, o) ∧ mt(t, ν', o') ∧ bin(b, a, ν, ν') (60) ⇒ s(b, o, o') (61) """ pass - def groundaction_tran_mandate(): + def groundaction_tran_mandate(): """ gtuple(a, o¯) ⇒G(t, a, o¯) (62) G(t, a, o¯) ⇒ gtuple(a, o¯) (63) @@ -595,7 +574,7 @@ def groundaction_tran_mandate(): """ pass - def app_actions_mandate(): + def app_actions_mandate(): """ G(t, a, o¯) ⇒ appl(a, o, t.src ¯ ) (67) appl(a, o, s ) ⇒ G(t, a, o¯) (68) @@ -612,5 +591,5 @@ def app_actions_mandate(): - return Model + return Model From db6a0960cff5ca7dccdb07e97fd14e223f14536e Mon Sep 17 00:00:00 2001 From: seeratparmar <72322378+seeratparmar@users.noreply.github.com> Date: Thu, 8 Sep 2022 19:16:10 -0400 Subject: [PATCH 28/28] Update bglearner.py --- macq/extract/bglearner.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/macq/extract/bglearner.py b/macq/extract/bglearner.py index 88cf5378..bdb572e5 100644 --- a/macq/extract/bglearner.py +++ b/macq/extract/bglearner.py @@ -1,8 +1,5 @@ - -from typing import List, Set -from collections import defaultdict +from typing import Hashable from macq.extract import Model -from attr import dataclass from bauhaus import Encoding, constraint, proposition from dataclasses import dataclass from macq.observation import ObservationLists @@ -12,12 +9,15 @@ class BGLearner: def __new__( cls, obs_lists: ObservationLists, - max_hyper: int, + max_hyper: int , ): - def __init__(self): - E = Encoding() - self.encode() + def __init__(self): + E = Encoding() + self.max_hyper = max_hyper + self.obs_lists= obs_lists + + self.encode() #decision propositions layer 0 """