From 3709b1e1348aeba254a385a9251236fecec03faf Mon Sep 17 00:00:00 2001 From: Claudio Scheer Date: Sun, 17 May 2020 14:54:55 -0300 Subject: [PATCH] Test whether goals are a subset of the state when planning --- AP-Jupyternotebook.ipynb | 179 +++++++++++++++++++-------------------- paper/paper.pdf | Bin 153323 -> 153371 bytes paper/paper.tex | 4 +- 3 files changed, 91 insertions(+), 92 deletions(-) diff --git a/AP-Jupyternotebook.ipynb b/AP-Jupyternotebook.ipynb index af23b26..2fc688e 100644 --- a/AP-Jupyternotebook.ipynb +++ b/AP-Jupyternotebook.ipynb @@ -123,11 +123,11 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2020-05-17T01:55:20.718217Z", - "start_time": "2020-05-17T01:55:20.707945Z" + "end_time": "2020-05-17T17:05:29.902684Z", + "start_time": "2020-05-17T17:05:29.899973Z" } }, "outputs": [], @@ -322,11 +322,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2020-05-16T18:04:16.102453Z", - "start_time": "2020-05-16T18:04:16.098534Z" + "end_time": "2020-05-17T17:04:38.756056Z", + "start_time": "2020-05-17T17:04:38.514619Z" }, "deletable": false, "nbgrader": { @@ -616,11 +616,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 76, "metadata": { "ExecuteTime": { - "end_time": "2020-05-16T00:40:57.167090Z", - "start_time": "2020-05-16T00:40:56.975360Z" + "end_time": "2020-05-17T04:19:41.932269Z", + "start_time": "2020-05-17T04:19:41.904592Z" }, "deletable": false, "nbgrader": { @@ -636,31 +636,14 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Expected 6, got: 6. Correct!\n", - "Expected 0, got: 0. Correct!\n", - "Expected 2, got: 2. Correct!\n", - "Expected 2, got: 2. Correct!\n", - "Expected 1, got: 1. Correct!\n", - "Expected 2, got: 2. Correct!\n", - ":constants is not recognized in domain\n", - "Expected 4, got: 4. Correct!\n", - ":constants is not recognized in domain\n", - "Expected 4, got: 4. Correct!\n", - "------------------------------\n", - "Expected 38, got: 38. Correct!\n", - "Expected 0, got: 0. Correct!\n", - "Expected 8, got: 8. Correct!\n", - "Expected 8, got: 8. Correct!\n", - "Expected 2, got: 2. Correct!\n", - "Expected 2, got: 2. Correct!\n", - ":constants is not recognized in domain\n", - "Expected 7, got: 7. Correct!\n", - ":constants is not recognized in domain\n", - "Expected 10, got: 10. Correct!\n", - "------------------------------\n" + "ename": "NameError", + "evalue": "name 'MaxHeuristic' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 45\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 46\u001b[0;31m \u001b[0mh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mMaxHeuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 47\u001b[0m \u001b[0mtest_heuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdwr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpb1_dwr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 48\u001b[0m \u001b[0mtest_heuristic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdwr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpb2_dwr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'MaxHeuristic' is not defined" ] } ], @@ -734,15 +717,15 @@ "\n", "print(\"-\" * 30)\n", "\n", - "# h = FastForwardHeuristic()\n", - "# test_heuristic(dwr, pb1_dwr, h, 16)\n", - "# test_heuristic(dwr, pb2_dwr, h, 0)\n", - "# test_heuristic(tsp, pb1_tsp, h, 5)\n", - "# test_heuristic(tsp, pb2_tsp, h, 5)\n", - "# test_heuristic(dinner, pb1_dinner, h, 2)\n", - "# test_heuristic(dompteur, pb1_dompteur, h, 2)\n", - "# test_heuristic(logistics, pb1_logistics, h, 5)\n", - "# test_heuristic(logistics, pb2_logistics, h, 5)" + "h = FastForwardHeuristic()\n", + "test_heuristic(dwr, pb1_dwr, h, 16)\n", + "test_heuristic(dwr, pb2_dwr, h, 0)\n", + "test_heuristic(tsp, pb1_tsp, h, 5)\n", + "test_heuristic(tsp, pb2_tsp, h, 5)\n", + "test_heuristic(dinner, pb1_dinner, h, 2)\n", + "test_heuristic(dompteur, pb1_dompteur, h, 2)\n", + "test_heuristic(logistics, pb1_logistics, h, 5)\n", + "test_heuristic(logistics, pb2_logistics, h, 5)" ] }, { @@ -1352,7 +1335,7 @@ "\n", "class CriticalPathHeuristic(Heuristic):\n", " \"\"\"\n", - " Haslum\"s H^m Heuristic\n", + " Haslum's H^m Heuristic\n", " \"\"\"\n", "\n", " def __init__(self, m, stats=None):\n", @@ -1441,11 +1424,11 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2020-05-17T03:39:02.794775Z", - "start_time": "2020-05-17T03:39:02.764628Z" + "end_time": "2020-05-17T17:05:47.819217Z", + "start_time": "2020-05-17T17:05:47.809965Z" }, "deletable": false, "nbgrader": { @@ -1503,9 +1486,9 @@ " if applicable(\n", " state, (action.positive_preconditions, action.negative_preconditions)\n", " ):\n", - " state = apply(state, (action.add_effects, action.del_effects)).union(state)\n", + " state = apply(state, (action.add_effects, action.del_effects))\n", " break\n", - "\n", + " \n", " goals_reached = goals[0].intersection(state)\n", " return goals_reached == goals[0]" ] @@ -1532,11 +1515,11 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2020-05-17T03:39:04.126609Z", - "start_time": "2020-05-17T03:39:03.957513Z" + "end_time": "2020-05-17T17:16:56.846648Z", + "start_time": "2020-05-17T17:16:56.752994Z" }, "deletable": false, "editable": false, @@ -1741,11 +1724,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "metadata": { "ExecuteTime": { - "end_time": "2020-05-16T18:04:38.160670Z", - "start_time": "2020-05-16T18:04:38.154065Z" + "end_time": "2020-05-17T17:42:25.097593Z", + "start_time": "2020-05-17T17:42:25.073069Z" }, "deletable": false, "nbgrader": { @@ -1779,43 +1762,51 @@ " goals: tuple with (positive predicates, negative predicates) of the goal\n", " \"\"\"\n", " frontier = queue.PriorityQueue()\n", - " came_from = {}\n", - " cost_so_far = {}\n", + " \n", + " parent_state = {}\n", + " state_cost = {}\n", + " action_applied = {}\n", + " heuristic_at = {}\n", + "\n", + " parent_state[state] = None\n", + " state_cost[state] = 0\n", + " action_applied[state] = None\n", + " heuristic_at[state] = self.h(actions, state, goals)\n", + "\n", " frontier.put(state, 0)\n", - " came_from[state] = None\n", - " cost_so_far[state] = 0\n", - " goals_missing = goals[0]\n", "\n", " while not frontier.empty():\n", " current_state = frontier.get()\n", - " goals_reached = goals_missing.intersection(current_state)\n", - " if goals_reached:\n", - " goals_missing = goals_missing.difference(goals_reached)\n", - " if not goals_missing:\n", - " # Get the backward path.\n", - " path = []\n", - " while came_from[current_state]:\n", - " path.append(current_state)\n", - " current_state = came_from[current_state]\n", - " # path.append(current)\n", - " # path.reverse()\n", - " return path\n", + "\n", + " # Test whether the goals have been reached.\n", + " if goals[0].issubset(current_state):\n", + " current = current_state\n", + " # Get the backward path.\n", + " path = []\n", + " while current is not None:\n", + " path.append(current)\n", + " current = parent_state[current]\n", + " path.reverse()\n", + " return path\n", "\n", " for action in actions:\n", " # Get actions applicable to current state.\n", " if applicable(\n", - " current_state, (action.positive_preconditions, action.negative_preconditions)\n", + " current_state, (action.positive_preconditions, action.negative_preconditions),\n", " ):\n", - " new_state = apply(current_state, (action.add_effects, action.del_effects))\n", + " next_state = apply(current_state, (action.add_effects, action.del_effects))\n", " # +1 because this is the cost to move from one state to another.\n", - " # When not used, the result is the same.\n", - " cost = cost_so_far[current_state] + 1\n", - " if new_state not in cost_so_far or cost < cost_so_far[new_state]:\n", - " cost_so_far[new_state] = cost\n", - " priority = cost + self.h(actions, new_state, goals)\n", - " frontier.put(new_state, priority)\n", - " came_from[new_state] = current_state\n", - "\n", + " cost_next_state = state_cost[current_state] + 1\n", + " if next_state not in state_cost or cost_next_state < state_cost[next_state]:\n", + " heuristic_value = self.h(actions, next_state, goals)\n", + " if heuristic_value == float(\"inf\"):\n", + " # State non-reachable.\n", + " continue\n", + " state_cost[next_state] = cost_next_state\n", + " heuristic_at[next_state] = heuristic_value\n", + " parent_state[next_state] = current_state\n", + " action_applied[next_state] = action\n", + " frontier.put(next_state, cost_next_state + heuristic_value)\n", " return None" ] }, @@ -1841,11 +1832,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 13, "metadata": { "ExecuteTime": { - "end_time": "2020-05-16T18:04:55.198053Z", - "start_time": "2020-05-16T18:04:46.178756Z" + "end_time": "2020-05-17T17:43:03.270695Z", + "start_time": "2020-05-17T17:42:27.781616Z" }, "deletable": false, "nbgrader": { @@ -1861,11 +1852,19 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Expected 17, got: 174. False!\n", - "Expected 0, got: 0. Correct!\n" + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mplanner\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mHeuristicPlanner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mplan\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplanner\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve_file\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdwr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpb1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Expected 17, got:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplan\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m\". Correct!\"\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mplan\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m17\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\". False!\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mplan\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtime\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplanner\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve_file\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdwr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpb2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/media/water/files/Projects/heuristic-planning-2020-1-claudioscheer/pddl/pddl_planner.py\u001b[0m in \u001b[0;36msolve_file\u001b[0;34m(self, domainfile, problemfile)\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maction_space\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mground_actions\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# compute stats\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 33\u001b[0;31m plan = self.solve(\n\u001b[0m\u001b[1;32m 34\u001b[0m \u001b[0mground_actions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mparser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpositive_goals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparser\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnegative_goals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 35\u001b[0m )\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36msolve\u001b[0;34m(self, actions, state, goals)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[0mcost_next_state\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstate_cost\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcurrent_state\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnew_state\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstate_cost\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mcost_next_state\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0mstate_cost\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnew_state\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 56\u001b[0;31m \u001b[0mheuristic_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_state\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 57\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mheuristic_value\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"inf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0;31m# State non-reachable.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/media/water/files/Projects/heuristic-planning-2020-1-claudioscheer/pddl/heuristic.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, actions, initial_state, goals)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mh_calls\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minitial_state\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minitial_state\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgoals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mh\u001b[0;34m(self, actions, state, goals)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mgoals_missing\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0missubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreachable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# Get all actions applicable to the current state level.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mlast_state\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfrozenset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ma\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mactions\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpositive_preconditions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0missubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreachable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;31m# The next state will contain all the actions from previous states,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;31m# plus the effects actions when executing the actions applicable to the current state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mgoals_missing\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0missubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreachable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# Get all actions applicable to the current state level.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mlast_state\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfrozenset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0ma\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mactions\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpositive_preconditions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0missubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreachable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;31m# The next state will contain all the actions from previous states,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;31m# plus the effects actions when executing the actions applicable to the current state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], diff --git a/paper/paper.pdf b/paper/paper.pdf index edf23089249d25cc1c3a089bb0ea56df5e7f2411..97f1aec1501448f1679db60d82f0eb02425103c3 100644 GIT binary patch delta 3776 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